[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Report a bug in the CleverHans library\n\n---\n\n***The issue tracker should only be used to report bugs or feature requests. If you are looking for support from other library users, please ask a question on [StackOverflow](https://stackoverflow.com/questions/tagged/cleverhans).***\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**System configuration**\n - OS\n - Python version\n - TensorFlow version\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for the CleverHans library\n\n---\n\n***The issue tracker should only be used to report bugs or feature requests. If you are looking for support from other library users, please ask a question on [StackOverflow](https://stackoverflow.com/questions/tagged/cleverhans).***\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/cml_gpu_test.yaml",
    "content": "name: CML Single GPU Test\non: [push]\njobs:\n  run:\n    runs-on: [self-hosted,cml,gpu]\n    steps:\n      - uses: actions/checkout@v2\n      - name: cml_run\n        env:\n          repo_token: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          nvidia-smi\n          \n          python -m pip install --upgrade pip\n          pip install -e \".\"\n          pip install -r requirements/requirements.txt\n          pip install -r requirements/requirements-pytorch.txt\n          pip install -r requirements/requirements-jax.txt\n          pip install -r requirements/requirements-tf2.txt\n          pip install -r requirements/requirements-dev.txt\n          pip install -r requirements/requirements-gpu.txt\n\n          find tutorials/future/jax/ -name '*.py' | while read f\n          do\n              python $f\n              if [ $? -ne 0 ]\n              then\n                  exit 1\n              fi\n          done\n\n          find tutorials/future/torch/ -name '*.py' | while read f\n          do\n              python $f\n              if [ $? -ne 0 ]\n              then\n                  exit 1\n              fi\n          done\n\n          find tutorials/future/tf2/ -name '*.py' | while read f\n          do\n              python $f\n              if [ $? -ne 0 ]\n              then\n                  exit 1\n              fi\n          done"
  },
  {
    "path": ".github/workflows/style_type_check.yml",
    "content": "name: Style and type checks\n\non:\n  push:\n    paths:\n      - 'cleverhans/**/*'\n      - 'tutorials/**/*'\n\n  pull_request:\n    paths:\n      - 'cleverhans/**/*'\n      - 'tutorials/**/*'\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        python-version: [3.6]\n\n    steps:\n    - uses: actions/checkout@v2\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v2\n      with:\n        python-version: ${{ matrix.python-version }}\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install -e \".\"\n        pip install -r requirements/requirements.txt\n        pip install -r requirements/requirements-pytorch.txt\n        pip install -r requirements/requirements-tf2.txt\n        pip install -r requirements/requirements-jax.txt\n        pip install -r requirements/requirements-dev.txt\n    - name: Code reformat check\n      run: |\n        black --check cleverhans/\n        black --check tutorials/\n#    - name: flake8 linting check\n#      run: |\n#        flake8 cleverhans/\n#        flake8 tutorials/\n#    - name: Type check\n#      run: |\n#        mypy cleverhans/future/\n"
  },
  {
    "path": ".github/workflows/tests-pytorch.yml",
    "content": "name: PyTorch Tests\n\non:\n  push:\n    paths:\n      - 'cleverhans/torch/**/*'\n\n  pull_request:\n    paths:\n      - 'cleverhans/torch/**/*'\n\njobs:\n  run:\n    runs-on: [self-hosted,cml,gpu]\n    steps:\n      - uses: actions/checkout@v2\n      - name: cml_run\n        env:\n          repo_token: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          python -m pip install --upgrade pip\n          pip install -e \".\"\n          pip install -r requirements/requirements.txt\n          pip install -r requirements/requirements-pytorch.txt\n          pip install -r requirements/requirements-dev.txt\n          pip install -r requirements/requirements-gpu.txt\n\n          pytest cleverhans/torch/tests\n"
  },
  {
    "path": ".github/workflows/tutorials-jax.yml",
    "content": "name: JAX Tutorials\n\non:\n  push:\n    paths:\n      - 'cleverhans/jax/**/*'\n      - 'tutorials/jax/**/*'\n\n  pull_request:\n    paths:\n      - 'cleverhans/jax/**/*'\n      - 'tutorials/jax/**/*'\n\njobs:\n  run:\n    runs-on: [self-hosted,cml,gpu]\n    steps:\n      - uses: actions/checkout@v2\n      - name: cml_run\n        env:\n          repo_token: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          python -m pip install --upgrade pip\n          pip install -e \".\"\n          pip install -r requirements/requirements.txt\n          pip install -r requirements/requirements-jax.txt\n          pip install -r requirements/requirements-dev.txt\n          pip install -r requirements/requirements-gpu.txt\n\n          find tutorials/jax/ -name '*.py' | while read f\n          do\n              python $f\n              if [ $? -ne 0 ]\n              then\n                  exit 1\n              fi\n          done\n"
  },
  {
    "path": ".github/workflows/tutorials-pytorch.yml",
    "content": "name: PyTorch Tutorials\n\non:\n  push:\n    paths:\n      - 'cleverhans/torch/**/*'\n      - 'tutorials/torch/**/*'\n\n  pull_request:\n    paths:\n      - 'cleverhans/torch/**/*'\n      - 'tutorials/torch/**/*'\n\njobs:\n  run:\n    runs-on: [self-hosted,cml,gpu]\n    steps:\n      - uses: actions/checkout@v2\n      - name: cml_run\n        env:\n          repo_token: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          python -m pip install --upgrade pip\n          pip install -e \".\"\n          pip install -r requirements/requirements.txt\n          pip install -r requirements/requirements-pytorch.txt\n          pip install -r requirements/requirements-dev.txt\n          pip install -r requirements/requirements-gpu.txt\n\n          find tutorials/torch/ -name '*.py' | while read f\n          do\n              python $f\n              if [ $? -ne 0 ]\n              then\n                  exit 1\n              fi\n          done\n"
  },
  {
    "path": ".github/workflows/tutorials-tf2.yml",
    "content": "name: TensorFlow 2 Tutorials\n\non:\n  push:\n    paths:\n      - 'cleverhans/tf2/**/*'\n      - 'tutorials/tf2/**/*'\n\n  pull_request:\n    paths:\n      - 'cleverhans/tf2/**/*'\n      - 'tutorials/tf2/**/*'\n\njobs:\n  run:\n    runs-on: [self-hosted,cml,gpu]\n    steps:\n      - uses: actions/checkout@v2\n      - name: cml_run\n        env:\n          repo_token: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          python -m pip install --upgrade pip\n          pip install -e \".\"\n          pip install -r requirements/requirements.txt\n          pip install -r requirements/requirements-tf2.txt\n          pip install -r requirements/requirements-dev.txt\n          pip install -r requirements/requirements-gpu.txt\n\n          find tutorials/tf2/ -name '*.py' | while read f\n          do\n              python $f\n              if [ $? -ne 0 ]\n              then\n                  exit 1\n              fi\n          done\n"
  },
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nenv/\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\n*.egg-info/\n.installed.cfg\n*.egg\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*,cover\n.hypothesis/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocsource/_build/\n\n# PyBuilder\ntarget/\n\n# IPython Notebook\n.ipynb_checkpoints\n\n# pyenv\n.python-version\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# dotenv\n.env\n\n# virtualenv\nvenv/\nENV/\n\n# Spyder project settings\n.spyderproject\n\n# Rope project settings\n.ropeproject\n\n# PyCharm related\n.idea/\n\n# Mac related\n.DS_Store\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n-   repo: https://github.com/psf/black\n    rev: 20.8b1\n    hooks:\n    -   id: black\n"
  },
  {
    "path": ".pylintrc",
    "content": "# Config file for pylint for CleverHans\n# Used by cleverhans.devtools\n\n[FORMAT]\n# TensorFlow 2 space style\nindent-string='  '\n\n\nmax-line-length=120\n# pylint should print out the file path, line number, and ID code for the\n# messages it prints. This is partly so we can turn off the ID codes that\n# we do not actually want to enforce.\nmsg-template='{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}'\n\n# ID codes to disable\n# E1130: has a bug.\n#   The type of the output of softmax_cross_entropy_with_logits is weird\n#   and pylint does not realize it is safe to negate it.\n# C0103: Complains about the variable name 'x'\n# W0613: Unused argument\n#  This one is disabled because pylint does not implement it well.\n#  In many cases we use all arguments via `locals()` and pylint does not\n#  detect them as used.\n# E1101: pylint seems to have a bug. Says numpy.random has no member RandomState\n# R0913: Too many arguments\n# R0914: Too many local variables\n# W0223: doesn't allow subclass of an abstract base class to still be abstract\n# E0203: pylint seems to have a bug. Doesn't know self.x can be defined before\n#        method call.\n# W0201: doesn't let any attributes be added outside __init__\n# C1801: do not use len(s) to tell if s is empty\n# E1129: a check on context managers\n#  This is disabled because it complains about \"with sess.as_default\".\n#  pylint does not seem to believe that that is a real context manager.\n# C0325: unnecessary parens (sometimes we use them to be extra-explicit)\n# R1705: \"unnecessary else after return\"\n#  We disable this one because it is annoying. It forbids\n#  if a:\n#    return b\n#  else:\n#    return c\n#  The name \"unnecessary else after return\" seems misleading, and it would be\n#  annoying and use more lines to rewrite everything as:\n#  if a:\n#    out = b\n#  else:\n#    out = c\n#  return out\n# W0703: catching too general exception\n# W0101: unreachable code\n#  We disable this one because it does not allow:\n#\n#  class A(object):\n#    def f(self):\n#      raise NotImplementedError(\"Subclass must implement f\")\n#      return 0\n#\n#  W0101 complains that the `return 0` is never reached.\n#  However, if we do not have the return statement, we get E1111 on lines\n#  such as:\n#\n#  x = a.f()\n#\n#  because pylint sees no return statement in f.\n#  We can't have both W0101 and E1111, and between them, it is better to\n#  disable W0101 because dead code is less likely to be a bug than using a\n#  null return value. Also, as of this writing, the only instance of W0101 is\n#  an abstract method like in the example shown here, so we are not writing\n#  any dead code by accident in practice.\n#\n# W0122: use of exec\n# R0912: too many branches\n# R0903: too few public methods\n# W0221: parameters differ from overridden method\n# W0212: protected access\n# R1703: simplifiable if statement\n# R0201: method could be a function\n# W0603: global statement\n# R0915: too many statements\n# R0902: too many attributes\n# C0200: consider using enumerate\n# W1201: logging not lazy\n#  Disabled because it forbids things like\n#    logging.info('#' * pad + msg + '#' * pad)\n#  Doesn't seem useful to refactor this to\n#    padded_msg = '#' * pad + msg + '#' * pad\n#    logging.info(padded_msg)\n#  or to refactor it to\n#    logging.info('%s%s%s', pad, msg, pad)\n#  The speedup of avoiding a string concatenation is presumably negligible\n#  compared to most of the ML operations we do to generate log messages.\n# C0302: too many lines in module\n# W0511: forbids TODOs\n# R0911: too many return statements\n# E0401: cannot import module\n# R0205: this one is apparently asking us to drop python 2 support?\n# R1714: use x in [a,b] instead of x == a or x == b\n# R0801: duplicate code across files\n#        (We have a lot of intentional duplication, like the tutorials)\ndisable=C0103,W0613,E1101,R0913,R0914,W0223,E0203,W0201,C1801,E1129,C0325,R1705,W0622,W0703,W0101,W0122,R0912,R0903,W0221,W0212,R1703,R0201,W0603,R0915,R0902,C0200,W1201,C0302,W0511,R0911,E0401,R0205,R1714,R0801,E1130\n\n[IMPORTS]\n# Explicitly specifying this helps pylint to behave more consistently across multiple platforms.\n# If not specified, the method used to install each library seems to change whether it is considered third party, etc.\nknown-third-party=joblib,keras,numpy,PIL,six,tensorflow\n"
  },
  {
    "path": ".setup_vm_and_run_tests.sh",
    "content": "#!/bin/sh\nset -e\n# Run update once so apt-get will work at all\nsudo apt-get update\n# Install apt-add-repository\nsudo apt-get install -y software-properties-common\n# Add universe repository so python-pip is available\nsudo apt-add-repository universe\n# Run update again now that universe is a source\napt-get update\napt-get -y install curl\napt-get install -y wget\nrm -rf /var/lib/apt/lists/*\n\n# code below is taken from http://conda.pydata.org/docs/travis.html\n# We do this conditionally because it saves us some downloading if the\n# version is the same.\nexport CLOUD_BUILD_PYTHON_VERSION=2.7\nif [[ \"$CLOUD_BUILD_PYTHON_VERSION\" == \"2.7\" ]]; then\n  wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;\nelse\n  wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;\nfi\nbash miniconda.sh -b -p $HOME/miniconda\nexport PATH=\"$HOME/miniconda/bin:$PATH\"\nexport TENSORFLOW_V=\"1.8.0\"\nhash -r\nconda config --set always_yes yes --set changeps1 no\nconda update -q conda\n# Useful for debugging any issues with conda\nconda info -a\n\nconda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION numpy scipy pyqt=4.11 matplotlib pandas h5py six mkl-service\n# Enable `conda activate`\nsudo ln -s /root/miniconda/etc/profile.d/conda.sh /etc/profile.d/conda.sh\nconda activate test-environment\n\n# install TensorFlow\nif [[ \"$CLOUD_BUILD_PYTHON_VERSION\" == \"2.7\" && \"$TENSORFLOW_V\" == \"1.4.1\" ]]; then\n  pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.4.1-cp27-none-linux_x86_64.whl;\nelif [[ \"$COULD_BUILD_PYTHON_VERSION\" == \"2.7\" && \"$TENSORFLOW_V\" == \"1.8.0\" ]]; then\n  pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.8.0-cp27-none-linux_x86_64.whl;\nelif [[ \"$CLOUD_BUILD_PYTHON_VERSION\" == \"3.5\" && \"$TENSORFLOW_V\" == \"1.4.1\" ]]; then\n  pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.4.1-cp35-cp35m-linux_x86_64.whl;\nelif [[ \"$CLOUD_BUILD_PYTHON_VERSION\" == \"3.5\" && \"$TENSORFLOW_V\" == \"1.8.0\" ]]; then\n  pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.8.0-cp35-cp35m-linux_x86_64.whl;\nfi\n\ntime pip install -q -e \".[test]\"\nPYTORCH=True\nif [[ \"$PYTORCH\" == True ]]; then\n  pip install torch==0.4.0 torchvision==0.2.1 -q;\nfi\n# workaround for version incompatibility between the scipy version in conda\n# and the system-provided /usr/lib/x86_64-linux-gnu/libstdc++.so.6\n# by installing a conda-provided libgcc and adding it to the load path\nconda install libgcc\nexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/travis/miniconda/envs/test-environment/lib\n\n# install serialization dependencies\npip install joblib\n# install dependencies for adversarial competition eval infra tests\npip install google-cloud==0.33.1\npip install Pillow\n# Style checks\npip install pylint\n"
  },
  {
    "path": "CODE_OF_CONDUCT.rst",
    "content": "CleverHans is dedicated to providing a harassment-free experience for\neveryone, regardless of gender, gender identity and expression, sexual\norientation, disability, physical appearance, body size, age, race, or\nreligion. We do not tolerate harassment of participants in any form.\n\nThis code of conduct applies to all CleverHans spaces (including Gist\ncomments) both online and off. Anyone who violates this code of\nconduct may be sanctioned or expelled from these spaces at the\ndiscretion of the OpenAI / Pennsylvania State University team.\n\nWe may add additional rules over time, which will be made clearly\navailable to participants. Participants are responsible for knowing\nand abiding by these rules.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to CleverHans\n\nFirst off, thank you for considering contributing to CleverHans.\nFollowing these guidelines helps to communicate that you respect\nthe time of the researchers and developers managing and developing this open\nsource project. In return, they should reciprocate that respect in\naddressing your issue, assessing changes, and helping you finalize\nyour pull requests.\n\nAdding new features, improving documentation, bug triaging, or\nwriting tutorials are all\nexamples of helpful contributions.\nFurthermore, if you are publishing a new attack or defense,\nwe strongly encourage you to add it to CleverHans so that others\nmay evaluate it fairly in their own work.\n\nTo speed the code review process, we ask that:\n* New efforts and features be coordinated on the [discussion board](https://github.com/cleverhans-lab/cleverhans/discussions).\n* When making code contributions to CleverHans, you should follow the\n[`Black`](https://black.readthedocs.io/en/stable/index.html) coding style in your pull requests.\n* We do not accept pull requests that add git submodules because of [the\n  problems that arise when maintaining git\n  submodules](https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407)\n\nBug fixes can be initiated through Github pull requests.\n\n## Development setup\n\nPlease follow the usual \n[git forking workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow) \nwhen contributing.\n\n### Setting up Cleverhans on your machine\n\nThen create a new Conda or Virtualenv environment. \n\nConda:\n```\n$ conda create --name cleverhans python=3.6\n$ conda activate cleverhans\n```\n\nVirtualenv:\n```\n$ python3 -m venv /path/to/new/virtual/environment\n$ cd /path/to/new/virtual/environment\n$ source ./bin/activate\n```\n\nThen, after `cd`-ing into the `cleverhans` directory, install the \nCleverhans library and all corresponding requirements into your \nnewly created environment.\n\n```\n$ pip install -e \".\"\n$ pip install -r requirements/requirements.txt\n$ pip install -r requirements/requirements-pytorch.txt\n$ pip install -r requirements/requirements-jax.txt\n$ pip install -r requirements/requirements-tf2.txt\n$ pip install -r requirements/requirements-dev.txt\n```\n\nOptionally also install GPU dependencies for JAX (PyTorch and \nTF2 already come with GPU as part of their default package):\n```\n$ pip install -r requirements/requirements-gpu.txt\n```\n\n### Add git pre-commit hooks\n\nInstall our pre-commit hooks that ensure that your code is always formatted\nvia `black` before committing.\n\n```\n$ pre-commit install\n```\n\nNote that we do have code style checks in place for every submitted \nPR and will reject PRs that do not meet these checks. By installing the \npre-commit hooks, this will be taken care of automatically"
  },
  {
    "path": "Dockerfile",
    "content": "FROM ubuntu:14.04\nRUN apt-get update\nRUN apt-get install -y python\nRUN apt-get install -y python-pip\nRUN pip install --upgrade pip\nCOPY .setup_vm_and_run_tests.sh /\nRUN chmod +x /.setup_vm_and_run_tests.sh\nCMD [\"/.setup_vm_and_run_tests.sh\"]\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\r\n\r\nCopyright (c) 2019 Google Inc., OpenAI and Pennsylvania State University\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n"
  },
  {
    "path": "README.md",
    "content": "# CleverHans (latest release: v4.0.0)\n\n<img src=\"https://github.com/tensorflow/cleverhans/blob/master/assets/logo.png?raw=true\" alt=\"cleverhans logo\">\n\n\nThis repository contains the source code for CleverHans, a Python library to\nbenchmark machine learning systems' vulnerability to\n[adversarial examples](http://karpathy.github.io/2015/03/30/breaking-convnets/).\nYou can learn more about such vulnerabilities on the accompanying [blog](http://cleverhans.io).\n\nThe CleverHans library is under continual development, always welcoming\n[contributions](https://github.com/cleverhans-lab/cleverhans#contributing)\nof the latest attacks and defenses.\nIn particular, we always welcome help towards resolving the [issues](https://github.com/cleverhans-lab/cleverhans/issues)\ncurrently open.\n\nSince v4.0.0, CleverHans supports 3 frameworks: JAX, PyTorch, and TF2. We are currently prioritizing implementing \nattacks in PyTorch, but we very much welcome contributions for all 3 frameworks. In versions v3.1.0 and prior,\nCleverHans supported TF1; the code for v3.1.0 can be found under `cleverhans_v3.1.0/` or by checking\nout a prior Github release.\n\nThe library focuses on providing reference implementation of attacks\nagainst machine learning models to help with benchmarking models against\nadversarial examples. \n\nThe directory structure is as follows: \n`cleverhans/` contain attack implementations, `tutorials/` contain scripts demonstrating the features\nof CleverHans, and `defenses/` contains defense implementations. Each framework has its own subdirectory\nwithin these folders, e.g. `cleverhans/jax`.\n\n## Setting up CleverHans\n\n### Dependencies\n\nThis library uses [Jax](https://github.com/google/jax), [PyTorch](https://pytorch.org/) or [TensorFlow 2](https://www.tensorflow.org/) to accelerate graph\ncomputations performed by many machine learning models.\nTherefore, installing one of these libraries is a pre-requisite.\n\n### Installation\n\nOnce dependencies have been taken care of, you can install CleverHans using\n`pip` or by cloning this Github repository.\n\n#### `pip` installation\n\nIf you are installing CleverHans using `pip`, run the following command:\n\n```\npip install cleverhans\n```\n\nThis will install the last version uploaded to\n[Pypi](https://pypi.org/project/cleverhans).\nIf you'd instead like to install the bleeding edge version, use:\n\n```\npip install git+https://github.com/cleverhans-lab/cleverhans.git#egg=cleverhans\n```\n\n#### Installation for development\n\nIf you want to make an editable installation of CleverHans so that you can\ndevelop the library and contribute changes back, first fork the repository\non GitHub and then clone your fork into a directory of your choice:\n\n```\ngit clone https://github.com/<your-org>/cleverhans\n```\n\nYou can then install the local package in \"editable\" mode in order to add it to\nyour `PYTHONPATH`:\n\n```\ncd cleverhans\npip install -e .\n```\n\n### Currently supported setups\n\nAlthough CleverHans is likely to work on many other machine configurations, we\ncurrently test it with Python\n3.6, Jax 0.2, PyTorch 1.7, and Tensorflow 2.4 on Ubuntu 18.04 LTS (Bionic Beaver).\n\n## Getting support\n\nIf you have a request for support, please ask a question\non [StackOverflow](https://stackoverflow.com/questions/tagged/cleverhans)\nrather than opening an issue in the GitHub tracker. The GitHub\nissue tracker should *only* be used to report bugs or make feature requests.\n\n## Contributing\n\nContributions are welcomed! To speed the code review process, we ask that:\n* New efforts and features be coordinated on the [discussion board](https://github.com/cleverhans-lab/cleverhans/discussions).\n* When making code contributions to CleverHans, you should follow the [`Black`](https://black.readthedocs.io/en/stable/index.html)\n coding style in your pull requests.\n* We do not accept pull requests that add git submodules because of [the\n  problems that arise when maintaining git\n  submodules](https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407).\n\nBug fixes can be initiated through Github pull requests.\n\n## Tutorials: `tutorials` directory\n\nTo help you get started with the functionalities provided by this library, the\n`tutorials/` folder comes with the following tutorials:\n* **MNIST with FGSM and PGD** ([jax](tutorials/jax/mnist_tutorial.py), [tf2](tutorials/tf2/mnist_tutorial.py):\nthis tutorial covers how to train an MNIST model and craft adversarial examples using the\n [fast gradient sign method](https://arxiv.org/abs/1412.6572) and \n [projected gradient descent](https://arxiv.org/abs/1706.06083).\n* **CIFAR10 with FGSM and PGD** ([pytorch](tutorials/torch/cifar10_tutorial.py), [tf2](tutorials/tf2/cifar10_tutorial.py)):\nthis tutorial covers how to train a CIFAR10 model and \ncraft adversarial examples using the [fast gradient sign method](https://arxiv.org/abs/1412.6572) and\n [projected gradient descent](https://arxiv.org/abs/1706.06083).\n\nNOTE: the tutorials are maintained carefully, in the sense that we use\ncontinuous integration to make sure they continue working. They are not\nconsidered part of the API and they can change at any time without warning.\nYou should not write 3rd party code that imports the tutorials and expect\nthat the interface will not break. Only the main library is subject to\nour six month interface deprecation warning rule.\n\nNOTE: please start a thread on the [discussion board](https://github.com/cleverhans-lab/cleverhans/discussions) before writing a new\ntutorial. Because each new tutorial involves a large amount of duplicated\ncode relative to the existing tutorials, and because every line of code\nrequires ongoing testing and maintenance indefinitely, we generally prefer\nnot to add new tutorials. Each tutorial should showcase an extremely different\nway of using the library. Just calling a different attack, model, or dataset\nis not enough to justify maintaining a parallel tutorial.\n\n## Examples : `examples` directory\n\nThe `examples/` folder contains additional scripts to showcase different uses\nof the CleverHans library or get you started competing in different adversarial\nexample contests. We do not offer nearly as much ongoing maintenance or support\nfor this directory as the rest of the library, and if code in here gets broken\nwe may just delete it without warning.\n\nSince we recently discontinued support for TF1, the `examples/` folder is currently \nempty, but you are welcome to submit your uses via a pull request :)\n\nOld examples for CleverHans v3.1.0 and prior can be found under `cleverhans_v3.1.0/examples/`.\n\n## Reporting benchmarks\n\nWhen reporting benchmarks, please:\n* Use a versioned release of CleverHans. You can find a list of released versions [here](https://github.com/cleverhans-lab/cleverhans/releases).\n* Either use the latest version, or, if comparing to an earlier publication, use the same version as the earlier publication.\n* Report which attack method was used.\n* Report any configuration variables used to determine the behavior of the attack.\n\nFor example, you might report \"We benchmarked the robustness of our method to\nadversarial attack using v4.0.0 of CleverHans. On a test set modified by the\n`FastGradientMethod` with a max-norm `eps` of 0.3, we obtained a test set accuracy of 71.3%.\"\n\n## Citing this work\n\nIf you use CleverHans for academic research, you are highly encouraged\n(though not required) to cite the following [paper](https://arxiv.org/abs/1610.00768):\n\n```\n@article{papernot2018cleverhans,\n  title={Technical Report on the CleverHans v2.1.0 Adversarial Examples Library},\n  author={Nicolas Papernot and Fartash Faghri and Nicholas Carlini and\n  Ian Goodfellow and Reuben Feinman and Alexey Kurakin and Cihang Xie and\n  Yash Sharma and Tom Brown and Aurko Roy and Alexander Matyasko and\n  Vahid Behzadan and Karen Hambardzumyan and Zhishuai Zhang and\n  Yi-Lin Juang and Zhi Li and Ryan Sheatsley and Abhibhav Garg and\n  Jonathan Uesato and Willi Gierke and Yinpeng Dong and David Berthelot and\n  Paul Hendricks and Jonas Rauber and Rujun Long},\n  journal={arXiv preprint arXiv:1610.00768},\n  year={2018}\n}\n```\n\n## About the name\n\nThe name CleverHans is a reference to a presentation by Bob Sturm titled\n“Clever Hans, Clever Algorithms: Are Your Machine Learnings Learning What You\nThink?\" and the corresponding publication, [\"A Simple Method to Determine if a\nMusic Information Retrieval System is a\n'Horse'.\"](http://ieeexplore.ieee.org/document/6847693/) Clever Hans was a\nhorse that appeared to have learned to answer arithmetic questions, but had in\nfact only learned to read social cues that enabled him to give the correct\nanswer. In controlled settings where he could not see people's faces or receive\nother feedback, he was unable to answer the same questions. The story of Clever\nHans is a metaphor for machine learning systems that may achieve very high\naccuracy on a test set drawn from the same distribution as the training data,\nbut that do not actually understand the underlying task and perform poorly on\nother inputs.\n\n## Authors\n\nThis library is collectively maintained by the [CleverHans Lab](https://cleverhans-lab.github.io/) \nat the University of Toronto. The current point of contact is Jonas Guan. \nIt was previously maintained by Ian Goodfellow and Nicolas Papernot.\n\n\nThe following authors contributed 100 lines or more (ordered according to the GitHub contributors page):\n* Ian Goodfellow (Google Brain)\n* Nicolas Papernot (Google Brain)\n* Nicholas Carlini (Google Brain)\n* Fartash Faghri (University of Toronto)\n* Tzu-Wei Sung (National Taiwan University)\n* Alexey Kurakin (Google Brain)\n* Reuben Feinman (New York University)\n* Shiyu Duan (University of Florida)\n* Phani Krishna (Video Analytics Lab)\n* David Berthelot (Google Brain)\n* Tom Brown (Google Brain)\n* Cihang Xie (Johns Hopkins)\n* Yash Sharma (The Cooper Union)\n* Aashish Kumar (HARMAN X)\n* Aurko Roy (Google Brain)\n* Alexander Matyasko (Nanyang Technological University)\n* Anshuman Suri (University of Virginia)\n* Yen-Chen Lin (MIT)\n* Vahid Behzadan (Kansas State)\n* Jonathan Uesato (DeepMind)\n* Florian Tramèr (Stanford University)\n* Haojie Yuan (University of Science & Technology of China)\n* Zhishuai Zhang (Johns Hopkins)\n* Karen Hambardzumyan (YerevaNN)\n* Jianbo Chen (UC Berkeley)\n* Catherine Olsson (Google Brain)\n* Aidan Gomez (University of Oxford)\n* Zhi Li (University of Toronto)\n* Yi-Lin Juang (NTUEE)\n* Pratyush Sahay (formerly HARMAN X)\n* Abhibhav Garg (IIT Delhi)\n* Aditi Raghunathan (Stanford University)\n* Yang Song (Stanford University)\n* Riccardo Volpi (Italian Institute of Technology)\n* Angus Galloway (University of Guelph)\n* Yinpeng Dong (Tsinghua University)\n* Willi Gierke (Hasso Plattner Institute)\n* Bruno López\n* Jonas Rauber (IMPRS)\n* Paul Hendricks (NVIDIA)\n* Ryan Sheatsley (Pennsylvania State University)\n* Rujun Long (0101.AI)\n* Bogdan Kulynych (EPFL)\n* Erfan Noury (UMBC)\n* Robert Wagner (Case Western Reserve University)\n* Erh-Chung Chen (National Tsing Hua University)\n* Joel Frank (Ruhr-University Bochum)\n\n## Copyright\n\nCopyright 2021 - Google Inc., OpenAI, Pennsylvania State University, University of Toronto.\n"
  },
  {
    "path": "cleverhans/__init__.py",
    "content": "\"\"\"The CleverHans adversarial example library\"\"\"\nfrom cleverhans.devtools.version import append_dev_version\n\n# If possible attach a hex digest to the version string to keep track of\n# changes in the development branch\n__version__ = append_dev_version(\"4.0.0\")\n"
  },
  {
    "path": "cleverhans/devtools/LICENSE.txt",
    "content": "The devtools module is a derivative work from the devtools module of pylearn2.\nWe reproduce the corresponding license here.\n\nCopyright (c) 2011--2014, Université de Montréal\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors\n   may be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "cleverhans/devtools/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans/devtools/autopep8_all.py",
    "content": "\"\"\"\nRun this script to run autopep8 on everything in the library\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\n\nfrom cleverhans.devtools.list_files import list_files\nfrom cleverhans.utils import shell_call\n\nfor f in list_files(\".py\"):\n\n    command = [\"autopep8\", \"-i\", \"--indent-size\", \"2\", f]\n    shell_call(command)\n"
  },
  {
    "path": "cleverhans/devtools/checks.py",
    "content": "\"\"\"Functionality for building tests.\n\nWe have to call this file \"checks\" and not anything with \"test\" as a\nsubstring or nosetests will execute it.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport time\nimport unittest\n\nimport numpy as np\n\n\nclass CleverHansTest(unittest.TestCase):\n    \"\"\"TestCase with some extra features\"\"\"\n\n    def setUp(self):\n        self.test_start = time.time()\n        # seed the randomness\n        np.random.seed(1234)\n\n    def tearDown(self):\n        print(self.id(), \"took\", time.time() - self.test_start, \"seconds\")\n\n    def assertClose(self, x, y, *args, **kwargs):\n        \"\"\"Assert that `x` and `y` have close to the same value\"\"\"\n        # self.assertTrue(np.allclose(x, y)) doesn't give a useful message\n        # on failure\n        assert np.allclose(x, y, *args, **kwargs), (x, y)\n"
  },
  {
    "path": "cleverhans/devtools/list_files.py",
    "content": "\"\"\"Code for listing files that belong to the library.\"\"\"\nimport os\nimport cleverhans\n\n\ndef list_files(suffix=\"\"):\n    \"\"\"\n    Returns a list of all files in CleverHans with the given suffix.\n\n    Parameters\n    ----------\n    suffix : str\n\n    Returns\n    -------\n\n    file_list : list\n        A list of all files in CleverHans whose filepath ends with `suffix`.\n    \"\"\"\n\n    cleverhans_path = os.path.abspath(cleverhans.__path__[0])\n    # In some environments cleverhans_path does not point to a real directory.\n    # In such case return empty list.\n    if not os.path.isdir(cleverhans_path):\n        return []\n    repo_path = os.path.abspath(os.path.join(cleverhans_path, os.pardir))\n    file_list = _list_files(cleverhans_path, suffix)\n\n    extra_dirs = [\n        \"cleverhans_tutorials\",\n        \"examples\",\n        \"scripts\",\n        \"tests_tf\",\n        \"tests_pytorch\",\n    ]\n\n    for extra_dir in extra_dirs:\n        extra_path = os.path.join(repo_path, extra_dir)\n        if os.path.isdir(extra_path):\n            extra_files = _list_files(extra_path, suffix)\n            extra_files = [os.path.join(os.pardir, path) for path in extra_files]\n            file_list = file_list + extra_files\n\n    return file_list\n\n\ndef _list_files(path, suffix=\"\"):\n    \"\"\"\n    Returns a list of all files ending in `suffix` contained within `path`.\n\n    Parameters\n    ----------\n    path : str\n        a filepath\n    suffix : str\n\n    Returns\n    -------\n    l : list\n        A list of all files ending in `suffix` contained within `path`.\n        (If `path` is a file rather than a directory, it is considered\n        to \"contain\" itself)\n    \"\"\"\n    if os.path.isdir(path):\n        incomplete = os.listdir(path)\n        complete = [os.path.join(path, entry) for entry in incomplete]\n        lists = [_list_files(subpath, suffix) for subpath in complete]\n        flattened = []\n        for one_list in lists:\n            for elem in one_list:\n                flattened.append(elem)\n        return flattened\n    else:\n        assert os.path.exists(path), \"couldn't find file '%s'\" % path\n        if path.endswith(suffix):\n            return [path]\n        return []\n"
  },
  {
    "path": "cleverhans/devtools/mocks.py",
    "content": "\"\"\"Utility functions for mocking up tests.\n\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport copy\n\nimport numpy as np\n\nfrom cleverhans.dataset import Dataset, np_utils\n\n\ndef random_feed_dict(rng, placeholders):\n    \"\"\"\n    Returns random data to be used with `feed_dict`.\n    :param rng: A numpy.random.RandomState instance\n    :param placeholders: List of tensorflow placeholders\n    :return: A dict mapping placeholders to random numpy values\n    \"\"\"\n\n    output = {}\n\n    for placeholder in placeholders:\n        if placeholder.dtype != \"float32\":\n            raise NotImplementedError()\n        value = rng.randn(*placeholder.shape).astype(\"float32\")\n        output[placeholder] = value\n\n    return output\n\n\nclass SimpleDataset(Dataset):\n    \"\"\"\n    A dataset containing random values.\n    Values are uniformly distributed, either in [0, max_val] or [-1, max_val].\n    \"\"\"\n\n    def __init__(\n        self,\n        dim=2,\n        train_start=0,\n        train_end=3,\n        test_start=0,\n        test_end=5,\n        center=False,\n        max_val=1.0,\n        nb_classes=5,\n    ):\n        kwargs = copy.copy(locals())\n        del kwargs[\"self\"]\n        if \"__class__\" in kwargs:\n            del kwargs[\"__class__\"]\n        super(SimpleDataset, self).__init__(kwargs)\n        self.__dict__.update(kwargs)\n        train_x_rng = np.random.RandomState([2018, 11, 9, 1])\n        # Even if train_start is not 0, we should still generate the first training examples from the rng.\n        # This way the dataset looks like it is an array of deterministic data that we index using train_start.\n        self.x_train = train_x_rng.uniform(\n            -center * max_val, max_val, (train_end, dim)\n        )[train_start:]\n        # Use a second rng for the test set so that it also looks like an array of deterministic data that we\n        # index into, unaffected by the number of training examples.\n        test_x_rng = np.random.RandomState([2018, 11, 9, 2])\n        self.x_test = test_x_rng.uniform(-center * max_val, max_val, (test_end, dim))[\n            test_start:\n        ]\n        # Likewise, to keep the number of examples read from the rng affecting the values of the labels, we\n        # must generate the labels from a different rng\n        train_y_rng = np.random.RandomState([2018, 11, 9, 3])\n        self.y_train = train_y_rng.randint(low=0, high=nb_classes, size=(train_end, 1))[\n            train_start:\n        ]\n        test_y_rng = np.random.RandomState([2018, 11, 9, 4])\n        self.y_test = test_y_rng.randint(low=0, high=nb_classes, size=(test_end, 1))[\n            test_start:\n        ]\n        assert self.x_train.shape[0] == self.y_train.shape[0]\n        assert self.x_test.shape[0] == self.y_test.shape[0]\n        self.y_train = np_utils.to_categorical(self.y_train, nb_classes)\n        self.y_test = np_utils.to_categorical(self.y_test, nb_classes)\n"
  },
  {
    "path": "cleverhans/devtools/tests/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans/devtools/tests/test_format.py",
    "content": "\"\"\"\nUnit tests for format checking\n\"\"\"\n\nfrom __future__ import print_function\n\n\nimport os\nimport subprocess\n\nimport cleverhans\nfrom cleverhans.devtools.list_files import list_files\nfrom cleverhans.utils import shell_call\n\n# Enter a manual list of files that are allowed to violate PEP8 here\nwhitelist_pep8 = [\n    # This file is broken but could be fixed\n    \"../examples/multigpu_advtrain/test_attack_multigpu.py\"\n]\n\nall_py_files = list_files(\".py\")\n\n\ndef update_whitelist():\n    \"\"\"Add files to the whitelist\"\"\"\n    global whitelist_pep8\n    # We don't want to test RL-attack because it has so many dependencies\n    # not used elsewhere, and pylint wants to import them all\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"RL-attack\" in path\n        ]\n    )\n    # Similarly, we don't want to require robust_vision_benchmark installed\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"robust_vision_benchmark\" in path\n        ]\n    )\n    # Similarly, we don't want to require that cloud be installed\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"cloud_client\" in path\n        ]\n    )\n    # This example has more dependencies too\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"facenet_adversarial_faces\" in path\n        ]\n    )\n    # This too\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"madry_lab_challenges\" in path\n        ]\n    )\n    # This code is no longer compatible with new versions of cleverhans / scipy and will be removed soon\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"nips17_adversarial_competition\" in path\n        ]\n    )\n\n\nupdate_whitelist()\n\n\nwhitelist_docstrings = []\n\n\ndef test_format_pep8():\n    \"\"\"\n    Test if pep8 is respected.\n    \"\"\"\n    files_to_check = []\n    module_dir = cleverhans.__path__[0]\n    for path in all_py_files:\n        rel_path = os.path.relpath(path, module_dir)\n        if rel_path in whitelist_pep8:\n            continue\n        else:\n            files_to_check.append(path)\n    repo_dir = os.path.join(module_dir, os.pardir)\n    rcpath = os.path.join(repo_dir, \".pylintrc\")\n    assert os.path.exists(rcpath)\n\n    # We must run pylint via the command line and subprocess because of\n    # problems with the pylint module.\n    # The documentation claims you can run it as a python module, but\n    # the documentation is wrong: https://github.com/PyCQA/pylint/issues/1870\n    # If you run the version described in the linked issue, pylint\n    # calls sys.exit once it is done, so it kills the test.\n\n    # Running all files in one pylint command is important for 2 reasons:\n    # 1) Correctness: pylint can detect issues that require access to multiple\n    #    files, such as cyclic imports\n    # 2) Speed: pylint imports modules for deep analysis, so if you run\n    #    multiple subprocesses each needs to re-import tensorflow.\n    # On Ian's laptop, pylint takes about 10s per file to run on the repo,\n    # and there are about 90 files as of the writing of this comment.\n    # Running pylint on all files simultaneously takes about 70s, so it\n    # is a little better than a 10X speedup.\n\n    # Running multiple jobs in parallel helps but far less than linearly.\n    # On Ian's 4-core laptop, running 4 jobs drops the runtime from 70s\n    # to 45s.\n    # Some of the work is I/O, so it actually makes some sense to run\n    # more jobs than cores. On Ian's 4-core laptop, running 8 jobs drops\n    # the runtime to 40s.\n    # There's a further complication though: I think each job needs to\n    # redo imports, so the total amount of work to do increases with\n    # the number of jobs. On Ian's laptop, using 64 jobs causes the\n    # runtime to increase to 220s. There is not an obvious simple\n    # formula like \"use one job per CPU core\" or \"use way more jobs\n    # than cores to saturate I/O\". For now I'm hoping that 8 will be\n    # a reasonable default: it gets good performance on my laptop,\n    # and on machines with fewer than 4 cores there should still be\n    # a benefit to not being blocked on I/O.\n\n    try:\n        shell_call([\"pylint\", \"--rcfile\", rcpath, \"--jobs\", \"8\"] + files_to_check)\n    except subprocess.CalledProcessError as e:\n        raise ValueError(e.output.decode(\"utf-8\"))\n\n\nif __name__ == \"__main__\":\n    test_format_pep8()\n"
  },
  {
    "path": "cleverhans/devtools/version.py",
    "content": "\"\"\"\nUtility functions for keeping track of the version of CleverHans.\n\nThese functions provide a finer level of granularity than the\nmanually specified version string attached to each release.\n\"\"\"\nimport hashlib\nfrom cleverhans.devtools.list_files import list_files\n\n\ndef dev_version():\n    \"\"\"\n    Returns a hexdigest of all the python files in the module.\n    \"\"\"\n\n    md5_hash = hashlib.md5()\n    py_files = sorted(list_files(suffix=\".py\"))\n    if not py_files:\n        return \"\"\n    for filename in py_files:\n        with open(filename, \"rb\") as fobj:\n            content = fobj.read()\n        md5_hash.update(content)\n    return md5_hash.hexdigest()\n\n\ndef append_dev_version(release_version):\n    \"\"\"\n    If dev version is not empty appends it to release_version.\n    \"\"\"\n\n    dev_version_value = dev_version()\n    if dev_version_value:\n        return release_version + \"-\" + dev_version_value\n    else:\n        return release_version\n"
  },
  {
    "path": "cleverhans/experimental/README.md",
    "content": "This directory contains experimental features of CleverHans, which are not\nintegrated into the main API yet.\n"
  },
  {
    "path": "cleverhans/experimental/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans/experimental/certification/README.md",
    "content": "# Certification of adversarial robustness\n\nThis code performs certification of adversarial robustness of given network on\ngiven example.\n\nOriginal author: [Aditi Raghunathan](https://github.com/RAditi)\n\n## Dependencies\n\nTensorFlow 1.9.0 or higher (to have support of necessary\n[autograph](https://www.tensorflow.org/guide/autograph) features)\n\n## Usage\n\nExample usage for two-layer network trained on MNIST:\n\n```bash\n# Meaning of the arguments:\n# checkpoint - TensorFlow checkpoint of the model parameters\n# model_json - JSON file which describes the model (see below)\n# test_input - numpy file with input to certify\n# true_class - true class of the input\n# adv_class - adversarial class for which we're checking certificate,\n#             -1 means that all adversarial classes will be checked\n# epsilon - maximum size of adversarial perturbation\n# init_nu and small_eig_num_steps - optimization parameters\npython cleverhans/experimental/certification/certify.py \\\n  --checkpoint \"${MODEL_DIR}/model.ckpt\" \\\n  --model_json \"${MODEL_DIR}/model.json\" \\\n  --test_input \"${INPUTS_DIR}/image.npy\" \\\n  --true_class 4 \\\n  --adv_class 5 \\\n  --epsilon 0.2 \\\n  --init_nu 100.0 \\\n  --small_eig_num_steps 100\n```\n\nJSON file which accompany checkpoint and describes layers of the network:\n\n```json\n[\n  {\n    \"weight_var\": \"Model/layer0/logits/kernel\",\n    \"bias_var\": \"Model/layer0/logits/bias\",\n    \"type\": \"ff_relu\",\n    \"is_transpose\": true\n  },\n  {\n    \"weight_var\": \"Model/logits/kernel\",\n    \"bias_var\": \"Model/logits/bias\",\n    \"type\": \"ff\",\n    \"is_transpose\": true\n  }\n]\n```\n"
  },
  {
    "path": "cleverhans/experimental/certification/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans/experimental/certification/certify.py",
    "content": "\"\"\"Code for running the certification problem.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport time\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.experimental.certification import dual_formulation\nfrom cleverhans.experimental.certification import nn\nfrom cleverhans.experimental.certification import optimization\nfrom cleverhans.experimental.certification import utils\n\nflags = tf.app.flags\nFLAGS = flags.FLAGS\nflags.DEFINE_string(\n    \"checkpoint\", None, \"Path of checkpoint with trained model to verify\"\n)\nflags.DEFINE_string(\"model_json\", None, \"Path of json file with model description\")\nflags.DEFINE_string(\n    \"init_dual_file\", None, \"Path of numpy file with dual variables to initialize\"\n)\nflags.DEFINE_string(\"test_input\", None, \"Path of numpy file with test input to certify\")\nflags.DEFINE_integer(\"true_class\", 0, \"True class of the test input\")\nflags.DEFINE_integer(\n    \"adv_class\", -1, \"target class of adversarial example; all classes if -1\"\n)\nflags.DEFINE_float(\"input_minval\", -1, \"Minimum value of valid input\")\nflags.DEFINE_float(\"input_maxval\", 1, \"Maximum value of valid input\")\nflags.DEFINE_float(\"epsilon\", 0.2, \"Size of perturbation\")\n# Nu might need tuning based on the network\nflags.DEFINE_float(\"init_nu\", 300.0, \"Initialization of nu variable.\")\nflags.DEFINE_float(\"init_penalty\", 100.0, \"Initial penalty\")\nflags.DEFINE_integer(\n    \"small_eig_num_steps\", 500, \"Number of eigen value steps in intermediate iterations\"\n)\nflags.DEFINE_integer(\n    \"large_eig_num_steps\", 5000, \"Number of eigen value steps in each outer iteration\"\n)\nflags.DEFINE_integer(\"inner_num_steps\", 600, \"Number of steps to run in inner loop\")\nflags.DEFINE_float(\"outer_num_steps\", 10, \"Number of steps to run in outer loop\")\nflags.DEFINE_float(\"beta\", 2, \"Multiplicative factor to increase penalty by\")\nflags.DEFINE_float(\n    \"smoothness_parameter\", 0.001, \"Smoothness parameter if using eigen decomposition\"\n)\nflags.DEFINE_float(\n    \"eig_learning_rate\", 0.001, \"Learning rate for computing min eigen value\"\n)\nflags.DEFINE_string(\"optimizer\", \"adam\", \"Optimizer to use for entire optimization\")\nflags.DEFINE_float(\"init_learning_rate\", 0.1, \"Initial learning rate\")\nflags.DEFINE_float(\"learning_rate_decay\", 0.1, \"Decay of learning rate\")\nflags.DEFINE_float(\n    \"momentum_parameter\", 0.9, \"Momentum parameter if using momentum optimizer\"\n)\nflags.DEFINE_integer(\"print_stats_steps\", 50, \"Number of steps to print stats after\")\nflags.DEFINE_string(\"stats_folder\", None, \"Folder to save stats of the iterations\")\nflags.DEFINE_integer(\n    \"projection_steps\", 200, \"Number of steps to compute projection after\"\n)\nflags.DEFINE_integer(\"num_classes\", 10, \"Total number of classes\")\nflags.DEFINE_enum(\n    \"verbosity\",\n    \"INFO\",\n    [\"DEBUG\", \"INFO\", \"WARNING\", \"ERROR\", \"CRITICAL\"],\n    \"Logging verbosity level.\",\n)\nflags.DEFINE_string(\n    \"eig_type\", \"LZS\", \"Method to compute eigenvalues (TF, SCIPY, or LZS), LZS\"\n)\nflags.DEFINE_integer(\n    \"lanczos_steps\", 20, \"Number of steps to perform in Lanczos method.\"\n)\nflags.DEFINE_integer(\"num_rows\", 28, \"Number of rows in image\")\nflags.DEFINE_integer(\"num_columns\", 28, \"Number of columns in image\")\nflags.DEFINE_integer(\"num_channels\", 1, \"Number of channels in image\")\n\nMIN_LANCZOS_ITER = 5\n\n\ndef main(_):\n    # pylint: disable=missing-docstring\n    tf.logging.set_verbosity(FLAGS.verbosity)\n\n    start_time = time.time()\n\n    # Initialize neural network based on config files\n    input_shape = [FLAGS.num_rows, FLAGS.num_columns, FLAGS.num_channels]\n    nn_params = nn.load_network_from_checkpoint(\n        FLAGS.checkpoint, FLAGS.model_json, input_shape\n    )\n    tf.logging.info(\"Loaded neural network with size of layers: %s\", nn_params.sizes)\n    tf.logging.info(\n        \"Loaded neural network with input shapes: %s\", nn_params.input_shapes\n    )\n    tf.logging.info(\n        \"Loaded neural network with output shapes: %s\", nn_params.output_shapes\n    )\n    dual_var = utils.initialize_dual(\n        nn_params, FLAGS.init_dual_file, init_nu=FLAGS.init_nu\n    )\n\n    # Reading test input and reshaping\n    with tf.gfile.Open(FLAGS.test_input) as f:\n        test_input = np.load(f)\n    test_input = np.reshape(test_input, [np.size(test_input), 1])\n\n    if FLAGS.adv_class == -1:\n        start_class = 0\n        end_class = FLAGS.num_classes\n    else:\n        start_class = FLAGS.adv_class\n        end_class = FLAGS.adv_class + 1\n    for adv_class in range(start_class, end_class):\n        tf.logging.info(\"Running certification for adversarial class %d\", adv_class)\n        if adv_class == FLAGS.true_class:\n            continue\n\n        optimization_params = {\n            \"init_penalty\": FLAGS.init_penalty,\n            \"large_eig_num_steps\": FLAGS.large_eig_num_steps,\n            \"small_eig_num_steps\": FLAGS.small_eig_num_steps,\n            \"inner_num_steps\": FLAGS.inner_num_steps,\n            \"outer_num_steps\": FLAGS.outer_num_steps,\n            \"beta\": FLAGS.beta,\n            \"smoothness_parameter\": FLAGS.smoothness_parameter,\n            \"eig_learning_rate\": FLAGS.eig_learning_rate,\n            \"optimizer\": FLAGS.optimizer,\n            \"init_learning_rate\": FLAGS.init_learning_rate,\n            \"learning_rate_decay\": FLAGS.learning_rate_decay,\n            \"momentum_parameter\": FLAGS.momentum_parameter,\n            \"print_stats_steps\": FLAGS.print_stats_steps,\n            \"stats_folder\": FLAGS.stats_folder,\n            \"projection_steps\": FLAGS.projection_steps,\n            \"eig_type\": FLAGS.eig_type,\n            \"has_conv\": nn_params.has_conv,\n            \"lanczos_steps\": FLAGS.lanczos_steps,\n        }\n        lzs_params = {\"min_iter\": MIN_LANCZOS_ITER, \"max_iter\": FLAGS.lanczos_steps}\n        with tf.Session() as sess:\n            dual = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params,\n                test_input,\n                FLAGS.true_class,\n                adv_class,\n                FLAGS.input_minval,\n                FLAGS.input_maxval,\n                FLAGS.epsilon,\n                lzs_params,\n            )\n            optimization_object = optimization.Optimization(\n                dual, sess, optimization_params\n            )\n            is_cert_found = optimization_object.run_optimization()\n            if not is_cert_found:\n                print(\"Example could not be verified\")\n                exit()\n    print(\"Example successfully verified\")\n    print(\"Elapsed time: \" + str(time.time() - start_time))\n\n\nif __name__ == \"__main__\":\n    tf.app.run(main)\n"
  },
  {
    "path": "cleverhans/experimental/certification/dual_formulation.py",
    "content": "\"\"\"Code with dual formulation for certification problem.\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nfrom scipy.sparse.linalg import eigs, LinearOperator\nimport tensorflow as tf\nfrom tensorflow.contrib import autograph\nimport numpy as np\n\nfrom cleverhans.experimental.certification import utils\n\nflags = tf.app.flags\nFLAGS = flags.FLAGS\n\n# Tolerance value for eigenvalue computation\nTOL = 1e-5\n\n# Binary search constants\nMAX_BINARY_SEARCH_ITER = 10\nNU_UPDATE_CONSTANT = 1.3\n\n# Bound on lowest value of certificate to check for numerical errors\nLOWER_CERT_BOUND = -5.0\nDEFAULT_LZS_PARAMS = {\"min_iter\": 5, \"max_iter\": 50}\n\n\nclass DualFormulation(object):\n    \"\"\"DualFormulation is a class that creates the dual objective function\n    and access to matrix vector products for the matrix that is constrained\n    to be Positive semidefinite\n    \"\"\"\n\n    def __init__(\n        self,\n        sess,\n        dual_var,\n        neural_net_param_object,\n        test_input,\n        true_class,\n        adv_class,\n        input_minval,\n        input_maxval,\n        epsilon,\n        lzs_params=None,\n        project_dual=True,\n    ):\n        \"\"\"Initializes dual formulation class.\n\n        Args:\n          sess: Tensorflow session\n          dual_var: dictionary of dual variables containing a) lambda_pos\n            b) lambda_neg, c) lambda_quad, d) lambda_lu\n          neural_net_param_object: NeuralNetParam object created for the network\n            under consideration\n          test_input: clean example to certify around\n          true_class: the class label of the test input\n          adv_class: the label that the adversary tried to perturb input to\n          input_minval: minimum value of valid input range\n          input_maxval: maximum value of valid input range\n          epsilon: Size of the perturbation (scaled for [0, 1] input)\n          lzs_params: Parameters for Lanczos algorithm (dictionary) in the form:\n            {\n              'min_iter': 5\n              'max_iter': 50\n            }\n          project_dual: Whether we should create a projected dual object\n        \"\"\"\n        self.sess = sess\n        self.nn_params = neural_net_param_object\n        self.test_input = tf.convert_to_tensor(test_input, dtype=tf.float32)\n        self.true_class = true_class\n        self.adv_class = adv_class\n        self.input_minval = tf.convert_to_tensor(input_minval, dtype=tf.float32)\n        self.input_maxval = tf.convert_to_tensor(input_maxval, dtype=tf.float32)\n        self.epsilon = tf.convert_to_tensor(epsilon, dtype=tf.float32)\n        self.lzs_params = lzs_params or DEFAULT_LZS_PARAMS.copy()\n        self.final_linear = (\n            self.nn_params.final_weights[adv_class, :]\n            - self.nn_params.final_weights[true_class, :]\n        )\n        self.final_linear = tf.reshape(\n            self.final_linear, shape=[tf.size(self.final_linear), 1]\n        )\n        self.final_constant = (\n            self.nn_params.final_bias[adv_class] - self.nn_params.final_bias[true_class]\n        )\n        self.lanczos_dtype = tf.float64\n        self.nn_dtype = tf.float32\n\n        # Computing lower and upper bounds\n        # Note that lower and upper are of size nn_params.num_hidden_layers + 1\n        self.lower = []\n        self.upper = []\n\n        # Also computing pre activation lower and upper bounds\n        # to compute always-off and always-on units\n        self.pre_lower = []\n        self.pre_upper = []\n\n        # Initializing at the input layer with \\ell_\\infty constraints\n        self.lower.append(tf.maximum(self.test_input - self.epsilon, self.input_minval))\n        self.upper.append(tf.minimum(self.test_input + self.epsilon, self.input_maxval))\n        self.pre_lower.append(self.lower[0])\n        self.pre_upper.append(self.upper[0])\n\n        for i in range(0, self.nn_params.num_hidden_layers):\n            lo_plus_up = self.nn_params.forward_pass(self.lower[i] + self.upper[i], i)\n            lo_minus_up = self.nn_params.forward_pass(\n                self.lower[i] - self.upper[i], i, is_abs=True\n            )\n            up_minus_lo = self.nn_params.forward_pass(\n                self.upper[i] - self.lower[i], i, is_abs=True\n            )\n            current_lower = 0.5 * (lo_plus_up + lo_minus_up) + self.nn_params.biases[i]\n            current_upper = 0.5 * (lo_plus_up + up_minus_lo) + self.nn_params.biases[i]\n            self.pre_lower.append(current_lower)\n            self.pre_upper.append(current_upper)\n            self.lower.append(tf.nn.relu(current_lower))\n            self.upper.append(tf.nn.relu(current_upper))\n\n        # Run lower and upper because they don't change\n        self.pre_lower = self.sess.run(self.pre_lower)\n        self.pre_upper = self.sess.run(self.pre_upper)\n        self.lower = self.sess.run(self.lower)\n        self.upper = self.sess.run(self.upper)\n\n        # Using the preactivation lower and upper bounds\n        # to compute the linear regions\n        self.positive_indices = []\n        self.negative_indices = []\n        self.switch_indices = []\n\n        for i in range(0, self.nn_params.num_hidden_layers + 1):\n            # Positive index = 1 if the ReLU is always \"on\"\n            self.positive_indices.append(\n                np.asarray(self.pre_lower[i] >= 0, dtype=np.float32)\n            )\n            # Negative index = 1 if the ReLU is always off\n            self.negative_indices.append(\n                np.asarray(self.pre_upper[i] <= 0, dtype=np.float32)\n            )\n            # Switch index = 1 if the ReLU could be either on or off\n            self.switch_indices.append(\n                np.asarray(\n                    np.multiply(self.pre_lower[i], self.pre_upper[i]) < 0,\n                    dtype=np.float32,\n                )\n            )\n\n        # Computing the optimization terms\n        self.lambda_pos = [x for x in dual_var[\"lambda_pos\"]]\n        self.lambda_neg = [x for x in dual_var[\"lambda_neg\"]]\n        self.lambda_quad = [x for x in dual_var[\"lambda_quad\"]]\n        self.lambda_lu = [x for x in dual_var[\"lambda_lu\"]]\n        self.nu = dual_var[\"nu\"]\n        self.vector_g = None\n        self.scalar_f = None\n        self.matrix_h = None\n        self.matrix_m = None\n        self.matrix_m_dimension = 1 + np.sum(self.nn_params.sizes)\n\n        # The primal vector in the SDP can be thought of as [layer_1, layer_2..]\n        # In this concatenated version, dual_index[i] that marks the start\n        # of layer_i\n        # This is useful while computing implicit products with matrix H\n        self.dual_index = [0]\n        for i in range(self.nn_params.num_hidden_layers + 1):\n            self.dual_index.append(self.dual_index[-1] + self.nn_params.sizes[i])\n\n        # Construct objectives, matrices, and certificate\n        self.set_differentiable_objective()\n        if not self.nn_params.has_conv:\n            self.get_full_psd_matrix()\n\n        # Setup Lanczos functionality for compute certificate\n        self.construct_lanczos_params()\n\n        # Create projected dual object\n        if project_dual:\n            self.projected_dual = self.create_projected_dual()\n\n    def create_projected_dual(self):\n        \"\"\"Function to create variables for the projected dual object.\n        Function that projects the input dual variables onto the feasible set.\n        Returns:\n          projected_dual: Feasible dual solution corresponding to current dual\n        \"\"\"\n        # TODO: consider whether we can use shallow copy of the lists without\n        # using tf.identity\n        projected_nu = tf.placeholder(tf.float32, shape=[])\n        min_eig_h = tf.placeholder(tf.float32, shape=[])\n        projected_lambda_pos = [tf.identity(x) for x in self.lambda_pos]\n        projected_lambda_neg = [tf.identity(x) for x in self.lambda_neg]\n        projected_lambda_quad = [tf.identity(x) for x in self.lambda_quad]\n        projected_lambda_lu = [tf.identity(x) for x in self.lambda_lu]\n\n        for i in range(self.nn_params.num_hidden_layers + 1):\n            # Making H PSD\n            projected_lambda_lu[i] = (\n                self.lambda_lu[i] + 0.5 * tf.maximum(-min_eig_h, 0) + TOL\n            )\n            # Adjusting the value of \\lambda_neg to make change in g small\n            projected_lambda_neg[i] = self.lambda_neg[i] + tf.multiply(\n                (self.lower[i] + self.upper[i]),\n                (self.lambda_lu[i] - projected_lambda_lu[i]),\n            )\n            projected_lambda_neg[i] = tf.multiply(\n                self.negative_indices[i], projected_lambda_neg[i]\n            ) + tf.multiply(\n                self.switch_indices[i], tf.maximum(projected_lambda_neg[i], 0)\n            )\n\n        projected_dual_var = {\n            \"lambda_pos\": projected_lambda_pos,\n            \"lambda_neg\": projected_lambda_neg,\n            \"lambda_lu\": projected_lambda_lu,\n            \"lambda_quad\": projected_lambda_quad,\n            \"nu\": projected_nu,\n        }\n        projected_dual_object = DualFormulation(\n            self.sess,\n            projected_dual_var,\n            self.nn_params,\n            self.test_input,\n            self.true_class,\n            self.adv_class,\n            self.input_minval,\n            self.input_maxval,\n            self.epsilon,\n            self.lzs_params,\n            project_dual=False,\n        )\n        projected_dual_object.min_eig_val_h = min_eig_h\n        return projected_dual_object\n\n    def construct_lanczos_params(self):\n        \"\"\"Computes matrices T and V using the Lanczos algorithm.\n\n        Args:\n          k: number of iterations and dimensionality of the tridiagonal matrix\n        Returns:\n          eig_vec: eigen vector corresponding to min eigenvalue\n        \"\"\"\n        # Using autograph to automatically handle\n        # the control flow of minimum_eigen_vector\n        self.min_eigen_vec = autograph.to_graph(utils.tf_lanczos_smallest_eigval)\n\n        def _m_vector_prod_fn(x):\n            return self.get_psd_product(x, dtype=self.lanczos_dtype)\n\n        def _h_vector_prod_fn(x):\n            return self.get_h_product(x, dtype=self.lanczos_dtype)\n\n        # Construct nodes for computing eigenvalue of M\n        self.m_min_vec_estimate = np.zeros(\n            shape=(self.matrix_m_dimension, 1), dtype=np.float64\n        )\n        zeros_m = tf.zeros(shape=(self.matrix_m_dimension, 1), dtype=tf.float64)\n        self.m_min_vec_ph = tf.placeholder_with_default(\n            input=zeros_m, shape=(self.matrix_m_dimension, 1), name=\"m_min_vec_ph\"\n        )\n        self.m_min_eig, self.m_min_vec = self.min_eigen_vec(\n            _m_vector_prod_fn,\n            self.matrix_m_dimension,\n            self.m_min_vec_ph,\n            self.lzs_params[\"max_iter\"],\n            dtype=self.lanczos_dtype,\n        )\n        self.m_min_eig = tf.cast(self.m_min_eig, self.nn_dtype)\n        self.m_min_vec = tf.cast(self.m_min_vec, self.nn_dtype)\n\n        self.h_min_vec_estimate = np.zeros(\n            shape=(self.matrix_m_dimension - 1, 1), dtype=np.float64\n        )\n        zeros_h = tf.zeros(shape=(self.matrix_m_dimension - 1, 1), dtype=tf.float64)\n        self.h_min_vec_ph = tf.placeholder_with_default(\n            input=zeros_h, shape=(self.matrix_m_dimension - 1, 1), name=\"h_min_vec_ph\"\n        )\n        self.h_min_eig, self.h_min_vec = self.min_eigen_vec(\n            _h_vector_prod_fn,\n            self.matrix_m_dimension - 1,\n            self.h_min_vec_ph,\n            self.lzs_params[\"max_iter\"],\n            dtype=self.lanczos_dtype,\n        )\n        self.h_min_eig = tf.cast(self.h_min_eig, self.nn_dtype)\n        self.h_min_vec = tf.cast(self.h_min_vec, self.nn_dtype)\n\n    def set_differentiable_objective(self):\n        \"\"\"Function that constructs minimization objective from dual variables.\"\"\"\n        # Checking if graphs are already created\n        if self.vector_g is not None:\n            return\n\n        # Computing the scalar term\n        bias_sum = 0\n        for i in range(0, self.nn_params.num_hidden_layers):\n            bias_sum = bias_sum + tf.reduce_sum(\n                tf.multiply(self.nn_params.biases[i], self.lambda_pos[i + 1])\n            )\n        lu_sum = 0\n        for i in range(0, self.nn_params.num_hidden_layers + 1):\n            lu_sum = lu_sum + tf.reduce_sum(\n                tf.multiply(\n                    tf.multiply(self.lower[i], self.upper[i]), self.lambda_lu[i]\n                )\n            )\n\n        self.scalar_f = -bias_sum - lu_sum + self.final_constant\n\n        # Computing the vector term\n        g_rows = []\n        for i in range(0, self.nn_params.num_hidden_layers):\n            if i > 0:\n                current_row = (\n                    self.lambda_neg[i]\n                    + self.lambda_pos[i]\n                    - self.nn_params.forward_pass(\n                        self.lambda_pos[i + 1], i, is_transpose=True\n                    )\n                    + tf.multiply(self.lower[i] + self.upper[i], self.lambda_lu[i])\n                    + tf.multiply(self.lambda_quad[i], self.nn_params.biases[i - 1])\n                )\n            else:\n                current_row = -self.nn_params.forward_pass(\n                    self.lambda_pos[i + 1], i, is_transpose=True\n                ) + tf.multiply(self.lower[i] + self.upper[i], self.lambda_lu[i])\n            g_rows.append(current_row)\n\n        # Term for final linear term\n        g_rows.append(\n            (\n                self.lambda_pos[self.nn_params.num_hidden_layers]\n                + self.lambda_neg[self.nn_params.num_hidden_layers]\n                + self.final_linear\n                + tf.multiply(\n                    (\n                        self.lower[self.nn_params.num_hidden_layers]\n                        + self.upper[self.nn_params.num_hidden_layers]\n                    ),\n                    self.lambda_lu[self.nn_params.num_hidden_layers],\n                )\n                + tf.multiply(\n                    self.lambda_quad[self.nn_params.num_hidden_layers],\n                    self.nn_params.biases[self.nn_params.num_hidden_layers - 1],\n                )\n            )\n        )\n        self.vector_g = tf.concat(g_rows, axis=0)\n        self.unconstrained_objective = self.scalar_f + 0.5 * self.nu\n\n    def get_h_product(self, vector, dtype=None):\n        \"\"\"Function that provides matrix product interface with PSD matrix.\n\n        Args:\n          vector: the vector to be multiplied with matrix H\n\n        Returns:\n          result_product: Matrix product of H and vector\n        \"\"\"\n        # Computing the product of matrix_h with beta (input vector)\n        # At first layer, h is simply diagonal\n        if dtype is None:\n            dtype = self.nn_dtype\n        beta = tf.cast(vector, self.nn_dtype)\n        h_beta_rows = []\n        for i in range(self.nn_params.num_hidden_layers):\n            # Split beta of this block into [gamma, delta]\n            gamma = beta[self.dual_index[i] : self.dual_index[i + 1]]\n            delta = beta[self.dual_index[i + 1] : self.dual_index[i + 2]]\n\n            # Expanding the product with diagonal matrices\n            if i == 0:\n                h_beta_rows.append(\n                    tf.multiply(2 * self.lambda_lu[i], gamma)\n                    - self.nn_params.forward_pass(\n                        tf.multiply(self.lambda_quad[i + 1], delta),\n                        i,\n                        is_transpose=True,\n                    )\n                )\n            else:\n                h_beta_rows[i] = (\n                    h_beta_rows[i]\n                    + tf.multiply(self.lambda_quad[i] + self.lambda_lu[i], gamma)\n                    - self.nn_params.forward_pass(\n                        tf.multiply(self.lambda_quad[i + 1], delta),\n                        i,\n                        is_transpose=True,\n                    )\n                )\n\n            new_row = tf.multiply(\n                self.lambda_quad[i + 1] + self.lambda_lu[i + 1], delta\n            ) - tf.multiply(\n                self.lambda_quad[i + 1], self.nn_params.forward_pass(gamma, i)\n            )\n            h_beta_rows.append(new_row)\n\n        # Last boundary case\n        h_beta_rows[self.nn_params.num_hidden_layers] = h_beta_rows[\n            self.nn_params.num_hidden_layers\n        ] + tf.multiply(\n            (\n                self.lambda_quad[self.nn_params.num_hidden_layers]\n                + self.lambda_lu[self.nn_params.num_hidden_layers]\n            ),\n            delta,\n        )\n\n        h_beta = tf.concat(h_beta_rows, axis=0)\n        return tf.cast(h_beta, dtype)\n\n    def get_psd_product(self, vector, dtype=None):\n        \"\"\"Function that provides matrix product interface with PSD matrix.\n\n        Args:\n          vector: the vector to be multiplied with matrix M\n\n        Returns:\n          result_product: Matrix product of M and vector\n        \"\"\"\n        # For convenience, think of x as [\\alpha, \\beta]\n        if dtype is None:\n            dtype = self.nn_dtype\n        vector = tf.cast(vector, self.nn_dtype)\n        alpha = tf.reshape(vector[0], shape=[1, 1])\n        beta = vector[1:]\n        # Computing the product of matrix_h with beta part of vector\n        # At first layer, h is simply diagonal\n        h_beta = self.get_h_product(beta)\n\n        # Constructing final result using vector_g\n        result = tf.concat(\n            [\n                alpha * self.nu + tf.reduce_sum(tf.multiply(beta, self.vector_g)),\n                tf.multiply(alpha, self.vector_g) + h_beta,\n            ],\n            axis=0,\n        )\n        return tf.cast(result, dtype)\n\n    def get_full_psd_matrix(self):\n        \"\"\"Function that returns the tf graph corresponding to the entire matrix M.\n\n        Returns:\n          matrix_h: unrolled version of tf matrix corresponding to H\n          matrix_m: unrolled tf matrix corresponding to M\n        \"\"\"\n        if self.matrix_m is not None:\n            return self.matrix_h, self.matrix_m\n\n        # Computing the matrix term\n        h_columns = []\n        for i in range(self.nn_params.num_hidden_layers + 1):\n            current_col_elems = []\n            for j in range(i):\n                current_col_elems.append(\n                    tf.zeros([self.nn_params.sizes[j], self.nn_params.sizes[i]])\n                )\n\n            # For the first layer, there is no relu constraint\n            if i == 0:\n                current_col_elems.append(utils.diag(self.lambda_lu[i]))\n            else:\n                current_col_elems.append(\n                    utils.diag(self.lambda_lu[i] + self.lambda_quad[i])\n                )\n            if i < self.nn_params.num_hidden_layers:\n                current_col_elems.append(\n                    tf.matmul(\n                        utils.diag(-1 * self.lambda_quad[i + 1]),\n                        self.nn_params.weights[i],\n                    )\n                )\n            for j in range(i + 2, self.nn_params.num_hidden_layers + 1):\n                current_col_elems.append(\n                    tf.zeros([self.nn_params.sizes[j], self.nn_params.sizes[i]])\n                )\n            current_column = tf.concat(current_col_elems, 0)\n            h_columns.append(current_column)\n\n        self.matrix_h = tf.concat(h_columns, 1)\n        self.matrix_h = self.matrix_h + tf.transpose(self.matrix_h)\n\n        self.matrix_m = tf.concat(\n            [\n                tf.concat(\n                    [tf.reshape(self.nu, (1, 1)), tf.transpose(self.vector_g)], axis=1\n                ),\n                tf.concat([self.vector_g, self.matrix_h], axis=1),\n            ],\n            axis=0,\n        )\n        return self.matrix_h, self.matrix_m\n\n    def make_m_psd(self, original_nu, feed_dictionary):\n        \"\"\"Run binary search to find a value for nu that makes M PSD\n        Args:\n          original_nu: starting value of nu to do binary search on\n          feed_dictionary: dictionary of updated lambda variables to feed into M\n        Returns:\n          new_nu: new value of nu\n        \"\"\"\n        feed_dict = feed_dictionary.copy()\n        _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict)\n\n        lower_nu = original_nu\n        upper_nu = original_nu\n        num_iter = 0\n\n        # Find an upper bound on nu\n        while min_eig_val_m - TOL < 0 and num_iter < (MAX_BINARY_SEARCH_ITER / 2):\n            num_iter += 1\n            upper_nu *= NU_UPDATE_CONSTANT\n            feed_dict.update({self.nu: upper_nu})\n            _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict)\n\n        final_nu = upper_nu\n\n        # Perform binary search to find best value of nu\n        while lower_nu <= upper_nu and num_iter < MAX_BINARY_SEARCH_ITER:\n            num_iter += 1\n            mid_nu = (lower_nu + upper_nu) / 2\n            feed_dict.update({self.nu: mid_nu})\n            _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict)\n            if min_eig_val_m - TOL < 0:\n                lower_nu = mid_nu\n            else:\n                upper_nu = mid_nu\n\n        final_nu = upper_nu\n\n        return final_nu\n\n    def get_lanczos_eig(self, compute_m=True, feed_dict=None):\n        \"\"\"Computes the min eigen value and corresponding vector of matrix M or H\n        using the Lanczos algorithm.\n        Args:\n          compute_m: boolean to determine whether we should compute eig val/vec\n            for M or for H. True for M; False for H.\n          feed_dict: dictionary mapping from TF placeholders to values (optional)\n        Returns:\n          min_eig_vec: Corresponding eigen vector to min eig val\n          eig_val: Minimum eigen value\n        \"\"\"\n        if compute_m:\n            min_eig, min_vec = self.sess.run(\n                [self.m_min_eig, self.m_min_vec], feed_dict=feed_dict\n            )\n\n        else:\n            min_eig, min_vec = self.sess.run(\n                [self.h_min_eig, self.h_min_vec], feed_dict=feed_dict\n            )\n\n        return min_vec, min_eig\n\n    def compute_certificate(self, current_step, feed_dictionary):\n        \"\"\"Function to compute the certificate based either current value\n        or dual variables loaded from dual folder\"\"\"\n        feed_dict = feed_dictionary.copy()\n        nu = feed_dict[self.nu]\n        second_term = self.make_m_psd(nu, feed_dict)\n        tf.logging.info(\"Nu after modifying: \" + str(second_term))\n        feed_dict.update({self.nu: second_term})\n        computed_certificate = self.sess.run(\n            self.unconstrained_objective, feed_dict=feed_dict\n        )\n\n        tf.logging.info(\n            \"Inner step: %d, current value of certificate: %f\",\n            current_step,\n            computed_certificate,\n        )\n\n        # Sometimes due to either overflow or instability in inverses,\n        # the returned certificate is large and negative -- keeping a check\n        if LOWER_CERT_BOUND < computed_certificate < 0:\n            _, min_eig_val_m = self.get_lanczos_eig(feed_dict=feed_dict)\n            tf.logging.info(\"min eig val from lanczos: \" + str(min_eig_val_m))\n            input_vector_m = tf.placeholder(\n                tf.float32, shape=(self.matrix_m_dimension, 1)\n            )\n            output_vector_m = self.get_psd_product(input_vector_m)\n\n            def np_vector_prod_fn_m(np_vector):\n                np_vector = np.reshape(np_vector, [-1, 1])\n                feed_dict.update({input_vector_m: np_vector})\n                output_np_vector = self.sess.run(output_vector_m, feed_dict=feed_dict)\n                return output_np_vector\n\n            linear_operator_m = LinearOperator(\n                (self.matrix_m_dimension, self.matrix_m_dimension),\n                matvec=np_vector_prod_fn_m,\n            )\n            # Performing shift invert scipy operation when eig val estimate is available\n            min_eig_val_m_scipy, _ = eigs(linear_operator_m, k=1, which=\"SR\", tol=TOL)\n\n            tf.logging.info(\"min eig val m from scipy: \" + str(min_eig_val_m_scipy))\n\n            if min_eig_val_m - TOL > 0:\n                tf.logging.info(\"Found certificate of robustness!\")\n                return True\n\n        return False\n"
  },
  {
    "path": "cleverhans/experimental/certification/nn.py",
    "content": "\"\"\"This file defines the neural network class, where a network is reinitialized from configuration files.\n\nThe class also has a forward propagation method.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport json\nimport numpy as np\nimport tensorflow as tf\n\n\nclass NeuralNetwork(object):\n    \"\"\"NeuralNetwork is a class that interfaces the verification code with\n    the neural net parameters (weights).\n    \"\"\"\n\n    def __init__(\n        self,\n        net_weights,\n        net_biases,\n        net_layer_types,\n        input_shape=None,\n        cnn_params=None,\n    ):\n        \"\"\"Function to initialize NeuralNetParams class.\n\n        Args:\n          net_weights: list of numpy matrices of weights of each layer\n           [convention: x[i+1] = W[i] x[i]\n          net_biases: list of numpy arrays of biases of each layer\n          net_layer_types: type of each layer ['ff' or 'ff_relu' or 'ff_conv' or\n            'ff_conv_relu']\n\n            'ff': Simple feedforward layer with no activations\n            'ff_relu': Simple feedforward layer with ReLU activations\n            'ff_conv': Convolution layer with no activation\n            'ff_conv_relu': Convolution layer with ReLU activation\n          input_shape: [num_rows, num_columns, num_channels] at the input layer\n          cnn_params: list of dictionaries containing stride and padding for\n            each layer\n\n        Raises:\n          ValueError: the input lists of net params are not of the same length\n        \"\"\"\n        if (len(net_weights) != len(net_biases)) or len(net_biases) != len(\n            net_layer_types\n        ):\n            raise ValueError(\"Inputs of net params are not of same length ....\")\n        if net_layer_types[len(net_layer_types) - 1] != \"ff\":\n            raise ValueError(\"Final layer is not linear\")\n        self.num_hidden_layers = len(net_weights) - 1\n        self.weights = []\n        self.biases = []\n        self.layer_types = []\n        self.sizes = []\n        self.input_shapes = []\n        self.output_shapes = []\n        self.has_conv = False\n        if input_shape is not None:\n            current_num_rows = input_shape[0]\n            current_num_columns = input_shape[1]\n            current_num_channels = input_shape[2]\n        self.cnn_params = cnn_params\n\n        # Setting the sizes of the layers of the network\n        # sizes[i] contains the size of x_i\n        for i in range(self.num_hidden_layers):\n            shape = np.shape(net_weights[i])\n            self.weights.append(tf.convert_to_tensor(net_weights[i], dtype=tf.float32))\n            self.layer_types.append(net_layer_types[i])\n\n            if self.layer_types[i] in {\"ff\", \"ff_relu\"}:\n                self.sizes.append(int(shape[1]))\n                # For feedforward networks, no unraveling the bias terms\n\n                small_bias = tf.convert_to_tensor(net_biases[i], dtype=tf.float32)\n                self.biases.append(tf.reshape(small_bias, [-1, 1]))\n                # Assumes that x^{i+1} = W_i x^i\n                self.input_shapes.append([int(shape[1]), 1])\n                self.output_shapes.append([int(shape[0]), 1])\n\n            # Convolution type\n            else:\n                self.has_conv = True\n                num_filters = shape[3]\n                self.input_shapes.append(\n                    [1, current_num_rows, current_num_columns, current_num_channels]\n                )\n                self.sizes.append(\n                    current_num_rows * current_num_columns * current_num_channels\n                )\n                current_num_channels = num_filters\n                # For propagating across multiple conv layers\n                if self.cnn_params[i][\"padding\"] == \"SAME\":\n                    current_num_rows = int(\n                        current_num_rows / self.cnn_params[i][\"stride\"]\n                    )\n                    current_num_columns = int(\n                        current_num_columns / self.cnn_params[i][\"stride\"]\n                    )\n                self.output_shapes.append(\n                    [1, current_num_rows, current_num_columns, current_num_channels]\n                )\n\n                # For conv networks, unraveling the bias terms\n                small_bias = tf.convert_to_tensor(net_biases[i], dtype=tf.float32)\n                large_bias = tf.tile(\n                    tf.reshape(small_bias, [-1, 1]),\n                    [current_num_rows * current_num_columns, 1],\n                )\n                self.biases.append(large_bias)\n\n        # Last layer shape: always ff\n        if self.has_conv:\n            final_dim = int(np.shape(net_weights[self.num_hidden_layers])[1])\n            self.input_shapes.append([final_dim, 1])\n\n        else:\n            final_dim = int(np.shape(net_weights[self.num_hidden_layers - 1])[0])\n\n        self.sizes.append(final_dim)\n        self.final_weights = tf.convert_to_tensor(\n            net_weights[self.num_hidden_layers], dtype=tf.float32\n        )\n        self.final_bias = tf.convert_to_tensor(\n            net_biases[self.num_hidden_layers], dtype=tf.float32\n        )\n\n    def forward_pass(self, vector, layer_index, is_transpose=False, is_abs=False):\n        \"\"\"Performs forward pass through the layer weights at layer_index.\n\n        Args:\n          vector: vector that has to be passed through in forward pass\n          layer_index: index of the layer\n          is_transpose: whether the weights of the layer have to be transposed\n          is_abs: whether to take the absolute value of the weights\n\n        Returns:\n          tensor that corresponds to the forward pass through the layer\n        Raises:\n          ValueError: if the layer_index is negative or more than num hidden layers\n        \"\"\"\n        if layer_index < 0 or layer_index > self.num_hidden_layers:\n            raise ValueError(\"Invalid layer index\")\n\n        layer_type = self.layer_types[layer_index]\n        weight = self.weights[layer_index]\n        if is_abs:\n            weight = tf.abs(weight)\n        if is_transpose:\n            vector = tf.reshape(vector, self.output_shapes[layer_index])\n        else:\n            vector = tf.reshape(vector, self.input_shapes[layer_index])\n\n        if layer_type in {\"ff\", \"ff_relu\"}:\n            if is_transpose:\n                weight = tf.transpose(weight)\n            return_vector = tf.matmul(weight, vector)\n        elif layer_type in {\"conv\", \"conv_relu\"}:\n            if is_transpose:\n                return_vector = tf.nn.conv2d_transpose(\n                    vector,\n                    weight,\n                    output_shape=self.input_shapes[layer_index],\n                    strides=[\n                        1,\n                        self.cnn_params[layer_index][\"stride\"],\n                        self.cnn_params[layer_index][\"stride\"],\n                        1,\n                    ],\n                    padding=self.cnn_params[layer_index][\"padding\"],\n                )\n            else:\n                return_vector = tf.nn.conv2d(\n                    vector,\n                    weight,\n                    strides=[\n                        1,\n                        self.cnn_params[layer_index][\"stride\"],\n                        self.cnn_params[layer_index][\"stride\"],\n                        1,\n                    ],\n                    padding=self.cnn_params[layer_index][\"padding\"],\n                )\n        else:\n            raise NotImplementedError(\"Unsupported layer type: {0}\".format(layer_type))\n        if is_transpose:\n            return tf.reshape(return_vector, (self.sizes[layer_index], 1))\n        return tf.reshape(return_vector, (self.sizes[layer_index + 1], 1))\n\n\ndef load_network_from_checkpoint(checkpoint, model_json, input_shape=None):\n    \"\"\"Function to read the weights from checkpoint based on json description.\n\n    Args:\n      checkpoint: tensorflow checkpoint with trained model to\n        verify\n      model_json: path of json file with model description of\n        the network list of dictionary items for each layer\n        containing 'type', 'weight_var', 'bias_var' and\n        'is_transpose' 'type'is one of {'ff', 'ff_relu' or\n        'conv'}; 'weight_var' is the name of tf variable for\n        weights of layer i; 'bias_var' is the name of tf\n        variable for bias of layer i; 'is_transpose' is set to\n        True if the weights have to be transposed as per\n        convention Note that last layer is always feedforward\n      net_weights: list of numpy matrices of weights of each layer\n        convention: x[i+1] = W[i] x[i]\n      net_biases: list of numpy arrays of biases of each layer\n      net_layer_types: type of each layer ['ff' or 'ff_relu' or 'ff_conv'\n        or 'ff_conv_relu']\n        'ff': Simple feedforward layer with no activations\n        'ff_relu': Simple feedforward layer with ReLU activations\n        'ff_conv': Convolution layer with no activation\n        'ff_conv_relu': Convolution layer with ReLU activation\n\n    Raises:\n      ValueError: If layer_types are invalid or variable names\n        not found in checkpoint\n    \"\"\"\n    # Load checkpoint\n    reader = tf.train.load_checkpoint(checkpoint)\n    variable_map = reader.get_variable_to_shape_map()\n    checkpoint_variable_names = variable_map.keys()\n    # Parse JSON file for names\n    with tf.gfile.Open(model_json) as f:\n        list_model_var = json.load(f)\n\n    net_layer_types = []\n    net_weights = []\n    net_biases = []\n    cnn_params = []\n\n    # Checking validity of the input and adding to list\n    for layer_model_var in list_model_var:\n        if layer_model_var[\"type\"] not in {\"ff\", \"ff_relu\", \"conv\"}:\n            raise ValueError(\"Invalid layer type in description\")\n        if (\n            layer_model_var[\"weight_var\"] not in checkpoint_variable_names\n            or layer_model_var[\"bias_var\"] not in checkpoint_variable_names\n        ):\n            raise ValueError(\"Variable names not found in checkpoint\")\n        net_layer_types.append(layer_model_var[\"type\"])\n        layer_weight = reader.get_tensor(layer_model_var[\"weight_var\"])\n        layer_bias = reader.get_tensor(layer_model_var[\"bias_var\"])\n        # TODO(aditirag): is there a way to automatically check when to transpose\n        # We want weights W such that x^{i+1} = W^i x^i + b^i\n        # Can think of a hack involving matching shapes but if shapes are equal\n        # it can be ambiguous\n        if layer_model_var[\"type\"] in {\"ff\", \"ff_relu\"}:\n            layer_weight = np.transpose(layer_weight)\n            cnn_params.append(None)\n        if layer_model_var[\"type\"] in {\"conv\"}:\n            if \"stride\" not in layer_model_var or \"padding\" not in layer_model_var:\n                raise ValueError(\"Please define stride and padding for conv layers.\")\n            cnn_params.append(\n                {\n                    \"stride\": layer_model_var[\"stride\"],\n                    \"padding\": layer_model_var[\"padding\"],\n                }\n            )\n        net_weights.append(layer_weight)\n        net_biases.append(np.reshape(layer_bias, (np.size(layer_bias), 1)))\n    return NeuralNetwork(\n        net_weights, net_biases, net_layer_types, input_shape, cnn_params\n    )\n"
  },
  {
    "path": "cleverhans/experimental/certification/optimization.py",
    "content": "\"\"\"Code for setting up the optimization problem for certification.\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport json\nimport os\nimport numpy as np\n\nfrom scipy.sparse.linalg import eigs, LinearOperator\nimport tensorflow as tf\nfrom tensorflow.contrib import autograph\nfrom cleverhans.experimental.certification import utils\n\nUPDATE_PARAM_CONSTANT = -0.1\n# Tolerance value for eigenvalue computation\nTOL = 1e-5\n\n\nclass Optimization(object):\n    \"\"\"Class that sets up and runs the optimization of dual_formulation\"\"\"\n\n    def __init__(self, dual_formulation_object, sess, optimization_params):\n        \"\"\"Initialize the class variables.\n\n        Args:\n          dual_formulation_object: Instance of DualFormulation that contains the\n            dual variables and objective\n          sess: tf session to be used to run\n          optimization_params: Dictionary with the following\n            eig_num_iter - Number of iterations to run for computing minimum eigen\n              value\n            eig_learning_rate - Learning rate for minimum eigen value iterations\n            init_smooth - Starting value of the smoothness parameter (typically\n            around 0.001)\n            smooth_decay - The factor by which to decay after every outer loop epoch\n            optimizer - one of gd, adam, momentum or adagrad\n            eig_type - The method to compute eigenvalues (TF or SCIPY)\n        \"\"\"\n        self.sess = sess\n        self.dual_object = dual_formulation_object\n        self.params = optimization_params\n        self.penalty_placeholder = tf.placeholder(tf.float32, shape=[])\n\n        # The dimensionality of matrix M is the sum of sizes of all layers + 1\n        # The + 1 comes due to a row and column of M representing the linear terms\n        self.eig_init_vec_placeholder = tf.placeholder(\n            tf.float32, shape=[1 + self.dual_object.dual_index[-1], 1]\n        )\n        self.smooth_placeholder = tf.placeholder(tf.float32, shape=[])\n        self.eig_num_iter_placeholder = tf.placeholder(tf.int32, shape=[])\n        self.current_eig_val_estimate = None\n\n        # Create graph for optimization\n        self.prepare_for_optimization()\n\n    def tf_min_eig_vec(self):\n        \"\"\"Function for min eigen vector using tf's full eigen decomposition.\"\"\"\n        # Full eigen decomposition requires the explicit psd matrix M\n        _, matrix_m = self.dual_object.get_full_psd_matrix()\n        [eig_vals, eig_vectors] = tf.self_adjoint_eig(matrix_m)\n        index = tf.argmin(eig_vals)\n        return tf.reshape(eig_vectors[:, index], shape=[eig_vectors.shape[0].value, 1])\n\n    def tf_smooth_eig_vec(self):\n        \"\"\"Function that returns smoothed version of min eigen vector.\"\"\"\n        _, matrix_m = self.dual_object.get_full_psd_matrix()\n        # Easier to think in terms of max so negating the matrix\n        [eig_vals, eig_vectors] = tf.self_adjoint_eig(-matrix_m)\n        exp_eig_vals = tf.exp(tf.divide(eig_vals, self.smooth_placeholder))\n        scaling_factor = tf.reduce_sum(exp_eig_vals)\n        # Multiplying each eig vector by exponential of corresponding eig value\n        # Scaling factor normalizes the vector to be unit norm\n        eig_vec_smooth = tf.divide(\n            tf.matmul(eig_vectors, tf.diag(tf.sqrt(exp_eig_vals))),\n            tf.sqrt(scaling_factor),\n        )\n        return tf.reshape(\n            tf.reduce_sum(eig_vec_smooth, axis=1),\n            shape=[eig_vec_smooth.shape[0].value, 1],\n        )\n\n    def get_min_eig_vec_proxy(self, use_tf_eig=False):\n        \"\"\"Computes the min eigen value and corresponding vector of matrix M.\n\n        Args:\n          use_tf_eig: Whether to use tf's default full eigen decomposition\n        Returns:\n          eig_vec: Minimum absolute eigen value\n          eig_val: Corresponding eigen vector\n        \"\"\"\n        if use_tf_eig:\n            # If smoothness parameter is too small, essentially no smoothing\n            # Just output the eigen vector corresponding to min\n            return tf.cond(\n                self.smooth_placeholder < 1e-8,\n                self.tf_min_eig_vec,\n                self.tf_smooth_eig_vec,\n            )\n\n        # Using autograph to automatically handle\n        # the control flow of minimum_eigen_vector\n        min_eigen_tf = autograph.to_graph(utils.minimum_eigen_vector)\n\n        def _vector_prod_fn(x):\n            return self.dual_object.get_psd_product(x)\n\n        estimated_eigen_vector = min_eigen_tf(\n            x=self.eig_init_vec_placeholder,\n            num_steps=self.eig_num_iter_placeholder,\n            learning_rate=self.params[\"eig_learning_rate\"],\n            vector_prod_fn=_vector_prod_fn,\n        )\n        return estimated_eigen_vector\n\n    def get_scipy_eig_vec(self):\n        \"\"\"Computes scipy estimate of min eigenvalue for matrix M.\n\n        Returns:\n          eig_vec: Minimum absolute eigen value\n          eig_val: Corresponding eigen vector\n        \"\"\"\n        if not self.params[\"has_conv\"]:\n            matrix_m = self.sess.run(self.dual_object.matrix_m)\n            min_eig_vec_val, estimated_eigen_vector = eigs(\n                matrix_m, k=1, which=\"SR\", tol=1e-4\n            )\n            min_eig_vec_val = np.reshape(np.real(min_eig_vec_val), [1, 1])\n            return np.reshape(estimated_eigen_vector, [-1, 1]), min_eig_vec_val\n        else:\n            dim = self.dual_object.matrix_m_dimension\n            input_vector = tf.placeholder(tf.float32, shape=(dim, 1))\n            output_vector = self.dual_object.get_psd_product(input_vector)\n\n            def np_vector_prod_fn(np_vector):\n                np_vector = np.reshape(np_vector, [-1, 1])\n                output_np_vector = self.sess.run(\n                    output_vector, feed_dict={input_vector: np_vector}\n                )\n                return output_np_vector\n\n            linear_operator = LinearOperator((dim, dim), matvec=np_vector_prod_fn)\n            # Performing shift invert scipy operation when eig val estimate is available\n            min_eig_vec_val, estimated_eigen_vector = eigs(\n                linear_operator, k=1, which=\"SR\", tol=1e-4\n            )\n            min_eig_vec_val = np.reshape(np.real(min_eig_vec_val), [1, 1])\n            return np.reshape(estimated_eigen_vector, [-1, 1]), min_eig_vec_val\n\n    def prepare_for_optimization(self):\n        \"\"\"Create tensorflow op for running one step of descent.\"\"\"\n        if self.params[\"eig_type\"] == \"TF\":\n            self.eig_vec_estimate = self.get_min_eig_vec_proxy()\n        elif self.params[\"eig_type\"] == \"LZS\":\n            self.eig_vec_estimate = self.dual_object.m_min_vec\n        else:\n            self.eig_vec_estimate = tf.placeholder(\n                tf.float32, shape=(self.dual_object.matrix_m_dimension, 1)\n            )\n        self.stopped_eig_vec_estimate = tf.stop_gradient(self.eig_vec_estimate)\n        # Eig value is v^\\top M v, where v is eigen vector\n        self.eig_val_estimate = tf.matmul(\n            tf.transpose(self.stopped_eig_vec_estimate),\n            self.dual_object.get_psd_product(self.stopped_eig_vec_estimate),\n        )\n        # Penalizing negative of min eigen value because we want min eig value\n        # to be positive\n        self.total_objective = (\n            self.dual_object.unconstrained_objective\n            + 0.5\n            * tf.square(\n                tf.maximum(-self.penalty_placeholder * self.eig_val_estimate, 0)\n            )\n        )\n        global_step = tf.Variable(0, trainable=False)\n        # Set up learning rate as a placeholder\n        self.learning_rate = tf.placeholder(tf.float32, shape=[])\n\n        # Set up the optimizer\n        if self.params[\"optimizer\"] == \"adam\":\n            self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)\n        elif self.params[\"optimizer\"] == \"adagrad\":\n            self.optimizer = tf.train.AdagradOptimizer(learning_rate=self.learning_rate)\n        elif self.params[\"optimizer\"] == \"momentum\":\n            self.optimizer = tf.train.MomentumOptimizer(\n                learning_rate=self.learning_rate,\n                momentum=self.params[\"momentum_parameter\"],\n                use_nesterov=True,\n            )\n        else:\n            self.optimizer = tf.train.GradientDescentOptimizer(\n                learning_rate=self.learning_rate\n            )\n\n        # Write out the projection step\n        self.train_step = self.optimizer.minimize(\n            self.total_objective, global_step=global_step\n        )\n\n        self.sess.run(tf.global_variables_initializer())\n\n        # Projecting the dual variables\n        proj_ops = []\n        for i in range(self.dual_object.nn_params.num_hidden_layers + 1):\n            # Lambda_pos is non negative for switch indices,\n            # Unconstrained for positive indices\n            # Zero for negative indices\n            proj_ops.append(\n                self.dual_object.lambda_pos[i].assign(\n                    tf.multiply(\n                        self.dual_object.positive_indices[i],\n                        self.dual_object.lambda_pos[i],\n                    )\n                    + tf.multiply(\n                        self.dual_object.switch_indices[i],\n                        tf.nn.relu(self.dual_object.lambda_pos[i]),\n                    )\n                )\n            )\n            proj_ops.append(\n                self.dual_object.lambda_neg[i].assign(\n                    tf.multiply(\n                        self.dual_object.negative_indices[i],\n                        self.dual_object.lambda_neg[i],\n                    )\n                    + tf.multiply(\n                        self.dual_object.switch_indices[i],\n                        tf.nn.relu(self.dual_object.lambda_neg[i]),\n                    )\n                )\n            )\n            # Lambda_quad is only non zero and positive for switch\n            proj_ops.append(\n                self.dual_object.lambda_quad[i].assign(\n                    tf.multiply(\n                        self.dual_object.switch_indices[i],\n                        tf.nn.relu(self.dual_object.lambda_quad[i]),\n                    )\n                )\n            )\n            # Lambda_lu is always non negative\n            proj_ops.append(\n                self.dual_object.lambda_lu[i].assign(\n                    tf.nn.relu(self.dual_object.lambda_lu[i])\n                )\n            )\n\n        self.proj_step = tf.group(proj_ops)\n\n        # Create folder for saving stats if the folder is not None\n        if self.params.get(\"stats_folder\") and not tf.gfile.IsDirectory(\n            self.params[\"stats_folder\"]\n        ):\n            tf.gfile.MkDir(self.params[\"stats_folder\"])\n\n    def run_one_step(\n        self,\n        eig_init_vec_val,\n        eig_num_iter_val,\n        smooth_val,\n        penalty_val,\n        learning_rate_val,\n    ):\n        \"\"\"Run one step of gradient descent for optimization.\n\n        Args:\n          eig_init_vec_val: Start value for eigen value computations\n          eig_num_iter_val: Number of iterations to run for eigen computations\n          smooth_val: Value of smoothness parameter\n          penalty_val: Value of penalty for the current step\n          learning_rate_val: Value of learning rate\n        Returns:\n         found_cert: True is negative certificate is found, False otherwise\n        \"\"\"\n        # Running step\n        step_feed_dict = {\n            self.eig_init_vec_placeholder: eig_init_vec_val,\n            self.eig_num_iter_placeholder: eig_num_iter_val,\n            self.smooth_placeholder: smooth_val,\n            self.penalty_placeholder: penalty_val,\n            self.learning_rate: learning_rate_val,\n        }\n\n        if self.params[\"eig_type\"] == \"SCIPY\":\n            current_eig_vector, self.current_eig_val_estimate = self.get_scipy_eig_vec()\n            step_feed_dict.update({self.eig_vec_estimate: current_eig_vector})\n        elif self.params[\"eig_type\"] == \"LZS\":\n            step_feed_dict.update(\n                {self.dual_object.m_min_vec_ph: self.dual_object.m_min_vec_estimate}\n            )\n\n        self.sess.run(self.train_step, feed_dict=step_feed_dict)\n\n        [\n            _,\n            self.dual_object.m_min_vec_estimate,\n            self.current_eig_val_estimate,\n        ] = self.sess.run(\n            [self.proj_step, self.eig_vec_estimate, self.eig_val_estimate],\n            feed_dict=step_feed_dict,\n        )\n\n        if self.current_step % self.params[\"print_stats_steps\"] == 0:\n            [\n                self.current_total_objective,\n                self.current_unconstrained_objective,\n                self.dual_object.m_min_vec_estimate,\n                self.current_eig_val_estimate,\n                self.current_nu,\n            ] = self.sess.run(\n                [\n                    self.total_objective,\n                    self.dual_object.unconstrained_objective,\n                    self.eig_vec_estimate,\n                    self.eig_val_estimate,\n                    self.dual_object.nu,\n                ],\n                feed_dict=step_feed_dict,\n            )\n\n            stats = {\n                \"total_objective\": float(self.current_total_objective),\n                \"unconstrained_objective\": float(self.current_unconstrained_objective),\n                \"min_eig_val_estimate\": float(self.current_eig_val_estimate),\n            }\n            tf.logging.info(\n                \"Current inner step: %d, optimization stats: %s\",\n                self.current_step,\n                stats,\n            )\n            if self.params[\"stats_folder\"] is not None:\n                stats = json.dumps(stats)\n                filename = os.path.join(\n                    self.params[\"stats_folder\"], str(self.current_step) + \".json\"\n                )\n                with tf.gfile.Open(filename) as file_f:\n                    file_f.write(stats)\n\n        # Project onto feasible set of dual variables\n        if (\n            self.current_step % self.params[\"projection_steps\"] == 0\n            and self.current_unconstrained_objective < 0\n        ):\n            nu = self.sess.run(self.dual_object.nu)\n            dual_feed_dict = {\n                self.dual_object.h_min_vec_ph: self.dual_object.h_min_vec_estimate\n            }\n            _, min_eig_val_h_lz = self.dual_object.get_lanczos_eig(\n                compute_m=False, feed_dict=dual_feed_dict\n            )\n            projected_dual_feed_dict = {\n                self.dual_object.projected_dual.nu: nu,\n                self.dual_object.projected_dual.min_eig_val_h: min_eig_val_h_lz,\n            }\n            if self.dual_object.projected_dual.compute_certificate(\n                self.current_step, projected_dual_feed_dict\n            ):\n                return True\n\n        return False\n\n    def run_optimization(self):\n        \"\"\"Run the optimization, call run_one_step with suitable placeholders.\n\n        Returns:\n          True if certificate is found\n          False otherwise\n        \"\"\"\n        penalty_val = self.params[\"init_penalty\"]\n        # Don't use smoothing initially - very inaccurate for large dimension\n        self.smooth_on = False\n        smooth_val = 0\n        learning_rate_val = self.params[\"init_learning_rate\"]\n        self.current_outer_step = 1\n\n        while self.current_outer_step <= self.params[\"outer_num_steps\"]:\n            tf.logging.info(\n                \"Running outer step %d with penalty %f\",\n                self.current_outer_step,\n                penalty_val,\n            )\n            # Running inner loop of optimization with current_smooth_val,\n            # current_penalty as smoothness parameters and penalty respectively\n            self.current_step = 0\n            # Run first step with random eig initialization and large number of steps\n            found_cert = self.run_one_step(\n                self.dual_object.m_min_vec_estimate,\n                self.params[\"large_eig_num_steps\"],\n                smooth_val,\n                penalty_val,\n                learning_rate_val,\n            )\n            if found_cert:\n                return True\n            while self.current_step < self.params[\"inner_num_steps\"]:\n                self.current_step = self.current_step + 1\n                found_cert = self.run_one_step(\n                    self.dual_object.m_min_vec_estimate,\n                    self.params[\"small_eig_num_steps\"],\n                    smooth_val,\n                    penalty_val,\n                    learning_rate_val,\n                )\n                if found_cert:\n                    return True\n            # Update penalty only if it looks like current objective is optimizes\n            if self.current_total_objective < UPDATE_PARAM_CONSTANT:\n                penalty_val = penalty_val * self.params[\"beta\"]\n                learning_rate_val = (\n                    learning_rate_val * self.params[\"learning_rate_decay\"]\n                )\n            else:\n                # To get more accurate gradient estimate\n                self.params[\"small_eig_num_steps\"] = (\n                    1.5 * self.params[\"small_eig_num_steps\"]\n                )\n\n            # If eigen values seem small enough, turn on smoothing\n            # useful only when performing full eigen decomposition\n            if np.abs(self.current_eig_val_estimate) < 0.01:\n                smooth_val = self.params[\"smoothness_parameter\"]\n            self.current_outer_step = self.current_outer_step + 1\n        return False\n"
  },
  {
    "path": "cleverhans/experimental/certification/tests/dual_formulation_test.py",
    "content": "\"\"\"Tests for cleverhans.experimental.certification.dual_formulation.\"\"\"\n# pylint: disable=missing-docstring\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport unittest\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.experimental.certification import dual_formulation\nfrom cleverhans.experimental.certification import nn\n\n\nclass DualFormulationTest(unittest.TestCase):\n    def test_init(self):\n        # Function to test initialization of dual formulation class.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n        three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32)\n        lambda_pos = [two_dim_tensor, three_dim_tensor]\n        lambda_neg = lambda_pos\n        lambda_quad = lambda_pos\n        lambda_lu = lambda_pos\n        nu = scalar\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        with tf.Session() as sess:\n            dual_formulation_object = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params1,\n                test_input,\n                true_class,\n                adv_class,\n                input_minval,\n                input_maxval,\n                epsilon,\n            )\n        self.assertIsNotNone(dual_formulation_object)\n\n    def test_set_differentiable_objective(self):\n        # Function to test the function that sets the differentiable objective.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n        three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32)\n        lambda_pos = [two_dim_tensor, three_dim_tensor]\n        lambda_neg = lambda_pos\n        lambda_quad = lambda_pos\n        lambda_lu = lambda_pos\n        nu = scalar\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        with tf.Session() as sess:\n            dual_formulation_object = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params1,\n                test_input,\n                true_class,\n                adv_class,\n                input_minval,\n                input_maxval,\n                epsilon,\n            )\n        dual_formulation_object.set_differentiable_objective()\n        self.assertEqual(dual_formulation_object.scalar_f.shape.as_list(), [1])\n        self.assertEqual(\n            dual_formulation_object.unconstrained_objective.shape.as_list(), [1, 1]\n        )\n        self.assertEqual(dual_formulation_object.vector_g.shape.as_list(), [5, 1])\n\n    def test_get_full_psd_matrix(self):\n        # Function to test product with PSD matrix.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n        three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32)\n        lambda_pos = [two_dim_tensor, three_dim_tensor]\n        lambda_neg = lambda_pos\n        lambda_quad = lambda_pos\n        lambda_lu = lambda_pos\n        nu = scalar\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        with tf.Session() as sess:\n            dual_formulation_object = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params1,\n                test_input,\n                true_class,\n                adv_class,\n                input_minval,\n                input_maxval,\n                epsilon,\n            )\n        matrix_h, matrix_m = dual_formulation_object.get_full_psd_matrix()\n        self.assertEqual(matrix_h.shape.as_list(), [5, 5])\n        self.assertEqual(matrix_m.shape.as_list(), [6, 6])\n\n    def test_get_psd_product(self):\n        # Function to test implicit product with PSD matrix.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n        three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32)\n        lambda_pos = [two_dim_tensor, three_dim_tensor]\n        lambda_neg = lambda_pos\n        lambda_quad = lambda_pos\n        lambda_lu = lambda_pos\n        nu = scalar\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        with tf.Session() as sess:\n            dual_formulation_object = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params1,\n                test_input,\n                true_class,\n                adv_class,\n                input_minval,\n                input_maxval,\n                epsilon,\n            )\n            _, matrix_m = dual_formulation_object.get_full_psd_matrix()\n\n            # Testing if the values match\n            six_dim_tensor = tf.random_uniform(shape=(6, 1), dtype=tf.float32)\n            implicit_product = dual_formulation_object.get_psd_product(six_dim_tensor)\n            explicit_product = tf.matmul(matrix_m, six_dim_tensor)\n            [implicit_product_value, explicit_product_value] = sess.run(\n                [implicit_product, explicit_product]\n            )\n            self.assertEqual(\n                np.shape(implicit_product_value), np.shape(explicit_product_value)\n            )\n            self.assertLess(\n                np.max(np.abs(implicit_product_value - explicit_product_value)), 1e-5\n            )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans/experimental/certification/tests/nn_test.py",
    "content": "\"\"\"Tests for cleverhans.experimental.certification.nn.\"\"\"\n# pylint: disable=missing-docstring\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport unittest\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.experimental.certification import nn\n\n\nclass NeuralNetworkTest(unittest.TestCase):\n    def test_init(self):\n        # Function to test initialization of NeuralNetParams object.\n        # Valid params\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [1, 1, 1]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        self.assertIsNotNone(nn_params1)\n        # Invalid params : list length\n        net_biases = [0]\n        with self.assertRaises(ValueError):\n            nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        # Invalid params: layer types\n        with self.assertRaises(ValueError):\n            net_layer_types = [\"ff_relu\", \"ff_relu\"]\n            nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n    def test_forward_pass(self):\n        # Function to test forward pass of nn_params.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [1, 1, 1]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        input_vector = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        output_vector = nn_params.forward_pass(input_vector, 0)\n        self.assertEqual(output_vector.shape.as_list(), [3, 1])\n        output_vector_2 = nn_params.forward_pass(input_vector, 0, is_abs=True)\n        self.assertEqual(output_vector_2.shape.as_list(), [3, 1])\n        input_vector_trans = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        output_vector_3 = nn_params.forward_pass(\n            input_vector_trans, 0, is_transpose=True\n        )\n        self.assertEqual(output_vector_3.shape.as_list(), [2, 1])\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans/experimental/certification/tests/optimization_test.py",
    "content": "\"\"\"Tests for cleverhans.experimental.certification.optimization.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.experimental.certification import dual_formulation\nfrom cleverhans.experimental.certification import nn\nfrom cleverhans.experimental.certification import optimization\n\n\nclass OptimizationTest(tf.test.TestCase):\n    # pylint: disable=missing-docstring\n\n    def prepare_dual_object(self):\n        # Function to prepare dual object to be used for testing optimization.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n\n        # Creating dual variables to use for optimization\n        lambda_pos = [\n            tf.get_variable(\n                \"lambda_pos0\",\n                initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32),\n            ),\n            tf.get_variable(\n                \"lambda_pos1\",\n                initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32),\n            ),\n        ]\n        lambda_neg = [\n            tf.get_variable(\n                \"lambda_neg0\",\n                initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32),\n            ),\n            tf.get_variable(\n                \"lambda_neg1\",\n                initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32),\n            ),\n        ]\n        lambda_quad = [\n            tf.get_variable(\n                \"lambda_quad0\",\n                initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32),\n            ),\n            tf.get_variable(\n                \"lambda_quad1\",\n                initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32),\n            ),\n        ]\n        lambda_lu = [\n            tf.get_variable(\n                \"lambda_lu0\",\n                initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32),\n            ),\n            tf.get_variable(\n                \"lambda_lu1\",\n                initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32),\n            ),\n        ]\n        nu = tf.reshape(\n            tf.get_variable(\"nu\", initializer=200.0, dtype=tf.float32), shape=(1, 1)\n        )\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        sess = tf.Session()\n        dual_formulation_object = dual_formulation.DualFormulation(\n            sess,\n            dual_var,\n            nn_params1,\n            test_input,\n            true_class,\n            adv_class,\n            input_minval,\n            input_maxval,\n            epsilon,\n        )\n        return sess, dual_formulation_object\n\n    def test_init(self):\n        \"\"\" Function to test initialization of OptimizationTest. \"\"\"\n        sess, dual_formulation_object = self.prepare_dual_object()\n        dual_formulation_object.set_differentiable_objective()\n        sess.run(tf.global_variables_initializer())\n        optimization_params = {\n            \"init_learning_rate\": 0.1,\n            \"learning_rate_decay\": 0.9,\n            \"eig_num_iter\": 10,\n            \"eig_learning_rate\": 0.01,\n            \"init_smooth\": 0.5,\n            \"smooth_decay\": 0.9,\n            \"inner_num_steps\": 10,\n            \"optimizer\": \"adam\",\n            \"momentum_parameter\": 0.9,\n            \"eig_type\": \"TF\",\n        }\n        optimization_object = optimization.Optimization(\n            dual_formulation_object, sess, optimization_params\n        )\n        self.assertIsNotNone(optimization_object)\n\n    def test_get_min_eig_vec_proxy(self):\n        \"\"\" Function test computing min eigen value using matrix vector products.\"\"\"\n        sess, dual_formulation_object = self.prepare_dual_object()\n        _, matrix_m = dual_formulation_object.get_full_psd_matrix()\n        optimization_params = {\n            \"init_learning_rate\": 0.1,\n            \"learning_rate_decay\": 0.9,\n            \"eig_num_iter\": 2000,\n            \"eig_learning_rate\": 0.01,\n            \"init_smooth\": 0.0,\n            \"smooth_decay\": 0.9,\n            \"inner_num_steps\": 10,\n            \"optimizer\": \"adam\",\n            \"momentum_parameter\": 0.9,\n            \"eig_type\": \"TF\",\n        }\n        sess.run(tf.global_variables_initializer())\n        optimization_object = optimization.Optimization(\n            dual_formulation_object, sess, optimization_params\n        )\n        eig_vec = optimization_object.get_min_eig_vec_proxy()\n        tf_eig_vec = optimization_object.get_min_eig_vec_proxy(use_tf_eig=True)\n        self.assertIsNotNone(eig_vec)\n\n        # Running the graphs and checking that minimum eigen value is correct\n        # ** No smoothing\n        tf_eig_vec_val, eig_vec_val, matrix_m_val = sess.run(\n            [tf_eig_vec, eig_vec, matrix_m],\n            feed_dict={\n                optimization_object.eig_init_vec_placeholder: np.random.rand(6, 1),\n                optimization_object.eig_num_iter_placeholder: 2000,\n                optimization_object.smooth_placeholder: 0.0,\n            },\n        )\n\n        # Eigen value corresponding to v is v^\\top M v\n        eig_val = np.matmul(\n            np.transpose(eig_vec_val), np.matmul(matrix_m_val, eig_vec_val)\n        )\n        tf_eig_val = np.matmul(\n            np.transpose(tf_eig_vec_val), np.matmul(matrix_m_val, tf_eig_vec_val)\n        )\n        [np_eig_values, _] = np.linalg.eig(matrix_m_val)\n        self.assertLess(np.abs(np.min(np_eig_values) - eig_val), 1e-5)\n        self.assertLess(np.abs(np.min(np_eig_values) - tf_eig_val), 1e-5)\n\n        # Running the graphs and checking that minimum eigen value is correct\n        # **Smoothing\n        optimization_params[\"init_smooth\"] = 0.0001\n        optimization_object = optimization.Optimization(\n            dual_formulation_object, sess, optimization_params\n        )\n        eig_vec = optimization_object.get_min_eig_vec_proxy()\n        tf_eig_vec = optimization_object.get_min_eig_vec_proxy(use_tf_eig=True)\n\n        tf_eig_vec_val, eig_vec_val, matrix_m_val = sess.run(\n            [tf_eig_vec, eig_vec, matrix_m],\n            feed_dict={\n                optimization_object.eig_init_vec_placeholder: np.random.rand(6, 1),\n                optimization_object.smooth_placeholder: 0.1,\n                optimization_object.eig_num_iter_placeholder: 2000,\n            },\n        )\n\n        # Eigen value corresponding to v is v^\\top M v\n        eig_val = np.matmul(\n            np.transpose(eig_vec_val), np.matmul(matrix_m_val, eig_vec_val)\n        )\n        tf_eig_val = np.matmul(\n            np.transpose(tf_eig_vec_val), np.matmul(matrix_m_val, tf_eig_vec_val)\n        )\n        [np_eig_values, _] = np.linalg.eig(matrix_m_val)\n        self.assertLess(np.abs(np.min(np_eig_values) - eig_val), 1e-5)\n        # In general, smoothed version can be far off\n        self.assertLess(np.abs(np.min(np_eig_values) - tf_eig_val), 1e-1)\n\n    def test_optimization(self):\n        \"\"\"Function to test optimization.\"\"\"\n        sess, dual_formulation_object = self.prepare_dual_object()\n        optimization_params = {\n            \"init_penalty\": 10000,\n            \"large_eig_num_steps\": 1000,\n            \"small_eig_num_steps\": 500,\n            \"inner_num_steps\": 10,\n            \"outer_num_steps\": 2,\n            \"beta\": 2,\n            \"smoothness_parameter\": 0.001,\n            \"eig_learning_rate\": 0.01,\n            \"optimizer\": \"adam\",\n            \"init_learning_rate\": 0.1,\n            \"learning_rate_decay\": 0.9,\n            \"momentum_parameter\": 0.9,\n            \"print_stats_steps\": 1,\n            \"stats_folder\": None,\n            \"projection_steps\": 200,\n            \"eig_type\": \"TF\",\n        }\n        sess.run(tf.global_variables_initializer())\n        optimization_object = optimization.Optimization(\n            dual_formulation_object, sess, optimization_params\n        )\n        is_cert_found = optimization_object.run_optimization()\n        self.assertFalse(is_cert_found)\n\n\nif __name__ == \"__main__\":\n    tf.test.main()\n"
  },
  {
    "path": "cleverhans/experimental/certification/tests/utils_test.py",
    "content": "\"\"\"Tests for cleverhans.experimental.certification.utils.\"\"\"\n# pylint: disable=missing-docstring\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\nfrom scipy.sparse.linalg import eigs\nimport tensorflow as tf\nfrom tensorflow.contrib import autograph\n\nfrom cleverhans.experimental.certification import utils\n\nMATRIX_DIMENTION = 100\nNUM_LZS_ITERATIONS = 100\nNUM_RANDOM_MATRICES = 10\n\n\nclass UtilsTest(tf.test.TestCase):\n    def test_minimum_eigen_vector(self):\n        matrix = np.array([[1.0, 2.0], [2.0, 5.0]], dtype=np.float32)\n        initial_vec = np.array([[1.0], [-1.0]], dtype=np.float32)\n\n        def _vector_prod_fn(x):\n            return tf.matmul(matrix, x)\n\n        min_eigen_fn = autograph.to_graph(utils.minimum_eigen_vector)\n        x = tf.placeholder(tf.float32, shape=(2, 1))\n        min_eig_vec = min_eigen_fn(x, 10, 0.1, _vector_prod_fn)\n        with self.test_session() as sess:\n            v = sess.run(min_eig_vec, feed_dict={x: initial_vec})\n            if v.flatten()[0] < 0:\n                v = -v\n        np.testing.assert_almost_equal(v, [[0.9239], [-0.3827]], decimal=4)\n\n    def test_tf_lanczos_smallest_eigval(self):\n        tf_num_iter = tf.placeholder(dtype=tf.int32, shape=())\n        tf_matrix = tf.placeholder(dtype=tf.float32)\n\n        def _vector_prod_fn(x):\n            return tf.matmul(tf_matrix, tf.reshape(x, [-1, 1]))\n\n        min_eigen_fn = autograph.to_graph(utils.tf_lanczos_smallest_eigval)\n        init_vec_ph = tf.placeholder(shape=(MATRIX_DIMENTION, 1), dtype=tf.float32)\n        tf_eigval, tf_eigvec = min_eigen_fn(\n            _vector_prod_fn,\n            MATRIX_DIMENTION,\n            init_vec_ph,\n            tf_num_iter,\n            dtype=tf.float32,\n        )\n        eigvec = np.zeros((MATRIX_DIMENTION, 1), dtype=np.float32)\n\n        with self.test_session() as sess:\n            # run this test for a few random matrices\n            for _ in range(NUM_RANDOM_MATRICES):\n                matrix = np.random.random((MATRIX_DIMENTION, MATRIX_DIMENTION))\n                matrix = matrix + matrix.T  # symmetrizing matrix\n                eigval, eigvec = sess.run(\n                    [tf_eigval, tf_eigvec],\n                    feed_dict={\n                        tf_num_iter: NUM_LZS_ITERATIONS,\n                        tf_matrix: matrix,\n                        init_vec_ph: eigvec,\n                    },\n                )\n\n                scipy_min_eigval, scipy_min_eigvec = eigs(matrix, k=1, which=\"SR\")\n                scipy_min_eigval = np.real(scipy_min_eigval)\n                scipy_min_eigvec = np.real(scipy_min_eigvec)\n                scipy_min_eigvec = scipy_min_eigvec / np.linalg.norm(scipy_min_eigvec)\n\n                np.testing.assert_almost_equal(eigval, scipy_min_eigval, decimal=3)\n                np.testing.assert_almost_equal(np.linalg.norm(eigvec), 1.0, decimal=3)\n                abs_dot_prod = abs(np.dot(eigvec.flatten(), scipy_min_eigvec.flatten()))\n                np.testing.assert_almost_equal(abs_dot_prod, 1.0, decimal=3)\n\n\nif __name__ == \"__main__\":\n    tf.test.main()\n"
  },
  {
    "path": "cleverhans/experimental/certification/utils.py",
    "content": "\"\"\"File containing some simple helper functions.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\nimport tensorflow as tf\n\n\ndef diag(diag_elements):\n    \"\"\"Function to create tensorflow diagonal matrix with input diagonal entries.\n\n    Args:\n      diag_elements: tensor with diagonal elements\n\n    Returns:\n      tf matrix with diagonal entries as diag_elements\n    \"\"\"\n    return tf.diag(tf.reshape(diag_elements, [-1]))\n\n\ndef initialize_dual(\n    neural_net_params_object,\n    init_dual_file=None,\n    random_init_variance=0.01,\n    init_nu=200.0,\n):\n    \"\"\"Function to initialize the dual variables of the class.\n\n    Args:\n      neural_net_params_object: Object with the neural net weights, biases\n        and types\n      init_dual_file: Path to file containing dual variables, if the path\n        is empty, perform random initialization\n        Expects numpy dictionary with\n        lambda_pos_0, lambda_pos_1, ..\n        lambda_neg_0, lambda_neg_1, ..\n        lambda_quad_0, lambda_quad_1, ..\n        lambda_lu_0, lambda_lu_1, ..\n        random_init_variance: variance for random initialization\n      init_nu: Value to initialize nu variable with\n\n    Returns:\n      dual_var: dual variables initialized appropriately.\n    \"\"\"\n    lambda_pos = []\n    lambda_neg = []\n    lambda_quad = []\n    lambda_lu = []\n\n    if init_dual_file is None:\n        for i in range(0, neural_net_params_object.num_hidden_layers + 1):\n            initializer = (\n                np.random.uniform(\n                    0, random_init_variance, size=(neural_net_params_object.sizes[i], 1)\n                )\n            ).astype(np.float32)\n            lambda_pos.append(\n                tf.get_variable(\n                    \"lambda_pos_\" + str(i), initializer=initializer, dtype=tf.float32\n                )\n            )\n            initializer = (\n                np.random.uniform(\n                    0, random_init_variance, size=(neural_net_params_object.sizes[i], 1)\n                )\n            ).astype(np.float32)\n            lambda_neg.append(\n                tf.get_variable(\n                    \"lambda_neg_\" + str(i), initializer=initializer, dtype=tf.float32\n                )\n            )\n            initializer = (\n                np.random.uniform(\n                    0, random_init_variance, size=(neural_net_params_object.sizes[i], 1)\n                )\n            ).astype(np.float32)\n            lambda_quad.append(\n                tf.get_variable(\n                    \"lambda_quad_\" + str(i), initializer=initializer, dtype=tf.float32\n                )\n            )\n            initializer = (\n                np.random.uniform(\n                    0, random_init_variance, size=(neural_net_params_object.sizes[i], 1)\n                )\n            ).astype(np.float32)\n            lambda_lu.append(\n                tf.get_variable(\n                    \"lambda_lu_\" + str(i), initializer=initializer, dtype=tf.float32\n                )\n            )\n        nu = tf.get_variable(\"nu\", initializer=init_nu)\n    else:\n        # Loading from file\n        dual_var_init_val = np.load(init_dual_file).item()\n        for i in range(0, neural_net_params_object.num_hidden_layers + 1):\n            lambda_pos.append(\n                tf.get_variable(\n                    \"lambda_pos_\" + str(i),\n                    initializer=dual_var_init_val[\"lambda_pos\"][i],\n                    dtype=tf.float32,\n                )\n            )\n            lambda_neg.append(\n                tf.get_variable(\n                    \"lambda_neg_\" + str(i),\n                    initializer=dual_var_init_val[\"lambda_neg\"][i],\n                    dtype=tf.float32,\n                )\n            )\n            lambda_quad.append(\n                tf.get_variable(\n                    \"lambda_quad_\" + str(i),\n                    initializer=dual_var_init_val[\"lambda_quad\"][i],\n                    dtype=tf.float32,\n                )\n            )\n            lambda_lu.append(\n                tf.get_variable(\n                    \"lambda_lu_\" + str(i),\n                    initializer=dual_var_init_val[\"lambda_lu\"][i],\n                    dtype=tf.float32,\n                )\n            )\n        nu = tf.get_variable(\"nu\", initializer=1.0 * dual_var_init_val[\"nu\"])\n    dual_var = {\n        \"lambda_pos\": lambda_pos,\n        \"lambda_neg\": lambda_neg,\n        \"lambda_quad\": lambda_quad,\n        \"lambda_lu\": lambda_lu,\n        \"nu\": nu,\n    }\n    return dual_var\n\n\ndef eig_one_step(current_vector, learning_rate, vector_prod_fn):\n    \"\"\"Function that performs one step of gd (variant) for min eigen value.\n\n    Args:\n      current_vector: current estimate of the eigen vector with minimum eigen\n        value.\n      learning_rate: learning rate.\n      vector_prod_fn: function which returns product H*x, where H is a matrix for\n        which we computing eigenvector.\n\n    Returns:\n      updated vector after one step\n    \"\"\"\n    grad = 2 * vector_prod_fn(current_vector)\n    # Current objective = (1/2)*v^T (2*M*v); v = current_vector\n    # grad = 2*M*v\n    current_objective = tf.reshape(\n        tf.matmul(tf.transpose(current_vector), grad) / 2.0, shape=()\n    )\n\n    # Project the gradient into the tangent space of the constraint region.\n    # This way we do not waste time taking steps that try to change the\n    # norm of current_vector\n    grad = grad - current_vector * tf.matmul(tf.transpose(current_vector), grad)\n    grad_norm = tf.norm(grad)\n    grad_norm_sq = tf.square(grad_norm)\n\n    # Computing normalized gradient of unit norm\n    norm_grad = grad / grad_norm\n\n    # Computing directional second derivative (dsd)\n    # dsd = 2*g^T M g, where g is normalized gradient\n    directional_second_derivative = tf.reshape(\n        2 * tf.matmul(tf.transpose(norm_grad), vector_prod_fn(norm_grad)), shape=()\n    )\n\n    # Computing grad^\\top M grad [useful to compute step size later]\n    # Just a rescaling of the directional_second_derivative (which uses\n    # normalized gradient\n    grad_m_grad = directional_second_derivative * grad_norm_sq / 2\n\n    # Directional_second_derivative/2 = objective when vector is norm_grad\n    # If this is smaller than current objective, simply return that\n    if directional_second_derivative / 2.0 < current_objective:\n        return norm_grad\n\n    # If curvature is positive, jump to the bottom of the bowl\n    if directional_second_derivative > 0.0:\n        step = -1.0 * grad_norm / directional_second_derivative\n    else:\n        # If the gradient is very small, do not move\n        if grad_norm_sq <= 1e-16:\n            step = 0.0\n        else:\n            # Make a heuristic guess of the step size\n            step = -2.0 * tf.reduce_sum(current_vector * grad) / grad_norm_sq\n            # Computing gain using the gradient and second derivative\n            gain = -(\n                2 * tf.reduce_sum(current_vector * grad) + (step * step) * grad_m_grad\n            )\n\n            # Fall back to pre-determined learning rate if no gain\n            if gain < 0.0:\n                step = -learning_rate * grad_norm\n    current_vector = current_vector + step * norm_grad\n    return tf.nn.l2_normalize(current_vector)\n\n\ndef minimum_eigen_vector(x, num_steps, learning_rate, vector_prod_fn):\n    \"\"\"Computes eigenvector which corresponds to minimum eigenvalue.\n\n    Args:\n      x: initial value of eigenvector.\n      num_steps: number of optimization steps.\n      learning_rate: learning rate.\n      vector_prod_fn: function which takes x and returns product H*x.\n\n    Returns:\n      approximate value of eigenvector.\n\n    This function finds approximate value of eigenvector of matrix H which\n    corresponds to smallest (by absolute value) eigenvalue of H.\n    It works by solving optimization problem x^{T}*H*x -> min.\n    \"\"\"\n    x = tf.nn.l2_normalize(x)\n    for _ in range(num_steps):\n        x = eig_one_step(x, learning_rate, vector_prod_fn)\n    return x\n\n\ndef tf_lanczos_smallest_eigval(\n    vector_prod_fn,\n    matrix_dim,\n    initial_vector,\n    num_iter=1000,\n    max_iter=1000,\n    collapse_tol=1e-9,\n    dtype=tf.float32,\n):\n    \"\"\"Computes smallest eigenvector and eigenvalue using Lanczos in pure TF.\n\n    This function computes smallest eigenvector and eigenvalue of the matrix\n    which is implicitly specified by `vector_prod_fn`.\n    `vector_prod_fn` is a function which takes `x` and returns a product of matrix\n    in consideration and `x`.\n    Computation is done using Lanczos algorithm, see\n    https://en.wikipedia.org/wiki/Lanczos_algorithm#The_algorithm\n\n    Args:\n      vector_prod_fn: function which takes a vector as an input and returns\n        matrix vector product.\n      matrix_dim: dimentionality of the matrix.\n      initial_vector: guess vector to start the algorithm with\n      num_iter: user-defined number of iterations for the algorithm\n      max_iter: maximum number of iterations.\n      collapse_tol: tolerance to determine collapse of the Krylov subspace\n      dtype: type of data\n\n    Returns:\n      tuple of (eigenvalue, eigenvector) of smallest eigenvalue and corresponding\n      eigenvector.\n    \"\"\"\n\n    # alpha will store diagonal elements\n    alpha = tf.TensorArray(dtype, size=1, dynamic_size=True, element_shape=())\n    # beta will store off diagonal elements\n    beta = tf.TensorArray(dtype, size=0, dynamic_size=True, element_shape=())\n    # q will store Krylov space basis\n    q_vectors = tf.TensorArray(\n        dtype, size=1, dynamic_size=True, element_shape=(matrix_dim, 1)\n    )\n\n    # If start vector is all zeros, make it a random normal vector and run for max_iter\n    if tf.norm(initial_vector) < collapse_tol:\n        initial_vector = tf.random_normal(shape=(matrix_dim, 1), dtype=dtype)\n        num_iter = max_iter\n\n    w = initial_vector / tf.norm(initial_vector)\n\n    # Iteration 0 of Lanczos\n    q_vectors = q_vectors.write(0, w)\n    w_ = vector_prod_fn(w)\n    cur_alpha = tf.reduce_sum(w_ * w)\n    alpha = alpha.write(0, cur_alpha)\n    w_ = w_ - tf.scalar_mul(cur_alpha, w)\n    w_prev = w\n    w = w_\n\n    # Subsequent iterations of Lanczos\n    for i in tf.range(1, num_iter):\n        cur_beta = tf.norm(w)\n        if cur_beta < collapse_tol:\n            # return early if Krylov subspace collapsed\n            break\n\n        # cur_beta is larger than collapse_tol,\n        # so division will return finite result.\n        w = w / cur_beta\n\n        w_ = vector_prod_fn(w)\n        cur_alpha = tf.reduce_sum(w_ * w)\n\n        q_vectors = q_vectors.write(i, w)\n        alpha = alpha.write(i, cur_alpha)\n        beta = beta.write(i - 1, cur_beta)\n\n        w_ = w_ - tf.scalar_mul(cur_alpha, w) - tf.scalar_mul(cur_beta, w_prev)\n        w_prev = w\n        w = w_\n\n    alpha = alpha.stack()\n    beta = beta.stack()\n    q_vectors = tf.reshape(q_vectors.stack(), (-1, matrix_dim))\n\n    offdiag_submatrix = tf.linalg.diag(beta)\n    tridiag_matrix = (\n        tf.linalg.diag(alpha)\n        + tf.pad(offdiag_submatrix, [[0, 1], [1, 0]])\n        + tf.pad(offdiag_submatrix, [[1, 0], [0, 1]])\n    )\n\n    eigvals, eigvecs = tf.linalg.eigh(tridiag_matrix)\n\n    smallest_eigval = eigvals[0]\n    smallest_eigvec = tf.matmul(tf.reshape(eigvecs[:, 0], (1, -1)), q_vectors)\n    smallest_eigvec = smallest_eigvec / tf.norm(smallest_eigvec)\n    smallest_eigvec = tf.reshape(smallest_eigvec, (matrix_dim, 1))\n\n    return smallest_eigval, smallest_eigvec\n"
  },
  {
    "path": "cleverhans/generic/README.md",
    "content": "# Generic Code (framework independent)\n\nThis folder contains code that is framework independent (for example, it uses \nthe numpy library only or can handle support for all major deep learning \nlibraries).\n"
  },
  {
    "path": "cleverhans/generic/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans/jax/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans/jax/attacks/__init__.py",
    "content": "from cleverhans.jax.attacks.projected_gradient_descent import projected_gradient_descent\n"
  },
  {
    "path": "cleverhans/jax/attacks/fast_gradient_method.py",
    "content": "import jax.numpy as np\nfrom jax import grad, vmap\nfrom jax.nn import log_softmax as logsoftmax\n\nfrom cleverhans.jax.utils import one_hot\n\n\ndef fast_gradient_method(\n    model_fn, x, eps, norm, clip_min=None, clip_max=None, y=None, targeted=False\n):\n    \"\"\"\n    JAX implementation of the Fast Gradient Method.\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor.\n    :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572.\n    :param norm: Order of the norm (mimics NumPy). Possible values: np.inf or 2.\n    :param clip_min: (optional) float. Minimum float value for adversarial example components.\n    :param clip_max: (optional) float. Maximum float value for adversarial example components.\n    :param y: (optional) Tensor with one-hot true labels. If targeted is true, then provide the\n              target one-hot label. Otherwise, only provide this parameter if you'd like to use true\n              labels when crafting adversarial samples. Otherwise, model predictions are used\n              as labels to avoid the \"label leaking\" effect (explained in this paper:\n              https://arxiv.org/abs/1611.01236). Default is None. This argument does not have\n              to be a binary one-hot label (e.g., [0, 1, 0, 0]), it can be floating points values\n              that sum up to 1 (e.g., [0.05, 0.85, 0.05, 0.05]).\n    :param targeted: (optional) bool. Is the attack targeted or untargeted?\n              Untargeted, the default, will try to make the label incorrect.\n              Targeted will instead try to move in the direction of being more like y.\n    :return: a tensor for the adversarial example\n    \"\"\"\n    if norm not in [np.inf, 2]:\n        raise ValueError(\"Norm order must be either np.inf or 2.\")\n\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        x_labels = np.argmax(model_fn(x), 1)\n        y = one_hot(x_labels, 10)\n\n    def loss_adv(image, label):\n        pred = model_fn(image[None])\n        loss = -np.sum(logsoftmax(pred) * label)\n        if targeted:\n            loss = -loss\n        return loss\n\n    grads_fn = vmap(grad(loss_adv), in_axes=(0, 0), out_axes=0)\n    grads = grads_fn(x, y)\n\n    axis = list(range(1, len(grads.shape)))\n    avoid_zero_div = 1e-12\n    if norm == np.inf:\n        perturbation = eps * np.sign(grads)\n    elif norm == 1:\n        raise NotImplementedError(\"L_1 norm has not been implemented yet.\")\n    elif norm == 2:\n        square = np.maximum(\n            avoid_zero_div, np.sum(np.square(grads), axis=axis, keepdims=True)\n        )\n        perturbation = grads / np.sqrt(square)\n\n    adv_x = x + perturbation\n\n    # If clipping is needed, reset all values outside of [clip_min, clip_max]\n    if (clip_min is not None) or (clip_max is not None):\n        # We don't currently support one-sided clipping\n        assert clip_min is not None and clip_max is not None\n        adv_x = np.clip(adv_x, a_min=clip_min, a_max=clip_max)\n\n    return adv_x\n"
  },
  {
    "path": "cleverhans/jax/attacks/projected_gradient_descent.py",
    "content": "import jax.numpy as np\n\nfrom cleverhans.jax.attacks.fast_gradient_method import fast_gradient_method\nfrom cleverhans.jax.utils import clip_eta, one_hot\n\n\ndef projected_gradient_descent(\n    model_fn,\n    x,\n    eps,\n    eps_iter,\n    nb_iter,\n    norm,\n    clip_min=None,\n    clip_max=None,\n    y=None,\n    targeted=False,\n    rand_init=None,\n    rand_minmax=0.3,\n):\n    \"\"\"\n    This class implements either the Basic Iterative Method\n    (Kurakin et al. 2016) when rand_init is set to 0. or the\n    Madry et al. (2017) method when rand_minmax is larger than 0.\n    Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf\n    Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor.\n    :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572.\n    :param eps_iter: step size for each attack iteration\n    :param nb_iter: Number of attack iterations.\n    :param norm: Order of the norm (mimics NumPy). Possible values: np.inf or 2.\n    :param clip_min: (optional) float. Minimum float value for adversarial example components.\n    :param clip_max: (optional) float. Maximum float value for adversarial example components.\n    :param y: (optional) Tensor with true labels. If targeted is true, then provide the\n              target label. Otherwise, only provide this parameter if you'd like to use true\n              labels when crafting adversarial samples. Otherwise, model predictions are used\n              as labels to avoid the \"label leaking\" effect (explained in this paper:\n              https://arxiv.org/abs/1611.01236). Default is None.\n    :param targeted: (optional) bool. Is the attack targeted or untargeted?\n              Untargeted, the default, will try to make the label incorrect.\n              Targeted will instead try to move in the direction of being more like y.\n    :return: a tensor for the adversarial example\n    \"\"\"\n\n    assert eps_iter <= eps, (eps_iter, eps)\n    if norm == 1:\n        raise NotImplementedError(\n            \"It's not clear that FGM is a good inner loop\"\n            \" step for PGD when norm=1, because norm=1 FGM \"\n            \" changes only one pixel at a time. We need \"\n            \" to rigorously test a strong norm=1 PGD \"\n            \"before enabling this feature.\"\n        )\n    if norm not in [np.inf, 2]:\n        raise ValueError(\"Norm order must be either np.inf or 2.\")\n\n    # Initialize loop variables\n    if rand_init:\n        rand_minmax = eps\n        eta = np.random.uniform(x.shape, -rand_minmax, rand_minmax)\n    else:\n        eta = np.zeros_like(x)\n\n    # Clip eta\n    eta = clip_eta(eta, norm, eps)\n    adv_x = x + eta\n    if clip_min is not None or clip_max is not None:\n        adv_x = np.clip(adv_x, a_min=clip_min, a_max=clip_max)\n\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        x_labels = np.argmax(model_fn(x), 1)\n        y = one_hot(x_labels, 10)\n\n    for _ in range(nb_iter):\n        adv_x = fast_gradient_method(\n            model_fn,\n            adv_x,\n            eps_iter,\n            norm,\n            clip_min=clip_min,\n            clip_max=clip_max,\n            y=y,\n            targeted=targeted,\n        )\n\n        # Clipping perturbation eta to norm norm ball\n        eta = adv_x - x\n        eta = clip_eta(eta, norm, eps)\n        adv_x = x + eta\n\n        # Redo the clipping.\n        # FGM already did it, but subtracting and re-adding eta can add some\n        # small numerical error.\n        if clip_min is not None or clip_max is not None:\n            adv_x = np.clip(adv_x, a_min=clip_min, a_max=clip_max)\n\n    return adv_x\n"
  },
  {
    "path": "cleverhans/jax/utils.py",
    "content": "import jax.numpy as np\n\n\ndef one_hot(x, k, dtype=np.float32):\n    \"\"\"Create a one-hot encoding of x of size k.\"\"\"\n    return np.array(x[:, None] == np.arange(k), dtype)\n\n\ndef partial_flatten(x):\n    \"\"\"Flatten all but the first dimension of an ndarray.\"\"\"\n    return np.reshape(x, (x.shape[0], -1))\n\n\ndef clip_eta(eta, norm, eps):\n    \"\"\"\n    Helper function to clip the perturbation to epsilon norm ball.\n    :param eta: A tensor with the current perturbation.\n    :param norm: Order of the norm (mimics Numpy).\n                Possible values: np.inf or 2.\n    :param eps: Epsilon, bound of the perturbation.\n    \"\"\"\n\n    # Clipping perturbation eta to self.norm norm ball\n    if norm not in [np.inf, 2]:\n        raise ValueError(\"norm must be np.inf or 2.\")\n\n    axis = list(range(1, len(eta.shape)))\n    avoid_zero_div = 1e-12\n    if norm == np.inf:\n        eta = np.clip(eta, a_min=-eps, a_max=eps)\n    elif norm == 2:\n        # avoid_zero_div must go inside sqrt to avoid a divide by zero in the gradient through this operation\n        norm = np.sqrt(\n            np.maximum(avoid_zero_div, np.sum(np.square(eta), axis=axis, keepdims=True))\n        )\n        # We must *clip* to within the norm ball, not *normalize* onto the surface of the ball\n        factor = np.minimum(1.0, np.divide(eps, norm))\n        eta = eta * factor\n    return eta\n"
  },
  {
    "path": "cleverhans/plot/__init__.py",
    "content": "\"\"\"\nPlotting and visualization\n\"\"\"\n"
  },
  {
    "path": "cleverhans/plot/image.py",
    "content": "\"\"\"\nFunctionality for displaying or saving images.\n\"\"\"\nfrom tempfile import mkstemp\nimport os\nimport platform\n\nimport numpy as np\nfrom PIL import Image\n\nfrom cleverhans.utils import shell_call\n\n\ndef show(ndarray, min_val=None, max_val=None):\n    \"\"\"\n    Display an image.\n    :param ndarray: The image as an ndarray\n    :param min_val: The minimum pixel value in the image format\n    :param max_val: The maximum pixel valie in the image format\n      If min_val and max_val are not specified, attempts to\n      infer whether the image is in any of the common ranges:\n        [0, 1], [-1, 1], [0, 255]\n      This can be ambiguous, so it is better to specify if known.\n    \"\"\"\n\n    # Create a temporary file with the suffix '.png'.\n    fd, path = mkstemp(suffix=\".png\")\n    os.close(fd)\n    save(path, ndarray, min_val, max_val)\n    shell_call(VIEWER_COMMAND + [path])\n\n\ndef save(path, ndarray, min_val=None, max_val=None):\n    \"\"\"\n    Save an image, represented as an ndarray, to the filesystem\n    :param path: string, filepath\n    :param ndarray: The image as an ndarray\n    :param min_val: The minimum pixel value in the image format\n    :param max_val: The maximum pixel valie in the image format\n      If min_val and max_val are not specified, attempts to\n      infer whether the image is in any of the common ranges:\n        [0, 1], [-1, 1], [0, 255]\n      This can be ambiguous, so it is better to specify if known.\n    \"\"\"\n    as_pil(ndarray, min_val, max_val).save(path)\n\n\ndef as_pil(ndarray, min_val=None, max_val=None):\n    \"\"\"\n    Converts an ndarray to a PIL image.\n    :param ndarray: The numpy ndarray to convert\n    :param min_val: The minimum pixel value in the image format\n    :param max_val: The maximum pixel valie in the image format\n      If min_val and max_val are not specified, attempts to\n      infer whether the image is in any of the common ranges:\n        [0, 1], [-1, 1], [0, 255]\n      This can be ambiguous, so it is better to specify if known.\n    \"\"\"\n\n    assert isinstance(ndarray, np.ndarray)\n\n    # rows x cols for grayscale image\n    # rows x cols x channels for color\n    assert ndarray.ndim in [2, 3]\n    if ndarray.ndim == 3:\n        channels = ndarray.shape[2]\n        # grayscale or RGB\n        assert channels in [1, 3]\n\n    actual_min = ndarray.min()\n    actual_max = ndarray.max()\n\n    if min_val is not None:\n        assert actual_min >= min_val\n        assert actual_max <= max_val\n\n    if np.issubdtype(ndarray.dtype, np.floating):\n        if min_val is None:\n            if actual_min < -1.0:\n                raise ValueError(\"Unrecognized range\")\n            if actual_min < 0:\n                min_val = -1.0\n            else:\n                min_val = 0.0\n        if max_val is None:\n            if actual_max > 255.0:\n                raise ValueError(\"Unrecognized range\")\n            if actual_max > 1.0:\n                max_val = 255.0\n            else:\n                max_val = 1.0\n        ndarray = ndarray - min_val\n        value_range = max_val - min_val\n        ndarray *= 255.0 / value_range\n        ndarray = np.cast[\"uint8\"](ndarray)\n    elif \"int\" in str(ndarray.dtype):\n        if min_val is not None:\n            assert min_val == 0\n        else:\n            assert actual_min >= 0.0\n        if max_val is not None:\n            assert max_val == 255\n        else:\n            assert actual_max <= 255.0\n    else:\n        raise ValueError(\"Unrecognized dtype\")\n\n    out = Image.fromarray(ndarray)\n\n    return out\n\n\ndef make_grid(image_batch):\n    \"\"\"\n    Turns a batch of images into one big image.\n    :param image_batch: ndarray, shape (batch_size, rows, cols, channels)\n    :returns : a big image containing all `batch_size` images in a grid\n    \"\"\"\n    m, ir, ic, ch = image_batch.shape\n\n    pad = 3\n\n    padded = np.zeros((m, ir + pad * 2, ic + pad * 2, ch))\n    padded[:, pad:-pad, pad:-pad, :] = image_batch\n\n    m, ir, ic, ch = padded.shape\n\n    pr = int(np.sqrt(m))\n    pc = int(np.ceil(float(m) / pr))\n    extra_m = pr * pc\n    assert extra_m > m\n\n    padded = np.concatenate((padded, np.zeros((extra_m - m, ir, ic, ch))), axis=0)\n\n    row_content = np.split(padded, pr)\n    row_content = [np.split(content, pc) for content in row_content]\n    rows = [np.concatenate(content, axis=2) for content in row_content]\n    grid = np.concatenate(rows, axis=1)\n    assert grid.shape[0] == 1, grid.shape\n    grid = grid[0]\n\n    return grid\n\n\nif platform.system() == \"Darwin\":\n    VIEWER_COMMAND = [\"open\", \"-a\", \"Preview\"]\nelse:\n    VIEWER_COMMAND = [\"eog\", \"--new-instance\"]\n"
  },
  {
    "path": "cleverhans/plot/pyplot_defaults.py",
    "content": "\"\"\"Defaults for pyplot\n\nImport this file to set some default parameters for pyplot.\nThese are designed to make the plot look good in the context of a LaTeX\ndocument.\nIf you have installed the Computer Modern fonts\n( ftp://canopus.iacp.dvo.ru/pub/Font/cm_unicode/cm-unicode-0.6.3a-otf.tar.gz )\nthese defaults will use them, so that text in your pyplot figures will\nmatch text in the rest of your document.\nIf you do not have those fonts installed, pyplot commands will still work.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport matplotlib\nfrom matplotlib import pyplot\n\nmatplotlib.rcParams[\"text.latex.preamble\"] = r\"\\usepackage{bm}\"\nmatplotlib.rcParams[\"text.usetex\"] = True\npyplot.rcParams[\"pdf.fonttype\"] = 42\npyplot.rcParams[\"font.family\"] = \"serif\"\npyplot.rcParams[\"font.serif\"] = \"CMU Serif\"\npyplot.rcParams[\"font.size\"] = 8\n# Note: if you get an error, delete fontList.cache\n"
  },
  {
    "path": "cleverhans/plot/pyplot_image.py",
    "content": "\"\"\"\nFunctionality for showing images in pyplot.\nSee also cleverhans.plot.image for loading/saving image files, showing\nimages in 3rd party viewers, etc.\n\"\"\"\nimport numpy as np\nfrom six.moves import range\n\n\ndef pair_visual(original, adversarial, figure=None):\n    \"\"\"\n    This function displays two images: the original and the adversarial sample\n    :param original: the original input\n    :param adversarial: the input after perturbations have been applied\n    :param figure: if we've already displayed images, use the same plot\n    :return: the matplot figure to reuse for future samples\n    \"\"\"\n    import matplotlib.pyplot as plt\n\n    # Squeeze the image to remove single-dimensional entries from array shape\n    original = np.squeeze(original)\n    adversarial = np.squeeze(adversarial)\n\n    # Ensure our inputs are of proper shape\n    assert len(original.shape) == 2 or len(original.shape) == 3\n\n    # To avoid creating figures per input sample, reuse the sample plot\n    if figure is None:\n        plt.ion()\n        figure = plt.figure()\n        figure.canvas.set_window_title(\"Cleverhans: Pair Visualization\")\n\n    # Add the images to the plot\n    perturbations = adversarial - original\n    for index, image in enumerate((original, perturbations, adversarial)):\n        figure.add_subplot(1, 3, index + 1)\n        plt.axis(\"off\")\n\n        # If the image is 2D, then we have 1 color channel\n        if len(image.shape) == 2:\n            plt.imshow(image, cmap=\"gray\")\n        else:\n            plt.imshow(image)\n\n        # Give the plot some time to update\n        plt.pause(0.01)\n\n    # Draw the plot and return\n    plt.show()\n    return figure\n\n\ndef grid_visual(data):\n    \"\"\"\n    This function displays a grid of images to show full misclassification\n    :param data: grid data of the form;\n        [nb_classes : nb_classes : img_rows : img_cols : nb_channels]\n    :return: if necessary, the matplot figure to reuse\n    \"\"\"\n    import matplotlib.pyplot as plt\n\n    # Ensure interactive mode is disabled and initialize our graph\n    plt.ioff()\n    figure = plt.figure()\n    figure.canvas.set_window_title(\"Cleverhans: Grid Visualization\")\n\n    # Add the images to the plot\n    num_cols = data.shape[0]\n    num_rows = data.shape[1]\n    num_channels = data.shape[4]\n    for y in range(num_rows):\n        for x in range(num_cols):\n            figure.add_subplot(num_rows, num_cols, (x + 1) + (y * num_cols))\n            plt.axis(\"off\")\n\n            if num_channels == 1:\n                plt.imshow(data[x, y, :, :, 0], cmap=\"gray\")\n            else:\n                plt.imshow(data[x, y, :, :, :])\n\n    # Draw the plot and return\n    plt.show()\n    return figure\n\n\ndef get_logits_over_interval(\n    sess, model, x_data, fgsm_params, min_epsilon=-10.0, max_epsilon=10.0, num_points=21\n):\n    \"\"\"Get logits when the input is perturbed in an interval in adv direction.\n\n    Args:\n        sess: Tf session\n        model: Model for which we wish to get logits.\n        x_data: Numpy array corresponding to single data.\n                point of shape [height, width, channels].\n        fgsm_params: Parameters for generating adversarial examples.\n        min_epsilon: Minimum value of epsilon over the interval.\n        max_epsilon: Maximum value of epsilon over the interval.\n        num_points: Number of points used to interpolate.\n\n    Returns:\n        Numpy array containing logits.\n\n    Raises:\n        ValueError if min_epsilon is larger than max_epsilon.\n    \"\"\"\n    # Get the height, width and number of channels\n    height = x_data.shape[0]\n    width = x_data.shape[1]\n    channels = x_data.shape[2]\n\n    x_data = np.expand_dims(x_data, axis=0)\n    import tensorflow as tf\n    from cleverhans.attacks import FastGradientMethod\n\n    # Define the data placeholder\n    x = tf.placeholder(dtype=tf.float32, shape=[1, height, width, channels], name=\"x\")\n    # Define adv_x\n    fgsm = FastGradientMethod(model, sess=sess)\n    adv_x = fgsm.generate(x, **fgsm_params)\n\n    if min_epsilon > max_epsilon:\n        raise ValueError(\"Minimum epsilon is less than maximum epsilon\")\n\n    eta = tf.nn.l2_normalize(adv_x - x, dim=0)\n    epsilon = tf.reshape(\n        tf.lin_space(float(min_epsilon), float(max_epsilon), num_points),\n        (num_points, 1, 1, 1),\n    )\n    lin_batch = x + epsilon * eta\n    logits = model.get_logits(lin_batch)\n    with sess.as_default():\n        log_prob_adv_array = sess.run(logits, feed_dict={x: x_data})\n    return log_prob_adv_array\n\n\ndef linear_extrapolation_plot(\n    log_prob_adv_array, y, file_name, min_epsilon=-10, max_epsilon=10, num_points=21\n):\n    \"\"\"Generate linear extrapolation plot.\n\n    Args:\n        log_prob_adv_array: Numpy array containing log probabilities\n        y: Tf placeholder for the labels\n        file_name: Plot filename\n        min_epsilon: Minimum value of epsilon over the interval\n        max_epsilon: Maximum value of epsilon over the interval\n        num_points: Number of points used to interpolate\n    \"\"\"\n    import matplotlib\n\n    matplotlib.use(\"Agg\")\n    import matplotlib.pyplot as plt\n\n    figure = plt.figure()\n    figure.canvas.set_window_title(\"Cleverhans: Linear Extrapolation Plot\")\n\n    correct_idx = np.argmax(y, axis=0)\n    fig = plt.figure()\n    plt.xlabel(\"Epsilon\")\n    plt.ylabel(\"Logits\")\n    x_axis = np.linspace(min_epsilon, max_epsilon, num_points)\n    plt.xlim(min_epsilon - 1, max_epsilon + 1)\n    for i in range(y.shape[0]):\n        if i == correct_idx:\n            ls = \"-\"\n            linewidth = 5\n        else:\n            ls = \"--\"\n            linewidth = 2\n        plt.plot(\n            x_axis,\n            log_prob_adv_array[:, i],\n            ls=ls,\n            linewidth=linewidth,\n            label=\"{}\".format(i),\n        )\n    plt.legend(loc=\"best\", fontsize=14)\n    plt.show()\n    fig.savefig(file_name)\n    plt.clf()\n    return figure\n"
  },
  {
    "path": "cleverhans/plot/save_pdf.py",
    "content": "\"\"\"\nThe save_pdf function.\n\"\"\"\nfrom matplotlib.backends.backend_pdf import PdfPages\nfrom matplotlib import pyplot\n\n\ndef save_pdf(path):\n    \"\"\"\n    Saves a pdf of the current matplotlib figure.\n\n    :param path: str, filepath to save to\n    \"\"\"\n\n    pp = PdfPages(path)\n    pp.savefig(pyplot.gcf())\n    pp.close()\n"
  },
  {
    "path": "cleverhans/plot/success_fail.py",
    "content": "\"\"\"Functions for plotting succes-failure curves\n\nReference: https://openreview.net/forum?id=H1g0piA9tQ\n\"\"\"\nimport warnings\n\nimport numpy as np\nfrom matplotlib import pyplot\n\nfrom cleverhans.serial import load\nfrom cleverhans.utils import safe_zip\n\nLINEWIDTH = 2\nDEFAULT_SUCCESS_NAME = \"clean\"\n# This must be a tuple or it is not safe to use as a param default\nDEFAULT_FAIL_NAMES = (\"mc\", \"bundled\")\n\n\ndef plot_report_from_path(\n    path,\n    success_name=DEFAULT_SUCCESS_NAME,\n    fail_names=DEFAULT_FAIL_NAMES,\n    label=None,\n    is_max_confidence=True,\n    linewidth=LINEWIDTH,\n    plot_upper_bound=True,\n):\n    \"\"\"\n    Plots a success-fail curve from a confidence report stored on disk,\n    :param path: string filepath for the stored report.\n      (Should be the output of make_confidence_report*.py)\n    :param success_name: The name (confidence report key) of the data that\n      should be used to measure success rate\n    :param fail_names: A list of names (confidence report keys) of the data\n      that should be used to measure failure rate.\n      *Only one of these keys will be plotted*. Each key will be tried in\n      order until one is found in the report. This is to support both the\n      output of `make_confidence_report` and `make_confidence_report_bundled`.\n    :param label: Optional string. Name to use for this curve in the legend.\n    :param is_max_confidence: bool.\n      If True, when measuring the failure rate, treat the data as the output\n      of a maximum confidence attack procedure.\n      This means that the attack is optimal (assuming the underlying optimizer\n      is good enough, *which is probably false*, so interpret the plot\n      accordingly) for thresholds >= .5 but for lower thresholds the observed\n      failure rate is a lower bound on the true worst failure rate and the\n      observed coverage is an upper bound (assuming good enough optimization)\n      on the true failure rate.\n      The plot thus draws the threshold >= .5 portion of the curve with a solid\n      line and the upper and lower bounds with a dashed line.\n      See https://openreview.net/forum?id=H1g0piA9tQ for details.\n      If False, the attack procedure is regarded as an ad hoc way of obtaining\n      a loose lower bound, and thus the whole curve is drawn with dashed lines.\n    :param linewidth: thickness of the line to draw\n    :param plot_upper_bound: include upper bound on error rate in plot\n    \"\"\"\n    report = load(path)\n    plot_report(\n        report,\n        success_name,\n        fail_names,\n        label,\n        is_max_confidence,\n        linewidth,\n        plot_upper_bound,\n    )\n\n\ndef plot_report(\n    report,\n    success_name,\n    fail_names,\n    label=None,\n    is_max_confidence=True,\n    linewidth=LINEWIDTH,\n    plot_upper_bound=True,\n):\n    \"\"\"\n    Plot a success fail curve from a confidence report\n    :param report: A confidence report\n      (the type of object saved by make_confidence_report.py)\n    :param success_name: see plot_report_from_path\n    :param fail_names: see plot_report_from_path\n    :param label: see plot_report_from_path\n    :param is_max_confidence: see plot_report_from_path\n    :param linewidth: see plot_report_from_path\n    \"\"\"\n    (\n        fail_optimal,\n        success_optimal,\n        fail_lower_bound,\n        fail_upper_bound,\n        success_bounded,\n    ) = make_curve(report, success_name, fail_names)\n    assert len(fail_lower_bound) == len(fail_upper_bound)\n    fail_optimal = np.array(fail_optimal)\n    fail_lower_bound = np.array(fail_lower_bound)\n    fail_upper_bound = np.array(fail_upper_bound)\n\n    if is_max_confidence:\n        (p,) = pyplot.plot(\n            fail_optimal, success_optimal, label=label, linewidth=linewidth\n        )\n        color = p.get_color()\n        pyplot.plot(fail_lower_bound, success_bounded, \"--\", color=color)\n        if plot_upper_bound:\n            pyplot.plot(fail_upper_bound, success_bounded, \"--\", color=color)\n    else:\n        # If the attack was not MaxConfidence, then this whole curve is just\n        # a loose lower bound\n        all_fail = np.concatenate((fail_optimal, fail_lower_bound), axis=0)\n        pyplot.plot(\n            all_fail,\n            success_optimal + success_bounded,\n            \"--\",\n            label=label,\n            linewidth=linewidth,\n        )\n\n    pyplot.xlabel(\"Failure rate on adversarial examples\")\n    pyplot.ylabel(\"Success rate on clean examples\")\n    gap = fail_upper_bound - fail_lower_bound\n    if gap.size > 0:\n        assert gap.min() >= 0.0\n        print(\"Max gap: \", gap.max())\n\n\ndef make_curve(report, success_name, fail_names):\n    \"\"\"\n    Make a success-failure curve.\n    :param report: A confidence report\n      (the type of object saved by make_confidence_report.py)\n    :param success_name: see plot_report_from_path\n    :param fail_names: see plot_report_from_path\n    :returns:\n      fail_optimal: list of failure rates on adversarial data for the optimal\n        (t >= .5) part of the curve. Each entry corresponds to a different\n        threshold. Thresholds are chosen to make the smoothest possible curve\n        from the available data, e.g. one threshold between each unique\n        confidence value observed in the data. To make sure that linear\n        interpolation between points in the curve never overestimates the\n        failure rate for a specific success rate, the curve also includes\n        extra points that increment the failure rate prior to any point\n        that increments the success rate, so the curve moves up and to the\n        right in a series of backwards \"L\" shapes rather than moving up\n        and to the right along diagonal lines. For large datasets these\n        maximally pessimistic points will usually not be visible and the\n        curve will appear smooth.\n      success_optimal: list of success rates on clean data on the optimal\n        part of the curve. Matches up with `fail_optimal`.\n      fail_lower_bound: list of observed failure rates on the t < .5 portion\n        of the curve where MaxConfidence is not optimal.\n      fail_upper_bound: list of upper bounds (assuming good enough optimization,\n        so not a true upper bound) on the failure rates on the t < .5 portion\n        of the curve where MaxConfidence is not optimal. Matches up with\n        `fail_lower_bound`.\n      success_bounded: success rates on the non-optimal part of the curve.\n        Matches up with `fail_lower_bound` and `fail_upper_bound`.\n    \"\"\"\n    success_results = report[success_name]\n    fail_name = None  # pacify pylint\n    found = False\n    for fail_name in fail_names:\n        if fail_name in report:\n            found = True\n            break\n    if not found:\n        raise ValueError(\n            fail_name + \" not in report.\" \"Available keys: \" + str(report.keys())\n        )\n    fail_results = report[fail_name]\n\n    # \"good\" means drawn from the distribution where we measure success rate.\n    # \"bad\" means drawn from the distribution where we measure failure rate.\n    # From here on out we use those terms, to avoid confusion between examples\n    # that actually failed and examples that were drawn from the distribution\n    # where we measured failure rate.\n\n    old_all_probs_version = False\n    if isinstance(success_results, dict):\n        # This dictionary key lookup will trigger a deprecation warning if `success_results` is not the old dictionary\n        # style of report, so we don't want to do a dictionary lookup unless we really are using the old version.\n        old_all_probs_version = \"all_probs\" in success_results\n\n    if old_all_probs_version:\n        warnings.warn(\n            \"The 'all_probs' key is included only to support \"\n            \" old files from a private development codebase. \"\n            \"Support for this key can be dropped at any time \"\n            \" without warning.\"\n        )\n        good_probs = success_results[\"all_probs\"]\n        bad_probs = fail_results[\"all_probs\"]\n        bad_corrects = fail_results[\"correctness_mask\"]\n        good_corrects = success_results[\"correctness_mask\"]\n    else:\n        if isinstance(success_results, dict):\n            # Still using dict, but using newer key names\n            warnings.warn(\n                \"Support for dictionary confidence reports is deprecated. Switch to using the classes in \"\n                \"cleverhans.confidence_report. Support for old dictionary-style reports may be removed \"\n                \"on or after 2019-07-19.\"\n            )\n            good_probs = success_results[\"confidence\"]\n            bad_probs = fail_results[\"confidence\"]\n            good_corrects = success_results[\"correctness\"]\n            bad_corrects = fail_results[\"correctness\"]\n        else:\n            # current version\n            good_probs = success_results.confidence\n            bad_probs = fail_results.confidence\n            good_corrects = success_results.correctness\n            bad_corrects = fail_results.correctness\n    good_triplets = [\n        (prob, correct, True) for prob, correct in safe_zip(good_probs, good_corrects)\n    ]\n    bad_triplets = [\n        (prob, correct, False) for prob, correct in safe_zip(bad_probs, bad_corrects)\n    ]\n    total_good = len(good_triplets)\n    total_bad = len(bad_triplets)\n    if total_good != 10000:\n        warnings.warn(\n            \"Not using full test set? Found \"\n            + str(total_good)\n            + \" examples for measuring success rate\"\n        )\n    if total_bad != 10000:\n        warnings.warn(\"Not using full test set for adversarial examples?\")\n    all_triplets = good_triplets + bad_triplets\n    all_triplets = sorted(all_triplets, key=lambda x: -x[0])\n\n    # Start with the case for threshold t = 1.\n    # Examples are covered only if prob > t (strict inequality)\n    # So initially nothing is covered\n    good_covered_and_correct = 0\n    bad_covered_and_incorrect = 0\n\n    # Number of examples that are bad, incorrect, and covered by\n    # a t >= 0.5, or that were merely covered by a t < 0.5\n    failure_opportunities = 0\n\n    next_idx = 0\n\n    fail_optimal = []\n    success_optimal = []\n    fail_upper_bound = []\n    fail_lower_bound = []\n    success_bounded = []\n\n    bounded = False\n\n    # NOTE: the loop always exits via an internal break statement.\n    # Copied the termination condition to the while statement for ease\n    # of reading.\n    while next_idx < len(all_triplets):\n        gs = float(good_covered_and_correct) / total_good\n        bf = float(bad_covered_and_incorrect) / total_bad\n        # Add results for current threshold to the list\n        if not bounded:\n\n            # Sometimes when there are big jumps the failure rate it makes\n            # artifacts in the plot, where there's a long linear track.\n            # This implies the real success-fail curve is linear when\n            # actually it just isn't sampled by the data.\n            # To avoid implying that the model reaches a higher success\n            # rate than it actually does, we avoid these plotting artifacts\n            # by introducing extra points that make the graph move horizontally\n            # to the right first, then vertically.\n            if len(fail_optimal) > 0:\n                prev_bf = fail_optimal[-1]\n                prev_gs = success_optimal[-1]\n\n                if gs > prev_gs and bf > prev_bf:\n                    fail_optimal.append(bf)\n                    success_optimal.append(prev_gs)\n\n            success_optimal.append(gs)\n            fail_optimal.append(bf)\n        else:\n            success_bounded.append(gs)\n            fail_lower_bound.append(bf)\n            fail_upper_bound.append(float(failure_opportunities) / total_bad)\n\n        if next_idx == len(all_triplets):\n            break\n\n        # next_prob_to_include is not quite the same thing as the threshold.\n        # The threshold is infinitesimally smaller than this value.\n        next_prob_to_include = all_triplets[next_idx][0]\n\n        # Process all ties\n        while next_prob_to_include == all_triplets[next_idx][0]:\n            _prob, correct, is_good = all_triplets[next_idx]\n            if is_good:\n                good_covered_and_correct += correct\n            else:\n                if next_prob_to_include <= 0.5:\n                    failure_opportunities += 1\n                else:\n                    failure_opportunities += 1 - correct\n                bad_covered_and_incorrect += 1 - correct\n            next_idx += 1\n            if next_idx == len(all_triplets):\n                break\n\n        if next_prob_to_include <= 0.5:\n            bounded = True\n\n    out = (\n        fail_optimal,\n        success_optimal,\n        fail_lower_bound,\n        fail_upper_bound,\n        success_bounded,\n    )\n    return out\n"
  },
  {
    "path": "cleverhans/tf2/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans/tf2/attacks/__init__.py",
    "content": "\n"
  },
  {
    "path": "cleverhans/tf2/attacks/basic_iterative_method.py",
    "content": "\"\"\"\nThe BasicIterativeMethod attack.\n\"\"\"\n\nfrom cleverhans.tf2.attacks.projected_gradient_descent import projected_gradient_descent\n\n\ndef basic_iterative_method(\n    model_fn,\n    x,\n    eps,\n    eps_iter,\n    nb_iter,\n    norm,\n    clip_min=None,\n    clip_max=None,\n    y=None,\n    targeted=False,\n    rand_init=None,\n    rand_minmax=0.3,\n    sanity_checks=True,\n):\n    \"\"\"\n    The BasicIterativeMethod attack.\n    \"\"\"\n    return projected_gradient_descent(\n        model_fn,\n        x,\n        eps,\n        eps_iter,\n        nb_iter,\n        norm,\n        clip_min=clip_min,\n        clip_max=clip_max,\n        y=y,\n        targeted=targeted,\n        rand_init=False,\n        rand_minmax=rand_minmax,\n        sanity_checks=sanity_checks,\n    )\n"
  },
  {
    "path": "cleverhans/tf2/attacks/carlini_wagner_l2.py",
    "content": "\"\"\"The CarliniWagnerL2 attack.\n\"\"\"\nimport numpy as np\nimport tensorflow as tf\nfrom cleverhans.tf2.utils import get_or_guess_labels, set_with_mask\n\n\ndef carlini_wagner_l2(model_fn, x, **kwargs):\n    \"\"\"\n    This is the function interface for the Carlini-Wagner-L2 attack.\n    For more details on the attack and the parameters see the corresponding class.\n    \"\"\"\n    return CarliniWagnerL2(model_fn, **kwargs).attack(x)\n\n\nclass CarliniWagnerL2Exception(Exception):\n    pass\n\n\nclass CarliniWagnerL2(object):\n    def __init__(\n        self,\n        model_fn,\n        y=None,\n        targeted=False,\n        batch_size=128,\n        clip_min=0.0,\n        clip_max=1.0,\n        binary_search_steps=5,\n        max_iterations=1_000,\n        abort_early=True,\n        confidence=0.0,\n        initial_const=1e-2,\n        learning_rate=5e-3,\n    ):\n        \"\"\"\n        This attack was originally proposed by Carlini and Wagner. It is an\n        iterative attack that finds adversarial examples on many defenses that\n        are robust to other attacks.\n        Paper link: https://arxiv.org/abs/1608.04644\n        At a high level, this attack is an iterative attack using Adam and\n        a specially-chosen loss function to find adversarial examples with\n        lower distortion than other attacks. This comes at the cost of speed,\n        as this attack is often much slower than others.\n\n        :param model_fn: a callable that takes an input tensor and returns the model logits.\n        :param y: (optional) Tensor with target labels.\n        :param targeted: (optional) Targeted attack?\n        :param batch_size (optional): Number of attacks to run simultaneously.\n        :param clip_min: (optional) float. Minimum float values for adversarial example components.\n        :param clip_max: (optional) float. Maximum float value for adversarial example components.\n        :param binary_search_steps (optional): The number of times we perform binary\n                                search to find the optimal tradeoff-\n                                constant between norm of the purturbation\n                                and confidence of the classification.\n        :param max_iterations (optional): The maximum number of iterations. Setting this\n                               to a larger value will produce lower distortion\n                               results. Using only a few iterations requires\n                               a larger learning rate, and will produce larger\n                               distortion results.\n        :param abort_early (optional): If true, allows early aborts if gradient descent\n                        is unable to make progress (i.e., gets stuck in\n                        a local minimum).\n        :param confidence (optional): Confidence of adversarial examples: higher produces\n                           examples with larger l2 distortion, but more\n                           strongly classified as adversarial.\n        :param initial_const (optional): The initial tradeoff-constant used to tune the\n                          relative importance of the size of the perturbation\n                          and confidence of classification.\n                          If binary_search_steps is large, the initial\n                          constant is not important. A smaller value of\n                          this constant gives lower distortion results.\n        :param learning_rate (optional): The learning rate for the attack algorithm.\n                          Smaller values produce better results but are\n                          slower to converge.\n        \"\"\"\n        self.model_fn = model_fn\n\n        self.batch_size = batch_size\n\n        self.y = y\n        self.targeted = y is not None\n\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n\n        self.binary_search_steps = binary_search_steps\n        self.max_iterations = max_iterations\n        self.abort_early = abort_early\n        self.learning_rate = learning_rate\n\n        self.confidence = confidence\n        self.initial_const = initial_const\n\n        # the optimizer\n        self.optimizer = tf.keras.optimizers.Adam(self.learning_rate)\n\n        super(CarliniWagnerL2, self).__init__()\n\n    def attack(self, x):\n        \"\"\"\n        Returns adversarial examples for the tensor.\n        :param x: input tensor.\n        :return: a numpy tensor with the adversarial example.\n        \"\"\"\n        adv_ex = np.zeros_like(x)\n        for i in range(0, len(x), self.batch_size):\n            adv_ex[i : i + self.batch_size] = self._attack(\n                x[i : i + self.batch_size]\n            ).numpy()\n\n        return adv_ex\n\n    def _attack(self, x):\n        if self.clip_min is not None:\n            if not np.all(tf.math.greater_equal(x, self.clip_min)):\n                raise CarliniWagnerL2Exception(\n                    f\"The input is smaller than the minimum value of {self.clip_min}r\"\n                )\n\n        if self.clip_max is not None:\n            if not np.all(tf.math.less_equal(x, self.clip_max)):\n                raise CarliniWagnerL2Exception(\n                    f\"The input is greater than the maximum value of {self.clip_max}!\"\n                )\n\n        # cast to tensor if provided as numpy array\n        original_x = tf.cast(x, tf.float32)\n        shape = original_x.shape\n\n        y, _ = get_or_guess_labels(\n            self.model_fn, original_x, y=self.y, targeted=self.targeted\n        )\n\n        if not y.shape.as_list()[0] == original_x.shape.as_list()[0]:\n            raise CarliniWagnerL2Exception(\"x and y do not have the same shape!\")\n\n        # re-scale x to [0, 1]\n        x = original_x\n        x = (x - self.clip_min) / (self.clip_max - self.clip_min)\n        x = tf.clip_by_value(x, 0.0, 1.0)\n\n        # scale to [-1, 1]\n        x = (x * 2.0) - 1.0\n\n        # convert tonh-space\n        x = tf.atanh(x * 0.999999)\n\n        # parameters for the binary search\n        lower_bound = tf.zeros(shape[:1])\n        upper_bound = tf.ones(shape[:1]) * 1e10\n\n        const = tf.ones(shape) * self.initial_const\n\n        # placeholder variables for best values\n        best_l2 = tf.fill(shape[:1], 1e10)\n        best_score = tf.fill(shape[:1], -1)\n        best_score = tf.cast(best_score, tf.int32)\n        best_attack = original_x\n\n        # convience function for comparing\n        compare_fn = tf.equal if self.targeted else tf.not_equal\n\n        # the perturbation\n        modifier = tf.Variable(tf.zeros(shape, dtype=x.dtype), trainable=True)\n\n        for outer_step in range(self.binary_search_steps):\n            # at each iteration reset variable state\n            modifier.assign(tf.zeros(shape, dtype=x.dtype))\n            for var in self.optimizer.variables():\n                var.assign(tf.zeros(var.shape, dtype=var.dtype))\n\n            # variables to keep track in the inner loop\n            current_best_l2 = tf.fill(shape[:1], 1e10)\n            current_best_score = tf.fill(shape[:1], -1)\n            current_best_score = tf.cast(current_best_score, tf.int32)\n\n            # The last iteration (if we run many steps) repeat the search once.\n            if (\n                self.binary_search_steps >= 10\n                and outer_step == self.binary_search_steps - 1\n            ):\n                const = upper_bound\n\n            # early stopping criteria\n            prev = None\n\n            for iteration in range(self.max_iterations):\n                x_new, loss, preds, l2_dist = self.attack_step(x, y, modifier, const)\n\n                # check if we made progress, abort otherwise\n                if (\n                    self.abort_early\n                    and iteration % ((self.max_iterations // 10) or 1) == 0\n                ):\n                    if prev is not None and loss > prev * 0.9999:\n                        break\n\n                    prev = loss\n\n                lab = tf.argmax(y, axis=1)\n\n                pred_with_conf = (\n                    preds - self.confidence\n                    if self.targeted\n                    else preds + self.confidence\n                )\n                pred_with_conf = tf.argmax(pred_with_conf, axis=1)\n\n                pred = tf.argmax(preds, axis=1)\n                pred = tf.cast(pred, tf.int32)\n\n                # compute a binary mask of the tensors we want to assign\n                mask = tf.math.logical_and(\n                    tf.less(l2_dist, current_best_l2), compare_fn(pred_with_conf, lab)\n                )\n\n                # all entries which evaluate to True get reassigned\n                current_best_l2 = set_with_mask(current_best_l2, l2_dist, mask)\n                current_best_score = set_with_mask(current_best_score, pred, mask)\n\n                # if the l2 distance is better than the one found before\n                # and if the example is a correct example (with regards to the labels)\n                mask = tf.math.logical_and(\n                    tf.less(l2_dist, best_l2), compare_fn(pred_with_conf, lab)\n                )\n\n                best_l2 = set_with_mask(best_l2, l2_dist, mask)\n                best_score = set_with_mask(best_score, pred, mask)\n\n                # mask is of shape [batch_size]; best_attack is [batch_size, image_size]\n                # need to expand\n                mask = tf.reshape(mask, [-1, 1, 1, 1])\n                mask = tf.tile(mask, [1, *best_attack.shape[1:]])\n\n                best_attack = set_with_mask(best_attack, x_new, mask)\n\n            # adjust binary search parameters\n            lab = tf.argmax(y, axis=1)\n            lab = tf.cast(lab, tf.int32)\n\n            # we first compute the mask for the upper bound\n            upper_mask = tf.math.logical_and(\n                compare_fn(best_score, lab),\n                tf.not_equal(best_score, -1),\n            )\n            upper_bound = set_with_mask(\n                upper_bound, tf.math.minimum(upper_bound, const), upper_mask\n            )\n\n            # based on this mask compute const mask\n            const_mask = tf.math.logical_and(\n                upper_mask,\n                tf.less(upper_bound, 1e9),\n            )\n            const = set_with_mask(const, (lower_bound + upper_bound) / 2.0, const_mask)\n\n            # else case is the negation of the inital mask\n            lower_mask = tf.math.logical_not(upper_mask)\n            lower_bound = set_with_mask(\n                lower_bound, tf.math.maximum(lower_bound, const), lower_mask\n            )\n\n            const_mask = tf.math.logical_and(\n                lower_mask,\n                tf.less(upper_bound, 1e9),\n            )\n            const = set_with_mask(const, (lower_bound + upper_bound) / 2, const_mask)\n\n            const_mask = tf.math.logical_not(const_mask)\n            const = set_with_mask(const, const * 10, const_mask)\n\n        return best_attack\n\n    def attack_step(self, x, y, modifier, const):\n        x_new, grads, loss, preds, l2_dist = self.gradient(x, y, modifier, const)\n\n        self.optimizer.apply_gradients([(grads, modifier)])\n        return x_new, loss, preds, l2_dist\n\n    @tf.function\n    def gradient(self, x, y, modifier, const):\n        # compute the actual attack\n        with tf.GradientTape() as tape:\n            adv_image = modifier + x\n            x_new = clip_tanh(adv_image, clip_min=self.clip_min, clip_max=self.clip_max)\n            preds = self.model_fn(x_new)\n            loss, l2_dist = loss_fn(\n                x=x,\n                x_new=x_new,\n                y_true=y,\n                y_pred=preds,\n                confidence=self.confidence,\n                const=const,\n                targeted=self.targeted,\n                clip_min=self.clip_min,\n                clip_max=self.clip_max,\n            )\n\n        grads = tape.gradient(loss, adv_image)\n        return x_new, grads, loss, preds, l2_dist\n\n\ndef l2(x, y):\n    # technically squarred l2\n    return tf.reduce_sum(tf.square(x - y), list(range(1, len(x.shape))))\n\n\ndef loss_fn(\n    x,\n    x_new,\n    y_true,\n    y_pred,\n    confidence,\n    const=0,\n    targeted=False,\n    clip_min=0,\n    clip_max=1,\n):\n    other = clip_tanh(x, clip_min=clip_min, clip_max=clip_max)\n    l2_dist = l2(x_new, other)\n\n    real = tf.reduce_sum(y_true * y_pred, 1)\n    other = tf.reduce_max((1.0 - y_true) * y_pred - y_true * 10_000, 1)\n\n    if targeted:\n        # if targeted, optimize for making the other class most likely\n        loss_1 = tf.maximum(0.0, other - real + confidence)\n    else:\n        # if untargeted, optimize for making this class least likely.\n        loss_1 = tf.maximum(0.0, real - other + confidence)\n\n    # sum up losses\n    loss_2 = tf.reduce_sum(l2_dist)\n    loss_1 = tf.reduce_sum(const * loss_1)\n    loss = loss_1 + loss_2\n    return loss, l2_dist\n\n\ndef clip_tanh(x, clip_min, clip_max):\n    return ((tf.tanh(x) + 1) / 2) * (clip_max - clip_min) + clip_min\n"
  },
  {
    "path": "cleverhans/tf2/attacks/fast_gradient_method.py",
    "content": "\"\"\"The Fast Gradient Method attack.\"\"\"\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.tf2.utils import optimize_linear, compute_gradient\n\n\ndef fast_gradient_method(\n    model_fn,\n    x,\n    eps,\n    norm,\n    loss_fn=None,\n    clip_min=None,\n    clip_max=None,\n    y=None,\n    targeted=False,\n    sanity_checks=False,\n):\n    \"\"\"\n    Tensorflow 2.0 implementation of the Fast Gradient Method.\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor.\n    :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572.\n    :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2.\n    :param loss_fn: (optional) callable. Loss function that takes (labels, logits) as arguments and returns loss.\n                    default function is 'tf.nn.sparse_softmax_cross_entropy_with_logits'\n    :param clip_min: (optional) float. Minimum float value for adversarial example components.\n    :param clip_max: (optional) float. Maximum float value for adversarial example components.\n    :param y: (optional) Tensor with true labels. If targeted is true, then provide the\n              target label. Otherwise, only provide this parameter if you'd like to use true\n              labels when crafting adversarial samples. Otherwise, model predictions are used\n              as labels to avoid the \"label leaking\" effect (explained in this paper:\n              https://arxiv.org/abs/1611.01236). Default is None.\n    :param targeted: (optional) bool. Is the attack targeted or untargeted?\n              Untargeted, the default, will try to make the label incorrect.\n              Targeted will instead try to move in the direction of being more like y.\n    :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime /\n              memory or for unit tests that intentionally pass strange input)\n    :return: a tensor for the adversarial example\n    \"\"\"\n    if norm not in [np.inf, 1, 2]:\n        raise ValueError(\"Norm order must be either np.inf, 1, or 2.\")\n\n    if loss_fn is None:\n        loss_fn = tf.nn.sparse_softmax_cross_entropy_with_logits\n\n    asserts = []\n\n    # If a data range was specified, check that the input was in that range\n    if clip_min is not None:\n        asserts.append(tf.math.greater_equal(x, clip_min))\n\n    if clip_max is not None:\n        asserts.append(tf.math.less_equal(x, clip_max))\n\n    # cast to tensor if provided as numpy array\n    x = tf.cast(x, tf.float32)\n\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        y = tf.argmax(model_fn(x), 1)\n\n    grad = compute_gradient(model_fn, loss_fn, x, y, targeted)\n\n    optimal_perturbation = optimize_linear(grad, eps, norm)\n    # Add perturbation to original example to obtain adversarial example\n    adv_x = x + optimal_perturbation\n\n    # If clipping is needed, reset all values outside of [clip_min, clip_max]\n    if (clip_min is not None) or (clip_max is not None):\n        # We don't currently support one-sided clipping\n        assert clip_min is not None and clip_max is not None\n        adv_x = tf.clip_by_value(adv_x, clip_min, clip_max)\n\n    if sanity_checks:\n        assert np.all(asserts)\n    return adv_x\n"
  },
  {
    "path": "cleverhans/tf2/attacks/madry_et_al.py",
    "content": "\"\"\"\nThe MadryEtAl attack\n\"\"\"\n\nfrom cleverhans.tf2.attacks.projected_gradient_descent import projected_gradient_descent\n\n\ndef madry_et_al(\n    model_fn,\n    x,\n    eps,\n    eps_iter,\n    nb_iter,\n    norm,\n    clip_min=None,\n    clip_max=None,\n    y=None,\n    targeted=False,\n    rand_minmax=0.3,\n    sanity_checks=True,\n):\n    \"\"\"\n    The attack from Madry et al 2017\n    \"\"\"\n    return projected_gradient_descent(\n        model_fn,\n        x,\n        eps,\n        eps_iter,\n        nb_iter,\n        norm,\n        clip_min=clip_min,\n        clip_max=clip_max,\n        y=y,\n        targeted=targeted,\n        rand_init=True,\n        rand_minmax=rand_minmax,\n        sanity_checks=sanity_checks,\n    )\n"
  },
  {
    "path": "cleverhans/tf2/attacks/momentum_iterative_method.py",
    "content": "\"\"\"The MomentumIterativeMethod attack.\"\"\"\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.tf2.utils import optimize_linear, compute_gradient\nfrom cleverhans.tf2.utils import clip_eta\n\n\ndef momentum_iterative_method(\n    model_fn,\n    x,\n    eps=0.3,\n    eps_iter=0.06,\n    nb_iter=10,\n    norm=np.inf,\n    clip_min=None,\n    clip_max=None,\n    y=None,\n    targeted=False,\n    decay_factor=1.0,\n    sanity_checks=True,\n):\n    \"\"\"\n    Tensorflow 2.0 implementation of Momentum Iterative Method (Dong et al. 2017).\n    This method won the first places in NIPS 2017 Non-targeted Adversarial Attacks\n    and Targeted Adversarial Attacks. The original paper used hard labels\n    for this attack; no label smoothing.\n    Paper link: https://arxiv.org/pdf/1710.06081.pdf\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor.\n    :param eps: (optional float) maximum distortion of adversarial example\n              compared to original input\n    :param eps_iter: (optional float) step size for each attack iteration\n    :param nb_iter: (optional int) Number of attack iterations.\n    :param norm: (optional) Order of the norm (mimics Numpy).\n              Possible values: np.inf, 1 or 2.\n    :param clip_min: (optional float) Minimum input component value\n    :param clip_max: (optional float) Maximum input component value\n    :param y: (optional) Tensor with true labels. If targeted is true, then provide the\n              target label. Otherwise, only provide this parameter if you'd like to use true\n              labels when crafting adversarial samples. Otherwise, model predictions are used\n              as labels to avoid the \"label leaking\" effect (explained in this paper:\n              https://arxiv.org/abs/1611.01236). Default is None.\n    :param targeted: (optional) bool. Is the attack targeted or untargeted?\n              Untargeted, the default, will try to make the label incorrect.\n              Targeted will instead try to move in the direction of being more like y.\n    :param decay_factor: (optional) Decay factor for the momentum term.\n    :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime /\n              memory or for unit tests that intentionally pass strange input)\n    :return: a tensor for the adversarial example\n    \"\"\"\n\n    if norm == 1:\n        raise NotImplementedError(\n            \"This attack hasn't been tested for norm=1.\"\n            \"It's not clear that FGM makes a good inner \"\n            \"loop step for iterative optimization since \"\n            \"it updates just one coordinate at a time.\"\n        )\n\n    # Check if order of the norm is acceptable given current implementation\n    if norm not in [np.inf, 1, 2]:\n        raise ValueError(\"Norm order must be either np.inf, 1, or 2.\")\n\n    asserts = []\n\n    # If a data range was specified, check that the input was in that range\n    if clip_min is not None:\n        asserts.append(tf.math.greater_equal(x, clip_min))\n\n    if clip_max is not None:\n        asserts.append(tf.math.less_equal(x, clip_max))\n\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        y = tf.argmax(model_fn(x), 1)\n\n    # Initialize loop variables\n    momentum = tf.zeros_like(x)\n    adv_x = x\n\n    i = 0\n    while i < nb_iter:\n        # Define gradient of loss wrt input\n        grad = compute_gradient(model_fn, loss_fn, adv_x, y, targeted)\n\n        # Normalize current gradient and add it to the accumulated gradient\n        red_ind = list(range(1, len(grad.shape)))\n        avoid_zero_div = tf.cast(1e-12, grad.dtype)\n        grad = grad / tf.math.maximum(\n            avoid_zero_div,\n            tf.math.reduce_mean(tf.math.abs(grad), red_ind, keepdims=True),\n        )\n        momentum = decay_factor * momentum + grad\n\n        optimal_perturbation = optimize_linear(momentum, eps_iter, norm)\n        # Update and clip adversarial example in current iteration\n        adv_x = adv_x + optimal_perturbation\n        adv_x = x + clip_eta(adv_x - x, norm, eps)\n\n        if clip_min is not None and clip_max is not None:\n            adv_x = tf.clip_by_value(adv_x, clip_min, clip_max)\n        i += 1\n\n    if sanity_checks:\n        assert np.all(asserts)\n\n    return adv_x\n\n\ndef loss_fn(labels, logits):\n    \"\"\"\n    Added softmax cross entropy loss for MIM as in the original MI-FGSM paper.\n    \"\"\"\n\n    return tf.nn.sparse_softmax_cross_entropy_with_logits(labels, logits, name=None)\n"
  },
  {
    "path": "cleverhans/tf2/attacks/projected_gradient_descent.py",
    "content": "\"\"\"The Projected Gradient Descent attack.\"\"\"\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.tf2.attacks.fast_gradient_method import fast_gradient_method\nfrom cleverhans.tf2.utils import clip_eta, random_lp_vector\n\n\ndef projected_gradient_descent(\n    model_fn,\n    x,\n    eps,\n    eps_iter,\n    nb_iter,\n    norm,\n    loss_fn=None,\n    clip_min=None,\n    clip_max=None,\n    y=None,\n    targeted=False,\n    rand_init=None,\n    rand_minmax=None,\n    sanity_checks=False,\n):\n    \"\"\"\n    This class implements either the Basic Iterative Method\n    (Kurakin et al. 2016) when rand_init is set to 0. or the\n    Madry et al. (2017) method when rand_minmax is larger than 0.\n    Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf\n    Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor.\n    :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572.\n    :param eps_iter: step size for each attack iteration\n    :param nb_iter: Number of attack iterations.\n    :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2.\n    :param loss_fn: (optional) callable. loss function that takes (labels, logits) as arguments and returns loss.\n                    default function is 'tf.nn.sparse_softmax_cross_entropy_with_logits'\n    :param clip_min: (optional) float. Minimum float value for adversarial example components.\n    :param clip_max: (optional) float. Maximum float value for adversarial example components.\n    :param y: (optional) Tensor with true labels. If targeted is true, then provide the\n              target label. Otherwise, only provide this parameter if you'd like to use true\n              labels when crafting adversarial samples. Otherwise, model predictions are used\n              as labels to avoid the \"label leaking\" effect (explained in this paper:\n              https://arxiv.org/abs/1611.01236). Default is None.\n    :param targeted: (optional) bool. Is the attack targeted or untargeted?\n              Untargeted, the default, will try to make the label incorrect.\n              Targeted will instead try to move in the direction of being more like y.\n    :param rand_init: (optional) float. Start the gradient descent from a point chosen\n                        uniformly at random in the norm ball of radius\n                        rand_init_eps\n    :param rand_minmax: (optional) float. Size of the norm ball from which\n                        the initial starting point is chosen. Defaults to eps\n    :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime /\n              memory or for unit tests that intentionally pass strange input)\n    :return: a tensor for the adversarial example\n    \"\"\"\n\n    assert eps_iter <= eps, (eps_iter, eps)\n    if norm == 1:\n        raise NotImplementedError(\n            \"It's not clear that FGM is a good inner loop\"\n            \" step for PGD when norm=1, because norm=1 FGM \"\n            \" changes only one pixel at a time. We need \"\n            \" to rigorously test a strong norm=1 PGD \"\n            \"before enabling this feature.\"\n        )\n    if norm not in [np.inf, 2]:\n        raise ValueError(\"Norm order must be either np.inf or 2.\")\n\n    if loss_fn is None:\n        loss_fn = tf.nn.sparse_softmax_cross_entropy_with_logits\n\n    asserts = []\n\n    # If a data range was specified, check that the input was in that range\n    if clip_min is not None:\n        asserts.append(tf.math.greater_equal(x, clip_min))\n\n    if clip_max is not None:\n        asserts.append(tf.math.less_equal(x, clip_max))\n\n    # Initialize loop variables\n    if rand_minmax is None:\n        rand_minmax = eps\n\n    if rand_init:\n        eta = random_lp_vector(\n            tf.shape(x), norm, tf.cast(rand_minmax, x.dtype), dtype=x.dtype\n        )\n    else:\n        eta = tf.zeros_like(x)\n\n    # Clip eta\n    eta = clip_eta(eta, norm, eps)\n    adv_x = x + eta\n    if clip_min is not None or clip_max is not None:\n        adv_x = tf.clip_by_value(adv_x, clip_min, clip_max)\n\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        y = tf.argmax(model_fn(x), 1)\n\n    i = 0\n    while i < nb_iter:\n        adv_x = fast_gradient_method(\n            model_fn,\n            adv_x,\n            eps_iter,\n            norm,\n            loss_fn,\n            clip_min=clip_min,\n            clip_max=clip_max,\n            y=y,\n            targeted=targeted,\n        )\n\n        # Clipping perturbation eta to norm norm ball\n        eta = adv_x - x\n        eta = clip_eta(eta, norm, eps)\n        adv_x = x + eta\n\n        # Redo the clipping.\n        # FGM already did it, but subtracting and re-adding eta can add some\n        # small numerical error.\n        if clip_min is not None or clip_max is not None:\n            adv_x = tf.clip_by_value(adv_x, clip_min, clip_max)\n        i += 1\n\n    asserts.append(eps_iter <= eps)\n    if norm == np.inf and clip_min is not None:\n        # TODO necessary to cast to x.dtype?\n        asserts.append(eps + clip_min <= clip_max)\n\n    if sanity_checks:\n        assert np.all(asserts)\n    return adv_x\n"
  },
  {
    "path": "cleverhans/tf2/attacks/spsa.py",
    "content": "# pylint: disable=missing-docstring\n\nimport tensorflow as tf\n\ntf_dtype = tf.as_dtype(\"float32\")\n\n\ndef spsa(\n    model_fn,\n    x,\n    y,\n    eps,\n    nb_iter,\n    clip_min=None,\n    clip_max=None,\n    targeted=False,\n    early_stop_loss_threshold=None,\n    learning_rate=0.01,\n    delta=0.01,\n    spsa_samples=128,\n    spsa_iters=1,\n    is_debug=False,\n):\n    \"\"\"Tensorflow 2.0 implementation of SPSA.\n\n    This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666 (Uesato et al. 2018).\n    SPSA is a gradient-free optimization method, which is useful when the model is non-differentiable,\n    or more generally, the gradients do not point in useful directions.\n    :param model_fn: A callable that takes an input tensor and returns the model logits.\n    :param x: Input tensor.\n    :param y: Tensor with true labels. If targeted is true, then provide the target label.\n    :param eps: The size of the maximum perturbation, measured in the L-infinity norm.\n    :param nb_iter: The number of optimization steps.\n    :param clip_min: If specified, the minimum input value.\n    :param clip_max: If specified, the maximum input value.\n    :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the default,\n              will try to make the label incorrect. Targeted will instead try to move in the direction\n              of being more like y.\n    :param early_stop_loss_threshold: A float or None. If specified, the attack will end as soon as\n                                      the loss is below `early_stop_loss_threshold`.\n    :param learning_rate: Learning rate of ADAM optimizer.\n    :param delta: Perturbation size used for SPSA approximation.\n    :param spsa_samples:  Number of inputs to evaluate at a single time. The true batch size\n                          (the number of evaluated inputs for each update) is `spsa_samples *\n                          spsa_iters`\n    :param spsa_iters:  Number of model evaluations before performing an update, where each evaluation\n                        is on `spsa_samples` different inputs.\n    :param is_debug: If True, print the adversarial loss after each update.\n    \"\"\"\n    if x.get_shape().as_list()[0] != 1:\n        raise ValueError(\"For SPSA, input tensor x must have batch_size of 1.\")\n\n    optimizer = SPSAAdam(\n        lr=learning_rate, delta=delta, num_samples=spsa_samples, num_iters=spsa_iters\n    )\n\n    def loss_fn(x, label):\n        \"\"\"\n        Margin logit loss, with correct sign for targeted vs untargeted loss.\n        \"\"\"\n        logits = model_fn(x)\n        loss_multiplier = 1 if targeted else -1\n        return loss_multiplier * margin_logit_loss(\n            logits, label, nb_classes=logits.get_shape()[-1]\n        )\n\n    adv_x = projected_optimization(\n        loss_fn,\n        x,\n        y,\n        eps,\n        nb_iter,\n        optimizer,\n        clip_min,\n        clip_max,\n        early_stop_loss_threshold,\n        is_debug=is_debug,\n    )\n\n    return adv_x\n\n\nclass SPSAAdam(tf.optimizers.Adam):\n    \"\"\"Optimizer for gradient-free attacks in https://arxiv.org/abs/1802.05666.\n\n    Gradients estimates are computed using Simultaneous Perturbation Stochastic Approximation (SPSA),\n    combined with the ADAM update rule (https://arxiv.org/abs/1412.6980).\n    \"\"\"\n\n    def __init__(\n        self,\n        lr=0.01,\n        delta=0.01,\n        num_samples=128,\n        num_iters=1,\n        compare_to_analytic_grad=False,\n    ):\n        super(SPSAAdam, self).__init__(lr=lr)\n        assert num_samples % 2 == 0, \"number of samples must be even\"\n        self._delta = delta\n        self._num_samples = num_samples // 2  # Since we mirror +/- delta later\n        self._num_iters = num_iters\n        self._compare_to_analytic_grad = compare_to_analytic_grad\n\n    def _get_delta(self, x, delta):\n        x_shape = x.get_shape().as_list()\n        delta_x = delta * tf.sign(\n            tf.random.uniform(\n                [self._num_samples] + x_shape[1:],\n                minval=-1.0,\n                maxval=1.0,\n                dtype=tf_dtype,\n            )\n        )\n        return delta_x\n\n    def _compute_gradients(self, loss_fn, x):\n        \"\"\"Compute a new value of `x` to minimize `loss_fn` using SPSA.\n\n        Args:\n            loss_fn:  a callable that takes `x`, a batch of images, and returns a batch of loss values.\n                      `x` will be optimized to minimize `loss_fn(x)`.\n            x:  A list of Tensors, the values to be updated. This is analogous to the `var_list` argument\n                in standard TF Optimizer.\n\n        Returns:\n            new_x: A list of Tensors, the same length as `x`, which are updated\n            new_optim_state:  A dict, with the same structure as `optim_state`, which have been updated.\n        \"\"\"\n\n        # Assumes `x` is a list, containing a [1, H, W, C] image.If static batch dimension is None,\n        # tf.reshape to batch size 1 so that static shape can be inferred.\n        assert len(x) == 1\n        static_x_shape = x[0].get_shape().as_list()\n        if static_x_shape[0] is None:\n            x[0] = tf.reshape(x[0], [1] + static_x_shape[1:])\n        assert x[0].get_shape().as_list()[0] == 1\n        x = x[0]\n        x_shape = x.get_shape().as_list()\n\n        def body(i, grad_array):\n            delta = self._delta\n            delta_x = self._get_delta(x, delta)\n            delta_x = tf.concat([delta_x, -delta_x], axis=0)\n            loss_vals = tf.reshape(\n                loss_fn(x + delta_x), [2 * self._num_samples] + [1] * (len(x_shape) - 1)\n            )\n            avg_grad = tf.reduce_mean(loss_vals * delta_x, axis=0) / delta\n            avg_grad = tf.expand_dims(avg_grad, axis=0)\n            new_grad_array = grad_array.write(i, avg_grad)\n            return i + 1, new_grad_array\n\n        def cond(i, _):\n            return i < self._num_iters\n\n        _, all_grads = tf.while_loop(\n            cond,\n            body,\n            loop_vars=[0, tf.TensorArray(size=self._num_iters, dtype=tf_dtype)],\n            back_prop=False,\n            parallel_iterations=1,\n        )\n        avg_grad = tf.reduce_sum(all_grads.stack(), axis=0)\n        return [avg_grad]\n\n    def _apply_gradients(self, grads, x, optim_state):\n        \"\"\"Given a gradient, make one optimization step.\n\n        :param grads: list of tensors, same length as `x`, containing the corresponding gradients\n        :param x: list of tensors to update\n        :param optim_state: dict\n\n        Returns:\n          new_x: list of tensors, updated version of `x`\n          new_optim_state: dict, updated version of `optim_state`\n        \"\"\"\n\n        new_x = [None] * len(x)\n        new_optim_state = {\n            \"t\": optim_state[\"t\"] + 1.0,\n            \"m\": [None] * len(x),\n            \"u\": [None] * len(x),\n        }\n        t = new_optim_state[\"t\"]\n        for i in range(len(x)):\n            g = grads[i]\n            m_old = optim_state[\"m\"][i]\n            u_old = optim_state[\"u\"][i]\n            new_optim_state[\"m\"][i] = self.beta_1 * m_old + (1.0 - self.beta_1) * g\n            new_optim_state[\"u\"][i] = self.beta_2 * u_old + (1.0 - self.beta_2) * g * g\n            m_hat = new_optim_state[\"m\"][i] / (1.0 - tf.pow(self.beta_1, t))\n            u_hat = new_optim_state[\"u\"][i] / (1.0 - tf.pow(self.beta_2, t))\n            new_x[i] = x[i] - self.lr * m_hat / (tf.sqrt(u_hat) + self.epsilon)\n        return new_x, new_optim_state\n\n    def init_state(self, x):\n        \"\"\"Initialize t, m, and u\"\"\"\n        optim_state = {\n            \"t\": 0.0,\n            \"m\": [tf.zeros_like(v) for v in x],\n            \"u\": [tf.zeros_like(v) for v in x],\n        }\n        return optim_state\n\n    def minimize(self, loss_fn, x, optim_state):\n        \"\"\"Analogous to tf.Optimizer.minimize\n\n        :param loss_fn: tf Tensor, representing the loss to minimize\n        :param x: list of Tensor, analogous to tf.Optimizer's var_list\n        :param optim_state: A possibly nested dict, containing any optimizer state.\n\n        Returns:\n          new_x: list of Tensor, updated version of `x`\n          new_optim_state: dict, updated version of `optim_state`\n        \"\"\"\n        grads = self._compute_gradients(loss_fn, x)\n        return self._apply_gradients(grads, x, optim_state)\n\n\ndef margin_logit_loss(model_logits, label, nb_classes=10):\n    \"\"\"Computes difference between logit for `label` and next highest logit.\n\n    The loss is high when `label` is unlikely (targeted by default). This follows the same interface\n    as `loss_fn` for projected_optimization, i.e. it returns a batch of loss values.\n    \"\"\"\n\n    if \"int\" in str(label.dtype):\n        logit_mask = tf.one_hot(label, depth=nb_classes, axis=-1)\n    else:\n        logit_mask = label\n    if \"int\" in str(logit_mask.dtype):\n        logit_mask = tf.cast(logit_mask, dtype=tf.float32)\n    try:\n        label_logits = tf.reduce_sum(logit_mask * model_logits, axis=-1)\n    except TypeError:\n        raise TypeError(\n            \"Could not take row-wise dot product between logit mask, of dtype \"\n            + str(logit_mask.dtype)\n            + \" and model_logits, of dtype \"\n            + str(model_logits.dtype)\n        )\n    logits_with_target_label_neg_inf = model_logits - logit_mask * 99999\n    highest_nonlabel_logits = tf.reduce_max(logits_with_target_label_neg_inf, axis=-1)\n    loss = highest_nonlabel_logits - label_logits\n    return loss\n\n\ndef _project_perturbation(\n    perturbation, epsilon, input_image, clip_min=None, clip_max=None\n):\n    \"\"\"\n    Project `perturbation` onto L-infinity ball of radius `epsilon`. Also project into hypercube such\n    that the resulting adversarial example is between clip_min and clip_max, if applicable.\n    \"\"\"\n\n    if clip_min is None or clip_max is None:\n        raise NotImplementedError(\n            \"_project_perturbation currently has clipping hard-coded in.\"\n        )\n\n    # Ensure inputs are in the correct range\n    with tf.control_dependencies(\n        [\n            tf.debugging.assert_less_equal(\n                input_image, tf.cast(clip_max, input_image.dtype)\n            ),\n            tf.debugging.assert_greater_equal(\n                input_image, tf.cast(clip_min, input_image.dtype)\n            ),\n        ]\n    ):\n        clipped_perturbation = tf.clip_by_value(perturbation, -epsilon, epsilon)\n        new_image = tf.clip_by_value(\n            input_image + clipped_perturbation, clip_min, clip_max\n        )\n        return new_image - input_image\n\n\ndef projected_optimization(\n    loss_fn,\n    input_image,\n    label,\n    epsilon,\n    num_steps,\n    optimizer,\n    clip_min=None,\n    clip_max=None,\n    early_stop_loss_threshold=None,\n    project_perturbation=_project_perturbation,\n    is_debug=False,\n):\n    \"\"\"\n    Generic projected optimization, generalized to work with approximate gradients. Used for e.g.\n    the SPSA attack.\n\n    Args:\n      :param loss_fn: A callable which takes `input_image` and `label` as\n                      arguments, and returns a batch of loss values.\n      :param input_image: Tensor, a batch of images\n      :param label: Tensor, a batch of labels\n      :param epsilon: float, the L-infinity norm of the maximum allowable\n                      perturbation\n      :param num_steps: int, the number of steps of gradient descent\n      :param optimizer: A `SPSAAdam` object\n      :param clip_min: float, minimum pixel value\n      :param clip_max: float, maximum pixel value\n      :param project_perturbation: A function, which will be used to enforce\n                                   some constraint. It should have the same\n                                   signature as `_project_perturbation`.\n      :param early_stop_loss_threshold: A float or None. If specified, the attack will end if the loss is below\n         `early_stop_loss_threshold`.\n          Enabling this option can have several different effects:\n            - Setting the threshold to 0. guarantees that if a successful attack is found, it is returned.\n              This increases the attack success rate, because without early stopping the optimizer can accidentally\n              bounce back to a point where the attack fails.\n            - Early stopping can make the attack run faster because it may run for fewer steps.\n            - Early stopping can make the attack run slower because the loss must be calculated at each step.\n              The loss is not calculated as part of the normal SPSA optimization procedure.\n              For most reasonable choices of hyperparameters, early stopping makes the attack much faster because\n              it decreases the number of steps dramatically.\n      :param is_debug: A bool. If True, print debug info for attack progress.\n\n    Returns:\n      adversarial version of `input_image`, with L-infinity difference less than epsilon, which tries\n      to minimize loss_fn.\n\n    Note that this function is not intended as an Attack by itself. Rather, it is designed as a helper\n    function which you can use to write your own attack methods. The method uses a tf.while_loop to\n    optimize a loss function in a single sess.run() call.\n    \"\"\"\n    assert num_steps is not None\n    if is_debug:\n        with tf.device(\"/cpu:0\"):\n            tf.print(\"Starting PGD attack with epsilon: %s\" % epsilon)\n\n    init_perturbation = tf.random.uniform(\n        tf.shape(input_image),\n        minval=tf.cast(-epsilon, input_image.dtype),\n        maxval=tf.cast(epsilon, input_image.dtype),\n        dtype=input_image.dtype,\n    )\n    init_perturbation = project_perturbation(\n        init_perturbation, epsilon, input_image, clip_min=clip_min, clip_max=clip_max\n    )\n    init_optim_state = optimizer.init_state([init_perturbation])\n\n    def loop_body(i, perturbation, flat_optim_state):\n        \"\"\"Update perturbation to input image.\"\"\"\n        optim_state = tf.nest.pack_sequence_as(\n            structure=init_optim_state, flat_sequence=flat_optim_state\n        )\n\n        def wrapped_loss_fn(x):\n            return loss_fn(input_image + x, label)\n\n        new_perturbation_list, new_optim_state = optimizer.minimize(\n            wrapped_loss_fn, [perturbation], optim_state\n        )\n        projected_perturbation = project_perturbation(\n            new_perturbation_list[0],\n            epsilon,\n            input_image,\n            clip_min=clip_min,\n            clip_max=clip_max,\n        )\n\n        # Be careful with this bool. A value of 0. is a valid threshold but evaluates to False, so we\n        # must explicitly check whether the value is None.\n        early_stop = early_stop_loss_threshold is not None\n        compute_loss = is_debug or early_stop\n        # Don't waste time building the loss graph if we're not going to use it\n        if compute_loss:\n            # NOTE: this step is not actually redundant with the optimizer step.\n            # SPSA calculates the loss at randomly perturbed points but doesn't calculate the loss at the current point.\n            loss = tf.reduce_mean(wrapped_loss_fn(projected_perturbation), axis=0)\n\n            if is_debug:\n                with tf.device(\"/cpu:0\"):\n                    tf.print(loss, \"Total batch loss\")\n\n            if early_stop:\n                i = tf.cond(\n                    tf.less(loss, early_stop_loss_threshold),\n                    lambda: float(num_steps),\n                    lambda: i,\n                )\n\n        return i + 1, projected_perturbation, tf.nest.flatten(new_optim_state)\n\n    def cond(i, *_):\n        return tf.less(i, num_steps)\n\n    flat_init_optim_state = tf.nest.flatten(init_optim_state)\n    _, final_perturbation, _ = tf.while_loop(\n        cond,\n        loop_body,\n        loop_vars=(tf.constant(0.0), init_perturbation, flat_init_optim_state),\n        parallel_iterations=1,\n        back_prop=False,\n        maximum_iterations=num_steps,\n    )\n\n    if project_perturbation is _project_perturbation:\n        # TODO: this assert looks totally wrong.\n        # Not bothering to fix it now because it's only an assert.\n        # 1) Multiplying by 1.1 gives a huge margin of error. This should probably take the difference\n        #    and allow a tolerance of 1e-6 or something like that.\n        # 2) I think it should probably check the *absolute value* of final_perturbation\n        perturbation_max = epsilon * 1.1\n        check_diff = tf.debugging.assert_less_equal(\n            final_perturbation,\n            tf.cast(perturbation_max, final_perturbation.dtype),\n            message=\"final_perturbation must change no pixel by more than %s\"\n            % perturbation_max,\n        )\n    else:\n        # TODO: let caller pass in a check_diff function as well as\n        # project_perturbation\n        check_diff = tf.no_op()\n\n    if clip_min is None or clip_max is None:\n        raise NotImplementedError(\"This function only supports clipping for now\")\n    check_range = [\n        tf.debugging.assert_less_equal(\n            input_image, tf.cast(clip_max, input_image.dtype)\n        ),\n        tf.debugging.assert_greater_equal(\n            input_image, tf.cast(clip_min, input_image.dtype)\n        ),\n    ]\n\n    with tf.control_dependencies([check_diff] + check_range):\n        adversarial_image = input_image + final_perturbation\n    return tf.stop_gradient(adversarial_image)\n"
  },
  {
    "path": "cleverhans/tf2/utils.py",
    "content": "import numpy as np\nimport tensorflow as tf\n\n\ndef clip_eta(eta, norm, eps):\n    \"\"\"\n    Helper function to clip the perturbation to epsilon norm ball.\n    :param eta: A tensor with the current perturbation.\n    :param norm: Order of the norm (mimics Numpy).\n                Possible values: np.inf, 1 or 2.\n    :param eps: Epsilon, bound of the perturbation.\n    \"\"\"\n\n    # Clipping perturbation eta to self.norm norm ball\n    if norm not in [np.inf, 1, 2]:\n        raise ValueError(\"norm must be np.inf, 1, or 2.\")\n    axis = list(range(1, len(eta.get_shape())))\n    avoid_zero_div = 1e-12\n    if norm == np.inf:\n        eta = tf.clip_by_value(eta, -eps, eps)\n    else:\n        if norm == 1:\n            raise NotImplementedError(\"\")\n            # This is not the correct way to project on the L1 norm ball:\n            # norm = tf.maximum(avoid_zero_div, reduce_sum(tf.abs(eta), reduc_ind, keepdims=True))\n        elif norm == 2:\n            # avoid_zero_div must go inside sqrt to avoid a divide by zero in the gradient through this operation\n            norm = tf.sqrt(\n                tf.maximum(\n                    avoid_zero_div, tf.reduce_sum(tf.square(eta), axis, keepdims=True)\n                )\n            )\n        # We must *clip* to within the norm ball, not *normalize* onto the surface of the ball\n        factor = tf.minimum(1.0, tf.math.divide(eps, norm))\n        eta = eta * factor\n    return eta\n\n\ndef random_exponential(shape, rate=1.0, dtype=tf.float32, seed=None):\n    \"\"\"\n    Helper function to sample from the exponential distribution, which is not\n    included in core TensorFlow.\n\n    shape: shape of the sampled tensor.\n    :rate: (optional) rate parameter of the exponential distribution, defaults to 1.0.\n    :dtype: (optional) data type of the sempled tensor, defaults to tf.float32.\n    :seed: (optional) custom seed to be used for sampling.\n    \"\"\"\n    return tf.random.gamma(shape, alpha=1, beta=1.0 / rate, dtype=dtype, seed=seed)\n\n\ndef random_laplace(shape, loc=0.0, scale=1.0, dtype=tf.float32, seed=None):\n    \"\"\"\n    Helper function to sample from the Laplace distribution, which is not\n    included in core TensorFlow.\n\n    :shape: shape of the sampled tensor.\n    :loc: (optional) mean of the laplace distribution, defaults to 0.0.\n    :scale: (optional) scale parameter of the laplace diustribution, defaults to 1.0.\n    :dtype: (optional) data type of the sempled tensor, defaults to tf.float32.\n    :seed: (optional) custom seed to be used for sampling.\n    \"\"\"\n    z1 = random_exponential(shape, 1.0 / scale, dtype=dtype, seed=seed)\n    z2 = random_exponential(shape, 1.0 / scale, dtype=dtype, seed=seed)\n    return z1 - z2 + loc\n\n\ndef random_lp_vector(shape, ord, eps, dtype=tf.float32, seed=None):\n    \"\"\"\n    Helper function to generate uniformly random vectors from a norm ball of\n    radius epsilon.\n    :param shape: Output shape of the random sample. The shape is expected to be\n                  of the form `(n, d1, d2, ..., dn)` where `n` is the number of\n                  i.i.d. samples that will be drawn from a norm ball of dimension\n                  `d1*d1*...*dn`.\n    :param ord: Order of the norm (mimics Numpy).\n                Possible values: np.inf, 1 or 2.\n    :param eps: Epsilon, radius of the norm ball.\n    :param dtype: (optional) type of the tensor.\n    :param seed: (optional) integer.\n    \"\"\"\n    if ord not in [np.inf, 1, 2]:\n        raise ValueError(\"ord must be np.inf, 1, or 2.\")\n\n    if ord == np.inf:\n        r = tf.random.uniform(shape, -eps, eps, dtype=dtype, seed=seed)\n    else:\n\n        # For ord=1 and ord=2, we use the generic technique from\n        # (Calafiore et al. 1998) to sample uniformly from a norm ball.\n        # Paper link (Calafiore et al. 1998):\n        # https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=758215&tag=1\n        # We first sample from the surface of the norm ball, and then scale by\n        # a factor `w^(1/d)` where `w~U[0,1]` is a standard uniform random variable\n        # and `d` is the dimension of the ball. In high dimensions, this is roughly\n        # equivalent to sampling from the surface of the ball.\n\n        dim = tf.reduce_prod(shape[1:])\n\n        if ord == 1:\n            x = random_laplace(\n                (shape[0], dim), loc=1.0, scale=1.0, dtype=dtype, seed=seed\n            )\n            norm = tf.reduce_sum(tf.abs(x), axis=-1, keepdims=True)\n        elif ord == 2:\n            x = tf.random.normal((shape[0], dim), dtype=dtype, seed=seed)\n            norm = tf.sqrt(tf.reduce_sum(tf.square(x), axis=-1, keepdims=True))\n        else:\n            raise ValueError(\"ord must be np.inf, 1, or 2.\")\n\n        w = tf.pow(\n            tf.random.uniform((shape[0], 1), dtype=dtype, seed=seed),\n            1.0 / tf.cast(dim, dtype),\n        )\n        r = eps * tf.reshape(w * x / norm, shape)\n\n    return r\n\n\ndef get_or_guess_labels(model_fn, x, y=None, targeted=False):\n    \"\"\"\n    Helper function to get the label to use in generating an\n    adversarial example for x.\n    If 'y' is not None, then use these labels.\n    If 'targeted' is True, then assume it's a targeted attack\n    and y must be set.\n    Otherwise, use the model's prediction as the label and perform an\n    untargeted attack\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor.\n    \"\"\"\n    if targeted is True and y is None:\n        raise ValueError(\"Must provide y for a targeted attack!\")\n\n    preds = model_fn(x)\n    nb_classes = preds.shape[-1]\n\n    # labels set by the user\n    if y is not None:\n        # inefficient when y is a tensor, but this function only get called once\n        y = np.asarray(y)\n\n        if len(y.shape) == 1:\n            # the user provided categorical encoding\n            y = tf.one_hot(y, nb_classes)\n\n        y = tf.cast(y, x.dtype)\n        return y, nb_classes\n\n    # must be an untargeted attack\n    labels = tf.cast(\n        tf.equal(tf.reduce_max(preds, axis=1, keepdims=True), preds), x.dtype\n    )\n\n    return labels, nb_classes\n\n\ndef set_with_mask(x, x_other, mask):\n    \"\"\"Helper function which returns a tensor similar to x with all the values\n    of x replaced by x_other where the mask evaluates to true.\n    \"\"\"\n    mask = tf.cast(mask, x.dtype)\n    ones = tf.ones_like(mask, dtype=x.dtype)\n    return x_other * mask + x * (ones - mask)\n\n\n# Due to performance reasons, this function is wrapped inside of tf.function decorator.\n# Not using the decorator here, or letting the user wrap the attack in tf.function is way\n# slower on Tensorflow 2.0.0-alpha0.\n@tf.function\ndef compute_gradient(model_fn, loss_fn, x, y, targeted):\n    \"\"\"\n    Computes the gradient of the loss with respect to the input tensor.\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param loss_fn: loss function that takes (labels, logits) as arguments and returns loss.\n    :param x: input tensor\n    :param y: Tensor with true labels. If targeted is true, then provide the target label.\n    :param targeted:  bool. Is the attack targeted or untargeted? Untargeted, the default, will\n                      try to make the label incorrect. Targeted will instead try to move in the\n                      direction of being more like y.\n    :return: A tensor containing the gradient of the loss with respect to the input tensor.\n    \"\"\"\n\n    with tf.GradientTape() as g:\n        g.watch(x)\n        # Compute loss\n        loss = loss_fn(labels=y, logits=model_fn(x))\n        if (\n            targeted\n        ):  # attack is targeted, minimize loss of target label rather than maximize loss of correct label\n            loss = -loss\n\n    # Define gradient of loss wrt input\n    grad = g.gradient(loss, x)\n    return grad\n\n\ndef optimize_linear(grad, eps, norm=np.inf):\n    \"\"\"\n    Solves for the optimal input to a linear function under a norm constraint.\n\n    Optimal_perturbation = argmax_{eta, ||eta||_{norm} < eps} dot(eta, grad)\n\n    :param grad: tf tensor containing a batch of gradients\n    :param eps: float scalar specifying size of constraint region\n    :param norm: int specifying order of norm\n    :returns:\n      tf tensor containing optimal perturbation\n    \"\"\"\n\n    # Convert the iterator returned by `range` into a list.\n    axis = list(range(1, len(grad.get_shape())))\n    avoid_zero_div = 1e-12\n    if norm == np.inf:\n        # Take sign of gradient\n        optimal_perturbation = tf.sign(grad)\n        # The following line should not change the numerical results. It applies only because\n        # `optimal_perturbation` is the output of a `sign` op, which has zero derivative anyway.\n        # It should not be applied for the other norms, where the perturbation has a non-zero derivative.\n        optimal_perturbation = tf.stop_gradient(optimal_perturbation)\n    elif norm == 1:\n        abs_grad = tf.abs(grad)\n        sign = tf.sign(grad)\n        max_abs_grad = tf.reduce_max(abs_grad, axis, keepdims=True)\n        tied_for_max = tf.dtypes.cast(\n            tf.equal(abs_grad, max_abs_grad), dtype=tf.float32\n        )\n        num_ties = tf.reduce_sum(tied_for_max, axis, keepdims=True)\n        optimal_perturbation = sign * tied_for_max / num_ties\n    elif norm == 2:\n        square = tf.maximum(\n            avoid_zero_div, tf.reduce_sum(tf.square(grad), axis, keepdims=True)\n        )\n        optimal_perturbation = grad / tf.sqrt(square)\n    else:\n        raise NotImplementedError(\n            \"Only L-inf, L1 and L2 norms are currently implemented.\"\n        )\n\n    # Scale perturbation to be the solution for the norm=eps rather than norm=1 problem\n    scaled_perturbation = tf.multiply(eps, optimal_perturbation)\n    return scaled_perturbation\n"
  },
  {
    "path": "cleverhans/torch/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans/torch/attacks/__init__.py",
    "content": "# pylint: disable=missing-docstring\n"
  },
  {
    "path": "cleverhans/torch/attacks/carlini_wagner_l2.py",
    "content": "\"\"\"The CarliniWagnerL2 attack.\"\"\"\nimport torch\n\n\nINF = float(\"inf\")\n\n\ndef carlini_wagner_l2(\n    model_fn,\n    x,\n    n_classes,\n    y=None,\n    targeted=False,\n    lr=5e-3,\n    confidence=0,\n    clip_min=0,\n    clip_max=1,\n    initial_const=1e-2,\n    binary_search_steps=5,\n    max_iterations=1000,\n):\n    \"\"\"\n    This attack was originally proposed by Carlini and Wagner. It is an\n    iterative attack that finds adversarial examples on many defenses that\n    are robust to other attacks.\n    Paper link: https://arxiv.org/abs/1608.04644\n\n    At a high level, this attack is an iterative attack using Adam and\n    a specially-chosen loss function to find adversarial examples with\n    lower distortion than other attacks. This comes at the cost of speed,\n    as this attack is often much slower than others.\n\n    :param model_fn: a callable that takes an input tensor and returns\n              the model logits. The logits should be a tensor of shape\n              (n_examples, n_classes).\n    :param x: input tensor of shape (n_examples, ...), where ... can\n              be any arbitrary dimension that is compatible with\n              model_fn.\n    :param n_classes: the number of classes.\n    :param y: (optional) Tensor with true labels. If targeted is true,\n              then provide the target label. Otherwise, only provide\n              this parameter if you'd like to use true labels when\n              crafting adversarial samples. Otherwise, model predictions\n              are used as labels to avoid the \"label leaking\" effect\n              (explained in this paper:\n              https://arxiv.org/abs/1611.01236). If provide y, it\n              should be a 1D tensor of shape (n_examples, ).\n              Default is None.\n    :param targeted: (optional) bool. Is the attack targeted or\n              untargeted? Untargeted, the default, will try to make the\n              label incorrect. Targeted will instead try to move in the\n              direction of being more like y.\n    :param lr: (optional) float. The learning rate for the attack\n              algorithm. Default is 5e-3.\n    :param confidence: (optional) float. Confidence of adversarial\n              examples: higher produces examples with larger l2\n              distortion, but more strongly classified as adversarial.\n              Default is 0.\n    :param clip_min: (optional) float. Minimum float value for\n              adversarial example components. Default is 0.\n    :param clip_max: (optional) float. Maximum float value for\n              adversarial example components. Default is 1.\n    :param initial_const: The initial tradeoff-constant to use to tune the\n              relative importance of size of the perturbation and\n              confidence of classification. If binary_search_steps is\n              large, the initial constant is not important. A smaller\n              value of this constant gives lower distortion results.\n              Default is 1e-2.\n    :param binary_search_steps: (optional) int. The number of times we\n              perform binary search to find the optimal tradeoff-constant\n              between norm of the perturbation and confidence of the\n              classification. Default is 5.\n    :param max_iterations: (optional) int. The maximum number of\n              iterations. Setting this to a larger value will produce\n              lower distortion results. Using only a few iterations\n              requires a larger learning rate, and will produce larger\n              distortion results. Default is 1000.\n    \"\"\"\n\n    def compare(pred, label, is_logits=False):\n        \"\"\"\n        A helper function to compare prediction against a label.\n        Returns true if the attack is considered successful.\n\n        :param pred: can be either a 1D tensor of logits or a predicted\n                class (int).\n        :param label: int. A label to compare against.\n        :param is_logits: (optional) bool. If True, treat pred as an\n                array of logits. Default is False.\n        \"\"\"\n\n        # Convert logits to predicted class if necessary\n        if is_logits:\n            pred_copy = pred.clone().detach()\n            pred_copy[label] += -confidence if targeted else confidence\n            pred = torch.argmax(pred_copy)\n\n        return pred == label if targeted else pred != label\n\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        pred = model_fn(x)\n        y = torch.argmax(pred, 1)\n\n    # Initialize some values needed for binary search on const\n    lower_bound = [0.0] * len(x)\n    upper_bound = [1e10] * len(x)\n    const = x.new_ones(len(x), 1) * initial_const\n\n    o_bestl2 = [INF] * len(x)\n    o_bestscore = [-1.0] * len(x)\n    x = torch.clamp(x, clip_min, clip_max)\n    ox = x.clone().detach()  # save the original x\n    o_bestattack = x.clone().detach()\n\n    # Map images into the tanh-space\n    x = (x - clip_min) / (clip_max - clip_min)\n    x = torch.clamp(x, 0, 1)\n    x = x * 2 - 1\n    x = torch.arctanh(x * 0.999999)\n\n    # Prepare some variables\n    modifier = torch.zeros_like(x, requires_grad=True)\n    y_onehot = torch.nn.functional.one_hot(y, n_classes).to(torch.float)\n\n    # Define loss functions and optimizer\n    f_fn = lambda real, other, targeted: torch.max(\n        ((other - real) if targeted else (real - other)) + confidence,\n        torch.tensor(0.0).to(real.device),\n    )\n    l2dist_fn = lambda x, y: torch.pow(x - y, 2).sum(list(range(len(x.size())))[1:])\n    optimizer = torch.optim.Adam([modifier], lr=lr)\n\n    # Outer loop performing binary search on const\n    for outer_step in range(binary_search_steps):\n        # Initialize some values needed for the inner loop\n        bestl2 = [INF] * len(x)\n        bestscore = [-1.0] * len(x)\n\n        # Inner loop performing attack iterations\n        for i in range(max_iterations):\n            # One attack step\n            new_x = (torch.tanh(modifier + x) + 1) / 2\n            new_x = new_x * (clip_max - clip_min) + clip_min\n            logits = model_fn(new_x)\n\n            real = torch.sum(y_onehot * logits, 1)\n            other, _ = torch.max((1 - y_onehot) * logits - y_onehot * 1e4, 1)\n\n            optimizer.zero_grad()\n            f = f_fn(real, other, targeted)\n            l2 = l2dist_fn(new_x, ox)\n            loss = (const * f + l2).sum()\n            loss.backward()\n            optimizer.step()\n\n            # Update best results\n            for n, (l2_n, logits_n, new_x_n) in enumerate(zip(l2, logits, new_x)):\n                y_n = y[n]\n                succeeded = compare(logits_n, y_n, is_logits=True)\n                if l2_n < o_bestl2[n] and succeeded:\n                    pred_n = torch.argmax(logits_n)\n                    o_bestl2[n] = l2_n\n                    o_bestscore[n] = pred_n\n                    o_bestattack[n] = new_x_n\n                    # l2_n < o_bestl2[n] implies l2_n < bestl2[n] so we modify inner loop variables too\n                    bestl2[n] = l2_n\n                    bestscore[n] = pred_n\n                elif l2_n < bestl2[n] and succeeded:\n                    bestl2[n] = l2_n\n                    bestscore[n] = torch.argmax(logits_n)\n\n        # Binary search step\n        for n in range(len(x)):\n            y_n = y[n]\n\n            if compare(bestscore[n], y_n) and bestscore[n] != -1:\n                # Success, divide const by two\n                upper_bound[n] = min(upper_bound[n], const[n])\n                if upper_bound[n] < 1e9:\n                    const[n] = (lower_bound[n] + upper_bound[n]) / 2\n            else:\n                # Failure, either multiply by 10 if no solution found yet\n                # or do binary search with the known upper bound\n                lower_bound[n] = max(lower_bound[n], const[n])\n                if upper_bound[n] < 1e9:\n                    const[n] = (lower_bound[n] + upper_bound[n]) / 2\n                else:\n                    const[n] *= 10\n\n    return o_bestattack.detach()\n\n\nif __name__ == \"__main__\":\n    x = torch.clamp(torch.randn(5, 10), 0, 1)\n    y = torch.randint(0, 9, (5,))\n    model_fn = lambda x: x\n\n    # targeted\n    new_x = carlini_wagner_l2(model_fn, x, 10, targeted=True, y=y)\n    new_pred = model_fn(new_x)\n    new_pred = torch.argmax(new_pred, 1)\n\n    # untargeted\n    new_x_untargeted = carlini_wagner_l2(model_fn, x, 10, targeted=False, y=y)\n    new_pred_untargeted = model_fn(new_x_untargeted)\n    new_pred_untargeted = torch.argmax(new_pred_untargeted, 1)\n"
  },
  {
    "path": "cleverhans/torch/attacks/fast_gradient_method.py",
    "content": "\"\"\"The Fast Gradient Method attack.\"\"\"\nimport numpy as np\nimport torch\n\nfrom cleverhans.torch.utils import optimize_linear\n\n\ndef fast_gradient_method(\n    model_fn,\n    x,\n    eps,\n    norm,\n    clip_min=None,\n    clip_max=None,\n    y=None,\n    targeted=False,\n    sanity_checks=False,\n):\n    \"\"\"\n    PyTorch implementation of the Fast Gradient Method.\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor.\n    :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572.\n    :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2.\n    :param clip_min: (optional) float. Minimum float value for adversarial example components.\n    :param clip_max: (optional) float. Maximum float value for adversarial example components.\n    :param y: (optional) Tensor with true labels. If targeted is true, then provide the\n              target label. Otherwise, only provide this parameter if you'd like to use true\n              labels when crafting adversarial samples. Otherwise, model predictions are used\n              as labels to avoid the \"label leaking\" effect (explained in this paper:\n              https://arxiv.org/abs/1611.01236). Default is None.\n    :param targeted: (optional) bool. Is the attack targeted or untargeted?\n              Untargeted, the default, will try to make the label incorrect.\n              Targeted will instead try to move in the direction of being more like y.\n    :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime /\n              memory or for unit tests that intentionally pass strange input)\n    :return: a tensor for the adversarial example\n    \"\"\"\n    if norm not in [np.inf, 1, 2]:\n        raise ValueError(\n            \"Norm order must be either np.inf, 1, or 2, got {} instead.\".format(norm)\n        )\n    if eps < 0:\n        raise ValueError(\n            \"eps must be greater than or equal to 0, got {} instead\".format(eps)\n        )\n    if eps == 0:\n        return x\n    if clip_min is not None and clip_max is not None:\n        if clip_min > clip_max:\n            raise ValueError(\n                \"clip_min must be less than or equal to clip_max, got clip_min={} and clip_max={}\".format(\n                    clip_min, clip_max\n                )\n            )\n\n    asserts = []\n\n    # If a data range was specified, check that the input was in that range\n    if clip_min is not None:\n        assert_ge = torch.all(\n            torch.ge(x, torch.tensor(clip_min, device=x.device, dtype=x.dtype))\n        )\n        asserts.append(assert_ge)\n\n    if clip_max is not None:\n        assert_le = torch.all(\n            torch.le(x, torch.tensor(clip_max, device=x.device, dtype=x.dtype))\n        )\n        asserts.append(assert_le)\n\n    # x needs to be a leaf variable, of floating point type and have requires_grad being True for\n    # its grad to be computed and stored properly in a backward call\n    x = x.clone().detach().to(torch.float).requires_grad_(True)\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        _, y = torch.max(model_fn(x), 1)\n\n    # Compute loss\n    loss_fn = torch.nn.CrossEntropyLoss()\n    loss = loss_fn(model_fn(x), y)\n    # If attack is targeted, minimize loss of target label rather than maximize loss of correct label\n    if targeted:\n        loss = -loss\n\n    # Define gradient of loss wrt input\n    loss.backward()\n    optimal_perturbation = optimize_linear(x.grad, eps, norm)\n\n    # Add perturbation to original example to obtain adversarial example\n    adv_x = x + optimal_perturbation\n\n    # If clipping is needed, reset all values outside of [clip_min, clip_max]\n    if (clip_min is not None) or (clip_max is not None):\n        if clip_min is None or clip_max is None:\n            raise ValueError(\n                \"One of clip_min and clip_max is None but we don't currently support one-sided clipping\"\n            )\n        adv_x = torch.clamp(adv_x, clip_min, clip_max)\n\n    if sanity_checks:\n        assert np.all(asserts)\n    return adv_x\n"
  },
  {
    "path": "cleverhans/torch/attacks/hop_skip_jump_attack.py",
    "content": "\"\"\"\nBoundary Attack++\n\"\"\"\nimport numpy as np\nimport torch\n\n\ndef hop_skip_jump_attack(\n    model_fn,\n    x,\n    norm,\n    y_target=None,\n    image_target=None,\n    initial_num_evals=100,\n    max_num_evals=10000,\n    stepsize_search=\"geometric_progression\",\n    num_iterations=64,\n    gamma=1.0,\n    constraint=2,\n    batch_size=128,\n    verbose=True,\n    clip_min=0,\n    clip_max=1,\n):\n    \"\"\"\n    PyTorch implementation of HopSkipJumpAttack.\n    HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright.\n    It is a decision-based attack that requires access to output\n    labels of a model alone.\n    Paper link: https://arxiv.org/abs/1904.02144\n    At a high level, this attack is an iterative attack composed of three\n    steps: Binary search to approach the boundary; gradient estimation;\n    stepsize search. HopSkipJumpAttack requires fewer model queries than\n    Boundary Attack which was based on rejective sampling.\n\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor with n samples.\n    :param norm: The distance to optimize. Possible values: 2 or np.inf.\n    :param y_target:  A tensor of shape (n, nb_classes) for target labels.\n    Required for targeted attack.\n    :param image_target: A tensor of shape (n, **image shape) for initial\n    target images. Required for targeted attack.\n    :param initial_num_evals: initial number of evaluations for\n                              gradient estimation.\n    :param max_num_evals: maximum number of evaluations for gradient estimation.\n    :param stepsize_search: How to search for stepsize; choices are\n                            'geometric_progression', 'grid_search'.\n                            'geometric progression' initializes the stepsize\n                             by ||x_t - x||_p / sqrt(iteration), and keep\n                             decreasing by half until reaching the target\n                             side of the boundary. 'grid_search' chooses the\n                             optimal epsilon over a grid, in the scale of\n                             ||x_t - x||_p.\n    :param num_iterations: The number of iterations.\n    :param gamma: The binary search threshold theta is gamma / d^{3/2} for\n                   l2 attack and gamma / d^2 for linf attack.\n    :param batch_size: batch_size for model prediction.\n    :param verbose: (boolean) Whether distance at each step is printed.\n    :param clip_min: (optional float) Minimum input component value\n    :param clip_max: (optional float) Maximum input component value\n    \"\"\"\n    shape = (1,) + x.shape[1:]\n    if y_target is not None:\n        assert image_target is not None, \"Require a target image for targeted attack.\"\n    if clip_min is not None and clip_max is not None:\n        if clip_min > clip_max:\n            raise ValueError(\n                \"clip_min must be less than or equal to clip_max, got clip_min={} and clip_max={}\".format(\n                    clip_min, clip_max\n                )\n            )\n\n    d = int(np.prod(shape))\n\n    if constraint == 2:\n        theta = gamma / (np.sqrt(d) * d)\n    else:\n        theta = gamma / (d * d)\n\n    def hsja(sample, target_label, target_image):\n        if target_label is None:\n            _, original_label = torch.max(model_fn(sample), 1)\n\n        def decision_function(images):\n            \"\"\"\n            Decision function output 1 on the desired side of the boundary,\n            0 otherwise.\n            \"\"\"\n            images = torch.clamp(images, clip_min, clip_max)\n            prob = []\n            for i in range(0, len(images), batch_size):\n                batch = images[i : i + batch_size]\n                prob_i = model_fn(batch)\n                prob.append(prob_i)\n            prob = torch.cat(prob, dim=0)\n            if target_label is None:\n                return torch.max(prob, dim=1)[1] != original_label\n            else:\n                return torch.max(prob, dim=1)[1] == target_label\n\n        # Initialize.\n        if target_image is None:\n            perturbed = initialize(decision_function, sample, shape, clip_min, clip_max)\n        else:\n            perturbed = target_image.to(sample.device)\n\n        # Project the initialization to the boundary.\n        perturbed, dist_post_update = binary_search_batch(\n            sample, perturbed, decision_function, shape, constraint, theta\n        )\n        dist = compute_distance(perturbed, sample, constraint)\n\n        for j in np.arange(num_iterations):\n            current_iteration = j + 1\n\n            # Choose delta.\n            delta = select_delta(\n                dist_post_update,\n                current_iteration,\n                clip_max,\n                clip_min,\n                d,\n                theta,\n                constraint,\n            )\n\n            # Choose number of evaluations.\n            num_evals = int(min([initial_num_evals * np.sqrt(j + 1), max_num_evals]))\n\n            # approximate gradient.\n            gradf = approximate_gradient(\n                decision_function,\n                perturbed,\n                num_evals,\n                delta,\n                constraint,\n                shape[1:],\n                clip_min,\n                clip_max,\n            )\n            if constraint == np.inf:\n                update = torch.sign(gradf)\n            else:\n                update = gradf\n\n            # search step size.\n            if stepsize_search == \"geometric_progression\":\n                # find step size.\n                epsilon = geometric_progression_for_stepsize(\n                    perturbed, update, dist, decision_function, current_iteration\n                )\n\n                # Update the sample.\n                perturbed = torch.clamp(\n                    perturbed + epsilon * update, clip_min, clip_max\n                )\n\n                # Binary search to return to the boundary.\n                perturbed, dist_post_update = binary_search_batch(\n                    sample, perturbed, decision_function, shape, constraint, theta\n                )\n\n            elif stepsize_search == \"grid_search\":\n                # Grid search for stepsize.\n                epsilons = (\n                    torch.from_numpy(np.logspace(-4, 0, num=20, endpoint=True))\n                    .to(perturbed.device)\n                    .float()\n                    * dist\n                )\n                perturbeds = (\n                    perturbed + epsilons.view((20,) + (1,) * (len(shape) - 1)) * update\n                )\n                perturbeds = torch.clamp(perturbeds, clip_min, clip_max)\n                idx_perturbed = decision_function(perturbeds)\n\n                if torch.sum(idx_perturbed) > 0:\n                    # Select the perturbation that yields the minimum distance # after binary search.\n                    perturbed, dist_post_update = binary_search_batch(\n                        sample,\n                        perturbeds[idx_perturbed],\n                        decision_function,\n                        shape,\n                        constraint,\n                        theta,\n                    )\n\n            # compute new distance.\n            dist = compute_distance(perturbed, sample, constraint)\n            if verbose:\n                print(\n                    \"iteration: {:d}, {:s} distance {:.4E}\".format(\n                        j + 1, str(constraint), dist\n                    )\n                )\n\n        return perturbed\n\n    # Perform attack on one instance at a time\n    adv_x = []\n    for i, x_ in enumerate(x):\n        x_ = x_.unsqueeze(0)\n        if y_target is not None:\n            # targeted attack that requires target label and image.\n            pert = hsja(x_, y_target[i], image_target[i])\n        else:\n            if image_target is not None:\n                pert = hsja(x_, None, image_target[i])\n            else:\n                # untargeted attack without an initialized image.\n                pert = hsja(x_, None, None)\n        adv_x.append(pert)\n    return torch.cat(adv_x, 0)\n\n\ndef compute_distance(x_ori, x_pert, constraint=2):\n    \"\"\" Compute the distance between two images. \"\"\"\n    if constraint == 2:\n        dist = torch.norm(x_ori - x_pert, p=2)\n    elif constraint == np.inf:\n        dist = torch.max(torch.abs(x_ori - x_pert))\n    return dist\n\n\ndef approximate_gradient(\n    decision_function, sample, num_evals, delta, constraint, shape, clip_min, clip_max\n):\n    \"\"\" Gradient direction estimation \"\"\"\n    # Generate random vectors.\n    noise_shape = [num_evals] + list(shape)\n    if constraint == 2:\n        rv = torch.randn(noise_shape)\n    elif constraint == np.inf:\n        rv = -1 + torch.rand(noise_shape) * 2\n\n    axis = tuple(range(1, 1 + len(shape)))\n    rv = rv / torch.sqrt(torch.sum(rv ** 2, dim=axis, keepdim=True))\n    perturbed = sample + delta * rv.to(sample.device)\n    perturbed = torch.clamp(perturbed, clip_min, clip_max)\n    rv = (perturbed - sample) / delta\n\n    # query the model.\n    decisions = decision_function(perturbed).float()\n    fval = 2.0 * decisions.view((decisions.shape[0],) + (1,) * len(shape)) - 1.0\n\n    # Baseline subtraction (when fval differs)\n    fval_mean = torch.mean(fval)\n    if fval_mean == 1.0:  # label changes.\n        gradf = torch.mean(rv, dim=0)\n    elif fval_mean == -1.0:  # label not change.\n        gradf = -torch.mean(rv, dim=0)\n    else:\n        fval = fval - fval_mean\n        gradf = torch.mean(fval * rv, dim=0)\n\n    # Get the gradient direction.\n    gradf = gradf / torch.norm(gradf, p=2)\n\n    return gradf\n\n\ndef project(original_image, perturbed_images, alphas, shape, constraint):\n    \"\"\" Projection onto given l2 / linf balls in a batch. \"\"\"\n    alphas = alphas.view((alphas.shape[0],) + (1,) * (len(shape) - 1))\n    if constraint == 2:\n        projected = (1 - alphas) * original_image + alphas * perturbed_images\n    elif constraint == np.inf:\n        projected = torch.clamp(\n            perturbed_images, original_image - alphas, original_image + alphas\n        )\n    return projected\n\n\ndef binary_search_batch(\n    original_image, perturbed_images, decision_function, shape, constraint, theta\n):\n    \"\"\" Binary search to approach the boundary. \"\"\"\n\n    # Compute distance between each of perturbed image and original image.\n    dists_post_update = torch.stack(\n        [\n            compute_distance(original_image, perturbed_image, constraint)\n            for perturbed_image in perturbed_images\n        ]\n    )\n\n    # Choose upper thresholds in binary searchs based on constraint.\n    if constraint == np.inf:\n        highs = dists_post_update\n        # Stopping criteria.\n        thresholds = torch.min(dists_post_update * theta, theta)\n    else:\n        highs = torch.ones(len(perturbed_images)).to(original_image.device)\n        thresholds = theta\n\n    lows = torch.zeros(len(perturbed_images)).to(original_image.device)\n\n    while torch.max((highs - lows) / thresholds) > 1:\n        # projection to mids.\n        mids = (highs + lows) / 2.0\n        mid_images = project(original_image, perturbed_images, mids, shape, constraint)\n\n        # Update highs and lows based on model decisions.\n        decisions = decision_function(mid_images)\n        lows = torch.where(decisions == 0, mids, lows)\n        highs = torch.where(decisions == 1, mids, highs)\n\n    out_images = project(original_image, perturbed_images, highs, shape, constraint)\n\n    # Compute distance of the output image to select the best choice.\n    # (only used when stepsize_search is grid_search.)\n    dists = torch.stack(\n        [\n            compute_distance(original_image, out_image, constraint)\n            for out_image in out_images\n        ]\n    )\n    _, idx = torch.min(dists, 0)\n\n    dist = dists_post_update[idx]\n    out_image = out_images[idx].unsqueeze(0)\n    return out_image, dist\n\n\ndef initialize(decision_function, sample, shape, clip_min, clip_max):\n    \"\"\"\n    Efficient Implementation of BlendedUniformNoiseAttack in Foolbox.\n    \"\"\"\n    success = 0\n    num_evals = 0\n\n    # Find a misclassified random noise.\n    while True:\n        random_noise = clip_min + torch.rand(shape).to(sample.device) * (\n            clip_max - clip_min\n        )\n        success = decision_function(random_noise)[0]\n        if success:\n            break\n        num_evals += 1\n        message = (\n            \"Initialization failed! Try to use a misclassified image as `target_image`\"\n        )\n        assert num_evals < 1e4, message\n\n    # Binary search to minimize l2 distance to original image.\n    low = 0.0\n    high = 1.0\n    while high - low > 0.001:\n        mid = (high + low) / 2.0\n        blended = (1 - mid) * sample + mid * random_noise\n        success = decision_function(blended)[0]\n        if success:\n            high = mid\n        else:\n            low = mid\n\n    initialization = (1 - high) * sample + high * random_noise\n    return initialization\n\n\ndef geometric_progression_for_stepsize(\n    x, update, dist, decision_function, current_iteration\n):\n    \"\"\"Geometric progression to search for stepsize.\n    Keep decreasing stepsize by half until reaching\n    the desired side of the boundary.\n    \"\"\"\n    epsilon = dist / np.sqrt(current_iteration)\n    while True:\n        updated = x + epsilon * update\n        success = decision_function(updated)[0]\n        if success:\n            break\n        else:\n            epsilon = epsilon / 2.0\n\n    return epsilon\n\n\ndef select_delta(\n    dist_post_update, current_iteration, clip_max, clip_min, d, theta, constraint\n):\n    \"\"\"\n    Choose the delta at the scale of distance\n     between x and perturbed sample.\n    \"\"\"\n    if current_iteration == 1:\n        delta = 0.1 * (clip_max - clip_min)\n    else:\n        if constraint == 2:\n            delta = np.sqrt(d) * theta * dist_post_update\n        elif constraint == np.inf:\n            delta = d * theta * dist_post_update\n\n    return delta\n"
  },
  {
    "path": "cleverhans/torch/attacks/noise.py",
    "content": "\"\"\"\nThe Noise Attack\n\"\"\"\n\nimport numpy as np\nimport torch\n\n\ndef noise(x, eps=0.3, order=np.inf, clip_min=None, clip_max=None):\n    \"\"\"\n    A weak attack that just picks a random point in the attacker's action\n    space. When combined with an attack bundling function, this can be used to\n    implement random search.\n\n    References:\n    https://arxiv.org/abs/1802.00420 recommends random search to help identify\n        gradient masking\n\n    https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part\n        of an attack building recipe combining many different optimizers to\n        yield a strong optimizer.\n\n    Args:\n    :param x: the input tensor\n    :param eps: (optional float) maximum distortion of adversarial example\n                compared to original input.\n    :param norm: (optional) Order of the norm.\n    :param clip_min: (optional float) Minimum input component value\n    :param clip_max: (optional float) Maximum input component value\n    \"\"\"\n\n    if order != np.inf:\n        raise NotImplementedError(norm)\n\n    eta = torch.FloatTensor(*x.shape).to(x.device).uniform_(-eps, eps)\n    adv_x = x + eta\n\n    if clip_min is not None or clip_max is not None:\n        assert clip_min is not None and clip_max is not None\n        adv_x = torch.clamp(adv_x, min=clip_min, max=clip_max)\n\n    return adv_x\n"
  },
  {
    "path": "cleverhans/torch/attacks/projected_gradient_descent.py",
    "content": "\"\"\"The Projected Gradient Descent attack.\"\"\"\nimport numpy as np\nimport torch\n\nfrom cleverhans.torch.attacks.fast_gradient_method import fast_gradient_method\nfrom cleverhans.torch.utils import clip_eta\n\n\ndef projected_gradient_descent(\n    model_fn,\n    x,\n    eps,\n    eps_iter,\n    nb_iter,\n    norm,\n    clip_min=None,\n    clip_max=None,\n    y=None,\n    targeted=False,\n    rand_init=True,\n    rand_minmax=None,\n    sanity_checks=True,\n):\n    \"\"\"\n    This class implements either the Basic Iterative Method\n    (Kurakin et al. 2016) when rand_init is set to False. or the\n    Madry et al. (2017) method if rand_init is set to True.\n    Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf\n    Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor.\n    :param eps: epsilon (input variation parameter); see https://arxiv.org/abs/1412.6572.\n    :param eps_iter: step size for each attack iteration\n    :param nb_iter: Number of attack iterations.\n    :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2.\n    :param clip_min: (optional) float. Minimum float value for adversarial example components.\n    :param clip_max: (optional) float. Maximum float value for adversarial example components.\n    :param y: (optional) Tensor with true labels. If targeted is true, then provide the\n              target label. Otherwise, only provide this parameter if you'd like to use true\n              labels when crafting adversarial samples. Otherwise, model predictions are used\n              as labels to avoid the \"label leaking\" effect (explained in this paper:\n              https://arxiv.org/abs/1611.01236). Default is None.\n    :param targeted: (optional) bool. Is the attack targeted or untargeted?\n              Untargeted, the default, will try to make the label incorrect.\n              Targeted will instead try to move in the direction of being more like y.\n    :param rand_init: (optional) bool. Whether to start the attack from a randomly perturbed x.\n    :param rand_minmax: (optional) bool. Support of the continuous uniform distribution from\n              which the random perturbation on x was drawn. Effective only when rand_init is\n              True. Default equals to eps.\n    :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime /\n              memory or for unit tests that intentionally pass strange input)\n    :return: a tensor for the adversarial example\n    \"\"\"\n    if norm == 1:\n        raise NotImplementedError(\n            \"It's not clear that FGM is a good inner loop\"\n            \" step for PGD when norm=1, because norm=1 FGM \"\n            \" changes only one pixel at a time. We need \"\n            \" to rigorously test a strong norm=1 PGD \"\n            \"before enabling this feature.\"\n        )\n    if norm not in [np.inf, 2]:\n        raise ValueError(\"Norm order must be either np.inf or 2.\")\n    if eps < 0:\n        raise ValueError(\n            \"eps must be greater than or equal to 0, got {} instead\".format(eps)\n        )\n    if eps == 0:\n        return x\n    if eps_iter < 0:\n        raise ValueError(\n            \"eps_iter must be greater than or equal to 0, got {} instead\".format(\n                eps_iter\n            )\n        )\n    if eps_iter == 0:\n        return x\n\n    assert eps_iter <= eps, (eps_iter, eps)\n    if clip_min is not None and clip_max is not None:\n        if clip_min > clip_max:\n            raise ValueError(\n                \"clip_min must be less than or equal to clip_max, got clip_min={} and clip_max={}\".format(\n                    clip_min, clip_max\n                )\n            )\n\n    asserts = []\n\n    # If a data range was specified, check that the input was in that range\n    if clip_min is not None:\n        assert_ge = torch.all(\n            torch.ge(x, torch.tensor(clip_min, device=x.device, dtype=x.dtype))\n        )\n        asserts.append(assert_ge)\n\n    if clip_max is not None:\n        assert_le = torch.all(\n            torch.le(x, torch.tensor(clip_max, device=x.device, dtype=x.dtype))\n        )\n        asserts.append(assert_le)\n\n    # Initialize loop variables\n    if rand_init:\n        if rand_minmax is None:\n            rand_minmax = eps\n        eta = torch.zeros_like(x).uniform_(-rand_minmax, rand_minmax)\n    else:\n        eta = torch.zeros_like(x)\n\n    # Clip eta\n    eta = clip_eta(eta, norm, eps)\n    adv_x = x + eta\n    if clip_min is not None or clip_max is not None:\n        adv_x = torch.clamp(adv_x, clip_min, clip_max)\n\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        _, y = torch.max(model_fn(x), 1)\n\n    i = 0\n    while i < nb_iter:\n        adv_x = fast_gradient_method(\n            model_fn,\n            adv_x,\n            eps_iter,\n            norm,\n            clip_min=clip_min,\n            clip_max=clip_max,\n            y=y,\n            targeted=targeted,\n        )\n\n        # Clipping perturbation eta to norm norm ball\n        eta = adv_x - x\n        eta = clip_eta(eta, norm, eps)\n        adv_x = x + eta\n\n        # Redo the clipping.\n        # FGM already did it, but subtracting and re-adding eta can add some\n        # small numerical error.\n        if clip_min is not None or clip_max is not None:\n            adv_x = torch.clamp(adv_x, clip_min, clip_max)\n        i += 1\n\n    asserts.append(eps_iter <= eps)\n    if norm == np.inf and clip_min is not None:\n        # TODO necessary to cast clip_min and clip_max to x.dtype?\n        asserts.append(eps + clip_min <= clip_max)\n\n    if sanity_checks:\n        assert np.all(asserts)\n    return adv_x\n"
  },
  {
    "path": "cleverhans/torch/attacks/semantic.py",
    "content": "\"\"\"\nSemantic adversarial Examples\n\"\"\"\n\n\ndef semantic(x, center=True, max_val=1.0):\n    \"\"\"\n    Semantic adversarial examples.\n\n    https://arxiv.org/abs/1703.06857\n\n    Note: data must either be centered (so that the negative image can be\n    made by simple negation) or must be in the interval of [-1, 1]\n\n    Arguments\n    ---------\n    center : bool\n             If true, assumes data has 0 mean so the negative image is just negation.\n             If false, assumes data is in interval [0, max_val]\n    max_val : float\n              Maximum value allowed in the input data.\n    \"\"\"\n\n    if center:\n        return x * -1\n    return max_val - x\n"
  },
  {
    "path": "cleverhans/torch/attacks/sparse_l1_descent.py",
    "content": "\"\"\"The SparseL1Descent attack.\"\"\"\nimport numpy as np\nimport torch\n\nfrom cleverhans.torch.utils import zero_out_clipped_grads\n\n\ndef sparse_l1_descent(\n    model_fn,\n    x,\n    eps=10.0,\n    eps_iter=1.0,\n    nb_iter=20,\n    y=None,\n    targeted=False,\n    clip_min=None,\n    clip_max=None,\n    rand_init=False,\n    clip_grad=False,\n    grad_sparsity=99,\n    sanity_checks=True,\n):\n    \"\"\"\n    This class implements a variant of Projected Gradient Descent for the l1-norm\n    (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2\n    cases covered by the ProjectedGradientDescent class, because the steepest\n    descent direction for the l1-norm is too sparse (it updates a single\n    coordinate in the adversarial perturbation in each step). This attack has an\n    additional parameter that controls the sparsity of the update step. For\n    moderately sparse update steps, the attack vastly outperforms Projected\n    Steepest Descent and is competitive with other attacks targeted at the l1-norm\n    such as the ElasticNetMethod attack (which is much more computationally\n    expensive).\n    Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf\n\n    :param model_fn: a callable that takes an input tensor and returns the model logits.\n    :param x: input tensor.\n    :param eps: (optional float) maximum distortion of adversarial example\n        compared to original input\n    :param eps_iter: (optional float) step size for each attack iteration\n    :param nb_iter: (optional int) Number of attack iterations.\n    :param y: (optional) A tensor with the true labels.\n    :param targeted: (optional) bool. Is the attack targeted or untargeted?\n        Untargeted, the default, will try to make the label incorrect.\n        Targeted will instead try to move in the direction of being more like y.\n    :param clip_min: (optional float) Minimum input component value\n    :param clip_max: (optional float) Maximum input component value\n    :param clip_grad: (optional bool) Ignore gradient components\n        at positions where the input is already at the boundary\n        of the domain, and the update step will get clipped out.\n    :param grad_sparsity (optional) Relative sparsity of the gradient update\n        step, in percent. Only gradient values larger\n        than this percentile are retained. This parameter can\n        be a scalar, or a tensor of the same length as the\n        input batch dimension.\n    :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime /\n        memory or for unit tests that intentionally pass strange input)\n    :return: a tensor for the adversarial examples\n    \"\"\"\n    if clip_grad and (clip_min is None or clip_max is None):\n        raise ValueError(\"Must set clip_min and clip_max if clip_grad is set\")\n\n    # The grad_sparsity argument governs the sparsity of the gradient\n    # update. It indicates the percentile value above which gradient entries\n    # are retained. It can be specified as a scalar or as a 1-dimensional\n    # tensor of the same size as the input's batch dimension.\n    if isinstance(grad_sparsity, int) or isinstance(grad_sparsity, float):\n        if not 0 < grad_sparsity < 100:\n            raise ValueError(\"grad_sparsity should be in (0, 100)\")\n    else:\n        grad_sparsity = torch.tensor(grad_sparsity)\n        if len(grad_sparsity.shape) > 1:\n            raise ValueError(\"grad_sparsity should either be a scalar or a tensor\")\n        grad_sparsity = grad_sparsity.to(x.device)\n        if grad_sparsity.shape[0] != x.shape[0]:\n            raise ValueError(\n                \"grad_sparsity should have same length as input if it is a tensor\"\n            )\n\n    asserts = []\n\n    # eps_iter should be at most eps\n    asserts.append(eps_iter <= eps)\n\n    # If a data range was specified, check that the input was in that range\n    if clip_min is not None:\n        assert_ge = torch.all(\n            torch.ge(x, torch.tensor(clip_min, device=x.device, dtype=x.dtype))\n        )\n        asserts.append(assert_ge)\n\n    if clip_max is not None:\n        assert_le = torch.all(\n            torch.le(x, torch.tensor(clip_max, device=x.device, dtype=x.dtype))\n        )\n        asserts.append(assert_le)\n\n    if sanity_checks:\n        assert np.all(asserts)\n\n    # Initialize loop variables\n    if rand_init:\n        dist = torch.distributions.laplace.Laplace(\n            torch.tensor([1.0]), torch.tensor([1.0])\n        )\n        dim = torch.prod(torch.tensor(x.shape[1:]))\n        eta = dist.sample([x.shape[0], dim]).squeeze(-1).to(x.device)\n        norm = torch.sum(torch.abs(eta), axis=-1, keepdim=True)\n        w = torch.pow(\n            torch.rand(x.shape[0], 1, device=x.device), torch.tensor(1.0 / dim)\n        )\n        eta = torch.reshape(eps * (w * eta / norm), x.shape)\n    else:\n        eta = torch.zeros_like(x)\n\n    # Clip eta\n    adv_x = x.clone().detach().requires_grad_(True)\n    eta = eta.renorm(p=1, dim=0, maxnorm=eps)\n    adv_x = adv_x + eta\n\n    if clip_min is not None or clip_max is not None:\n        adv_x = torch.clamp(x, clip_min, clip_max)\n\n    if y is None:\n        y = torch.argmax(model_fn(x), 1)\n\n    criterion = torch.nn.CrossEntropyLoss(reduction=\"none\")\n    for i in range(nb_iter):\n        adv_x = adv_x.clone().detach().to(torch.float).requires_grad_(True)\n        logits = model_fn(adv_x)\n\n        # Compute loss\n        loss = criterion(logits, y)\n        if targeted:\n            loss = -loss\n\n        # Define gradient of loss wrt input\n        (grad,) = torch.autograd.grad(loss.mean(), [adv_x])\n\n        if clip_grad:\n            grad = zero_out_clipped_grads(grad, adv_x, clip_min, clip_max)\n\n        grad_view = grad.view(grad.shape[0], -1)\n        abs_grad = torch.abs(grad_view)\n\n        if isinstance(grad_sparsity, int) or isinstance(grad_sparsity, float):\n            k = int(grad_sparsity / 100.0 * abs_grad.shape[1])\n            percentile_value, _ = torch.kthvalue(abs_grad, k, keepdim=True)\n        else:\n            k = (grad_sparsity / 100.0 * abs_grad.shape[1]).long()\n            percentile_value, _ = torch.sort(abs_grad, dim=1)\n            percentile_value = percentile_value.gather(1, k.view(-1, 1))\n\n        percentile_value = percentile_value.repeat(1, grad_view.shape[1])\n        tied_for_max = torch.ge(abs_grad, percentile_value).int().float()\n        num_ties = torch.sum(tied_for_max, dim=1, keepdim=True)\n\n        optimal_perturbation = (torch.sign(grad_view) * tied_for_max) / num_ties\n        optimal_perturbation = optimal_perturbation.view(grad.shape)\n\n        # Add perturbation to original example to obtain adversarial example\n        adv_x = adv_x + optimal_perturbation * eps_iter\n\n        # If clipping is needed, reset all values outside of [clip_min, clip_max]\n        if clip_min is not None or clip_max is not None:\n            adv_x = torch.clamp(adv_x, clip_min, clip_max)\n\n        # Clipping perturbation eta to the l1-ball\n        eta = adv_x - x\n        eta = eta.renorm(p=1, dim=0, maxnorm=eps)\n        adv_x = x + eta\n\n        # Redo the clipping.\n        # Subtracting and re-adding eta can add some small numerical error.\n        if clip_min is not None or clip_max is not None:\n            adv_x = torch.clamp(adv_x, clip_min, clip_max)\n\n    return adv_x.detach()\n"
  },
  {
    "path": "cleverhans/torch/attacks/spsa.py",
    "content": "\"\"\"The SPSA attack.\"\"\"\nimport numpy as np\nimport torch\nfrom torch import optim\nfrom cleverhans.torch.utils import clip_eta\n\n\ndef spsa(\n    model_fn,\n    x,\n    eps,\n    nb_iter,\n    norm=np.inf,\n    clip_min=-np.inf,\n    clip_max=np.inf,\n    y=None,\n    targeted=False,\n    early_stop_loss_threshold=None,\n    learning_rate=0.01,\n    delta=0.01,\n    spsa_samples=128,\n    spsa_iters=1,\n    is_debug=False,\n    sanity_checks=True,\n):\n    \"\"\"\n    This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666\n    (Uesato et al. 2018). SPSA is a gradient-free optimization method, which is useful when\n    the model is non-differentiable, or more generally, the gradients do not point in useful\n    directions.\n\n    :param model_fn: A callable that takes an input tensor and returns the model logits.\n    :param x: Input tensor.\n    :param eps: The size of the maximum perturbation, measured in the L-infinity norm.\n    :param nb_iter: The number of optimization steps.\n    :param norm: Order of the norm (mimics NumPy). Possible values: np.inf, 1 or 2.\n    :param clip_min: If specified, the minimum input value.\n    :param clip_max: If specified, the maximum input value.\n    :param y: (optional) Tensor with true labels. If targeted is true, then provide the\n              target label. Otherwise, only provide this parameter if you'd like to use true\n              labels when crafting adversarial samples. Otherwise, model predictions are used\n              as labels to avoid the \"label leaking\" effect (explained in this paper:\n              https://arxiv.org/abs/1611.01236). Default is None.\n    :param targeted: (optional) bool. Is the attack targeted or untargeted? Untargeted, the\n              default, will try to make the label incorrect. Targeted will instead try to\n              move in the direction of being more like y.\n    :param early_stop_loss_threshold: A float or None. If specified, the attack will end as\n              soon as the loss is below `early_stop_loss_threshold`.\n    :param learning_rate: Learning rate of ADAM optimizer.\n    :param delta: Perturbation size used for SPSA approximation.\n    :param spsa_samples:  Number of inputs to evaluate at a single time. The true batch size\n              (the number of evaluated inputs for each update) is `spsa_samples *\n              spsa_iters`\n    :param spsa_iters:  Number of model evaluations before performing an update, where each\n              evaluation is on `spsa_samples` different inputs.\n    :param is_debug: If True, print the adversarial loss after each update.\n    :param sanity_checks: bool, if True, include asserts (Turn them off to use less runtime /\n              memory or for unit tests that intentionally pass strange input)\n    :return: a tensor for the adversarial example\n    \"\"\"\n\n    if y is not None and len(x) != len(y):\n        raise ValueError(\n            \"number of inputs {} is different from number of labels {}\".format(\n                len(x), len(y)\n            )\n        )\n    if y is None:\n        y = torch.argmax(model_fn(x), dim=1)\n\n    # The rest of the function doesn't support batches of size greater than 1,\n    # so if the batch is bigger we split it up.\n    if len(x) != 1:\n        adv_x = []\n        for x_single, y_single in zip(x, y):\n            adv_x_single = spsa(\n                model_fn=model_fn,\n                x=x_single.unsqueeze(0),\n                eps=eps,\n                nb_iter=nb_iter,\n                norm=norm,\n                clip_min=clip_min,\n                clip_max=clip_max,\n                y=y_single.unsqueeze(0),\n                targeted=targeted,\n                early_stop_loss_threshold=early_stop_loss_threshold,\n                learning_rate=learning_rate,\n                delta=delta,\n                spsa_samples=spsa_samples,\n                spsa_iters=spsa_iters,\n                is_debug=is_debug,\n                sanity_checks=sanity_checks,\n            )\n            adv_x.append(adv_x_single)\n        return torch.cat(adv_x)\n\n    if eps < 0:\n        raise ValueError(\n            \"eps must be greater than or equal to 0, got {} instead\".format(eps)\n        )\n    if eps == 0:\n        return x\n\n    if clip_min is not None and clip_max is not None:\n        if clip_min > clip_max:\n            raise ValueError(\n                \"clip_min must be less than or equal to clip_max, got clip_min={} and clip_max={}\".format(\n                    clip_min, clip_max\n                )\n            )\n\n    asserts = []\n\n    # If a data range was specified, check that the input was in that range\n    asserts.append(torch.all(x >= clip_min))\n    asserts.append(torch.all(x <= clip_max))\n\n    if is_debug:\n        print(\"Starting SPSA attack with eps = {}\".format(eps))\n\n    perturbation = (torch.rand_like(x) * 2 - 1) * eps\n    _project_perturbation(perturbation, norm, eps, x, clip_min, clip_max)\n    optimizer = optim.Adam([perturbation], lr=learning_rate)\n\n    for i in range(nb_iter):\n\n        def loss_fn(pert):\n            \"\"\"\n            Margin logit loss, with correct sign for targeted vs untargeted loss.\n            \"\"\"\n            logits = model_fn(x + pert)\n            loss_multiplier = 1 if targeted else -1\n            return loss_multiplier * _margin_logit_loss(logits, y.expand(len(pert)))\n\n        spsa_grad = _compute_spsa_gradient(\n            loss_fn, x, delta=delta, samples=spsa_samples, iters=spsa_iters\n        )\n        perturbation.grad = spsa_grad\n        optimizer.step()\n\n        _project_perturbation(perturbation, norm, eps, x, clip_min, clip_max)\n\n        loss = loss_fn(perturbation).item()\n        if is_debug:\n            print(\"Iteration {}: loss = {}\".format(i, loss))\n        if early_stop_loss_threshold is not None and loss < early_stop_loss_threshold:\n            break\n\n    adv_x = torch.clamp((x + perturbation).detach(), clip_min, clip_max)\n\n    if norm == np.inf:\n        asserts.append(torch.all(torch.abs(adv_x - x) <= eps + 1e-6))\n    else:\n        asserts.append(\n            torch.all(\n                torch.abs(\n                    torch.renorm(adv_x - x, p=norm, dim=0, maxnorm=eps) - (adv_x - x)\n                )\n                < 1e-6\n            )\n        )\n    asserts.append(torch.all(adv_x >= clip_min))\n    asserts.append(torch.all(adv_x <= clip_max))\n\n    if sanity_checks:\n        assert np.all(asserts)\n\n    return adv_x\n\n\ndef _project_perturbation(\n    perturbation, norm, epsilon, input_image, clip_min=-np.inf, clip_max=np.inf\n):\n    \"\"\"\n    Project `perturbation` onto L-infinity ball of radius `epsilon`. Also project into\n    hypercube such that the resulting adversarial example is between clip_min and clip_max,\n    if applicable. This is an in-place operation.\n    \"\"\"\n\n    clipped_perturbation = clip_eta(perturbation, norm, epsilon)\n    new_image = torch.clamp(input_image + clipped_perturbation, clip_min, clip_max)\n\n    perturbation.add_((new_image - input_image) - perturbation)\n\n\ndef _compute_spsa_gradient(loss_fn, x, delta, samples, iters):\n    \"\"\"\n    Approximately compute the gradient of `loss_fn` at `x` using SPSA with the\n    given parameters. The gradient is approximated by evaluating `iters` batches\n    of `samples` size each.\n    \"\"\"\n\n    assert len(x) == 1\n    num_dims = len(x.size())\n\n    x_batch = x.expand(samples, *([-1] * (num_dims - 1)))\n\n    grad_list = []\n    for i in range(iters):\n        delta_x = delta * torch.sign(torch.rand_like(x_batch) - 0.5)\n        delta_x = torch.cat([delta_x, -delta_x])\n        with torch.no_grad():\n            loss_vals = loss_fn(x + delta_x)\n        while len(loss_vals.size()) < num_dims:\n            loss_vals = loss_vals.unsqueeze(-1)\n        avg_grad = (\n            torch.mean(loss_vals * torch.sign(delta_x), dim=0, keepdim=True) / delta\n        )\n        grad_list.append(avg_grad)\n\n    return torch.mean(torch.cat(grad_list), dim=0, keepdim=True)\n\n\ndef _margin_logit_loss(logits, labels):\n    \"\"\"\n    Computes difference between logits for `labels` and next highest logits.\n\n    The loss is high when `label` is unlikely (targeted by default).\n    \"\"\"\n\n    correct_logits = logits.gather(1, labels[:, None]).squeeze(1)\n\n    logit_indices = torch.arange(\n        logits.size()[1],\n        dtype=labels.dtype,\n        device=labels.device,\n    )[None, :].expand(labels.size()[0], -1)\n    incorrect_logits = torch.where(\n        logit_indices == labels[:, None],\n        torch.full_like(logits, float(\"-inf\")),\n        logits,\n    )\n    max_incorrect_logits, _ = torch.max(incorrect_logits, 1)\n\n    return max_incorrect_logits - correct_logits\n"
  },
  {
    "path": "cleverhans/torch/tests/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans/torch/tests/test_attacks.py",
    "content": "# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport numpy as np\nfrom nose.plugins.skip import SkipTest\nimport torch\n\nfrom cleverhans.devtools.checks import CleverHansTest\nfrom cleverhans.torch.attacks.fast_gradient_method import fast_gradient_method\nfrom cleverhans.torch.attacks.projected_gradient_descent import (\n    projected_gradient_descent,\n)\nfrom cleverhans.torch.attacks.carlini_wagner_l2 import carlini_wagner_l2\nfrom cleverhans.torch.attacks.spsa import spsa\nfrom cleverhans.torch.attacks.hop_skip_jump_attack import hop_skip_jump_attack\nfrom cleverhans.torch.attacks.sparse_l1_descent import sparse_l1_descent\n\n\nclass TrivialModel(torch.nn.Module):\n    def __init__(self):\n        super(TrivialModel, self).__init__()\n        self.w1 = torch.tensor([[1.0, -1]])\n\n    def forward(self, x, **kwargs):\n        return torch.matmul(x, self.w1)\n\n\nclass SimpleModel(torch.nn.Module):\n    def __init__(self):\n        super(SimpleModel, self).__init__()\n        self.w1 = torch.tensor([[1.5, 0.3], [-2, 0.3]])\n        self.w2 = torch.tensor([[-2.4, 1.2], [0.5, -2.3]])\n\n    def forward(self, x):\n        x = torch.matmul(x, self.w1)\n        x = torch.sigmoid(x)\n        x = torch.matmul(x, self.w2)\n        return x\n\n\nclass DummyModel(torch.nn.Module):\n    def __init__(self, n_features):\n        super(DummyModel, self).__init__()\n        self.model = torch.nn.Sequential(\n            torch.nn.Linear(n_features, 60),\n            torch.nn.ReLU(),\n            torch.nn.Linear(60, 10),\n        )\n\n    def forward(self, x):\n        x = x.view(x.shape[0], -1)\n        return self.model(x)\n\n\nclass CommonAttackProperties(CleverHansTest):\n    def setUp(self):\n        super(CommonAttackProperties, self).setUp()\n        self.model = SimpleModel()\n        self.trivial_model = TrivialModel()\n        self.x = torch.randn(100, 2)\n        self.normalized_x = torch.rand(100, 2)  # truncated between [0, 1)\n        self.trivial_x = torch.randn(100, 1)\n        self.trivial_normalized_x = torch.rand(100, 1)  # truncated between [0, 1)\n        self.y_target = torch.randint(low=0, high=2, size=(100,))\n        self.ord_list = [1, 2, np.inf]\n\n    def help_adv_examples_success_rate(self, model, x, rate=0.5, **kwargs):\n        x_adv = self.attack(model_fn=model, x=x, **kwargs)\n        _, ori_label = model(x).max(1)\n        _, adv_label = model(x_adv).max(1)\n        adv_acc = adv_label.eq(ori_label).sum().to(torch.float) / x.size(0)\n        self.assertLess(adv_acc, rate)\n\n    def help_targeted_adv_examples_success_rate(self, model, x, rate=0.7, **kwargs):\n        x_adv = self.attack(\n            model_fn=model, x=x, y=self.y_target, targeted=True, **kwargs\n        )\n\n        _, adv_label = model(x_adv).max(1)\n        adv_success = adv_label.eq(self.y_target).sum().to(torch.float) / x.size(0)\n        self.assertGreater(adv_success, rate)\n\n\nclass TestFastGradientMethod(CommonAttackProperties):\n    def setUp(self):\n        super(TestFastGradientMethod, self).setUp()\n        self.attack = fast_gradient_method\n        self.eps_list = [0, 0.1, 0.3, 1.0, 3]\n        self.attack_param = {\"eps\": 0.5, \"clip_min\": -5, \"clip_max\": 5}\n\n    def test_invalid_input(self):\n        x = torch.tensor([[-2.0, 3.0]])\n        for norm in self.ord_list:\n            self.assertRaises(\n                AssertionError,\n                self.attack,\n                model_fn=self.model,\n                x=x,\n                eps=0.1,\n                norm=norm,\n                clip_min=-1.0,\n                clip_max=1.0,\n                sanity_checks=True,\n            )\n\n    def test_invalid_eps(self):\n        for norm in self.ord_list:\n            self.assertRaises(\n                ValueError,\n                self.attack,\n                model_fn=self.model,\n                x=self.x,\n                eps=-0.1,\n                norm=norm,\n            )\n\n    def test_eps_equals_zero(self):\n        for norm in self.ord_list:\n            self.assertClose(\n                self.attack(model_fn=self.model, x=self.x, eps=0, norm=norm), self.x\n            )\n\n    def test_eps(self):\n        # test if the attack respects the norm constraint\n        # NOTE this has been tested with the optimize_linear function in\n        # test_utils, so duplicate tests are not needed here.\n        # Although, if ever switch the engine of the FGM method to some\n        # function other than optimize_linear. This test should be added.\n        raise SkipTest()\n\n    def test_clips(self):\n        clip_min = -1.0\n        clip_max = 1.0\n        for norm in self.ord_list:\n            x_adv = self.attack(\n                model_fn=self.model,\n                x=self.normalized_x,\n                eps=0.3,\n                norm=norm,\n                clip_min=clip_min,\n                clip_max=clip_max,\n            )\n            self.assertTrue(torch.all(x_adv <= clip_max))\n            self.assertTrue(torch.all(x_adv >= clip_min))\n\n    def test_invalid_clips(self):\n        clip_min = 0.5\n        clip_max = -0.5\n        for norm in self.ord_list:\n            self.assertRaises(\n                ValueError,\n                self.attack,\n                model_fn=self.model,\n                x=self.x,\n                eps=0.1,\n                norm=norm,\n                clip_min=clip_min,\n                clip_max=clip_max,\n            )\n\n    def test_adv_example_success_rate_linf(self):\n        # use normalized_x to make sure the same eps gives uniformly high attack\n        # success rate across randomized tests\n        self.help_adv_examples_success_rate(\n            x=self.normalized_x, model=self.model, norm=np.inf, **self.attack_param\n        )\n\n    def test_targeted_adv_example_success_rate_linf(self):\n        self.help_targeted_adv_examples_success_rate(\n            x=self.normalized_x, model=self.model, norm=np.inf, **self.attack_param\n        )\n\n    def test_adv_example_success_rate_l1(self):\n        self.help_adv_examples_success_rate(\n            x=self.normalized_x, model=self.model, norm=1, **self.attack_param\n        )\n\n    def test_targeted_adv_example_success_rate_l1(self):\n        self.help_targeted_adv_examples_success_rate(\n            x=self.normalized_x, model=self.model, norm=1, **self.attack_param\n        )\n\n    def test_adv_example_success_rate_l2(self):\n        self.help_adv_examples_success_rate(\n            x=self.normalized_x, model=self.model, norm=2, **self.attack_param\n        )\n\n    def test_targeted_adv_example_success_rate_l2(self):\n        self.help_targeted_adv_examples_success_rate(\n            x=self.normalized_x, model=self.model, norm=2, **self.attack_param\n        )\n\n\nclass TestProjectedGradientMethod(CommonAttackProperties):\n    def setUp(self):\n        super(TestProjectedGradientMethod, self).setUp()\n        self.attack = projected_gradient_descent\n        self.attack_param = {\n            \"eps\": 0.5,\n            \"clip_min\": -5,\n            \"clip_max\": 5,\n            \"eps_iter\": 0.05,\n            \"nb_iter\": 20,\n        }\n\n    def test_invalid_input(self):\n        x = torch.tensor([[-2.0, 3.0]])\n        for norm in self.ord_list:\n            if norm == 1:\n                self.assertRaises(\n                    NotImplementedError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=x,\n                    eps=0.1,\n                    nb_iter=1,\n                    eps_iter=0.05,\n                    norm=norm,\n                    clip_min=-1.0,\n                    clip_max=1.0,\n                    sanity_checks=True,\n                )\n            else:\n                self.assertRaises(\n                    AssertionError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=x,\n                    eps=0.1,\n                    nb_iter=1,\n                    eps_iter=0.05,\n                    norm=norm,\n                    clip_min=-1.0,\n                    clip_max=1.0,\n                    sanity_checks=True,\n                )\n\n    def test_invalid_eps(self):\n        for norm in self.ord_list:\n            if norm == 1:\n                self.assertRaises(\n                    NotImplementedError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=self.x,\n                    eps=-0.1,\n                    norm=norm,\n                    nb_iter=1,\n                    eps_iter=0.01,\n                )\n            else:\n                self.assertRaises(\n                    ValueError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=self.x,\n                    eps=-0.1,\n                    norm=norm,\n                    nb_iter=1,\n                    eps_iter=0.01,\n                )\n\n    def test_invalid_eps_iter(self):\n        for norm in self.ord_list:\n            if norm == 1:\n                self.assertRaises(\n                    NotImplementedError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=self.x,\n                    eps=0.1,\n                    norm=norm,\n                    nb_iter=1,\n                    eps_iter=-0.01,\n                )\n            else:\n                self.assertRaises(\n                    ValueError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=self.x,\n                    eps=0.1,\n                    norm=norm,\n                    nb_iter=1,\n                    eps_iter=-0.01,\n                )\n\n    def test_eps_equals_zero(self):\n        for norm in self.ord_list:\n            if norm == 1:\n                self.assertRaises(\n                    NotImplementedError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=self.x,\n                    eps=0,\n                    norm=norm,\n                    nb_iter=10,\n                    eps_iter=0.01,\n                )\n            else:\n                self.assertClose(\n                    self.attack(\n                        model_fn=self.model,\n                        x=self.x,\n                        eps=0,\n                        norm=norm,\n                        nb_iter=10,\n                        eps_iter=0.01,\n                    ),\n                    self.x,\n                )\n\n    def test_eps_iter_equals_zero(self):\n        for norm in self.ord_list:\n            if norm == 1:\n                self.assertRaises(\n                    NotImplementedError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=self.x,\n                    eps=0.5,\n                    norm=norm,\n                    nb_iter=10,\n                    eps_iter=0,\n                )\n            else:\n                self.assertClose(\n                    self.attack(\n                        model_fn=self.model,\n                        x=self.x,\n                        eps=0.5,\n                        norm=norm,\n                        nb_iter=10,\n                        eps_iter=0,\n                    ),\n                    self.x,\n                )\n\n    def test_invalid_clips(self):\n        clip_min = 0.5\n        clip_max = -0.5\n        for norm in self.ord_list:\n            if norm == 1:\n                self.assertRaises(\n                    NotImplementedError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=self.x,\n                    eps=0.1,\n                    norm=norm,\n                    clip_min=clip_min,\n                    clip_max=clip_max,\n                    nb_iter=10,\n                    eps_iter=0.01,\n                )\n            else:\n                self.assertRaises(\n                    ValueError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=self.x,\n                    eps=0.1,\n                    norm=norm,\n                    clip_min=clip_min,\n                    clip_max=clip_max,\n                    nb_iter=10,\n                    eps_iter=0.01,\n                )\n\n    def test_adv_example_success_rate_linf(self):\n        # use normalized_x to make sure the same eps gives uniformly high attack\n        # success rate across randomized tests\n        self.help_adv_examples_success_rate(\n            x=self.normalized_x, model=self.model, norm=np.inf, **self.attack_param\n        )\n\n    def test_targeted_adv_example_success_rate_linf(self):\n        self.help_targeted_adv_examples_success_rate(\n            x=self.normalized_x, model=self.model, norm=np.inf, **self.attack_param\n        )\n\n    def test_adv_example_success_rate_l1(self):\n        self.assertRaises(\n            NotImplementedError,\n            self.help_adv_examples_success_rate,\n            model=self.model,\n            x=self.normalized_x,\n            norm=1,\n            **self.attack_param\n        )\n        # TODO uncomment the actual test below after we have implemented the L1 attack\n        # self.help_adv_examples_success_rate(x=self.normalized_x,\n        #     model=self.model, norm=1, **self.attack_param)\n\n    def test_targeted_adv_example_success_rate_l1(self):\n        self.assertRaises(\n            NotImplementedError,\n            self.help_targeted_adv_examples_success_rate,\n            x=self.normalized_x,\n            model=self.model,\n            norm=1,\n            **self.attack_param\n        )\n        # TODO uncomment the actual test below after we have implemented the L1 attack\n        # self.help_targeted_adv_examples_success_rate(x=self.normalized_x,\n        #     model=self.model, norm=1, **self.attack_param)\n\n    def test_adv_example_success_rate_l2(self):\n        self.help_adv_examples_success_rate(\n            model=self.model, x=self.normalized_x, norm=2, **self.attack_param\n        )\n\n    def test_targeted_adv_example_success_rate_l2(self):\n        self.help_targeted_adv_examples_success_rate(\n            model=self.model, x=self.normalized_x, norm=2, **self.attack_param\n        )\n\n    def test_do_not_reach_lp_boundary(self):\n        for norm in self.ord_list:\n            if norm == 1:\n                self.assertRaises(\n                    NotImplementedError,\n                    self.attack,\n                    model_fn=self.model,\n                    x=self.normalized_x,\n                    eps=0.5,\n                    nb_iter=10,\n                    norm=norm,\n                    eps_iter=0.01,\n                )\n                continue\n            else:\n                x_adv = self.attack(\n                    model_fn=self.model,\n                    x=self.normalized_x,\n                    eps=0.5,\n                    nb_iter=10,\n                    norm=norm,\n                    eps_iter=0.01,\n                )\n\n            if norm == np.inf:\n                delta, _ = torch.abs(x_adv - self.normalized_x).max(dim=1)\n            elif norm == 1:\n                delta = torch.abs(x_adv - self.normalized_x).sum(dim=1)\n            elif norm == 2:\n                delta = torch.pow(x_adv - self.normalized_x, 2).sum(dim=1).pow(0.5)\n            diff = torch.max(0.5 - delta)\n            self.assertTrue(diff > 0.25)\n\n    def test_attack_strength(self):\n        x_adv = self.attack(\n            model_fn=self.model,\n            x=self.normalized_x,\n            eps=1.0,\n            eps_iter=0.05,\n            norm=np.inf,\n            clip_min=0.5,\n            clip_max=0.7,\n            nb_iter=5,\n            sanity_checks=False,\n        )\n        _, ori_label = self.model(self.normalized_x).max(1)\n        _, adv_label = self.model(x_adv).max(1)\n        adv_acc = adv_label.eq(ori_label).sum().to(\n            torch.float\n        ) / self.normalized_x.size(0)\n        self.assertLess(adv_acc, 0.1)\n\n    def test_eps(self):\n        # test if the attack respects the norm constraint\n        # NOTE clip_eta makes sure that at each step, adv_x respects the eps\n        # norm constraint. Therefore, this is essentially a test on clip_eta,\n        # which is implemented in a separate test_clip_eta\n        raise SkipTest()\n\n    def test_clip_eta(self):\n        # NOTE: this has been tested with test_clip_eta in test_utils\n        raise SkipTest()\n\n    def test_clips(self):\n        clip_min = -1.0\n        clip_max = 1.0\n        for norm in self.ord_list:\n            if norm == 1:\n                self.assertRaises(\n                    NotImplementedError,\n                    model_fn=self.model,\n                    x=self.normalized_x,\n                    eps=0.3,\n                    eps_iter=0.03,\n                    norm=norm,\n                    nb_iter=10,\n                    clip_min=clip_min,\n                    clip_max=clip_max,\n                )\n                continue\n            else:\n                x_adv = self.attack(\n                    model_fn=self.model,\n                    x=self.normalized_x,\n                    eps=0.3,\n                    eps_iter=0.03,\n                    norm=norm,\n                    nb_iter=10,\n                    clip_min=clip_min,\n                    clip_max=clip_max,\n                )\n            self.assertTrue(torch.all(x_adv <= clip_max))\n            self.assertTrue(torch.all(x_adv >= clip_min))\n\n    def test_attack_does_not_cache_graph_computation_for_nb_iter(self):\n        # TODO not sure what the original test does in tests_tf/test_attacks\n        pass\n\n    def test_multiple_initial_random_step(self):\n        _, ori_label = self.model(self.normalized_x).max(1)\n        new_label_multi = ori_label.clone().detach()\n\n        for _ in range(10):\n            x_adv = self.attack(\n                model_fn=self.model,\n                x=self.normalized_x,\n                eps=0.5,\n                eps_iter=0.05,\n                norm=np.inf,\n                clip_min=0.5,\n                clip_max=0.7,\n                nb_iter=2,\n                sanity_checks=False,\n            )\n            _, new_label = self.model(x_adv).max(1)\n\n            # examples for which we have not found adversarial examples\n            i = ori_label.eq(new_label_multi)\n            new_label_multi[i] = new_label[i]\n\n        failed_attack = ori_label.eq(new_label_multi).sum().to(\n            torch.float\n        ) / self.normalized_x.size(0)\n        self.assertLess(failed_attack, 0.5)\n\n\nclass TestCarliniWagnerL2(CommonAttackProperties):\n    def setUp(self):\n        super(TestCarliniWagnerL2, self).setUp()\n        self.attack = carlini_wagner_l2\n        self.attack_param = {\n            \"n_classes\": 2,\n            \"max_iterations\": 100,\n            \"binary_search_steps\": 3,\n            \"initial_const\": 1,\n        }\n\n    def test_adv_example_success_rate(self):\n        self.help_adv_examples_success_rate(\n            model=self.model,\n            x=self.normalized_x,\n            rate=0.1,\n            clip_min=-5,\n            clip_max=5,\n            **self.attack_param\n        )\n\n    def test_targeted_adv_example_success_rate(self):\n        self.help_targeted_adv_examples_success_rate(\n            model=self.model,\n            x=self.normalized_x,\n            rate=0.9,\n            clip_min=-5,\n            clip_max=5,\n            **self.attack_param\n        )\n\n    def test_adv_examples_clipped_successfully(self):\n        x_adv = self.attack(\n            model_fn=self.model,\n            x=self.normalized_x,\n            clip_min=-0.2,\n            clip_max=0.3,\n            **self.attack_param\n        )\n        self.assertGreater(torch.min(x_adv), -0.201)\n        self.assertLess(torch.max(x_adv), 0.301)\n\n    def test_high_confidence_adv_example(self):\n        from copy import copy\n\n        attack_param_copy = copy(self.attack_param)\n        attack_param_copy[\"binary_search_steps\"] = 2\n\n        x = self.trivial_normalized_x - 0.5\n        _, y = self.trivial_model(x).max(1)\n\n        for confidence in [0, 2.3]:\n            x_adv = self.attack(\n                model_fn=self.trivial_model,\n                x=x,\n                lr=1e-2,\n                clip_min=-10,\n                clip_max=10,\n                confidence=confidence,\n                **attack_param_copy\n            )\n            logits = self.trivial_model(x_adv)\n            target = logits[range(len(logits)), 1 - y]\n            other = logits[range(len(logits)), y]\n            self.assertClose(confidence, torch.min(target - other).detach(), atol=1e-1)\n            self.assertTrue(\n                torch.argmax(logits, 1).eq(y).sum().to(torch.float) / len(logits) == 0\n            )\n\n    def test_high_confidence_targeted_adv_example(self):\n        from copy import copy\n\n        attack_param_copy = copy(self.attack_param)\n        attack_param_copy[\"binary_search_steps\"] = 2\n\n        for confidence in [0, 2.3]:\n            x_adv = self.attack(\n                model_fn=self.trivial_model,\n                x=self.trivial_normalized_x - 0.5,\n                lr=1e-2,\n                clip_min=-10,\n                clip_max=10,\n                targeted=True,\n                y=self.y_target,\n                confidence=confidence,\n                **attack_param_copy\n            )\n            logits = self.trivial_model(x_adv)\n            target = logits[range(len(logits)), self.y_target]\n            other = logits[range(len(logits)), 1 - self.y_target]\n            self.assertClose(confidence, torch.min(target - other).detach(), atol=1e-1)\n            self.assertGreater(\n                torch.argmax(logits, 1).eq(self.y_target).sum().to(torch.float)\n                / len(logits),\n                0.9,\n            )\n\n\nclass TestSPSA(CommonAttackProperties):\n    def setUp(self):\n        super(TestSPSA, self).setUp()\n        self.attack = spsa\n        self.attack_param = {\n            \"eps\": 0.5,\n            \"clip_min\": -5,\n            \"clip_max\": 5,\n            \"nb_iter\": 50,\n            \"model\": self.model,\n            \"x\": self.normalized_x,\n        }\n\n    def test_invalid_input(self):\n        x = torch.tensor([[-20.0, 30.0]])\n        self.assertRaises(\n            AssertionError,\n            self.attack,\n            model_fn=self.model,\n            x=x,\n            eps=0.1,\n            nb_iter=1,\n            clip_min=-1.0,\n            clip_max=1.0,\n            sanity_checks=True,\n        )\n\n    def test_invalid_eps(self):\n        self.assertRaises(\n            ValueError, self.attack, model_fn=self.model, x=self.x, eps=-0.1, nb_iter=1\n        )\n\n    def test_eps_equals_zero(self):\n        self.assertClose(\n            self.attack(model_fn=self.model, x=self.x, eps=0, nb_iter=10), self.x\n        )\n\n    def test_invalid_clips(self):\n        self.assertRaises(\n            ValueError,\n            self.attack,\n            model_fn=self.model,\n            x=self.x,\n            eps=0.1,\n            clip_min=0.5,\n            clip_max=-0.5,\n            nb_iter=10,\n        )\n\n    def test_adv_example_success_rate_linf(self):\n        # use normalized_x to make sure the same eps gives uniformly high attack\n        # success rate across randomized tests\n        self.help_adv_examples_success_rate(**self.attack_param)\n\n    def test_targeted_adv_example_success_rate_linf(self):\n        self.help_targeted_adv_examples_success_rate(**self.attack_param)\n\n    def test_adv_example_success_rate_l1(self):\n        self.assertRaises(\n            NotImplementedError,\n            self.help_adv_examples_success_rate,\n            norm=1,\n            **self.attack_param\n        )\n        # TODO uncomment the actual test below after we have implemented the L1 attack\n        # self.help_adv_examples_success_rate(\n        #     norm=1, **self.attack_param)\n\n    def test_targeted_adv_example_success_rate_l1(self):\n        self.assertRaises(\n            NotImplementedError,\n            self.help_targeted_adv_examples_success_rate,\n            norm=1,\n            **self.attack_param\n        )\n        # TODO uncomment the actual test below after we have implemented the L1 attack\n        # self.help_targeted_adv_examples_success_rate(\n        #     norm=1, **self.attack_param)\n\n    def test_adv_example_success_rate_l2(self):\n        self.help_adv_examples_success_rate(norm=2, **self.attack_param)\n\n    def test_targeted_adv_example_success_rate_l2(self):\n        self.help_targeted_adv_examples_success_rate(norm=2, **self.attack_param)\n\n    def test_attack_strength(self):\n        x_adv = self.attack(\n            model_fn=self.model,\n            x=self.normalized_x,\n            eps=1.0,\n            clip_min=0.5,\n            clip_max=0.7,\n            nb_iter=20,\n            sanity_checks=False,\n        )\n        _, ori_label = self.model(self.normalized_x).max(1)\n        _, adv_label = self.model(x_adv).max(1)\n        adv_acc = adv_label.eq(ori_label).sum().to(\n            torch.float\n        ) / self.normalized_x.size(0)\n        self.assertLess(adv_acc, 0.1)\n\n    def test_eps(self):\n        x_adv = self.attack(\n            model_fn=self.model, x=self.normalized_x, eps=0.5, nb_iter=10\n        )\n        delta, _ = torch.abs(x_adv - self.normalized_x).max(dim=1)\n        self.assertTrue(torch.all(delta <= 0.5 + 1e-6))\n\n    def test_clips(self):\n        clip_min = -1.0\n        clip_max = 1.0\n        x_adv = self.attack(\n            model_fn=self.model,\n            x=self.normalized_x,\n            eps=0.3,\n            nb_iter=10,\n            clip_min=clip_min,\n            clip_max=clip_max,\n        )\n        self.assertTrue(torch.all(x_adv <= clip_max))\n        self.assertTrue(torch.all(x_adv >= clip_min))\n\n\nclass TestHopSkipJumpAttack(CommonAttackProperties):\n    def setUp(self):\n        super(TestHopSkipJumpAttack, self).setUp()\n        self.attack = hop_skip_jump_attack\n\n    def test_generate_np_untargeted_l2(self):\n        x_val = torch.rand(50, 2)\n        bapp_params = {\n            \"norm\": 2,\n            \"stepsize_search\": \"geometric_progression\",\n            \"num_iterations\": 10,\n            \"verbose\": True,\n        }\n        x_adv = self.attack(model_fn=self.model, x=x_val, **bapp_params)\n\n        _, ori_label = self.model(x_val).max(1)\n        _, adv_label = self.model(x_adv).max(1)\n        adv_acc = adv_label.eq(ori_label).sum().to(torch.float) / x_val.size(0)\n\n        self.assertLess(adv_acc, 0.1)\n\n    def test_generate_untargeted_linf(self):\n        x_val = torch.rand(50, 2)\n        bapp_params = {\n            \"norm\": np.inf,\n            \"stepsize_search\": \"grid_search\",\n            \"num_iterations\": 10,\n            \"verbose\": True,\n        }\n        x_adv = self.attack(model_fn=self.model, x=x_val, **bapp_params)\n\n        _, ori_label = self.model(x_val).max(1)\n        _, adv_label = self.model(x_adv).max(1)\n        adv_acc = adv_label.eq(ori_label).sum().to(torch.float) / x_val.size(0)\n\n        self.assertLess(adv_acc, 0.1)\n\n    def test_generate_np_targeted_linf(self):\n        x_val = torch.rand(200, 2)\n\n        _, ori_label = self.model(x_val).max(1)\n        x_val_pos = x_val[ori_label == 1]\n        x_val_neg = x_val[ori_label == 0]\n\n        x_val_under_attack = torch.cat((x_val_pos[:25], x_val_neg[:25]), dim=0)\n        y_target = torch.cat(\n            [torch.zeros(25, dtype=torch.int64), torch.ones(25, dtype=torch.int64)]\n        )\n        image_target = torch.cat((x_val_neg[25:50], x_val_pos[25:50]), dim=0)\n\n        bapp_params = {\n            \"norm\": np.inf,\n            \"stepsize_search\": \"geometric_progression\",\n            \"num_iterations\": 10,\n            \"verbose\": True,\n            \"y_target\": y_target,\n            \"image_target\": image_target,\n        }\n        x_adv = self.attack(model_fn=self.model, x=x_val_under_attack, **bapp_params)\n\n        _, new_labs = self.model(x_adv).max(1)\n\n        adv_acc = new_labs.eq(y_target).sum().to(torch.float) / y_target.size(0)\n\n        self.assertGreater(adv_acc, 0.9)\n\n    def test_generate_targeted_l2(self):\n        # Create data in numpy arrays.\n        x_val = torch.rand(200, 2)\n\n        _, ori_label = self.model(x_val).max(1)\n        x_val_pos = x_val[ori_label == 1]\n        x_val_neg = x_val[ori_label == 0]\n\n        x_val_under_attack = torch.cat((x_val_pos[:25], x_val_neg[:25]), dim=0)\n        y_target = torch.cat(\n            [torch.zeros(25, dtype=torch.int64), torch.ones(25, dtype=torch.int64)]\n        )\n        image_target = torch.cat((x_val_neg[25:50], x_val_pos[25:50]), dim=0)\n\n        # Create graph.\n        bapp_params = {\n            \"norm\": \"l2\",\n            \"stepsize_search\": \"grid_search\",\n            \"num_iterations\": 10,\n            \"verbose\": True,\n            \"y_target\": y_target,\n            \"image_target\": image_target,\n        }\n        x_adv = self.attack(model_fn=self.model, x=x_val_under_attack, **bapp_params)\n\n        _, new_labs = self.model(x_adv).max(1)\n\n        adv_acc = new_labs.eq(y_target).sum().to(torch.float) / y_target.size(0)\n\n        self.assertGreater(adv_acc, 0.9)\n\n\nclass TestSparseL1Descent(CommonAttackProperties):\n    def setUp(self):\n        super(TestSparseL1Descent, self).setUp()\n        self.attack = sparse_l1_descent\n\n    def generate_adversarial_examples(self, **kwargs):\n        x_adv = self.attack(model_fn=self.model, x=self.normalized_x, **kwargs)\n        _, ori_label = self.model(self.normalized_x).max(1)\n        _, adv_label = self.model(x_adv).max(1)\n        adv_acc = adv_label.eq(ori_label).sum().to(\n            torch.float\n        ) / self.normalized_x.size(0)\n\n        delta = torch.sum(torch.abs(x_adv - self.normalized_x), dim=1)\n        return x_adv, delta, adv_acc\n\n    def generate_targeted_adversarial_examples(self, **kwargs):\n        y_target = torch.randint(low=0, high=2, size=(self.normalized_x.size(0),))\n        x_adv = self.attack(\n            model_fn=self.model,\n            x=self.normalized_x,\n            y=y_target,\n            targeted=True,\n            **kwargs\n        )\n\n        _, adv_label = self.model(x_adv).max(1)\n        adv_success = adv_label.eq(y_target).sum().to(\n            torch.float\n        ) / self.normalized_x.size(0)\n\n        delta = torch.sum(torch.abs(x_adv - self.normalized_x), dim=1)\n        return x_adv, delta, adv_success\n\n    def test_invalid_input(self):\n        x_val = -torch.ones((2, 2))\n        with self.assertRaises(AssertionError):\n            self.attack(self.model, x_val, eps=10.0, clip_min=0.0, clip_max=1.0)\n\n    def test_gives_adversarial_example(self):\n        _, delta, adv_acc = self.generate_adversarial_examples(\n            eps=2, clip_min=-5, clip_max=5\n        )\n        self.assertLess(adv_acc, 0.5)\n        self.assertLess(torch.max(torch.abs(delta - 2)), 1e-3)\n\n    def test_targeted_gives_adversarial_example(self):\n        _, delta, adv_acc = self.generate_targeted_adversarial_examples(\n            eps=10, clip_min=-5, clip_max=5\n        )\n        self.assertGreater(adv_acc, 0.7)\n        self.assertLessEqual(torch.max(delta), 10.001)\n\n    def test_can_be_called_with_different_eps(self):\n        for eps in [10, 20, 30, 40]:\n            _, delta, _ = self.generate_adversarial_examples(\n                eps=eps, clip_min=-5, clip_max=5\n            )\n            self.assertLessEqual(torch.max(delta), eps + 1e-4)\n\n    def test_clip_works_as_expected(self):\n        x_adv, _, _ = self.generate_adversarial_examples(\n            eps=10,\n            nb_iter=20,\n            rand_init=True,\n            clip_min=-0.2,\n            clip_max=0.1,\n            sanity_checks=False,\n        )\n\n        self.assertClose(torch.min(x_adv), -0.2)\n        self.assertClose(torch.max(x_adv), 0.1)\n\n    def test_do_not_reach_lp_boundary(self):\n        \"\"\"\n        Make sure that iterative attack don't reach boundary of Lp\n        neighbourhood if nb_iter * eps_iter is relatively small compared to\n        epsilon.\n        \"\"\"\n        _, delta, _ = self.generate_adversarial_examples(\n            eps=0.5, clip_min=-5, clip_max=5, nb_iter=10, eps_iter=0.01\n        )\n        self.assertTrue(torch.max(0.5 - delta) > 0.25)\n\n    def test_generate_np_gives_clipped_adversarial_examples(self):\n        x_adv, _, _ = self.generate_adversarial_examples(\n            eps=1.0,\n            eps_iter=0.1,\n            nb_iter=5,\n            clip_min=-0.2,\n            clip_max=0.3,\n            sanity_checks=False,\n        )\n\n        self.assertLess(-0.201, torch.min(x_adv))\n        self.assertLess(torch.max(x_adv), 0.301)\n\n    def test_clip_eta(self):\n        _, delta, _ = self.generate_adversarial_examples(\n            eps=1, clip_min=-5, clip_max=5, nb_iter=5, eps_iter=0.1\n        )\n\n        # this projection is less numerically stable so give it some slack\n        self.assertLessEqual(torch.max(delta), 1.0 + 1e-6)\n\n    def test_attack_strength(self):\n        # sanity checks turned off because this test initializes outside\n        # the valid range.\n        _, _, adv_acc = self.generate_adversarial_examples(\n            eps=10,\n            rand_init=True,\n            clip_min=0.5,\n            clip_max=0.7,\n            nb_iter=10,\n            sanity_checks=False,\n        )\n\n        self.assertLess(adv_acc, 0.4)\n\n    def test_grad_clip(self):\n        \"\"\"\n        With clipped gradients, we achieve\n        np.mean(orig_labels == new_labels) == 0.0\n        \"\"\"\n\n        # sanity checks turned off because this test initializes outside\n        # the valid range.\n        _, _, adv_acc = self.generate_adversarial_examples(\n            eps=10,\n            rand_init=True,\n            clip_grad=True,\n            clip_min=0.5,\n            clip_max=0.7,\n            nb_iter=10,\n            sanity_checks=False,\n        )\n        self.assertLess(adv_acc, 0.1)\n\n    def test_sparsity(self):\n        # use a model with larger input dimensionality for this test.\n        model_fn = DummyModel(1000)\n        x_val = torch.rand(100, 1000)\n\n        for q in [1, 9, 25.8, 50, 75.4, 90.2, 99, 99.9]:\n            x_adv = self.attack(\n                model_fn,\n                x_val,\n                eps=5.0,\n                grad_sparsity=q,\n                nb_iter=1,\n                sanity_checks=False,\n            )\n\n            numzero = torch.sum(x_adv - x_val == 0, dim=-1).float()\n            self.assertAlmostEqual(q * 1000.0 / 100.0, torch.mean(numzero), delta=1)\n\n    def test_grad_sparsity_checks(self):\n        # test that the attacks allows `grad_sparsity` to be specified as a scalar\n        # in (0, 100) or as a vector.\n\n        # scalar values out of range\n        with self.assertRaises(ValueError):\n            self.generate_adversarial_examples(grad_sparsity=0)\n\n        with self.assertRaises(ValueError):\n            self.generate_adversarial_examples(grad_sparsity=100)\n\n        # sparsity as 2D array should fail\n        with self.assertRaises(ValueError):\n            gs = torch.empty(100, 2).uniform_(90, 99)\n            self.generate_adversarial_examples(sanity_checks=False, grad_sparsity=gs)\n\n        # sparsity as 1D array should succeed\n        gs = torch.empty(100).uniform_(90, 99)\n        self.generate_adversarial_examples(sanity_checks=False, grad_sparsity=gs)\n\n        # sparsity vector of wrong size should fail\n        with self.assertRaises(ValueError) as context:\n            gs = torch.empty(101).uniform_(90, 99)\n            self.generate_adversarial_examples(sanity_checks=False, grad_sparsity=gs)\n"
  },
  {
    "path": "cleverhans/torch/tests/test_utils.py",
    "content": "# pylint: disable=missing-docstring\nimport numpy as np\nimport torch\n\nimport cleverhans.torch.utils as utils\nfrom cleverhans.devtools.checks import CleverHansTest\n\n\nclass TestOptimizeLinear(CleverHansTest):\n    \"\"\"\n    Identical to the TestOptimizeLinear in tests_tf/test_attacks.\n    \"\"\"\n\n    def setUp(self):\n        super(TestOptimizeLinear, self).setUp()\n        self.clip_eta = utils.clip_eta\n        self.rand_grad = torch.randn(100, 3, 2)\n        self.rand_eta = torch.randn(100, 3, 2)\n        self.red_ind = list(range(1, len(self.rand_grad.size())))\n        # eps needs to be nonnegative\n        self.eps_list = [0, 0.1, 1.0, 3]\n\n    def test_optimize_linear_linf(self):\n        grad = torch.tensor([[1.0, -2.0]])\n        eta = utils.optimize_linear(grad, eps=1.0, norm=np.inf)\n        objective = torch.sum(grad * eta)\n\n        self.assertEqual(grad.size(), eta.size())\n        self.assertClose(objective, grad.abs().sum())\n        self.assertClose(eta.abs(), 1.0)\n\n    def test_optimize_linear_l2(self):\n        grad = torch.tensor([[0.5 ** 0.5, -(0.5 ** 0.5)]])\n        eta = utils.optimize_linear(grad, eps=1.0, norm=2)\n        objective = torch.sum(grad * eta)\n\n        self.assertEqual(grad.size(), eta.size())\n        self.assertClose(objective, 1.0)\n        self.assertClose(eta.pow(2).sum().sqrt(), 1.0)\n\n    def test_optimize_linear_l1(self):\n        grad = torch.tensor([[1.0, -2.0]])\n        eta = utils.optimize_linear(grad, eps=1.0, norm=1)\n        objective = torch.sum(grad * eta)\n\n        self.assertEqual(grad.size(), eta.size())\n        self.assertClose(objective, 2.0)\n        self.assertClose(eta.abs().sum(), 1.0)\n\n    def test_optimize_linear_l1_ties(self):\n        grad = torch.tensor([[2.0, -2.0]])\n        eta = utils.optimize_linear(grad, eps=1.0, norm=1)\n        objective = torch.sum(grad * eta)\n\n        self.assertEqual(grad.size(), eta.size())\n        self.assertClose(objective, 2.0)\n        self.assertClose(eta.abs().sum(), 1.0)\n\n    def test_optimize_linear_linf_satisfies_norm_constraint(self):\n        for eps in self.eps_list:\n            eta = utils.optimize_linear(self.rand_grad, eps=eps, norm=np.inf)\n            self.assertClose(eta.abs(), eps)\n\n    def test_optimize_linear_l1_satisfies_norm_constraint(self):\n        for eps in self.eps_list:\n            eta = utils.optimize_linear(self.rand_grad, eps=eps, norm=1)\n            norm = eta.abs().sum(dim=self.red_ind)\n            self.assertTrue(torch.allclose(norm, eps * torch.ones_like(norm)))\n\n    def test_optimize_linear_l2_satisfies_norm_constraint(self):\n        for eps in self.eps_list:\n            eta = utils.optimize_linear(self.rand_grad, eps=eps, norm=2)\n            # optimize_linear uses avoid_zero_div as the divisor for\n            # gradients with overly small l2 norms when performing norm\n            # normalizations on the gradients so as to safeguard against\n            # zero division error. Therefore, the replaced gradient vectors\n            # will not be l2-unit vectors after normalization. In this test,\n            # these gradients are filtered out by the one_mask\n            # below and are not tested.\n            # NOTE the value of avoid_zero_div should be the same as the\n            # avoid_zero_div used in the optimize_linear function\n            avoid_zero_div = torch.tensor(1e-12)\n            square = torch.max(\n                avoid_zero_div,\n                torch.sum(self.rand_grad ** 2, self.red_ind, keepdim=True),\n            )\n            norm = eta.pow(2).sum(dim=self.red_ind, keepdim=True).sqrt()\n            one_mask = (square <= avoid_zero_div).to(torch.float) * norm + (\n                square > avoid_zero_div\n            ).to(torch.float)\n            self.assertTrue(torch.allclose(norm, eps * one_mask))\n\n    def test_clip_eta_linf(self):\n        clipped = self.clip_eta(eta=self.rand_eta, norm=np.inf, eps=0.5)\n        self.assertTrue(torch.all(clipped <= 0.5))\n        self.assertTrue(torch.all(clipped >= -0.5))\n\n    def test_clip_eta_l1(self):\n        self.assertRaises(\n            NotImplementedError, self.clip_eta, eta=self.rand_eta, norm=1, eps=0.5\n        )\n\n        # TODO uncomment the actual test below after we have implemented the L1 attack\n        # clipped = self.clip_eta(eta=self.rand_eta, norm=1, eps=.5)\n        # norm = clipped.abs().sum(dim=self.red_ind)\n        # self.assertTrue(torch.all(norm <= .5001))\n\n    def test_clip_eta_l2(self):\n        clipped = self.clip_eta(eta=self.rand_eta, norm=2, eps=0.5)\n        norm = clipped.pow(2).sum(dim=self.red_ind).pow(0.5)\n        self.assertTrue(torch.all(norm <= 0.5001))\n"
  },
  {
    "path": "cleverhans/torch/utils.py",
    "content": "\"\"\"Utils for PyTorch\"\"\"\n\nimport numpy as np\n\nimport torch\n\n\ndef clip_eta(eta, norm, eps):\n    \"\"\"\n    PyTorch implementation of the clip_eta in utils_tf.\n\n    :param eta: Tensor\n    :param norm: np.inf, 1, or 2\n    :param eps: float\n    \"\"\"\n    if norm not in [np.inf, 1, 2]:\n        raise ValueError(\"norm must be np.inf, 1, or 2.\")\n\n    avoid_zero_div = torch.tensor(1e-12, dtype=eta.dtype, device=eta.device)\n    reduc_ind = list(range(1, len(eta.size())))\n    if norm == np.inf:\n        eta = torch.clamp(eta, -eps, eps)\n    else:\n        if norm == 1:\n            raise NotImplementedError(\"L1 clip is not implemented.\")\n            norm = torch.max(\n                avoid_zero_div, torch.sum(torch.abs(eta), dim=reduc_ind, keepdim=True)\n            )\n        elif norm == 2:\n            norm = torch.sqrt(\n                torch.max(\n                    avoid_zero_div, torch.sum(eta ** 2, dim=reduc_ind, keepdim=True)\n                )\n            )\n        factor = torch.min(\n            torch.tensor(1.0, dtype=eta.dtype, device=eta.device), eps / norm\n        )\n        eta *= factor\n    return eta\n\n\ndef get_or_guess_labels(model, x, **kwargs):\n    \"\"\"\n    Get the label to use in generating an adversarial example for x.\n    The kwargs are fed directly from the kwargs of the attack.\n    If 'y' is in kwargs, then assume it's an untargeted attack and\n    use that as the label.\n    If 'y_target' is in kwargs and is not none, then assume it's a\n    targeted attack and use that as the label.\n    Otherwise, use the model's prediction as the label and perform an\n    untargeted attack.\n\n    :param model: PyTorch model. Do not add a softmax gate to the output.\n    :param x: Tensor, shape (N, d_1, ...).\n    :param y: (optional) Tensor, shape (N).\n    :param y_target: (optional) Tensor, shape (N).\n    \"\"\"\n    if \"y\" in kwargs and \"y_target\" in kwargs:\n        raise ValueError(\"Can not set both 'y' and 'y_target'.\")\n    if \"y\" in kwargs:\n        labels = kwargs[\"y\"]\n    elif \"y_target\" in kwargs and kwargs[\"y_target\"] is not None:\n        labels = kwargs[\"y_target\"]\n    else:\n        _, labels = torch.max(model(x), 1)\n    return labels\n\n\ndef optimize_linear(grad, eps, norm=np.inf):\n    \"\"\"\n    Solves for the optimal input to a linear function under a norm constraint.\n\n    Optimal_perturbation = argmax_{eta, ||eta||_{norm} < eps} dot(eta, grad)\n\n    :param grad: Tensor, shape (N, d_1, ...). Batch of gradients\n    :param eps: float. Scalar specifying size of constraint region\n    :param norm: np.inf, 1, or 2. Order of norm constraint.\n    :returns: Tensor, shape (N, d_1, ...). Optimal perturbation\n    \"\"\"\n\n    red_ind = list(range(1, len(grad.size())))\n    avoid_zero_div = torch.tensor(1e-12, dtype=grad.dtype, device=grad.device)\n    if norm == np.inf:\n        # Take sign of gradient\n        optimal_perturbation = torch.sign(grad)\n    elif norm == 1:\n        abs_grad = torch.abs(grad)\n        sign = torch.sign(grad)\n        red_ind = list(range(1, len(grad.size())))\n        abs_grad = torch.abs(grad)\n        ori_shape = [1] * len(grad.size())\n        ori_shape[0] = grad.size(0)\n\n        max_abs_grad, _ = torch.max(abs_grad.view(grad.size(0), -1), 1)\n        max_mask = abs_grad.eq(max_abs_grad.view(ori_shape)).to(torch.float)\n        num_ties = max_mask\n        for red_scalar in red_ind:\n            num_ties = torch.sum(num_ties, red_scalar, keepdim=True)\n        optimal_perturbation = sign * max_mask / num_ties\n        # TODO integrate below to a test file\n        # check that the optimal perturbations have been correctly computed\n        opt_pert_norm = optimal_perturbation.abs().sum(dim=red_ind)\n        assert torch.all(opt_pert_norm == torch.ones_like(opt_pert_norm))\n    elif norm == 2:\n        square = torch.max(avoid_zero_div, torch.sum(grad ** 2, red_ind, keepdim=True))\n        optimal_perturbation = grad / torch.sqrt(square)\n        # TODO integrate below to a test file\n        # check that the optimal perturbations have been correctly computed\n        opt_pert_norm = (\n            optimal_perturbation.pow(2).sum(dim=red_ind, keepdim=True).sqrt()\n        )\n        one_mask = (square <= avoid_zero_div).to(torch.float) * opt_pert_norm + (\n            square > avoid_zero_div\n        ).to(torch.float)\n        assert torch.allclose(opt_pert_norm, one_mask, rtol=1e-05, atol=1e-08)\n    else:\n        raise NotImplementedError(\n            \"Only L-inf, L1 and L2 norms are \" \"currently implemented.\"\n        )\n\n    # Scale perturbation to be the solution for the norm=eps rather than\n    # norm=1 problem\n    scaled_perturbation = eps * optimal_perturbation\n    return scaled_perturbation\n\n\ndef zero_out_clipped_grads(grad, x, clip_min, clip_max):\n    \"\"\"\n    Helper function to erase entries in the gradient where the update would be\n    clipped.\n    :param grad: The gradient\n    :param x: The current input\n    :param clip_min: Minimum input component value\n    :param clip_max: Maximum input component value\n    \"\"\"\n    signed_grad = torch.sign(grad)\n\n    # Find input components that lie at the boundary of the input range, and\n    # where the gradient points in the wrong direction.\n    clip_low = torch.le(x, clip_min) & torch.lt(signed_grad, 0)\n    clip_high = torch.ge(x, clip_max) & torch.gt(signed_grad, 0)\n    clip = clip_low | clip_high\n    grad = torch.where(clip, torch.zeros_like(grad), grad)\n\n    return grad\n"
  },
  {
    "path": "cleverhans/utils.py",
    "content": "\"\"\"\nGeneric utility functions useful for writing Python code in general\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nfrom collections import OrderedDict\nimport warnings\nimport logging\nimport os\nimport re\nimport subprocess\n\nimport numpy as np\nfrom six.moves import xrange\n\nknown_number_types = (\n    int,\n    float,\n    np.float16,\n    np.float32,\n    np.float64,\n    np.int8,\n    np.int16,\n    np.int32,\n    np.int32,\n    np.int64,\n    np.uint8,\n    np.uint16,\n    np.uint32,\n    np.uint64,\n)\n\n\nCLEVERHANS_ROOT = os.path.dirname(os.path.dirname(__file__))\n\n\nclass _ArgsWrapper(object):\n\n    \"\"\"\n    Wrapper that allows attribute access to dictionaries\n    \"\"\"\n\n    def __init__(self, args):\n        if not isinstance(args, dict):\n            args = vars(args)\n        self.args = args\n\n    def __getattr__(self, name):\n        return self.args.get(name)\n\n\nclass AccuracyReport(object):\n\n    \"\"\"\n    An object summarizing the accuracy results for experiments involving\n    training on clean examples or adversarial examples, then evaluating\n    on clean or adversarial examples.\n    \"\"\"\n\n    def __init__(self):\n        self.clean_train_clean_eval = 0.0\n        self.clean_train_adv_eval = 0.0\n        self.adv_train_clean_eval = 0.0\n        self.adv_train_adv_eval = 0.0\n\n        # Training data accuracy results to be used by tutorials\n        self.train_clean_train_clean_eval = 0.0\n        self.train_clean_train_adv_eval = 0.0\n        self.train_adv_train_clean_eval = 0.0\n        self.train_adv_train_adv_eval = 0.0\n\n\ndef batch_indices(batch_nb, data_length, batch_size):\n    \"\"\"\n    This helper function computes a batch start and end index\n    :param batch_nb: the batch number\n    :param data_length: the total length of the data being parsed by batches\n    :param batch_size: the number of inputs in each batch\n    :return: pair of (start, end) indices\n    \"\"\"\n    # Batch start and end index\n    start = int(batch_nb * batch_size)\n    end = int((batch_nb + 1) * batch_size)\n\n    # When there are not enough inputs left, we reuse some to complete the\n    # batch\n    if end > data_length:\n        shift = end - data_length\n        start -= shift\n        end -= shift\n\n    return start, end\n\n\ndef other_classes(nb_classes, class_ind):\n    \"\"\"\n    Returns a list of class indices excluding the class indexed by class_ind\n    :param nb_classes: number of classes in the task\n    :param class_ind: the class index to be omitted\n    :return: list of class indices excluding the class indexed by class_ind\n    \"\"\"\n    if class_ind < 0 or class_ind >= nb_classes:\n        error_str = \"class_ind must be within the range (0, nb_classes - 1)\"\n        raise ValueError(error_str)\n\n    other_classes_list = list(range(nb_classes))\n    other_classes_list.remove(class_ind)\n\n    return other_classes_list\n\n\ndef to_categorical(y, nb_classes, num_classes=None):\n    \"\"\"\n    Converts a class vector (integers) to binary class matrix.\n    This is adapted from the Keras function with the same name.\n    :param y: class vector to be converted into a matrix\n              (integers from 0 to nb_classes).\n    :param nb_classes: nb_classes: total number of classes.\n    :param num_classses: depricated version of nb_classes\n    :return: A binary matrix representation of the input.\n    \"\"\"\n    if num_classes is not None:\n        if nb_classes is not None:\n            raise ValueError(\n                \"Should not specify both nb_classes and its deprecated \"\n                \"alias, num_classes\"\n            )\n        warnings.warn(\n            \"`num_classes` is deprecated. Switch to `nb_classes`.\"\n            \" `num_classes` may be removed on or after 2019-04-23.\"\n        )\n        nb_classes = num_classes\n        del num_classes\n    y = np.array(y, dtype=\"int\").ravel()\n    n = y.shape[0]\n    categorical = np.zeros((n, nb_classes))\n    categorical[np.arange(n), y] = 1\n    return categorical\n\n\ndef random_targets(gt, nb_classes):\n    \"\"\"\n    Take in an array of correct labels and randomly select a different label\n    for each label in the array. This is typically used to randomly select a\n    target class in targeted adversarial examples attacks (i.e., when the\n    search algorithm takes in both a source class and target class to compute\n    the adversarial example).\n    :param gt: the ground truth (correct) labels. They can be provided as a\n               1D vector or 2D array of one-hot encoded labels.\n    :param nb_classes: The number of classes for this task. The random class\n                       will be chosen between 0 and nb_classes such that it\n                       is different from the correct class.\n    :return: A numpy array holding the randomly-selected target classes\n             encoded as one-hot labels.\n    \"\"\"\n    # If the ground truth labels are encoded as one-hot, convert to labels.\n    if len(gt.shape) == 2:\n        gt = np.argmax(gt, axis=1)\n\n    # This vector will hold the randomly selected labels.\n    result = np.zeros(gt.shape, dtype=np.int32)\n\n    for class_ind in xrange(nb_classes):\n        # Compute all indices in that class.\n        in_cl = gt == class_ind\n        size = np.sum(in_cl)\n\n        # Compute the set of potential targets for this class.\n        potential_targets = other_classes(nb_classes, class_ind)\n\n        # Draw with replacement random targets among the potential targets.\n        result[in_cl] = np.random.choice(potential_targets, size=size)\n\n    # Encode vector of random labels as one-hot labels.\n    result = to_categorical(result, nb_classes)\n    result = result.astype(np.int32)\n\n    return result\n\n\ndef pair_visual(*args, **kwargs):\n    \"\"\"Deprecation wrapper\"\"\"\n    warnings.warn(\n        \"`pair_visual` has moved to `cleverhans.plot.pyplot_image`. \"\n        \"cleverhans.utils.pair_visual may be removed on or after \"\n        \"2019-04-24.\"\n    )\n    from cleverhans.plot.pyplot_image import pair_visual as new_pair_visual\n\n    return new_pair_visual(*args, **kwargs)\n\n\ndef grid_visual(*args, **kwargs):\n    \"\"\"Deprecation wrapper\"\"\"\n    warnings.warn(\n        \"`grid_visual` has moved to `cleverhans.plot.pyplot_image`. \"\n        \"cleverhans.utils.grid_visual may be removed on or after \"\n        \"2019-04-24.\"\n    )\n    from cleverhans.plot.pyplot_image import grid_visual as new_grid_visual\n\n    return new_grid_visual(*args, **kwargs)\n\n\ndef get_logits_over_interval(*args, **kwargs):\n    \"\"\"Deprecation wrapper\"\"\"\n    warnings.warn(\n        \"`get_logits_over_interval` has moved to \"\n        \"`cleverhans.plot.pyplot_image`. \"\n        \"cleverhans.utils.get_logits_over_interval may be removed on \"\n        \"or after 2019-04-24.\"\n    )\n    # pylint:disable=line-too-long\n    from cleverhans.plot.pyplot_image import (\n        get_logits_over_interval as new_get_logits_over_interval,\n    )\n\n    return new_get_logits_over_interval(*args, **kwargs)\n\n\ndef linear_extrapolation_plot(*args, **kwargs):\n    \"\"\"Deprecation wrapper\"\"\"\n    warnings.warn(\n        \"`linear_extrapolation_plot` has moved to \"\n        \"`cleverhans.plot.pyplot_image`. \"\n        \"cleverhans.utils.linear_extrapolation_plot may be removed on \"\n        \"or after 2019-04-24.\"\n    )\n    # pylint:disable=line-too-long\n    from cleverhans.plot.pyplot_image import (\n        linear_extrapolation_plot as new_linear_extrapolation_plot,\n    )\n\n    return new_linear_extrapolation_plot(*args, **kwargs)\n\n\ndef set_log_level(level, name=\"cleverhans\"):\n    \"\"\"\n    Sets the threshold for the cleverhans logger to level\n    :param level: the logger threshold. You can find values here:\n                  https://docs.python.org/2/library/logging.html#levels\n    :param name: the name used for the cleverhans logger\n    \"\"\"\n    logging.getLogger(name).setLevel(level)\n\n\ndef get_log_level(name=\"cleverhans\"):\n    \"\"\"\n    Gets the current threshold for the cleverhans logger\n    :param name: the name used for the cleverhans logger\n    \"\"\"\n    return logging.getLogger(name).getEffectiveLevel()\n\n\nclass TemporaryLogLevel(object):\n    \"\"\"\n    A ContextManager that changes a log level temporarily.\n\n    Note that the log level will be set back to its original value when\n    the context manager exits, even if the log level has been changed\n    again in the meantime.\n    \"\"\"\n\n    def __init__(self, level, name):\n        self.name = name\n        self.level = level\n\n    def __enter__(self):\n        self.old_level = get_log_level(self.name)\n        set_log_level(self.level, self.name)\n\n    def __exit__(self, type, value, traceback):\n        set_log_level(self.old_level, self.name)\n        return True\n\n\ndef create_logger(name):\n    \"\"\"\n    Create a logger object with the given name.\n\n    If this is the first time that we call this method, then initialize the\n    formatter.\n    \"\"\"\n    base = logging.getLogger(\"cleverhans\")\n    if len(base.handlers) == 0:\n        ch = logging.StreamHandler()\n        formatter = logging.Formatter(\n            \"[%(levelname)s %(asctime)s %(name)s] \" + \"%(message)s\"\n        )\n        ch.setFormatter(formatter)\n        base.addHandler(ch)\n\n    return base\n\n\ndef deterministic_dict(normal_dict):\n    \"\"\"\n    Returns a version of `normal_dict` whose iteration order is always the same\n    \"\"\"\n    out = OrderedDict()\n    for key in sorted(normal_dict.keys()):\n        out[key] = normal_dict[key]\n    return out\n\n\ndef ordered_union(l1, l2):\n    \"\"\"\n    Return the union of l1 and l2, with a deterministic ordering.\n    (Union of python sets does not necessarily have a consisten iteration\n    order)\n    :param l1: list of items\n    :param l2: list of items\n    :returns: list containing one copy of each item that is in l1 or in l2\n    \"\"\"\n    out = []\n    for e in l1 + l2:\n        if e not in out:\n            out.append(e)\n    return out\n\n\ndef safe_zip(*args):\n    \"\"\"like zip but with these properties:\n    - returns a list, rather than an iterator. This is the old Python2 zip behavior.\n    - a guarantee that all arguments are the same length.\n    (normal zip silently drops entries to make them the same length)\n    \"\"\"\n    length = len(args[0])\n    if not all(len(arg) == length for arg in args):\n        raise ValueError(\n            \"Lengths of arguments do not match: \" + str([len(arg) for arg in args])\n        )\n    return list(zip(*args))\n\n\ndef shell_call(command, **kwargs):\n    \"\"\"Calls shell command with argument substitution.\n\n    Args:\n      command: command represented as a list. Each element of the list is one\n        token of the command. For example \"cp a b\" becomes ['cp', 'a', 'b']\n        If any element of the list looks like '${NAME}' then it will be replaced\n        by value from **kwargs with key 'NAME'.\n      **kwargs: dictionary with argument substitution\n\n    Returns:\n      output of the command\n\n    Raises:\n      subprocess.CalledProcessError if command return value is not zero\n\n    This function is useful when you need to do variable substitution prior\n    running the command. Below are few examples of how it works:\n\n      shell_call(['cp', 'a', 'b'], a='asd') calls command 'cp a b'\n\n      shell_call(['cp', '${a}', 'b'], a='asd') calls command 'cp asd b',\n      '${a}; was replaced with 'asd' before calling the command\n    \"\"\"\n    # Regular expression to find instances of '${NAME}' in a string\n    CMD_VARIABLE_RE = re.compile(\"^\\\\$\\\\{(\\\\w+)\\\\}$\")\n    command = list(command)\n    for i in range(len(command)):\n        m = CMD_VARIABLE_RE.match(command[i])\n        if m:\n            var_id = m.group(1)\n            if var_id in kwargs:\n                command[i] = kwargs[var_id]\n    str_command = \" \".join(command)\n    logging.debug(\"Executing shell command: %s\" % str_command)\n    return subprocess.check_output(command)\n\n\ndef deep_copy(numpy_dict):\n    \"\"\"\n    Returns a copy of a dictionary whose values are numpy arrays.\n    Copies their values rather than copying references to them.\n    \"\"\"\n    out = {}\n    for key in numpy_dict:\n        out[key] = numpy_dict[key].copy()\n    return out\n"
  },
  {
    "path": "cleverhans_v3.1.0/CODE_OF_CONDUCT.rst",
    "content": "CleverHans is dedicated to providing a harassment-free experience for\neveryone, regardless of gender, gender identity and expression, sexual\norientation, disability, physical appearance, body size, age, race, or\nreligion. We do not tolerate harassment of participants in any form.\n\nThis code of conduct applies to all CleverHans spaces (including Gist\ncomments) both online and off. Anyone who violates this code of\nconduct may be sanctioned or expelled from these spaces at the\ndiscretion of the OpenAI / Pennsylvania State University team.\n\nWe may add additional rules over time, which will be made clearly\navailable to participants. Participants are responsible for knowing\nand abiding by these rules.\n"
  },
  {
    "path": "cleverhans_v3.1.0/CONTRIBUTING.md",
    "content": "# Contributing to CleverHans\n\nFirst off, thank you for considering contributing to CleverHans.\nFollowing these guidelines helps to communicate that you respect\nthe time of the researchers and developers managing and developing this open\nsource project. In return, they should reciprocate that respect in\naddressing your issue, assessing changes, and helping you finalize\nyour pull requests.\n\nAdding new features, improving documentation, bug triaging, or\nwriting tutorials are all\nexamples of helpful contributions.\nFurthermore, if you are publishing a new attack or defense,\nwe strongly encourage you to add it to CleverHans so that others\nmay evaluate it fairly in their own work.\n\nTo speed the code review process, we ask that:\n\n* New efforts and features be coordinated\non the mailing list for CleverHans development: [cleverhans-dev@googlegroups.com](https://groups.google.com/forum/#!forum/cleverhans-dev).\n* When making code contributions to CleverHans, you should follow the\n[`Black`](https://black.readthedocs.io/en/stable/index.html) coding style in your pull requests.\n* We do not accept pull requests that add git submodules because of [the\n  problems that arise when maintaining git\n  submodules](https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407)\n\nBug fixes can be initiated through Github pull requests.\n"
  },
  {
    "path": "cleverhans_v3.1.0/Dockerfile",
    "content": "FROM ubuntu:14.04\nRUN apt-get update\nRUN apt-get install -y python\nRUN apt-get install -y python-pip\nRUN pip install --upgrade pip\nCOPY .setup_vm_and_run_tests.sh /\nRUN chmod +x /.setup_vm_and_run_tests.sh\nCMD [\"/.setup_vm_and_run_tests.sh\"]\n"
  },
  {
    "path": "cleverhans_v3.1.0/LICENSE",
    "content": "MIT License\r\n\r\nCopyright (c) 2019 Google Inc., OpenAI and Pennsylvania State University\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n"
  },
  {
    "path": "cleverhans_v3.1.0/README.md",
    "content": "# CleverHans (latest release: v3.1.0)\n\nNote: This is the final version of CleverHans v3, which supports TensorFlow 1, Python 3 and Python 2. In our version 4 update, we’re dropping support for TF1 and Python 2, and transitioning to JAX, PyTorch and TF2 on Python 3.\n\nThis version was last tested with Python 3.5 and Tensorflow {1.8, 1.12} on Ubuntu 14.04.5 LTS (Trusty Tahr). You’re welcome to continue using it, but it’s no longer maintained.\n\n<img src=\"https://github.com/tensorflow/cleverhans/blob/master/assets/logo.png?raw=true\" alt=\"cleverhans logo\">\n\n[![Build Status](https://travis-ci.org/tensorflow/cleverhans.svg?branch=master)](https://travis-ci.org/tensorflow/cleverhans)\n[![Documentation Status](https://readthedocs.org/projects/cleverhans/badge/?version=latest)](https://cleverhans.readthedocs.io/en/latest/?badge=latest)\n\nThis repository contains the source code for CleverHans, a Python library to\nbenchmark machine learning systems' vulnerability to\n[adversarial examples](http://karpathy.github.io/2015/03/30/breaking-convnets/).\nYou can learn more about such vulnerabilities on the accompanying [blog](http://cleverhans.io).\n\nThe CleverHans library is under continual development, always welcoming\n[contributions](https://github.com/tensorflow/cleverhans#contributing)\nof the latest attacks and defenses.\nIn particular, we always welcome help towards resolving the [issues](https://github.com/tensorflow/cleverhans/issues)\ncurrently open.\n\n## Major updates coming to CleverHans\n\nCleverHans will soon support 3 frameworks: JAX, PyTorch, and TF2.  The package\nitself will focus on its initial principle: reference implementation of attacks\nagainst machine learning models to help with benchmarking models against\nadversarial examples. This repository will also contain two folders:\n`tutorials/` for scripts demonstrating the features of CleverHans and\n`defenses/` for scripts that contain authoritative implementations of defenses\nin one of the 3 supported frameworks. The structure of the future repository\nwill look like this:\n\n```\ncleverhans/\n  jax/\n    attacks/\n      ...\n    tests/\n      ...\n  tf2/\n    attacks/\n      ...\n    tests/\n      ...\n  torch/\n    attacks/\n      ...\n    tests/\n      ...\ndefenses/\n  jax/\n    ...\n  tf2/\n    ...\n  torch/\n    ...\ntutorials/\n  jax/\n    ...\n  tf2/\n    ...\n  torch/\n    ...\n```\n\nIn the meanwhile, all of these folders can be found in the correspond `future/`\nsubdirectory (e.g., `cleverhans/future/jax/attacks`, `cleverhans/future/jax/tests` or `defenses/future/jax/`).\n\nA public milestone has been created to track the changes that are to be\nimplemented before the library version is incremented to v4. \n\n## Setting up CleverHans\n\n### Dependencies\n\nThis library uses [TensorFlow](https://www.tensorflow.org/) to accelerate graph\ncomputations performed by many machine learning models.\nTherefore, installing TensorFlow is a pre-requisite.\n\nYou can find instructions\n[here](https://www.tensorflow.org/install/).\nFor better performance, it is also recommended to install TensorFlow\nwith GPU support (detailed instructions on how to do this are available\nin the TensorFlow installation documentation).\n\nInstalling TensorFlow will\ntake care of all other dependencies like `numpy` and `scipy`.\n\n### Installation\n\nOnce dependencies have been taken care of, you can install CleverHans using\n`pip` or by cloning this Github repository.\n\n#### `pip` installation\n\nIf you are installing CleverHans using `pip`, run the following command\nafter installing TensorFlow:\n\n```\npip install cleverhans\n```\n\nThis will install the last version uploaded to\n[Pypi](https://pypi.org/project/cleverhans).\nIf you'd instead like to install the bleeding edge version, use:\n\n```\npip install git+https://github.com/tensorflow/cleverhans.git#egg=cleverhans\n```\n\n#### Installation for development\n\nIf you want to make an editable installation of CleverHans so that you can\ndevelop the library and contribute changes back, first fork the repository\non GitHub and then clone your fork into a directory of your choice:\n\n```\ngit clone https://github.com/tensorflow/cleverhans\n```\n\nYou can then install the local package in \"editable\" mode in order to add it to\nyour `PYTHONPATH`:\n\n```\ncd cleverhans\npip install -e .\n```\n\n### Currently supported setups\n\nAlthough CleverHans is likely to work on many other machine configurations, we\ncurrently [test it](https://travis-ci.org/tensorflow/cleverhans) it with Python\n3.5 and TensorFlow {1.8, 1.12} on Ubuntu 14.04.5 LTS (Trusty Tahr).\nSupport for Python 2.7 is deprecated.\nCleverHans 3.0.1 supports Python 2.7 and the master branch is likely to\ncontinue to work in Python 2.7 for some time, but we no longer run the tests\nin Python 2.7 and we do not plan to fix bugs affecting only Python 2.7 after\n2019-07-04.\nSupport for TensorFlow prior to 1.12 is deprecated.\nBackwards compatibility wrappers for these versions may be removed after 2019-07-07,\nand we will not fix bugs for those versions after that date.\nSupport for TensorFlow 1.7 and earlier is already deprecated: we do not fix\nbugs for those versions and any remaining wrapper code for those versions\nmay be removed without further notice.\n\n## Getting support\n\nIf you have a request for support, please ask a question\non [StackOverflow](https://stackoverflow.com/questions/tagged/cleverhans)\nrather than opening an issue in the GitHub tracker. The GitHub\nissue tracker should *only* be used to report bugs or make feature requests.\n\n## Contributing\n\nContributions are welcomed! To speed the code review process, we ask that:\n* New efforts and features be coordinated\non the mailing list for CleverHans development: [cleverhans-dev@googlegroups.com](https://groups.google.com/forum/#!forum/cleverhans-dev).\n* When making code contributions to CleverHans, you follow the\n`PEP8 with two spaces` coding style (the same as the one used\nby TensorFlow) in your pull requests.\nIn most cases this can be done by running `autopep8 -i --indent-size 2 <file>`\non the files you have edited.\nYou can check your code by running `nosetests cleverhans/devtools/tests/test_format.py` or check an individual file by running `pylint <file>` from inside the cleverhans repository root directory.\n* When making your first pull request, you [sign the Google CLA](https://cla.developers.google.com/clas)\n* We do not accept pull requests that add git submodules because of [the\n  problems that arise when maintaining git\n  submodules](https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407)\n\nBug fixes can be initiated through Github pull requests.\n\n## Scripts: `scripts` directory\n\nThe `scripts` directory contains command line utilities.\nIn many cases you can use these to run CleverHans functionality on your\nsaved models without needing to write any of your own Python code.\n\nYou may want to set your `.bashrc` / `.bash_profile` file to add the\nCleverHans `scripts` directory to your `PATH` environment variable\nso that these scripts will be conveniently executable from any directory.\n\n## Tutorials: `cleverhans_tutorials` directory\n\nTo help you get started with the functionalities provided by this library, the\n`cleverhans_tutorials/` folder comes with the following tutorials:\n* **MNIST with FGSM** ([code](cleverhans_tutorials/mnist_tutorial_tf.py)): this\ntutorial covers how to train a MNIST model using TensorFlow,\ncraft adversarial examples using the [fast gradient sign method](https://arxiv.org/abs/1412.6572),\nand make the model more robust to adversarial examples using adversarial training.\n* **MNIST with FGSM using Keras** ([code](cleverhans_tutorials/mnist_tutorial_keras_tf.py)): this\ntutorial covers how to define a MNIST model with Keras and train it using TensorFlow,\ncraft adversarial examples using the [fast gradient sign method](https://arxiv.org/abs/1412.6572),\nand make the model more robust to adversarial\nexamples using adversarial training.\n* **MNIST with JSMA** ([code](cleverhans_tutorials/mnist_tutorial_jsma.py)): this second\ntutorial covers how to define a MNIST model with Keras and train it using TensorFlow and\ncraft adversarial examples using the [Jacobian-based saliency map approach](https://arxiv.org/abs/1511.07528).\n* **MNIST using a black-box attack** ([code](cleverhans_tutorials/mnist_blackbox.py)):\nthis tutorial implements the black-box\nattack described in this [paper](https://arxiv.org/abs/1602.02697).\nThe adversary train a substitute model: a copy that imitates the black-box\nmodel by observing the labels that the black-box model assigns to inputs chosen\ncarefully by the adversary. The adversary then uses the substitute\nmodel’s gradients to find adversarial examples that are misclassified by the\nblack-box model as well.\n\nNOTE: the tutorials are maintained carefully, in the sense that we use\ncontinuous integration to make sure they continue working. They are not\nconsidered part of the API and they can change at any time without warning.\nYou should not write 3rd party code that imports the tutorials and expect\nthat the interface will not break. Only the main library is subject to\nour six month interface deprecation warning rule.\n\nNOTE: please write to cleverhans-dev@googlegroups.com before writing a new\ntutorial. Because each new tutorial involves a large amount of duplicated\ncode relative to the existing tutorials, and because every line of code\nrequires ongoing testing and maintenance indefinitely, we generally prefer\nnot to add new tutorials. Each tutorial should showcase an extremely different\nway of using the library. Just calling a different attack, model, or dataset\nis not enough to justify maintaining a parallel tutorial.\n\n## Examples : `examples` directory\n\nThe `examples/` folder contains additional scripts to showcase different uses\nof the CleverHans library or get you started competing in different adversarial\nexample contests. We do not offer nearly as much ongoing maintenance or support\nfor this directory as the rest of the library, and if code in here gets broken\nwe may just delete it without warning.\n\n## Reporting benchmarks\n\nWhen reporting benchmarks, please:\n* Use a versioned release of CleverHans. You can find a list of released versions [here](https://github.com/tensorflow/cleverhans/releases).\n* Either use the latest version, or, if comparing to an earlier publication, use the same version as the earlier publication.\n* Report which attack method was used.\n* Report any configuration variables used to determine the behavior of the attack.\n\nFor example, you might report \"We benchmarked the robustness of our method to\nadversarial attack using v3.0.1 of CleverHans. On a test set modified by the\n`FastGradientMethod` with a max-norm `eps` of 0.3, we obtained a test set accuracy of 71.3%.\"\n\n## Citing this work\n\nIf you use CleverHans for academic research, you are highly encouraged\n(though not required) to cite the following [paper](https://arxiv.org/abs/1610.00768):\n\n```\n@article{papernot2018cleverhans,\n  title={Technical Report on the CleverHans v2.1.0 Adversarial Examples Library},\n  author={Nicolas Papernot and Fartash Faghri and Nicholas Carlini and\n  Ian Goodfellow and Reuben Feinman and Alexey Kurakin and Cihang Xie and\n  Yash Sharma and Tom Brown and Aurko Roy and Alexander Matyasko and\n  Vahid Behzadan and Karen Hambardzumyan and Zhishuai Zhang and\n  Yi-Lin Juang and Zhi Li and Ryan Sheatsley and Abhibhav Garg and\n  Jonathan Uesato and Willi Gierke and Yinpeng Dong and David Berthelot and\n  Paul Hendricks and Jonas Rauber and Rujun Long},\n  journal={arXiv preprint arXiv:1610.00768},\n  year={2018}\n}\n```\n\n## About the name\n\nThe name CleverHans is a reference to a presentation by Bob Sturm titled\n“Clever Hans, Clever Algorithms: Are Your Machine Learnings Learning What You\nThink?\" and the corresponding publication, [\"A Simple Method to Determine if a\nMusic Information Retrieval System is a\n'Horse'.\"](http://ieeexplore.ieee.org/document/6847693/) Clever Hans was a\nhorse that appeared to have learned to answer arithmetic questions, but had in\nfact only learned to read social cues that enabled him to give the correct\nanswer. In controlled settings where he could not see people's faces or receive\nother feedback, he was unable to answer the same questions. The story of Clever\nHans is a metaphor for machine learning systems that may achieve very high\naccuracy on a test set drawn from the same distribution as the training data,\nbut that do not actually understand the underlying task and perform poorly on\nother inputs.\n\n## Authors\n\nThis library is managed and maintained by Ian Goodfellow (Google Brain) and\nNicolas Papernot (Google Brain).\n\nThe following authors contributed 100 lines or more (ordered according to the GitHub contributors page):\n* Ian Goodfellow (Google Brain)\n* Nicolas Papernot (Google Brain)\n* Nicholas Carlini (Google Brain)\n* Fartash Faghri (University of Toronto)\n* Tzu-Wei Sung (National Taiwan University)\n* Alexey Kurakin (Google Brain)\n* Reuben Feinman (New York University)\n* Shiyu Duan (University of Florida)\n* Phani Krishna (Video Analytics Lab)\n* David Berthelot (Google Brain)\n* Tom Brown (Google Brain)\n* Cihang Xie (Johns Hopkins)\n* Yash Sharma (The Cooper Union)\n* Aashish Kumar (HARMAN X)\n* Aurko Roy (Google Brain)\n* Alexander Matyasko (Nanyang Technological University)\n* Anshuman Suri (University of Virginia)\n* Yen-Chen Lin (MIT)\n* Vahid Behzadan (Kansas State)\n* Jonathan Uesato (DeepMind)\n* Florian Tramèr (Stanford University)\n* Haojie Yuan (University of Science & Technology of China)\n* Zhishuai Zhang (Johns Hopkins)\n* Karen Hambardzumyan (YerevaNN)\n* Jianbo Chen (UC Berkeley)\n* Catherine Olsson (Google Brain)\n* Aidan Gomez (University of Oxford)\n* Zhi Li (University of Toronto)\n* Yi-Lin Juang (NTUEE)\n* Pratyush Sahay (formerly HARMAN X)\n* Abhibhav Garg (IIT Delhi)\n* Aditi Raghunathan (Stanford University)\n* Yang Song (Stanford University)\n* Riccardo Volpi (Italian Institute of Technology)\n* Angus Galloway (University of Guelph)\n* Yinpeng Dong (Tsinghua University)\n* Willi Gierke (Hasso Plattner Institute)\n* Bruno López\n* Jonas Rauber (IMPRS)\n* Paul Hendricks (NVIDIA)\n* Ryan Sheatsley (Pennsylvania State University)\n* Rujun Long (0101.AI)\n* Bogdan Kulynych (EPFL)\n* Erfan Noury (UMBC)\n* Robert Wagner (Case Western Reserve University)\n* Erh-Chung Chen (National Tsing Hua University)\n\n## Copyright\n\nCopyright 2019 - Google Inc., OpenAI and Pennsylvania State University.\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/__init__.py",
    "content": "\"\"\"The CleverHans adversarial example library\"\"\"\nfrom cleverhans.devtools.version import append_dev_version\n\n# If possible attach a hex digest to the version string to keep track of\n# changes in the development branch\n__version__ = append_dev_version(\"3.0.1\")\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attack_bundling.py",
    "content": "\"\"\"\nRuns multiple attacks against each example.\n\nReferences: https://openreview.net/forum?id=H1g0piA9tQ\n            https://arxiv.org/abs/1811.03685\n\"\"\"\n# pylint: disable=missing-docstring\nimport copy\nimport logging\nimport time\n\nimport numpy as np\nimport six\nfrom six.moves import range\nimport tensorflow as tf\n\nfrom cleverhans.attacks import Noise\nfrom cleverhans.attacks import ProjectedGradientDescent\nfrom cleverhans.attacks import SPSA\nfrom cleverhans.evaluation import correctness_and_confidence\nfrom cleverhans.evaluation import batch_eval_multi_worker, run_attack\nfrom cleverhans.model import Model\nfrom cleverhans import serial\nfrom cleverhans.utils import create_logger, deep_copy, safe_zip\nfrom cleverhans.utils_tf import infer_devices\nfrom cleverhans.confidence_report import ConfidenceReport\nfrom cleverhans.confidence_report import ConfidenceReportEntry\nfrom cleverhans.confidence_report import print_stats\n\n_logger = create_logger(\"attack_bundling\")\n_logger.setLevel(logging.INFO)\n\ndevices = infer_devices()\nnum_devices = len(devices)\nDEFAULT_EXAMPLES_PER_DEVICE = 128\nBATCH_SIZE = DEFAULT_EXAMPLES_PER_DEVICE * num_devices\nREPORT_TIME_INTERVAL = 60\n\n# TODO: lower priority: make it possible to initialize one attack with\n# the output of an earlier attack\n\n\ndef single_run_max_confidence_recipe(\n    sess,\n    model,\n    x,\n    y,\n    nb_classes,\n    eps,\n    clip_min,\n    clip_max,\n    eps_iter,\n    nb_iter,\n    report_path,\n    batch_size=BATCH_SIZE,\n    eps_iter_small=None,\n):\n    \"\"\"A reasonable attack bundling recipe for a max norm threat model and\n    a defender that uses confidence thresholding. This recipe uses both\n    uniform noise and randomly-initialized PGD targeted attacks.\n\n    References:\n    https://openreview.net/forum?id=H1g0piA9tQ\n\n    This version runs each attack (noise, targeted PGD for each class with\n    nb_iter iterations, target PGD for each class with 25X more iterations)\n    just once and then stops. See `basic_max_confidence_recipe` for a version\n    that runs indefinitely.\n\n    :param sess: tf.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing clean example inputs to attack\n    :param y: numpy array containing true labels\n    :param nb_classes: int, number of classes\n    :param eps: float, maximum size of perturbation (measured by max norm)\n    :param eps_iter: float, step size for one version of PGD attacks\n      (will also run another version with eps_iter_small step size)\n    :param nb_iter: int, number of iterations for the cheaper PGD attacks\n      (will also run another version with 25X more iterations)\n    :param report_path: str, the path that the report will be saved to.\n    :param batch_size: int, the total number of examples to run simultaneously\n    :param eps_iter_small: optional, float.\n      The second version of the PGD attack is run with 25 * nb_iter iterations\n      and eps_iter_small step size. If eps_iter_small is not specified it is\n      set to eps_iter / 25.\n    \"\"\"\n    noise_attack = Noise(model, sess)\n    pgd_attack = ProjectedGradientDescent(model, sess)\n    threat_params = {\"eps\": eps, \"clip_min\": clip_min, \"clip_max\": clip_max}\n    noise_attack_config = AttackConfig(noise_attack, threat_params, \"noise\")\n    attack_configs = [noise_attack_config]\n    pgd_attack_configs = []\n    pgd_params = copy.copy(threat_params)\n    pgd_params[\"eps_iter\"] = eps_iter\n    pgd_params[\"nb_iter\"] = nb_iter\n    assert batch_size % num_devices == 0\n    dev_batch_size = batch_size // num_devices\n    ones = tf.ones(dev_batch_size, tf.int32)\n    expensive_pgd = []\n    if eps_iter_small is None:\n        eps_iter_small = eps_iter / 25.0\n    for cls in range(nb_classes):\n        cls_params = copy.copy(pgd_params)\n        cls_params[\"y_target\"] = tf.to_float(tf.one_hot(ones * cls, nb_classes))\n        cls_attack_config = AttackConfig(pgd_attack, cls_params, \"pgd_\" + str(cls))\n        pgd_attack_configs.append(cls_attack_config)\n        expensive_params = copy.copy(cls_params)\n        expensive_params[\"eps_iter\"] = eps_iter_small\n        expensive_params[\"nb_iter\"] *= 25.0\n        expensive_config = AttackConfig(\n            pgd_attack, expensive_params, \"expensive_pgd_\" + str(cls)\n        )\n        expensive_pgd.append(expensive_config)\n    attack_configs = [noise_attack_config] + pgd_attack_configs + expensive_pgd\n    new_work_goal = {config: 1 for config in attack_configs}\n    goals = [MaxConfidence(t=1.0, new_work_goal=new_work_goal)]\n    bundle_attacks(\n        sess,\n        model,\n        x,\n        y,\n        attack_configs,\n        goals,\n        report_path,\n        attack_batch_size=batch_size,\n        eval_batch_size=batch_size,\n    )\n\n\ndef basic_max_confidence_recipe(\n    sess,\n    model,\n    x,\n    y,\n    nb_classes,\n    eps,\n    clip_min,\n    clip_max,\n    eps_iter,\n    nb_iter,\n    report_path,\n    batch_size=BATCH_SIZE,\n    eps_iter_small=None,\n):\n    \"\"\"A reasonable attack bundling recipe for a max norm threat model and\n    a defender that uses confidence thresholding.\n\n    References:\n    https://openreview.net/forum?id=H1g0piA9tQ\n\n    This version runs indefinitely, updating the report on disk continuously.\n\n    :param sess: tf.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing clean example inputs to attack\n    :param y: numpy array containing true labels\n    :param nb_classes: int, number of classes\n    :param eps: float, maximum size of perturbation (measured by max norm)\n    :param eps_iter: float, step size for one version of PGD attacks\n      (will also run another version with eps_iter_small)\n    :param nb_iter: int, number of iterations for one version of PGD attacks\n      (will also run another version with 25X more iterations)\n    :param report_path: str, the path that the report will be saved to.\n    :batch_size: int, the total number of examples to run simultaneously\n    :param eps_iter_small: optional, float.\n      The second version of the PGD attack is run with 25 * nb_iter iterations\n      and eps_iter_small step size. If eps_iter_small is not specified it is\n      set to eps_iter / 25.\n    \"\"\"\n    noise_attack = Noise(model, sess)\n    pgd_attack = ProjectedGradientDescent(model, sess)\n    threat_params = {\"eps\": eps, \"clip_min\": clip_min, \"clip_max\": clip_max}\n    noise_attack_config = AttackConfig(noise_attack, threat_params)\n    attack_configs = [noise_attack_config]\n    pgd_attack_configs = []\n    pgd_params = copy.copy(threat_params)\n    pgd_params[\"eps_iter\"] = eps_iter\n    pgd_params[\"nb_iter\"] = nb_iter\n    assert batch_size % num_devices == 0\n    dev_batch_size = batch_size // num_devices\n    ones = tf.ones(dev_batch_size, tf.int32)\n    expensive_pgd = []\n    if eps_iter_small is None:\n        eps_iter_small = eps_iter / 25.0\n    for cls in range(nb_classes):\n        cls_params = copy.copy(pgd_params)\n        cls_params[\"y_target\"] = tf.to_float(tf.one_hot(ones * cls, nb_classes))\n        cls_attack_config = AttackConfig(pgd_attack, cls_params, \"pgd_\" + str(cls))\n        pgd_attack_configs.append(cls_attack_config)\n        expensive_params = copy.copy(cls_params)\n        expensive_params[\"eps_iter\"] = eps_iter_small\n        expensive_params[\"nb_iter\"] *= 25.0\n        expensive_config = AttackConfig(\n            pgd_attack, expensive_params, \"expensive_pgd_\" + str(cls)\n        )\n        expensive_pgd.append(expensive_config)\n    attack_configs = [noise_attack_config] + pgd_attack_configs + expensive_pgd\n    new_work_goal = {config: 5 for config in attack_configs}\n    pgd_work_goal = {config: 5 for config in pgd_attack_configs}\n    goals = [\n        Misclassify(new_work_goal={noise_attack_config: 50}),\n        Misclassify(new_work_goal=pgd_work_goal),\n        MaxConfidence(t=0.5, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.75, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.875, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.9375, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.96875, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.984375, new_work_goal=new_work_goal),\n        MaxConfidence(t=1.0),\n    ]\n    bundle_attacks(sess, model, x, y, attack_configs, goals, report_path)\n    # This runs forever\n\n\ndef fixed_max_confidence_recipe(\n    sess,\n    model,\n    x,\n    y,\n    nb_classes,\n    eps,\n    clip_min,\n    clip_max,\n    eps_iter,\n    nb_iter,\n    report_path,\n    batch_size=BATCH_SIZE,\n    eps_iter_small=None,\n):\n    \"\"\"A reasonable attack bundling recipe for a max norm threat model and\n    a defender that uses confidence thresholding.\n\n    References:\n    https://openreview.net/forum?id=H1g0piA9tQ\n\n    This version runs each attack a fixed number of times.\n    It is more exhaustive than `single_run_max_confidence_recipe` but because\n    it uses a fixed budget rather than running indefinitely it is more\n    appropriate for making fair comparisons between two models.\n\n    :param sess: tf.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing clean example inputs to attack\n    :param y: numpy array containing true labels\n    :param nb_classes: int, number of classes\n    :param eps: float, maximum size of perturbation (measured by max norm)\n    :param eps_iter: float, step size for one version of PGD attacks\n      (will also run another version with smaller step size)\n    :param nb_iter: int, number of iterations for one version of PGD attacks\n      (will also run another version with 25X more iterations)\n    :param report_path: str, the path that the report will be saved to.\n    :batch_size: int, the total number of examples to run simultaneously\n    :param eps_iter_small: float, the step size to use for more expensive version of the attack.\n      If not specified, usess eps_iter / 25\n    \"\"\"\n    noise_attack = Noise(model, sess)\n    pgd_attack = ProjectedGradientDescent(model, sess)\n    threat_params = {\"eps\": eps, \"clip_min\": clip_min, \"clip_max\": clip_max}\n    noise_attack_config = AttackConfig(noise_attack, threat_params)\n    attack_configs = [noise_attack_config]\n    pgd_attack_configs = []\n    pgd_params = copy.copy(threat_params)\n    pgd_params[\"eps_iter\"] = eps_iter\n    pgd_params[\"nb_iter\"] = nb_iter\n    assert batch_size % num_devices == 0\n    dev_batch_size = batch_size // num_devices\n    ones = tf.ones(dev_batch_size, tf.int32)\n    if eps_iter_small is None:\n        eps_iter_small = eps_iter / 25.0\n    expensive_pgd = []\n    for cls in range(nb_classes):\n        cls_params = copy.copy(pgd_params)\n        cls_params[\"y_target\"] = tf.to_float(tf.one_hot(ones * cls, nb_classes))\n        cls_attack_config = AttackConfig(pgd_attack, cls_params, \"pgd_\" + str(cls))\n        pgd_attack_configs.append(cls_attack_config)\n        expensive_params = copy.copy(cls_params)\n        expensive_params[\"eps_iter\"] = eps_iter_small\n        expensive_params[\"nb_iter\"] *= 25.0\n        expensive_config = AttackConfig(\n            pgd_attack, expensive_params, \"expensive_pgd_\" + str(cls)\n        )\n        expensive_pgd.append(expensive_config)\n    attack_configs = [noise_attack_config] + pgd_attack_configs + expensive_pgd\n    new_work_goal = {config: 5 for config in attack_configs}\n    pgd_work_goal = {config: 5 for config in pgd_attack_configs}\n    # TODO: lower priority: make sure bundler won't waste time running targeted\n    # attacks on examples where the target class is the true class.\n    goals = [\n        Misclassify(new_work_goal={noise_attack_config: 50}),\n        Misclassify(new_work_goal=pgd_work_goal),\n        MaxConfidence(t=0.5, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.75, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.875, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.9375, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.96875, new_work_goal=new_work_goal),\n        MaxConfidence(t=0.984375, new_work_goal=new_work_goal),\n        MaxConfidence(t=1.0, new_work_goal=new_work_goal),\n    ]\n    bundle_attacks(sess, model, x, y, attack_configs, goals, report_path)\n\n\ndef random_search_max_confidence_recipe(\n    sess,\n    model,\n    x,\n    y,\n    eps,\n    clip_min,\n    clip_max,\n    report_path,\n    batch_size=BATCH_SIZE,\n    num_noise_points=10000,\n):\n    \"\"\"Max confidence using random search.\n\n    References:\n    https://openreview.net/forum?id=H1g0piA9tQ\n      Describes the max_confidence procedure used for the bundling in this recipe\n    https://arxiv.org/abs/1802.00420\n      Describes using random search with 1e5 or more random points to avoid\n      gradient masking.\n\n    :param sess: tf.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing clean example inputs to attack\n    :param y: numpy array containing true labels\n    :param nb_classes: int, number of classes\n    :param eps: float, maximum size of perturbation (measured by max norm)\n    :param eps_iter: float, step size for one version of PGD attacks\n      (will also run another version with 25X smaller step size)\n    :param nb_iter: int, number of iterations for one version of PGD attacks\n      (will also run another version with 25X more iterations)\n    :param report_path: str, the path that the report will be saved to.\n    :batch_size: int, the total number of examples to run simultaneously\n    \"\"\"\n    noise_attack = Noise(model, sess)\n    threat_params = {\"eps\": eps, \"clip_min\": clip_min, \"clip_max\": clip_max}\n    noise_attack_config = AttackConfig(noise_attack, threat_params)\n    attack_configs = [noise_attack_config]\n    assert batch_size % num_devices == 0\n    new_work_goal = {noise_attack_config: num_noise_points}\n    goals = [MaxConfidence(t=1.0, new_work_goal=new_work_goal)]\n    bundle_attacks(sess, model, x, y, attack_configs, goals, report_path)\n\n\nclass AttackConfig(object):\n    \"\"\"\n    An attack and associated parameters.\n    :param attack: cleverhans.attacks.Attack\n    :param params: dict of keyword arguments to pass to attack.generate\n    :param name: str, name to be returned by __str__ / __repr__\n    :param pass_y: bool, whether to pass y to `attack.generate`\n    \"\"\"\n\n    def __init__(self, attack, params=None, name=None, pass_y=False):\n        self.attack = attack\n        self.params = params\n        self.name = name\n        if params is not None:\n            assert isinstance(params, dict)\n            for key in params:\n                assert isinstance(key, six.string_types), type(key)\n        self.pass_y = pass_y\n\n    def __str__(self):\n        if self.name is not None:\n            return self.name\n        return \"AttackConfig(\" + str(self.attack) + \", \" + str(self.params) + \")\"\n\n    def __repr__(self):\n        return self.__str__()\n\n\ndef bundle_attacks(\n    sess,\n    model,\n    x,\n    y,\n    attack_configs,\n    goals,\n    report_path,\n    attack_batch_size=BATCH_SIZE,\n    eval_batch_size=BATCH_SIZE,\n):\n    \"\"\"\n    Runs attack bundling.\n    Users of cleverhans may call this function but are more likely to call\n    one of the recipes above.\n\n    Reference: https://openreview.net/forum?id=H1g0piA9tQ\n\n    :param sess: tf.session.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing clean example inputs to attack\n    :param y: numpy array containing true labels\n    :param attack_configs: list of AttackConfigs to run\n    :param goals: list of AttackGoals to run\n      The bundler works through the goals in order, until each is satisfied.\n      Some goals may never be satisfied, in which case the bundler will run\n      forever, updating the report on disk as it goes.\n    :param report_path: str, the path the report will be saved to\n    :param attack_batch_size: int, batch size for generating adversarial examples\n    :param eval_batch_size: int, batch size for evaluating the model on clean / adversarial examples\n    :returns:\n      adv_x: The adversarial examples, in the same format as `x`\n      run_counts: dict mapping each AttackConfig to a numpy array reporting\n        how many times that AttackConfig was run on each example\n    \"\"\"\n    assert isinstance(sess, tf.Session)\n    assert isinstance(model, Model)\n    assert all(\n        isinstance(attack_config, AttackConfig) for attack_config in attack_configs\n    )\n    assert all(isinstance(goal, AttackGoal) for goal in goals)\n    assert isinstance(report_path, six.string_types)\n    if x.shape[0] != y.shape[0]:\n        raise ValueError(\"Number of input examples does not match number of labels\")\n\n    # Note: no need to precompile attacks, correctness_and_confidence\n    # caches them\n\n    run_counts = {}\n    for attack_config in attack_configs:\n        run_counts[attack_config] = np.zeros(x.shape[0], dtype=np.int64)\n\n    # TODO: make an interface to pass this in if it has already been computed\n    # elsewhere\n    _logger.info(\"Running on clean data to initialize the report...\")\n    packed = correctness_and_confidence(\n        sess, model, x, y, batch_size=eval_batch_size, devices=devices\n    )\n    _logger.info(\"...done\")\n    correctness, confidence = packed\n    _logger.info(\"Accuracy: \" + str(correctness.mean()))\n    report = ConfidenceReport()\n    report[\"clean\"] = ConfidenceReportEntry(correctness, confidence)\n\n    adv_x = x.copy()\n\n    for goal in goals:\n        bundle_attacks_with_goal(\n            sess,\n            model,\n            x,\n            y,\n            adv_x,\n            attack_configs,\n            run_counts,\n            goal,\n            report,\n            report_path,\n            attack_batch_size=attack_batch_size,\n            eval_batch_size=eval_batch_size,\n        )\n\n    # Many users will set `goals` to make this run forever, so the return\n    # statement is not the primary way to get information out.\n    return adv_x, run_counts\n\n\ndef bundle_attacks_with_goal(\n    sess,\n    model,\n    x,\n    y,\n    adv_x,\n    attack_configs,\n    run_counts,\n    goal,\n    report,\n    report_path,\n    attack_batch_size=BATCH_SIZE,\n    eval_batch_size=BATCH_SIZE,\n):\n    \"\"\"\n    Runs attack bundling, working on one specific AttackGoal.\n    This function is mostly intended to be called by `bundle_attacks`.\n\n    Reference: https://openreview.net/forum?id=H1g0piA9tQ\n\n    :param sess: tf.session.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing clean example inputs to attack\n    :param y: numpy array containing true labels\n    :param adv_x: numpy array containing the adversarial examples made so far\n      by earlier work in the bundling process\n    :param attack_configs: list of AttackConfigs to run\n    :param run_counts: dict mapping AttackConfigs to numpy arrays specifying\n      how many times they have been run on each example\n    :param goal: AttackGoal to run\n    :param report: ConfidenceReport\n    :param report_path: str, the path the report will be saved to\n    :param attack_batch_size: int, batch size for generating adversarial examples\n    :param eval_batch_size: int, batch size for evaluating the model on adversarial examples\n    \"\"\"\n    goal.start(run_counts)\n    _logger.info(\"Running criteria for new goal...\")\n    criteria = goal.get_criteria(sess, model, adv_x, y, batch_size=eval_batch_size)\n    assert \"correctness\" in criteria\n    _logger.info(\"Accuracy: \" + str(criteria[\"correctness\"].mean()))\n    assert \"confidence\" in criteria\n    while not goal.is_satisfied(criteria, run_counts):\n        run_batch_with_goal(\n            sess,\n            model,\n            x,\n            y,\n            adv_x,\n            criteria,\n            attack_configs,\n            run_counts,\n            goal,\n            report,\n            report_path,\n            attack_batch_size=attack_batch_size,\n        )\n    # Save after finishing all goals.\n    # The incremental saves run on a timer. This save is needed so that the last\n    # few attacks after the timer don't get discarded\n    report.completed = True\n    save(criteria, report, report_path, adv_x)\n\n\ndef run_batch_with_goal(\n    sess,\n    model,\n    x,\n    y,\n    adv_x_val,\n    criteria,\n    attack_configs,\n    run_counts,\n    goal,\n    report,\n    report_path,\n    attack_batch_size=BATCH_SIZE,\n):\n    \"\"\"\n    Runs attack bundling on one batch of data.\n    This function is mostly intended to be called by\n    `bundle_attacks_with_goal`.\n\n    :param sess: tf.session.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing clean example inputs to attack\n    :param y: numpy array containing true labels\n    :param adv_x_val: numpy array containing the adversarial examples made so far\n      by earlier work in the bundling process\n    :param criteria: dict mapping string names of criteria to numpy arrays with\n      their values for each example\n      (Different AttackGoals track different criteria)\n    :param run_counts: dict mapping AttackConfigs to numpy arrays reporting how\n      many times they have been run on each example\n    :param goal: the AttackGoal to work on\n    :param report: dict, see `bundle_attacks_with_goal`\n    :param report_path: str, path to save the report to\n    \"\"\"\n    attack_config = goal.get_attack_config(attack_configs, run_counts, criteria)\n    idxs = goal.request_examples(attack_config, criteria, run_counts, attack_batch_size)\n    x_batch = x[idxs]\n    assert x_batch.shape[0] == attack_batch_size\n    y_batch = y[idxs]\n    assert y_batch.shape[0] == attack_batch_size\n    adv_x_batch = run_attack(\n        sess,\n        model,\n        x_batch,\n        y_batch,\n        attack_config.attack,\n        attack_config.params,\n        attack_batch_size,\n        devices,\n        pass_y=attack_config.pass_y,\n    )\n    criteria_batch = goal.get_criteria(\n        sess, model, adv_x_batch, y_batch, batch_size=min(attack_batch_size, BATCH_SIZE)\n    )\n    # This can't be parallelized because some orig examples are copied more\n    # than once into the batch\n    cur_run_counts = run_counts[attack_config]\n    for batch_idx, orig_idx in enumerate(idxs):\n        cur_run_counts[orig_idx] += 1\n        should_copy = goal.new_wins(criteria, orig_idx, criteria_batch, batch_idx)\n        if should_copy:\n            adv_x_val[orig_idx] = adv_x_batch[batch_idx]\n            for key in criteria:\n                criteria[key][orig_idx] = criteria_batch[key][batch_idx]\n            assert np.allclose(y[orig_idx], y_batch[batch_idx])\n    report[\"bundled\"] = ConfidenceReportEntry(\n        criteria[\"correctness\"], criteria[\"confidence\"]\n    )\n\n    should_save = False\n    new_time = time.time()\n    if hasattr(report, \"time\"):\n        if new_time - report.time > REPORT_TIME_INTERVAL:\n            should_save = True\n    else:\n        should_save = True\n    if should_save:\n        report.time = new_time\n        goal.print_progress(criteria, run_counts)\n        save(criteria, report, report_path, adv_x_val)\n\n\ndef save(criteria, report, report_path, adv_x_val):\n    \"\"\"\n    Saves the report and adversarial examples.\n    :param criteria: dict, of the form returned by AttackGoal.get_criteria\n    :param report: dict containing a confidence report\n    :param report_path: string, filepath\n    :param adv_x_val: numpy array containing dataset of adversarial examples\n    \"\"\"\n    print_stats(criteria[\"correctness\"], criteria[\"confidence\"], \"bundled\")\n\n    print(\"Saving to \" + report_path)\n    serial.save(report_path, report)\n\n    assert report_path.endswith(\".joblib\")\n    adv_x_path = report_path[: -len(\".joblib\")] + \"_adv.npy\"\n    np.save(adv_x_path, adv_x_val)\n\n\nclass AttackGoal(object):\n    \"\"\"Specifies goals for attack bundling.\n    Different bundling recipes can have different priorities.\n    - When choosing which examples to attack in the next batch, do we want\n    to focus on examples that are not yet misclassified? Among the\n    still correctly classified ones, do we want to focus on the ones that\n    have not been attacked many times yet? Do we want to focus on the ones\n    that have low loss / low confidence so far?\n    - After an attack has been run, do we prefer the new adversarial example\n    or the old one? Is the new one better if it causes higher confidence\n    in the wrong prediction? If it succeeds with a smaller perturbation?\n    For different use cases, the answers to these questions is different.\n    Implement different AttackGoal subclasses to represent the priorities\n    for your use case.\n    \"\"\"\n\n    def start(self, run_counts):\n        \"\"\"\n        Called by the bundler when it starts working on the goal.\n\n        :param run_counts: dict mapping AttackConfigs to numpy arrays reporting\n          how many times they have been run on each example.\n        \"\"\"\n\n    def get_criteria(self, sess, model, advx, y, batch_size=BATCH_SIZE):\n        \"\"\"\n        Returns a dictionary mapping the name of each criterion to a NumPy\n        array containing the value of that criterion for each adversarial\n        example.\n        Subclasses can add extra criteria by implementing the `extra_criteria`\n        method.\n\n        :param sess: tf.session.Session\n        :param model: cleverhans.model.Model\n        :param adv_x: numpy array containing the adversarial examples made so far\n          by earlier work in the bundling process\n        :param y: numpy array containing true labels\n        :param batch_size: int, batch size\n        \"\"\"\n\n        names, factory = self.extra_criteria()\n        factory = _CriteriaFactory(model, factory)\n        results = batch_eval_multi_worker(\n            sess, factory, [advx, y], batch_size=batch_size, devices=devices\n        )\n        names = [\"correctness\", \"confidence\"] + names\n        out = dict(safe_zip(names, results))\n        return out\n\n    def extra_criteria(self):\n        \"\"\"\n        Subclasses implement this to specify any extra criteria they need to track.\n        : returns: list of criterion names, _ExtraCriteriaFactory implementing them\n        \"\"\"\n        return [], None\n\n    def request_examples(self, attack_config, criteria, run_counts, batch_size):\n        \"\"\"\n        Returns a numpy array of integer example indices to run in the next batch.\n        \"\"\"\n        raise NotImplementedError(\n            str(type(self)) + \"needs to implement request_examples\"\n        )\n\n    def is_satisfied(self, criteria, run_counts):\n        \"\"\"\n        Returns a bool indicating whether the goal has been satisfied.\n        \"\"\"\n        raise NotImplementedError(str(type(self)) + \" needs to implement is_satisfied.\")\n\n    def print_progress(self, criteria, run_counts):\n        \"\"\"\n        Prints a progress message about how much has been done toward the goal.\n        :param criteria: dict, of the format returned by get_criteria\n        :param run_counts: dict mapping each AttackConfig to a numpy array\n          specifying how many times it has been run for each example\n        \"\"\"\n        print(\"Working on a \" + self.__class__.__name__ + \" goal.\")\n\n    def get_attack_config(self, attack_configs, run_counts, criteria):\n        \"\"\"\n        Returns an AttackConfig to run on the next batch.\n        \"\"\"\n        raise NotImplementedError(\n            str(type(self)) + \" needs to implement get_attack_config\"\n        )\n\n    def new_wins(self, orig_criteria, orig_idx, new_criteria, new_idx):\n        \"\"\"\n        Returns a bool indicating whether a new adversarial example is better\n        than the pre-existing one for the same clean example.\n        :param orig_criteria: dict mapping names of criteria to their value\n          for each example in the whole dataset\n        :param orig_idx: The position of the pre-existing example within the\n          whole dataset.\n        :param new_criteria: dict, like orig_criteria, but with values only\n          on the latest batch of adversarial examples\n        :param new_idx: The position of the new adversarial example within\n          the batch\n        \"\"\"\n        raise NotImplementedError(str(type(self)) + \" needs to implement new_wins.\")\n\n\nclass Misclassify(AttackGoal):\n    \"\"\"An AttackGoal that prioritizes misclassifying all examples.\n\n    Times out when each attack has been run the requested number of times.\n    Some examples may be attacked more than the goal number because we\n    always run a full batch of attacks and sometimes the batch size is\n    larger than the number of examples with attacks left to do.\n    :param new_work_goal: dict\n      Maps AttackConfigs to ints specifying how many times they should be\n      run before timing out.\n      If this dict is not specified, all attacks will be run, repeatedly,\n      until all examples are misclassified (or forever if some cannot\n      be changed into misclassified examples).\n      If this dict is specfied, only attacks in the dict will be run.\n    :param break_ties: string name of tie-breaking scheme for `new_wins`\n      When two examples are misclassified, how do we choose between them?\n      Currently the only scheme is 'wrong_confidence', where we prefer the\n      one with higher confidence assigned to a single wrong class.\n      In the future we may support other schemes like smaller perturbation\n      size, higher loss, etc.\n    \"\"\"\n\n    def __init__(self, new_work_goal=None, break_ties=\"wrong_confidence\"):\n        super(Misclassify, self).__init__()\n        self.new_work_goal = new_work_goal\n        assert all(isinstance(key, AttackConfig) for key in new_work_goal.keys())\n        assert all(isinstance(value, int) for value in new_work_goal.values())\n        self.rng = np.random.RandomState([2018, 10, 5, 9])\n        self.break_ties = break_ties\n\n    def start(self, run_counts):\n        for key in run_counts:\n            value = run_counts[key]\n            assert value.ndim == 1\n        _logger.info(\"Started working on a Misclassify goal\")\n        self.work_before = deep_copy(run_counts)\n\n    def is_satisfied(self, criteria, run_counts):\n        correctness = criteria[\"correctness\"]\n        assert correctness.dtype == np.bool\n        assert correctness.ndim == 1\n        if correctness.max() == 0:\n            _logger.info(\"Everything is misclassified! Done with Misclassify goal\")\n            return True\n        if self.new_work_goal is None:\n            return False\n        correct_run_counts = self.filter(run_counts, criteria)\n        correct_work_before = self.filter(self.work_before, criteria)\n        unfinished = unfinished_attack_configs(\n            self.new_work_goal, correct_work_before, correct_run_counts\n        )\n        finished = len(unfinished) == 0\n        if finished:\n            _logger.info(\"Misclassify timed out after running all requested attacks\")\n        else:\n            pass\n            # _logger.info(\"Miclassify goal still has attacks to run\")\n        return finished\n\n    def print_progress(self, criteria, run_counts):\n        print(\"Working on a \" + self.__class__.__name__ + \" goal.\")\n        num_below = criteria[\"correctness\"].sum()\n        print(str(num_below) + \" examples are still correctly classified.\")\n        if self.new_work_goal is None:\n            print(\"No work goal: running all attacks indefinitely\")\n        else:\n            print(\"Working until all attacks have been run enough times\")\n            filtered_run_counts = self.filter(run_counts, criteria)\n            filtered_work_before = self.filter(self.work_before, criteria)\n            for ac in self.new_work_goal:\n                goal = self.new_work_goal[ac]\n                new = filtered_run_counts[ac] - filtered_work_before[ac]\n                if new.size > 0:\n                    min_new = new.min()\n                    if min_new < goal:\n                        num_min = (new == min_new).sum()\n                        print(\n                            \"\\t\"\n                            + str(ac)\n                            + \": goal of \"\n                            + str(goal)\n                            + \" runs, but \"\n                            + str(num_min)\n                            + \" examples have been run only \"\n                            + str(min_new)\n                            + \" times\"\n                        )\n\n    def filter(self, run_counts, criteria):\n        \"\"\"\n        Return run counts only for examples that are still correctly classified\n        \"\"\"\n        correctness = criteria[\"correctness\"]\n        assert correctness.dtype == np.bool\n        filtered_counts = deep_copy(run_counts)\n        for key in filtered_counts:\n            filtered_counts[key] = filtered_counts[key][correctness]\n        return filtered_counts\n\n    def get_attack_config(self, attack_configs, run_counts, criteria):\n        if self.new_work_goal is not None:\n            correct_work_before = self.filter(self.work_before, criteria)\n            correct_run_counts = self.filter(run_counts, criteria)\n            attack_configs = unfinished_attack_configs(\n                self.new_work_goal, correct_work_before, correct_run_counts\n            )\n        attack_config = attack_configs[self.rng.randint(len(attack_configs))]\n        return attack_config\n\n    def extra_criteria(self):\n        if self.break_ties == \"wrong_confidence\":\n            return [\"wrong_confidence\"], _WrongConfidenceFactory()\n        else:\n            raise NotImplementedError()\n\n    def request_examples(self, attack_config, criteria, run_counts, batch_size):\n        correctness = criteria[\"correctness\"]\n        assert correctness.dtype == np.bool\n        total = correctness.size\n        total_correct = correctness.sum()\n        all_idxs = np.arange(total)\n        run_counts = run_counts[attack_config]\n        if total_correct > 0:\n            correct_idxs = all_idxs[correctness]\n            assert correct_idxs.size == total_correct\n            run_counts = run_counts[correctness]\n            pairs = safe_zip(correct_idxs, run_counts)\n        else:\n            pairs = safe_zip(all_idxs, run_counts)\n        # In PY3, pairs is now an iterator.\n        # To support sorting, we need to make it a list.\n        pairs = list(pairs)\n\n        def key(pair):\n            return pair[1]\n\n        pairs.sort(key=key)\n        idxs = [pair[0] for pair in pairs]\n        while len(idxs) < batch_size:\n            needed = batch_size - len(idxs)\n            idxs = idxs + idxs[:needed]\n        if len(idxs) > batch_size:\n            idxs = idxs[:batch_size]\n        idxs = np.array(idxs)\n        return idxs\n\n    def new_wins(self, orig_criteria, orig_idx, new_criteria, new_idx):\n        orig_correct = orig_criteria[\"correctness\"][orig_idx]\n        new_correct = new_criteria[\"correctness\"][new_idx]\n        if orig_correct and not new_correct:\n            return True\n        if (not orig_correct) and new_correct:\n            return False\n        assert orig_correct == new_correct\n        if self.break_ties == \"wrong_confidence\":\n            new = new_criteria[\"wrong_confidence\"][new_idx]\n            orig = orig_criteria[\"wrong_confidence\"][orig_idx]\n            return new > orig\n        else:\n            raise NotImplementedError(self.break_ties)\n\n\nclass MaxConfidence(AttackGoal):\n    \"\"\"\n    The AttackGoal corresponding the MaxConfidence procedure.\n\n    Reference: https://openreview.net/forum?id=H1g0piA9tQ\n\n    This should be used with a recipe that includes AttackConfigs\n    that target all of the classes, plus an any additional AttackConfigs\n    that may help to avoid gradient masking.\n\n    This AttackGoal prioritizes getting all examples above a specified\n    threshold. (If the threshold is set to 1, then no examples are above\n    the threshold, so all are attacked equally often). The MaxConfidence\n    attack procedure against *a single example* is optimal regardless of\n    threshold, so long as t >= 0.5, but when attacking a population of\n    examples with finite computation time, knowledge of the threshold is\n    necessary to determine which examples to prioritize attacking.\n\n    :param t: Prioritize pushing examples above this threshold.\n    :param new_work_goal: Optional dict mapping AttackConfigs to ints.\n      The int specifies the number of times to run each AttackConfig on each\n      below-threshold example before giving up.\n      If not specified, this goal runs all available attacks and never gives\n      up.\n    \"\"\"\n\n    def __init__(self, t=1.0, new_work_goal=None):\n        super(MaxConfidence, self).__init__()\n        self.t = t\n        self.new_work_goal = new_work_goal\n        if new_work_goal is not None:\n            for key in new_work_goal:\n                assert isinstance(key, AttackConfig)\n                assert isinstance(new_work_goal[key], int)\n        self.rng = np.random.RandomState([2018, 10, 7, 12])\n\n    def filter(self, run_counts, criteria):\n        \"\"\"\n        Return the counts for only those examples that are below the threshold\n        \"\"\"\n        wrong_confidence = criteria[\"wrong_confidence\"]\n        below_t = wrong_confidence <= self.t\n        filtered_counts = deep_copy(run_counts)\n        for key in filtered_counts:\n            filtered_counts[key] = filtered_counts[key][below_t]\n        return filtered_counts\n\n    def extra_criteria(self):\n        return [\"wrong_confidence\"], _WrongConfidenceFactory()\n\n    def is_satisfied(self, criteria, run_counts):\n        wrong_confidence = criteria[\"wrong_confidence\"]\n        if wrong_confidence.min() > self.t:\n            _logger.info(\"Everything is above threshold \" + str(self.t))\n            _logger.info(\"Done with MaxConfidence goal\")\n            return True\n        if self.new_work_goal is None:\n            return False\n        filtered_run_counts = self.filter(run_counts, criteria)\n        filtered_work_before = self.filter(self.work_before, criteria)\n        unfinished = unfinished_attack_configs(\n            self.new_work_goal, filtered_work_before, filtered_run_counts, log=False\n        )\n        finished = len(unfinished) == 0\n        if finished:\n            _logger.info(\"MaxConfidence timed out after running all requested attacks\")\n        else:\n            pass\n        return finished\n\n    def print_progress(self, criteria, run_counts):\n        print(\"Working on a \" + self.__class__.__name__ + \" goal.\")\n        if self.t == 1.0:\n            print(\"Threshold of 1, so just driving up confidence of all examples.\")\n        else:\n            print(\"Target threshold of \" + str(self.t))\n            num_below = (criteria[\"wrong_confidence\"] <= self.t).sum()\n            print(str(num_below) + \" examples are below the target threshold.\")\n        if self.new_work_goal is None:\n            print(\"No work goal: running all attacks indefinitely\")\n        else:\n            print(\"Working until all attacks have been run enough times\")\n            filtered_run_counts = self.filter(run_counts, criteria)\n            filtered_work_before = self.filter(self.work_before, criteria)\n            for ac in self.new_work_goal:\n                goal = self.new_work_goal[ac]\n                new = filtered_run_counts[ac] - filtered_work_before[ac]\n                min_new = new.min()\n                if min_new < goal:\n                    num_min = (new == min_new).sum()\n                    print(\n                        \"\\t\"\n                        + str(ac)\n                        + \": goal of \"\n                        + str(goal)\n                        + \" runs, but \"\n                        + str(num_min)\n                        + \" examples have been run only \"\n                        + str(min_new)\n                        + \" times\"\n                    )\n\n    def get_attack_config(self, attack_configs, run_counts, criteria):\n        # TODO: refactor to avoid this duplicated method\n        if self.new_work_goal is not None:\n            correct_work_before = self.filter(self.work_before, criteria)\n            correct_run_counts = self.filter(run_counts, criteria)\n            attack_configs = unfinished_attack_configs(\n                self.new_work_goal, correct_work_before, correct_run_counts\n            )\n        attack_config = attack_configs[self.rng.randint(len(attack_configs))]\n        return attack_config\n\n    def start(self, run_counts):\n        _logger.info(\"Started working on a MaxConfidence goal\")\n        _logger.info(\"Threshold: \" + str(self.t))\n        if self.new_work_goal is None:\n            if self.t >= 1.0:\n                _logger.info(\"This goal will run forever\")\n            else:\n                _logger.info(\n                    \"This goal will run until all examples have confidence\"\n                    + \" greater than \"\n                    + str(self.t)\n                    + \", which may never\"\n                    + \" happen.\"\n                )\n        self.work_before = deep_copy(run_counts)\n\n    def request_examples(self, attack_config, criteria, run_counts, batch_size):\n        wrong_confidence = criteria[\"wrong_confidence\"]\n        below_t = wrong_confidence <= self.t\n        assert below_t.dtype == np.bool\n        total = below_t.size\n        total_below = below_t.sum()\n        all_idxs = np.arange(total)\n        run_counts = run_counts[attack_config]\n        if total_below > 0:\n            correct_idxs = all_idxs[below_t]\n            assert correct_idxs.size == total_below\n            run_counts = run_counts[below_t]\n            pairs = safe_zip(correct_idxs, run_counts)\n        else:\n            pairs = safe_zip(all_idxs, run_counts)\n\n        def key(pair):\n            return pair[1]\n\n        pairs.sort(key=key)\n        idxs = [pair[0] for pair in pairs]\n        while len(idxs) < batch_size:\n            needed = batch_size - len(idxs)\n            idxs = idxs + idxs[:needed]\n        if len(idxs) > batch_size:\n            idxs = idxs[:batch_size]\n        idxs = np.array(idxs)\n        return idxs\n\n    def new_wins(self, orig_criteria, orig_idx, new_criteria, new_idx):\n        new_wrong_confidence = new_criteria[\"wrong_confidence\"][new_idx]\n        orig_wrong_confidence = orig_criteria[\"wrong_confidence\"][orig_idx]\n        return new_wrong_confidence > orig_wrong_confidence\n\n\ndef unfinished_attack_configs(new_work_goal, work_before, run_counts, log=False):\n    \"\"\"\n    Returns a list of attack configs that have not yet been run the desired\n    number of times.\n    :param new_work_goal: dict mapping attacks to desired number of times to run\n    :param work_before: dict mapping attacks to number of times they were run\n      before starting this new goal. Should be prefiltered to include only\n      examples that don't already meet the primary goal\n    :param run_counts: dict mapping attacks to total number of times they have\n      ever been run. Should be prefiltered to include only examples that don't\n      already meet the primary goal\n    \"\"\"\n\n    assert isinstance(work_before, dict), work_before\n\n    for key in work_before:\n        value = work_before[key]\n        assert value.ndim == 1, value.shape\n        if key in run_counts:\n            assert run_counts[key].shape == value.shape\n\n    attack_configs = []\n    for attack_config in new_work_goal:\n        done_now = run_counts[attack_config]\n        if log:\n            _logger.info(str(attack_config) + \" ave run count: \" + str(done_now.mean()))\n            _logger.info(str(attack_config) + \" min run count: \" + str(done_now.min()))\n        done_before = work_before[attack_config]\n        if log:\n            _logger.info(\n                str(attack_config) + \" mean work before: \" + str(done_before.mean())\n            )\n        # This is the vector for all examples\n        new = done_now - done_before\n        # The work is only done when it has been done for every example\n        new = new.min()\n        assert isinstance(new, (int, np.int64)), type(new)\n        new_goal = new_work_goal[attack_config]\n        assert isinstance(new_goal, int), type(new_goal)\n        if new < new_goal:\n            if log:\n                _logger.info(\n                    str(attack_config) + \" has run \" + str(new) + \" of \" + str(new_goal)\n                )\n            attack_configs.append(attack_config)\n    return attack_configs\n\n\nclass _CriteriaFactory(object):\n    \"\"\"\n    A factory that builds the expression to evaluate all criteria.\n    \"\"\"\n\n    def __init__(self, model, extra_criteria_factory=None):\n        self.model = model\n        self.extra_criteria_factory = extra_criteria_factory\n        properties_to_hash = (model,)\n        if extra_criteria_factory is not None:\n            if extra_criteria_factory.properties_to_hash is not None:\n                extra_properties = extra_criteria_factory.properties_to_hash\n                properties_to_hash = properties_to_hash + extra_properties\n        self.properties_to_hash = properties_to_hash\n\n    def __hash__(self):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        return self.properties_to_hash.__hash__()\n\n    def __eq__(self, other):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        if not isinstance(other, _CriteriaFactory):\n            return False\n        if type(self.extra_criteria_factory) is not type(other.extra_criteria_factory):\n            return False\n        return self.properties_to_hash == other.properties_to_hash\n\n    def __call__(self):\n        x_batch = self.model.make_input_placeholder()\n        y_batch = self.model.make_label_placeholder()\n\n        predictions = self.model.get_probs(x_batch)\n        correct = tf.equal(tf.argmax(y_batch, axis=-1), tf.argmax(predictions, axis=-1))\n        max_probs = tf.reduce_max(predictions, axis=1)\n\n        if self.extra_criteria_factory is not None:\n            extra_criteria = self.extra_criteria_factory(\n                x_batch, y_batch, predictions, correct, max_probs\n            )\n        else:\n            extra_criteria = tuple([])\n\n        return (x_batch, y_batch), (correct, max_probs) + extra_criteria\n\n\nclass _ExtraCriteriaFactory(object):\n    \"\"\"\n    A factory that builds extra criteria\n    \"\"\"\n\n    def __init__(self, properties_to_hash=None):\n        self.properties_to_hash = properties_to_hash\n\n    def __hash__(self):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        return self.properties_to_hash.__hash__()\n\n    def __eq__(self, other):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        if not isinstance(other, _ExtraCriteriaFactory):\n            return False\n        return self.properties_to_hash == other.properties_to_hash\n\n    def __call__(self, x_batch, y_batch, predictions, correct, max_probs):\n        raise NotImplementedError()\n\n\nclass _WrongConfidenceFactory(_ExtraCriteriaFactory):\n    def __call__(self, x_batch, y_batch, predictions, correct, max_probs):\n        max_wrong_probs = tf.reduce_max(predictions * (1.0 - y_batch), axis=1)\n        return tuple([max_wrong_probs])\n\n\ndef bundle_examples_with_goal(\n    sess, model, adv_x_list, y, goal, report_path, batch_size=BATCH_SIZE\n):\n    \"\"\"\n    A post-processor version of attack bundling, that chooses the strongest\n    example from the output of multiple earlier bundling strategies.\n\n    :param sess: tf.session.Session\n    :param model: cleverhans.model.Model\n    :param adv_x_list: list of numpy arrays\n      Each entry in the list is the output of a previous bundler; it is an\n        adversarial version of the whole dataset.\n    :param y: numpy array containing true labels\n    :param goal: AttackGoal to use to choose the best version of each adversarial\n      example\n    :param report_path: str, the path the report will be saved to\n    :param batch_size: int, batch size\n    \"\"\"\n\n    # Check the input\n    num_attacks = len(adv_x_list)\n    assert num_attacks > 0\n    adv_x_0 = adv_x_list[0]\n    assert isinstance(adv_x_0, np.ndarray)\n    assert all(adv_x.shape == adv_x_0.shape for adv_x in adv_x_list)\n\n    # Allocate the output\n    out = np.zeros_like(adv_x_0)\n    m = adv_x_0.shape[0]\n    # Initialize with negative sentinel values to make sure everything is\n    # written to\n    correctness = -np.ones(m, dtype=\"int32\")\n    confidence = -np.ones(m, dtype=\"float32\")\n\n    # Gather criteria\n    criteria = [\n        goal.get_criteria(sess, model, adv_x, y, batch_size=batch_size)\n        for adv_x in adv_x_list\n    ]\n    assert all(\"correctness\" in c for c in criteria)\n    assert all(\"confidence\" in c for c in criteria)\n    _logger.info(\"Accuracy on each advx dataset: \")\n    for c in criteria:\n        _logger.info(\"\\t\" + str(c[\"correctness\"].mean()))\n\n    for example_idx in range(m):\n        # Index of the best attack for this example\n        attack_idx = 0\n        # Find the winner\n        for candidate_idx in range(1, num_attacks):\n            if goal.new_wins(\n                criteria[attack_idx], example_idx, criteria[candidate_idx], example_idx\n            ):\n                attack_idx = candidate_idx\n        # Copy the winner into the output\n        out[example_idx] = adv_x_list[attack_idx][example_idx]\n        correctness[example_idx] = criteria[attack_idx][\"correctness\"][example_idx]\n        confidence[example_idx] = criteria[attack_idx][\"confidence\"][example_idx]\n\n    assert correctness.min() >= 0\n    assert correctness.max() <= 1\n    assert confidence.min() >= 0.0\n    assert confidence.max() <= 1.0\n    correctness = correctness.astype(\"bool\")\n    _logger.info(\"Accuracy on bundled examples: \" + str(correctness.mean()))\n\n    report = ConfidenceReport()\n    report[\"bundled\"] = ConfidenceReportEntry(correctness, confidence)\n    serial.save(report_path, report)\n    assert report_path.endswith(\".joblib\")\n    adv_x_path = report_path[: -len(\".joblib\")] + \"_adv_x.npy\"\n    np.save(adv_x_path, out)\n\n\ndef spsa_max_confidence_recipe(\n    sess,\n    model,\n    x,\n    y,\n    nb_classes,\n    eps,\n    clip_min,\n    clip_max,\n    nb_iter,\n    report_path,\n    spsa_samples=SPSA.DEFAULT_SPSA_SAMPLES,\n    spsa_iters=SPSA.DEFAULT_SPSA_ITERS,\n    eval_batch_size=BATCH_SIZE,\n):\n    \"\"\"Runs the MaxConfidence attack using SPSA as the underlying optimizer.\n\n    Even though this runs only one attack, it must be implemented as a bundler\n    because SPSA supports only batch_size=1. The cleverhans.attacks.MaxConfidence\n    attack internally multiplies the batch size by nb_classes, so it can't take\n    SPSA as a base attacker. Insteader, we must bundle batch_size=1 calls using\n    cleverhans.attack_bundling.MaxConfidence.\n\n    References:\n    https://openreview.net/forum?id=H1g0piA9tQ\n\n    :param sess: tf.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing clean example inputs to attack\n    :param y: numpy array containing true labels\n    :param nb_classes: int, number of classes\n    :param eps: float, maximum size of perturbation (measured by max norm)\n    :param nb_iter: int, number of iterations for one version of PGD attacks\n      (will also run another version with 25X more iterations)\n    :param report_path: str, the path that the report will be saved to.\n    :param eval_batch_size: int, batch size for evaluation (as opposed to making attacks)\n    \"\"\"\n    spsa = SPSA(model, sess)\n    spsa_params = {\n        \"eps\": eps,\n        \"clip_min\": clip_min,\n        \"clip_max\": clip_max,\n        \"nb_iter\": nb_iter,\n        \"spsa_samples\": spsa_samples,\n        \"spsa_iters\": spsa_iters,\n    }\n    attack_configs = []\n    dev_batch_size = 1  # The only batch size supported by SPSA\n    batch_size = num_devices\n    ones = tf.ones(dev_batch_size, tf.int32)\n    for cls in range(nb_classes):\n        cls_params = copy.copy(spsa_params)\n        cls_params[\"y_target\"] = tf.to_float(tf.one_hot(ones * cls, nb_classes))\n        cls_attack_config = AttackConfig(spsa, cls_params, \"spsa_\" + str(cls))\n        attack_configs.append(cls_attack_config)\n    new_work_goal = {config: 1 for config in attack_configs}\n    goals = [MaxConfidence(t=1.0, new_work_goal=new_work_goal)]\n    bundle_attacks(\n        sess,\n        model,\n        x,\n        y,\n        attack_configs,\n        goals,\n        report_path,\n        attack_batch_size=batch_size,\n        eval_batch_size=eval_batch_size,\n    )\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/__init__.py",
    "content": "\"\"\"\nThe Attack class, providing a universal abstract interface describing attacks, and many implementations of it.\n\"\"\"\nfrom abc import ABCMeta\nimport collections\nimport warnings\nimport numpy as np\nfrom six.moves import xrange\nimport tensorflow as tf\n\nfrom cleverhans import utils\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.attacks.basic_iterative_method import BasicIterativeMethod\nfrom cleverhans.attacks.carlini_wagner_l2 import CarliniWagnerL2\nfrom cleverhans.attacks.deep_fool import DeepFool\nfrom cleverhans.attacks.elastic_net_method import ElasticNetMethod\nfrom cleverhans.attacks.fast_feature_adversaries import FastFeatureAdversaries\nfrom cleverhans.attacks.fast_gradient_method import (\n    FastGradientMethod,\n    fgm,\n    optimize_linear,\n)\nfrom cleverhans.attacks.lbfgs import LBFGS\nfrom cleverhans.attacks.madry_et_al import MadryEtAl\nfrom cleverhans.attacks.max_confidence import MaxConfidence\nfrom cleverhans.attacks.momentum_iterative_method import MomentumIterativeMethod\nfrom cleverhans.attacks.noise import Noise\nfrom cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent\nfrom cleverhans.attacks.saliency_map_method import SaliencyMapMethod\nfrom cleverhans.attacks.semantic import Semantic\nfrom cleverhans.attacks.spsa import SPSA, projected_optimization\nfrom cleverhans.attacks.spatial_transformation_method import SpatialTransformationMethod\nfrom cleverhans.attacks.virtual_adversarial_method import VirtualAdversarialMethod, vatm\nfrom cleverhans.attacks.hop_skip_jump_attack import (\n    HopSkipJumpAttack,\n    BoundaryAttackPlusPlus,\n)\nfrom cleverhans.attacks.sparse_l1_descent import SparseL1Descent\nfrom cleverhans.model import Model, CallableModelWrapper\nfrom cleverhans.model import wrapper_warning, wrapper_warning_logits\nfrom cleverhans.compat import reduce_sum, reduce_mean\nfrom cleverhans.compat import reduce_max\nfrom cleverhans.compat import softmax_cross_entropy_with_logits\nfrom cleverhans.utils_tf import clip_eta\nfrom cleverhans import utils_tf\n\n_logger = utils.create_logger(\"cleverhans.attacks\")\ntf_dtype = tf.as_dtype(\"float32\")\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/attack.py",
    "content": "\"\"\"\nThe Attack interface.\n\"\"\"\n\nfrom abc import ABCMeta\nimport collections\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.compat import reduce_max\nfrom cleverhans.model import Model\nfrom cleverhans import utils\n\n_logger = utils.create_logger(\"cleverhans.attacks.attack\")\n\n\nclass Attack(object):\n    \"\"\"\n    Abstract base class for all attack classes.\n    \"\"\"\n\n    __metaclass__ = ABCMeta\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        :param model: An instance of the cleverhans.model.Model class.\n        :param sess: The (possibly optional) tf.Session to run graphs in.\n        :param dtypestr: Floating point precision to use (change to float64\n                         to avoid numerical instabilities).\n        :param back: (deprecated and will be removed on or after 2019-03-26).\n                     The backend to use. Currently 'tf' is the only option.\n        \"\"\"\n        if \"back\" in kwargs:\n            if kwargs[\"back\"] == \"tf\":\n                warnings.warn(\n                    \"Argument back to attack constructors is not needed\"\n                    \" anymore and will be removed on or after 2019-03-26.\"\n                    \" All attacks are implemented using TensorFlow.\"\n                )\n            else:\n                raise ValueError(\n                    \"Backend argument must be 'tf' and is now deprecated\"\n                    \"It will be removed on or after 2019-03-26.\"\n                )\n\n        self.tf_dtype = tf.as_dtype(dtypestr)\n        self.np_dtype = np.dtype(dtypestr)\n\n        if sess is not None and not isinstance(sess, tf.Session):\n            raise TypeError(\"sess is not an instance of tf.Session\")\n\n        from cleverhans import attacks_tf\n\n        attacks_tf.np_dtype = self.np_dtype\n        attacks_tf.tf_dtype = self.tf_dtype\n\n        if not isinstance(model, Model):\n            raise TypeError(\n                \"The model argument should be an instance of\"\n                \" the cleverhans.model.Model class.\"\n            )\n\n        # Prepare attributes\n        self.model = model\n        self.sess = sess\n        self.dtypestr = dtypestr\n\n        # We are going to keep track of old graphs and cache them.\n        self.graphs = {}\n\n        # When calling generate_np, arguments in the following set should be\n        # fed into the graph, as they are not structural items that require\n        # generating a new graph.\n        # This dict should map names of arguments to the types they should\n        # have.\n        # (Usually, the target class will be a feedable keyword argument.)\n        self.feedable_kwargs = tuple()\n\n        # When calling generate_np, arguments in the following set should NOT\n        # be fed into the graph, as they ARE structural items that require\n        # generating a new graph.\n        # This list should contain the names of the structural arguments.\n        self.structural_kwargs = []\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate the attack's symbolic graph for adversarial examples. This\n        method should be overriden in any child class that implements an\n        attack that is expressable symbolically. Otherwise, it will wrap the\n        numerical implementation as a symbolic operator.\n\n        :param x: The model's symbolic inputs.\n        :param **kwargs: optional parameters used by child classes.\n          Each child class defines additional parameters as needed.\n          Child classes that use the following concepts should use the following\n          names:\n            clip_min: minimum feature value\n            clip_max: maximum feature value\n            eps: size of norm constraint on adversarial perturbation\n            ord: order of norm constraint\n            nb_iter: number of iterations\n            eps_iter: size of norm constraint on iteration\n            y_target: if specified, the attack is targeted.\n            y: Do not specify if y_target is specified.\n               If specified, the attack is untargeted, aims to make the output\n               class not be y.\n               If neither y_target nor y is specified, y is inferred by having\n               the model classify the input.\n          For other concepts, it's generally a good idea to read other classes\n          and check for name consistency.\n        :return: A symbolic representation of the adversarial examples.\n        \"\"\"\n\n        error = \"Sub-classes must implement generate.\"\n        raise NotImplementedError(error)\n        # Include an unused return so pylint understands the method signature\n        return x\n\n    def construct_graph(self, fixed, feedable, x_val, hash_key):\n        \"\"\"\n        Construct the graph required to run the attack through generate_np.\n\n        :param fixed: Structural elements that require defining a new graph.\n        :param feedable: Arguments that can be fed to the same graph when\n                         they take different values.\n        :param x_val: symbolic adversarial example\n        :param hash_key: the key used to store this graph in our cache\n        \"\"\"\n        # try our very best to create a TF placeholder for each of the\n        # feedable keyword arguments, and check the types are one of\n        # the allowed types\n        class_name = str(self.__class__).split(\".\")[-1][:-2]\n        _logger.info(\"Constructing new graph for attack \" + class_name)\n\n        # remove the None arguments, they are just left blank\n        for k in list(feedable.keys()):\n            if feedable[k] is None:\n                del feedable[k]\n\n        # process all of the rest and create placeholders for them\n        new_kwargs = dict(x for x in fixed.items())\n        for name, value in feedable.items():\n            given_type = value.dtype\n            if isinstance(value, np.ndarray):\n                if value.ndim == 0:\n                    # This is pretty clearly not a batch of data\n                    new_kwargs[name] = tf.placeholder(given_type, shape=[], name=name)\n                else:\n                    # Assume that this is a batch of data, make the first axis variable\n                    # in size\n                    new_shape = [None] + list(value.shape[1:])\n                    new_kwargs[name] = tf.placeholder(given_type, new_shape, name=name)\n            elif isinstance(value, utils.known_number_types):\n                new_kwargs[name] = tf.placeholder(given_type, shape=[], name=name)\n            else:\n                raise ValueError(\n                    \"Could not identify type of argument \" + name + \": \" + str(value)\n                )\n\n        # x is a special placeholder we always want to have\n        x_shape = [None] + list(x_val.shape)[1:]\n        x = tf.placeholder(self.tf_dtype, shape=x_shape)\n\n        # now we generate the graph that we want\n        x_adv = self.generate(x, **new_kwargs)\n\n        self.graphs[hash_key] = (x, new_kwargs, x_adv)\n\n        if len(self.graphs) >= 10:\n            warnings.warn(\n                \"Calling generate_np() with multiple different \"\n                \"structural parameters is inefficient and should\"\n                \" be avoided. Calling generate() is preferred.\"\n            )\n\n    def generate_np(self, x_val, **kwargs):\n        \"\"\"\n        Generate adversarial examples and return them as a NumPy array.\n        Sub-classes *should not* implement this method unless they must\n        perform special handling of arguments.\n\n        :param x_val: A NumPy array with the original inputs.\n        :param **kwargs: optional parameters used by child classes.\n        :return: A NumPy array holding the adversarial examples.\n        \"\"\"\n\n        if self.sess is None:\n            raise ValueError(\"Cannot use `generate_np` when no `sess` was\" \" provided\")\n\n        packed = self.construct_variables(kwargs)\n        fixed, feedable, _, hash_key = packed\n\n        if hash_key not in self.graphs:\n            self.construct_graph(fixed, feedable, x_val, hash_key)\n        else:\n            # remove the None arguments, they are just left blank\n            for k in list(feedable.keys()):\n                if feedable[k] is None:\n                    del feedable[k]\n\n        x, new_kwargs, x_adv = self.graphs[hash_key]\n\n        feed_dict = {x: x_val}\n\n        for name in feedable:\n            feed_dict[new_kwargs[name]] = feedable[name]\n\n        return self.sess.run(x_adv, feed_dict)\n\n    def construct_variables(self, kwargs):\n        \"\"\"\n        Construct the inputs to the attack graph to be used by generate_np.\n\n        :param kwargs: Keyword arguments to generate_np.\n        :return:\n          Structural arguments\n          Feedable arguments\n          Output of `arg_type` describing feedable arguments\n          A unique key\n        \"\"\"\n        if isinstance(self.feedable_kwargs, dict):\n            warnings.warn(\n                \"Using a dict for `feedable_kwargs is deprecated.\"\n                \"Switch to using a tuple.\"\n                \"It is not longer necessary to specify the types \"\n                \"of the arguments---we build a different graph \"\n                \"for each received type.\"\n                \"Using a dict may become an error on or after \"\n                \"2019-04-18.\"\n            )\n            feedable_names = tuple(sorted(self.feedable_kwargs.keys()))\n        else:\n            feedable_names = self.feedable_kwargs\n            if not isinstance(feedable_names, tuple):\n                raise TypeError(\n                    \"Attack.feedable_kwargs should be a tuple, but \"\n                    \"for subclass \"\n                    + str(type(self))\n                    + \" it is \"\n                    + str(self.feedable_kwargs)\n                    + \" of type \"\n                    + str(type(self.feedable_kwargs))\n                )\n\n        # the set of arguments that are structural properties of the attack\n        # if these arguments are different, we must construct a new graph\n        fixed = dict((k, v) for k, v in kwargs.items() if k in self.structural_kwargs)\n\n        # the set of arguments that are passed as placeholders to the graph\n        # on each call, and can change without constructing a new graph\n        feedable = {k: v for k, v in kwargs.items() if k in feedable_names}\n        for k in feedable:\n            if isinstance(feedable[k], (float, int)):\n                feedable[k] = np.array(feedable[k])\n\n        for key in kwargs:\n            if key not in fixed and key not in feedable:\n                raise ValueError(str(type(self)) + \": Undeclared argument: \" + key)\n\n        feed_arg_type = arg_type(feedable_names, feedable)\n\n        if not all(isinstance(value, collections.Hashable) for value in fixed.values()):\n            # we have received a fixed value that isn't hashable\n            # this means we can't cache this graph for later use,\n            # and it will have to be discarded later\n            hash_key = None\n        else:\n            # create a unique key for this set of fixed paramaters\n            hash_key = tuple(sorted(fixed.items())) + tuple([feed_arg_type])\n\n        return fixed, feedable, feed_arg_type, hash_key\n\n    def get_or_guess_labels(self, x, kwargs):\n        \"\"\"\n        Get the label to use in generating an adversarial example for x.\n        The kwargs are fed directly from the kwargs of the attack.\n        If 'y' is in kwargs, then assume it's an untargeted attack and\n        use that as the label.\n        If 'y_target' is in kwargs and is not none, then assume it's a\n        targeted attack and use that as the label.\n        Otherwise, use the model's prediction as the label and perform an\n        untargeted attack.\n        \"\"\"\n        if \"y\" in kwargs and \"y_target\" in kwargs:\n            raise ValueError(\"Can not set both 'y' and 'y_target'.\")\n        elif \"y\" in kwargs:\n            labels = kwargs[\"y\"]\n        elif \"y_target\" in kwargs and kwargs[\"y_target\"] is not None:\n            labels = kwargs[\"y_target\"]\n        else:\n            preds = self.model.get_probs(x)\n            preds_max = reduce_max(preds, 1, keepdims=True)\n            original_predictions = tf.to_float(tf.equal(preds, preds_max))\n            labels = tf.stop_gradient(original_predictions)\n            del preds\n        if isinstance(labels, np.ndarray):\n            nb_classes = labels.shape[1]\n        else:\n            nb_classes = labels.get_shape().as_list()[1]\n        return labels, nb_classes\n\n    def parse_params(self, params=None):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        :param params: a dictionary of attack-specific parameters\n        :return: True when parsing was successful\n        \"\"\"\n\n        if params is not None:\n            warnings.warn(\n                \"`params` is unused and will be removed \" \" on or after 2019-04-26.\"\n            )\n        return True\n\n\ndef arg_type(arg_names, kwargs):\n    \"\"\"\n    Returns a hashable summary of the types of arg_names within kwargs.\n    :param arg_names: tuple containing names of relevant arguments\n    :param kwargs: dict mapping string argument names to values.\n      These must be values for which we can create a tf placeholder.\n      Currently supported: numpy darray or something that can ducktype it\n    returns:\n      API contract is to return a hashable object describing all\n      structural consequences of argument values that can otherwise\n      be fed into a graph of fixed structure.\n      Currently this is implemented as a tuple of tuples that track:\n        - whether each argument was passed\n        - whether each argument was passed and not None\n        - the dtype of each argument\n      Callers shouldn't rely on the exact structure of this object,\n      just its hashability and one-to-one mapping between graph structures.\n    \"\"\"\n    assert isinstance(arg_names, tuple)\n    passed = tuple(name in kwargs for name in arg_names)\n    passed_and_not_none = []\n    for name in arg_names:\n        if name in kwargs:\n            passed_and_not_none.append(kwargs[name] is not None)\n        else:\n            passed_and_not_none.append(False)\n    passed_and_not_none = tuple(passed_and_not_none)\n    dtypes = []\n    for name in arg_names:\n        if name not in kwargs:\n            dtypes.append(None)\n            continue\n        value = kwargs[name]\n        if value is None:\n            dtypes.append(None)\n            continue\n        assert hasattr(value, \"dtype\"), type(value)\n        dtype = value.dtype\n        if not isinstance(dtype, np.dtype):\n            dtype = dtype.as_np_dtype\n        assert isinstance(dtype, np.dtype)\n        dtypes.append(dtype)\n    dtypes = tuple(dtypes)\n    return (passed, passed_and_not_none, dtypes)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/basic_iterative_method.py",
    "content": "\"\"\"\nThe BasicIterativeMethod attack.\n\"\"\"\n\nfrom cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent\n\n\nclass BasicIterativeMethod(ProjectedGradientDescent):\n    \"\"\"\n    The BasicIterativeMethod attack.\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        super(BasicIterativeMethod, self).__init__(\n            model, sess=sess, dtypestr=dtypestr, default_rand_init=False, **kwargs\n        )\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/carlini_wagner_l2.py",
    "content": "\"\"\"The CarliniWagnerL2 attack\n\"\"\"\n# pylint: disable=missing-docstring\nimport logging\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.compat import reduce_sum, reduce_max\nfrom cleverhans.model import CallableModelWrapper, Model, wrapper_warning_logits\nfrom cleverhans import utils\n\nnp_dtype = np.dtype(\"float32\")\ntf_dtype = tf.as_dtype(\"float32\")\n\n_logger = utils.create_logger(\"cleverhans.attacks.carlini_wagner_l2\")\n_logger.setLevel(logging.INFO)\n\n\nclass CarliniWagnerL2(Attack):\n    \"\"\"\n    This attack was originally proposed by Carlini and Wagner. It is an\n    iterative attack that finds adversarial examples on many defenses that\n    are robust to other attacks.\n    Paper link: https://arxiv.org/abs/1608.04644\n\n    At a high level, this attack is an iterative attack using Adam and\n    a specially-chosen loss function to find adversarial examples with\n    lower distortion than other attacks. This comes at the cost of speed,\n    as this attack is often much slower than others.\n\n    :param model: cleverhans.model.Model\n    :param sess: tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Note: the model parameter should be an instance of the\n        cleverhans.model.Model abstraction provided by CleverHans.\n        \"\"\"\n        if not isinstance(model, Model):\n            wrapper_warning_logits()\n            model = CallableModelWrapper(model, \"logits\")\n\n        super(CarliniWagnerL2, self).__init__(model, sess, dtypestr, **kwargs)\n\n        self.feedable_kwargs = (\"y\", \"y_target\")\n\n        self.structural_kwargs = [\n            \"batch_size\",\n            \"confidence\",\n            \"targeted\",\n            \"learning_rate\",\n            \"binary_search_steps\",\n            \"max_iterations\",\n            \"abort_early\",\n            \"initial_const\",\n            \"clip_min\",\n            \"clip_max\",\n        ]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Return a tensor that constructs adversarial examples for the given\n        input. Generate uses tf.py_func in order to operate over tensors.\n\n        :param x: A tensor with the inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        assert (\n            self.sess is not None\n        ), \"Cannot use `generate` when no `sess` was provided\"\n        self.parse_params(**kwargs)\n\n        labels, nb_classes = self.get_or_guess_labels(x, kwargs)\n\n        attack = CWL2(\n            self.sess,\n            self.model,\n            self.batch_size,\n            self.confidence,\n            \"y_target\" in kwargs,\n            self.learning_rate,\n            self.binary_search_steps,\n            self.max_iterations,\n            self.abort_early,\n            self.initial_const,\n            self.clip_min,\n            self.clip_max,\n            nb_classes,\n            x.get_shape().as_list()[1:],\n        )\n\n        def cw_wrap(x_val, y_val):\n            return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype)\n\n        wrap = tf.py_func(cw_wrap, [x, labels], self.tf_dtype)\n        wrap.set_shape(x.get_shape())\n\n        return wrap\n\n    def parse_params(\n        self,\n        y=None,\n        y_target=None,\n        batch_size=1,\n        confidence=0,\n        learning_rate=5e-3,\n        binary_search_steps=5,\n        max_iterations=1000,\n        abort_early=True,\n        initial_const=1e-2,\n        clip_min=0,\n        clip_max=1,\n    ):\n        \"\"\"\n        :param y: (optional) A tensor with the true labels for an untargeted\n                  attack. If None (and y_target is None) then use the\n                  original labels the classifier assigns.\n        :param y_target: (optional) A tensor with the target labels for a\n                  targeted attack.\n        :param confidence: Confidence of adversarial examples: higher produces\n                           examples with larger l2 distortion, but more\n                           strongly classified as adversarial.\n        :param batch_size: Number of attacks to run simultaneously.\n        :param learning_rate: The learning rate for the attack algorithm.\n                              Smaller values produce better results but are\n                              slower to converge.\n        :param binary_search_steps: The number of times we perform binary\n                                    search to find the optimal tradeoff-\n                                    constant between norm of the purturbation\n                                    and confidence of the classification.\n        :param max_iterations: The maximum number of iterations. Setting this\n                               to a larger value will produce lower distortion\n                               results. Using only a few iterations requires\n                               a larger learning rate, and will produce larger\n                               distortion results.\n        :param abort_early: If true, allows early aborts if gradient descent\n                            is unable to make progress (i.e., gets stuck in\n                            a local minimum).\n        :param initial_const: The initial tradeoff-constant to use to tune the\n                              relative importance of size of the perturbation\n                              and confidence of classification.\n                              If binary_search_steps is large, the initial\n                              constant is not important. A smaller value of\n                              this constant gives lower distortion results.\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        \"\"\"\n\n        # ignore the y and y_target argument\n        self.batch_size = batch_size\n        self.confidence = confidence\n        self.learning_rate = learning_rate\n        self.binary_search_steps = binary_search_steps\n        self.max_iterations = max_iterations\n        self.abort_early = abort_early\n        self.initial_const = initial_const\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n\n\ndef ZERO():\n    return np.asarray(0.0, dtype=np_dtype)\n\n\nclass CWL2(object):\n    def __init__(\n        self,\n        sess,\n        model,\n        batch_size,\n        confidence,\n        targeted,\n        learning_rate,\n        binary_search_steps,\n        max_iterations,\n        abort_early,\n        initial_const,\n        clip_min,\n        clip_max,\n        num_labels,\n        shape,\n    ):\n        \"\"\"\n        Return a tensor that constructs adversarial examples for the given\n        input. Generate uses tf.py_func in order to operate over tensors.\n\n        :param sess: a TF session.\n        :param model: a cleverhans.model.Model object.\n        :param batch_size: Number of attacks to run simultaneously.\n        :param confidence: Confidence of adversarial examples: higher produces\n                           examples with larger l2 distortion, but more\n                           strongly classified as adversarial.\n        :param targeted: boolean controlling the behavior of the adversarial\n                         examples produced. If set to False, they will be\n                         misclassified in any wrong class. If set to True,\n                         they will be misclassified in a chosen target class.\n        :param learning_rate: The learning rate for the attack algorithm.\n                              Smaller values produce better results but are\n                              slower to converge.\n        :param binary_search_steps: The number of times we perform binary\n                                    search to find the optimal tradeoff-\n                                    constant between norm of the purturbation\n                                    and confidence of the classification.\n        :param max_iterations: The maximum number of iterations. Setting this\n                               to a larger value will produce lower distortion\n                               results. Using only a few iterations requires\n                               a larger learning rate, and will produce larger\n                               distortion results.\n        :param abort_early: If true, allows early aborts if gradient descent\n                            is unable to make progress (i.e., gets stuck in\n                            a local minimum).\n        :param initial_const: The initial tradeoff-constant to use to tune the\n                              relative importance of size of the pururbation\n                              and confidence of classification.\n                              If binary_search_steps is large, the initial\n                              constant is not important. A smaller value of\n                              this constant gives lower distortion results.\n        :param clip_min: (optional float) Minimum input component value.\n        :param clip_max: (optional float) Maximum input component value.\n        :param num_labels: the number of classes in the model's output.\n        :param shape: the shape of the model's input tensor.\n        \"\"\"\n\n        self.sess = sess\n        self.TARGETED = targeted\n        self.LEARNING_RATE = learning_rate\n        self.MAX_ITERATIONS = max_iterations\n        self.BINARY_SEARCH_STEPS = binary_search_steps\n        self.ABORT_EARLY = abort_early\n        self.CONFIDENCE = confidence\n        self.initial_const = initial_const\n        self.batch_size = batch_size\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        self.model = model\n\n        self.repeat = binary_search_steps >= 10\n\n        self.shape = shape = tuple([batch_size] + list(shape))\n\n        # the variable we're going to optimize over\n        modifier = tf.Variable(np.zeros(shape, dtype=np_dtype))\n\n        # these are variables to be more efficient in sending data to tf\n        self.timg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name=\"timg\")\n        self.tlab = tf.Variable(\n            np.zeros((batch_size, num_labels)), dtype=tf_dtype, name=\"tlab\"\n        )\n        self.const = tf.Variable(np.zeros(batch_size), dtype=tf_dtype, name=\"const\")\n\n        # and here's what we use to assign them\n        self.assign_timg = tf.placeholder(tf_dtype, shape, name=\"assign_timg\")\n        self.assign_tlab = tf.placeholder(\n            tf_dtype, (batch_size, num_labels), name=\"assign_tlab\"\n        )\n        self.assign_const = tf.placeholder(tf_dtype, [batch_size], name=\"assign_const\")\n\n        # the resulting instance, tanh'd to keep bounded from clip_min\n        # to clip_max\n        self.newimg = (tf.tanh(modifier + self.timg) + 1) / 2\n        self.newimg = self.newimg * (clip_max - clip_min) + clip_min\n\n        # prediction BEFORE-SOFTMAX of the model\n        self.output = model.get_logits(self.newimg)\n\n        # distance to the input data\n        self.other = (tf.tanh(self.timg) + 1) / 2 * (clip_max - clip_min) + clip_min\n        self.l2dist = reduce_sum(\n            tf.square(self.newimg - self.other), list(range(1, len(shape)))\n        )\n\n        # compute the probability of the label class versus the maximum other\n        real = reduce_sum((self.tlab) * self.output, 1)\n        other = reduce_max((1 - self.tlab) * self.output - self.tlab * 10000, 1)\n\n        if self.TARGETED:\n            # if targeted, optimize for making the other class most likely\n            loss1 = tf.maximum(ZERO(), other - real + self.CONFIDENCE)\n        else:\n            # if untargeted, optimize for making this class least likely.\n            loss1 = tf.maximum(ZERO(), real - other + self.CONFIDENCE)\n\n        # sum up the losses\n        self.loss2 = reduce_sum(self.l2dist)\n        self.loss1 = reduce_sum(self.const * loss1)\n        self.loss = self.loss1 + self.loss2\n\n        # Setup the adam optimizer and keep track of variables we're creating\n        start_vars = set(x.name for x in tf.global_variables())\n        optimizer = tf.train.AdamOptimizer(self.LEARNING_RATE)\n        self.train = optimizer.minimize(self.loss, var_list=[modifier])\n        end_vars = tf.global_variables()\n        new_vars = [x for x in end_vars if x.name not in start_vars]\n\n        # these are the variables to initialize when we run\n        self.setup = []\n        self.setup.append(self.timg.assign(self.assign_timg))\n        self.setup.append(self.tlab.assign(self.assign_tlab))\n        self.setup.append(self.const.assign(self.assign_const))\n\n        self.init = tf.variables_initializer(var_list=[modifier] + new_vars)\n\n    def attack(self, imgs, targets):\n        \"\"\"\n        Perform the L_2 attack on the given instance for the given targets.\n\n        If self.targeted is true, then the targets represents the target labels\n        If self.targeted is false, then targets are the original class labels\n        \"\"\"\n\n        r = []\n        for i in range(0, len(imgs), self.batch_size):\n            _logger.debug((\"Running CWL2 attack on instance %s of %s\", i, len(imgs)))\n            r.extend(\n                self.attack_batch(\n                    imgs[i : i + self.batch_size], targets[i : i + self.batch_size]\n                )\n            )\n        return np.array(r)\n\n    def attack_batch(self, imgs, labs):\n        \"\"\"\n        Run the attack on a batch of instance and labels.\n        \"\"\"\n\n        def compare(x, y):\n            if not isinstance(x, (float, int, np.int64)):\n                x = np.copy(x)\n                if self.TARGETED:\n                    x[y] -= self.CONFIDENCE\n                else:\n                    x[y] += self.CONFIDENCE\n                x = np.argmax(x)\n            if self.TARGETED:\n                return x == y\n            else:\n                return x != y\n\n        batch_size = self.batch_size\n\n        oimgs = np.clip(imgs, self.clip_min, self.clip_max)\n\n        # re-scale instances to be within range [0, 1]\n        imgs = (imgs - self.clip_min) / (self.clip_max - self.clip_min)\n        imgs = np.clip(imgs, 0, 1)\n        # now convert to [-1, 1]\n        imgs = (imgs * 2) - 1\n        # convert to tanh-space\n        imgs = np.arctanh(imgs * 0.999999)\n\n        # set the lower and upper bounds accordingly\n        lower_bound = np.zeros(batch_size)\n        CONST = np.ones(batch_size) * self.initial_const\n        upper_bound = np.ones(batch_size) * 1e10\n\n        # placeholders for the best l2, score, and instance attack found so far\n        o_bestl2 = [1e10] * batch_size\n        o_bestscore = [-1] * batch_size\n        o_bestattack = np.copy(oimgs)\n\n        for outer_step in range(self.BINARY_SEARCH_STEPS):\n            # completely reset adam's internal state.\n            self.sess.run(self.init)\n            batch = imgs[:batch_size]\n            batchlab = labs[:batch_size]\n\n            bestl2 = [1e10] * batch_size\n            bestscore = [-1] * batch_size\n            _logger.debug(\n                \"  Binary search step %s of %s\", outer_step, self.BINARY_SEARCH_STEPS\n            )\n\n            # The last iteration (if we run many steps) repeat the search once.\n            if self.repeat and outer_step == self.BINARY_SEARCH_STEPS - 1:\n                CONST = upper_bound\n\n            # set the variables so that we don't have to send them over again\n            self.sess.run(\n                self.setup,\n                {\n                    self.assign_timg: batch,\n                    self.assign_tlab: batchlab,\n                    self.assign_const: CONST,\n                },\n            )\n\n            prev = 1e6\n            for iteration in range(self.MAX_ITERATIONS):\n                # perform the attack\n                _, l, l2s, scores, nimg = self.sess.run(\n                    [self.train, self.loss, self.l2dist, self.output, self.newimg]\n                )\n\n                if iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0:\n                    _logger.debug(\n                        (\n                            \"    Iteration {} of {}: loss={:.3g} \"\n                            + \"l2={:.3g} f={:.3g}\"\n                        ).format(\n                            iteration,\n                            self.MAX_ITERATIONS,\n                            l,\n                            np.mean(l2s),\n                            np.mean(scores),\n                        )\n                    )\n\n                # check if we should abort search if we're getting nowhere.\n                if (\n                    self.ABORT_EARLY\n                    and iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0\n                ):\n                    if l > prev * 0.9999:\n                        msg = \"    Failed to make progress; stop early\"\n                        _logger.debug(msg)\n                        break\n                    prev = l\n\n                # adjust the best result found so far\n                for e, (l2, sc, ii) in enumerate(zip(l2s, scores, nimg)):\n                    lab = np.argmax(batchlab[e])\n                    if l2 < bestl2[e] and compare(sc, lab):\n                        bestl2[e] = l2\n                        bestscore[e] = np.argmax(sc)\n                    if l2 < o_bestl2[e] and compare(sc, lab):\n                        o_bestl2[e] = l2\n                        o_bestscore[e] = np.argmax(sc)\n                        o_bestattack[e] = ii\n\n            # adjust the constant as needed\n            for e in range(batch_size):\n                if compare(bestscore[e], np.argmax(batchlab[e])) and bestscore[e] != -1:\n                    # success, divide const by two\n                    upper_bound[e] = min(upper_bound[e], CONST[e])\n                    if upper_bound[e] < 1e9:\n                        CONST[e] = (lower_bound[e] + upper_bound[e]) / 2\n                else:\n                    # failure, either multiply by 10 if no solution found yet\n                    #          or do binary search with the known upper bound\n                    lower_bound[e] = max(lower_bound[e], CONST[e])\n                    if upper_bound[e] < 1e9:\n                        CONST[e] = (lower_bound[e] + upper_bound[e]) / 2\n                    else:\n                        CONST[e] *= 10\n            _logger.debug(\n                \"  Successfully generated adversarial examples \"\n                + \"on {} of {} instances.\".format(sum(upper_bound < 1e9), batch_size)\n            )\n            o_bestl2 = np.array(o_bestl2)\n            mean = np.mean(np.sqrt(o_bestl2[o_bestl2 < 1e9]))\n            _logger.debug(\"   Mean successful distortion: {:.4g}\".format(mean))\n\n        # return the best solution found\n        o_bestl2 = np.array(o_bestl2)\n        return o_bestattack\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/deep_fool.py",
    "content": "\"\"\"The DeepFool attack\n\n\"\"\"\nimport copy\nimport logging\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.model import Model, wrapper_warning_logits, CallableModelWrapper\nfrom cleverhans import utils\nfrom cleverhans import utils_tf\n\nnp_dtype = np.dtype(\"float32\")\n\n_logger = utils.create_logger(\"cleverhans.attacks.deep_fool\")\n_logger.setLevel(logging.INFO)\n\n\nclass DeepFool(Attack):\n    \"\"\"\n    DeepFool is an untargeted & iterative attack which is based on an\n    iterative linearization of the classifier. The implementation here\n    is w.r.t. the L2 norm.\n    Paper link: \"https://arxiv.org/pdf/1511.04599.pdf\"\n\n    :param model: cleverhans.model.Model\n    :param sess: tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Create a DeepFool instance.\n        \"\"\"\n        if not isinstance(model, Model):\n            wrapper_warning_logits()\n            model = CallableModelWrapper(model, \"logits\")\n\n        super(DeepFool, self).__init__(model, sess, dtypestr, **kwargs)\n\n        self.structural_kwargs = [\n            \"overshoot\",\n            \"max_iter\",\n            \"clip_max\",\n            \"clip_min\",\n            \"nb_candidate\",\n        ]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n\n        :param x: The model's symbolic inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        assert (\n            self.sess is not None\n        ), \"Cannot use `generate` when no `sess` was provided\"\n        from cleverhans.utils_tf import jacobian_graph\n\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        # Define graph wrt to this input placeholder\n        logits = self.model.get_logits(x)\n        self.nb_classes = logits.get_shape().as_list()[-1]\n        assert (\n            self.nb_candidate <= self.nb_classes\n        ), \"nb_candidate should not be greater than nb_classes\"\n        preds = tf.reshape(\n            tf.nn.top_k(logits, k=self.nb_candidate)[0], [-1, self.nb_candidate]\n        )\n        # grads will be the shape [batch_size, nb_candidate, image_size]\n        grads = tf.stack(jacobian_graph(preds, x, self.nb_candidate), axis=1)\n\n        # Define graph\n        def deepfool_wrap(x_val):\n            \"\"\"deepfool function for py_func\"\"\"\n            return deepfool_batch(\n                self.sess,\n                x,\n                preds,\n                logits,\n                grads,\n                x_val,\n                self.nb_candidate,\n                self.overshoot,\n                self.max_iter,\n                self.clip_min,\n                self.clip_max,\n                self.nb_classes,\n            )\n\n        wrap = tf.py_func(deepfool_wrap, [x], self.tf_dtype)\n        wrap.set_shape(x.get_shape())\n        return wrap\n\n    def parse_params(\n        self,\n        nb_candidate=10,\n        overshoot=0.02,\n        max_iter=50,\n        clip_min=0.0,\n        clip_max=1.0,\n        **kwargs\n    ):\n        \"\"\"\n        :param nb_candidate: The number of classes to test against, i.e.,\n                             deepfool only consider nb_candidate classes when\n                             attacking(thus accelerate speed). The nb_candidate\n                             classes are chosen according to the prediction\n                             confidence during implementation.\n        :param overshoot: A termination criterion to prevent vanishing updates\n        :param max_iter: Maximum number of iteration for deepfool\n        :param clip_min: Minimum component value for clipping\n        :param clip_max: Maximum component value for clipping\n        \"\"\"\n        self.nb_candidate = nb_candidate\n        self.overshoot = overshoot\n        self.max_iter = max_iter\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n\n        return True\n\n\ndef deepfool_batch(\n    sess,\n    x,\n    pred,\n    logits,\n    grads,\n    X,\n    nb_candidate,\n    overshoot,\n    max_iter,\n    clip_min,\n    clip_max,\n    nb_classes,\n    feed=None,\n):\n    \"\"\"\n    Applies DeepFool to a batch of inputs\n    :param sess: TF session\n    :param x: The input placeholder\n    :param pred: The model's sorted symbolic output of logits, only the top\n                 nb_candidate classes are contained\n    :param logits: The model's unnormalized output tensor (the input to\n                   the softmax layer)\n    :param grads: Symbolic gradients of the top nb_candidate classes, procuded\n                  from gradient_graph\n    :param X: Numpy array with sample inputs\n    :param nb_candidate: The number of classes to test against, i.e.,\n                         deepfool only consider nb_candidate classes when\n                         attacking(thus accelerate speed). The nb_candidate\n                         classes are chosen according to the prediction\n                         confidence during implementation.\n    :param overshoot: A termination criterion to prevent vanishing updates\n    :param max_iter: Maximum number of iteration for DeepFool\n    :param clip_min: Minimum value for components of the example returned\n    :param clip_max: Maximum value for components of the example returned\n    :param nb_classes: Number of model output classes\n    :return: Adversarial examples\n    \"\"\"\n    X_adv = deepfool_attack(\n        sess,\n        x,\n        pred,\n        logits,\n        grads,\n        X,\n        nb_candidate,\n        overshoot,\n        max_iter,\n        clip_min,\n        clip_max,\n        feed=feed,\n    )\n\n    return np.asarray(X_adv, dtype=np_dtype)\n\n\ndef deepfool_attack(\n    sess,\n    x,\n    predictions,\n    logits,\n    grads,\n    sample,\n    nb_candidate,\n    overshoot,\n    max_iter,\n    clip_min,\n    clip_max,\n    feed=None,\n):\n    \"\"\"\n    TensorFlow implementation of DeepFool.\n    Paper link: see https://arxiv.org/pdf/1511.04599.pdf\n    :param sess: TF session\n    :param x: The input placeholder\n    :param predictions: The model's sorted symbolic output of logits, only the\n                       top nb_candidate classes are contained\n    :param logits: The model's unnormalized output tensor (the input to\n                   the softmax layer)\n    :param grads: Symbolic gradients of the top nb_candidate classes, procuded\n                 from gradient_graph\n    :param sample: Numpy array with sample input\n    :param nb_candidate: The number of classes to test against, i.e.,\n                         deepfool only consider nb_candidate classes when\n                         attacking(thus accelerate speed). The nb_candidate\n                         classes are chosen according to the prediction\n                         confidence during implementation.\n    :param overshoot: A termination criterion to prevent vanishing updates\n    :param max_iter: Maximum number of iteration for DeepFool\n    :param clip_min: Minimum value for components of the example returned\n    :param clip_max: Maximum value for components of the example returned\n    :return: Adversarial examples\n    \"\"\"\n    adv_x = copy.copy(sample)\n    # Initialize the loop variables\n    iteration = 0\n    current = utils_tf.model_argmax(sess, x, logits, adv_x, feed=feed)\n    if current.shape == ():\n        current = np.array([current])\n    w = np.squeeze(np.zeros(sample.shape[1:]))  # same shape as original image\n    r_tot = np.zeros(sample.shape)\n    original = current  # use original label as the reference\n\n    _logger.debug(\"Starting DeepFool attack up to %s iterations\", max_iter)\n    # Repeat this main loop until we have achieved misclassification\n    while np.any(current == original) and iteration < max_iter:\n\n        if iteration % 5 == 0 and iteration > 0:\n            _logger.info(\"Attack result at iteration %s is %s\", iteration, current)\n        gradients = sess.run(grads, feed_dict={x: adv_x})\n        predictions_val = sess.run(predictions, feed_dict={x: adv_x})\n        for idx in range(sample.shape[0]):\n            pert = np.inf\n            if current[idx] != original[idx]:\n                continue\n            for k in range(1, nb_candidate):\n                w_k = gradients[idx, k, ...] - gradients[idx, 0, ...]\n                f_k = predictions_val[idx, k] - predictions_val[idx, 0]\n                # adding value 0.00001 to prevent f_k = 0\n                pert_k = (abs(f_k) + 0.00001) / np.linalg.norm(w_k.flatten())\n                if pert_k < pert:\n                    pert = pert_k\n                    w = w_k\n            r_i = pert * w / np.linalg.norm(w)\n            r_tot[idx, ...] = r_tot[idx, ...] + r_i\n\n        adv_x = np.clip(r_tot + sample, clip_min, clip_max)\n        current = utils_tf.model_argmax(sess, x, logits, adv_x, feed=feed)\n        if current.shape == ():\n            current = np.array([current])\n        # Update loop variables\n        iteration = iteration + 1\n\n    # need more revision, including info like how many succeed\n    _logger.info(\"Attack result at iteration %s is %s\", iteration, current)\n    _logger.info(\n        \"%s out of %s become adversarial examples at iteration %s\",\n        sum(current != original),\n        sample.shape[0],\n        iteration,\n    )\n    # need to clip this image into the given range\n    adv_x = np.clip((1 + overshoot) * r_tot + sample, clip_min, clip_max)\n    return adv_x\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/elastic_net_method.py",
    "content": "\"\"\"The ElasticNetMethod attack.\n\"\"\"\n# pylint: disable=missing-docstring\nimport logging\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.compat import reduce_sum, reduce_max\nfrom cleverhans.model import Model, CallableModelWrapper, wrapper_warning_logits\nfrom cleverhans import utils\n\nnp_dtype = np.dtype(\"float32\")\ntf_dtype = tf.as_dtype(\"float32\")\n\n_logger = utils.create_logger(\"cleverhans.attacks.elastic_net_method\")\n_logger.setLevel(logging.INFO)\n\n\ndef ZERO():\n    return np.asarray(0.0, dtype=np_dtype)\n\n\nclass ElasticNetMethod(Attack):\n    \"\"\"\n    This attack features L1-oriented adversarial examples and includes\n    the C&W L2 attack as a special case (when beta is set to 0).\n    Adversarial examples attain similar performance to those\n    generated by the C&W L2 attack in the white-box case,\n    and more importantly, have improved transferability properties\n    and complement adversarial training.\n    Paper link: https://arxiv.org/abs/1709.04114\n\n    :param model: cleverhans.model.Model\n    :param sess: tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Note: the model parameter should be an instance of the\n        cleverhans.model.Model abstraction provided by CleverHans.\n        \"\"\"\n        if not isinstance(model, Model):\n            wrapper_warning_logits()\n            model = CallableModelWrapper(model, \"logits\")\n\n        super(ElasticNetMethod, self).__init__(model, sess, dtypestr, **kwargs)\n\n        self.feedable_kwargs = (\"y\", \"y_target\")\n\n        self.structural_kwargs = [\n            \"beta\",\n            \"decision_rule\",\n            \"batch_size\",\n            \"confidence\",\n            \"targeted\",\n            \"learning_rate\",\n            \"binary_search_steps\",\n            \"max_iterations\",\n            \"abort_early\",\n            \"initial_const\",\n            \"clip_min\",\n            \"clip_max\",\n        ]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Return a tensor that constructs adversarial examples for the given\n        input. Generate uses tf.py_func in order to operate over tensors.\n\n        :param x: (required) A tensor with the inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        assert (\n            self.sess is not None\n        ), \"Cannot use `generate` when no `sess` was provided\"\n        self.parse_params(**kwargs)\n\n        labels, nb_classes = self.get_or_guess_labels(x, kwargs)\n\n        attack = EAD(\n            self.sess,\n            self.model,\n            self.beta,\n            self.decision_rule,\n            self.batch_size,\n            self.confidence,\n            \"y_target\" in kwargs,\n            self.learning_rate,\n            self.binary_search_steps,\n            self.max_iterations,\n            self.abort_early,\n            self.initial_const,\n            self.clip_min,\n            self.clip_max,\n            nb_classes,\n            x.get_shape().as_list()[1:],\n        )\n\n        def ead_wrap(x_val, y_val):\n            return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype)\n\n        wrap = tf.py_func(ead_wrap, [x, labels], self.tf_dtype)\n        wrap.set_shape(x.get_shape())\n\n        return wrap\n\n    def parse_params(\n        self,\n        y=None,\n        y_target=None,\n        beta=1e-2,\n        decision_rule=\"EN\",\n        batch_size=1,\n        confidence=0,\n        learning_rate=1e-2,\n        binary_search_steps=9,\n        max_iterations=1000,\n        abort_early=False,\n        initial_const=1e-3,\n        clip_min=0,\n        clip_max=1,\n    ):\n        \"\"\"\n        :param y: (optional) A tensor with the true labels for an untargeted\n                  attack. If None (and y_target is None) then use the\n                  original labels the classifier assigns.\n        :param y_target: (optional) A tensor with the target labels for a\n                  targeted attack.\n        :param beta: Trades off L2 distortion with L1 distortion: higher\n                     produces examples with lower L1 distortion, at the\n                     cost of higher L2 (and typically Linf) distortion\n        :param decision_rule: EN or L1. Select final adversarial example from\n                              all successful examples based on the least\n                              elastic-net or L1 distortion criterion.\n        :param confidence: Confidence of adversarial examples: higher produces\n                           examples with larger l2 distortion, but more\n                           strongly classified as adversarial.\n        :param batch_size: Number of attacks to run simultaneously.\n        :param learning_rate: The learning rate for the attack algorithm.\n                              Smaller values produce better results but are\n                              slower to converge.\n        :param binary_search_steps: The number of times we perform binary\n                                    search to find the optimal tradeoff-\n                                    constant between norm of the perturbation\n                                    and confidence of the classification. Set\n                                    'initial_const' to a large value and fix\n                                    this param to 1 for speed.\n        :param max_iterations: The maximum number of iterations. Setting this\n                               to a larger value will produce lower distortion\n                               results. Using only a few iterations requires\n                               a larger learning rate, and will produce larger\n                               distortion results.\n        :param abort_early: If true, allows early abort when the total\n                            loss starts to increase (greatly speeds up attack,\n                            but hurts performance, particularly on ImageNet)\n        :param initial_const: The initial tradeoff-constant to use to tune the\n                              relative importance of size of the perturbation\n                              and confidence of classification.\n                              If binary_search_steps is large, the initial\n                              constant is not important. A smaller value of\n                              this constant gives lower distortion results.\n                              For computational efficiency, fix\n                              binary_search_steps to 1 and set this param\n                              to a large value.\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        \"\"\"\n\n        # ignore the y and y_target argument\n        self.beta = beta\n        self.decision_rule = decision_rule\n        self.batch_size = batch_size\n        self.confidence = confidence\n        self.learning_rate = learning_rate\n        self.binary_search_steps = binary_search_steps\n        self.max_iterations = max_iterations\n        self.abort_early = abort_early\n        self.initial_const = initial_const\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n\n\nclass EAD(object):\n    def __init__(\n        self,\n        sess,\n        model,\n        beta,\n        decision_rule,\n        batch_size,\n        confidence,\n        targeted,\n        learning_rate,\n        binary_search_steps,\n        max_iterations,\n        abort_early,\n        initial_const,\n        clip_min,\n        clip_max,\n        num_labels,\n        shape,\n    ):\n        \"\"\"\n        EAD Attack\n\n        Return a tensor that constructs adversarial examples for the given\n        input. Generate uses tf.py_func in order to operate over tensors.\n\n        :param sess: a TF session.\n        :param model: a cleverhans.model.Model object.\n        :param beta: Trades off L2 distortion with L1 distortion: higher\n                     produces examples with lower L1 distortion, at the\n                     cost of higher L2 (and typically Linf) distortion\n        :param decision_rule: EN or L1. Select final adversarial example from\n                              all successful examples based on the least\n                              elastic-net or L1 distortion criterion.\n        :param batch_size: Number of attacks to run simultaneously.\n        :param confidence: Confidence of adversarial examples: higher produces\n                           examples with larger l2 distortion, but more\n                           strongly classified as adversarial.\n        :param targeted: boolean controlling the behavior of the adversarial\n                         examples produced. If set to False, they will be\n                         misclassified in any wrong class. If set to True,\n                         they will be misclassified in a chosen target class.\n        :param learning_rate: The learning rate for the attack algorithm.\n                              Smaller values produce better results but are\n                              slower to converge.\n        :param binary_search_steps: The number of times we perform binary\n                                    search to find the optimal tradeoff-\n                                    constant between norm of the perturbation\n                                    and confidence of the classification. Set\n                                    'initial_const' to a large value and fix\n                                    this param to 1 for speed.\n        :param max_iterations: The maximum number of iterations. Setting this\n                               to a larger value will produce lower distortion\n                               results. Using only a few iterations requires\n                               a larger learning rate, and will produce larger\n                               distortion results.\n        :param abort_early: If true, allows early abort when the total\n                            loss starts to increase (greatly speeds up attack,\n                            but hurts performance, particularly on ImageNet)\n        :param initial_const: The initial tradeoff-constant to use to tune the\n                              relative importance of size of the perturbation\n                              and confidence of classification.\n                              If binary_search_steps is large, the initial\n                              constant is not important. A smaller value of\n                              this constant gives lower distortion results.\n                              For computational efficiency, fix\n                              binary_search_steps to 1 and set this param\n                              to a large value.\n        :param clip_min: (optional float) Minimum input component value.\n        :param clip_max: (optional float) Maximum input component value.\n        :param num_labels: the number of classes in the model's output.\n        :param shape: the shape of the model's input tensor.\n        \"\"\"\n\n        self.sess = sess\n        self.TARGETED = targeted\n        self.LEARNING_RATE = learning_rate\n        self.MAX_ITERATIONS = max_iterations\n        self.BINARY_SEARCH_STEPS = binary_search_steps\n        self.ABORT_EARLY = abort_early\n        self.CONFIDENCE = confidence\n        self.initial_const = initial_const\n        self.batch_size = batch_size\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        self.model = model\n        self.decision_rule = decision_rule\n\n        self.beta = beta\n        self.beta_t = tf.cast(self.beta, tf_dtype)\n\n        self.repeat = binary_search_steps >= 10\n\n        self.shape = shape = tuple([batch_size] + list(shape))\n\n        # these are variables to be more efficient in sending data to tf\n        self.timg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name=\"timg\")\n        self.newimg = tf.Variable(np.zeros(shape), dtype=tf_dtype, name=\"newimg\")\n        self.slack = tf.Variable(np.zeros(shape), dtype=tf_dtype, name=\"slack\")\n        self.tlab = tf.Variable(\n            np.zeros((batch_size, num_labels)), dtype=tf_dtype, name=\"tlab\"\n        )\n        self.const = tf.Variable(np.zeros(batch_size), dtype=tf_dtype, name=\"const\")\n\n        # and here's what we use to assign them\n        self.assign_timg = tf.placeholder(tf_dtype, shape, name=\"assign_timg\")\n        self.assign_newimg = tf.placeholder(tf_dtype, shape, name=\"assign_newimg\")\n        self.assign_slack = tf.placeholder(tf_dtype, shape, name=\"assign_slack\")\n        self.assign_tlab = tf.placeholder(\n            tf_dtype, (batch_size, num_labels), name=\"assign_tlab\"\n        )\n        self.assign_const = tf.placeholder(tf_dtype, [batch_size], name=\"assign_const\")\n\n        self.global_step = tf.Variable(0, trainable=False)\n        self.global_step_t = tf.cast(self.global_step, tf_dtype)\n\n        # Fast Iterative Shrinkage Thresholding\n        self.zt = tf.divide(\n            self.global_step_t, self.global_step_t + tf.cast(3, tf_dtype)\n        )\n        cond1 = tf.cast(\n            tf.greater(tf.subtract(self.slack, self.timg), self.beta_t), tf_dtype\n        )\n        cond2 = tf.cast(\n            tf.less_equal(tf.abs(tf.subtract(self.slack, self.timg)), self.beta_t),\n            tf_dtype,\n        )\n        cond3 = tf.cast(\n            tf.less(tf.subtract(self.slack, self.timg), tf.negative(self.beta_t)),\n            tf_dtype,\n        )\n\n        upper = tf.minimum(\n            tf.subtract(self.slack, self.beta_t), tf.cast(self.clip_max, tf_dtype)\n        )\n        lower = tf.maximum(\n            tf.add(self.slack, self.beta_t), tf.cast(self.clip_min, tf_dtype)\n        )\n\n        self.assign_newimg = tf.multiply(cond1, upper)\n        self.assign_newimg += tf.multiply(cond2, self.timg)\n        self.assign_newimg += tf.multiply(cond3, lower)\n\n        self.assign_slack = self.assign_newimg\n        self.assign_slack += tf.multiply(self.zt, self.assign_newimg - self.newimg)\n\n        # --------------------------------\n        self.setter = tf.assign(self.newimg, self.assign_newimg)\n        self.setter_y = tf.assign(self.slack, self.assign_slack)\n\n        # prediction BEFORE-SOFTMAX of the model\n        self.output = model.get_logits(self.newimg)\n        self.output_y = model.get_logits(self.slack)\n\n        # distance to the input data\n        self.l2dist = reduce_sum(\n            tf.square(self.newimg - self.timg), list(range(1, len(shape)))\n        )\n        self.l2dist_y = reduce_sum(\n            tf.square(self.slack - self.timg), list(range(1, len(shape)))\n        )\n        self.l1dist = reduce_sum(\n            tf.abs(self.newimg - self.timg), list(range(1, len(shape)))\n        )\n        self.l1dist_y = reduce_sum(\n            tf.abs(self.slack - self.timg), list(range(1, len(shape)))\n        )\n        self.elasticdist = self.l2dist + tf.multiply(self.l1dist, self.beta_t)\n        self.elasticdist_y = self.l2dist_y + tf.multiply(self.l1dist_y, self.beta_t)\n        if self.decision_rule == \"EN\":\n            self.crit = self.elasticdist\n            self.crit_p = \"Elastic\"\n        else:\n            self.crit = self.l1dist\n            self.crit_p = \"L1\"\n\n        # compute the probability of the label class versus the maximum other\n        real = reduce_sum((self.tlab) * self.output, 1)\n        real_y = reduce_sum((self.tlab) * self.output_y, 1)\n        other = reduce_max((1 - self.tlab) * self.output - (self.tlab * 10000), 1)\n        other_y = reduce_max((1 - self.tlab) * self.output_y - (self.tlab * 10000), 1)\n\n        if self.TARGETED:\n            # if targeted, optimize for making the other class most likely\n            loss1 = tf.maximum(ZERO(), other - real + self.CONFIDENCE)\n            loss1_y = tf.maximum(ZERO(), other_y - real_y + self.CONFIDENCE)\n        else:\n            # if untargeted, optimize for making this class least likely.\n            loss1 = tf.maximum(ZERO(), real - other + self.CONFIDENCE)\n            loss1_y = tf.maximum(ZERO(), real_y - other_y + self.CONFIDENCE)\n\n        # sum up the losses\n        self.loss21 = reduce_sum(self.l1dist)\n        self.loss21_y = reduce_sum(self.l1dist_y)\n        self.loss2 = reduce_sum(self.l2dist)\n        self.loss2_y = reduce_sum(self.l2dist_y)\n        self.loss1 = reduce_sum(self.const * loss1)\n        self.loss1_y = reduce_sum(self.const * loss1_y)\n        self.loss_opt = self.loss1_y + self.loss2_y\n        self.loss = self.loss1 + self.loss2 + tf.multiply(self.beta_t, self.loss21)\n\n        self.learning_rate = tf.train.polynomial_decay(\n            self.LEARNING_RATE, self.global_step, self.MAX_ITERATIONS, 0, power=0.5\n        )\n\n        # Setup the optimizer and keep track of variables we're creating\n        start_vars = set(x.name for x in tf.global_variables())\n        optimizer = tf.train.GradientDescentOptimizer(self.learning_rate)\n        self.train = optimizer.minimize(\n            self.loss_opt, var_list=[self.slack], global_step=self.global_step\n        )\n        end_vars = tf.global_variables()\n        new_vars = [x for x in end_vars if x.name not in start_vars]\n\n        # these are the variables to initialize when we run\n        self.setup = []\n        self.setup.append(self.timg.assign(self.assign_timg))\n        self.setup.append(self.tlab.assign(self.assign_tlab))\n        self.setup.append(self.const.assign(self.assign_const))\n\n        var_list = [self.global_step] + [self.slack] + [self.newimg] + new_vars\n        self.init = tf.variables_initializer(var_list=var_list)\n\n    def attack(self, imgs, targets):\n        \"\"\"\n        Perform the EAD attack on the given instance for the given targets.\n\n        If self.targeted is true, then the targets represents the target labels\n        If self.targeted is false, then targets are the original class labels\n        \"\"\"\n\n        batch_size = self.batch_size\n        r = []\n        for i in range(0, len(imgs) // batch_size):\n            _logger.debug(\n                (\"Running EAD attack on instance %s of %s\", i * batch_size, len(imgs))\n            )\n            r.extend(\n                self.attack_batch(\n                    imgs[i * batch_size : (i + 1) * batch_size],\n                    targets[i * batch_size : (i + 1) * batch_size],\n                )\n            )\n        if len(imgs) % batch_size != 0:\n            last_elements = len(imgs) - (len(imgs) % batch_size)\n            _logger.debug(\n                (\"Running EAD attack on instance %s of %s\", last_elements, len(imgs))\n            )\n            temp_imgs = np.zeros((batch_size,) + imgs.shape[2:])\n            temp_targets = np.zeros((batch_size,) + targets.shape[2:])\n            temp_imgs[: (len(imgs) % batch_size)] = imgs[last_elements:]\n            temp_targets[: (len(imgs) % batch_size)] = targets[last_elements:]\n            temp_data = self.attack_batch(temp_imgs, temp_targets)\n            r.extend(temp_data[: (len(imgs) % batch_size)], targets[last_elements:])\n        return np.array(r)\n\n    def attack_batch(self, imgs, labs):\n        \"\"\"\n        Run the attack on a batch of instance and labels.\n        \"\"\"\n\n        def compare(x, y):\n            if not isinstance(x, (float, int, np.int64)):\n                x = np.copy(x)\n                if self.TARGETED:\n                    x[y] -= self.CONFIDENCE\n                else:\n                    x[y] += self.CONFIDENCE\n                x = np.argmax(x)\n            if self.TARGETED:\n                return x == y\n            else:\n                return x != y\n\n        batch_size = self.batch_size\n\n        imgs = np.clip(imgs, self.clip_min, self.clip_max)\n\n        # set the lower and upper bounds accordingly\n        lower_bound = np.zeros(batch_size)\n        CONST = np.ones(batch_size) * self.initial_const\n        upper_bound = np.ones(batch_size) * 1e10\n\n        # placeholders for the best en, score, and instance attack found so far\n        o_bestdst = [1e10] * batch_size\n        o_bestscore = [-1] * batch_size\n        o_bestattack = np.copy(imgs)\n\n        for outer_step in range(self.BINARY_SEARCH_STEPS):\n            # completely reset the optimizer's internal state.\n            self.sess.run(self.init)\n            batch = imgs[:batch_size]\n            batchlab = labs[:batch_size]\n\n            bestdst = [1e10] * batch_size\n            bestscore = [-1] * batch_size\n            _logger.debug(\n                \"  Binary search step %s of %s\", outer_step, self.BINARY_SEARCH_STEPS\n            )\n\n            # The last iteration (if we run many steps) repeat the search once.\n            if self.repeat and outer_step == self.BINARY_SEARCH_STEPS - 1:\n                CONST = upper_bound\n\n            # set the variables so that we don't have to send them over again\n            self.sess.run(\n                self.setup,\n                {\n                    self.assign_timg: batch,\n                    self.assign_tlab: batchlab,\n                    self.assign_const: CONST,\n                },\n            )\n            self.sess.run(self.setter, {self.assign_newimg: batch})\n            self.sess.run(self.setter_y, {self.assign_slack: batch})\n            prev = 1e6\n            for iteration in range(self.MAX_ITERATIONS):\n                # perform the attack\n                self.sess.run([self.train])\n                self.sess.run([self.setter, self.setter_y])\n                l, l2s, l1s, crit, scores, nimg = self.sess.run(\n                    [\n                        self.loss,\n                        self.l2dist,\n                        self.l1dist,\n                        self.crit,\n                        self.output,\n                        self.newimg,\n                    ]\n                )\n                if iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0:\n                    _logger.debug(\n                        (\n                            \"    Iteration {} of {}: loss={:.3g} \"\n                            + \"l2={:.3g} l1={:.3g} f={:.3g}\"\n                        ).format(\n                            iteration,\n                            self.MAX_ITERATIONS,\n                            l,\n                            np.mean(l2s),\n                            np.mean(l1s),\n                            np.mean(scores),\n                        )\n                    )\n\n                # check if we should abort search if we're getting nowhere.\n                if (\n                    self.ABORT_EARLY\n                    and iteration % ((self.MAX_ITERATIONS // 10) or 1) == 0\n                ):\n                    if l > prev * 0.9999:\n                        msg = \"    Failed to make progress; stop early\"\n                        _logger.debug(msg)\n                        break\n                    prev = l\n\n                # adjust the best result found so far\n                for e, (dst, sc, ii) in enumerate(zip(crit, scores, nimg)):\n                    lab = np.argmax(batchlab[e])\n                    if dst < bestdst[e] and compare(sc, lab):\n                        bestdst[e] = dst\n                        bestscore[e] = np.argmax(sc)\n                    if dst < o_bestdst[e] and compare(sc, lab):\n                        o_bestdst[e] = dst\n                        o_bestscore[e] = np.argmax(sc)\n                        o_bestattack[e] = ii\n\n            # adjust the constant as needed\n            for e in range(batch_size):\n                if compare(bestscore[e], np.argmax(batchlab[e])) and bestscore[e] != -1:\n                    # success, divide const by two\n                    upper_bound[e] = min(upper_bound[e], CONST[e])\n                    if upper_bound[e] < 1e9:\n                        CONST[e] = (lower_bound[e] + upper_bound[e]) / 2\n                else:\n                    # failure, either multiply by 10 if no solution found yet\n                    #          or do binary search with the known upper bound\n                    lower_bound[e] = max(lower_bound[e], CONST[e])\n                    if upper_bound[e] < 1e9:\n                        CONST[e] = (lower_bound[e] + upper_bound[e]) / 2\n                    else:\n                        CONST[e] *= 10\n            _logger.debug(\n                \"  Successfully generated adversarial examples \"\n                + \"on {} of {} instances.\".format(sum(upper_bound < 1e9), batch_size)\n            )\n            o_bestdst = np.array(o_bestdst)\n            mean = np.mean(np.sqrt(o_bestdst[o_bestdst < 1e9]))\n            _logger.debug(\n                self.crit_p + \" Mean successful distortion: {:.4g}\".format(mean)\n            )\n\n        # return the best solution found\n        o_bestdst = np.array(o_bestdst)\n        return o_bestattack\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/fast_feature_adversaries.py",
    "content": "\"\"\"\nThe FastFeatureAdversaries attack\n\"\"\"\n# pylint: disable=missing-docstring\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.compat import reduce_sum\nfrom cleverhans.model import Model\nfrom cleverhans.utils_tf import clip_eta\n\n\nclass FastFeatureAdversaries(Attack):\n    \"\"\"\n    This is a fast implementation of \"Feature Adversaries\", an attack\n    against a target internal representation of a model.\n    \"Feature adversaries\" were originally introduced in (Sabour et al. 2016),\n    where the optimization was done using LBFGS.\n    Paper link: https://arxiv.org/abs/1511.05122\n\n    This implementation is similar to \"Basic Iterative Method\"\n    (Kurakin et al. 2016) but applied to the internal representations.\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Create a FastFeatureAdversaries instance.\n        \"\"\"\n        super(FastFeatureAdversaries, self).__init__(model, sess, dtypestr, **kwargs)\n        self.feedable_kwargs = (\"eps\", \"eps_iter\", \"clip_min\", \"clip_max\")\n        self.structural_kwargs = [\"ord\", \"nb_iter\", \"layer\"]\n\n        assert isinstance(self.model, Model)\n\n    def parse_params(\n        self,\n        layer=None,\n        eps=0.3,\n        eps_iter=0.05,\n        nb_iter=10,\n        ord=np.inf,\n        clip_min=None,\n        clip_max=None,\n        **kwargs\n    ):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        Attack-specific parameters:\n\n        :param layer: (required str) name of the layer to target.\n        :param eps: (optional float) maximum distortion of adversarial example\n                    compared to original input\n        :param eps_iter: (optional float) step size for each attack iteration\n        :param nb_iter: (optional int) Number of attack iterations.\n        :param ord: (optional) Order of the norm (mimics Numpy).\n                    Possible values: np.inf, 1 or 2.\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        \"\"\"\n\n        # Save attack-specific parameters\n        self.layer = layer\n        self.eps = eps\n        self.eps_iter = eps_iter\n        self.nb_iter = nb_iter\n        self.ord = ord\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n\n        # Check if order of the norm is acceptable given current implementation\n        if self.ord not in [np.inf, 1, 2]:\n            raise ValueError(\"Norm order must be either np.inf, 1, or 2.\")\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n\n        return True\n\n    def attack_single_step(self, x, eta, g_feat):\n        \"\"\"\n        TensorFlow implementation of the Fast Feature Gradient. This is a\n        single step attack similar to Fast Gradient Method that attacks an\n        internal representation.\n\n        :param x: the input placeholder\n        :param eta: A tensor the same shape as x that holds the perturbation.\n        :param g_feat: model's internal tensor for guide\n        :return: a tensor for the adversarial example\n        \"\"\"\n\n        adv_x = x + eta\n        a_feat = self.model.fprop(adv_x)[self.layer]\n\n        # feat.shape = (batch, c) or (batch, w, h, c)\n        axis = list(range(1, len(a_feat.shape)))\n\n        # Compute loss\n        # This is a targeted attack, hence the negative sign\n        loss = -reduce_sum(tf.square(a_feat - g_feat), axis)\n\n        # Define gradient of loss wrt input\n        (grad,) = tf.gradients(loss, adv_x)\n\n        # Multiply by constant epsilon\n        scaled_signed_grad = self.eps_iter * tf.sign(grad)\n\n        # Add perturbation to original example to obtain adversarial example\n        adv_x = adv_x + scaled_signed_grad\n\n        # If clipping is needed,\n        # reset all values outside of [clip_min, clip_max]\n        if (self.clip_min is not None) and (self.clip_max is not None):\n            adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max)\n\n        adv_x = tf.stop_gradient(adv_x)\n\n        eta = adv_x - x\n        eta = clip_eta(eta, self.ord, self.eps)\n\n        return eta\n\n    def generate(self, x, g, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n\n        :param x: The model's symbolic inputs.\n        :param g: The target value of the symbolic representation\n        :param kwargs: See `parse_params`\n        \"\"\"\n\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        g_feat = self.model.fprop(g)[self.layer]\n\n        # Initialize loop variables\n        eta = tf.random_uniform(tf.shape(x), -self.eps, self.eps, dtype=self.tf_dtype)\n        eta = clip_eta(eta, self.ord, self.eps)\n\n        def cond(i, _):\n            return tf.less(i, self.nb_iter)\n\n        def body(i, e):\n            new_eta = self.attack_single_step(x, e, g_feat)\n            return i + 1, new_eta\n\n        _, eta = tf.while_loop(\n            cond,\n            body,\n            (tf.zeros([]), eta),\n            back_prop=True,\n            maximum_iterations=self.nb_iter,\n        )\n\n        # Define adversarial example (and clip if necessary)\n        adv_x = x + eta\n        if self.clip_min is not None and self.clip_max is not None:\n            adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max)\n\n        return adv_x\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/fast_gradient_method.py",
    "content": "\"\"\"\nThe FastGradientMethod attack.\n\"\"\"\n\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.compat import reduce_max, reduce_sum, softmax_cross_entropy_with_logits\nfrom cleverhans import utils_tf\n\n\nclass FastGradientMethod(Attack):\n    \"\"\"\n    This attack was originally implemented by Goodfellow et al. (2014) with the\n    infinity norm (and is known as the \"Fast Gradient Sign Method\"). This\n    implementation extends the attack to other norms, and is therefore called\n    the Fast Gradient Method.\n    Paper link: https://arxiv.org/abs/1412.6572\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Create a FastGradientMethod instance.\n        Note: the model parameter should be an instance of the\n        cleverhans.model.Model abstraction provided by CleverHans.\n        \"\"\"\n\n        super(FastGradientMethod, self).__init__(model, sess, dtypestr, **kwargs)\n        self.feedable_kwargs = (\"eps\", \"y\", \"y_target\", \"clip_min\", \"clip_max\")\n        self.structural_kwargs = [\"ord\", \"sanity_checks\", \"clip_grad\", \"loss_fn\"]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Returns the graph for Fast Gradient Method adversarial examples.\n\n        :param x: The model's symbolic inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        labels, _nb_classes = self.get_or_guess_labels(x, kwargs)\n\n        return fgm(\n            x,\n            self.model.get_logits(x),\n            y=labels,\n            eps=self.eps,\n            ord=self.ord,\n            loss_fn=self.loss_fn,\n            clip_min=self.clip_min,\n            clip_max=self.clip_max,\n            clip_grad=self.clip_grad,\n            targeted=(self.y_target is not None),\n            sanity_checks=self.sanity_checks,\n        )\n\n    def parse_params(\n        self,\n        eps=0.3,\n        ord=np.inf,\n        loss_fn=softmax_cross_entropy_with_logits,\n        y=None,\n        y_target=None,\n        clip_min=None,\n        clip_max=None,\n        clip_grad=False,\n        sanity_checks=True,\n        **kwargs\n    ):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        Attack-specific parameters:\n\n        :param eps: (optional float) attack step size (input variation)\n        :param ord: (optional) Order of the norm (mimics NumPy).\n                    Possible values: np.inf, 1 or 2.\n        :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss\n        :param y: (optional) A tensor with the true labels. Only provide\n                  this parameter if you'd like to use true labels when crafting\n                  adversarial samples. Otherwise, model predictions are used as\n                  labels to avoid the \"label leaking\" effect (explained in this\n                  paper: https://arxiv.org/abs/1611.01236). Default is None.\n                  Labels should be one-hot-encoded.\n        :param y_target: (optional) A tensor with the labels to target. Leave\n                         y_target=None if y is also set. Labels should be\n                         one-hot-encoded.\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        :param clip_grad: (optional bool) Ignore gradient components\n                          at positions where the input is already at the boundary\n                          of the domain, and the update step will get clipped out.\n        :param sanity_checks: bool, if True, include asserts\n          (Turn them off to use less runtime / memory or for unit tests that\n          intentionally pass strange input)\n        \"\"\"\n        # Save attack-specific parameters\n\n        self.eps = eps\n        self.ord = ord\n        self.loss_fn = loss_fn\n        self.y = y\n        self.y_target = y_target\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        self.clip_grad = clip_grad\n        self.sanity_checks = sanity_checks\n\n        if self.y is not None and self.y_target is not None:\n            raise ValueError(\"Must not set both y and y_target\")\n        # Check if order of the norm is acceptable given current implementation\n        if self.ord not in [np.inf, int(1), int(2)]:\n            raise ValueError(\"Norm order must be either np.inf, 1, or 2.\")\n\n        if self.clip_grad and (self.clip_min is None or self.clip_max is None):\n            raise ValueError(\"Must set clip_min and clip_max if clip_grad is set\")\n\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n\n        return True\n\n\ndef fgm(\n    x,\n    logits,\n    y=None,\n    eps=0.3,\n    ord=np.inf,\n    loss_fn=softmax_cross_entropy_with_logits,\n    clip_min=None,\n    clip_max=None,\n    clip_grad=False,\n    targeted=False,\n    sanity_checks=True,\n):\n    \"\"\"\n    TensorFlow implementation of the Fast Gradient Method.\n    :param x: the input placeholder\n    :param logits: output of model.get_logits\n    :param y: (optional) A placeholder for the true labels. If targeted\n              is true, then provide the target label. Otherwise, only provide\n              this parameter if you'd like to use true labels when crafting\n              adversarial samples. Otherwise, model predictions are used as\n              labels to avoid the \"label leaking\" effect (explained in this\n              paper: https://arxiv.org/abs/1611.01236). Default is None.\n              Labels should be one-hot-encoded.\n    :param eps: the epsilon (input variation parameter)\n    :param ord: (optional) Order of the norm (mimics NumPy).\n                Possible values: np.inf, 1 or 2.\n    :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss\n    :param clip_min: Minimum float value for adversarial example components\n    :param clip_max: Maximum float value for adversarial example components\n    :param clip_grad: (optional bool) Ignore gradient components\n                      at positions where the input is already at the boundary\n                      of the domain, and the update step will get clipped out.\n    :param targeted: Is the attack targeted or untargeted? Untargeted, the\n                     default, will try to make the label incorrect. Targeted\n                     will instead try to move in the direction of being more\n                     like y.\n    :return: a tensor for the adversarial example\n    \"\"\"\n\n    asserts = []\n\n    # If a data range was specified, check that the input was in that range\n    if clip_min is not None:\n        asserts.append(utils_tf.assert_greater_equal(x, tf.cast(clip_min, x.dtype)))\n\n    if clip_max is not None:\n        asserts.append(utils_tf.assert_less_equal(x, tf.cast(clip_max, x.dtype)))\n\n    # Make sure the caller has not passed probs by accident\n    assert logits.op.type != \"Softmax\"\n\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        preds_max = reduce_max(logits, 1, keepdims=True)\n        y = tf.to_float(tf.equal(logits, preds_max))\n        y = tf.stop_gradient(y)\n    y = y / reduce_sum(y, 1, keepdims=True)\n\n    # Compute loss\n    loss = loss_fn(labels=y, logits=logits)\n    if targeted:\n        loss = -loss\n\n    # Define gradient of loss wrt input\n    (grad,) = tf.gradients(loss, x)\n\n    if clip_grad:\n        grad = utils_tf.zero_out_clipped_grads(grad, x, clip_min, clip_max)\n\n    optimal_perturbation = optimize_linear(grad, eps, ord)\n\n    # Add perturbation to original example to obtain adversarial example\n    adv_x = x + optimal_perturbation\n\n    # If clipping is needed, reset all values outside of [clip_min, clip_max]\n    if (clip_min is not None) or (clip_max is not None):\n        # We don't currently support one-sided clipping\n        assert clip_min is not None and clip_max is not None\n        adv_x = utils_tf.clip_by_value(adv_x, clip_min, clip_max)\n\n    if sanity_checks:\n        with tf.control_dependencies(asserts):\n            adv_x = tf.identity(adv_x)\n\n    return adv_x\n\n\ndef optimize_linear(grad, eps, ord=np.inf):\n    \"\"\"\n    Solves for the optimal input to a linear function under a norm constraint.\n\n    Optimal_perturbation = argmax_{eta, ||eta||_{ord} < eps} dot(eta, grad)\n\n    :param grad: tf tensor containing a batch of gradients\n    :param eps: float scalar specifying size of constraint region\n    :param ord: int specifying order of norm\n    :returns:\n      tf tensor containing optimal perturbation\n    \"\"\"\n\n    # In Python 2, the `list` call in the following line is redundant / harmless.\n    # In Python 3, the `list` call is needed to convert the iterator returned by `range` into a list.\n    red_ind = list(range(1, len(grad.get_shape())))\n    avoid_zero_div = 1e-12\n    if ord == np.inf:\n        # Take sign of gradient\n        optimal_perturbation = tf.sign(grad)\n        # The following line should not change the numerical results.\n        # It applies only because `optimal_perturbation` is the output of\n        # a `sign` op, which has zero derivative anyway.\n        # It should not be applied for the other norms, where the\n        # perturbation has a non-zero derivative.\n        optimal_perturbation = tf.stop_gradient(optimal_perturbation)\n    elif ord == 1:\n        abs_grad = tf.abs(grad)\n        sign = tf.sign(grad)\n        max_abs_grad = tf.reduce_max(abs_grad, red_ind, keepdims=True)\n        tied_for_max = tf.to_float(tf.equal(abs_grad, max_abs_grad))\n        num_ties = tf.reduce_sum(tied_for_max, red_ind, keepdims=True)\n        optimal_perturbation = sign * tied_for_max / num_ties\n    elif ord == 2:\n        square = tf.maximum(\n            avoid_zero_div,\n            reduce_sum(tf.square(grad), reduction_indices=red_ind, keepdims=True),\n        )\n        optimal_perturbation = grad / tf.sqrt(square)\n    else:\n        raise NotImplementedError(\n            \"Only L-inf, L1 and L2 norms are \" \"currently implemented.\"\n        )\n\n    # Scale perturbation to be the solution for the norm=eps rather than\n    # norm=1 problem\n    scaled_perturbation = utils_tf.mul(eps, optimal_perturbation)\n    return scaled_perturbation\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/hop_skip_jump_attack.py",
    "content": "\"\"\" Boundary Attack++\n\"\"\"\nimport logging\nimport numpy as np\nimport tensorflow as tf\nfrom warnings import warn\nfrom cleverhans.attacks import Attack\nfrom cleverhans.model import CallableModelWrapper, Model, wrapper_warning_logits\nfrom cleverhans import utils, utils_tf\n\nnp_dtype = np.dtype(\"float32\")\ntf_dtype = tf.as_dtype(\"float32\")\n\n_logger = utils.create_logger(\"cleverhans.attacks.hop_skip_jump_attack\")\n_logger.setLevel(logging.INFO)\n\n\nclass HopSkipJumpAttack(Attack):\n    \"\"\"\n    HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright.\n    It is a decision-based attack that requires access to output\n    labels of a model alone.\n    Paper link: https://arxiv.org/abs/1904.02144\n    At a high level, this attack is an iterative attack composed of three\n    steps: Binary search to approach the boundary; gradient estimation;\n    stepsize search. HopSkipJumpAttack requires fewer model queries than\n    Boundary Attack which was based on rejective sampling.\n    :param model: cleverhans.model.Model\n    :param sess: tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor.\n    see parse_params for details.\n    \"\"\"\n\n    def __init__(self, model, sess, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Note: the model parameter should be an instance of the\n        cleverhans.model.Model abstraction provided by CleverHans.\n        \"\"\"\n        if not isinstance(model, Model):\n            wrapper_warning_logits()\n            model = CallableModelWrapper(model, \"logits\")\n\n        super(HopSkipJumpAttack, self).__init__(model, sess, dtypestr, **kwargs)\n\n        self.feedable_kwargs = (\"y_target\", \"image_target\")\n\n        self.structural_kwargs = [\n            \"stepsize_search\",\n            \"clip_min\",\n            \"clip_max\",\n            \"constraint\",\n            \"num_iterations\",\n            \"initial_num_evals\",\n            \"max_num_evals\",\n            \"batch_size\",\n            \"verbose\",\n            \"gamma\",\n        ]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Return a tensor that constructs adversarial examples for the given\n        input. Generate uses tf.py_func in order to operate over tensors.\n        :param x: A tensor with the inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        self.parse_params(**kwargs)\n        shape = [int(i) for i in x.get_shape().as_list()[1:]]\n\n        assert (\n            self.sess is not None\n        ), \"Cannot use `generate` when no `sess` was provided\"\n        _check_first_dimension(x, \"input\")\n        if self.y_target is not None:\n            _check_first_dimension(self.y_target, \"y_target\")\n            assert (\n                self.image_target is not None\n            ), \"Require a target image for targeted attack.\"\n            _check_first_dimension(self.image_target, \"image_target\")\n\n        # Set shape and d.\n        self.shape = shape\n        self.d = int(np.prod(shape))\n\n        # Set binary search threshold.\n        if self.constraint == \"l2\":\n            self.theta = self.gamma / (np.sqrt(self.d) * self.d)\n        else:\n            self.theta = self.gamma / (self.d * self.d)\n\n        # Construct input placeholder and output for decision function.\n        self.input_ph = tf.placeholder(\n            tf_dtype, [None] + list(self.shape), name=\"input_image\"\n        )\n        self.logits = self.model.get_logits(self.input_ph)\n\n        def hsja_wrap(x, target_label, target_image):\n            \"\"\" Wrapper to use tensors as input and output. \"\"\"\n            return np.array(\n                self._hsja(x, target_label, target_image), dtype=self.np_dtype\n            )\n\n        if self.y_target is not None:\n            # targeted attack that requires target label and image.\n            wrap = tf.py_func(\n                hsja_wrap, [x[0], self.y_target[0], self.image_target[0]], self.tf_dtype\n            )\n        else:\n            if self.image_target is not None:\n                # untargeted attack with an initialized image.\n                wrap = tf.py_func(\n                    lambda x, target_image: hsja_wrap(x, None, target_image),\n                    [x[0], self.image_target[0]],\n                    self.tf_dtype,\n                )\n            else:\n                # untargeted attack without an initialized image.\n                wrap = tf.py_func(\n                    lambda x: hsja_wrap(x, None, None), [x[0]], self.tf_dtype\n                )\n\n        wrap.set_shape(x.get_shape())\n\n        return wrap\n\n    def generate_np(self, x, **kwargs):\n        \"\"\"\n        Generate adversarial images in a for loop.\n        :param y: An array of shape (n, nb_classes) for true labels.\n        :param y_target:  An array of shape (n, nb_classes) for target labels.\n        Required for targeted attack.\n        :param image_target: An array of shape (n, **image shape) for initial\n        target images. Required for targeted attack.\n\n        See parse_params for other kwargs.\n\n        \"\"\"\n\n        x_adv = []\n\n        if \"image_target\" in kwargs and kwargs[\"image_target\"] is not None:\n            image_target = np.copy(kwargs[\"image_target\"])\n        else:\n            image_target = None\n        if \"y_target\" in kwargs and kwargs[\"y_target\"] is not None:\n            y_target = np.copy(kwargs[\"y_target\"])\n        else:\n            y_target = None\n\n        for i, x_single in enumerate(x):\n            img = np.expand_dims(x_single, axis=0)\n            if image_target is not None:\n                single_img_target = np.expand_dims(image_target[i], axis=0)\n                kwargs[\"image_target\"] = single_img_target\n            if y_target is not None:\n                single_y_target = np.expand_dims(y_target[i], axis=0)\n                kwargs[\"y_target\"] = single_y_target\n\n            adv_img = super(HopSkipJumpAttack, self).generate_np(img, **kwargs)\n            x_adv.append(adv_img)\n\n        return np.concatenate(x_adv, axis=0)\n\n    def parse_params(\n        self,\n        y_target=None,\n        image_target=None,\n        initial_num_evals=100,\n        max_num_evals=10000,\n        stepsize_search=\"geometric_progression\",\n        num_iterations=64,\n        gamma=1.0,\n        constraint=\"l2\",\n        batch_size=128,\n        verbose=True,\n        clip_min=0,\n        clip_max=1,\n    ):\n        \"\"\"\n        :param y: A tensor of shape (1, nb_classes) for true labels.\n        :param y_target:  A tensor of shape (1, nb_classes) for target labels.\n        Required for targeted attack.\n        :param image_target: A tensor of shape (1, **image shape) for initial\n        target images. Required for targeted attack.\n        :param initial_num_evals: initial number of evaluations for\n                                  gradient estimation.\n        :param max_num_evals: maximum number of evaluations for gradient estimation.\n        :param stepsize_search: How to search for stepsize; choices are\n                                'geometric_progression', 'grid_search'.\n                                'geometric progression' initializes the stepsize\n                                 by ||x_t - x||_p / sqrt(iteration), and keep\n                                 decreasing by half until reaching the target\n                                 side of the boundary. 'grid_search' chooses the\n                                 optimal epsilon over a grid, in the scale of\n                                 ||x_t - x||_p.\n        :param num_iterations: The number of iterations.\n        :param gamma: The binary search threshold theta is gamma / d^{3/2} for\n                       l2 attack and gamma / d^2 for linf attack.\n        :param constraint: The distance to optimize; choices are 'l2', 'linf'.\n        :param batch_size: batch_size for model prediction.\n        :param verbose: (boolean) Whether distance at each step is printed.\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        \"\"\"\n\n        # ignore the y and y_target argument\n        self.y_target = y_target\n        self.image_target = image_target\n        self.initial_num_evals = initial_num_evals\n        self.max_num_evals = max_num_evals\n        self.stepsize_search = stepsize_search\n        self.num_iterations = num_iterations\n        self.gamma = gamma\n        self.constraint = constraint\n        self.batch_size = batch_size\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        self.verbose = verbose\n\n    def _hsja(self, sample, target_label, target_image):\n        \"\"\"\n        Main algorithm for HopSkipJumpAttack.\n\n        Return a tensor that constructs adversarial examples for the given\n        input. Generate uses tf.py_func in order to operate over tensors.\n\n        :param sample: input image. Without the batchsize dimension.\n        :param target_label: integer for targeted attack,\n          None for nontargeted attack. Without the batchsize dimension.\n        :param target_image: an array with the same size as sample, or None.\n          Without the batchsize dimension.\n\n\n        Output:\n        perturbed image.\n\n        \"\"\"\n\n        # Original label required for untargeted attack.\n        if target_label is None:\n            original_label = np.argmax(\n                self.sess.run(self.logits, feed_dict={self.input_ph: sample[None]})\n            )\n        else:\n            target_label = np.argmax(target_label)\n\n        def decision_function(images):\n            \"\"\"\n            Decision function output 1 on the desired side of the boundary,\n            0 otherwise.\n            \"\"\"\n            images = clip_image(images, self.clip_min, self.clip_max)\n            prob = []\n            for i in range(0, len(images), self.batch_size):\n                batch = images[i : i + self.batch_size]\n                prob_i = self.sess.run(self.logits, feed_dict={self.input_ph: batch})\n                prob.append(prob_i)\n            prob = np.concatenate(prob, axis=0)\n            if target_label is None:\n                return np.argmax(prob, axis=1) != original_label\n            else:\n                return np.argmax(prob, axis=1) == target_label\n\n        # Initialize.\n        if target_image is None:\n            perturbed = initialize(\n                decision_function, sample, self.shape, self.clip_min, self.clip_max\n            )\n        else:\n            perturbed = target_image\n\n        # Project the initialization to the boundary.\n        perturbed, dist_post_update = binary_search_batch(\n            sample,\n            np.expand_dims(perturbed, 0),\n            decision_function,\n            self.shape,\n            self.constraint,\n            self.theta,\n        )\n\n        dist = compute_distance(perturbed, sample, self.constraint)\n\n        for j in np.arange(self.num_iterations):\n            current_iteration = j + 1\n\n            # Choose delta.\n            delta = select_delta(\n                dist_post_update,\n                current_iteration,\n                self.clip_max,\n                self.clip_min,\n                self.d,\n                self.theta,\n                self.constraint,\n            )\n\n            # Choose number of evaluations.\n            num_evals = int(\n                min([self.initial_num_evals * np.sqrt(j + 1), self.max_num_evals])\n            )\n\n            # approximate gradient.\n            gradf = approximate_gradient(\n                decision_function,\n                perturbed,\n                num_evals,\n                delta,\n                self.constraint,\n                self.shape,\n                self.clip_min,\n                self.clip_max,\n            )\n            if self.constraint == \"linf\":\n                update = np.sign(gradf)\n            else:\n                update = gradf\n\n            # search step size.\n            if self.stepsize_search == \"geometric_progression\":\n                # find step size.\n                epsilon = geometric_progression_for_stepsize(\n                    perturbed, update, dist, decision_function, current_iteration\n                )\n\n                # Update the sample.\n                perturbed = clip_image(\n                    perturbed + epsilon * update, self.clip_min, self.clip_max\n                )\n\n                # Binary search to return to the boundary.\n                perturbed, dist_post_update = binary_search_batch(\n                    sample,\n                    perturbed[None],\n                    decision_function,\n                    self.shape,\n                    self.constraint,\n                    self.theta,\n                )\n\n            elif self.stepsize_search == \"grid_search\":\n                # Grid search for stepsize.\n                epsilons = np.logspace(-4, 0, num=20, endpoint=True) * dist\n                epsilons_shape = [20] + len(self.shape) * [1]\n                perturbeds = perturbed + epsilons.reshape(epsilons_shape) * update\n                perturbeds = clip_image(perturbeds, self.clip_min, self.clip_max)\n                idx_perturbed = decision_function(perturbeds)\n\n                if np.sum(idx_perturbed) > 0:\n                    # Select the perturbation that yields the minimum distance # after binary search.\n                    perturbed, dist_post_update = binary_search_batch(\n                        sample,\n                        perturbeds[idx_perturbed],\n                        decision_function,\n                        self.shape,\n                        self.constraint,\n                        self.theta,\n                    )\n\n            # compute new distance.\n            dist = compute_distance(perturbed, sample, self.constraint)\n            if self.verbose:\n                print(\n                    \"iteration: {:d}, {:s} distance {:.4E}\".format(\n                        j + 1, self.constraint, dist\n                    )\n                )\n\n        perturbed = np.expand_dims(perturbed, 0)\n        return perturbed\n\n\ndef BoundaryAttackPlusPlus(model, sess, dtypestr=\"float32\", **kwargs):\n    \"\"\"\n    A previous name used for HopSkipJumpAttack.\n    \"\"\"\n    warn(\n        \"BoundaryAttackPlusPlus will be removed after 2019-12-08; use HopSkipJumpAttack.\"\n    )\n    return HopSkipJumpAttack(model, sess, dtypestr, **kwargs)\n\n\ndef _check_first_dimension(x, tensor_name):\n    message = \"Tensor {} should have batch_size of 1.\".format(tensor_name)\n    if x.get_shape().as_list()[0] is None:\n        check_batch = utils_tf.assert_equal(tf.shape(x)[0], 1, message=message)\n        with tf.control_dependencies([check_batch]):\n            x = tf.identity(x)\n    elif x.get_shape().as_list()[0] != 1:\n        raise ValueError(message)\n\n\ndef clip_image(image, clip_min, clip_max):\n    \"\"\" Clip an image, or an image batch, with upper and lower threshold. \"\"\"\n    return np.minimum(np.maximum(clip_min, image), clip_max)\n\n\ndef compute_distance(x_ori, x_pert, constraint=\"l2\"):\n    \"\"\" Compute the distance between two images. \"\"\"\n    if constraint == \"l2\":\n        dist = np.linalg.norm(x_ori - x_pert)\n    elif constraint == \"linf\":\n        dist = np.max(abs(x_ori - x_pert))\n    return dist\n\n\ndef approximate_gradient(\n    decision_function, sample, num_evals, delta, constraint, shape, clip_min, clip_max\n):\n    \"\"\" Gradient direction estimation \"\"\"\n    # Generate random vectors.\n    noise_shape = [num_evals] + list(shape)\n    if constraint == \"l2\":\n        rv = np.random.randn(*noise_shape)\n    elif constraint == \"linf\":\n        rv = np.random.uniform(low=-1, high=1, size=noise_shape)\n\n    axis = tuple(range(1, 1 + len(shape)))\n    rv = rv / np.sqrt(np.sum(rv ** 2, axis=axis, keepdims=True))\n    perturbed = sample + delta * rv\n    perturbed = clip_image(perturbed, clip_min, clip_max)\n    rv = (perturbed - sample) / delta\n\n    # query the model.\n    decisions = decision_function(perturbed)\n    decision_shape = [len(decisions)] + [1] * len(shape)\n    fval = 2 * decisions.astype(np_dtype).reshape(decision_shape) - 1.0\n\n    # Baseline subtraction (when fval differs)\n    if np.mean(fval) == 1.0:  # label changes.\n        gradf = np.mean(rv, axis=0)\n    elif np.mean(fval) == -1.0:  # label not change.\n        gradf = -np.mean(rv, axis=0)\n    else:\n        fval = fval - np.mean(fval)\n        gradf = np.mean(fval * rv, axis=0)\n\n    # Get the gradient direction.\n    gradf = gradf / np.linalg.norm(gradf)\n\n    return gradf\n\n\ndef project(original_image, perturbed_images, alphas, shape, constraint):\n    \"\"\" Projection onto given l2 / linf balls in a batch. \"\"\"\n    alphas_shape = [len(alphas)] + [1] * len(shape)\n    alphas = alphas.reshape(alphas_shape)\n    if constraint == \"l2\":\n        projected = (1 - alphas) * original_image + alphas * perturbed_images\n    elif constraint == \"linf\":\n        projected = clip_image(\n            perturbed_images, original_image - alphas, original_image + alphas\n        )\n    return projected\n\n\ndef binary_search_batch(\n    original_image, perturbed_images, decision_function, shape, constraint, theta\n):\n    \"\"\" Binary search to approach the boundary. \"\"\"\n\n    # Compute distance between each of perturbed image and original image.\n    dists_post_update = np.array(\n        [\n            compute_distance(original_image, perturbed_image, constraint)\n            for perturbed_image in perturbed_images\n        ]\n    )\n\n    # Choose upper thresholds in binary searchs based on constraint.\n    if constraint == \"linf\":\n        highs = dists_post_update\n        # Stopping criteria.\n        thresholds = np.minimum(dists_post_update * theta, theta)\n    else:\n        highs = np.ones(len(perturbed_images))\n        thresholds = theta\n\n    lows = np.zeros(len(perturbed_images))\n\n    while np.max((highs - lows) / thresholds) > 1:\n        # projection to mids.\n        mids = (highs + lows) / 2.0\n        mid_images = project(original_image, perturbed_images, mids, shape, constraint)\n\n        # Update highs and lows based on model decisions.\n        decisions = decision_function(mid_images)\n        lows = np.where(decisions == 0, mids, lows)\n        highs = np.where(decisions == 1, mids, highs)\n\n    out_images = project(original_image, perturbed_images, highs, shape, constraint)\n\n    # Compute distance of the output image to select the best choice.\n    # (only used when stepsize_search is grid_search.)\n    dists = np.array(\n        [\n            compute_distance(original_image, out_image, constraint)\n            for out_image in out_images\n        ]\n    )\n    idx = np.argmin(dists)\n\n    dist = dists_post_update[idx]\n    out_image = out_images[idx]\n    return out_image, dist\n\n\ndef initialize(decision_function, sample, shape, clip_min, clip_max):\n    \"\"\"\n    Efficient Implementation of BlendedUniformNoiseAttack in Foolbox.\n    \"\"\"\n    success = 0\n    num_evals = 0\n\n    # Find a misclassified random noise.\n    while True:\n        random_noise = np.random.uniform(clip_min, clip_max, size=shape)\n        success = decision_function(random_noise[None])[0]\n        if success:\n            break\n        num_evals += 1\n        message = (\n            \"Initialization failed! Try to use a misclassified image as `target_image`\"\n        )\n        assert num_evals < 1e4, message\n\n    # Binary search to minimize l2 distance to original image.\n    low = 0.0\n    high = 1.0\n    while high - low > 0.001:\n        mid = (high + low) / 2.0\n        blended = (1 - mid) * sample + mid * random_noise\n        success = decision_function(blended[None])[0]\n        if success:\n            high = mid\n        else:\n            low = mid\n\n    initialization = (1 - high) * sample + high * random_noise\n    return initialization\n\n\ndef geometric_progression_for_stepsize(\n    x, update, dist, decision_function, current_iteration\n):\n    \"\"\"Geometric progression to search for stepsize.\n    Keep decreasing stepsize by half until reaching\n    the desired side of the boundary.\n    \"\"\"\n    epsilon = dist / np.sqrt(current_iteration)\n    while True:\n        updated = x + epsilon * update\n        success = decision_function(updated[None])[0]\n        if success:\n            break\n        else:\n            epsilon = epsilon / 2.0\n\n    return epsilon\n\n\ndef select_delta(\n    dist_post_update, current_iteration, clip_max, clip_min, d, theta, constraint\n):\n    \"\"\"\n    Choose the delta at the scale of distance\n     between x and perturbed sample.\n    \"\"\"\n    if current_iteration == 1:\n        delta = 0.1 * (clip_max - clip_min)\n    else:\n        if constraint == \"l2\":\n            delta = np.sqrt(d) * theta * dist_post_update\n        elif constraint == \"linf\":\n            delta = d * theta * dist_post_update\n\n    return delta\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/lbfgs.py",
    "content": "\"\"\"The LBFGS attack\n\"\"\"\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.compat import reduce_sum, softmax_cross_entropy_with_logits\nfrom cleverhans.model import CallableModelWrapper, Model, wrapper_warning\nfrom cleverhans import utils\nfrom cleverhans import utils_tf\n\n_logger = utils.create_logger(\"cleverhans.attacks.lbfgs\")\ntf_dtype = tf.as_dtype(\"float32\")\n\n\nclass LBFGS(Attack):\n    \"\"\"\n    LBFGS is the first adversarial attack for convolutional neural networks,\n    and is a target & iterative attack.\n    Paper link: \"https://arxiv.org/pdf/1312.6199.pdf\"\n    :param model: cleverhans.model.Model\n    :param sess: tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess, dtypestr=\"float32\", **kwargs):\n        if not isinstance(model, Model):\n            wrapper_warning()\n            model = CallableModelWrapper(model, \"probs\")\n\n        super(LBFGS, self).__init__(model, sess, dtypestr, **kwargs)\n\n        self.feedable_kwargs = (\"y_target\",)\n        self.structural_kwargs = [\n            \"batch_size\",\n            \"binary_search_steps\",\n            \"max_iterations\",\n            \"initial_const\",\n            \"clip_min\",\n            \"clip_max\",\n        ]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Return a tensor that constructs adversarial examples for the given\n        input. Generate uses tf.py_func in order to operate over tensors.\n        :param x: (required) A tensor with the inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        assert (\n            self.sess is not None\n        ), \"Cannot use `generate` when no `sess` was provided\"\n        self.parse_params(**kwargs)\n\n        if self.y_target is None:\n            self.y_target, nb_classes = self.get_or_guess_labels(x, kwargs)\n            self.targeted_attack = False\n        else:\n            _, nb_classes = self.get_or_guess_labels(x, kwargs)\n            self.targeted_attack = True\n\n        attack = LBFGS_impl(\n            self.sess,\n            x,\n            self.model.get_logits(x),\n            self.y_target,\n            self.targeted_attack,\n            self.binary_search_steps,\n            self.max_iterations,\n            self.initial_const,\n            self.clip_min,\n            self.clip_max,\n            nb_classes,\n            self.batch_size,\n        )\n\n        def lbfgs_wrap(x_val, y_val):\n            \"\"\"\n            Wrapper creating TensorFlow interface for use with py_func\n            \"\"\"\n            return np.array(attack.attack(x_val, y_val), dtype=self.np_dtype)\n\n        wrap = tf.py_func(lbfgs_wrap, [x, self.y_target], self.tf_dtype)\n        wrap.set_shape(x.get_shape())\n\n        return wrap\n\n    def parse_params(\n        self,\n        y_target=None,\n        batch_size=1,\n        binary_search_steps=5,\n        max_iterations=1000,\n        initial_const=1e-2,\n        clip_min=0,\n        clip_max=1,\n    ):\n        \"\"\"\n        :param y_target: (optional) A tensor with the one-hot target labels.\n        :param batch_size: The number of inputs to include in a batch and\n                           process simultaneously.\n        :param binary_search_steps: The number of times we perform binary\n                                    search to find the optimal tradeoff-\n                                    constant between norm of the purturbation\n                                    and cross-entropy loss of classification.\n        :param max_iterations: The maximum number of iterations.\n        :param initial_const: The initial tradeoff-constant to use to tune the\n                              relative importance of size of the perturbation\n                              and cross-entropy loss of the classification.\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        \"\"\"\n        self.y_target = y_target\n        self.batch_size = batch_size\n        self.binary_search_steps = binary_search_steps\n        self.max_iterations = max_iterations\n        self.initial_const = initial_const\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n\n\nclass LBFGS_impl(object):\n    \"\"\"\n    Return a tensor that constructs adversarial examples for the given\n    input. Generate uses tf.py_func in order to operate over tensors.\n    :param sess: a TF session.\n    :param x: A tensor with the inputs.\n    :param logits: A tensor with model's output logits.\n    :param targeted_label: A tensor with the target labels.\n    :param binary_search_steps: The number of times we perform binary\n                                search to find the optimal tradeoff-\n                                constant between norm of the purturbation\n                                and cross-entropy loss of classification.\n    :param max_iterations: The maximum number of iterations.\n    :param initial_const: The initial tradeoff-constant to use to tune the\n                          relative importance of size of the purturbation\n                          and cross-entropy loss of the classification.\n    :param clip_min: Minimum input component value\n    :param clip_max: Maximum input component value\n    :param num_labels: The number of classes in the model's output.\n    :param batch_size: Number of attacks to run simultaneously.\n    \"\"\"\n\n    def __init__(\n        self,\n        sess,\n        x,\n        logits,\n        targeted_label,\n        targeted_attack,\n        binary_search_steps,\n        max_iterations,\n        initial_const,\n        clip_min,\n        clip_max,\n        nb_classes,\n        batch_size,\n    ):\n        self.sess = sess\n        self.x = x\n        self.logits = logits\n        assert logits.op.type != \"Softmax\"\n        self.targeted_label = targeted_label\n        self.targeted_attack = targeted_attack\n        self.binary_search_steps = binary_search_steps\n        self.max_iterations = max_iterations\n        self.initial_const = initial_const\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        self.batch_size = batch_size\n\n        self.repeat = self.binary_search_steps >= 10\n        self.shape = tuple([self.batch_size] + list(self.x.get_shape().as_list()[1:]))\n        self.ori_img = tf.Variable(np.zeros(self.shape), dtype=tf_dtype, name=\"ori_img\")\n        self.const = tf.Variable(\n            np.zeros(self.batch_size), dtype=tf_dtype, name=\"const\"\n        )\n\n        self.score = softmax_cross_entropy_with_logits(\n            labels=self.targeted_label, logits=self.logits\n        )\n        self.l2dist = reduce_sum(tf.square(self.x - self.ori_img))\n        # small self.const will result small adversarial perturbation\n        # targeted attack aims at minimize loss against target label\n        # untargeted attack aims at maximize loss against True label\n        if self.targeted_attack:\n            self.loss = reduce_sum(self.score * self.const) + self.l2dist\n        else:\n            self.loss = -reduce_sum(self.score * self.const) + self.l2dist\n        (self.grad,) = tf.gradients(self.loss, self.x)\n\n    def attack(self, x_val, targets):\n        \"\"\"\n        Perform the attack on the given instance for the given targets.\n        \"\"\"\n\n        def lbfgs_objective(adv_x, self, targets, oimgs, CONST):\n            \"\"\" returns the function value and the gradient for fmin_l_bfgs_b \"\"\"\n            loss = self.sess.run(\n                self.loss,\n                feed_dict={\n                    self.x: adv_x.reshape(oimgs.shape),\n                    self.targeted_label: targets,\n                    self.ori_img: oimgs,\n                    self.const: CONST,\n                },\n            )\n            grad = self.sess.run(\n                self.grad,\n                feed_dict={\n                    self.x: adv_x.reshape(oimgs.shape),\n                    self.targeted_label: targets,\n                    self.ori_img: oimgs,\n                    self.const: CONST,\n                },\n            )\n            return loss, grad.flatten().astype(float)\n\n        def attack_success(out, target, targeted_attack):\n            \"\"\" returns attack result \"\"\"\n            if targeted_attack:\n                return out == target\n            else:\n                return out != target\n\n        # begin the main part for the attack\n        from scipy.optimize import fmin_l_bfgs_b\n\n        oimgs = np.clip(x_val, self.clip_min, self.clip_max)\n        CONST = np.ones(self.batch_size) * self.initial_const\n\n        # set the lower and upper bounds accordingly\n        lower_bound = np.zeros(self.batch_size)\n        upper_bound = np.ones(self.batch_size) * 1e10\n\n        # set the box constraints for the optimization function\n        clip_min = self.clip_min * np.ones(oimgs.shape[:])\n        clip_max = self.clip_max * np.ones(oimgs.shape[:])\n        clip_bound = list(zip(clip_min.flatten(), clip_max.flatten()))\n\n        # placeholders for the best l2 and instance attack found so far\n        o_bestl2 = [1e10] * self.batch_size\n        o_bestattack = np.copy(oimgs)\n\n        for outer_step in range(self.binary_search_steps):\n            _logger.debug(\n                \"  Binary search step %s of %s\", outer_step, self.binary_search_steps\n            )\n\n            # The last iteration (if we run many steps) repeat the search once.\n            if self.repeat and outer_step == self.binary_search_steps - 1:\n                CONST = upper_bound\n\n            # optimization function\n            adv_x, _, __ = fmin_l_bfgs_b(\n                lbfgs_objective,\n                oimgs.flatten().astype(float),\n                args=(self, targets, oimgs, CONST),\n                bounds=clip_bound,\n                maxiter=self.max_iterations,\n                iprint=0,\n            )\n\n            adv_x = adv_x.reshape(oimgs.shape)\n            assert (\n                np.amax(adv_x) <= self.clip_max and np.amin(adv_x) >= self.clip_min\n            ), \"fmin_l_bfgs_b returns are invalid\"\n\n            # adjust the best result (i.e., the adversarial example with the\n            # smallest perturbation in terms of L_2 norm) found so far\n            preds = np.atleast_1d(\n                utils_tf.model_argmax(self.sess, self.x, self.logits, adv_x)\n            )\n            _logger.debug(\"predicted labels are %s\", preds)\n\n            l2s = np.zeros(self.batch_size)\n            for i in range(self.batch_size):\n                l2s[i] = np.sum(np.square(adv_x[i] - oimgs[i]))\n\n            for e, (l2, pred, ii) in enumerate(zip(l2s, preds, adv_x)):\n                if l2 < o_bestl2[e] and attack_success(\n                    pred, np.argmax(targets[e]), self.targeted_attack\n                ):\n                    o_bestl2[e] = l2\n                    o_bestattack[e] = ii\n\n            # adjust the constant as needed\n            for e in range(self.batch_size):\n                if attack_success(\n                    preds[e], np.argmax(targets[e]), self.targeted_attack\n                ):\n                    # success, divide const by two\n                    upper_bound[e] = min(upper_bound[e], CONST[e])\n                    if upper_bound[e] < 1e9:\n                        CONST[e] = (lower_bound[e] + upper_bound[e]) / 2\n                else:\n                    # failure, either multiply by 10 if no solution found yet\n                    #          or do binary search with the known upper bound\n                    lower_bound[e] = max(lower_bound[e], CONST[e])\n                    if upper_bound[e] < 1e9:\n                        CONST[e] = (lower_bound[e] + upper_bound[e]) / 2\n                    else:\n                        CONST[e] *= 10\n\n            _logger.debug(\n                \"  Successfully generated adversarial examples \"\n                \"on %s of %s instances.\",\n                sum(upper_bound < 1e9),\n                self.batch_size,\n            )\n            o_bestl2 = np.array(o_bestl2)\n            mean = np.mean(np.sqrt(o_bestl2[o_bestl2 < 1e9]))\n            _logger.debug(\"   Mean successful distortion: {:.4g}\".format(mean))\n\n        # return the best solution found\n        o_bestl2 = np.array(o_bestl2)\n        return o_bestattack\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/madry_et_al.py",
    "content": "\"\"\"\nThe MadryEtAl attack\n\"\"\"\n\nfrom cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent\n\n\nclass MadryEtAl(ProjectedGradientDescent):\n    \"\"\"\n    The attack from Madry et al 2017\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        super(MadryEtAl, self).__init__(\n            model, sess=sess, dtypestr=dtypestr, default_rand_init=True, **kwargs\n        )\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/max_confidence.py",
    "content": "\"\"\"The MaxConfidence attack.\n\"\"\"\nimport warnings\n\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.attacks.projected_gradient_descent import ProjectedGradientDescent\nfrom cleverhans.model import Model\n\n\nclass MaxConfidence(Attack):\n    \"\"\"\n    The MaxConfidence attack.\n\n    An attack designed for use against models that use confidence thresholding\n    as a defense.\n    If the underlying optimizer is optimal, this attack procedure gives the\n    optimal failure rate for every confidence threshold t > 0.5.\n\n    Publication: https://openreview.net/forum?id=H1g0piA9tQ\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.session.Session\n    :param base_attacker: cleverhans.attacks.Attack\n    \"\"\"\n\n    def __init__(self, model, sess=None, base_attacker=None):\n        if not isinstance(model, Model):\n            raise TypeError(\n                \"Model must be cleverhans.model.Model, got \" + str(type(model))\n            )\n\n        super(MaxConfidence, self).__init__(model, sess)\n        if base_attacker is None:\n            self.base_attacker = ProjectedGradientDescent(model, sess=sess)\n        else:\n            self.base_attacker = base_attacker\n        self.structural_kwargs = self.base_attacker.structural_kwargs\n        self.feedable_kwargs = self.base_attacker.feedable_kwargs\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n\n        :param x: The model's symbolic inputs.\n        :param kwargs: Keyword arguments for the base attacker\n        \"\"\"\n\n        assert self.parse_params(**kwargs)\n        labels, _nb_classes = self.get_or_guess_labels(x, kwargs)\n        adv_x = self.attack(x, labels)\n\n        return adv_x\n\n    def parse_params(self, y=None, nb_classes=10, **kwargs):\n        self.y = y\n        self.nb_classes = nb_classes\n        self.params = kwargs\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n        return True\n\n    def attack(self, x, true_y):\n        \"\"\"\n        Runs the untargeted attack.\n        :param x: The input\n        :param true_y: The correct label for `x`. This attack aims to produce misclassification.\n        \"\"\"\n        adv_x_cls = []\n        prob_cls = []\n        m = tf.shape(x)[0]\n        true_y_idx = tf.argmax(true_y, axis=1)\n\n        expanded_x = tf.concat([x] * self.nb_classes, axis=0)\n        target_ys = [\n            tf.to_float(tf.one_hot(tf.ones(m, dtype=tf.int32) * cls, self.nb_classes))\n            for cls in range(self.nb_classes)\n        ]\n        target_y = tf.concat(target_ys, axis=0)\n        adv_x_cls = self.attack_class(expanded_x, target_y)\n        expanded_all_probs = self.model.get_probs(adv_x_cls)\n\n        adv_x_list = tf.split(adv_x_cls, self.nb_classes)\n        all_probs_list = tf.split(expanded_all_probs, self.nb_classes)\n\n        for cls in range(self.nb_classes):\n            target_y = target_ys[cls]\n            all_probs = all_probs_list[cls]\n            # We don't actually care whether we hit the target class.\n            # We care about the probability of the most likely wrong class\n            cur_prob_cls = tf.reduce_max(all_probs - true_y, axis=1)\n            # Knock out examples that are correctly classified.\n            # This is not needed to be optimal for t >= 0.5, but may as well do it\n            # to get better failure rate at lower thresholds.\n            chosen_cls = tf.argmax(all_probs, axis=1)\n            eligible = tf.to_float(tf.not_equal(true_y_idx, chosen_cls))\n            cur_prob_cls = cur_prob_cls * eligible\n            prob_cls.append(cur_prob_cls)\n\n        probs = tf.concat([tf.expand_dims(e, 1) for e in prob_cls], axis=1)\n        # Don't need to censor here because we knocked out the true class above\n        # probs = probs - true_y\n        most_confident = tf.argmax(probs, axis=1)\n        fused_mask = tf.one_hot(most_confident, self.nb_classes)\n        masks = tf.split(fused_mask, num_or_size_splits=self.nb_classes, axis=1)\n        shape = [m] + [1] * (len(x.get_shape()) - 1)\n        reshaped_masks = [tf.reshape(mask, shape) for mask in masks]\n        out = sum(adv_x * rmask for adv_x, rmask in zip(adv_x_list, reshaped_masks))\n        return out\n\n    def attack_class(self, x, target_y):\n        \"\"\"\n        Run the attack on a specific target class.\n        :param x: tf Tensor. The input example.\n        :param target_y: tf Tensor. The attacker's desired target class.\n        Returns:\n          A targeted adversarial example, intended to be classified as the target class.\n        \"\"\"\n        adv = self.base_attacker.generate(x, y_target=target_y, **self.params)\n        return adv\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/momentum_iterative_method.py",
    "content": "\"\"\"The MomentumIterativeMethod attack.\n\"\"\"\n\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.attacks.fast_gradient_method import optimize_linear\nfrom cleverhans.compat import reduce_sum, reduce_mean, softmax_cross_entropy_with_logits\nfrom cleverhans import utils_tf\n\n\nclass MomentumIterativeMethod(Attack):\n    \"\"\"\n    The Momentum Iterative Method (Dong et al. 2017). This method won\n    the first places in NIPS 2017 Non-targeted Adversarial Attacks and\n    Targeted Adversarial Attacks. The original paper used hard labels\n    for this attack; no label smoothing.\n    Paper link: https://arxiv.org/pdf/1710.06081.pdf\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Create a MomentumIterativeMethod instance.\n        Note: the model parameter should be an instance of the\n        cleverhans.model.Model abstraction provided by CleverHans.\n        \"\"\"\n\n        super(MomentumIterativeMethod, self).__init__(model, sess, dtypestr, **kwargs)\n        self.feedable_kwargs = (\n            \"eps\",\n            \"eps_iter\",\n            \"y\",\n            \"y_target\",\n            \"clip_min\",\n            \"clip_max\",\n        )\n        self.structural_kwargs = [\n            \"ord\",\n            \"nb_iter\",\n            \"decay_factor\",\n            \"sanity_checks\",\n            \"clip_grad\",\n        ]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n\n        :param x: The model's symbolic inputs.\n        :param kwargs: Keyword arguments. See `parse_params` for documentation.\n        \"\"\"\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        asserts = []\n\n        # If a data range was specified, check that the input was in that range\n        if self.clip_min is not None:\n            asserts.append(\n                utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype))\n            )\n\n        if self.clip_max is not None:\n            asserts.append(\n                utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype))\n            )\n\n        # Initialize loop variables\n        momentum = tf.zeros_like(x)\n        adv_x = x\n\n        # Fix labels to the first model predictions for loss computation\n        y, _nb_classes = self.get_or_guess_labels(x, kwargs)\n        y = y / reduce_sum(y, 1, keepdims=True)\n        targeted = self.y_target is not None\n\n        def cond(i, _, __):\n            \"\"\"Iterate until number of iterations completed\"\"\"\n            return tf.less(i, self.nb_iter)\n\n        def body(i, ax, m):\n            \"\"\"Do a momentum step\"\"\"\n            logits = self.model.get_logits(ax)\n            loss = softmax_cross_entropy_with_logits(labels=y, logits=logits)\n            if targeted:\n                loss = -loss\n\n            # Define gradient of loss wrt input\n            (grad,) = tf.gradients(loss, ax)\n\n            # Normalize current gradient and add it to the accumulated gradient\n            red_ind = list(range(1, len(grad.get_shape())))\n            avoid_zero_div = tf.cast(1e-12, grad.dtype)\n            grad = grad / tf.maximum(\n                avoid_zero_div, reduce_mean(tf.abs(grad), red_ind, keepdims=True)\n            )\n            m = self.decay_factor * m + grad\n\n            optimal_perturbation = optimize_linear(m, self.eps_iter, self.ord)\n            if self.ord == 1:\n                raise NotImplementedError(\n                    \"This attack hasn't been tested for ord=1.\"\n                    \"It's not clear that FGM makes a good inner \"\n                    \"loop step for iterative optimization since \"\n                    \"it updates just one coordinate at a time.\"\n                )\n\n            # Update and clip adversarial example in current iteration\n            ax = ax + optimal_perturbation\n            ax = x + utils_tf.clip_eta(ax - x, self.ord, self.eps)\n\n            if self.clip_min is not None and self.clip_max is not None:\n                ax = utils_tf.clip_by_value(ax, self.clip_min, self.clip_max)\n\n            ax = tf.stop_gradient(ax)\n\n            return i + 1, ax, m\n\n        _, adv_x, _ = tf.while_loop(\n            cond,\n            body,\n            (tf.zeros([]), adv_x, momentum),\n            back_prop=True,\n            maximum_iterations=self.nb_iter,\n        )\n\n        if self.sanity_checks:\n            with tf.control_dependencies(asserts):\n                adv_x = tf.identity(adv_x)\n\n        return adv_x\n\n    def parse_params(\n        self,\n        eps=0.3,\n        eps_iter=0.06,\n        nb_iter=10,\n        y=None,\n        ord=np.inf,\n        decay_factor=1.0,\n        clip_min=None,\n        clip_max=None,\n        y_target=None,\n        sanity_checks=True,\n        **kwargs\n    ):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        Attack-specific parameters:\n\n        :param eps: (optional float) maximum distortion of adversarial example\n                    compared to original input\n        :param eps_iter: (optional float) step size for each attack iteration\n        :param nb_iter: (optional int) Number of attack iterations.\n        :param y: (optional) A tensor with the true labels.\n        :param y_target: (optional) A tensor with the labels to target. Leave\n                         y_target=None if y is also set. Labels should be\n                         one-hot-encoded.\n        :param ord: (optional) Order of the norm (mimics Numpy).\n                    Possible values: np.inf, 1 or 2.\n        :param decay_factor: (optional) Decay factor for the momentum term.\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        \"\"\"\n\n        # Save attack-specific parameters\n        self.eps = eps\n        self.eps_iter = eps_iter\n        self.nb_iter = nb_iter\n        self.y = y\n        self.y_target = y_target\n        self.ord = ord\n        self.decay_factor = decay_factor\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        self.sanity_checks = sanity_checks\n\n        if self.y is not None and self.y_target is not None:\n            raise ValueError(\"Must not set both y and y_target\")\n        # Check if order of the norm is acceptable given current implementation\n        if self.ord not in [np.inf, 1, 2]:\n            raise ValueError(\"Norm order must be either np.inf, 1, or 2.\")\n\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n\n        return True\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/noise.py",
    "content": "\"\"\"The Noise attack\n\n\"\"\"\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\n\n\nclass Noise(Attack):\n    \"\"\"\n    A weak attack that just picks a random point in the attacker's action space.\n    When combined with an attack bundling function, this can be used to implement\n    random search.\n\n    References:\n    https://arxiv.org/abs/1802.00420 recommends random search to help identify\n      gradient masking.\n    https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part\n      of an attack bundling recipe combining many different optimizers to yield\n      a stronger optimizer.\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n\n        super(Noise, self).__init__(model, sess=sess, dtypestr=dtypestr, **kwargs)\n        self.feedable_kwargs = (\"eps\", \"clip_min\", \"clip_max\")\n        self.structural_kwargs = [\"ord\"]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n\n        :param x: The model's symbolic inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        if self.ord != np.inf:\n            raise NotImplementedError(self.ord)\n        eta = tf.random_uniform(tf.shape(x), -self.eps, self.eps, dtype=self.tf_dtype)\n        adv_x = x + eta\n        if self.clip_min is not None or self.clip_max is not None:\n            assert self.clip_min is not None and self.clip_max is not None\n            adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max)\n\n        return adv_x\n\n    def parse_params(self, eps=0.3, ord=np.inf, clip_min=None, clip_max=None, **kwargs):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        Attack-specific parameters:\n\n        :param eps: (optional float) maximum distortion of adversarial example\n                    compared to original input\n        :param ord: (optional) Order of the norm (mimics Numpy).\n                    Possible values: np.inf\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        \"\"\"\n\n        # Save attack-specific parameters\n        self.eps = eps\n        self.ord = ord\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n\n        # Check if order of the norm is acceptable given current implementation\n        if self.ord not in [np.inf]:\n            raise ValueError(\"Norm order must be np.inf\")\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n\n        return True\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/projected_gradient_descent.py",
    "content": "\"\"\"\nThe ProjectedGradientDescent attack.\n\"\"\"\n\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.attacks.fast_gradient_method import FastGradientMethod\nfrom cleverhans import utils_tf\nfrom cleverhans.compat import softmax_cross_entropy_with_logits\nfrom cleverhans.utils_tf import clip_eta, random_lp_vector\n\n\nclass ProjectedGradientDescent(Attack):\n    \"\"\"\n    This class implements either the Basic Iterative Method\n    (Kurakin et al. 2016) when rand_init is set to 0. or the\n    Madry et al. (2017) method when rand_minmax is larger than 0.\n    Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf\n    Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of the data\n    :param default_rand_init: whether to use random initialization by default\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    FGM_CLASS = FastGradientMethod\n\n    def __init__(\n        self, model, sess=None, dtypestr=\"float32\", default_rand_init=True, **kwargs\n    ):\n        \"\"\"\n        Create a ProjectedGradientDescent instance.\n        Note: the model parameter should be an instance of the\n        cleverhans.model.Model abstraction provided by CleverHans.\n        \"\"\"\n\n        super(ProjectedGradientDescent, self).__init__(\n            model, sess=sess, dtypestr=dtypestr, **kwargs\n        )\n        self.feedable_kwargs = (\n            \"eps\",\n            \"eps_iter\",\n            \"y\",\n            \"y_target\",\n            \"clip_min\",\n            \"clip_max\",\n        )\n        self.structural_kwargs = [\n            \"ord\",\n            \"nb_iter\",\n            \"rand_init\",\n            \"clip_grad\",\n            \"sanity_checks\",\n            \"loss_fn\",\n        ]\n        self.default_rand_init = default_rand_init\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n\n        :param x: The model's symbolic inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        asserts = []\n\n        # If a data range was specified, check that the input was in that range\n        if self.clip_min is not None:\n            asserts.append(\n                utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype))\n            )\n\n        if self.clip_max is not None:\n            asserts.append(\n                utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype))\n            )\n\n        # Initialize loop variables\n        if self.rand_init:\n            eta = random_lp_vector(\n                tf.shape(x),\n                self.ord,\n                tf.cast(self.rand_init_eps, x.dtype),\n                dtype=x.dtype,\n            )\n        else:\n            eta = tf.zeros(tf.shape(x))\n\n        # Clip eta\n        eta = clip_eta(eta, self.ord, self.eps)\n        adv_x = x + eta\n        if self.clip_min is not None or self.clip_max is not None:\n            adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max)\n\n        if self.y_target is not None:\n            y = self.y_target\n            targeted = True\n        elif self.y is not None:\n            y = self.y\n            targeted = False\n        else:\n            model_preds = self.model.get_probs(x)\n            preds_max = tf.reduce_max(model_preds, 1, keepdims=True)\n            y = tf.to_float(tf.equal(model_preds, preds_max))\n            y = tf.stop_gradient(y)\n            targeted = False\n            del model_preds\n\n        y_kwarg = \"y_target\" if targeted else \"y\"\n\n        fgm_params = {\n            \"eps\": self.eps_iter,\n            y_kwarg: y,\n            \"ord\": self.ord,\n            \"loss_fn\": self.loss_fn,\n            \"clip_min\": self.clip_min,\n            \"clip_max\": self.clip_max,\n            \"clip_grad\": self.clip_grad,\n        }\n        if self.ord == 1:\n            raise NotImplementedError(\n                \"FGM is not a good inner loop step for PGD \"\n                \" when ord=1, because ord=1 FGM changes only \"\n                \" one pixel at a time. Use the SparseL1Descent \"\n                \" attack instead, which allows fine-grained \"\n                \" control over the sparsity of the gradient \"\n                \" updates.\"\n            )\n\n        # Use getattr() to avoid errors in eager execution attacks\n        FGM = self.FGM_CLASS(\n            self.model, sess=getattr(self, \"sess\", None), dtypestr=self.dtypestr\n        )\n\n        def cond(i, _):\n            \"\"\"Iterate until requested number of iterations is completed\"\"\"\n            return tf.less(i, self.nb_iter)\n\n        def body(i, adv_x):\n            \"\"\"Do a projected gradient step\"\"\"\n            adv_x = FGM.generate(adv_x, **fgm_params)\n\n            # Clipping perturbation eta to self.ord norm ball\n            eta = adv_x - x\n            eta = clip_eta(eta, self.ord, self.eps)\n            adv_x = x + eta\n\n            # Redo the clipping.\n            # FGM already did it, but subtracting and re-adding eta can add some\n            # small numerical error.\n            if self.clip_min is not None or self.clip_max is not None:\n                adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max)\n\n            return i + 1, adv_x\n\n        _, adv_x = tf.while_loop(\n            cond,\n            body,\n            (tf.zeros([]), adv_x),\n            back_prop=True,\n            maximum_iterations=self.nb_iter,\n        )\n\n        # Asserts run only on CPU.\n        # When multi-GPU eval code tries to force all PGD ops onto GPU, this\n        # can cause an error.\n        common_dtype = tf.float32\n        asserts.append(\n            utils_tf.assert_less_equal(\n                tf.cast(self.eps_iter, dtype=common_dtype),\n                tf.cast(self.eps, dtype=common_dtype),\n            )\n        )\n        if self.ord == np.inf and self.clip_min is not None:\n            # The 1e-6 is needed to compensate for numerical error.\n            # Without the 1e-6 this fails when e.g. eps=.2, clip_min=.5,\n            # clip_max=.7\n            asserts.append(\n                utils_tf.assert_less_equal(\n                    tf.cast(self.eps, x.dtype),\n                    1e-6\n                    + tf.cast(self.clip_max, x.dtype)\n                    - tf.cast(self.clip_min, x.dtype),\n                )\n            )\n\n        if self.sanity_checks:\n            with tf.control_dependencies(asserts):\n                adv_x = tf.identity(adv_x)\n\n        return adv_x\n\n    def parse_params(\n        self,\n        eps=0.3,\n        eps_iter=0.05,\n        nb_iter=10,\n        y=None,\n        ord=np.inf,\n        loss_fn=softmax_cross_entropy_with_logits,\n        clip_min=None,\n        clip_max=None,\n        y_target=None,\n        rand_init=None,\n        rand_init_eps=None,\n        clip_grad=False,\n        sanity_checks=True,\n        **kwargs\n    ):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        Attack-specific parameters:\n\n        :param eps: (optional float) maximum distortion of adversarial example\n                    compared to original input\n        :param eps_iter: (optional float) step size for each attack iteration\n        :param nb_iter: (optional int) Number of attack iterations.\n        :param y: (optional) A tensor with the true labels.\n        :param y_target: (optional) A tensor with the labels to target. Leave\n                         y_target=None if y is also set. Labels should be\n                         one-hot-encoded.\n        :param ord: (optional) Order of the norm (mimics Numpy).\n                    Possible values: np.inf, 1 or 2.\n        :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        :param rand_init: (optional) Start the gradient descent from a point chosen\n                          uniformly at random in the norm ball of radius\n                          rand_init_eps\n        :param rand_init_eps: (optional float) size of the norm ball from which\n                              the initial starting point is chosen. Defaults to eps\n        :param clip_grad: (optional bool) Ignore gradient components at positions\n                          where the input is already at the boundary of the domain,\n                          and the update step will get clipped out.\n        :param sanity_checks: bool Insert tf asserts checking values\n            (Some tests need to run with no sanity checks because the\n             tests intentionally configure the attack strangely)\n        \"\"\"\n\n        # Save attack-specific parameters\n        self.eps = eps\n        if rand_init is None:\n            rand_init = self.default_rand_init\n        self.rand_init = rand_init\n        if rand_init_eps is None:\n            rand_init_eps = self.eps\n        self.rand_init_eps = rand_init_eps\n\n        self.eps_iter = eps_iter\n        self.nb_iter = nb_iter\n        self.y = y\n        self.y_target = y_target\n        self.ord = ord\n        self.loss_fn = loss_fn\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        self.clip_grad = clip_grad\n\n        if isinstance(eps, float) and isinstance(eps_iter, float):\n            # If these are both known at compile time, we can check before anything\n            # is run. If they are tf, we can't check them yet.\n            assert eps_iter <= eps, (eps_iter, eps)\n\n        if self.y is not None and self.y_target is not None:\n            raise ValueError(\"Must not set both y and y_target\")\n        # Check if order of the norm is acceptable given current implementation\n        if self.ord not in [np.inf, 1, 2]:\n            raise ValueError(\"Norm order must be either np.inf, 1, or 2.\")\n\n        if self.clip_grad and (self.clip_min is None or self.clip_max is None):\n            raise ValueError(\"Must set clip_min and clip_max if clip_grad is set\")\n\n        self.sanity_checks = sanity_checks\n\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n\n        return True\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/saliency_map_method.py",
    "content": "\"\"\"The SalienceMapMethod attack\n\"\"\"\n# pylint: disable=missing-docstring\nimport warnings\n\nimport numpy as np\nfrom six.moves import xrange\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.compat import reduce_sum, reduce_max, reduce_any\n\ntf_dtype = tf.as_dtype(\"float32\")\n\n\nclass SaliencyMapMethod(Attack):\n    \"\"\"\n    The Jacobian-based Saliency Map Method (Papernot et al. 2016).\n    Paper link: https://arxiv.org/pdf/1511.07528.pdf\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n\n    :note: When not using symbolic implementation in `generate`, `sess` should\n           be provided\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Create a SaliencyMapMethod instance.\n        Note: the model parameter should be an instance of the\n        cleverhans.model.Model abstraction provided by CleverHans.\n        \"\"\"\n\n        super(SaliencyMapMethod, self).__init__(model, sess, dtypestr, **kwargs)\n\n        self.feedable_kwargs = (\"y_target\",)\n        self.structural_kwargs = [\n            \"theta\",\n            \"gamma\",\n            \"clip_max\",\n            \"clip_min\",\n            \"symbolic_impl\",\n        ]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n\n        :param x: The model's symbolic inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        if self.symbolic_impl:\n            # Create random targets if y_target not provided\n            if self.y_target is None:\n                from random import randint\n\n                def random_targets(gt):\n                    result = gt.copy()\n                    nb_s = gt.shape[0]\n                    nb_classes = gt.shape[1]\n\n                    for i in range(nb_s):\n                        result[i, :] = np.roll(result[i, :], randint(1, nb_classes - 1))\n\n                    return result\n\n                labels, nb_classes = self.get_or_guess_labels(x, kwargs)\n                self.y_target = tf.py_func(random_targets, [labels], self.tf_dtype)\n                self.y_target.set_shape([None, nb_classes])\n\n            x_adv = jsma_symbolic(\n                x,\n                model=self.model,\n                y_target=self.y_target,\n                theta=self.theta,\n                gamma=self.gamma,\n                clip_min=self.clip_min,\n                clip_max=self.clip_max,\n            )\n        else:\n            raise NotImplementedError(\n                \"The jsma_batch function has been removed.\"\n                \" The symbolic_impl argument to SaliencyMapMethod will be removed\"\n                \" on 2019-07-18 or after. Any code that depends on the non-symbolic\"\n                \" implementation of the JSMA should be revised. Consider using\"\n                \" SaliencyMapMethod.generate_np() instead.\"\n            )\n\n        return x_adv\n\n    def parse_params(\n        self,\n        theta=1.0,\n        gamma=1.0,\n        clip_min=0.0,\n        clip_max=1.0,\n        y_target=None,\n        symbolic_impl=True,\n        **kwargs\n    ):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        Attack-specific parameters:\n\n        :param theta: (optional float) Perturbation introduced to modified\n                      components (can be positive or negative)\n        :param gamma: (optional float) Maximum percentage of perturbed features\n        :param clip_min: (optional float) Minimum component value for clipping\n        :param clip_max: (optional float) Maximum component value for clipping\n        :param y_target: (optional) Target tensor if the attack is targeted\n        \"\"\"\n        self.theta = theta\n        self.gamma = gamma\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        self.y_target = y_target\n        self.symbolic_impl = symbolic_impl\n\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n\n        return True\n\n\ndef jsma_batch(*args, **kwargs):\n    raise NotImplementedError(\n        \"The jsma_batch function has been removed. Any code that depends on it should be revised.\"\n    )\n\n\ndef jsma_symbolic(x, y_target, model, theta, gamma, clip_min, clip_max):\n    \"\"\"\n    TensorFlow implementation of the JSMA (see https://arxiv.org/abs/1511.07528\n    for details about the algorithm design choices).\n\n    :param x: the input placeholder\n    :param y_target: the target tensor\n    :param model: a cleverhans.model.Model object.\n    :param theta: delta for each feature adjustment\n    :param gamma: a float between 0 - 1 indicating the maximum distortion\n        percentage\n    :param clip_min: minimum value for components of the example returned\n    :param clip_max: maximum value for components of the example returned\n    :return: a tensor for the adversarial example\n    \"\"\"\n\n    nb_classes = int(y_target.shape[-1].value)\n    nb_features = int(np.product(x.shape[1:]).value)\n\n    if x.dtype == tf.float32 and y_target.dtype == tf.int64:\n        y_target = tf.cast(y_target, tf.int32)\n\n    if x.dtype == tf.float32 and y_target.dtype == tf.float64:\n        warnings.warn(\n            \"Downcasting labels---this should be harmless unless\" \" they are smoothed\"\n        )\n        y_target = tf.cast(y_target, tf.float32)\n\n    max_iters = np.floor(nb_features * gamma / 2)\n    increase = bool(theta > 0)\n\n    tmp = np.ones((nb_features, nb_features), int)\n    np.fill_diagonal(tmp, 0)\n    zero_diagonal = tf.constant(tmp, tf_dtype)\n\n    # Compute our initial search domain. We optimize the initial search domain\n    # by removing all features that are already at their maximum values (if\n    # increasing input features---otherwise, at their minimum value).\n    if increase:\n        search_domain = tf.reshape(tf.cast(x < clip_max, tf_dtype), [-1, nb_features])\n    else:\n        search_domain = tf.reshape(tf.cast(x > clip_min, tf_dtype), [-1, nb_features])\n\n    # Loop variables\n    # x_in: the tensor that holds the latest adversarial outputs that are in\n    #       progress.\n    # y_in: the tensor for target labels\n    # domain_in: the tensor that holds the latest search domain\n    # cond_in: the boolean tensor to show if more iteration is needed for\n    #          generating adversarial samples\n    def condition(x_in, y_in, domain_in, i_in, cond_in):\n        # Repeat the loop until we have achieved misclassification or\n        # reaches the maximum iterations\n        return tf.logical_and(tf.less(i_in, max_iters), cond_in)\n\n    # Same loop variables as above\n    def body(x_in, y_in, domain_in, i_in, cond_in):\n        # Create graph for model logits and predictions\n        logits = model.get_logits(x_in)\n        preds = tf.nn.softmax(logits)\n        preds_onehot = tf.one_hot(tf.argmax(preds, axis=1), depth=nb_classes)\n\n        # create the Jacobian graph\n        list_derivatives = []\n        for class_ind in xrange(nb_classes):\n            derivatives = tf.gradients(logits[:, class_ind], x_in)\n            list_derivatives.append(derivatives[0])\n        grads = tf.reshape(\n            tf.stack(list_derivatives), shape=[nb_classes, -1, nb_features]\n        )\n\n        # Compute the Jacobian components\n        # To help with the computation later, reshape the target_class\n        # and other_class to [nb_classes, -1, 1].\n        # The last dimention is added to allow broadcasting later.\n        target_class = tf.reshape(\n            tf.transpose(y_in, perm=[1, 0]), shape=[nb_classes, -1, 1]\n        )\n        other_classes = tf.cast(tf.not_equal(target_class, 1), tf_dtype)\n\n        grads_target = reduce_sum(grads * target_class, axis=0)\n        grads_other = reduce_sum(grads * other_classes, axis=0)\n\n        # Remove the already-used input features from the search space\n        # Subtract 2 times the maximum value from those value so that\n        # they won't be picked later\n        increase_coef = (4 * int(increase) - 2) * tf.cast(\n            tf.equal(domain_in, 0), tf_dtype\n        )\n\n        target_tmp = grads_target\n        target_tmp -= increase_coef * reduce_max(\n            tf.abs(grads_target), axis=1, keepdims=True\n        )\n        target_sum = tf.reshape(target_tmp, shape=[-1, nb_features, 1]) + tf.reshape(\n            target_tmp, shape=[-1, 1, nb_features]\n        )\n\n        other_tmp = grads_other\n        other_tmp += increase_coef * reduce_max(\n            tf.abs(grads_other), axis=1, keepdims=True\n        )\n        other_sum = tf.reshape(other_tmp, shape=[-1, nb_features, 1]) + tf.reshape(\n            other_tmp, shape=[-1, 1, nb_features]\n        )\n\n        # Create a mask to only keep features that match conditions\n        if increase:\n            scores_mask = (target_sum > 0) & (other_sum < 0)\n        else:\n            scores_mask = (target_sum < 0) & (other_sum > 0)\n\n        # Create a 2D numpy array of scores for each pair of candidate features\n        scores = (\n            tf.cast(scores_mask, tf_dtype) * (-target_sum * other_sum) * zero_diagonal\n        )\n\n        # Extract the best two pixels\n        best = tf.argmax(\n            tf.reshape(scores, shape=[-1, nb_features * nb_features]), axis=1\n        )\n\n        p1 = tf.mod(best, nb_features)\n        p2 = tf.floordiv(best, nb_features)\n        p1_one_hot = tf.one_hot(p1, depth=nb_features)\n        p2_one_hot = tf.one_hot(p2, depth=nb_features)\n\n        # Check if more modification is needed for each sample\n        mod_not_done = tf.equal(reduce_sum(y_in * preds_onehot, axis=1), 0)\n        cond = mod_not_done & (reduce_sum(domain_in, axis=1) >= 2)\n\n        # Update the search domain\n        cond_float = tf.reshape(tf.cast(cond, tf_dtype), shape=[-1, 1])\n        to_mod = (p1_one_hot + p2_one_hot) * cond_float\n\n        domain_out = domain_in - to_mod\n\n        # Apply the modification to the images\n        to_mod_reshape = tf.reshape(to_mod, shape=([-1] + x_in.shape[1:].as_list()))\n        if increase:\n            x_out = tf.minimum(clip_max, x_in + to_mod_reshape * theta)\n        else:\n            x_out = tf.maximum(clip_min, x_in - to_mod_reshape * theta)\n\n        # Increase the iterator, and check if all misclassifications are done\n        i_out = tf.add(i_in, 1)\n        cond_out = reduce_any(cond)\n\n        return x_out, y_in, domain_out, i_out, cond_out\n\n    # Run loop to do JSMA\n    x_adv, _, _, _, _ = tf.while_loop(\n        condition, body, [x, y_target, search_domain, 0, True], parallel_iterations=1\n    )\n\n    return x_adv\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/semantic.py",
    "content": "\"\"\"Semantic adversarial examples\n\"\"\"\n\nfrom cleverhans.attacks.attack import Attack\n\n\nclass Semantic(Attack):\n    \"\"\"\n    Semantic adversarial examples\n\n    https://arxiv.org/abs/1703.06857\n\n    Note: data must either be centered (so that the negative image can be\n    made by simple negation) or must be in the interval [-1, 1]\n\n    :param model: cleverhans.model.Model\n    :param center: bool\n      If True, assumes data has 0 mean so the negative image is just negation.\n      If False, assumes data is in the interval [0, max_val]\n    :param max_val: float\n      Maximum value allowed in the input data\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of data\n    :param kwargs: passed through to the super constructor\n    \"\"\"\n\n    def __init__(\n        self, model, center, max_val=1.0, sess=None, dtypestr=\"float32\", **kwargs\n    ):\n        super(Semantic, self).__init__(model, sess, dtypestr, **kwargs)\n        self.center = center\n        self.max_val = max_val\n        if hasattr(model, \"dataset_factory\"):\n            if \"center\" in model.dataset_factory.kwargs:\n                assert center == model.dataset_factory.kwargs[\"center\"]\n\n    def generate(self, x, **kwargs):\n        if self.center:\n            return -x\n        return self.max_val - x\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/sparse_l1_descent.py",
    "content": "\"\"\"\nThe SparseL1Descent attack.\n\"\"\"\n\nimport warnings\nfrom distutils.version import LooseVersion\n\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans import utils_tf\nfrom cleverhans.utils_tf import clip_eta, random_lp_vector\nfrom cleverhans.compat import reduce_max, reduce_sum, softmax_cross_entropy_with_logits\n\n\nclass SparseL1Descent(Attack):\n    \"\"\"\n    This class implements a variant of Projected Gradient Descent for the l1-norm\n    (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2\n    cases covered by the ProjectedGradientDescent class, because the steepest\n    descent direction for the l1-norm is too sparse (it updates a single\n    coordinate in the adversarial perturbation in each step). This attack has an\n    additional parameter that controls the sparsity of the update step. For\n    moderately sparse update steps, the attack vastly outperforms Projected\n    Steepest Descent and is competitive with other attacks targeted at the l1-norm\n    such as the ElasticNetMethod attack (which is much more computationally\n    expensive).\n    Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Create a SparseL1Descent instance.\n        Note: the model parameter should be an instance of the\n        cleverhans.model.Model abstraction provided by CleverHans.\n        \"\"\"\n\n        super(SparseL1Descent, self).__init__(\n            model, sess=sess, dtypestr=dtypestr, **kwargs\n        )\n        self.feedable_kwargs = (\n            \"eps\",\n            \"eps_iter\",\n            \"y\",\n            \"y_target\",\n            \"clip_min\",\n            \"clip_max\",\n            \"grad_sparsity\",\n        )\n        self.structural_kwargs = [\"nb_iter\", \"rand_init\", \"clip_grad\", \"sanity_checks\"]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n\n        :param x: The model's symbolic inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        asserts = []\n\n        # If a data range was specified, check that the input was in that range\n        if self.clip_min is not None:\n            asserts.append(\n                utils_tf.assert_greater_equal(x, tf.cast(self.clip_min, x.dtype))\n            )\n\n        if self.clip_max is not None:\n            asserts.append(\n                utils_tf.assert_less_equal(x, tf.cast(self.clip_max, x.dtype))\n            )\n\n        # Initialize loop variables\n        if self.rand_init:\n            eta = random_lp_vector(\n                tf.shape(x), ord=1, eps=tf.cast(self.eps, x.dtype), dtype=x.dtype\n            )\n        else:\n            eta = tf.zeros(tf.shape(x))\n\n        # Clip eta\n        eta = clip_eta(eta, ord=1, eps=self.eps)\n        adv_x = x + eta\n        if self.clip_min is not None or self.clip_max is not None:\n            adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max)\n\n        if self.y_target is not None:\n            y = self.y_target\n            targeted = True\n        elif self.y is not None:\n            y = self.y\n            targeted = False\n        else:\n            model_preds = self.model.get_probs(x)\n            preds_max = tf.reduce_max(model_preds, 1, keepdims=True)\n            y = tf.to_float(tf.equal(model_preds, preds_max))\n            y = tf.stop_gradient(y)\n            targeted = False\n            del model_preds\n\n        y_kwarg = \"y_target\" if targeted else \"y\"\n\n        def cond(i, _):\n            \"\"\"Iterate until requested number of iterations is completed\"\"\"\n            return tf.less(i, self.nb_iter)\n\n        def body(i, adv_x):\n            \"\"\"Do a projected gradient step\"\"\"\n\n            labels, _ = self.get_or_guess_labels(adv_x, {y_kwarg: y})\n            logits = self.model.get_logits(adv_x)\n\n            adv_x = sparse_l1_descent(\n                adv_x,\n                logits,\n                y=labels,\n                eps=self.eps_iter,\n                q=self.grad_sparsity,\n                clip_min=self.clip_min,\n                clip_max=self.clip_max,\n                clip_grad=self.clip_grad,\n                targeted=(self.y_target is not None),\n                sanity_checks=self.sanity_checks,\n            )\n\n            # Clipping perturbation eta to the l1-ball\n            eta = adv_x - x\n            eta = clip_eta(eta, ord=1, eps=self.eps)\n            adv_x = x + eta\n\n            # Redo the clipping.\n            # Subtracting and re-adding eta can add some small numerical error.\n            if self.clip_min is not None or self.clip_max is not None:\n                adv_x = utils_tf.clip_by_value(adv_x, self.clip_min, self.clip_max)\n\n            return i + 1, adv_x\n\n        _, adv_x = tf.while_loop(\n            cond,\n            body,\n            (tf.zeros([]), adv_x),\n            back_prop=True,\n            maximum_iterations=self.nb_iter,\n        )\n\n        # Asserts run only on CPU.\n        # When multi-GPU eval code tries to force all PGD ops onto GPU, this\n        # can cause an error.\n        common_dtype = tf.float32\n        asserts.append(\n            utils_tf.assert_less_equal(\n                tf.cast(self.eps_iter, dtype=common_dtype),\n                tf.cast(self.eps, dtype=common_dtype),\n            )\n        )\n\n        if self.sanity_checks:\n            with tf.control_dependencies(asserts):\n                adv_x = tf.identity(adv_x)\n\n        return adv_x\n\n    def parse_params(\n        self,\n        eps=10.0,\n        eps_iter=1.0,\n        nb_iter=20,\n        y=None,\n        clip_min=None,\n        clip_max=None,\n        y_target=None,\n        rand_init=False,\n        clip_grad=False,\n        grad_sparsity=99,\n        sanity_checks=True,\n        **kwargs\n    ):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        Attack-specific parameters:\n\n        :param eps: (optional float) maximum distortion of adversarial example\n                    compared to original input\n        :param eps_iter: (optional float) step size for each attack iteration\n        :param nb_iter: (optional int) Number of attack iterations.\n        :param y: (optional) A tensor with the true labels.\n        :param y_target: (optional) A tensor with the labels to target. Leave\n                         y_target=None if y is also set. Labels should be\n                         one-hot-encoded.\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        :param clip_grad: (optional bool) Ignore gradient components\n                          at positions where the input is already at the boundary\n                          of the domain, and the update step will get clipped out.\n        :param grad_sparsity (optional) Relative sparsity of the gradient update\n                             step, in percent. Only gradient values larger\n                             than this percentile are retained. This parameter can\n                             be a scalar, or a vector of the same length as the\n                             input batch dimension.\n        :param sanity_checks: bool Insert tf asserts checking values\n            (Some tests need to run with no sanity checks because the\n             tests intentionally configure the attack strangely)\n        \"\"\"\n\n        # Save attack-specific parameters\n        self.eps = eps\n        self.rand_init = rand_init\n        self.eps_iter = eps_iter\n        self.nb_iter = nb_iter\n        self.y = y\n        self.y_target = y_target\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        self.clip_grad = clip_grad\n        self.grad_sparsity = grad_sparsity\n\n        if isinstance(eps, float) and isinstance(eps_iter, float):\n            # If these are both known at compile time, we can check before anything\n            # is run. If they are tf, we can't check them yet.\n            assert eps_iter <= eps, (eps_iter, eps)\n\n        if self.y is not None and self.y_target is not None:\n            raise ValueError(\"Must not set both y and y_target\")\n\n        if self.clip_grad and (self.clip_min is None or self.clip_max is None):\n            raise ValueError(\"Must set clip_min and clip_max if clip_grad is set\")\n\n        # The grad_sparsity argument governs the sparsity of the gradient\n        # update. It indicates the percentile value above which gradient entries\n        # are retained. It can be specified as a scalar or as a 1-dimensional\n        # vector of the same size as the input's batch dimension.\n        if isinstance(self.grad_sparsity, int) or isinstance(self.grad_sparsity, float):\n            if not 0 < self.grad_sparsity < 100:\n                raise ValueError(\"grad_sparsity should be in (0, 100)\")\n        else:\n            self.grad_sparsity = tf.convert_to_tensor(self.grad_sparsity)\n            if len(self.grad_sparsity.shape) > 1:\n                raise ValueError(\"grad_sparsity should either be a scalar or a vector\")\n\n        self.sanity_checks = sanity_checks\n\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n\n        return True\n\n\ndef sparse_l1_descent(\n    x,\n    logits,\n    y=None,\n    eps=1.0,\n    q=99,\n    clip_min=None,\n    clip_max=None,\n    clip_grad=False,\n    targeted=False,\n    sanity_checks=True,\n):\n    \"\"\"\n    TensorFlow implementation of the Dense L1 Descent Method.\n    :param x: the input placeholder\n    :param logits: output of model.get_logits\n    :param y: (optional) A placeholder for the true labels. If targeted\n              is true, then provide the target label. Otherwise, only provide\n              this parameter if you'd like to use true labels when crafting\n              adversarial samples. Otherwise, model predictions are used as\n              labels to avoid the \"label leaking\" effect (explained in this\n              paper: https://arxiv.org/abs/1611.01236). Default is None.\n              Labels should be one-hot-encoded.\n    :param eps: the epsilon (input variation parameter)\n    :param q: the percentile above which gradient values are retained. Either a\n              scalar or a vector of same length as the input batch dimension.\n    :param clip_min: Minimum float value for adversarial example components\n    :param clip_max: Maximum float value for adversarial example components\n    :param clip_grad: (optional bool) Ignore gradient components\n                      at positions where the input is already at the boundary\n                      of the domain, and the update step will get clipped out.\n    :param targeted: Is the attack targeted or untargeted? Untargeted, the\n                     default, will try to make the label incorrect. Targeted\n                     will instead try to move in the direction of being more\n                     like y.\n    :return: a tensor for the adversarial example\n    \"\"\"\n\n    asserts = []\n\n    # If a data range was specified, check that the input was in that range\n    if clip_min is not None:\n        asserts.append(utils_tf.assert_greater_equal(x, tf.cast(clip_min, x.dtype)))\n\n    if clip_max is not None:\n        asserts.append(utils_tf.assert_less_equal(x, tf.cast(clip_max, x.dtype)))\n\n    # Make sure the caller has not passed probs by accident\n    assert logits.op.type != \"Softmax\"\n\n    if y is None:\n        # Using model predictions as ground truth to avoid label leaking\n        preds_max = reduce_max(logits, 1, keepdims=True)\n        y = tf.to_float(tf.equal(logits, preds_max))\n        y = tf.stop_gradient(y)\n    y = y / reduce_sum(y, 1, keepdims=True)\n\n    # Compute loss\n    loss = softmax_cross_entropy_with_logits(labels=y, logits=logits)\n    if targeted:\n        loss = -loss\n\n    # Define gradient of loss wrt input\n    (grad,) = tf.gradients(loss, x)\n\n    if clip_grad:\n        grad = utils_tf.zero_out_clipped_grads(grad, x, clip_min, clip_max)\n\n    red_ind = list(range(1, len(grad.get_shape())))\n    dim = tf.reduce_prod(tf.shape(x)[1:])\n\n    abs_grad = tf.reshape(tf.abs(grad), (-1, dim))\n\n    # if q is a scalar, broadcast it to a vector of same length as the batch dim\n    q = tf.cast(tf.broadcast_to(q, tf.shape(x)[0:1]), tf.float32)\n    k = tf.cast(tf.floor(q / 100 * tf.cast(dim, tf.float32)), tf.int32)\n\n    # `tf.sort` is much faster than `tf.contrib.distributions.percentile`.\n    # For TF <= 1.12, use `tf.nn.top_k` as `tf.sort` is not implemented.\n    if LooseVersion(tf.__version__) <= LooseVersion(\"1.12.0\"):\n        # `tf.sort` is only available in TF 1.13 onwards\n        sorted_grad = -tf.nn.top_k(-abs_grad, k=dim, sorted=True)[0]\n    else:\n        sorted_grad = tf.sort(abs_grad, axis=-1)\n\n    idx = tf.stack((tf.range(tf.shape(abs_grad)[0]), k), -1)\n    percentiles = tf.gather_nd(sorted_grad, idx)\n    tied_for_max = tf.greater_equal(abs_grad, tf.expand_dims(percentiles, -1))\n    tied_for_max = tf.reshape(tf.cast(tied_for_max, x.dtype), tf.shape(grad))\n    num_ties = tf.reduce_sum(tied_for_max, red_ind, keepdims=True)\n\n    optimal_perturbation = tf.sign(grad) * tied_for_max / num_ties\n\n    # Add perturbation to original example to obtain adversarial example\n    adv_x = x + utils_tf.mul(eps, optimal_perturbation)\n\n    # If clipping is needed, reset all values outside of [clip_min, clip_max]\n    if (clip_min is not None) or (clip_max is not None):\n        # We don't currently support one-sided clipping\n        assert clip_min is not None and clip_max is not None\n        adv_x = utils_tf.clip_by_value(adv_x, clip_min, clip_max)\n\n    if sanity_checks:\n        with tf.control_dependencies(asserts):\n            adv_x = tf.identity(adv_x)\n\n    return adv_x\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/spatial_transformation_method.py",
    "content": "\"\"\"The SpatialTransformationMethod attack\n\"\"\"\nimport warnings\n\nfrom cleverhans.attacks.attack import Attack\n\n\nclass SpatialTransformationMethod(Attack):\n    \"\"\"\n    Spatial transformation attack\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n          Create a SpatialTransformationMethod instance.\n          Note: the model parameter should be an instance of the\n          cleverhans.model.Model abstraction provided by CleverHans.\n\n        :param model: cleverhans.model.Model\n        :param sess: optional tf.Session\n        :param dtypestr: dtype of the data\n        :param kwargs: passed through to super constructor\n        \"\"\"\n\n        super(SpatialTransformationMethod, self).__init__(\n            model, sess, dtypestr, **kwargs\n        )\n        self.feedable_kwargs = (\n            \"n_samples\",\n            \"dx_min\",\n            \"dx_max\",\n            \"n_dxs\",\n            \"dy_min\",\n            \"dy_max\",\n            \"n_dys\",\n            \"angle_min\",\n            \"angle_max\",\n            \"n_angles\",\n            \"black_border_size\",\n        )\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n        :param x: The model's symbolic inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        from cleverhans.attacks_tf import spm\n\n        labels, _ = self.get_or_guess_labels(x, kwargs)\n\n        return spm(\n            x,\n            self.model,\n            y=labels,\n            n_samples=self.n_samples,\n            dx_min=self.dx_min,\n            dx_max=self.dx_max,\n            n_dxs=self.n_dxs,\n            dy_min=self.dy_min,\n            dy_max=self.dy_max,\n            n_dys=self.n_dys,\n            angle_min=self.angle_min,\n            angle_max=self.angle_max,\n            n_angles=self.n_angles,\n            black_border_size=self.black_border_size,\n        )\n\n    def parse_params(\n        self,\n        n_samples=None,\n        dx_min=-0.1,\n        dx_max=0.1,\n        n_dxs=2,\n        dy_min=-0.1,\n        dy_max=0.1,\n        n_dys=2,\n        angle_min=-30,\n        angle_max=30,\n        n_angles=6,\n        black_border_size=0,\n        **kwargs\n    ):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n        :param n_samples: (optional) The number of transformations sampled to\n                          construct the attack. Set it to None to run\n                          full grid attack.\n        :param dx_min: (optional float) Minimum translation ratio along x-axis.\n        :param dx_max: (optional float) Maximum translation ratio along x-axis.\n        :param n_dxs: (optional int) Number of discretized translation ratios\n                      along x-axis.\n        :param dy_min: (optional float) Minimum translation ratio along y-axis.\n        :param dy_max: (optional float) Maximum translation ratio along y-axis.\n        :param n_dys: (optional int) Number of discretized translation ratios\n                      along y-axis.\n        :param angle_min: (optional float) Largest counter-clockwise rotation\n                          angle.\n        :param angle_max: (optional float) Largest clockwise rotation angle.\n        :param n_angles: (optional int) Number of discretized angles.\n        :param black_border_size: (optional int) size of the black border in pixels.\n        \"\"\"\n        self.n_samples = n_samples\n        self.dx_min = dx_min\n        self.dx_max = dx_max\n        self.n_dxs = n_dxs\n        self.dy_min = dy_min\n        self.dy_max = dy_max\n        self.n_dys = n_dys\n        self.angle_min = angle_min\n        self.angle_max = angle_max\n        self.n_angles = n_angles\n        self.black_border_size = black_border_size\n\n        if self.dx_min < -1 or self.dy_min < -1 or self.dx_max > 1 or self.dy_max > 1:\n            raise ValueError(\n                \"The value of translation must be bounded \" \"within [-1, 1]\"\n            )\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n        return True\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/spsa.py",
    "content": "\"\"\"The SPSA attack\n\"\"\"\n# pylint: disable=missing-docstring\nimport warnings\n\nimport numpy as np\nfrom six.moves import xrange\nimport tensorflow as tf\nimport tensorflow_addons as tfa\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.compat import reduce_mean, reduce_sum, reduce_max\nfrom cleverhans.model import Model\nfrom cleverhans import utils_tf\n\ntf_dtype = tf.as_dtype(\"float32\")\n\n\nclass SPSA(Attack):\n    \"\"\"\n    This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666\n    (Uesato et al. 2018). SPSA is a gradient-free optimization method, which\n    is useful when the model is non-differentiable, or more generally, the\n    gradients do not point in useful directions.\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    DEFAULT_SPSA_SAMPLES = 128\n    DEFAULT_SPSA_ITERS = 1\n    DEFAULT_DELTA = 0.01\n    DEFAULT_LEARNING_RATE = 0.01\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        super(SPSA, self).__init__(model, sess, dtypestr, **kwargs)\n\n        self.feedable_kwargs = (\"eps\", \"clip_min\", \"clip_max\", \"y\", \"y_target\")\n        self.structural_kwargs = [\n            \"nb_iter\",\n            \"spsa_samples\",\n            \"spsa_iters\",\n            \"early_stop_loss_threshold\",\n            \"is_debug\",\n            \"is_targeted\",\n        ]\n\n        assert isinstance(self.model, Model)\n\n    def generate(\n        self,\n        x,\n        y=None,\n        y_target=None,\n        eps=None,\n        clip_min=None,\n        clip_max=None,\n        nb_iter=None,\n        is_targeted=None,\n        early_stop_loss_threshold=None,\n        learning_rate=DEFAULT_LEARNING_RATE,\n        delta=DEFAULT_DELTA,\n        spsa_samples=DEFAULT_SPSA_SAMPLES,\n        batch_size=None,\n        spsa_iters=DEFAULT_SPSA_ITERS,\n        is_debug=False,\n        epsilon=None,\n        num_steps=None,\n    ):\n        \"\"\"\n        Generate symbolic graph for adversarial examples.\n\n        :param x: The model's symbolic inputs. Must be a batch of size 1.\n        :param y: A Tensor or None. The index of the correct label.\n        :param y_target: A Tensor or None. The index of the target label in a\n                         targeted attack.\n        :param eps: The size of the maximum perturbation, measured in the\n                    L-infinity norm.\n        :param clip_min: If specified, the minimum input value\n        :param clip_max: If specified, the maximum input value\n        :param nb_iter: The number of optimization steps.\n        :param early_stop_loss_threshold: A float or None. If specified, the\n                                          attack will end as soon as the loss\n                                          is below `early_stop_loss_threshold`.\n        :param learning_rate: Learning rate of ADAM optimizer.\n        :param delta: Perturbation size used for SPSA approximation.\n        :param spsa_samples: Number of inputs to evaluate at a single time.\n                           The true batch size (the number of evaluated\n                           inputs for each update) is `spsa_samples *\n                           spsa_iters`\n        :param batch_size: Deprecated param that is an alias for spsa_samples\n        :param spsa_iters: Number of model evaluations before performing an\n                           update, where each evaluation is on `spsa_samples`\n                           different inputs.\n        :param is_debug: If True, print the adversarial loss after each update.\n        :param epsilon: Deprecated alias for `eps`\n        :param num_steps: Deprecated alias for `nb_iter`.\n        :param is_targeted: Deprecated argument. Ignored.\n        \"\"\"\n\n        if epsilon is not None:\n            if eps is not None:\n                raise ValueError(\n                    \"Should not specify both eps and its deprecated \" \"alias, epsilon\"\n                )\n            warnings.warn(\n                \"`epsilon` is deprecated. Switch to `eps`. `epsilon` may \"\n                \"be removed on or after 2019-04-15.\"\n            )\n            eps = epsilon\n        del epsilon\n\n        if num_steps is not None:\n            if nb_iter is not None:\n                raise ValueError(\n                    \"Should not specify both nb_iter and its deprecated \"\n                    \"alias, num_steps\"\n                )\n            warnings.warn(\n                \"`num_steps` is deprecated. Switch to `nb_iter`. \"\n                \"`num_steps` may be removed on or after 2019-04-15.\"\n            )\n            nb_iter = num_steps\n        del num_steps\n        assert nb_iter is not None\n\n        if (y is not None) + (y_target is not None) != 1:\n            raise ValueError(\n                \"Must specify exactly one of y (untargeted attack, \"\n                \"cause the input not to be classified as this true \"\n                \"label) and y_target (targeted attack, cause the \"\n                \"input to be classified as this target label).\"\n            )\n\n        if is_targeted is not None:\n            warnings.warn(\n                \"`is_targeted` is deprecated. Simply do not specify it.\"\n                \" It may become an error to specify it on or after \"\n                \"2019-04-15.\"\n            )\n            assert is_targeted == y_target is not None\n\n        is_targeted = y_target is not None\n\n        if x.get_shape().as_list()[0] is None:\n            check_batch = utils_tf.assert_equal(tf.shape(x)[0], 1)\n            with tf.control_dependencies([check_batch]):\n                x = tf.identity(x)\n        elif x.get_shape().as_list()[0] != 1:\n            raise ValueError(\"For SPSA, input tensor x must have batch_size of 1.\")\n\n        if batch_size is not None:\n            warnings.warn(\n                'The \"batch_size\" argument to SPSA is deprecated, and will '\n                \"be removed on 2019-03-17. \"\n                \"Please use spsa_samples instead.\"\n            )\n            spsa_samples = batch_size\n\n        optimizer = SPSAAdam(\n            lr=learning_rate,\n            delta=delta,\n            num_samples=spsa_samples,\n            num_iters=spsa_iters,\n        )\n\n        def loss_fn(x, label):\n            \"\"\"\n            Margin logit loss, with correct sign for targeted vs untargeted loss.\n            \"\"\"\n            logits = self.model.get_logits(x)\n            loss_multiplier = 1 if is_targeted else -1\n            return loss_multiplier * margin_logit_loss(\n                logits,\n                label,\n                nb_classes=self.model.nb_classes or logits.get_shape()[-1],\n            )\n\n        y_attack = y_target if is_targeted else y\n        adv_x = projected_optimization(\n            loss_fn,\n            x,\n            y_attack,\n            eps,\n            num_steps=nb_iter,\n            optimizer=optimizer,\n            early_stop_loss_threshold=early_stop_loss_threshold,\n            is_debug=is_debug,\n            clip_min=clip_min,\n            clip_max=clip_max,\n        )\n        return adv_x\n\n    def generate_np(self, x_val, **kwargs):\n        if \"epsilon\" in kwargs:\n            warnings.warn(\"Using deprecated argument: see `generate`\")\n            assert \"eps\" not in kwargs\n            kwargs[\"eps\"] = kwargs[\"epsilon\"]\n            del kwargs[\"epsilon\"]\n        assert \"eps\" in kwargs\n\n        if \"num_steps\" in kwargs:\n            warnings.warn(\"Using deprecated argument: see `generate`\")\n            assert \"nb_iter\" not in kwargs\n            kwargs[\"nb_iter\"] = kwargs[\"num_steps\"]\n            del kwargs[\"num_steps\"]\n\n        if \"y\" in kwargs and kwargs[\"y\"] is not None:\n            assert kwargs[\"y\"].dtype in [np.int32, np.int64]\n        if \"y_target\" in kwargs and kwargs[\"y_target\"] is not None:\n            assert kwargs[\"y_target\"].dtype in [np.int32, np.int64]\n\n        # Call self.generate() sequentially for each image in the batch\n        x_adv = []\n        batch_size = x_val.shape[0]\n        y = kwargs.pop(\"y\", [None] * batch_size)\n        assert len(x_val) == len(y), \"# of images and labels should match\"\n        for x_single, y_single in zip(x_val, y):\n            x = np.expand_dims(x_single, axis=0)\n            adv_img = super(SPSA, self).generate_np(x, y=y_single, **kwargs)\n            x_adv.append(adv_img)\n        return np.concatenate(x_adv, axis=0)\n\n\ndef _project_perturbation(\n    perturbation, epsilon, input_image, clip_min=None, clip_max=None\n):\n    \"\"\"Project `perturbation` onto L-infinity ball of radius `epsilon`.\n    Also project into hypercube such that the resulting adversarial example\n    is between clip_min and clip_max, if applicable.\n    \"\"\"\n\n    if clip_min is None or clip_max is None:\n        raise NotImplementedError(\n            \"_project_perturbation currently has clipping \" \"hard-coded in.\"\n        )\n\n    # Ensure inputs are in the correct range\n    with tf.control_dependencies(\n        [\n            utils_tf.assert_less_equal(\n                input_image, tf.cast(clip_max, input_image.dtype)\n            ),\n            utils_tf.assert_greater_equal(\n                input_image, tf.cast(clip_min, input_image.dtype)\n            ),\n        ]\n    ):\n        clipped_perturbation = utils_tf.clip_by_value(perturbation, -epsilon, epsilon)\n        new_image = utils_tf.clip_by_value(\n            input_image + clipped_perturbation, clip_min, clip_max\n        )\n        return new_image - input_image\n\n\nclass TensorOptimizer(object):\n    \"\"\"Optimizer for Tensors rather than tf.Variables.\n\n    TensorOptimizers implement optimizers where the values being optimized\n    are ordinary Tensors, rather than Variables. TF Variables can have strange\n    behaviors when being assigned multiple times within a single sess.run()\n    call, particularly in Distributed TF, so this avoids thinking about those\n    issues. These are helper classes for the `projected_optimization`\n    method. Apart from not using Variables, they follow an interface very\n    similar to tf.Optimizer.\n    \"\"\"\n\n    def _compute_gradients(self, loss_fn, x, unused_optim_state):\n        \"\"\"Compute a new value of `x` to minimize `loss_fn`.\n\n        Args:\n            loss_fn: a callable that takes `x`, a batch of images, and returns\n                a batch of loss values. `x` will be optimized to minimize\n                `loss_fn(x)`.\n            x: A list of Tensors, the values to be updated. This is analogous\n                to the `var_list` argument in standard TF Optimizer.\n            unused_optim_state: A (possibly nested) dict, containing any state\n                info needed for the optimizer.\n\n        Returns:\n            new_x: A list of Tensors, the same length as `x`, which are updated\n            new_optim_state: A dict, with the same structure as `optim_state`,\n                which have been updated.\n        \"\"\"\n\n        # Assumes `x` is a list,\n        # and contains a tensor representing a batch of images\n        assert len(x) == 1 and isinstance(\n            x, list\n        ), \"x should be a list and contain only one image tensor\"\n        x = x[0]\n        loss = reduce_mean(loss_fn(x), axis=0)\n        return tf.gradients(loss, x)\n\n    def _apply_gradients(self, grads, x, optim_state):\n        \"\"\"\n        Given a gradient, make one optimization step.\n\n        :param grads: list of tensors, same length as `x`, containing the corresponding gradients\n        :param x: list of tensors to update\n        :param optim_state: dict\n\n        Returns:\n          new_x: list of tensors, updated version of `x`\n          new_optim_state: dict, updated version of `optim_state`\n        \"\"\"\n        raise NotImplementedError(\"_apply_gradients should be defined in each subclass\")\n\n    def minimize(self, loss_fn, x, optim_state):\n        \"\"\"\n        Analogous to tf.Optimizer.minimize\n\n        :param loss_fn: tf Tensor, representing the loss to minimize\n        :param x: list of Tensor, analogous to tf.Optimizer's var_list\n        :param optim_state: A possibly nested dict, containing any optimizer state.\n\n        Returns:\n          new_x: list of Tensor, updated version of `x`\n          new_optim_state: dict, updated version of `optim_state`\n        \"\"\"\n        grads = self._compute_gradients(loss_fn, x, optim_state)\n        return self._apply_gradients(grads, x, optim_state)\n\n    def init_state(self, x):\n        \"\"\"Returns the initial state of the optimizer.\n\n        Args:\n            x: A list of Tensors, which will be optimized.\n\n        Returns:\n            A dictionary, representing the initial state of the optimizer.\n        \"\"\"\n        raise NotImplementedError(\"init_state should be defined in each subclass\")\n\n\nclass TensorGradientDescent(TensorOptimizer):\n    \"\"\"Vanilla Gradient Descent TensorOptimizer.\"\"\"\n\n    def __init__(self, lr):\n        self._lr = lr\n\n    def init_state(self, x):\n        return {}\n\n    def _apply_gradients(self, grads, x, optim_state):\n        new_x = [None] * len(x)\n        for i in xrange(len(x)):\n            new_x[i] = x[i] - self._lr * grads[i]\n        return new_x, optim_state\n\n\nclass TensorAdam(TensorOptimizer):\n    \"\"\"The Adam optimizer defined in https://arxiv.org/abs/1412.6980.\"\"\"\n\n    def __init__(self, lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-9):\n        self._lr = lr\n        self._beta1 = beta1\n        self._beta2 = beta2\n        self._epsilon = epsilon\n\n    def init_state(self, x):\n        \"\"\"\n        Initialize t, m, and u\n        \"\"\"\n        optim_state = {}\n        optim_state[\"t\"] = 0.0\n        optim_state[\"m\"] = [tf.zeros_like(v) for v in x]\n        optim_state[\"u\"] = [tf.zeros_like(v) for v in x]\n        return optim_state\n\n    def _apply_gradients(self, grads, x, optim_state):\n        \"\"\"Refer to parent class documentation.\"\"\"\n        new_x = [None] * len(x)\n        new_optim_state = {\n            \"t\": optim_state[\"t\"] + 1.0,\n            \"m\": [None] * len(x),\n            \"u\": [None] * len(x),\n        }\n        t = new_optim_state[\"t\"]\n        for i in xrange(len(x)):\n            g = grads[i]\n            m_old = optim_state[\"m\"][i]\n            u_old = optim_state[\"u\"][i]\n            new_optim_state[\"m\"][i] = self._beta1 * m_old + (1.0 - self._beta1) * g\n            new_optim_state[\"u\"][i] = self._beta2 * u_old + (1.0 - self._beta2) * g * g\n            m_hat = new_optim_state[\"m\"][i] / (1.0 - tf.pow(self._beta1, t))\n            u_hat = new_optim_state[\"u\"][i] / (1.0 - tf.pow(self._beta2, t))\n            new_x[i] = x[i] - self._lr * m_hat / (tf.sqrt(u_hat) + self._epsilon)\n        return new_x, new_optim_state\n\n\nclass SPSAAdam(TensorAdam):\n    \"\"\"Optimizer for gradient-free attacks in https://arxiv.org/abs/1802.05666.\n\n    Gradients estimates are computed using Simultaneous Perturbation Stochastic\n    Approximation (SPSA), combined with the ADAM update rule.\n    \"\"\"\n\n    def __init__(\n        self,\n        lr=0.01,\n        delta=0.01,\n        num_samples=128,\n        num_iters=1,\n        compare_to_analytic_grad=False,\n    ):\n        super(SPSAAdam, self).__init__(lr=lr)\n        assert num_samples % 2 == 0, \"number of samples must be even\"\n        self._delta = delta\n        self._num_samples = num_samples // 2  # Since we mirror +/- delta later\n        self._num_iters = num_iters\n        self._compare_to_analytic_grad = compare_to_analytic_grad\n\n    def _get_delta(self, x, delta):\n        x_shape = x.get_shape().as_list()\n        delta_x = delta * tf.sign(\n            tf.random_uniform(\n                [self._num_samples] + x_shape[1:],\n                minval=-1.0,\n                maxval=1.0,\n                dtype=tf_dtype,\n            )\n        )\n        return delta_x\n\n    def _compute_gradients(self, loss_fn, x, unused_optim_state):\n        \"\"\"Compute gradient estimates using SPSA.\"\"\"\n        # Assumes `x` is a list, containing a [1, H, W, C] image\n        # If static batch dimension is None, tf.reshape to batch size 1\n        # so that static shape can be inferred\n        assert len(x) == 1\n        static_x_shape = x[0].get_shape().as_list()\n        if static_x_shape[0] is None:\n            x[0] = tf.reshape(x[0], [1] + static_x_shape[1:])\n        assert x[0].get_shape().as_list()[0] == 1\n        x = x[0]\n        x_shape = x.get_shape().as_list()\n\n        def body(i, grad_array):\n            delta = self._delta\n            delta_x = self._get_delta(x, delta)\n            delta_x = tf.concat([delta_x, -delta_x], axis=0)\n            loss_vals = tf.reshape(\n                loss_fn(x + delta_x), [2 * self._num_samples] + [1] * (len(x_shape) - 1)\n            )\n            avg_grad = reduce_mean(loss_vals * delta_x, axis=0) / delta\n            avg_grad = tf.expand_dims(avg_grad, axis=0)\n            new_grad_array = grad_array.write(i, avg_grad)\n            return i + 1, new_grad_array\n\n        def cond(i, _):\n            return i < self._num_iters\n\n        _, all_grads = tf.while_loop(\n            cond,\n            body,\n            loop_vars=[0, tf.TensorArray(size=self._num_iters, dtype=tf_dtype)],\n            back_prop=False,\n            parallel_iterations=1,\n        )\n        avg_grad = reduce_sum(all_grads.stack(), axis=0)\n        return [avg_grad]\n\n\ndef margin_logit_loss(model_logits, label, nb_classes=10, num_classes=None):\n    \"\"\"Computes difference between logit for `label` and next highest logit.\n\n    The loss is high when `label` is unlikely (targeted by default).\n    This follows the same interface as `loss_fn` for TensorOptimizer and\n    projected_optimization, i.e. it returns a batch of loss values.\n    \"\"\"\n    if num_classes is not None:\n        warnings.warn(\n            \"`num_classes` is depreciated. Switch to `nb_classes`.\"\n            \" `num_classes` may be removed on or after 2019-04-23.\"\n        )\n        nb_classes = num_classes\n        del num_classes\n    if \"int\" in str(label.dtype):\n        logit_mask = tf.one_hot(label, depth=nb_classes, axis=-1)\n    else:\n        logit_mask = label\n    if \"int\" in str(logit_mask.dtype):\n        logit_mask = tf.to_float(logit_mask)\n    try:\n        label_logits = reduce_sum(logit_mask * model_logits, axis=-1)\n    except TypeError:\n        raise TypeError(\n            \"Could not take row-wise dot product between \"\n            \"logit mask, of dtype \"\n            + str(logit_mask.dtype)\n            + \" and model_logits, of dtype \"\n            + str(model_logits.dtype)\n        )\n    logits_with_target_label_neg_inf = model_logits - logit_mask * 99999\n    highest_nonlabel_logits = reduce_max(logits_with_target_label_neg_inf, axis=-1)\n    loss = highest_nonlabel_logits - label_logits\n    return loss\n\n\ndef _apply_black_border(x, border_size):\n    orig_height = x.get_shape().as_list()[1]\n    orig_width = x.get_shape().as_list()[2]\n    x = tf.image.resize_images(\n        x, (orig_width - 2 * border_size, orig_height - 2 * border_size)\n    )\n\n    return tf.pad(\n        x,\n        [[0, 0], [border_size, border_size], [border_size, border_size], [0, 0]],\n        \"CONSTANT\",\n    )\n\n\ndef _apply_transformation(inputs):\n    x, trans = inputs[0], inputs[1]\n    dx, dy, angle = trans[0], trans[1], trans[2]\n    height = x.get_shape().as_list()[1]\n    width = x.get_shape().as_list()[2]\n\n    # Pad the image to prevent two-step rotation / translation from truncating\n    # corners\n    max_dist_from_center = np.sqrt(height ** 2 + width ** 2) / 2\n    min_edge_from_center = float(np.min([height, width])) / 2\n    padding = np.ceil(max_dist_from_center - min_edge_from_center).astype(np.int32)\n    x = tf.pad(x, [[0, 0], [padding, padding], [padding, padding], [0, 0]], \"CONSTANT\")\n\n    # Apply rotation\n    angle *= np.pi / 180\n    x = tfa.image.rotate(x, angle, interpolation=\"BILINEAR\")\n\n    # Apply translation\n    dx_in_px = -dx * height\n    dy_in_px = -dy * width\n    translation = tf.convert_to_tensor([dx_in_px, dy_in_px])\n\n    try:\n        x = tfa.image.translate(x, translation, interpolation=\"BILINEAR\")\n    except AttributeError as e:\n        print(\"WARNING: SpatialAttack requires tf 1.6 or higher\")\n        raise e\n    x = tfa.image.translate(x, translation, interpolation=\"BILINEAR\")\n    return tf.image.resize_image_with_crop_or_pad(x, height, width)\n\n\ndef spm(\n    x,\n    model,\n    y=None,\n    n_samples=None,\n    dx_min=-0.1,\n    dx_max=0.1,\n    n_dxs=5,\n    dy_min=-0.1,\n    dy_max=0.1,\n    n_dys=5,\n    angle_min=-30,\n    angle_max=30,\n    n_angles=31,\n    black_border_size=0,\n):\n    \"\"\"\n    TensorFlow implementation of the Spatial Transformation Method.\n    :return: a tensor for the adversarial example\n    \"\"\"\n    if y is None:\n        preds = model.get_probs(x)\n        # Using model predictions as ground truth to avoid label leaking\n        preds_max = reduce_max(preds, 1, keepdims=True)\n        y = tf.to_float(tf.equal(preds, preds_max))\n        y = tf.stop_gradient(y)\n        del preds\n    y = y / reduce_sum(y, 1, keepdims=True)\n\n    # Define the range of transformations\n    dxs = np.linspace(dx_min, dx_max, n_dxs)\n    dys = np.linspace(dy_min, dy_max, n_dys)\n    angles = np.linspace(angle_min, angle_max, n_angles)\n\n    if n_samples is None:\n        import itertools\n\n        transforms = list(itertools.product(*[dxs, dys, angles]))\n    else:\n        sampled_dxs = np.random.choice(dxs, n_samples)\n        sampled_dys = np.random.choice(dys, n_samples)\n        sampled_angles = np.random.choice(angles, n_samples)\n        transforms = zip(sampled_dxs, sampled_dys, sampled_angles)\n    transformed_ims = parallel_apply_transformations(x, transforms, black_border_size)\n\n    def _compute_xent(x):\n        preds = model.get_logits(x)\n        return tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=preds)\n\n    all_xents = tf.map_fn(\n        _compute_xent, transformed_ims, parallel_iterations=1\n    )  # Must be 1 to avoid keras race conditions\n\n    # Return the adv_x with worst accuracy\n\n    # all_xents is n_total_samples x batch_size (SB)\n    all_xents = tf.stack(all_xents)  # SB\n\n    # We want the worst case sample, with the largest xent_loss\n    worst_sample_idx = tf.argmax(all_xents, axis=0)  # B\n\n    batch_size = tf.shape(x)[0]\n    keys = tf.stack(\n        [tf.range(batch_size, dtype=tf.int32), tf.cast(worst_sample_idx, tf.int32)],\n        axis=1,\n    )\n    transformed_ims_bshwc = tf.einsum(\"sbhwc->bshwc\", transformed_ims)\n    after_lookup = tf.gather_nd(transformed_ims_bshwc, keys)  # BHWC\n    return after_lookup\n\n\ndef parallel_apply_transformations(x, transforms, black_border_size=0):\n    \"\"\"\n    Apply image transformations in parallel.\n    :param transforms: TODO\n    :param black_border_size: int, size of black border to apply\n    Returns:\n      Transformed images\n    \"\"\"\n    transforms = tf.convert_to_tensor(transforms, dtype=tf.float32)\n    x = _apply_black_border(x, black_border_size)\n\n    num_transforms = transforms.get_shape().as_list()[0]\n    im_shape = x.get_shape().as_list()[1:]\n\n    # Pass a copy of x and a transformation to each iteration of the map_fn\n    # callable\n    tiled_x = tf.reshape(\n        tf.tile(x, [num_transforms, 1, 1, 1]), [num_transforms, -1] + im_shape\n    )\n    elems = [tiled_x, transforms]\n    transformed_ims = tf.map_fn(\n        _apply_transformation,\n        elems,\n        dtype=tf.float32,\n        parallel_iterations=1,  # Must be 1 to avoid keras race conditions\n    )\n    return transformed_ims\n\n\ndef projected_optimization(\n    loss_fn,\n    input_image,\n    label,\n    epsilon,\n    num_steps,\n    clip_min=None,\n    clip_max=None,\n    optimizer=TensorAdam(),\n    project_perturbation=_project_perturbation,\n    early_stop_loss_threshold=None,\n    is_debug=False,\n):\n    \"\"\"Generic projected optimization, generalized to work with approximate\n    gradients. Used for e.g. the SPSA attack.\n\n    Args:\n      :param loss_fn: A callable which takes `input_image` and `label` as\n                      arguments, and returns a batch of loss values. Same\n                      interface as TensorOptimizer.\n      :param input_image: Tensor, a batch of images\n      :param label: Tensor, a batch of labels\n      :param epsilon: float, the L-infinity norm of the maximum allowable\n                      perturbation\n      :param num_steps: int, the number of steps of gradient descent\n      :param clip_min: float, minimum pixel value\n      :param clip_max: float, maximum pixel value\n      :param optimizer: A `TensorOptimizer` object\n      :param project_perturbation: A function, which will be used to enforce\n                                   some constraint. It should have the same\n                                   signature as `_project_perturbation`.\n      :param early_stop_loss_threshold: A float or None. If specified, the attack will end if the loss is below\n         `early_stop_loss_threshold`.\n          Enabling this option can have several different effects:\n            - Setting the threshold to 0. guarantees that if a successful attack is found, it is returned.\n              This increases the attack success rate, because without early stopping the optimizer can accidentally\n              bounce back to a point where the attack fails.\n            - Early stopping can make the attack run faster because it may run for fewer steps.\n            - Early stopping can make the attack run slower because the loss must be calculated at each step.\n              The loss is not calculated as part of the normal SPSA optimization procedure.\n              For most reasonable choices of hyperparameters, early stopping makes the attack much faster because\n              it decreases the number of steps dramatically.\n      :param is_debug: A bool. If True, print debug info for attack progress.\n\n    Returns:\n      adversarial version of `input_image`, with L-infinity difference less than\n        epsilon, which tries to minimize loss_fn.\n\n    Note that this function is not intended as an Attack by itself. Rather, it\n    is designed as a helper function which you can use to write your own attack\n    methods. The method uses a tf.while_loop to optimize a loss function in\n    a single sess.run() call.\n    \"\"\"\n    assert num_steps is not None\n    if is_debug:\n        with tf.device(\"/cpu:0\"):\n            input_image = tf.Print(\n                input_image, [], \"Starting PGD attack with epsilon: %s\" % epsilon\n            )\n\n    init_perturbation = tf.random_uniform(\n        tf.shape(input_image),\n        minval=tf.cast(-epsilon, input_image.dtype),\n        maxval=tf.cast(epsilon, input_image.dtype),\n        dtype=input_image.dtype,\n    )\n    init_perturbation = project_perturbation(\n        init_perturbation, epsilon, input_image, clip_min=clip_min, clip_max=clip_max\n    )\n    init_optim_state = optimizer.init_state([init_perturbation])\n    nest = tf.nest\n\n    def loop_body(i, perturbation, flat_optim_state):\n        \"\"\"Update perturbation to input image.\"\"\"\n        optim_state = nest.pack_sequence_as(\n            structure=init_optim_state, flat_sequence=flat_optim_state\n        )\n\n        def wrapped_loss_fn(x):\n            return loss_fn(input_image + x, label)\n\n        new_perturbation_list, new_optim_state = optimizer.minimize(\n            wrapped_loss_fn, [perturbation], optim_state\n        )\n        projected_perturbation = project_perturbation(\n            new_perturbation_list[0],\n            epsilon,\n            input_image,\n            clip_min=clip_min,\n            clip_max=clip_max,\n        )\n\n        # Be careful with this bool. A value of 0. is a valid threshold but evaluates to False, so we must explicitly\n        # check whether the value is None.\n        early_stop = early_stop_loss_threshold is not None\n        compute_loss = is_debug or early_stop\n        # Don't waste time building the loss graph if we're not going to use it\n        if compute_loss:\n            # NOTE: this step is not actually redundant with the optimizer step.\n            # SPSA calculates the loss at randomly perturbed points but doesn't calculate the loss at the current point.\n            loss = reduce_mean(wrapped_loss_fn(projected_perturbation), axis=0)\n\n            if is_debug:\n                with tf.device(\"/cpu:0\"):\n                    loss = tf.Print(loss, [loss], \"Total batch loss\")\n\n            if early_stop:\n                i = tf.cond(\n                    tf.less(loss, early_stop_loss_threshold),\n                    lambda: float(num_steps),\n                    lambda: i,\n                )\n\n        return i + 1, projected_perturbation, nest.flatten(new_optim_state)\n\n    def cond(i, *_):\n        return tf.less(i, num_steps)\n\n    flat_init_optim_state = nest.flatten(init_optim_state)\n    _, final_perturbation, _ = tf.while_loop(\n        cond,\n        loop_body,\n        loop_vars=(tf.constant(0.0), init_perturbation, flat_init_optim_state),\n        parallel_iterations=1,\n        back_prop=False,\n        maximum_iterations=num_steps,\n    )\n    if project_perturbation is _project_perturbation:\n        # TODO: this assert looks totally wrong.\n        # Not bothering to fix it now because it's only an assert.\n        # 1) Multiplying by 1.1 gives a huge margin of error. This should probably\n        #    take the difference and allow a tolerance of 1e-6 or something like\n        #    that.\n        # 2) I think it should probably check the *absolute value* of\n        # final_perturbation\n        perturbation_max = epsilon * 1.1\n        check_diff = utils_tf.assert_less_equal(\n            final_perturbation,\n            tf.cast(perturbation_max, final_perturbation.dtype),\n            message=\"final_perturbation must change no pixel by more than \"\n            \"%s\" % perturbation_max,\n        )\n    else:\n        # TODO: let caller pass in a check_diff function as well as\n        # project_perturbation\n        check_diff = tf.no_op()\n\n    if clip_min is None or clip_max is None:\n        raise NotImplementedError(\"This function only supports clipping for now\")\n    check_range = [\n        utils_tf.assert_less_equal(input_image, tf.cast(clip_max, input_image.dtype)),\n        utils_tf.assert_greater_equal(\n            input_image, tf.cast(clip_min, input_image.dtype)\n        ),\n    ]\n\n    with tf.control_dependencies([check_diff] + check_range):\n        adversarial_image = input_image + final_perturbation\n    return tf.stop_gradient(adversarial_image)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks/virtual_adversarial_method.py",
    "content": "\"\"\"The VirtualAdversarialMethod attack\n\n\"\"\"\n\nimport warnings\n\nimport tensorflow as tf\n\nfrom cleverhans.attacks.attack import Attack\nfrom cleverhans.model import Model, CallableModelWrapper\nfrom cleverhans.model import wrapper_warning_logits\nfrom cleverhans import utils_tf\n\ntf_dtype = tf.as_dtype(\"float32\")\n\n\nclass VirtualAdversarialMethod(Attack):\n    \"\"\"\n    This attack was originally proposed by Miyato et al. (2016) and was used\n    for virtual adversarial training.\n    Paper link: https://arxiv.org/abs/1507.00677\n\n    :param model: cleverhans.model.Model\n    :param sess: optional tf.Session\n    :param dtypestr: dtype of the data\n    :param kwargs: passed through to super constructor\n    \"\"\"\n\n    def __init__(self, model, sess=None, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Note: the model parameter should be an instance of the\n        cleverhans.model.Model abstraction provided by CleverHans.\n        \"\"\"\n        if not isinstance(model, Model):\n            wrapper_warning_logits()\n            model = CallableModelWrapper(model, \"logits\")\n\n        super(VirtualAdversarialMethod, self).__init__(model, sess, dtypestr, **kwargs)\n\n        self.feedable_kwargs = (\"eps\", \"xi\", \"clip_min\", \"clip_max\")\n        self.structural_kwargs = [\"num_iterations\"]\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generate symbolic graph for adversarial examples and return.\n\n        :param x: The model's symbolic inputs.\n        :param kwargs: See `parse_params`\n        \"\"\"\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n\n        return vatm(\n            self.model,\n            x,\n            self.model.get_logits(x),\n            eps=self.eps,\n            num_iterations=self.num_iterations,\n            xi=self.xi,\n            clip_min=self.clip_min,\n            clip_max=self.clip_max,\n        )\n\n    def parse_params(\n        self,\n        eps=2.0,\n        nb_iter=None,\n        xi=1e-6,\n        clip_min=None,\n        clip_max=None,\n        num_iterations=None,\n        **kwargs\n    ):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        Attack-specific parameters:\n\n        :param eps: (optional float )the epsilon (input variation parameter)\n        :param nb_iter: (optional) the number of iterations\n          Defaults to 1 if not specified\n        :param xi: (optional float) the finite difference parameter\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        :param num_iterations: Deprecated alias for `nb_iter`\n        \"\"\"\n        # Save attack-specific parameters\n        self.eps = eps\n        if num_iterations is not None:\n            warnings.warn(\n                \"`num_iterations` is deprecated. Switch to `nb_iter`.\"\n                \" The old name will be removed on or after 2019-04-26.\"\n            )\n            # Note: when we remove the deprecated alias, we can put the default\n            # value of 1 for nb_iter back in the method signature\n            assert nb_iter is None\n            nb_iter = num_iterations\n        del num_iterations\n        if nb_iter is None:\n            nb_iter = 1\n        self.num_iterations = nb_iter\n        self.xi = xi\n        self.clip_min = clip_min\n        self.clip_max = clip_max\n        if len(kwargs.keys()) > 0:\n            warnings.warn(\n                \"kwargs is unused and will be removed on or after \" \"2019-04-26.\"\n            )\n        return True\n\n\ndef vatm(\n    model,\n    x,\n    logits,\n    eps,\n    num_iterations=1,\n    xi=1e-6,\n    clip_min=None,\n    clip_max=None,\n    scope=None,\n):\n    \"\"\"\n    Tensorflow implementation of the perturbation method used for virtual\n    adversarial training: https://arxiv.org/abs/1507.00677\n    :param model: the model which returns the network unnormalized logits\n    :param x: the input placeholder\n    :param logits: the model's unnormalized output tensor (the input to\n                   the softmax layer)\n    :param eps: the epsilon (input variation parameter)\n    :param num_iterations: the number of iterations\n    :param xi: the finite difference parameter\n    :param clip_min: optional parameter that can be used to set a minimum\n                    value for components of the example returned\n    :param clip_max: optional parameter that can be used to set a maximum\n                    value for components of the example returned\n    :param seed: the seed for random generator\n    :return: a tensor for the adversarial example\n    \"\"\"\n    with tf.name_scope(scope, \"virtual_adversarial_perturbation\"):\n        d = tf.random_normal(tf.shape(x), dtype=tf_dtype)\n        for _ in range(num_iterations):\n            d = xi * utils_tf.l2_batch_normalize(d)\n            logits_d = model.get_logits(x + d)\n            kl = utils_tf.kl_with_logits(logits, logits_d)\n            Hd = tf.gradients(kl, d)[0]\n            d = tf.stop_gradient(Hd)\n        d = eps * utils_tf.l2_batch_normalize(d)\n        adv_x = x + d\n        if (clip_min is not None) and (clip_max is not None):\n            adv_x = tf.clip_by_value(adv_x, clip_min, clip_max)\n        return adv_x\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks_tf.py",
    "content": "# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport warnings\n\nimport numpy as np\n\nfrom cleverhans.attacks.carlini_wagner_l2 import (\n    CWL2 as CarliniWagnerL2,\n)  # pylint: disable=unused-import\nfrom cleverhans.attacks.deep_fool import (\n    deepfool_batch,\n    deepfool_attack,\n)  # pylint: disable=unused-import\nfrom cleverhans.attacks.elastic_net_method import (\n    EAD as ElasticNetMethod,\n)  # pylint: disable=unused-import\nfrom cleverhans.attacks.lbfgs import (\n    LBFGS_impl as LBFGS_attack,\n)  # pylint: disable=unused-import\nfrom cleverhans.attacks.saliency_map_method import (\n    jsma_symbolic,\n)  # pylint: disable=unused-import\nfrom cleverhans.attacks.spsa import (\n    TensorOptimizer,\n    TensorGradientDescent,\n    TensorAdam,\n)  # pylint: disable=unused-import\nfrom cleverhans.attacks.spsa import (\n    SPSAAdam,\n    margin_logit_loss,\n    _apply_black_border,\n)  # pylint: disable=unused-import\nfrom cleverhans.attacks.spsa import (\n    _apply_transformation,\n    spm,\n    parallel_apply_transformations,\n)  # pylint: disable=unused-import\nfrom cleverhans.attacks.virtual_adversarial_method import (\n    vatm,\n)  # pylint: disable=unused-import\nfrom cleverhans.utils_tf import (\n    jacobian_graph,\n    jacobian_augmentation,\n)  # pylint: disable=unused-import\nfrom cleverhans import utils\n\nnp_dtype = np.dtype(\"float32\")\n\n_logger = utils.create_logger(\"cleverhans.attacks.tf\")\n\nwarnings.warn(\n    \"attacks_tf is deprecated and will be removed on 2019-07-18\"\n    \" or after. Code should import functions from their new locations directly.\"\n)\n\n\ndef fgsm(x, predictions, eps=0.3, clip_min=None, clip_max=None):\n    warnings.warn(\n        \"This function is deprecated and will be removed on or after \"\n        \"2019-04-09. Switch to cleverhans.attacks.FastGradientMethod.\"\n    )\n    return fgm(\n        x,\n        predictions,\n        y=None,\n        eps=eps,\n        ord=np.inf,\n        clip_min=clip_min,\n        clip_max=clip_max,\n    )\n\n\ndef fgm(x, preds, *args, **kwargs):\n    if preds.op.type == \"Softmax\":\n        (logits,) = preds.op.inputs\n    else:\n        raise TypeError(\"Unclear how to get logits\")\n    warnings.warn(\n        \"This function is deprecated. Switch to passing *logits* to\"\n        \" cleverhans.attacks.fgm\"\n    )\n    from cleverhans.attacks import fgm as logits_fgm\n\n    return logits_fgm(x, logits, *args, **kwargs)\n\n\ndef apply_perturbations(i, j, X, increase, theta, clip_min, clip_max):\n    \"\"\"\n    TensorFlow implementation for apply perturbations to input features based\n    on saliency maps\n    :param i: index of first selected feature\n    :param j: index of second selected feature\n    :param X: a matrix containing our input features for our sample\n    :param increase: boolean; true if we are increasing pixels, false otherwise\n    :param theta: delta for each feature adjustment\n    :param clip_min: mininum value for a feature in our sample\n    :param clip_max: maximum value for a feature in our sample\n    : return: a perturbed input feature matrix for a target class\n    \"\"\"\n    warnings.warn(\n        \"This function is dead code and will be removed on or after 2019-07-18\"\n    )\n\n    # perturb our input sample\n    if increase:\n        X[0, i] = np.minimum(clip_max, X[0, i] + theta)\n        X[0, j] = np.minimum(clip_max, X[0, j] + theta)\n    else:\n        X[0, i] = np.maximum(clip_min, X[0, i] - theta)\n        X[0, j] = np.maximum(clip_min, X[0, j] - theta)\n\n    return X\n\n\ndef saliency_map(grads_target, grads_other, search_domain, increase):\n    \"\"\"\n    TensorFlow implementation for computing saliency maps\n    :param grads_target: a matrix containing forward derivatives for the\n                         target class\n    :param grads_other: a matrix where every element is the sum of forward\n                        derivatives over all non-target classes at that index\n    :param search_domain: the set of input indices that we are considering\n    :param increase: boolean; true if we are increasing pixels, false otherwise\n    :return: (i, j, search_domain) the two input indices selected and the\n             updated search domain\n    \"\"\"\n    warnings.warn(\n        \"This function is dead code and will be removed on or after 2019-07-18\"\n    )\n\n    # Compute the size of the input (the number of features)\n    nf = len(grads_target)\n\n    # Remove the already-used input features from the search space\n    invalid = list(set(range(nf)) - search_domain)\n    increase_coef = 2 * int(increase) - 1\n    grads_target[invalid] = -increase_coef * np.max(np.abs(grads_target))\n    grads_other[invalid] = increase_coef * np.max(np.abs(grads_other))\n\n    # Create a 2D numpy array of the sum of grads_target and grads_other\n    target_sum = grads_target.reshape((1, nf)) + grads_target.reshape((nf, 1))\n    other_sum = grads_other.reshape((1, nf)) + grads_other.reshape((nf, 1))\n\n    # Create a mask to only keep features that match saliency map conditions\n    if increase:\n        scores_mask = (target_sum > 0) & (other_sum < 0)\n    else:\n        scores_mask = (target_sum < 0) & (other_sum > 0)\n\n    # Create a 2D numpy array of the scores for each pair of candidate features\n    scores = scores_mask * (-target_sum * other_sum)\n\n    # A pixel can only be selected (and changed) once\n    np.fill_diagonal(scores, 0)\n\n    # Extract the best two pixels\n    best = np.argmax(scores)\n    p1, p2 = best % nf, best // nf\n\n    # Remove used pixels from our search domain\n    search_domain.discard(p1)\n    search_domain.discard(p2)\n\n    return p1, p2, search_domain\n\n\ndef jacobian(sess, x, grads, target, X, nb_features, nb_classes, feed=None):\n    \"\"\"\n    TensorFlow implementation of the foward derivative / Jacobian\n    :param x: the input placeholder\n    :param grads: the list of TF gradients returned by jacobian_graph()\n    :param target: the target misclassification class\n    :param X: numpy array with sample input\n    :param nb_features: the number of features in the input\n    :return: matrix of forward derivatives flattened into vectors\n    \"\"\"\n    warnings.warn(\n        \"This function is dead code and will be removed on or after 2019-07-18\"\n    )\n\n    # Prepare feeding dictionary for all gradient computations\n    feed_dict = {x: X}\n    if feed is not None:\n        feed_dict.update(feed)\n\n    # Initialize a numpy array to hold the Jacobian component values\n    jacobian_val = np.zeros((nb_classes, nb_features), dtype=np_dtype)\n\n    # Compute the gradients for all classes\n    for class_ind, grad in enumerate(grads):\n        run_grad = sess.run(grad, feed_dict)\n        jacobian_val[class_ind] = np.reshape(run_grad, (1, nb_features))\n\n    # Sum over all classes different from the target class to prepare for\n    # saliency map computation in the next step of the attack\n    other_classes = utils.other_classes(nb_classes, target)\n    grad_others = np.sum(jacobian_val[other_classes, :], axis=0)\n\n    return jacobian_val[target], grad_others\n\n\nclass UnrolledOptimizer(TensorOptimizer):\n    def __init__(self, *args, **kwargs):\n        warnings.warn(\n            \"UnrolledOptimizer has been renamed to TensorOptimizer.\"\n            \" The old name may be removed on or after 2019-04-25.\"\n        )\n        super(UnrolledOptimizer, self).__init__(*args, **kwargs)\n\n\nclass UnrolledGradientDescent(TensorGradientDescent):\n    def __init__(self, *args, **kwargs):\n        warnings.warn(\n            \"UnrolledGradientDescent has been renamed to \"\n            \"TensorGradientDescent.\"\n            \" The old name may be removed on or after 2019-04-25.\"\n        )\n        super(UnrolledGradientDescent, self).__init__(*args, **kwargs)\n\n\nclass UnrolledAdam(TensorAdam):\n    def __init__(self, *args, **kwargs):\n        warnings.warn(\n            \"UnrolledAdam has been renamed to TensorAdam.\"\n            \" The old name may be removed on or after 2019-04-25.\"\n        )\n        super(UnrolledAdam, self).__init__(*args, **kwargs)\n\n\ndef pgd_attack(*args, **kwargs):\n    warnings.warn(\n        \"cleverhans.attacks_tf.pgd_attack has been renamed to \"\n        \"cleverhans.attacks.projected_optimization. \"\n        \"Please switch to the new name. The current name will \"\n        \"become unsupport on or after 2019-04-24.\"\n    )\n    from cleverhans.attacks import projected_optimization\n\n    return projected_optimization(*args, **kwargs)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/attacks_tfe.py",
    "content": "\"\"\"\nAttacks for TensorFlow Eager\n\"\"\"\nfrom distutils.version import LooseVersion\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans import attacks\nfrom cleverhans import utils\nfrom cleverhans.model import CallableModelWrapper, wrapper_warning\nfrom cleverhans.model import Model\nfrom cleverhans.loss import LossCrossEntropy\n\n_logger = utils.create_logger(\"cleverhans.attacks_tfe\")\n\n\nif LooseVersion(tf.__version__) < LooseVersion(\"1.8.0\"):\n    error_msg = (\"For eager execution\", \"use Tensorflow version greather than 1.8.0.\")\n    raise ValueError(error_msg)\n\n\nclass Attack(attacks.Attack):\n    \"\"\"\n    Abstract base class for all eager attack classes.\n    :param model: An instance of the cleverhans.model.Model class.\n    :param back: The backend to use. Inherited from AttackBase class.\n    :param dtypestr: datatype of the input data samples and crafted\n                     adversarial attacks.\n    \"\"\"\n\n    def __init__(self, model, dtypestr=\"float32\"):\n        super(Attack, self).__init__(model, dtypestr=dtypestr)\n        # Validate the input arguments.\n        if dtypestr != \"float32\" and dtypestr != \"float64\":\n            raise ValueError(\"Unexpected input for argument dtypestr.\")\n        self.tf_dtype = tf.as_dtype(dtypestr)\n        self.np_dtype = np.dtype(dtypestr)\n\n        if not isinstance(model, Model):\n            raise ValueError(\n                \"The model argument should be an instance of\"\n                \" the cleverhans.model.Model class.\"\n            )\n        # Prepare attributes\n        self.model = model\n        self.dtypestr = dtypestr\n\n    def construct_graph(self, **kwargs):\n        \"\"\"\n        Constructs the graph required to run the attacks.\n        Is inherited from the attack class, is overloaded\n        to raise an error.\n        \"\"\"\n        error = \"This method is not required for eager execution.\"\n        raise AttributeError(error)\n\n    def generate_np(self, x_val, **kwargs):\n        \"\"\"\n        Generate adversarial examples and return them as a NumPy array.\n\n        :param x_val: A NumPy array with the original inputs.\n        :param **kwargs: optional parameters used by child classes.\n        :return: A NumPy array holding the adversarial examples.\n        \"\"\"\n        tfe = tf.contrib.eager\n        x = tfe.Variable(x_val)\n        adv_x = self.generate(x, **kwargs)\n        return adv_x.numpy()\n\n    def construct_variables(self, kwargs):\n        \"\"\"\n        Construct the inputs to the attack graph.\n        Is inherited from the attack class, is overloaded\n        to raise an error.\n        \"\"\"\n        error = \"This method is not required for eager execution.\"\n        raise AttributeError(error)\n\n\nclass FastGradientMethod(Attack, attacks.FastGradientMethod):\n    \"\"\"\n    Inherited class from Attack and cleverhans.attacks.FastGradientMethod.\n\n    This attack was originally implemented by Goodfellow et al. (2015) with the\n    infinity norm (and is known as the \"Fast Gradient Sign Method\"). This\n    implementation extends the attack to other norms, and is therefore called\n    the Fast Gradient Method.\n    Paper link: https://arxiv.org/abs/1412.6572\n    \"\"\"\n\n    def __init__(self, model, dtypestr=\"float32\", **kwargs):\n        \"\"\"\n        Creates a FastGradientMethod instance in eager execution.\n        :model: cleverhans.model.Model\n        :dtypestr: datatype in the string format.\n        \"\"\"\n        del kwargs\n        if not isinstance(model, Model):\n            wrapper_warning()\n            model = CallableModelWrapper(model, \"probs\")\n\n        super(FastGradientMethod, self).__init__(model, dtypestr)\n\n    def generate(self, x, **kwargs):\n        \"\"\"\n        Generates the adversarial sample for the given input.\n        :param x: The model's inputs.\n        :param eps: (optional float) attack step size (input variation)\n        :param ord: (optional) Order of the norm (mimics NumPy).\n                    Possible values: np.inf, 1 or 2.\n        :param y: (optional) A tf variable` with the model labels. Only provide\n                  this parameter if you'd like to use true labels when crafting\n                  adversarial samples. Otherwise, model predictions are used as\n                  labels to avoid the \"label leaking\" effect (explained in this\n                  paper: https://arxiv.org/abs/1611.01236). Default is None.\n                  Labels should be one-hot-encoded.\n        :param y_target: (optional) A tf variable` with the labels to target.\n                            Leave y_target=None if y is also set.\n                            Labels should be one-hot-encoded.\n        :param clip_min: (optional float) Minimum input component value\n        :param clip_max: (optional float) Maximum input component value\n        \"\"\"\n        # Parse and save attack-specific parameters\n        assert self.parse_params(**kwargs)\n        labels, _nb_classes = self.get_or_guess_labels(x, kwargs)\n        return self.fgm(x, labels=labels, targeted=(self.y_target is not None))\n\n    def fgm(self, x, labels, targeted=False):\n        \"\"\"\n        TensorFlow Eager implementation of the Fast Gradient Method.\n        :param x: the input variable\n        :param targeted: Is the attack targeted or untargeted? Untargeted, the\n                         default, will try to make the label incorrect.\n                         Targeted will instead try to move in the direction\n                         of being more like y.\n        :return: a tensor for the adversarial example\n        \"\"\"\n        # Compute loss\n        with tf.GradientTape() as tape:\n            # input should be watched because it may be\n            # combination of trainable and non-trainable variables\n            tape.watch(x)\n            loss_obj = LossCrossEntropy(self.model, smoothing=0.0)\n            loss = loss_obj.fprop(x=x, y=labels)\n            if targeted:\n                loss = -loss\n\n        # Define gradient of loss wrt input\n        grad = tape.gradient(loss, x)\n        optimal_perturbation = attacks.optimize_linear(grad, self.eps, self.ord)\n\n        # Add perturbation to original example to obtain adversarial example\n        adv_x = x + optimal_perturbation\n\n        # If clipping is needed\n        # reset all values outside of [clip_min, clip_max]\n        if (self.clip_min is not None) and (self.clip_max is not None):\n            adv_x = tf.clip_by_value(adv_x, self.clip_min, self.clip_max)\n        return adv_x\n\n\nclass BasicIterativeMethod(Attack, attacks.BasicIterativeMethod):\n    \"\"\"\n    Inherited class from Attack and cleverhans.attacks.BasicIterativeMethod.\n\n    The Basic Iterative Method (Kurakin et al. 2016). The original paper used\n    hard labels for this attack; no label smoothing.\n    Paper link: https://arxiv.org/pdf/1607.02533.pdf\n    \"\"\"\n\n    FGM_CLASS = FastGradientMethod\n\n    def __init__(self, model, dtypestr=\"float32\"):\n        \"\"\"\n        Creates a BasicIterativeMethod instance in eager execution.\n        :param model: cleverhans.model.Model\n        :param dtypestr: datatype in the string format.\n        \"\"\"\n        if not isinstance(model, Model):\n            wrapper_warning()\n            model = CallableModelWrapper(model, \"probs\")\n\n        super(BasicIterativeMethod, self).__init__(model, dtypestr)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/augmentation.py",
    "content": "\"\"\"\nDataset augmentation functionality\n\nNOTE: This module is much more free to change than many other modules\nin CleverHans. CleverHans is very conservative about changes to any\ncode that affects the output of benchmark tests (attacks, evaluation\nmethods, etc.). This module provides *dataset augmentation* code for\nbuilding models to be benchmarked, not *benchmarks,* and\nthus is free to change rapidly to provide better speed, accuracy,\netc.\n\"\"\"\n\nimport tensorflow as tf\n\n# Convenient renaming of existing function\nrandom_horizontal_flip = tf.image.random_flip_left_right\n\n\ndef random_shift(x, pad=(4, 4), mode=\"REFLECT\"):\n    \"\"\"Pad a single image and then crop to the original size with a random\n    offset.\"\"\"\n    assert mode in \"REFLECT SYMMETRIC CONSTANT\".split()\n    assert x.get_shape().ndims == 3\n    xp = tf.pad(x, [[pad[0], pad[0]], [pad[1], pad[1]], [0, 0]], mode)\n    return tf.random_crop(xp, tf.shape(x))\n\n\ndef batch_augment(x, func, device=\"/CPU:0\"):\n    \"\"\"\n    Apply dataset augmentation to a batch of exmaples.\n    :param x: Tensor representing a batch of examples.\n    :param func: Callable implementing dataset augmentation, operating on\n      a single image.\n    :param device: String specifying which device to use.\n    \"\"\"\n    with tf.device(device):\n        return tf.map_fn(func, x)\n\n\ndef random_crop_and_flip(x, pad_rows=4, pad_cols=4):\n    \"\"\"Augment a batch by randomly cropping and horizontally flipping it.\"\"\"\n    rows = tf.shape(x)[1]\n    cols = tf.shape(x)[2]\n    channels = x.get_shape()[3]\n\n    def _rand_crop_img(img):\n        \"\"\"Randomly crop an individual image\"\"\"\n        return tf.random_crop(img, [rows, cols, channels])\n\n    # Some of these ops are only on CPU.\n    # This function will often be called with the device set to GPU.\n    # We need to set it to CPU temporarily to avoid an exception.\n    with tf.device(\"/CPU:0\"):\n        x = tf.image.resize_image_with_crop_or_pad(x, rows + pad_rows, cols + pad_cols)\n        x = tf.map_fn(_rand_crop_img, x)\n        x = tf.image.random_flip_left_right(x)\n    return x\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/canary.py",
    "content": "\"\"\"\nCanary code that dies if the underlying hardware / drivers aren't working right.\n\"\"\"\nimport time\n\nimport numpy as np\nimport tensorflow as tf\nfrom cleverhans.utils_tf import infer_devices\n\nlast_run = None\n\n\ndef run_canary():\n    \"\"\"\n    Runs some code that will crash if the GPUs / GPU driver are suffering from\n    a common bug. This helps to prevent contaminating results in the rest of\n    the library with incorrect calculations.\n    \"\"\"\n\n    # Note: please do not edit this function unless you have access to a machine\n    # with GPUs suffering from the bug and can verify that the canary still\n    # crashes after your edits. Due to the transient nature of the GPU bug it is\n    # not possible to unit test the canary in our continuous integration system.\n\n    global last_run\n    current = time.time()\n    if last_run is None or current - last_run > 3600:\n        last_run = current\n    else:\n        # Run the canary at most once per hour\n        return\n\n    # Try very hard not to let the canary affect the graph for the rest of the\n    # python process\n    canary_graph = tf.Graph()\n    with canary_graph.as_default():\n        devices = infer_devices()\n        num_devices = len(devices)\n        if num_devices < 3:\n            # We have never observed GPU failure when less than 3 GPUs were used\n            return\n\n        v = np.random.RandomState([2018, 10, 16]).randn(2, 2)\n        # Try very hard not to let this Variable end up in any collections used\n        # by the rest of the python process\n        w = tf.Variable(v, trainable=False, collections=[])\n        loss = tf.reduce_sum(tf.square(w))\n\n        grads = []\n        for device in devices:\n            with tf.device(device):\n                (grad,) = tf.gradients(loss, w)\n                grads.append(grad)\n\n        sess = tf.Session()\n        sess.run(tf.variables_initializer([w]))\n        grads = sess.run(grads)\n        first = grads[0]\n        for grad in grads[1:]:\n            if not np.allclose(first, grad):\n                first_string = str(first)\n                grad_string = str(grad)\n                raise RuntimeError(\n                    \"Something is wrong with your GPUs or GPU driver.\"\n                    \"%(num_devices)d different GPUS were asked to \"\n                    \"calculate the same 2x2 gradient. One returned \"\n                    \"%(first_string)s and another returned \"\n                    \"%(grad_string)s. This can usually be fixed by \"\n                    \"rebooting the machine.\"\n                    % {\n                        \"num_devices\": num_devices,\n                        \"first_string\": first_string,\n                        \"grad_string\": grad_string,\n                    }\n                )\n        sess.close()\n\n\nif __name__ == \"__main__\":\n    run_canary()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/compat.py",
    "content": "\"\"\"\nWrapper functions for writing code that is compatible with many versions\nof TensorFlow.\n\"\"\"\nimport warnings\nimport tensorflow as tf\n\n# The following 2 imports are not used in this module. They are imported so that users of cleverhans.compat can\n# get access to device_lib, app, and flags. A pylint bug makes these imports cause errors when using python3+tf1.8.\n# Doing the sanitized import here once makes it possible to do \"from cleverhans.compat import flags\" throughout the\n# library without needing to repeat the pylint boilerplate.\nfrom tensorflow.python.client import (\n    device_lib,\n)  # pylint: disable=no-name-in-module,unused-import\nfrom tensorflow.python.platform import (\n    app,\n    flags,\n)  # pylint: disable=no-name-in-module,unused-import\n\n\ndef _wrap(f):\n    \"\"\"\n    Wraps a callable `f` in a function that warns that the function is deprecated.\n    \"\"\"\n\n    def wrapper(*args, **kwargs):\n        \"\"\"\n        Issues a deprecation warning and passes through the arguments.\n        \"\"\"\n        warnings.warn(\n            str(f)\n            + \" is deprecated. Switch to calling the equivalent function in tensorflow. \"\n            \" This function was originally needed as a compatibility layer for old versions of tensorflow, \"\n            \" but support for those versions has now been dropped.\"\n        )\n        return f(*args, **kwargs)\n\n    return wrapper\n\n\nreduce_sum = _wrap(tf.reduce_sum)\nreduce_max = _wrap(tf.reduce_max)\nreduce_min = _wrap(tf.reduce_min)\nreduce_mean = _wrap(tf.reduce_mean)\nreduce_prod = _wrap(tf.reduce_prod)\nreduce_any = _wrap(tf.reduce_any)\n\n\ndef reduce_function(\n    op_func, input_tensor, axis=None, keepdims=None, name=None, reduction_indices=None\n):\n    \"\"\"\n    This function used to be needed to support tf 1.4 and early, but support for tf 1.4 and earlier is now dropped.\n    :param op_func: expects the function to handle eg: tf.reduce_sum.\n    :param input_tensor: The tensor to reduce. Should have numeric type.\n    :param axis: The dimensions to reduce. If None (the default),\n            reduces all dimensions. Must be in the range\n            [-rank(input_tensor), rank(input_tensor)).\n    :param keepdims: If true, retains reduced dimensions with length 1.\n    :param name: A name for the operation (optional).\n    :param reduction_indices: The old (deprecated) name for axis.\n    :return: outputs same value as op_func.\n    \"\"\"\n\n    warnings.warn(\n        \"`reduce_function` is deprecated and may be removed on or after 2019-09-08.\"\n    )\n\n    out = op_func(\n        input_tensor,\n        axis=axis,\n        keepdims=keepdims,\n        name=name,\n        reduction_indices=reduction_indices,\n    )\n\n    return out\n\n\ndef softmax_cross_entropy_with_logits(sentinel=None, labels=None, logits=None, dim=-1):\n    \"\"\"\n    Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle\n    deprecated warning\n    \"\"\"\n    # Make sure that all arguments were passed as named arguments.\n    if sentinel is not None:\n        name = \"softmax_cross_entropy_with_logits\"\n        raise ValueError(\n            \"Only call `%s` with \"\n            \"named arguments (labels=..., logits=..., ...)\" % name\n        )\n    if labels is None or logits is None:\n        raise ValueError(\"Both labels and logits must be provided.\")\n\n    try:\n        f = tf.nn.softmax_cross_entropy_with_logits_v2\n    except AttributeError:\n        raise RuntimeError(\n            \"This version of TensorFlow is no longer supported. See cleverhans/README.md\"\n        )\n\n    labels = tf.stop_gradient(labels)\n    loss = f(labels=labels, logits=logits, dim=dim)\n\n    return loss\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/confidence_report.py",
    "content": "\"\"\"Functionality for making confidence reports.\n\nA confidence report is a dictionary.\nEach dictionary key is the name of a type of data:\n  clean : Clean data\n  bundled : bundled adversarial examples\nEach value in the dictionary contains an array of bools indicating whether\nthe model got each example correct and an array containing the confidence\nthat the model assigned to each prediction.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nfrom collections import OrderedDict\nimport logging\nimport time\nimport warnings\n\nimport numpy as np\nimport six\nimport tensorflow as tf\n\nfrom cleverhans.attacks import MaxConfidence\nfrom cleverhans.attacks import Semantic\nfrom cleverhans.evaluation import correctness_and_confidence\nfrom cleverhans.evaluation import run_attack\nfrom cleverhans.utils import set_log_level\nfrom cleverhans.serial import load, save\nfrom cleverhans.utils_tf import infer_devices\n\n# Defaults. Imported elsewhere so that command line script defaults match\n# function defaults.\nTRAIN_START = 0\nTRAIN_END = 60000\nTEST_START = 0\nTEST_END = 10000\nWHICH_SET = \"test\"\nRECIPE = \"basic_max_confidence_recipe\"\nREPORT_PATH = None\n# Used for `make_confidence_report` but not `make_confidence_report_bundled`\ndevices = infer_devices()\nnum_devices = len(devices)\nBATCH_SIZE = 128 * num_devices\nMC_BATCH_SIZE = 16 * num_devices\nNB_ITER = 40\nBASE_EPS_ITER = None  # Differs by dataset\nSAVE_ADVX = 1\n\n\nclass ConfidenceReport(OrderedDict):\n    \"\"\"\n    A data structure reporting how much confidence a model assigned to its\n    predictions on each example and whether those predictions were correct.\n    This class is just a dictionary with some type checks.\n    It maps string data type names (like \"clean\" for clean data or \"Semantic\"\n    for semantic adversarial examples) to ConfidenceReportEntry instances.\n\n    :param iterable: optional iterable containing (key, value) tuples\n    \"\"\"\n\n    def __init__(self, iterable=None):\n        super(ConfidenceReport, self).__init__()\n        # This field tracks whether the report is completed.\n        # It's important e.g. for reports that are made by bundlers and repeatedly\n        # written to disk during the process. This field makes it possible to tell\n        # whether a report on disk is complete or whether the bundling process\n        # got killed (e.g. due to VM migration)\n        self.completed = False\n        if iterable is not None:\n            # pickle sometimes wants to use this interface to unpickle the OrderedDict\n            for key, value in iterable:\n                self[key] = value\n\n    def __setitem__(self, key, value):\n        assert isinstance(key, six.string_types)\n        if not isinstance(value, ConfidenceReportEntry):\n            raise TypeError(\n                \"`value` must be a ConfidenceReportEntry, but got \"\n                + str(value)\n                + \" of type \"\n                + str(type(value))\n            )\n        super(ConfidenceReport, self).__setitem__(key, value)\n\n\nclass ConfidenceReportEntry(object):\n    \"\"\"\n    A data structure reporting how much confidence a model assigned to its\n    predictions on each example and whether those predictions were correct.\n\n    :param correctness: ndarray, one bool per example indicating whether it was\n      correct\n    :param confidence: ndarray, one floating point value per example reporting\n      the probability assigned to the prediction for that example\n    \"\"\"\n\n    def __init__(self, correctness, confidence):\n        assert isinstance(correctness, np.ndarray)\n        assert isinstance(correctness, np.ndarray)\n        assert correctness.ndim == 1\n        assert confidence.ndim == 1\n        assert correctness.dtype == np.bool, correctness.dtype\n        assert np.issubdtype(confidence.dtype, np.floating)\n        assert correctness.shape == confidence.shape\n        assert confidence.min() >= 0.0\n        assert confidence.max() <= 1.0\n        self.correctness = correctness\n        self.confidence = confidence\n\n    def __getitem__(self, key):\n        warnings.warn(\n            \"Dictionary confidence report entries are deprecated. \"\n            \"Switch to accessing the appropriate field of \"\n            \"ConfidenceReportEntry. \"\n            \"Dictionary-style access will be removed on or after \"\n            \"2019-04-24.\"\n        )\n        assert key in [\"correctness\", \"confidence\"]\n        return self.__dict__[key]\n\n    def __setitem__(self, key, value):\n        warnings.warn(\n            \"Dictionary confidence report entries are deprecated.\"\n            \"Switch to accessing the appropriate field of \"\n            \"ConfidenceReportEntry. \"\n            \"Dictionary-style access will be removed on or after \"\n            \"2019-04-24.\"\n        )\n        assert key in [\"correctness\", \"confidence\"]\n        self.__dict__[key] = value\n\n\ndef make_confidence_report_bundled(\n    filepath,\n    train_start=TRAIN_START,\n    train_end=TRAIN_END,\n    test_start=TEST_START,\n    test_end=TEST_END,\n    which_set=WHICH_SET,\n    recipe=RECIPE,\n    report_path=REPORT_PATH,\n    nb_iter=NB_ITER,\n    base_eps=None,\n    base_eps_iter=None,\n    base_eps_iter_small=None,\n    batch_size=BATCH_SIZE,\n):\n    \"\"\"\n    Load a saved model, gather its predictions, and save a confidence report.\n    :param filepath: path to model to evaluate\n    :param train_start: index of first training set example to use\n    :param train_end: index of last training set example to use\n    :param test_start: index of first test set example to use\n    :param test_end: index of last test set example to use\n    :param which_set: 'train' or 'test'\n    :param nb_iter: int, number of iterations of attack algorithm\n      (note that different recipes will use this differently,\n       for example many will run two attacks, one with nb_iter\n       iterations and one with 25X more)\n    :param base_eps: float, epsilon parameter for threat model, on a scale of [0, 1].\n      Inferred from the dataset if not specified.\n    :param base_eps_iter: float, a step size used in different ways by different recipes.\n      Typically the step size for a PGD attack.\n      Inferred from the dataset if not specified.\n    :param base_eps_iter_small: float, a second step size for a more fine-grained attack.\n      Inferred from the dataset if not specified.\n    :param batch_size: int, batch size\n    \"\"\"\n    # Avoid circular import\n    from cleverhans import attack_bundling\n\n    if callable(recipe):\n        run_recipe = recipe\n    else:\n        run_recipe = getattr(attack_bundling, recipe)\n\n    # Set logging level to see debug information\n    set_log_level(logging.INFO)\n\n    # Create TF session\n    sess = tf.Session()\n\n    assert filepath.endswith(\".joblib\")\n    if report_path is None:\n        report_path = filepath[: -len(\".joblib\")] + \"_bundled_report.joblib\"\n\n    with sess.as_default():\n        model = load(filepath)\n    assert len(model.get_params()) > 0\n    factory = model.dataset_factory\n    factory.kwargs[\"train_start\"] = train_start\n    factory.kwargs[\"train_end\"] = train_end\n    factory.kwargs[\"test_start\"] = test_start\n    factory.kwargs[\"test_end\"] = test_end\n    dataset = factory()\n\n    center = dataset.kwargs[\"center\"]\n    if \"max_val\" in factory.kwargs:\n        max_value = factory.kwargs[\"max_val\"]\n    elif hasattr(dataset, \"max_val\"):\n        max_value = dataset.max_val\n    else:\n        raise AttributeError(\"Can't find max_value specification\")\n    min_value = 0.0 - center * max_value\n    value_range = max_value - min_value\n\n    if \"CIFAR\" in str(factory.cls):\n        if base_eps is None:\n            base_eps = 8.0 / 255.0\n        if base_eps_iter is None:\n            base_eps_iter = 2.0 / 255.0\n        if base_eps_iter_small is None:\n            base_eps_iter_small = 1.0 / 255.0\n    elif \"MNIST\" in str(factory.cls):\n        if base_eps is None:\n            base_eps = 0.3\n        if base_eps_iter is None:\n            base_eps_iter = 0.1\n        base_eps_iter_small = None\n    else:\n        # Note that it is not required to specify base_eps_iter_small\n        if base_eps is None or base_eps_iter is None:\n            raise NotImplementedError(\n                \"Not able to infer threat model from \" + str(factory.cls)\n            )\n\n    eps = base_eps * value_range\n    eps_iter = base_eps_iter * value_range\n    if base_eps_iter_small is None:\n        eps_iter_small = None\n    else:\n        eps_iter_small = base_eps_iter_small * value_range\n    clip_min = min_value\n    clip_max = max_value\n\n    x_data, y_data = dataset.get_set(which_set)\n    assert x_data.max() <= max_value\n    assert x_data.min() >= min_value\n\n    assert eps_iter <= eps\n    assert eps_iter_small is None or eps_iter_small <= eps\n\n    # Different recipes take different arguments.\n    # For now I don't have an idea for a beautiful unifying framework, so\n    # we get an if statement.\n    if recipe == \"random_search_max_confidence_recipe\":\n        # pylint always checks against the default recipe here\n        # pylint: disable=no-value-for-parameter\n        run_recipe(\n            sess=sess,\n            model=model,\n            x=x_data,\n            y=y_data,\n            eps=eps,\n            clip_min=clip_min,\n            clip_max=clip_max,\n            report_path=report_path,\n        )\n    else:\n        run_recipe(\n            sess=sess,\n            model=model,\n            x=x_data,\n            y=y_data,\n            nb_classes=dataset.NB_CLASSES,\n            eps=eps,\n            clip_min=clip_min,\n            clip_max=clip_max,\n            eps_iter=eps_iter,\n            nb_iter=nb_iter,\n            report_path=report_path,\n            eps_iter_small=eps_iter_small,\n            batch_size=batch_size,\n        )\n\n\ndef print_stats(correctness, confidence, name):\n    \"\"\"\n    Prints out accuracy, coverage, etc. statistics\n    :param correctness: ndarray\n      One bool per example specifying whether it was correctly classified\n    :param confidence: ndarray\n      The probability associated with each prediction\n    :param name: str\n      The name of this type of data (e.g. \"clean\", \"MaxConfidence\")\n    \"\"\"\n    accuracy = correctness.mean()\n    wrongness = 1 - correctness\n    denom1 = np.maximum(1, wrongness.sum())\n    ave_prob_on_mistake = (wrongness * confidence).sum() / denom1\n    assert ave_prob_on_mistake <= 1.0, ave_prob_on_mistake\n    denom2 = np.maximum(1, correctness.sum())\n    ave_prob_on_correct = (correctness * confidence).sum() / denom2\n    covered = confidence > 0.5\n    cov_half = covered.mean()\n    acc_half = (correctness * covered).sum() / np.maximum(1, covered.sum())\n    print(\"Accuracy on %s examples: %0.4f\" % (name, accuracy))\n    print(\"Average prob on mistakes: %0.4f\" % ave_prob_on_mistake)\n    print(\"Average prob on correct: %0.4f\" % ave_prob_on_correct)\n    print(\"Accuracy when prob thresholded at .5: %0.4f\" % acc_half)\n    print(\"Coverage when prob thresholded at .5: %0.4f\" % cov_half)\n\n    success_rate = acc_half * cov_half\n    # Success is correctly classifying a covered example\n    print(\"Success rate at .5: %0.4f\" % success_rate)\n    # Failure is misclassifying a covered example\n    failure_rate = (1.0 - acc_half) * cov_half\n    print(\"Failure rate at .5: %0.4f\" % failure_rate)\n    print()\n\n\ndef make_confidence_report(\n    filepath,\n    train_start=TRAIN_START,\n    train_end=TRAIN_END,\n    test_start=TEST_START,\n    test_end=TEST_END,\n    batch_size=BATCH_SIZE,\n    which_set=WHICH_SET,\n    mc_batch_size=MC_BATCH_SIZE,\n    report_path=REPORT_PATH,\n    base_eps_iter=BASE_EPS_ITER,\n    nb_iter=NB_ITER,\n    save_advx=SAVE_ADVX,\n):\n    \"\"\"\n    Load a saved model, gather its predictions, and save a confidence report.\n\n\n    This function works by running a single MaxConfidence attack on each example.\n    This provides a reasonable estimate of the true failure rate quickly, so\n    long as the model does not suffer from gradient masking.\n    However, this estimate is mostly intended for development work and not\n    for publication. A more accurate estimate may be obtained by running\n    make_confidence_report_bundled.py instead.\n\n    :param filepath: path to model to evaluate\n    :param train_start: index of first training set example to use\n    :param train_end: index of last training set example to use\n    :param test_start: index of first test set example to use\n    :param test_end: index of last test set example to use\n    :param batch_size: size of evaluation batches\n    :param which_set: 'train' or 'test'\n    :param mc_batch_size: batch size for MaxConfidence attack\n    :param base_eps_iter: step size if the data were in [0,1]\n      (Step size will be rescaled proportional to the actual data range)\n    :param nb_iter: Number of iterations of PGD to run per class\n    :param save_advx: bool. If True, saves the adversarial examples to disk.\n      On by default, but can be turned off to save memory, etc.\n    \"\"\"\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Set logging level to see debug information\n    set_log_level(logging.INFO)\n\n    # Create TF session\n    sess = tf.Session()\n\n    if report_path is None:\n        assert filepath.endswith(\".joblib\")\n        report_path = filepath[: -len(\".joblib\")] + \"_report.joblib\"\n\n    with sess.as_default():\n        model = load(filepath)\n    assert len(model.get_params()) > 0\n    factory = model.dataset_factory\n    factory.kwargs[\"train_start\"] = train_start\n    factory.kwargs[\"train_end\"] = train_end\n    factory.kwargs[\"test_start\"] = test_start\n    factory.kwargs[\"test_end\"] = test_end\n    dataset = factory()\n\n    center = dataset.kwargs[\"center\"]\n    max_val = dataset.kwargs[\"max_val\"]\n    value_range = max_val * (1.0 + center)\n    min_value = 0.0 - center * max_val\n\n    if \"CIFAR\" in str(factory.cls):\n        base_eps = 8.0 / 255.0\n        if base_eps_iter is None:\n            base_eps_iter = 2.0 / 255.0\n    elif \"MNIST\" in str(factory.cls):\n        base_eps = 0.3\n        if base_eps_iter is None:\n            base_eps_iter = 0.1\n    else:\n        raise NotImplementedError(str(factory.cls))\n\n    mc_params = {\n        \"eps\": base_eps * value_range,\n        \"eps_iter\": base_eps_iter * value_range,\n        \"nb_iter\": nb_iter,\n        \"clip_min\": min_value,\n        \"clip_max\": max_val,\n    }\n\n    x_data, y_data = dataset.get_set(which_set)\n\n    report = ConfidenceReport()\n\n    semantic = Semantic(model, center, max_val, sess)\n    mc = MaxConfidence(model, sess=sess)\n\n    jobs = [\n        (\"clean\", None, None, None, False),\n        (\"Semantic\", semantic, None, None, False),\n        (\"mc\", mc, mc_params, mc_batch_size, True),\n    ]\n\n    for job in jobs:\n        name, attack, attack_params, job_batch_size, save_this_job = job\n        if job_batch_size is None:\n            job_batch_size = batch_size\n        t1 = time.time()\n        if save_advx and save_this_job:\n            # If we want to save the adversarial examples to the filesystem, we need\n            # to fetch all of them. Otherwise they're just computed one batch at a\n            # time and discarded\n\n            # The path to save to\n            assert report_path.endswith(\".joblib\")\n            advx_path = report_path[: -len(\".joblib\")] + \"_advx_\" + name + \".npy\"\n\n            # Fetch the adversarial examples\n            x_data = run_attack(\n                sess,\n                model,\n                x_data,\n                y_data,\n                attack,\n                attack_params,\n                batch_size=job_batch_size,\n                devices=devices,\n            )\n\n            # Turn off the attack so `correctness_and_confidence` won't run it a\n            # second time.\n            attack = None\n            attack_params = None\n\n            # Save the adversarial examples\n            np.save(advx_path, x_data)\n\n        # Run correctness and confidence evaluation on adversarial examples\n        packed = correctness_and_confidence(\n            sess,\n            model,\n            x_data,\n            y_data,\n            batch_size=job_batch_size,\n            devices=devices,\n            attack=attack,\n            attack_params=attack_params,\n        )\n        t2 = time.time()\n        print(\"Evaluation took\", t2 - t1, \"seconds\")\n        correctness, confidence = packed\n\n        report[name] = ConfidenceReportEntry(\n            correctness=correctness, confidence=confidence\n        )\n\n        print_stats(correctness, confidence, name)\n\n    save(report_path, report)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/dataset.py",
    "content": "\"\"\"Dataset class for CleverHans\n\n\"\"\"\n# pylint: disable=missing-docstring\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport array\nimport functools\nimport gzip\nimport operator\nimport os\nimport struct\nimport tempfile\nimport sys\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\ntry:\n    from tensorflow.python.keras.utils import np_utils\n    from tensorflow.keras.datasets import cifar10\nexcept ImportError:\n    # In tf 1.8, np_utils doesn't seem to be publicly exposed.\n    # In later tf versions, it is, and in pre-tf keras it was too.\n    from tensorflow.python.keras import _impl\n\n    np_utils = _impl.keras.utils.np_utils\n    # In tf 1.8, \"from tensorflow.keras.datasets import cifar10\" doesn't work even though the module exists\n    cifar10 = tf.keras.datasets.cifar10\n    warnings.warn(\n        \"Support for TensorFlow versions prior to 1.12 is deprecated.\"\n        \" CleverHans using earlier versions may quit working on or after 2019-07-07.\"\n    )\nfrom cleverhans import utils\n\n\nclass Dataset(object):\n    \"\"\"Abstract base class representing a dataset.\"\"\"\n\n    # The number of classes in the dataset. Should be specified by subclasses.\n    NB_CLASSES = None\n\n    def __init__(self, kwargs=None):\n        if kwargs is None:\n            kwargs = {}\n        if \"self\" in kwargs:\n            del kwargs[\"self\"]\n        self.kwargs = kwargs\n\n    def get_factory(self):\n        \"\"\"Returns a picklable callable that recreates the dataset.\"\"\"\n\n        return Factory(type(self), self.kwargs)\n\n    def get_set(self, which_set):\n        \"\"\"Returns the training set or test set as an (x_data, y_data) tuple.\n        :param which_set: 'train' or 'test'\n        \"\"\"\n        return (getattr(self, \"x_\" + which_set), getattr(self, \"y_\" + which_set))\n\n    def to_tensorflow(self):\n        raise NotImplementedError()\n\n    @classmethod\n    def in_memory_dataset(cls, x, y, shuffle=None, repeat=True):\n        assert x.shape[0] == y.shape[0]\n        d = tf.data.Dataset.range(x.shape[0])\n        if repeat:\n            d = d.repeat()\n        if shuffle:\n            d = d.shuffle(shuffle)\n\n        def lookup(p):\n            return x[p], y[p]\n\n        d = d.map(lambda i: tf.py_func(lookup, [i], [tf.float32] * 2))\n        return d\n\n\nclass MNIST(Dataset):\n    \"\"\"The MNIST dataset\"\"\"\n\n    NB_CLASSES = 10\n\n    def __init__(\n        self,\n        train_start=0,\n        train_end=60000,\n        test_start=0,\n        test_end=10000,\n        center=False,\n        max_val=1.0,\n    ):\n        kwargs = locals()\n        if \"__class__\" in kwargs:\n            del kwargs[\"__class__\"]\n        super(MNIST, self).__init__(kwargs)\n        x_train, y_train, x_test, y_test = data_mnist(\n            train_start=train_start,\n            train_end=train_end,\n            test_start=test_start,\n            test_end=test_end,\n        )\n\n        if center:\n            x_train = x_train * 2.0 - 1.0\n            x_test = x_test * 2.0 - 1.0\n        x_train *= max_val\n        x_test *= max_val\n\n        self.x_train = x_train.astype(\"float32\")\n        self.y_train = y_train.astype(\"float32\")\n        self.x_test = x_test.astype(\"float32\")\n        self.y_test = y_test.astype(\"float32\")\n\n    def to_tensorflow(self, shuffle=4096):\n        return (\n            self.in_memory_dataset(self.x_train, self.y_train, shuffle),\n            self.in_memory_dataset(self.x_test, self.y_test, repeat=False),\n        )\n\n\nclass CIFAR10(Dataset):\n    \"\"\"The CIFAR-10 dataset\"\"\"\n\n    NB_CLASSES = 10\n\n    LABEL_NAMES = [\n        \"airplane\",\n        \"automobile\",\n        \"bird\",\n        \"cat\",\n        \"deer\",\n        \"dog\",\n        \"frog\",\n        \"horse\",\n        \"ship\",\n        \"truck\",\n    ]\n\n    def __init__(\n        self,\n        train_start=0,\n        train_end=60000,\n        test_start=0,\n        test_end=10000,\n        center=False,\n        max_val=1.0,\n    ):\n        kwargs = locals()\n        if \"__class__\" in kwargs:\n            del kwargs[\"__class__\"]\n        super(CIFAR10, self).__init__(kwargs)\n        packed = data_cifar10(\n            train_start=train_start,\n            train_end=train_end,\n            test_start=test_start,\n            test_end=test_end,\n        )\n        x_train, y_train, x_test, y_test = packed\n\n        if center:\n            x_train = x_train * 2.0 - 1.0\n            x_test = x_test * 2.0 - 1.0\n        x_train *= max_val\n        x_test *= max_val\n\n        self.x_train = x_train\n        self.y_train = y_train\n        self.x_test = x_test\n        self.y_test = y_test\n        self.max_val = max_val\n\n    def to_tensorflow(self, shuffle=4096):\n        # This is much more efficient with data augmentation, see tutorials.\n        return (\n            self.in_memory_dataset(self.x_train, self.y_train, shuffle),\n            self.in_memory_dataset(self.x_test, self.y_test, repeat=False),\n        )\n\n\nclass Factory(object):\n    \"\"\"\n    A callable that creates an object of the specified type and configuration.\n    \"\"\"\n\n    def __init__(self, cls, kwargs):\n        self.cls = cls\n        self.kwargs = kwargs\n\n    def __call__(self):\n        \"\"\"Returns the created object.\"\"\"\n        return self.cls(**self.kwargs)\n\n\ndef maybe_download_file(url, datadir=None, force=False):\n    try:\n        from urllib.request import urlretrieve\n    except ImportError:\n        from urllib import urlretrieve\n\n    if not datadir:\n        datadir = tempfile.gettempdir()\n    file_name = url[url.rfind(\"/\") + 1 :]\n    dest_file = os.path.join(datadir, file_name)\n\n    isfile = os.path.isfile(dest_file)\n\n    if force or not isfile:\n        urlretrieve(url, dest_file)\n    return dest_file\n\n\ndef download_and_parse_mnist_file(file_name, datadir=None, force=False):\n    url = os.path.join('https://storage.googleapis.com/cvdf-datasets/mnist/', file_name)\n    file_name = maybe_download_file(url, datadir=datadir, force=force)\n\n    # Open the file and unzip it if necessary\n    if os.path.splitext(file_name)[1] == \".gz\":\n        open_fn = gzip.open\n    else:\n        open_fn = open\n\n    # Parse the file\n    with open_fn(file_name, \"rb\") as file_descriptor:\n        header = file_descriptor.read(4)\n        assert len(header) == 4\n\n        zeros, data_type, n_dims = struct.unpack(\">HBB\", header)\n        assert zeros == 0\n\n        hex_to_data_type = {\n            0x08: \"B\",\n            0x09: \"b\",\n            0x0B: \"h\",\n            0x0C: \"i\",\n            0x0D: \"f\",\n            0x0E: \"d\",\n        }\n        data_type = hex_to_data_type[data_type]\n\n        # data_type unicode to ascii conversion (Python2 fix)\n        if sys.version_info[0] < 3:\n            data_type = data_type.encode(\"ascii\", \"ignore\")\n\n        dim_sizes = struct.unpack(\">\" + \"I\" * n_dims, file_descriptor.read(4 * n_dims))\n\n        data = array.array(data_type, file_descriptor.read())\n        data.byteswap()\n\n        desired_items = functools.reduce(operator.mul, dim_sizes)\n        assert len(data) == desired_items\n        return np.array(data).reshape(dim_sizes)\n\n\ndef data_mnist(\n    datadir=tempfile.gettempdir(),\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n):\n    \"\"\"\n    Load and preprocess MNIST dataset\n    :param datadir: path to folder where data should be stored\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :return: tuple of four arrays containing training data, training labels,\n             testing data and testing labels.\n    \"\"\"\n    assert isinstance(train_start, int)\n    assert isinstance(train_end, int)\n    assert isinstance(test_start, int)\n    assert isinstance(test_end, int)\n\n    X_train = (\n        download_and_parse_mnist_file(\"train-images-idx3-ubyte.gz\", datadir=datadir)\n        / 255.0\n    )\n    Y_train = download_and_parse_mnist_file(\n        \"train-labels-idx1-ubyte.gz\", datadir=datadir\n    )\n    X_test = (\n        download_and_parse_mnist_file(\"t10k-images-idx3-ubyte.gz\", datadir=datadir)\n        / 255.0\n    )\n    Y_test = download_and_parse_mnist_file(\"t10k-labels-idx1-ubyte.gz\", datadir=datadir)\n\n    X_train = np.expand_dims(X_train, -1)\n    X_test = np.expand_dims(X_test, -1)\n\n    X_train = X_train[train_start:train_end]\n    Y_train = Y_train[train_start:train_end]\n    X_test = X_test[test_start:test_end]\n    Y_test = Y_test[test_start:test_end]\n\n    Y_train = utils.to_categorical(Y_train, nb_classes=10)\n    Y_test = utils.to_categorical(Y_test, nb_classes=10)\n    return X_train, Y_train, X_test, Y_test\n\n\n\ndef data_cifar10(train_start=0, train_end=50000, test_start=0, test_end=10000):\n    \"\"\"\n    Preprocess CIFAR10 dataset\n    :return:\n    \"\"\"\n\n    # These values are specific to CIFAR10\n    img_rows = 32\n    img_cols = 32\n    nb_classes = 10\n\n    # the data, shuffled and split between train and test sets\n    (x_train, y_train), (x_test, y_test) = cifar10.load_data()\n\n    if tf.keras.backend.image_data_format() == \"channels_first\":\n        x_train = x_train.reshape(x_train.shape[0], 3, img_rows, img_cols)\n        x_test = x_test.reshape(x_test.shape[0], 3, img_rows, img_cols)\n    else:\n        x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 3)\n        x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 3)\n    x_train = x_train.astype(\"float32\")\n    x_test = x_test.astype(\"float32\")\n    x_train /= 255\n    x_test /= 255\n    print(\"x_train shape:\", x_train.shape)\n    print(x_train.shape[0], \"train samples\")\n    print(x_test.shape[0], \"test samples\")\n\n    # convert class vectors to binary class matrices\n    y_train = np_utils.to_categorical(y_train, nb_classes)\n    y_test = np_utils.to_categorical(y_test, nb_classes)\n\n    x_train = x_train[train_start:train_end, :, :, :]\n    y_train = y_train[train_start:train_end, :]\n    x_test = x_test[test_start:test_end, :]\n    y_test = y_test[test_start:test_end, :]\n\n    return x_train, y_train, x_test, y_test\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/devtools/LICENSE.txt",
    "content": "The devtools module is a derivative work from the devtools module of pylearn2.\nWe reproduce the corresponding license here.\n\nCopyright (c) 2011--2014, Université de Montréal\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors\n   may be used to endorse or promote products derived from this software without\n   specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/devtools/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/devtools/autopep8_all.py",
    "content": "\"\"\"\nRun this script to run autopep8 on everything in the library\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\n\nfrom cleverhans.devtools.list_files import list_files\nfrom cleverhans.utils import shell_call\n\nfor f in list_files(\".py\"):\n\n    command = [\"autopep8\", \"-i\", \"--indent-size\", \"2\", f]\n    shell_call(command)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/devtools/checks.py",
    "content": "\"\"\"Functionality for building tests.\n\nWe have to call this file \"checks\" and not anything with \"test\" as a\nsubstring or nosetests will execute it.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport time\nimport unittest\n\nimport numpy as np\n\n\nclass CleverHansTest(unittest.TestCase):\n    \"\"\"TestCase with some extra features\"\"\"\n\n    def setUp(self):\n        self.test_start = time.time()\n        # seed the randomness\n        np.random.seed(1234)\n\n    def tearDown(self):\n        print(self.id(), \"took\", time.time() - self.test_start, \"seconds\")\n\n    def assertClose(self, x, y, *args, **kwargs):\n        \"\"\"Assert that `x` and `y` have close to the same value\"\"\"\n        # self.assertTrue(np.allclose(x, y)) doesn't give a useful message\n        # on failure\n        assert np.allclose(x, y, *args, **kwargs), (x, y)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/devtools/list_files.py",
    "content": "\"\"\"Code for listing files that belong to the library.\"\"\"\nimport os\nimport cleverhans\n\n\ndef list_files(suffix=\"\"):\n    \"\"\"\n    Returns a list of all files in CleverHans with the given suffix.\n\n    Parameters\n    ----------\n    suffix : str\n\n    Returns\n    -------\n\n    file_list : list\n        A list of all files in CleverHans whose filepath ends with `suffix`.\n    \"\"\"\n\n    cleverhans_path = os.path.abspath(cleverhans.__path__[0])\n    # In some environments cleverhans_path does not point to a real directory.\n    # In such case return empty list.\n    if not os.path.isdir(cleverhans_path):\n        return []\n    repo_path = os.path.abspath(os.path.join(cleverhans_path, os.pardir))\n    file_list = _list_files(cleverhans_path, suffix)\n\n    extra_dirs = [\n        \"cleverhans_tutorials\",\n        \"examples\",\n        \"scripts\",\n        \"tests_tf\",\n        \"tests_pytorch\",\n    ]\n\n    for extra_dir in extra_dirs:\n        extra_path = os.path.join(repo_path, extra_dir)\n        if os.path.isdir(extra_path):\n            extra_files = _list_files(extra_path, suffix)\n            extra_files = [os.path.join(os.pardir, path) for path in extra_files]\n            file_list = file_list + extra_files\n\n    return file_list\n\n\ndef _list_files(path, suffix=\"\"):\n    \"\"\"\n    Returns a list of all files ending in `suffix` contained within `path`.\n\n    Parameters\n    ----------\n    path : str\n        a filepath\n    suffix : str\n\n    Returns\n    -------\n    l : list\n        A list of all files ending in `suffix` contained within `path`.\n        (If `path` is a file rather than a directory, it is considered\n        to \"contain\" itself)\n    \"\"\"\n    if os.path.isdir(path):\n        incomplete = os.listdir(path)\n        complete = [os.path.join(path, entry) for entry in incomplete]\n        lists = [_list_files(subpath, suffix) for subpath in complete]\n        flattened = []\n        for one_list in lists:\n            for elem in one_list:\n                flattened.append(elem)\n        return flattened\n    else:\n        assert os.path.exists(path), \"couldn't find file '%s'\" % path\n        if path.endswith(suffix):\n            return [path]\n        return []\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/devtools/mocks.py",
    "content": "\"\"\"Utility functions for mocking up tests.\n\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport copy\n\nimport numpy as np\n\nfrom cleverhans.dataset import Dataset, np_utils\n\n\ndef random_feed_dict(rng, placeholders):\n    \"\"\"\n    Returns random data to be used with `feed_dict`.\n    :param rng: A numpy.random.RandomState instance\n    :param placeholders: List of tensorflow placeholders\n    :return: A dict mapping placeholders to random numpy values\n    \"\"\"\n\n    output = {}\n\n    for placeholder in placeholders:\n        if placeholder.dtype != \"float32\":\n            raise NotImplementedError()\n        value = rng.randn(*placeholder.shape).astype(\"float32\")\n        output[placeholder] = value\n\n    return output\n\n\nclass SimpleDataset(Dataset):\n    \"\"\"\n    A dataset containing random values.\n    Values are uniformly distributed, either in [0, max_val] or [-1, max_val].\n    \"\"\"\n\n    def __init__(\n        self,\n        dim=2,\n        train_start=0,\n        train_end=3,\n        test_start=0,\n        test_end=5,\n        center=False,\n        max_val=1.0,\n        nb_classes=5,\n    ):\n        kwargs = copy.copy(locals())\n        del kwargs[\"self\"]\n        if \"__class__\" in kwargs:\n            del kwargs[\"__class__\"]\n        super(SimpleDataset, self).__init__(kwargs)\n        self.__dict__.update(kwargs)\n        train_x_rng = np.random.RandomState([2018, 11, 9, 1])\n        # Even if train_start is not 0, we should still generate the first training examples from the rng.\n        # This way the dataset looks like it is an array of deterministic data that we index using train_start.\n        self.x_train = train_x_rng.uniform(\n            -center * max_val, max_val, (train_end, dim)\n        )[train_start:]\n        # Use a second rng for the test set so that it also looks like an array of deterministic data that we\n        # index into, unaffected by the number of training examples.\n        test_x_rng = np.random.RandomState([2018, 11, 9, 2])\n        self.x_test = test_x_rng.uniform(-center * max_val, max_val, (test_end, dim))[\n            test_start:\n        ]\n        # Likewise, to keep the number of examples read from the rng affecting the values of the labels, we\n        # must generate the labels from a different rng\n        train_y_rng = np.random.RandomState([2018, 11, 9, 3])\n        self.y_train = train_y_rng.randint(low=0, high=nb_classes, size=(train_end, 1))[\n            train_start:\n        ]\n        test_y_rng = np.random.RandomState([2018, 11, 9, 4])\n        self.y_test = test_y_rng.randint(low=0, high=nb_classes, size=(test_end, 1))[\n            test_start:\n        ]\n        assert self.x_train.shape[0] == self.y_train.shape[0]\n        assert self.x_test.shape[0] == self.y_test.shape[0]\n        self.y_train = np_utils.to_categorical(self.y_train, nb_classes)\n        self.y_test = np_utils.to_categorical(self.y_test, nb_classes)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/devtools/tests/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/devtools/tests/test_format.py",
    "content": "\"\"\"\nUnit tests for format checking\n\"\"\"\n\nfrom __future__ import print_function\n\n\nimport os\nimport subprocess\n\nimport cleverhans\nfrom cleverhans.devtools.list_files import list_files\nfrom cleverhans.utils import shell_call\n\n# Enter a manual list of files that are allowed to violate PEP8 here\nwhitelist_pep8 = [\n    # This file is broken but could be fixed\n    \"../examples/multigpu_advtrain/test_attack_multigpu.py\"\n]\n\nall_py_files = list_files(\".py\")\n\n\ndef update_whitelist():\n    \"\"\"Add files to the whitelist\"\"\"\n    global whitelist_pep8\n    # We don't want to test RL-attack because it has so many dependencies\n    # not used elsewhere, and pylint wants to import them all\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"RL-attack\" in path\n        ]\n    )\n    # Similarly, we don't want to require robust_vision_benchmark installed\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"robust_vision_benchmark\" in path\n        ]\n    )\n    # Similarly, we don't want to require that cloud be installed\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"cloud_client\" in path\n        ]\n    )\n    # This example has more dependencies too\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"facenet_adversarial_faces\" in path\n        ]\n    )\n    # This too\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"madry_lab_challenges\" in path\n        ]\n    )\n    # This code is no longer compatible with new versions of cleverhans / scipy and will be removed soon\n    whitelist_pep8.extend(\n        [\n            os.path.relpath(path, cleverhans.__path__[0])\n            for path in all_py_files\n            if \"nips17_adversarial_competition\" in path\n        ]\n    )\n\n\nupdate_whitelist()\n\n\nwhitelist_docstrings = []\n\n\ndef test_format_pep8():\n    \"\"\"\n    Test if pep8 is respected.\n    \"\"\"\n    files_to_check = []\n    module_dir = cleverhans.__path__[0]\n    for path in all_py_files:\n        rel_path = os.path.relpath(path, module_dir)\n        if rel_path in whitelist_pep8:\n            continue\n        else:\n            files_to_check.append(path)\n    repo_dir = os.path.join(module_dir, os.pardir)\n    rcpath = os.path.join(repo_dir, \".pylintrc\")\n    assert os.path.exists(rcpath)\n\n    # We must run pylint via the command line and subprocess because of\n    # problems with the pylint module.\n    # The documentation claims you can run it as a python module, but\n    # the documentation is wrong: https://github.com/PyCQA/pylint/issues/1870\n    # If you run the version described in the linked issue, pylint\n    # calls sys.exit once it is done, so it kills the test.\n\n    # Running all files in one pylint command is important for 2 reasons:\n    # 1) Correctness: pylint can detect issues that require access to multiple\n    #    files, such as cyclic imports\n    # 2) Speed: pylint imports modules for deep analysis, so if you run\n    #    multiple subprocesses each needs to re-import tensorflow.\n    # On Ian's laptop, pylint takes about 10s per file to run on the repo,\n    # and there are about 90 files as of the writing of this comment.\n    # Running pylint on all files simultaneously takes about 70s, so it\n    # is a little better than a 10X speedup.\n\n    # Running multiple jobs in parallel helps but far less than linearly.\n    # On Ian's 4-core laptop, running 4 jobs drops the runtime from 70s\n    # to 45s.\n    # Some of the work is I/O, so it actually makes some sense to run\n    # more jobs than cores. On Ian's 4-core laptop, running 8 jobs drops\n    # the runtime to 40s.\n    # There's a further complication though: I think each job needs to\n    # redo imports, so the total amount of work to do increases with\n    # the number of jobs. On Ian's laptop, using 64 jobs causes the\n    # runtime to increase to 220s. There is not an obvious simple\n    # formula like \"use one job per CPU core\" or \"use way more jobs\n    # than cores to saturate I/O\". For now I'm hoping that 8 will be\n    # a reasonable default: it gets good performance on my laptop,\n    # and on machines with fewer than 4 cores there should still be\n    # a benefit to not being blocked on I/O.\n\n    try:\n        shell_call([\"pylint\", \"--rcfile\", rcpath, \"--jobs\", \"8\"] + files_to_check)\n    except subprocess.CalledProcessError as e:\n        raise ValueError(e.output.decode(\"utf-8\"))\n\n\nif __name__ == \"__main__\":\n    test_format_pep8()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/devtools/version.py",
    "content": "\"\"\"\nUtility functions for keeping track of the version of CleverHans.\n\nThese functions provide a finer level of granularity than the\nmanually specified version string attached to each release.\n\"\"\"\nimport hashlib\nfrom cleverhans.devtools.list_files import list_files\n\n\ndef dev_version():\n    \"\"\"\n    Returns a hexdigest of all the python files in the module.\n    \"\"\"\n\n    md5_hash = hashlib.md5()\n    py_files = sorted(list_files(suffix=\".py\"))\n    if not py_files:\n        return \"\"\n    for filename in py_files:\n        with open(filename, \"rb\") as fobj:\n            content = fobj.read()\n        md5_hash.update(content)\n    return md5_hash.hexdigest()\n\n\ndef append_dev_version(release_version):\n    \"\"\"\n    If dev version is not empty appends it to release_version.\n    \"\"\"\n\n    dev_version_value = dev_version()\n    if dev_version_value:\n        return release_version + \"-\" + dev_version_value\n    else:\n        return release_version\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/evaluation.py",
    "content": "\"\"\"\nFunctionality for evaluating expressions across entire datasets.\nIncludes multi-GPU support for fast evaluation.\n\"\"\"\n\nfrom distutils.version import LooseVersion\nimport warnings\nimport numpy as np\nfrom six.moves import range\nimport tensorflow as tf\n\nimport cleverhans\nfrom cleverhans import canary\nfrom cleverhans.utils import create_logger\nfrom cleverhans.utils_tf import infer_devices\n\n\ndef accuracy(\n    sess,\n    model,\n    x,\n    y,\n    batch_size=None,\n    devices=None,\n    feed=None,\n    attack=None,\n    attack_params=None,\n):\n    \"\"\"\n    Compute the accuracy of a TF model on some data\n    :param sess: TF session to use when training the graph\n    :param model: cleverhans.model.Model instance\n    :param x: numpy array containing input examples (e.g. MNIST().x_test )\n    :param y: numpy array containing example labels (e.g. MNIST().y_test )\n    :param batch_size: Number of examples to use in a single evaluation batch.\n        If not specified, this function will use a reasonable guess and\n        may run out of memory.\n        When choosing the batch size, keep in mind that the batch will\n        be divided up evenly among available devices. If you can fit 128\n        examples in memory on one GPU and you have 8 GPUs, you probably\n        want to use a batch size of 1024 (unless a different batch size\n        runs faster with the ops you are using, etc.)\n    :param devices: An optional list of string device names to use.\n      If not specified, this function will use all visible GPUs.\n    :param feed: An optional dictionary that is appended to the feeding\n             dictionary before the session runs. Can be used to feed\n             the learning phase of a Keras model for instance.\n    :param attack: cleverhans.attack.Attack\n      Optional. If no attack specified, evaluates the model on clean data.\n      If attack is specified, evaluates the model on adversarial examples\n      created by the attack.\n    :param attack_params: dictionary\n      If attack is specified, this dictionary is passed to attack.generate\n      as keyword arguments.\n    :return: a float with the accuracy value\n    \"\"\"\n\n    _check_x(x)\n    _check_y(y)\n    if x.shape[0] != y.shape[0]:\n        raise ValueError(\"Number of input examples and labels do not match.\")\n\n    factory = _CorrectFactory(model, attack, attack_params)\n\n    (correct,) = batch_eval_multi_worker(\n        sess, factory, [x, y], batch_size=batch_size, devices=devices, feed=feed\n    )\n\n    return correct.mean()\n\n\ndef class_and_confidence(\n    sess,\n    model,\n    x,\n    y=None,\n    batch_size=None,\n    devices=None,\n    feed=None,\n    attack=None,\n    attack_params=None,\n):\n    \"\"\"\n    Return the model's classification of the input data, and the confidence\n    (probability) assigned to each example.\n    :param sess: tf.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing input examples (e.g. MNIST().x_test )\n    :param y: numpy array containing true labels\n      (Needed only if using an attack that avoids these labels)\n    :param batch_size: Number of examples to use in a single evaluation batch.\n        If not specified, this function will use a reasonable guess and\n        may run out of memory.\n        When choosing the batch size, keep in mind that the batch will\n        be divided up evenly among available devices. If you can fit 128\n        examples in memory on one GPU and you have 8 GPUs, you probably\n        want to use a batch size of 1024 (unless a different batch size\n        runs faster with the ops you are using, etc.)\n    :param devices: An optional list of string device names to use.\n      If not specified, this function will use all visible GPUs.\n    :param feed: An optional dictionary that is appended to the feeding\n             dictionary before the session runs. Can be used to feed\n             the learning phase of a Keras model for instance.\n    :param attack: cleverhans.attack.Attack\n      Optional. If no attack specified, evaluates the model on clean data.\n      If attack is specified, evaluates the model on adversarial examples\n      created by the attack.\n    :param attack_params: dictionary\n      If attack is specified, this dictionary is passed to attack.generate\n      as keyword arguments.\n    :return:\n      an ndarray of ints indicating the class assigned to each example\n      an ndarray of probabilities assigned to the prediction for each example\n    \"\"\"\n\n    _check_x(x)\n    inputs = [x]\n    if attack is not None:\n        inputs.append(y)\n        _check_y(y)\n        if x.shape[0] != y.shape[0]:\n            raise ValueError(\"Number of input examples and labels do not match.\")\n\n    factory = _ClassAndProbFactory(model, attack, attack_params)\n\n    out = batch_eval_multi_worker(\n        sess, factory, inputs, batch_size=batch_size, devices=devices, feed=feed\n    )\n\n    classes, confidence = out\n\n    assert classes.shape == (x.shape[0],)\n    assert confidence.shape == (x.shape[0],)\n    min_confidence = confidence.min()\n    if min_confidence < 0.0:\n        raise ValueError(\n            \"Model does not return valid probabilities: \" + str(min_confidence)\n        )\n    max_confidence = confidence.max()\n    if max_confidence > 1.0:\n        raise ValueError(\n            \"Model does not return valid probablities: \" + str(max_confidence)\n        )\n    assert confidence.min() >= 0.0, confidence.min()\n\n    return out\n\n\ndef correctness_and_confidence(\n    sess,\n    model,\n    x,\n    y,\n    batch_size=None,\n    devices=None,\n    feed=None,\n    attack=None,\n    attack_params=None,\n):\n    \"\"\"\n    Report whether the model is correct and its confidence on each example in\n    a dataset.\n    :param sess: tf.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing input examples (e.g. MNIST().x_test )\n    :param y: numpy array containing example labels (e.g. MNIST().y_test )\n    :param batch_size: Number of examples to use in a single evaluation batch.\n        If not specified, this function will use a reasonable guess and\n        may run out of memory.\n        When choosing the batch size, keep in mind that the batch will\n        be divided up evenly among available devices. If you can fit 128\n        examples in memory on one GPU and you have 8 GPUs, you probably\n        want to use a batch size of 1024 (unless a different batch size\n        runs faster with the ops you are using, etc.)\n    :param devices: An optional list of string device names to use.\n      If not specified, this function will use all visible GPUs.\n    :param feed: An optional dictionary that is appended to the feeding\n             dictionary before the session runs. Can be used to feed\n             the learning phase of a Keras model for instance.\n    :param attack: cleverhans.attack.Attack\n      Optional. If no attack specified, evaluates the model on clean data.\n      If attack is specified, evaluates the model on adversarial examples\n      created by the attack.\n    :param attack_params: dictionary\n      If attack is specified, this dictionary is passed to attack.generate\n      as keyword arguments.\n    :return:\n      an ndarray of bools indicating whether each example is correct\n      an ndarray of probabilities assigned to the prediction for each example\n    \"\"\"\n\n    _check_x(x)\n    _check_y(y)\n    if x.shape[0] != y.shape[0]:\n        raise ValueError(\"Number of input examples and labels do not match.\")\n\n    factory = _CorrectAndProbFactory(model, attack, attack_params)\n\n    out = batch_eval_multi_worker(\n        sess, factory, [x, y], batch_size=batch_size, devices=devices, feed=feed\n    )\n\n    correctness, confidence = out\n\n    assert correctness.shape == (x.shape[0],)\n    assert confidence.shape == (x.shape[0],)\n    min_confidence = confidence.min()\n    if min_confidence < 0.0:\n        raise ValueError(\n            \"Model does not return valid probabilities: \" + str(min_confidence)\n        )\n    max_confidence = confidence.max()\n    if max_confidence > 1.0:\n        raise ValueError(\n            \"Model does not return valid probablities: \" + str(max_confidence)\n        )\n    assert confidence.min() >= 0.0, confidence.min()\n\n    return out\n\n\ndef run_attack(\n    sess,\n    model,\n    x,\n    y,\n    attack,\n    attack_params,\n    batch_size=None,\n    devices=None,\n    feed=None,\n    pass_y=False,\n):\n    \"\"\"\n    Run attack on every example in a dataset.\n    :param sess: tf.Session\n    :param model: cleverhans.model.Model\n    :param x: numpy array containing input examples (e.g. MNIST().x_test )\n    :param y: numpy array containing example labels (e.g. MNIST().y_test )\n    :param attack: cleverhans.attack.Attack\n    :param attack_params: dictionary\n      passed to attack.generate as keyword arguments.\n    :param batch_size: Number of examples to use in a single evaluation batch.\n        If not specified, this function will use a reasonable guess and\n        may run out of memory.\n        When choosing the batch size, keep in mind that the batch will\n        be divided up evenly among available devices. If you can fit 128\n        examples in memory on one GPU and you have 8 GPUs, you probably\n        want to use a batch size of 1024 (unless a different batch size\n        runs faster with the ops you are using, etc.)\n    :param devices: An optional list of string device names to use.\n      If not specified, this function will use all visible GPUs.\n    :param feed: An optional dictionary that is appended to the feeding\n             dictionary before the session runs. Can be used to feed\n             the learning phase of a Keras model for instance.\n    :param pass_y: bool. If true pass 'y' to `attack.generate`\n    :return:\n      an ndarray of bools indicating whether each example is correct\n      an ndarray of probabilities assigned to the prediction for each example\n    \"\"\"\n\n    _check_x(x)\n    _check_y(y)\n\n    factory = _AttackFactory(model, attack, attack_params, pass_y)\n\n    (out,) = batch_eval_multi_worker(\n        sess, factory, [x, y], batch_size=batch_size, devices=devices, feed=feed\n    )\n    return out\n\n\ndef batch_eval_multi_worker(\n    sess, graph_factory, numpy_inputs, batch_size=None, devices=None, feed=None\n):\n    \"\"\"\n    Generic computation engine for evaluating an expression across a whole\n    dataset, divided into batches.\n\n    This function assumes that the work can be parallelized with one worker\n    device handling one batch of data. If you need multiple devices per\n    batch, use `batch_eval`.\n\n    The tensorflow graph for multiple workers is large, so the first few\n    runs of the graph will be very slow. If you expect to run the graph\n    few times (few calls to `batch_eval_multi_worker` that each run few\n    batches) the startup cost might dominate the runtime, and it might be\n    preferable to use the single worker `batch_eval` just because its\n    startup cost will be lower.\n\n    :param sess: tensorflow Session\n    :param graph_factory: callable\n        When called, returns (tf_inputs, tf_outputs) where:\n            tf_inputs is a list of placeholders to feed from the dataset\n            tf_outputs is a list of tf tensors to calculate\n        Example: tf_inputs is [x, y] placeholders, tf_outputs is [accuracy].\n        This factory must make new tensors when called, rather than, e.g.\n        handing out a reference to existing tensors.\n        This factory must make exactly equivalent expressions every time\n        it is called, otherwise the results of `batch_eval` will vary\n        depending on how work is distributed to devices.\n        This factory must respect \"with tf.device()\" context managers\n        that are active when it is called, otherwise work will not be\n        distributed to devices correctly.\n    :param numpy_inputs:\n        A list of numpy arrays defining the dataset to be evaluated.\n        The list should have the same length as tf_inputs.\n        Each array should have the same number of examples (shape[0]).\n        Example: numpy_inputs is [MNIST().x_test, MNIST().y_test]\n    :param batch_size: Number of examples to use in a single evaluation batch.\n        If not specified, this function will use a reasonable guess and\n        may run out of memory.\n        When choosing the batch size, keep in mind that the batch will\n        be divided up evenly among available devices. If you can fit 128\n        examples in memory on one GPU and you have 8 GPUs, you probably\n        want to use a batch size of 1024 (unless a different batch size\n        runs faster with the ops you are using, etc.)\n    :param devices: List of devices to run on. If unspecified, uses all\n        available GPUs if any GPUS are available, otherwise uses CPUs.\n    :param feed: An optional dictionary that is appended to the feeding\n             dictionary before the session runs. Can be used to feed\n             the learning phase of a Keras model for instance.\n    :returns: List of numpy arrays corresponding to the outputs produced by\n        the graph_factory\n    \"\"\"\n    canary.run_canary()\n    global _batch_eval_multi_worker_cache\n\n    devices = infer_devices(devices)\n\n    if batch_size is None:\n        # For big models this might result in OOM and then the user\n        # should just specify batch_size\n        batch_size = len(devices) * DEFAULT_EXAMPLES_PER_DEVICE\n\n    n = len(numpy_inputs)\n    assert n > 0\n    m = numpy_inputs[0].shape[0]\n    for i in range(1, n):\n        m_i = numpy_inputs[i].shape[0]\n        if m != m_i:\n            raise ValueError(\n                \"All of numpy_inputs must have the same number of examples, but the first one has \"\n                + str(m)\n                + \" examples and input \"\n                + str(i)\n                + \" has \"\n                + str(m_i)\n                + \"examples.\"\n            )\n    out = []\n\n    replicated_tf_inputs = []\n    replicated_tf_outputs = []\n    p = None\n\n    num_devices = len(devices)\n    assert batch_size % num_devices == 0\n    device_batch_size = batch_size // num_devices\n\n    cache_key = (graph_factory, tuple(devices))\n    if cache_key in _batch_eval_multi_worker_cache:\n        # Retrieve graph for multi-GPU inference from cache.\n        # This avoids adding tf ops to the graph\n        packed = _batch_eval_multi_worker_cache[cache_key]\n        replicated_tf_inputs, replicated_tf_outputs = packed\n        p = len(replicated_tf_outputs[0])\n        assert p > 0\n    else:\n        # This graph has not been built before.\n        # Build it now.\n\n        for device in devices:\n            with tf.device(device):\n                tf_inputs, tf_outputs = graph_factory()\n                assert len(tf_inputs) == n\n                if p is None:\n                    p = len(tf_outputs)\n                    assert p > 0\n                else:\n                    assert len(tf_outputs) == p\n                replicated_tf_inputs.append(tf_inputs)\n                replicated_tf_outputs.append(tf_outputs)\n        del tf_inputs\n        del tf_outputs\n        # Store the result in the cache\n        packed = replicated_tf_inputs, replicated_tf_outputs\n        _batch_eval_multi_worker_cache[cache_key] = packed\n    for _ in range(p):\n        out.append([])\n    flat_tf_outputs = []\n    for output in range(p):\n        for dev_idx in range(num_devices):\n            flat_tf_outputs.append(replicated_tf_outputs[dev_idx][output])\n\n    # pad data to have # examples be multiple of batch size\n    # we discard the excess later\n    num_batches = int(np.ceil(float(m) / batch_size))\n    needed_m = num_batches * batch_size\n    excess = needed_m - m\n    if excess > m:\n        raise NotImplementedError(\n            (\n                \"Your batch size (%(batch_size)d) is bigger\"\n                \" than the dataset (%(m)d), this function is \"\n                \"probably overkill.\"\n            )\n            % locals()\n        )\n\n    def pad(array):\n        \"\"\"Pads an array with replicated examples to have `excess` more entries\"\"\"\n        if excess > 0:\n            array = np.concatenate((array, array[:excess]), axis=0)\n        return array\n\n    numpy_inputs = [pad(numpy_input) for numpy_input in numpy_inputs]\n    orig_m = m\n    m = needed_m\n\n    for start in range(0, m, batch_size):\n        batch = start // batch_size\n        if batch % 100 == 0 and batch > 0:\n            _logger.debug(\"Batch \" + str(batch))\n\n        # Compute batch start and end indices\n        end = start + batch_size\n        numpy_input_batches = [numpy_input[start:end] for numpy_input in numpy_inputs]\n        feed_dict = {}\n        for dev_idx, tf_inputs in enumerate(replicated_tf_inputs):\n            for tf_input, numpy_input in zip(tf_inputs, numpy_input_batches):\n                dev_start = dev_idx * device_batch_size\n                dev_end = (dev_idx + 1) * device_batch_size\n                value = numpy_input[dev_start:dev_end]\n                assert value.shape[0] == device_batch_size\n                feed_dict[tf_input] = value\n        if feed is not None:\n            feed_dict.update(feed)\n        flat_output_batches = sess.run(flat_tf_outputs, feed_dict=feed_dict)\n        for e in flat_output_batches:\n            assert e.shape[0] == device_batch_size, e.shape\n\n        output_batches = []\n        for output in range(p):\n            o_start = output * num_devices\n            o_end = (output + 1) * num_devices\n            device_values = flat_output_batches[o_start:o_end]\n            assert len(device_values) == num_devices\n            output_batches.append(device_values)\n\n        for out_elem, device_values in zip(out, output_batches):\n            assert len(device_values) == num_devices, (len(device_values), num_devices)\n            for device_value in device_values:\n                assert device_value.shape[0] == device_batch_size\n            out_elem.extend(device_values)\n\n    out = [np.concatenate(x, axis=0) for x in out]\n    for e in out:\n        assert e.shape[0] == m, e.shape\n\n    # Trim off the examples we used to pad up to batch size\n    out = [e[:orig_m] for e in out]\n    assert len(out) == p, (len(out), p)\n\n    return out\n\n\ndef batch_eval(\n    sess, tf_inputs, tf_outputs, numpy_inputs, batch_size=None, feed=None, args=None\n):\n    \"\"\"\n    A helper function that computes a tensor on numpy inputs by batches.\n    This version uses exactly the tensorflow graph constructed by the\n    caller, so the caller can place specific ops on specific devices\n    to implement model parallelism.\n    Most users probably prefer `batch_eval_multi_worker` which maps\n    a single-device expression to multiple devices in order to evaluate\n    faster by parallelizing across data.\n\n    :param sess: tf Session to use\n    :param tf_inputs: list of tf Placeholders to feed from the dataset\n    :param tf_outputs: list of tf tensors to calculate\n    :param numpy_inputs: list of numpy arrays defining the dataset\n    :param batch_size: int, batch size to use for evaluation\n        If not specified, this function will try to guess the batch size,\n        but might get an out of memory error or run the model with an\n        unsupported batch size, etc.\n    :param feed: An optional dictionary that is appended to the feeding\n             dictionary before the session runs. Can be used to feed\n             the learning phase of a Keras model for instance.\n    :param args: dict or argparse `Namespace` object.\n                Deprecated and included only for backwards compatibility.\n                 Should contain `batch_size`\n    \"\"\"\n\n    if args is not None:\n        warnings.warn(\n            \"`args` is deprecated and will be removed on or \"\n            \"after 2019-03-09. Pass `batch_size` directly.\"\n        )\n        if \"batch_size\" in args:\n            assert batch_size is None\n            batch_size = args[\"batch_size\"]\n\n    if batch_size is None:\n        batch_size = DEFAULT_EXAMPLES_PER_DEVICE\n\n    n = len(numpy_inputs)\n    assert n > 0\n    assert n == len(tf_inputs)\n    m = numpy_inputs[0].shape[0]\n    for i in range(1, n):\n        assert numpy_inputs[i].shape[0] == m\n    out = []\n    for _ in tf_outputs:\n        out.append([])\n    for start in range(0, m, batch_size):\n        batch = start // batch_size\n        if batch % 100 == 0 and batch > 0:\n            _logger.debug(\"Batch \" + str(batch))\n\n        # Compute batch start and end indices\n        start = batch * batch_size\n        end = start + batch_size\n        numpy_input_batches = [numpy_input[start:end] for numpy_input in numpy_inputs]\n        cur_batch_size = numpy_input_batches[0].shape[0]\n        assert cur_batch_size <= batch_size\n        for e in numpy_input_batches:\n            assert e.shape[0] == cur_batch_size\n\n        feed_dict = dict(zip(tf_inputs, numpy_input_batches))\n        if feed is not None:\n            feed_dict.update(feed)\n        numpy_output_batches = sess.run(tf_outputs, feed_dict=feed_dict)\n        for e in numpy_output_batches:\n            assert e.shape[0] == cur_batch_size, e.shape\n        for out_elem, numpy_output_batch in zip(out, numpy_output_batches):\n            out_elem.append(numpy_output_batch)\n\n    out = [np.concatenate(x, axis=0) for x in out]\n    for e in out:\n        assert e.shape[0] == m, e.shape\n    return out\n\n\nDEFAULT_EXAMPLES_PER_DEVICE = 128\n\n\nclass _CorrectFactory(object):\n    \"\"\"\n    A factory for an expression for one bool per example indicating\n    whether each example is correct.\n    \"\"\"\n\n    def __init__(self, model, attack=None, attack_params=None):\n        if attack_params is None:\n            attack_params = {}\n        self.model = model\n        self.attack = attack\n        self.attack_params = attack_params\n        hashable_attack_params = tuple(\n            (key, attack_params[key]) for key in sorted(attack_params.keys())\n        )\n        self.properties_to_hash = (model, attack, hashable_attack_params)\n\n    def __hash__(self):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        return self.properties_to_hash.__hash__()\n\n    def __eq__(self, other):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        if not isinstance(other, _CorrectFactory):\n            return False\n        return self.properties_to_hash == other.properties_to_hash\n\n    def __call__(self):\n        x_batch = self.model.make_input_placeholder()\n        y_batch = self.model.make_label_placeholder()\n\n        if LooseVersion(tf.__version__) < LooseVersion(\"1.0.0\"):\n            raise NotImplementedError()\n\n        if self.attack is None:\n            x_input = x_batch\n        else:\n            attack_params = self.attack_params\n            if attack_params is None:\n                attack_params = {}\n            x_input = self.attack.generate(x_batch, y=y_batch, **attack_params)\n\n        predictions = self.model.get_probs(x_input)\n        correct = tf.equal(tf.argmax(y_batch, axis=-1), tf.argmax(predictions, axis=-1))\n\n        return (x_batch, y_batch), (correct,)\n\n\nclass _ClassAndProbFactory(object):\n    \"\"\"\n    A factory for an expression for the following tuple per (optionally\n    adversarial) example:\n      - integer class assigned to the example by the model\n      - probability assigned to that prediction\n    \"\"\"\n\n    def __init__(self, model, attack=None, attack_params=None):\n        if attack_params is None:\n            attack_params = {}\n        self.model = model\n        self.attack = attack\n        self.attack_params = attack_params\n        hashable_attack_params = tuple(\n            (key, attack_params[key]) for key in sorted(attack_params.keys())\n        )\n        self.properties_to_hash = (model, attack, hashable_attack_params)\n\n    def __hash__(self):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        return self.properties_to_hash.__hash__()\n\n    def __eq__(self, other):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        if not isinstance(other, _ClassAndProbFactory):\n            return False\n        return self.properties_to_hash == other.properties_to_hash\n\n    def __call__(self):\n        x_batch = self.model.make_input_placeholder()\n        inputs = [x_batch]\n\n        if LooseVersion(tf.__version__) < LooseVersion(\"1.0.0\"):\n            raise NotImplementedError()\n\n        if self.attack is None:\n            x_input = x_batch\n        else:\n            y_batch = self.model.make_label_placeholder()\n            inputs.append(y_batch)\n            attack_params = self.attack_params\n            if attack_params is None:\n                attack_params = {}\n            x_input = self.attack.generate(x_batch, y=y_batch, **attack_params)\n\n        predictions = self.model.get_probs(x_input)\n        classes = tf.argmax(predictions, axis=-1)\n        max_probs = tf.reduce_max(predictions, axis=1)\n\n        return tuple(inputs), (classes, max_probs)\n\n\nclass _CorrectAndProbFactory(object):\n    \"\"\"\n    A factory for an expression for the following tuple per (optionally\n    adversarial) example:\n      - bool per indicating whether each the example was classified correctly\n      - probability assigned to that prediction\n    \"\"\"\n\n    def __init__(self, model, attack=None, attack_params=None):\n        if attack_params is None:\n            attack_params = {}\n        self.model = model\n        self.attack = attack\n        self.attack_params = attack_params\n        hashable_attack_params = tuple(\n            (key, attack_params[key]) for key in sorted(attack_params.keys())\n        )\n        self.properties_to_hash = (model, attack, hashable_attack_params)\n\n    def __hash__(self):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        return self.properties_to_hash.__hash__()\n\n    def __eq__(self, other):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        if not isinstance(other, _CorrectAndProbFactory):\n            return False\n        return self.properties_to_hash == other.properties_to_hash\n\n    def __call__(self):\n        x_batch = self.model.make_input_placeholder()\n        y_batch = self.model.make_label_placeholder()\n\n        if LooseVersion(tf.__version__) < LooseVersion(\"1.0.0\"):\n            raise NotImplementedError()\n\n        if self.attack is None:\n            x_input = x_batch\n        else:\n            attack_params = self.attack_params\n            if attack_params is None:\n                attack_params = {}\n            x_input = self.attack.generate(x_batch, y=y_batch, **attack_params)\n\n        predictions = self.model.get_probs(x_input)\n        correct = tf.equal(tf.argmax(y_batch, axis=-1), tf.argmax(predictions, axis=-1))\n        max_probs = tf.reduce_max(predictions, axis=1)\n\n        return (x_batch, y_batch), (correct, max_probs)\n\n\nclass _AttackFactory(object):\n    \"\"\"\n    A factory for an expression that runs an adversarial attack\n\n    :param model: cleverhans.model.Model\n    :param attack: cleverhans.attack.Attack\n    :param attack_params: dict of arguments to pass to attack.generate\n    :param pass_y: bool. If True, pass y to the attack.\n      (Some untargeted attacks prefer to infer y to avoid label leaking.\n      Targeted attacks require that y not be passed)\n    \"\"\"\n\n    def __init__(self, model, attack, attack_params=None, pass_y=False):\n        assert isinstance(model, cleverhans.model.Model)\n        if not isinstance(attack, cleverhans.attacks.Attack):\n            raise TypeError(\n                \"`attack` must be an instance of cleverhans.attacks.\"\n                \"attack. Got %s with type %s \" % (str(attack), str(type(attack)))\n            )\n\n        if attack_params is None:\n            attack_params = {}\n        self.model = model\n        self.attack = attack\n        self.attack_params = attack_params\n        self.pass_y = pass_y\n        hashable_attack_params = tuple(\n            (key, attack_params[key]) for key in sorted(attack_params.keys())\n        )\n        self.properties_to_hash = (model, attack, hashable_attack_params)\n\n    def __hash__(self):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        return self.properties_to_hash.__hash__()\n\n    def __eq__(self, other):\n        # Make factory hashable so that no two factories for the\n        # same model will be used to build redundant tf graphs\n        if not isinstance(other, _AttackFactory):\n            return False\n        return self.properties_to_hash == other.properties_to_hash\n\n    def __call__(self):\n        x_batch = self.model.make_input_placeholder()\n        y_batch = self.model.make_label_placeholder()\n\n        attack_params = self.attack_params\n        if attack_params is None:\n            attack_params = {}\n        if self.pass_y:\n            x_adv = self.attack.generate(x_batch, y=y_batch, **attack_params)\n        else:\n            # Some code checks the keys of kwargs, rather than checking if\n            # y is None, so we need to truly not pass y at all, rather than\n            # just passing a None value for it.\n            x_adv = self.attack.generate(x_batch, **attack_params)\n\n        return (x_batch, y_batch), tuple([x_adv])\n\n\n_logger = create_logger(\"cleverhans.evaluation\")\n\n# Cache for storing output of `batch_eval_multi_worker`'s calls to\n# `graph_factory`, to avoid making the tf graph too big\n_batch_eval_multi_worker_cache = {}\n\n\ndef _check_x(x):\n    \"\"\"\n    Makes sure an `x` argument is a valid numpy dataset.\n    \"\"\"\n    if not isinstance(x, np.ndarray):\n        raise TypeError(\n            \"x must be a numpy array. Typically x contains \"\n            \"the entire test set inputs.\"\n        )\n\n\ndef _check_y(y):\n    \"\"\"\n    Makes sure a `y` argument is a vliad numpy dataset.\n    \"\"\"\n    if not isinstance(y, np.ndarray):\n        raise TypeError(\n            \"y must be numpy array. Typically y contains \"\n            \"the entire test set labels. Got \" + str(y) + \" of type \" + str(type(y))\n        )\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/README.md",
    "content": "This directory contains experimental features of cleverhans, which are not\nintegrated into the main API yet.\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/README.md",
    "content": "# Certification of adversarial robustness\n\nThis code performs certification of adversarial robustness of given network on\ngiven example.\n\nOriginal author: [Aditi Raghunathan](https://github.com/RAditi)\n\n## Dependencies\n\nTensorFlow 1.9.0 or higher (to have support of necessary\n[autograph](https://www.tensorflow.org/guide/autograph) features)\n\n## Usage\n\nExample usage for two-layer network trained on MNIST:\n\n```bash\n# Meaning of the arguments:\n# checkpoint - TensorFlow checkpoint of the model parameters\n# model_json - JSON file which describes the model (see below)\n# test_input - numpy file with input to certify\n# true_class - true class of the input\n# adv_class - adversarial class for which we're checking certificate,\n#             -1 means that all adversarial classes will be checked\n# epsilon - maximum size of adversarial perturbation\n# init_nu and small_eig_num_steps - optimization parameters\npython cleverhans/experimental/certification/certify.py \\\n  --checkpoint \"${MODEL_DIR}/model.ckpt\" \\\n  --model_json \"${MODEL_DIR}/model.json\" \\\n  --test_input \"${INPUTS_DIR}/image.npy\" \\\n  --true_class 4 \\\n  --adv_class 5 \\\n  --epsilon 0.2 \\\n  --init_nu 100.0 \\\n  --small_eig_num_steps 100\n```\n\nJSON file which accompany checkpoint and describes layers of the network:\n\n```json\n[\n  {\n    \"weight_var\": \"Model/layer0/logits/kernel\",\n    \"bias_var\": \"Model/layer0/logits/bias\",\n    \"type\": \"ff_relu\",\n    \"is_transpose\": true\n  },\n  {\n    \"weight_var\": \"Model/logits/kernel\",\n    \"bias_var\": \"Model/logits/bias\",\n    \"type\": \"ff\",\n    \"is_transpose\": true\n  }\n]\n```\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/certify.py",
    "content": "\"\"\"Code for running the certification problem.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport time\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.experimental.certification import dual_formulation\nfrom cleverhans.experimental.certification import nn\nfrom cleverhans.experimental.certification import optimization\nfrom cleverhans.experimental.certification import utils\n\nflags = tf.app.flags\nFLAGS = flags.FLAGS\nflags.DEFINE_string(\n    \"checkpoint\", None, \"Path of checkpoint with trained model to verify\"\n)\nflags.DEFINE_string(\"model_json\", None, \"Path of json file with model description\")\nflags.DEFINE_string(\n    \"init_dual_file\", None, \"Path of numpy file with dual variables to initialize\"\n)\nflags.DEFINE_string(\"test_input\", None, \"Path of numpy file with test input to certify\")\nflags.DEFINE_integer(\"true_class\", 0, \"True class of the test input\")\nflags.DEFINE_integer(\n    \"adv_class\", -1, \"target class of adversarial example; all classes if -1\"\n)\nflags.DEFINE_float(\"input_minval\", -1, \"Minimum value of valid input\")\nflags.DEFINE_float(\"input_maxval\", 1, \"Maximum value of valid input\")\nflags.DEFINE_float(\"epsilon\", 0.2, \"Size of perturbation\")\n# Nu might need tuning based on the network\nflags.DEFINE_float(\"init_nu\", 300.0, \"Initialization of nu variable.\")\nflags.DEFINE_float(\"init_penalty\", 100.0, \"Initial penalty\")\nflags.DEFINE_integer(\n    \"small_eig_num_steps\", 500, \"Number of eigen value steps in intermediate iterations\"\n)\nflags.DEFINE_integer(\n    \"large_eig_num_steps\", 5000, \"Number of eigen value steps in each outer iteration\"\n)\nflags.DEFINE_integer(\"inner_num_steps\", 600, \"Number of steps to run in inner loop\")\nflags.DEFINE_float(\"outer_num_steps\", 10, \"Number of steps to run in outer loop\")\nflags.DEFINE_float(\"beta\", 2, \"Multiplicative factor to increase penalty by\")\nflags.DEFINE_float(\n    \"smoothness_parameter\", 0.001, \"Smoothness parameter if using eigen decomposition\"\n)\nflags.DEFINE_float(\n    \"eig_learning_rate\", 0.001, \"Learning rate for computing min eigen value\"\n)\nflags.DEFINE_string(\"optimizer\", \"adam\", \"Optimizer to use for entire optimization\")\nflags.DEFINE_float(\"init_learning_rate\", 0.1, \"Initial learning rate\")\nflags.DEFINE_float(\"learning_rate_decay\", 0.1, \"Decay of learning rate\")\nflags.DEFINE_float(\n    \"momentum_parameter\", 0.9, \"Momentum parameter if using momentum optimizer\"\n)\nflags.DEFINE_integer(\"print_stats_steps\", 50, \"Number of steps to print stats after\")\nflags.DEFINE_string(\"stats_folder\", None, \"Folder to save stats of the iterations\")\nflags.DEFINE_integer(\n    \"projection_steps\", 200, \"Number of steps to compute projection after\"\n)\nflags.DEFINE_integer(\"num_classes\", 10, \"Total number of classes\")\nflags.DEFINE_enum(\n    \"verbosity\",\n    \"INFO\",\n    [\"DEBUG\", \"INFO\", \"WARNING\", \"ERROR\", \"CRITICAL\"],\n    \"Logging verbosity level.\",\n)\nflags.DEFINE_string(\n    \"eig_type\", \"LZS\", \"Method to compute eigenvalues (TF, SCIPY, or LZS), LZS\"\n)\nflags.DEFINE_integer(\n    \"lanczos_steps\", 20, \"Number of steps to perform in Lanczos method.\"\n)\nflags.DEFINE_integer(\"num_rows\", 28, \"Number of rows in image\")\nflags.DEFINE_integer(\"num_columns\", 28, \"Number of columns in image\")\nflags.DEFINE_integer(\"num_channels\", 1, \"Number of channels in image\")\n\nMIN_LANCZOS_ITER = 5\n\n\ndef main(_):\n    # pylint: disable=missing-docstring\n    tf.logging.set_verbosity(FLAGS.verbosity)\n\n    start_time = time.time()\n\n    # Initialize neural network based on config files\n    input_shape = [FLAGS.num_rows, FLAGS.num_columns, FLAGS.num_channels]\n    nn_params = nn.load_network_from_checkpoint(\n        FLAGS.checkpoint, FLAGS.model_json, input_shape\n    )\n    tf.logging.info(\"Loaded neural network with size of layers: %s\", nn_params.sizes)\n    tf.logging.info(\n        \"Loaded neural network with input shapes: %s\", nn_params.input_shapes\n    )\n    tf.logging.info(\n        \"Loaded neural network with output shapes: %s\", nn_params.output_shapes\n    )\n    dual_var = utils.initialize_dual(\n        nn_params, FLAGS.init_dual_file, init_nu=FLAGS.init_nu\n    )\n\n    # Reading test input and reshaping\n    with tf.gfile.Open(FLAGS.test_input) as f:\n        test_input = np.load(f)\n    test_input = np.reshape(test_input, [np.size(test_input), 1])\n\n    if FLAGS.adv_class == -1:\n        start_class = 0\n        end_class = FLAGS.num_classes\n    else:\n        start_class = FLAGS.adv_class\n        end_class = FLAGS.adv_class + 1\n    for adv_class in range(start_class, end_class):\n        tf.logging.info(\"Running certification for adversarial class %d\", adv_class)\n        if adv_class == FLAGS.true_class:\n            continue\n\n        optimization_params = {\n            \"init_penalty\": FLAGS.init_penalty,\n            \"large_eig_num_steps\": FLAGS.large_eig_num_steps,\n            \"small_eig_num_steps\": FLAGS.small_eig_num_steps,\n            \"inner_num_steps\": FLAGS.inner_num_steps,\n            \"outer_num_steps\": FLAGS.outer_num_steps,\n            \"beta\": FLAGS.beta,\n            \"smoothness_parameter\": FLAGS.smoothness_parameter,\n            \"eig_learning_rate\": FLAGS.eig_learning_rate,\n            \"optimizer\": FLAGS.optimizer,\n            \"init_learning_rate\": FLAGS.init_learning_rate,\n            \"learning_rate_decay\": FLAGS.learning_rate_decay,\n            \"momentum_parameter\": FLAGS.momentum_parameter,\n            \"print_stats_steps\": FLAGS.print_stats_steps,\n            \"stats_folder\": FLAGS.stats_folder,\n            \"projection_steps\": FLAGS.projection_steps,\n            \"eig_type\": FLAGS.eig_type,\n            \"has_conv\": nn_params.has_conv,\n            \"lanczos_steps\": FLAGS.lanczos_steps,\n        }\n        lzs_params = {\"min_iter\": MIN_LANCZOS_ITER, \"max_iter\": FLAGS.lanczos_steps}\n        with tf.Session() as sess:\n            dual = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params,\n                test_input,\n                FLAGS.true_class,\n                adv_class,\n                FLAGS.input_minval,\n                FLAGS.input_maxval,\n                FLAGS.epsilon,\n                lzs_params,\n            )\n            optimization_object = optimization.Optimization(\n                dual, sess, optimization_params\n            )\n            is_cert_found = optimization_object.run_optimization()\n            if not is_cert_found:\n                print(\"Example could not be verified\")\n                exit()\n    print(\"Example successfully verified\")\n    print(\"Elapsed time: \" + str(time.time() - start_time))\n\n\nif __name__ == \"__main__\":\n    tf.app.run(main)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/dual_formulation.py",
    "content": "\"\"\"Code with dual formulation for certification problem.\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nfrom scipy.sparse.linalg import eigs, LinearOperator\nimport tensorflow as tf\nfrom tensorflow.contrib import autograph\nimport numpy as np\n\nfrom cleverhans.experimental.certification import utils\n\nflags = tf.app.flags\nFLAGS = flags.FLAGS\n\n# Tolerance value for eigenvalue computation\nTOL = 1e-5\n\n# Binary search constants\nMAX_BINARY_SEARCH_ITER = 10\nNU_UPDATE_CONSTANT = 1.3\n\n# Bound on lowest value of certificate to check for numerical errors\nLOWER_CERT_BOUND = -5.0\nDEFAULT_LZS_PARAMS = {\"min_iter\": 5, \"max_iter\": 50}\n\n\nclass DualFormulation(object):\n    \"\"\"DualFormulation is a class that creates the dual objective function\n    and access to matrix vector products for the matrix that is constrained\n    to be Positive semidefinite\n    \"\"\"\n\n    def __init__(\n        self,\n        sess,\n        dual_var,\n        neural_net_param_object,\n        test_input,\n        true_class,\n        adv_class,\n        input_minval,\n        input_maxval,\n        epsilon,\n        lzs_params=None,\n        project_dual=True,\n    ):\n        \"\"\"Initializes dual formulation class.\n\n        Args:\n          sess: Tensorflow session\n          dual_var: dictionary of dual variables containing a) lambda_pos\n            b) lambda_neg, c) lambda_quad, d) lambda_lu\n          neural_net_param_object: NeuralNetParam object created for the network\n            under consideration\n          test_input: clean example to certify around\n          true_class: the class label of the test input\n          adv_class: the label that the adversary tried to perturb input to\n          input_minval: minimum value of valid input range\n          input_maxval: maximum value of valid input range\n          epsilon: Size of the perturbation (scaled for [0, 1] input)\n          lzs_params: Parameters for Lanczos algorithm (dictionary) in the form:\n            {\n              'min_iter': 5\n              'max_iter': 50\n            }\n          project_dual: Whether we should create a projected dual object\n        \"\"\"\n        self.sess = sess\n        self.nn_params = neural_net_param_object\n        self.test_input = tf.convert_to_tensor(test_input, dtype=tf.float32)\n        self.true_class = true_class\n        self.adv_class = adv_class\n        self.input_minval = tf.convert_to_tensor(input_minval, dtype=tf.float32)\n        self.input_maxval = tf.convert_to_tensor(input_maxval, dtype=tf.float32)\n        self.epsilon = tf.convert_to_tensor(epsilon, dtype=tf.float32)\n        self.lzs_params = lzs_params or DEFAULT_LZS_PARAMS.copy()\n        self.final_linear = (\n            self.nn_params.final_weights[adv_class, :]\n            - self.nn_params.final_weights[true_class, :]\n        )\n        self.final_linear = tf.reshape(\n            self.final_linear, shape=[tf.size(self.final_linear), 1]\n        )\n        self.final_constant = (\n            self.nn_params.final_bias[adv_class] - self.nn_params.final_bias[true_class]\n        )\n        self.lanczos_dtype = tf.float64\n        self.nn_dtype = tf.float32\n\n        # Computing lower and upper bounds\n        # Note that lower and upper are of size nn_params.num_hidden_layers + 1\n        self.lower = []\n        self.upper = []\n\n        # Also computing pre activation lower and upper bounds\n        # to compute always-off and always-on units\n        self.pre_lower = []\n        self.pre_upper = []\n\n        # Initializing at the input layer with \\ell_\\infty constraints\n        self.lower.append(tf.maximum(self.test_input - self.epsilon, self.input_minval))\n        self.upper.append(tf.minimum(self.test_input + self.epsilon, self.input_maxval))\n        self.pre_lower.append(self.lower[0])\n        self.pre_upper.append(self.upper[0])\n\n        for i in range(0, self.nn_params.num_hidden_layers):\n            lo_plus_up = self.nn_params.forward_pass(self.lower[i] + self.upper[i], i)\n            lo_minus_up = self.nn_params.forward_pass(\n                self.lower[i] - self.upper[i], i, is_abs=True\n            )\n            up_minus_lo = self.nn_params.forward_pass(\n                self.upper[i] - self.lower[i], i, is_abs=True\n            )\n            current_lower = 0.5 * (lo_plus_up + lo_minus_up) + self.nn_params.biases[i]\n            current_upper = 0.5 * (lo_plus_up + up_minus_lo) + self.nn_params.biases[i]\n            self.pre_lower.append(current_lower)\n            self.pre_upper.append(current_upper)\n            self.lower.append(tf.nn.relu(current_lower))\n            self.upper.append(tf.nn.relu(current_upper))\n\n        # Run lower and upper because they don't change\n        self.pre_lower = self.sess.run(self.pre_lower)\n        self.pre_upper = self.sess.run(self.pre_upper)\n        self.lower = self.sess.run(self.lower)\n        self.upper = self.sess.run(self.upper)\n\n        # Using the preactivation lower and upper bounds\n        # to compute the linear regions\n        self.positive_indices = []\n        self.negative_indices = []\n        self.switch_indices = []\n\n        for i in range(0, self.nn_params.num_hidden_layers + 1):\n            # Positive index = 1 if the ReLU is always \"on\"\n            self.positive_indices.append(\n                np.asarray(self.pre_lower[i] >= 0, dtype=np.float32)\n            )\n            # Negative index = 1 if the ReLU is always off\n            self.negative_indices.append(\n                np.asarray(self.pre_upper[i] <= 0, dtype=np.float32)\n            )\n            # Switch index = 1 if the ReLU could be either on or off\n            self.switch_indices.append(\n                np.asarray(\n                    np.multiply(self.pre_lower[i], self.pre_upper[i]) < 0,\n                    dtype=np.float32,\n                )\n            )\n\n        # Computing the optimization terms\n        self.lambda_pos = [x for x in dual_var[\"lambda_pos\"]]\n        self.lambda_neg = [x for x in dual_var[\"lambda_neg\"]]\n        self.lambda_quad = [x for x in dual_var[\"lambda_quad\"]]\n        self.lambda_lu = [x for x in dual_var[\"lambda_lu\"]]\n        self.nu = dual_var[\"nu\"]\n        self.vector_g = None\n        self.scalar_f = None\n        self.matrix_h = None\n        self.matrix_m = None\n        self.matrix_m_dimension = 1 + np.sum(self.nn_params.sizes)\n\n        # The primal vector in the SDP can be thought of as [layer_1, layer_2..]\n        # In this concatenated version, dual_index[i] that marks the start\n        # of layer_i\n        # This is useful while computing implicit products with matrix H\n        self.dual_index = [0]\n        for i in range(self.nn_params.num_hidden_layers + 1):\n            self.dual_index.append(self.dual_index[-1] + self.nn_params.sizes[i])\n\n        # Construct objectives, matrices, and certificate\n        self.set_differentiable_objective()\n        if not self.nn_params.has_conv:\n            self.get_full_psd_matrix()\n\n        # Setup Lanczos functionality for compute certificate\n        self.construct_lanczos_params()\n\n        # Create projected dual object\n        if project_dual:\n            self.projected_dual = self.create_projected_dual()\n\n    def create_projected_dual(self):\n        \"\"\"Function to create variables for the projected dual object.\n        Function that projects the input dual variables onto the feasible set.\n        Returns:\n          projected_dual: Feasible dual solution corresponding to current dual\n        \"\"\"\n        # TODO: consider whether we can use shallow copy of the lists without\n        # using tf.identity\n        projected_nu = tf.placeholder(tf.float32, shape=[])\n        min_eig_h = tf.placeholder(tf.float32, shape=[])\n        projected_lambda_pos = [tf.identity(x) for x in self.lambda_pos]\n        projected_lambda_neg = [tf.identity(x) for x in self.lambda_neg]\n        projected_lambda_quad = [tf.identity(x) for x in self.lambda_quad]\n        projected_lambda_lu = [tf.identity(x) for x in self.lambda_lu]\n\n        for i in range(self.nn_params.num_hidden_layers + 1):\n            # Making H PSD\n            projected_lambda_lu[i] = (\n                self.lambda_lu[i] + 0.5 * tf.maximum(-min_eig_h, 0) + TOL\n            )\n            # Adjusting the value of \\lambda_neg to make change in g small\n            projected_lambda_neg[i] = self.lambda_neg[i] + tf.multiply(\n                (self.lower[i] + self.upper[i]),\n                (self.lambda_lu[i] - projected_lambda_lu[i]),\n            )\n            projected_lambda_neg[i] = tf.multiply(\n                self.negative_indices[i], projected_lambda_neg[i]\n            ) + tf.multiply(\n                self.switch_indices[i], tf.maximum(projected_lambda_neg[i], 0)\n            )\n\n        projected_dual_var = {\n            \"lambda_pos\": projected_lambda_pos,\n            \"lambda_neg\": projected_lambda_neg,\n            \"lambda_lu\": projected_lambda_lu,\n            \"lambda_quad\": projected_lambda_quad,\n            \"nu\": projected_nu,\n        }\n        projected_dual_object = DualFormulation(\n            self.sess,\n            projected_dual_var,\n            self.nn_params,\n            self.test_input,\n            self.true_class,\n            self.adv_class,\n            self.input_minval,\n            self.input_maxval,\n            self.epsilon,\n            self.lzs_params,\n            project_dual=False,\n        )\n        projected_dual_object.min_eig_val_h = min_eig_h\n        return projected_dual_object\n\n    def construct_lanczos_params(self):\n        \"\"\"Computes matrices T and V using the Lanczos algorithm.\n\n        Args:\n          k: number of iterations and dimensionality of the tridiagonal matrix\n        Returns:\n          eig_vec: eigen vector corresponding to min eigenvalue\n        \"\"\"\n        # Using autograph to automatically handle\n        # the control flow of minimum_eigen_vector\n        self.min_eigen_vec = autograph.to_graph(utils.tf_lanczos_smallest_eigval)\n\n        def _m_vector_prod_fn(x):\n            return self.get_psd_product(x, dtype=self.lanczos_dtype)\n\n        def _h_vector_prod_fn(x):\n            return self.get_h_product(x, dtype=self.lanczos_dtype)\n\n        # Construct nodes for computing eigenvalue of M\n        self.m_min_vec_estimate = np.zeros(\n            shape=(self.matrix_m_dimension, 1), dtype=np.float64\n        )\n        zeros_m = tf.zeros(shape=(self.matrix_m_dimension, 1), dtype=tf.float64)\n        self.m_min_vec_ph = tf.placeholder_with_default(\n            input=zeros_m, shape=(self.matrix_m_dimension, 1), name=\"m_min_vec_ph\"\n        )\n        self.m_min_eig, self.m_min_vec = self.min_eigen_vec(\n            _m_vector_prod_fn,\n            self.matrix_m_dimension,\n            self.m_min_vec_ph,\n            self.lzs_params[\"max_iter\"],\n            dtype=self.lanczos_dtype,\n        )\n        self.m_min_eig = tf.cast(self.m_min_eig, self.nn_dtype)\n        self.m_min_vec = tf.cast(self.m_min_vec, self.nn_dtype)\n\n        self.h_min_vec_estimate = np.zeros(\n            shape=(self.matrix_m_dimension - 1, 1), dtype=np.float64\n        )\n        zeros_h = tf.zeros(shape=(self.matrix_m_dimension - 1, 1), dtype=tf.float64)\n        self.h_min_vec_ph = tf.placeholder_with_default(\n            input=zeros_h, shape=(self.matrix_m_dimension - 1, 1), name=\"h_min_vec_ph\"\n        )\n        self.h_min_eig, self.h_min_vec = self.min_eigen_vec(\n            _h_vector_prod_fn,\n            self.matrix_m_dimension - 1,\n            self.h_min_vec_ph,\n            self.lzs_params[\"max_iter\"],\n            dtype=self.lanczos_dtype,\n        )\n        self.h_min_eig = tf.cast(self.h_min_eig, self.nn_dtype)\n        self.h_min_vec = tf.cast(self.h_min_vec, self.nn_dtype)\n\n    def set_differentiable_objective(self):\n        \"\"\"Function that constructs minimization objective from dual variables.\"\"\"\n        # Checking if graphs are already created\n        if self.vector_g is not None:\n            return\n\n        # Computing the scalar term\n        bias_sum = 0\n        for i in range(0, self.nn_params.num_hidden_layers):\n            bias_sum = bias_sum + tf.reduce_sum(\n                tf.multiply(self.nn_params.biases[i], self.lambda_pos[i + 1])\n            )\n        lu_sum = 0\n        for i in range(0, self.nn_params.num_hidden_layers + 1):\n            lu_sum = lu_sum + tf.reduce_sum(\n                tf.multiply(\n                    tf.multiply(self.lower[i], self.upper[i]), self.lambda_lu[i]\n                )\n            )\n\n        self.scalar_f = -bias_sum - lu_sum + self.final_constant\n\n        # Computing the vector term\n        g_rows = []\n        for i in range(0, self.nn_params.num_hidden_layers):\n            if i > 0:\n                current_row = (\n                    self.lambda_neg[i]\n                    + self.lambda_pos[i]\n                    - self.nn_params.forward_pass(\n                        self.lambda_pos[i + 1], i, is_transpose=True\n                    )\n                    + tf.multiply(self.lower[i] + self.upper[i], self.lambda_lu[i])\n                    + tf.multiply(self.lambda_quad[i], self.nn_params.biases[i - 1])\n                )\n            else:\n                current_row = -self.nn_params.forward_pass(\n                    self.lambda_pos[i + 1], i, is_transpose=True\n                ) + tf.multiply(self.lower[i] + self.upper[i], self.lambda_lu[i])\n            g_rows.append(current_row)\n\n        # Term for final linear term\n        g_rows.append(\n            (\n                self.lambda_pos[self.nn_params.num_hidden_layers]\n                + self.lambda_neg[self.nn_params.num_hidden_layers]\n                + self.final_linear\n                + tf.multiply(\n                    (\n                        self.lower[self.nn_params.num_hidden_layers]\n                        + self.upper[self.nn_params.num_hidden_layers]\n                    ),\n                    self.lambda_lu[self.nn_params.num_hidden_layers],\n                )\n                + tf.multiply(\n                    self.lambda_quad[self.nn_params.num_hidden_layers],\n                    self.nn_params.biases[self.nn_params.num_hidden_layers - 1],\n                )\n            )\n        )\n        self.vector_g = tf.concat(g_rows, axis=0)\n        self.unconstrained_objective = self.scalar_f + 0.5 * self.nu\n\n    def get_h_product(self, vector, dtype=None):\n        \"\"\"Function that provides matrix product interface with PSD matrix.\n\n        Args:\n          vector: the vector to be multiplied with matrix H\n\n        Returns:\n          result_product: Matrix product of H and vector\n        \"\"\"\n        # Computing the product of matrix_h with beta (input vector)\n        # At first layer, h is simply diagonal\n        if dtype is None:\n            dtype = self.nn_dtype\n        beta = tf.cast(vector, self.nn_dtype)\n        h_beta_rows = []\n        for i in range(self.nn_params.num_hidden_layers):\n            # Split beta of this block into [gamma, delta]\n            gamma = beta[self.dual_index[i] : self.dual_index[i + 1]]\n            delta = beta[self.dual_index[i + 1] : self.dual_index[i + 2]]\n\n            # Expanding the product with diagonal matrices\n            if i == 0:\n                h_beta_rows.append(\n                    tf.multiply(2 * self.lambda_lu[i], gamma)\n                    - self.nn_params.forward_pass(\n                        tf.multiply(self.lambda_quad[i + 1], delta),\n                        i,\n                        is_transpose=True,\n                    )\n                )\n            else:\n                h_beta_rows[i] = (\n                    h_beta_rows[i]\n                    + tf.multiply(self.lambda_quad[i] + self.lambda_lu[i], gamma)\n                    - self.nn_params.forward_pass(\n                        tf.multiply(self.lambda_quad[i + 1], delta),\n                        i,\n                        is_transpose=True,\n                    )\n                )\n\n            new_row = tf.multiply(\n                self.lambda_quad[i + 1] + self.lambda_lu[i + 1], delta\n            ) - tf.multiply(\n                self.lambda_quad[i + 1], self.nn_params.forward_pass(gamma, i)\n            )\n            h_beta_rows.append(new_row)\n\n        # Last boundary case\n        h_beta_rows[self.nn_params.num_hidden_layers] = h_beta_rows[\n            self.nn_params.num_hidden_layers\n        ] + tf.multiply(\n            (\n                self.lambda_quad[self.nn_params.num_hidden_layers]\n                + self.lambda_lu[self.nn_params.num_hidden_layers]\n            ),\n            delta,\n        )\n\n        h_beta = tf.concat(h_beta_rows, axis=0)\n        return tf.cast(h_beta, dtype)\n\n    def get_psd_product(self, vector, dtype=None):\n        \"\"\"Function that provides matrix product interface with PSD matrix.\n\n        Args:\n          vector: the vector to be multiplied with matrix M\n\n        Returns:\n          result_product: Matrix product of M and vector\n        \"\"\"\n        # For convenience, think of x as [\\alpha, \\beta]\n        if dtype is None:\n            dtype = self.nn_dtype\n        vector = tf.cast(vector, self.nn_dtype)\n        alpha = tf.reshape(vector[0], shape=[1, 1])\n        beta = vector[1:]\n        # Computing the product of matrix_h with beta part of vector\n        # At first layer, h is simply diagonal\n        h_beta = self.get_h_product(beta)\n\n        # Constructing final result using vector_g\n        result = tf.concat(\n            [\n                alpha * self.nu + tf.reduce_sum(tf.multiply(beta, self.vector_g)),\n                tf.multiply(alpha, self.vector_g) + h_beta,\n            ],\n            axis=0,\n        )\n        return tf.cast(result, dtype)\n\n    def get_full_psd_matrix(self):\n        \"\"\"Function that returns the tf graph corresponding to the entire matrix M.\n\n        Returns:\n          matrix_h: unrolled version of tf matrix corresponding to H\n          matrix_m: unrolled tf matrix corresponding to M\n        \"\"\"\n        if self.matrix_m is not None:\n            return self.matrix_h, self.matrix_m\n\n        # Computing the matrix term\n        h_columns = []\n        for i in range(self.nn_params.num_hidden_layers + 1):\n            current_col_elems = []\n            for j in range(i):\n                current_col_elems.append(\n                    tf.zeros([self.nn_params.sizes[j], self.nn_params.sizes[i]])\n                )\n\n            # For the first layer, there is no relu constraint\n            if i == 0:\n                current_col_elems.append(utils.diag(self.lambda_lu[i]))\n            else:\n                current_col_elems.append(\n                    utils.diag(self.lambda_lu[i] + self.lambda_quad[i])\n                )\n            if i < self.nn_params.num_hidden_layers:\n                current_col_elems.append(\n                    tf.matmul(\n                        utils.diag(-1 * self.lambda_quad[i + 1]),\n                        self.nn_params.weights[i],\n                    )\n                )\n            for j in range(i + 2, self.nn_params.num_hidden_layers + 1):\n                current_col_elems.append(\n                    tf.zeros([self.nn_params.sizes[j], self.nn_params.sizes[i]])\n                )\n            current_column = tf.concat(current_col_elems, 0)\n            h_columns.append(current_column)\n\n        self.matrix_h = tf.concat(h_columns, 1)\n        self.matrix_h = self.matrix_h + tf.transpose(self.matrix_h)\n\n        self.matrix_m = tf.concat(\n            [\n                tf.concat(\n                    [tf.reshape(self.nu, (1, 1)), tf.transpose(self.vector_g)], axis=1\n                ),\n                tf.concat([self.vector_g, self.matrix_h], axis=1),\n            ],\n            axis=0,\n        )\n        return self.matrix_h, self.matrix_m\n\n    def make_m_psd(self, original_nu, feed_dictionary):\n        \"\"\"Run binary search to find a value for nu that makes M PSD\n        Args:\n          original_nu: starting value of nu to do binary search on\n          feed_dictionary: dictionary of updated lambda variables to feed into M\n        Returns:\n          new_nu: new value of nu\n        \"\"\"\n        feed_dict = feed_dictionary.copy()\n        _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict)\n\n        lower_nu = original_nu\n        upper_nu = original_nu\n        num_iter = 0\n\n        # Find an upper bound on nu\n        while min_eig_val_m - TOL < 0 and num_iter < (MAX_BINARY_SEARCH_ITER / 2):\n            num_iter += 1\n            upper_nu *= NU_UPDATE_CONSTANT\n            feed_dict.update({self.nu: upper_nu})\n            _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict)\n\n        final_nu = upper_nu\n\n        # Perform binary search to find best value of nu\n        while lower_nu <= upper_nu and num_iter < MAX_BINARY_SEARCH_ITER:\n            num_iter += 1\n            mid_nu = (lower_nu + upper_nu) / 2\n            feed_dict.update({self.nu: mid_nu})\n            _, min_eig_val_m = self.get_lanczos_eig(compute_m=True, feed_dict=feed_dict)\n            if min_eig_val_m - TOL < 0:\n                lower_nu = mid_nu\n            else:\n                upper_nu = mid_nu\n\n        final_nu = upper_nu\n\n        return final_nu\n\n    def get_lanczos_eig(self, compute_m=True, feed_dict=None):\n        \"\"\"Computes the min eigen value and corresponding vector of matrix M or H\n        using the Lanczos algorithm.\n        Args:\n          compute_m: boolean to determine whether we should compute eig val/vec\n            for M or for H. True for M; False for H.\n          feed_dict: dictionary mapping from TF placeholders to values (optional)\n        Returns:\n          min_eig_vec: Corresponding eigen vector to min eig val\n          eig_val: Minimum eigen value\n        \"\"\"\n        if compute_m:\n            min_eig, min_vec = self.sess.run(\n                [self.m_min_eig, self.m_min_vec], feed_dict=feed_dict\n            )\n\n        else:\n            min_eig, min_vec = self.sess.run(\n                [self.h_min_eig, self.h_min_vec], feed_dict=feed_dict\n            )\n\n        return min_vec, min_eig\n\n    def compute_certificate(self, current_step, feed_dictionary):\n        \"\"\"Function to compute the certificate based either current value\n        or dual variables loaded from dual folder\"\"\"\n        feed_dict = feed_dictionary.copy()\n        nu = feed_dict[self.nu]\n        second_term = self.make_m_psd(nu, feed_dict)\n        tf.logging.info(\"Nu after modifying: \" + str(second_term))\n        feed_dict.update({self.nu: second_term})\n        computed_certificate = self.sess.run(\n            self.unconstrained_objective, feed_dict=feed_dict\n        )\n\n        tf.logging.info(\n            \"Inner step: %d, current value of certificate: %f\",\n            current_step,\n            computed_certificate,\n        )\n\n        # Sometimes due to either overflow or instability in inverses,\n        # the returned certificate is large and negative -- keeping a check\n        if LOWER_CERT_BOUND < computed_certificate < 0:\n            _, min_eig_val_m = self.get_lanczos_eig(feed_dict=feed_dict)\n            tf.logging.info(\"min eig val from lanczos: \" + str(min_eig_val_m))\n            input_vector_m = tf.placeholder(\n                tf.float32, shape=(self.matrix_m_dimension, 1)\n            )\n            output_vector_m = self.get_psd_product(input_vector_m)\n\n            def np_vector_prod_fn_m(np_vector):\n                np_vector = np.reshape(np_vector, [-1, 1])\n                feed_dict.update({input_vector_m: np_vector})\n                output_np_vector = self.sess.run(output_vector_m, feed_dict=feed_dict)\n                return output_np_vector\n\n            linear_operator_m = LinearOperator(\n                (self.matrix_m_dimension, self.matrix_m_dimension),\n                matvec=np_vector_prod_fn_m,\n            )\n            # Performing shift invert scipy operation when eig val estimate is available\n            min_eig_val_m_scipy, _ = eigs(linear_operator_m, k=1, which=\"SR\", tol=TOL)\n\n            tf.logging.info(\"min eig val m from scipy: \" + str(min_eig_val_m_scipy))\n\n            if min_eig_val_m - TOL > 0:\n                tf.logging.info(\"Found certificate of robustness!\")\n                return True\n\n        return False\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/nn.py",
    "content": "\"\"\"This file defines the neural network class, where a network is reinitialized from configuration files.\n\nThe class also has a forward propagation method.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport json\nimport numpy as np\nimport tensorflow as tf\n\n\nclass NeuralNetwork(object):\n    \"\"\"NeuralNetwork is a class that interfaces the verification code with\n    the neural net parameters (weights).\n    \"\"\"\n\n    def __init__(\n        self,\n        net_weights,\n        net_biases,\n        net_layer_types,\n        input_shape=None,\n        cnn_params=None,\n    ):\n        \"\"\"Function to initialize NeuralNetParams class.\n\n        Args:\n          net_weights: list of numpy matrices of weights of each layer\n           [convention: x[i+1] = W[i] x[i]\n          net_biases: list of numpy arrays of biases of each layer\n          net_layer_types: type of each layer ['ff' or 'ff_relu' or 'ff_conv' or\n            'ff_conv_relu']\n\n            'ff': Simple feedforward layer with no activations\n            'ff_relu': Simple feedforward layer with ReLU activations\n            'ff_conv': Convolution layer with no activation\n            'ff_conv_relu': Convolution layer with ReLU activation\n          input_shape: [num_rows, num_columns, num_channels] at the input layer\n          cnn_params: list of dictionaries containing stride and padding for\n            each layer\n\n        Raises:\n          ValueError: the input lists of net params are not of the same length\n        \"\"\"\n        if (len(net_weights) != len(net_biases)) or len(net_biases) != len(\n            net_layer_types\n        ):\n            raise ValueError(\"Inputs of net params are not of same length ....\")\n        if net_layer_types[len(net_layer_types) - 1] != \"ff\":\n            raise ValueError(\"Final layer is not linear\")\n        self.num_hidden_layers = len(net_weights) - 1\n        self.weights = []\n        self.biases = []\n        self.layer_types = []\n        self.sizes = []\n        self.input_shapes = []\n        self.output_shapes = []\n        self.has_conv = False\n        if input_shape is not None:\n            current_num_rows = input_shape[0]\n            current_num_columns = input_shape[1]\n            current_num_channels = input_shape[2]\n        self.cnn_params = cnn_params\n\n        # Setting the sizes of the layers of the network\n        # sizes[i] contains the size of x_i\n        for i in range(self.num_hidden_layers):\n            shape = np.shape(net_weights[i])\n            self.weights.append(tf.convert_to_tensor(net_weights[i], dtype=tf.float32))\n            self.layer_types.append(net_layer_types[i])\n\n            if self.layer_types[i] in {\"ff\", \"ff_relu\"}:\n                self.sizes.append(int(shape[1]))\n                # For feedforward networks, no unraveling the bias terms\n\n                small_bias = tf.convert_to_tensor(net_biases[i], dtype=tf.float32)\n                self.biases.append(tf.reshape(small_bias, [-1, 1]))\n                # Assumes that x^{i+1} = W_i x^i\n                self.input_shapes.append([int(shape[1]), 1])\n                self.output_shapes.append([int(shape[0]), 1])\n\n            # Convolution type\n            else:\n                self.has_conv = True\n                num_filters = shape[3]\n                self.input_shapes.append(\n                    [1, current_num_rows, current_num_columns, current_num_channels]\n                )\n                self.sizes.append(\n                    current_num_rows * current_num_columns * current_num_channels\n                )\n                current_num_channels = num_filters\n                # For propagating across multiple conv layers\n                if self.cnn_params[i][\"padding\"] == \"SAME\":\n                    current_num_rows = int(\n                        current_num_rows / self.cnn_params[i][\"stride\"]\n                    )\n                    current_num_columns = int(\n                        current_num_columns / self.cnn_params[i][\"stride\"]\n                    )\n                self.output_shapes.append(\n                    [1, current_num_rows, current_num_columns, current_num_channels]\n                )\n\n                # For conv networks, unraveling the bias terms\n                small_bias = tf.convert_to_tensor(net_biases[i], dtype=tf.float32)\n                large_bias = tf.tile(\n                    tf.reshape(small_bias, [-1, 1]),\n                    [current_num_rows * current_num_columns, 1],\n                )\n                self.biases.append(large_bias)\n\n        # Last layer shape: always ff\n        if self.has_conv:\n            final_dim = int(np.shape(net_weights[self.num_hidden_layers])[1])\n            self.input_shapes.append([final_dim, 1])\n\n        else:\n            final_dim = int(np.shape(net_weights[self.num_hidden_layers - 1])[0])\n\n        self.sizes.append(final_dim)\n        self.final_weights = tf.convert_to_tensor(\n            net_weights[self.num_hidden_layers], dtype=tf.float32\n        )\n        self.final_bias = tf.convert_to_tensor(\n            net_biases[self.num_hidden_layers], dtype=tf.float32\n        )\n\n    def forward_pass(self, vector, layer_index, is_transpose=False, is_abs=False):\n        \"\"\"Performs forward pass through the layer weights at layer_index.\n\n        Args:\n          vector: vector that has to be passed through in forward pass\n          layer_index: index of the layer\n          is_transpose: whether the weights of the layer have to be transposed\n          is_abs: whether to take the absolute value of the weights\n\n        Returns:\n          tensor that corresponds to the forward pass through the layer\n        Raises:\n          ValueError: if the layer_index is negative or more than num hidden layers\n        \"\"\"\n        if layer_index < 0 or layer_index > self.num_hidden_layers:\n            raise ValueError(\"Invalid layer index\")\n\n        layer_type = self.layer_types[layer_index]\n        weight = self.weights[layer_index]\n        if is_abs:\n            weight = tf.abs(weight)\n        if is_transpose:\n            vector = tf.reshape(vector, self.output_shapes[layer_index])\n        else:\n            vector = tf.reshape(vector, self.input_shapes[layer_index])\n\n        if layer_type in {\"ff\", \"ff_relu\"}:\n            if is_transpose:\n                weight = tf.transpose(weight)\n            return_vector = tf.matmul(weight, vector)\n        elif layer_type in {\"conv\", \"conv_relu\"}:\n            if is_transpose:\n                return_vector = tf.nn.conv2d_transpose(\n                    vector,\n                    weight,\n                    output_shape=self.input_shapes[layer_index],\n                    strides=[\n                        1,\n                        self.cnn_params[layer_index][\"stride\"],\n                        self.cnn_params[layer_index][\"stride\"],\n                        1,\n                    ],\n                    padding=self.cnn_params[layer_index][\"padding\"],\n                )\n            else:\n                return_vector = tf.nn.conv2d(\n                    vector,\n                    weight,\n                    strides=[\n                        1,\n                        self.cnn_params[layer_index][\"stride\"],\n                        self.cnn_params[layer_index][\"stride\"],\n                        1,\n                    ],\n                    padding=self.cnn_params[layer_index][\"padding\"],\n                )\n        else:\n            raise NotImplementedError(\"Unsupported layer type: {0}\".format(layer_type))\n        if is_transpose:\n            return tf.reshape(return_vector, (self.sizes[layer_index], 1))\n        return tf.reshape(return_vector, (self.sizes[layer_index + 1], 1))\n\n\ndef load_network_from_checkpoint(checkpoint, model_json, input_shape=None):\n    \"\"\"Function to read the weights from checkpoint based on json description.\n\n    Args:\n      checkpoint: tensorflow checkpoint with trained model to\n        verify\n      model_json: path of json file with model description of\n        the network list of dictionary items for each layer\n        containing 'type', 'weight_var', 'bias_var' and\n        'is_transpose' 'type'is one of {'ff', 'ff_relu' or\n        'conv'}; 'weight_var' is the name of tf variable for\n        weights of layer i; 'bias_var' is the name of tf\n        variable for bias of layer i; 'is_transpose' is set to\n        True if the weights have to be transposed as per\n        convention Note that last layer is always feedforward\n      net_weights: list of numpy matrices of weights of each layer\n        convention: x[i+1] = W[i] x[i]\n      net_biases: list of numpy arrays of biases of each layer\n      net_layer_types: type of each layer ['ff' or 'ff_relu' or 'ff_conv'\n        or 'ff_conv_relu']\n        'ff': Simple feedforward layer with no activations\n        'ff_relu': Simple feedforward layer with ReLU activations\n        'ff_conv': Convolution layer with no activation\n        'ff_conv_relu': Convolution layer with ReLU activation\n\n    Raises:\n      ValueError: If layer_types are invalid or variable names\n        not found in checkpoint\n    \"\"\"\n    # Load checkpoint\n    reader = tf.train.load_checkpoint(checkpoint)\n    variable_map = reader.get_variable_to_shape_map()\n    checkpoint_variable_names = variable_map.keys()\n    # Parse JSON file for names\n    with tf.gfile.Open(model_json) as f:\n        list_model_var = json.load(f)\n\n    net_layer_types = []\n    net_weights = []\n    net_biases = []\n    cnn_params = []\n\n    # Checking validity of the input and adding to list\n    for layer_model_var in list_model_var:\n        if layer_model_var[\"type\"] not in {\"ff\", \"ff_relu\", \"conv\"}:\n            raise ValueError(\"Invalid layer type in description\")\n        if (\n            layer_model_var[\"weight_var\"] not in checkpoint_variable_names\n            or layer_model_var[\"bias_var\"] not in checkpoint_variable_names\n        ):\n            raise ValueError(\"Variable names not found in checkpoint\")\n        net_layer_types.append(layer_model_var[\"type\"])\n        layer_weight = reader.get_tensor(layer_model_var[\"weight_var\"])\n        layer_bias = reader.get_tensor(layer_model_var[\"bias_var\"])\n        # TODO(aditirag): is there a way to automatically check when to transpose\n        # We want weights W such that x^{i+1} = W^i x^i + b^i\n        # Can think of a hack involving matching shapes but if shapes are equal\n        # it can be ambiguous\n        if layer_model_var[\"type\"] in {\"ff\", \"ff_relu\"}:\n            layer_weight = np.transpose(layer_weight)\n            cnn_params.append(None)\n        if layer_model_var[\"type\"] in {\"conv\"}:\n            if \"stride\" not in layer_model_var or \"padding\" not in layer_model_var:\n                raise ValueError(\"Please define stride and padding for conv layers.\")\n            cnn_params.append(\n                {\n                    \"stride\": layer_model_var[\"stride\"],\n                    \"padding\": layer_model_var[\"padding\"],\n                }\n            )\n        net_weights.append(layer_weight)\n        net_biases.append(np.reshape(layer_bias, (np.size(layer_bias), 1)))\n    return NeuralNetwork(\n        net_weights, net_biases, net_layer_types, input_shape, cnn_params\n    )\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/optimization.py",
    "content": "\"\"\"Code for setting up the optimization problem for certification.\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport json\nimport os\nimport numpy as np\n\nfrom scipy.sparse.linalg import eigs, LinearOperator\nimport tensorflow as tf\nfrom tensorflow.contrib import autograph\nfrom cleverhans.experimental.certification import utils\n\nUPDATE_PARAM_CONSTANT = -0.1\n# Tolerance value for eigenvalue computation\nTOL = 1e-5\n\n\nclass Optimization(object):\n    \"\"\"Class that sets up and runs the optimization of dual_formulation\"\"\"\n\n    def __init__(self, dual_formulation_object, sess, optimization_params):\n        \"\"\"Initialize the class variables.\n\n        Args:\n          dual_formulation_object: Instance of DualFormulation that contains the\n            dual variables and objective\n          sess: tf session to be used to run\n          optimization_params: Dictionary with the following\n            eig_num_iter - Number of iterations to run for computing minimum eigen\n              value\n            eig_learning_rate - Learning rate for minimum eigen value iterations\n            init_smooth - Starting value of the smoothness parameter (typically\n            around 0.001)\n            smooth_decay - The factor by which to decay after every outer loop epoch\n            optimizer - one of gd, adam, momentum or adagrad\n            eig_type - The method to compute eigenvalues (TF or SCIPY)\n        \"\"\"\n        self.sess = sess\n        self.dual_object = dual_formulation_object\n        self.params = optimization_params\n        self.penalty_placeholder = tf.placeholder(tf.float32, shape=[])\n\n        # The dimensionality of matrix M is the sum of sizes of all layers + 1\n        # The + 1 comes due to a row and column of M representing the linear terms\n        self.eig_init_vec_placeholder = tf.placeholder(\n            tf.float32, shape=[1 + self.dual_object.dual_index[-1], 1]\n        )\n        self.smooth_placeholder = tf.placeholder(tf.float32, shape=[])\n        self.eig_num_iter_placeholder = tf.placeholder(tf.int32, shape=[])\n        self.current_eig_val_estimate = None\n\n        # Create graph for optimization\n        self.prepare_for_optimization()\n\n    def tf_min_eig_vec(self):\n        \"\"\"Function for min eigen vector using tf's full eigen decomposition.\"\"\"\n        # Full eigen decomposition requires the explicit psd matrix M\n        _, matrix_m = self.dual_object.get_full_psd_matrix()\n        [eig_vals, eig_vectors] = tf.self_adjoint_eig(matrix_m)\n        index = tf.argmin(eig_vals)\n        return tf.reshape(eig_vectors[:, index], shape=[eig_vectors.shape[0].value, 1])\n\n    def tf_smooth_eig_vec(self):\n        \"\"\"Function that returns smoothed version of min eigen vector.\"\"\"\n        _, matrix_m = self.dual_object.get_full_psd_matrix()\n        # Easier to think in terms of max so negating the matrix\n        [eig_vals, eig_vectors] = tf.self_adjoint_eig(-matrix_m)\n        exp_eig_vals = tf.exp(tf.divide(eig_vals, self.smooth_placeholder))\n        scaling_factor = tf.reduce_sum(exp_eig_vals)\n        # Multiplying each eig vector by exponential of corresponding eig value\n        # Scaling factor normalizes the vector to be unit norm\n        eig_vec_smooth = tf.divide(\n            tf.matmul(eig_vectors, tf.diag(tf.sqrt(exp_eig_vals))),\n            tf.sqrt(scaling_factor),\n        )\n        return tf.reshape(\n            tf.reduce_sum(eig_vec_smooth, axis=1),\n            shape=[eig_vec_smooth.shape[0].value, 1],\n        )\n\n    def get_min_eig_vec_proxy(self, use_tf_eig=False):\n        \"\"\"Computes the min eigen value and corresponding vector of matrix M.\n\n        Args:\n          use_tf_eig: Whether to use tf's default full eigen decomposition\n        Returns:\n          eig_vec: Minimum absolute eigen value\n          eig_val: Corresponding eigen vector\n        \"\"\"\n        if use_tf_eig:\n            # If smoothness parameter is too small, essentially no smoothing\n            # Just output the eigen vector corresponding to min\n            return tf.cond(\n                self.smooth_placeholder < 1e-8,\n                self.tf_min_eig_vec,\n                self.tf_smooth_eig_vec,\n            )\n\n        # Using autograph to automatically handle\n        # the control flow of minimum_eigen_vector\n        min_eigen_tf = autograph.to_graph(utils.minimum_eigen_vector)\n\n        def _vector_prod_fn(x):\n            return self.dual_object.get_psd_product(x)\n\n        estimated_eigen_vector = min_eigen_tf(\n            x=self.eig_init_vec_placeholder,\n            num_steps=self.eig_num_iter_placeholder,\n            learning_rate=self.params[\"eig_learning_rate\"],\n            vector_prod_fn=_vector_prod_fn,\n        )\n        return estimated_eigen_vector\n\n    def get_scipy_eig_vec(self):\n        \"\"\"Computes scipy estimate of min eigenvalue for matrix M.\n\n        Returns:\n          eig_vec: Minimum absolute eigen value\n          eig_val: Corresponding eigen vector\n        \"\"\"\n        if not self.params[\"has_conv\"]:\n            matrix_m = self.sess.run(self.dual_object.matrix_m)\n            min_eig_vec_val, estimated_eigen_vector = eigs(\n                matrix_m, k=1, which=\"SR\", tol=1e-4\n            )\n            min_eig_vec_val = np.reshape(np.real(min_eig_vec_val), [1, 1])\n            return np.reshape(estimated_eigen_vector, [-1, 1]), min_eig_vec_val\n        else:\n            dim = self.dual_object.matrix_m_dimension\n            input_vector = tf.placeholder(tf.float32, shape=(dim, 1))\n            output_vector = self.dual_object.get_psd_product(input_vector)\n\n            def np_vector_prod_fn(np_vector):\n                np_vector = np.reshape(np_vector, [-1, 1])\n                output_np_vector = self.sess.run(\n                    output_vector, feed_dict={input_vector: np_vector}\n                )\n                return output_np_vector\n\n            linear_operator = LinearOperator((dim, dim), matvec=np_vector_prod_fn)\n            # Performing shift invert scipy operation when eig val estimate is available\n            min_eig_vec_val, estimated_eigen_vector = eigs(\n                linear_operator, k=1, which=\"SR\", tol=1e-4\n            )\n            min_eig_vec_val = np.reshape(np.real(min_eig_vec_val), [1, 1])\n            return np.reshape(estimated_eigen_vector, [-1, 1]), min_eig_vec_val\n\n    def prepare_for_optimization(self):\n        \"\"\"Create tensorflow op for running one step of descent.\"\"\"\n        if self.params[\"eig_type\"] == \"TF\":\n            self.eig_vec_estimate = self.get_min_eig_vec_proxy()\n        elif self.params[\"eig_type\"] == \"LZS\":\n            self.eig_vec_estimate = self.dual_object.m_min_vec\n        else:\n            self.eig_vec_estimate = tf.placeholder(\n                tf.float32, shape=(self.dual_object.matrix_m_dimension, 1)\n            )\n        self.stopped_eig_vec_estimate = tf.stop_gradient(self.eig_vec_estimate)\n        # Eig value is v^\\top M v, where v is eigen vector\n        self.eig_val_estimate = tf.matmul(\n            tf.transpose(self.stopped_eig_vec_estimate),\n            self.dual_object.get_psd_product(self.stopped_eig_vec_estimate),\n        )\n        # Penalizing negative of min eigen value because we want min eig value\n        # to be positive\n        self.total_objective = (\n            self.dual_object.unconstrained_objective\n            + 0.5\n            * tf.square(\n                tf.maximum(-self.penalty_placeholder * self.eig_val_estimate, 0)\n            )\n        )\n        global_step = tf.Variable(0, trainable=False)\n        # Set up learning rate as a placeholder\n        self.learning_rate = tf.placeholder(tf.float32, shape=[])\n\n        # Set up the optimizer\n        if self.params[\"optimizer\"] == \"adam\":\n            self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)\n        elif self.params[\"optimizer\"] == \"adagrad\":\n            self.optimizer = tf.train.AdagradOptimizer(learning_rate=self.learning_rate)\n        elif self.params[\"optimizer\"] == \"momentum\":\n            self.optimizer = tf.train.MomentumOptimizer(\n                learning_rate=self.learning_rate,\n                momentum=self.params[\"momentum_parameter\"],\n                use_nesterov=True,\n            )\n        else:\n            self.optimizer = tf.train.GradientDescentOptimizer(\n                learning_rate=self.learning_rate\n            )\n\n        # Write out the projection step\n        self.train_step = self.optimizer.minimize(\n            self.total_objective, global_step=global_step\n        )\n\n        self.sess.run(tf.global_variables_initializer())\n\n        # Projecting the dual variables\n        proj_ops = []\n        for i in range(self.dual_object.nn_params.num_hidden_layers + 1):\n            # Lambda_pos is non negative for switch indices,\n            # Unconstrained for positive indices\n            # Zero for negative indices\n            proj_ops.append(\n                self.dual_object.lambda_pos[i].assign(\n                    tf.multiply(\n                        self.dual_object.positive_indices[i],\n                        self.dual_object.lambda_pos[i],\n                    )\n                    + tf.multiply(\n                        self.dual_object.switch_indices[i],\n                        tf.nn.relu(self.dual_object.lambda_pos[i]),\n                    )\n                )\n            )\n            proj_ops.append(\n                self.dual_object.lambda_neg[i].assign(\n                    tf.multiply(\n                        self.dual_object.negative_indices[i],\n                        self.dual_object.lambda_neg[i],\n                    )\n                    + tf.multiply(\n                        self.dual_object.switch_indices[i],\n                        tf.nn.relu(self.dual_object.lambda_neg[i]),\n                    )\n                )\n            )\n            # Lambda_quad is only non zero and positive for switch\n            proj_ops.append(\n                self.dual_object.lambda_quad[i].assign(\n                    tf.multiply(\n                        self.dual_object.switch_indices[i],\n                        tf.nn.relu(self.dual_object.lambda_quad[i]),\n                    )\n                )\n            )\n            # Lambda_lu is always non negative\n            proj_ops.append(\n                self.dual_object.lambda_lu[i].assign(\n                    tf.nn.relu(self.dual_object.lambda_lu[i])\n                )\n            )\n\n        self.proj_step = tf.group(proj_ops)\n\n        # Create folder for saving stats if the folder is not None\n        if self.params.get(\"stats_folder\") and not tf.gfile.IsDirectory(\n            self.params[\"stats_folder\"]\n        ):\n            tf.gfile.MkDir(self.params[\"stats_folder\"])\n\n    def run_one_step(\n        self,\n        eig_init_vec_val,\n        eig_num_iter_val,\n        smooth_val,\n        penalty_val,\n        learning_rate_val,\n    ):\n        \"\"\"Run one step of gradient descent for optimization.\n\n        Args:\n          eig_init_vec_val: Start value for eigen value computations\n          eig_num_iter_val: Number of iterations to run for eigen computations\n          smooth_val: Value of smoothness parameter\n          penalty_val: Value of penalty for the current step\n          learning_rate_val: Value of learning rate\n        Returns:\n         found_cert: True is negative certificate is found, False otherwise\n        \"\"\"\n        # Running step\n        step_feed_dict = {\n            self.eig_init_vec_placeholder: eig_init_vec_val,\n            self.eig_num_iter_placeholder: eig_num_iter_val,\n            self.smooth_placeholder: smooth_val,\n            self.penalty_placeholder: penalty_val,\n            self.learning_rate: learning_rate_val,\n        }\n\n        if self.params[\"eig_type\"] == \"SCIPY\":\n            current_eig_vector, self.current_eig_val_estimate = self.get_scipy_eig_vec()\n            step_feed_dict.update({self.eig_vec_estimate: current_eig_vector})\n        elif self.params[\"eig_type\"] == \"LZS\":\n            step_feed_dict.update(\n                {self.dual_object.m_min_vec_ph: self.dual_object.m_min_vec_estimate}\n            )\n\n        self.sess.run(self.train_step, feed_dict=step_feed_dict)\n\n        [\n            _,\n            self.dual_object.m_min_vec_estimate,\n            self.current_eig_val_estimate,\n        ] = self.sess.run(\n            [self.proj_step, self.eig_vec_estimate, self.eig_val_estimate],\n            feed_dict=step_feed_dict,\n        )\n\n        if self.current_step % self.params[\"print_stats_steps\"] == 0:\n            [\n                self.current_total_objective,\n                self.current_unconstrained_objective,\n                self.dual_object.m_min_vec_estimate,\n                self.current_eig_val_estimate,\n                self.current_nu,\n            ] = self.sess.run(\n                [\n                    self.total_objective,\n                    self.dual_object.unconstrained_objective,\n                    self.eig_vec_estimate,\n                    self.eig_val_estimate,\n                    self.dual_object.nu,\n                ],\n                feed_dict=step_feed_dict,\n            )\n\n            stats = {\n                \"total_objective\": float(self.current_total_objective),\n                \"unconstrained_objective\": float(self.current_unconstrained_objective),\n                \"min_eig_val_estimate\": float(self.current_eig_val_estimate),\n            }\n            tf.logging.info(\n                \"Current inner step: %d, optimization stats: %s\",\n                self.current_step,\n                stats,\n            )\n            if self.params[\"stats_folder\"] is not None:\n                stats = json.dumps(stats)\n                filename = os.path.join(\n                    self.params[\"stats_folder\"], str(self.current_step) + \".json\"\n                )\n                with tf.gfile.Open(filename) as file_f:\n                    file_f.write(stats)\n\n        # Project onto feasible set of dual variables\n        if (\n            self.current_step % self.params[\"projection_steps\"] == 0\n            and self.current_unconstrained_objective < 0\n        ):\n            nu = self.sess.run(self.dual_object.nu)\n            dual_feed_dict = {\n                self.dual_object.h_min_vec_ph: self.dual_object.h_min_vec_estimate\n            }\n            _, min_eig_val_h_lz = self.dual_object.get_lanczos_eig(\n                compute_m=False, feed_dict=dual_feed_dict\n            )\n            projected_dual_feed_dict = {\n                self.dual_object.projected_dual.nu: nu,\n                self.dual_object.projected_dual.min_eig_val_h: min_eig_val_h_lz,\n            }\n            if self.dual_object.projected_dual.compute_certificate(\n                self.current_step, projected_dual_feed_dict\n            ):\n                return True\n\n        return False\n\n    def run_optimization(self):\n        \"\"\"Run the optimization, call run_one_step with suitable placeholders.\n\n        Returns:\n          True if certificate is found\n          False otherwise\n        \"\"\"\n        penalty_val = self.params[\"init_penalty\"]\n        # Don't use smoothing initially - very inaccurate for large dimension\n        self.smooth_on = False\n        smooth_val = 0\n        learning_rate_val = self.params[\"init_learning_rate\"]\n        self.current_outer_step = 1\n\n        while self.current_outer_step <= self.params[\"outer_num_steps\"]:\n            tf.logging.info(\n                \"Running outer step %d with penalty %f\",\n                self.current_outer_step,\n                penalty_val,\n            )\n            # Running inner loop of optimization with current_smooth_val,\n            # current_penalty as smoothness parameters and penalty respectively\n            self.current_step = 0\n            # Run first step with random eig initialization and large number of steps\n            found_cert = self.run_one_step(\n                self.dual_object.m_min_vec_estimate,\n                self.params[\"large_eig_num_steps\"],\n                smooth_val,\n                penalty_val,\n                learning_rate_val,\n            )\n            if found_cert:\n                return True\n            while self.current_step < self.params[\"inner_num_steps\"]:\n                self.current_step = self.current_step + 1\n                found_cert = self.run_one_step(\n                    self.dual_object.m_min_vec_estimate,\n                    self.params[\"small_eig_num_steps\"],\n                    smooth_val,\n                    penalty_val,\n                    learning_rate_val,\n                )\n                if found_cert:\n                    return True\n            # Update penalty only if it looks like current objective is optimizes\n            if self.current_total_objective < UPDATE_PARAM_CONSTANT:\n                penalty_val = penalty_val * self.params[\"beta\"]\n                learning_rate_val = (\n                    learning_rate_val * self.params[\"learning_rate_decay\"]\n                )\n            else:\n                # To get more accurate gradient estimate\n                self.params[\"small_eig_num_steps\"] = (\n                    1.5 * self.params[\"small_eig_num_steps\"]\n                )\n\n            # If eigen values seem small enough, turn on smoothing\n            # useful only when performing full eigen decomposition\n            if np.abs(self.current_eig_val_estimate) < 0.01:\n                smooth_val = self.params[\"smoothness_parameter\"]\n            self.current_outer_step = self.current_outer_step + 1\n        return False\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/tests/dual_formulation_test.py",
    "content": "\"\"\"Tests for cleverhans.experimental.certification.dual_formulation.\"\"\"\n# pylint: disable=missing-docstring\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport unittest\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.experimental.certification import dual_formulation\nfrom cleverhans.experimental.certification import nn\n\n\nclass DualFormulationTest(unittest.TestCase):\n    def test_init(self):\n        # Function to test initialization of dual formulation class.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n        three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32)\n        lambda_pos = [two_dim_tensor, three_dim_tensor]\n        lambda_neg = lambda_pos\n        lambda_quad = lambda_pos\n        lambda_lu = lambda_pos\n        nu = scalar\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        with tf.Session() as sess:\n            dual_formulation_object = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params1,\n                test_input,\n                true_class,\n                adv_class,\n                input_minval,\n                input_maxval,\n                epsilon,\n            )\n        self.assertIsNotNone(dual_formulation_object)\n\n    def test_set_differentiable_objective(self):\n        # Function to test the function that sets the differentiable objective.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n        three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32)\n        lambda_pos = [two_dim_tensor, three_dim_tensor]\n        lambda_neg = lambda_pos\n        lambda_quad = lambda_pos\n        lambda_lu = lambda_pos\n        nu = scalar\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        with tf.Session() as sess:\n            dual_formulation_object = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params1,\n                test_input,\n                true_class,\n                adv_class,\n                input_minval,\n                input_maxval,\n                epsilon,\n            )\n        dual_formulation_object.set_differentiable_objective()\n        self.assertEqual(dual_formulation_object.scalar_f.shape.as_list(), [1])\n        self.assertEqual(\n            dual_formulation_object.unconstrained_objective.shape.as_list(), [1, 1]\n        )\n        self.assertEqual(dual_formulation_object.vector_g.shape.as_list(), [5, 1])\n\n    def test_get_full_psd_matrix(self):\n        # Function to test product with PSD matrix.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n        three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32)\n        lambda_pos = [two_dim_tensor, three_dim_tensor]\n        lambda_neg = lambda_pos\n        lambda_quad = lambda_pos\n        lambda_lu = lambda_pos\n        nu = scalar\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        with tf.Session() as sess:\n            dual_formulation_object = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params1,\n                test_input,\n                true_class,\n                adv_class,\n                input_minval,\n                input_maxval,\n                epsilon,\n            )\n        matrix_h, matrix_m = dual_formulation_object.get_full_psd_matrix()\n        self.assertEqual(matrix_h.shape.as_list(), [5, 5])\n        self.assertEqual(matrix_m.shape.as_list(), [6, 6])\n\n    def test_get_psd_product(self):\n        # Function to test implicit product with PSD matrix.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n        three_dim_tensor = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        two_dim_tensor = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        scalar = tf.random_uniform(shape=(1, 1), dtype=tf.float32)\n        lambda_pos = [two_dim_tensor, three_dim_tensor]\n        lambda_neg = lambda_pos\n        lambda_quad = lambda_pos\n        lambda_lu = lambda_pos\n        nu = scalar\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        with tf.Session() as sess:\n            dual_formulation_object = dual_formulation.DualFormulation(\n                sess,\n                dual_var,\n                nn_params1,\n                test_input,\n                true_class,\n                adv_class,\n                input_minval,\n                input_maxval,\n                epsilon,\n            )\n            _, matrix_m = dual_formulation_object.get_full_psd_matrix()\n\n            # Testing if the values match\n            six_dim_tensor = tf.random_uniform(shape=(6, 1), dtype=tf.float32)\n            implicit_product = dual_formulation_object.get_psd_product(six_dim_tensor)\n            explicit_product = tf.matmul(matrix_m, six_dim_tensor)\n            [implicit_product_value, explicit_product_value] = sess.run(\n                [implicit_product, explicit_product]\n            )\n            self.assertEqual(\n                np.shape(implicit_product_value), np.shape(explicit_product_value)\n            )\n            self.assertLess(\n                np.max(np.abs(implicit_product_value - explicit_product_value)), 1e-5\n            )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/tests/nn_test.py",
    "content": "\"\"\"Tests for cleverhans.experimental.certification.nn.\"\"\"\n# pylint: disable=missing-docstring\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport unittest\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.experimental.certification import nn\n\n\nclass NeuralNetworkTest(unittest.TestCase):\n    def test_init(self):\n        # Function to test initialization of NeuralNetParams object.\n        # Valid params\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [1, 1, 1]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        self.assertIsNotNone(nn_params1)\n        # Invalid params : list length\n        net_biases = [0]\n        with self.assertRaises(ValueError):\n            nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        # Invalid params: layer types\n        with self.assertRaises(ValueError):\n            net_layer_types = [\"ff_relu\", \"ff_relu\"]\n            nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n    def test_forward_pass(self):\n        # Function to test forward pass of nn_params.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [1, 1, 1]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        input_vector = tf.random_uniform(shape=(2, 1), dtype=tf.float32)\n        output_vector = nn_params.forward_pass(input_vector, 0)\n        self.assertEqual(output_vector.shape.as_list(), [3, 1])\n        output_vector_2 = nn_params.forward_pass(input_vector, 0, is_abs=True)\n        self.assertEqual(output_vector_2.shape.as_list(), [3, 1])\n        input_vector_trans = tf.random_uniform(shape=(3, 1), dtype=tf.float32)\n        output_vector_3 = nn_params.forward_pass(\n            input_vector_trans, 0, is_transpose=True\n        )\n        self.assertEqual(output_vector_3.shape.as_list(), [2, 1])\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/tests/optimization_test.py",
    "content": "\"\"\"Tests for cleverhans.experimental.certification.optimization.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.experimental.certification import dual_formulation\nfrom cleverhans.experimental.certification import nn\nfrom cleverhans.experimental.certification import optimization\n\n\nclass OptimizationTest(tf.test.TestCase):\n    # pylint: disable=missing-docstring\n\n    def prepare_dual_object(self):\n        # Function to prepare dual object to be used for testing optimization.\n        net_weights = [[[2, 2], [3, 3], [4, 4]], [[1, 1, 1], [-1, -1, -1]]]\n        net_biases = [\n            np.transpose(np.matrix([0, 0, 0])),\n            np.transpose(np.matrix([0, 0])),\n        ]\n        net_layer_types = [\"ff_relu\", \"ff\"]\n        nn_params1 = nn.NeuralNetwork(net_weights, net_biases, net_layer_types)\n\n        test_input = np.transpose(np.matrix([0, 0]))\n        true_class = 0\n        adv_class = 1\n        input_minval = 0\n        input_maxval = 0\n        epsilon = 0.1\n\n        # Creating dual variables to use for optimization\n        lambda_pos = [\n            tf.get_variable(\n                \"lambda_pos0\",\n                initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32),\n            ),\n            tf.get_variable(\n                \"lambda_pos1\",\n                initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32),\n            ),\n        ]\n        lambda_neg = [\n            tf.get_variable(\n                \"lambda_neg0\",\n                initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32),\n            ),\n            tf.get_variable(\n                \"lambda_neg1\",\n                initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32),\n            ),\n        ]\n        lambda_quad = [\n            tf.get_variable(\n                \"lambda_quad0\",\n                initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32),\n            ),\n            tf.get_variable(\n                \"lambda_quad1\",\n                initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32),\n            ),\n        ]\n        lambda_lu = [\n            tf.get_variable(\n                \"lambda_lu0\",\n                initializer=np.random.uniform(0, 0.1, size=(2, 1)).astype(np.float32),\n            ),\n            tf.get_variable(\n                \"lambda_lu1\",\n                initializer=np.random.uniform(0, 0.1, size=(3, 1)).astype(np.float32),\n            ),\n        ]\n        nu = tf.reshape(\n            tf.get_variable(\"nu\", initializer=200.0, dtype=tf.float32), shape=(1, 1)\n        )\n        dual_var = {\n            \"lambda_pos\": lambda_pos,\n            \"lambda_neg\": lambda_neg,\n            \"lambda_quad\": lambda_quad,\n            \"lambda_lu\": lambda_lu,\n            \"nu\": nu,\n        }\n        sess = tf.Session()\n        dual_formulation_object = dual_formulation.DualFormulation(\n            sess,\n            dual_var,\n            nn_params1,\n            test_input,\n            true_class,\n            adv_class,\n            input_minval,\n            input_maxval,\n            epsilon,\n        )\n        return sess, dual_formulation_object\n\n    def test_init(self):\n        \"\"\" Function to test initialization of OptimizationTest. \"\"\"\n        sess, dual_formulation_object = self.prepare_dual_object()\n        dual_formulation_object.set_differentiable_objective()\n        sess.run(tf.global_variables_initializer())\n        optimization_params = {\n            \"init_learning_rate\": 0.1,\n            \"learning_rate_decay\": 0.9,\n            \"eig_num_iter\": 10,\n            \"eig_learning_rate\": 0.01,\n            \"init_smooth\": 0.5,\n            \"smooth_decay\": 0.9,\n            \"inner_num_steps\": 10,\n            \"optimizer\": \"adam\",\n            \"momentum_parameter\": 0.9,\n            \"eig_type\": \"TF\",\n        }\n        optimization_object = optimization.Optimization(\n            dual_formulation_object, sess, optimization_params\n        )\n        self.assertIsNotNone(optimization_object)\n\n    def test_get_min_eig_vec_proxy(self):\n        \"\"\" Function test computing min eigen value using matrix vector products.\"\"\"\n        sess, dual_formulation_object = self.prepare_dual_object()\n        _, matrix_m = dual_formulation_object.get_full_psd_matrix()\n        optimization_params = {\n            \"init_learning_rate\": 0.1,\n            \"learning_rate_decay\": 0.9,\n            \"eig_num_iter\": 2000,\n            \"eig_learning_rate\": 0.01,\n            \"init_smooth\": 0.0,\n            \"smooth_decay\": 0.9,\n            \"inner_num_steps\": 10,\n            \"optimizer\": \"adam\",\n            \"momentum_parameter\": 0.9,\n            \"eig_type\": \"TF\",\n        }\n        sess.run(tf.global_variables_initializer())\n        optimization_object = optimization.Optimization(\n            dual_formulation_object, sess, optimization_params\n        )\n        eig_vec = optimization_object.get_min_eig_vec_proxy()\n        tf_eig_vec = optimization_object.get_min_eig_vec_proxy(use_tf_eig=True)\n        self.assertIsNotNone(eig_vec)\n\n        # Running the graphs and checking that minimum eigen value is correct\n        # ** No smoothing\n        tf_eig_vec_val, eig_vec_val, matrix_m_val = sess.run(\n            [tf_eig_vec, eig_vec, matrix_m],\n            feed_dict={\n                optimization_object.eig_init_vec_placeholder: np.random.rand(6, 1),\n                optimization_object.eig_num_iter_placeholder: 2000,\n                optimization_object.smooth_placeholder: 0.0,\n            },\n        )\n\n        # Eigen value corresponding to v is v^\\top M v\n        eig_val = np.matmul(\n            np.transpose(eig_vec_val), np.matmul(matrix_m_val, eig_vec_val)\n        )\n        tf_eig_val = np.matmul(\n            np.transpose(tf_eig_vec_val), np.matmul(matrix_m_val, tf_eig_vec_val)\n        )\n        [np_eig_values, _] = np.linalg.eig(matrix_m_val)\n        self.assertLess(np.abs(np.min(np_eig_values) - eig_val), 1e-5)\n        self.assertLess(np.abs(np.min(np_eig_values) - tf_eig_val), 1e-5)\n\n        # Running the graphs and checking that minimum eigen value is correct\n        # **Smoothing\n        optimization_params[\"init_smooth\"] = 0.0001\n        optimization_object = optimization.Optimization(\n            dual_formulation_object, sess, optimization_params\n        )\n        eig_vec = optimization_object.get_min_eig_vec_proxy()\n        tf_eig_vec = optimization_object.get_min_eig_vec_proxy(use_tf_eig=True)\n\n        tf_eig_vec_val, eig_vec_val, matrix_m_val = sess.run(\n            [tf_eig_vec, eig_vec, matrix_m],\n            feed_dict={\n                optimization_object.eig_init_vec_placeholder: np.random.rand(6, 1),\n                optimization_object.smooth_placeholder: 0.1,\n                optimization_object.eig_num_iter_placeholder: 2000,\n            },\n        )\n\n        # Eigen value corresponding to v is v^\\top M v\n        eig_val = np.matmul(\n            np.transpose(eig_vec_val), np.matmul(matrix_m_val, eig_vec_val)\n        )\n        tf_eig_val = np.matmul(\n            np.transpose(tf_eig_vec_val), np.matmul(matrix_m_val, tf_eig_vec_val)\n        )\n        [np_eig_values, _] = np.linalg.eig(matrix_m_val)\n        self.assertLess(np.abs(np.min(np_eig_values) - eig_val), 1e-5)\n        # In general, smoothed version can be far off\n        self.assertLess(np.abs(np.min(np_eig_values) - tf_eig_val), 1e-1)\n\n    def test_optimization(self):\n        \"\"\"Function to test optimization.\"\"\"\n        sess, dual_formulation_object = self.prepare_dual_object()\n        optimization_params = {\n            \"init_penalty\": 10000,\n            \"large_eig_num_steps\": 1000,\n            \"small_eig_num_steps\": 500,\n            \"inner_num_steps\": 10,\n            \"outer_num_steps\": 2,\n            \"beta\": 2,\n            \"smoothness_parameter\": 0.001,\n            \"eig_learning_rate\": 0.01,\n            \"optimizer\": \"adam\",\n            \"init_learning_rate\": 0.1,\n            \"learning_rate_decay\": 0.9,\n            \"momentum_parameter\": 0.9,\n            \"print_stats_steps\": 1,\n            \"stats_folder\": None,\n            \"projection_steps\": 200,\n            \"eig_type\": \"TF\",\n        }\n        sess.run(tf.global_variables_initializer())\n        optimization_object = optimization.Optimization(\n            dual_formulation_object, sess, optimization_params\n        )\n        is_cert_found = optimization_object.run_optimization()\n        self.assertFalse(is_cert_found)\n\n\nif __name__ == \"__main__\":\n    tf.test.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/tests/utils_test.py",
    "content": "\"\"\"Tests for cleverhans.experimental.certification.utils.\"\"\"\n# pylint: disable=missing-docstring\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\nfrom scipy.sparse.linalg import eigs\nimport tensorflow as tf\nfrom tensorflow.contrib import autograph\n\nfrom cleverhans.experimental.certification import utils\n\nMATRIX_DIMENTION = 100\nNUM_LZS_ITERATIONS = 100\nNUM_RANDOM_MATRICES = 10\n\n\nclass UtilsTest(tf.test.TestCase):\n    def test_minimum_eigen_vector(self):\n        matrix = np.array([[1.0, 2.0], [2.0, 5.0]], dtype=np.float32)\n        initial_vec = np.array([[1.0], [-1.0]], dtype=np.float32)\n\n        def _vector_prod_fn(x):\n            return tf.matmul(matrix, x)\n\n        min_eigen_fn = autograph.to_graph(utils.minimum_eigen_vector)\n        x = tf.placeholder(tf.float32, shape=(2, 1))\n        min_eig_vec = min_eigen_fn(x, 10, 0.1, _vector_prod_fn)\n        with self.test_session() as sess:\n            v = sess.run(min_eig_vec, feed_dict={x: initial_vec})\n            if v.flatten()[0] < 0:\n                v = -v\n        np.testing.assert_almost_equal(v, [[0.9239], [-0.3827]], decimal=4)\n\n    def test_tf_lanczos_smallest_eigval(self):\n        tf_num_iter = tf.placeholder(dtype=tf.int32, shape=())\n        tf_matrix = tf.placeholder(dtype=tf.float32)\n\n        def _vector_prod_fn(x):\n            return tf.matmul(tf_matrix, tf.reshape(x, [-1, 1]))\n\n        min_eigen_fn = autograph.to_graph(utils.tf_lanczos_smallest_eigval)\n        init_vec_ph = tf.placeholder(shape=(MATRIX_DIMENTION, 1), dtype=tf.float32)\n        tf_eigval, tf_eigvec = min_eigen_fn(\n            _vector_prod_fn,\n            MATRIX_DIMENTION,\n            init_vec_ph,\n            tf_num_iter,\n            dtype=tf.float32,\n        )\n        eigvec = np.zeros((MATRIX_DIMENTION, 1), dtype=np.float32)\n\n        with self.test_session() as sess:\n            # run this test for a few random matrices\n            for _ in range(NUM_RANDOM_MATRICES):\n                matrix = np.random.random((MATRIX_DIMENTION, MATRIX_DIMENTION))\n                matrix = matrix + matrix.T  # symmetrizing matrix\n                eigval, eigvec = sess.run(\n                    [tf_eigval, tf_eigvec],\n                    feed_dict={\n                        tf_num_iter: NUM_LZS_ITERATIONS,\n                        tf_matrix: matrix,\n                        init_vec_ph: eigvec,\n                    },\n                )\n\n                scipy_min_eigval, scipy_min_eigvec = eigs(matrix, k=1, which=\"SR\")\n                scipy_min_eigval = np.real(scipy_min_eigval)\n                scipy_min_eigvec = np.real(scipy_min_eigvec)\n                scipy_min_eigvec = scipy_min_eigvec / np.linalg.norm(scipy_min_eigvec)\n\n                np.testing.assert_almost_equal(eigval, scipy_min_eigval, decimal=3)\n                np.testing.assert_almost_equal(np.linalg.norm(eigvec), 1.0, decimal=3)\n                abs_dot_prod = abs(np.dot(eigvec.flatten(), scipy_min_eigvec.flatten()))\n                np.testing.assert_almost_equal(abs_dot_prod, 1.0, decimal=3)\n\n\nif __name__ == \"__main__\":\n    tf.test.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/experimental/certification/utils.py",
    "content": "\"\"\"File containing some simple helper functions.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\nimport tensorflow as tf\n\n\ndef diag(diag_elements):\n    \"\"\"Function to create tensorflow diagonal matrix with input diagonal entries.\n\n    Args:\n      diag_elements: tensor with diagonal elements\n\n    Returns:\n      tf matrix with diagonal entries as diag_elements\n    \"\"\"\n    return tf.diag(tf.reshape(diag_elements, [-1]))\n\n\ndef initialize_dual(\n    neural_net_params_object,\n    init_dual_file=None,\n    random_init_variance=0.01,\n    init_nu=200.0,\n):\n    \"\"\"Function to initialize the dual variables of the class.\n\n    Args:\n      neural_net_params_object: Object with the neural net weights, biases\n        and types\n      init_dual_file: Path to file containing dual variables, if the path\n        is empty, perform random initialization\n        Expects numpy dictionary with\n        lambda_pos_0, lambda_pos_1, ..\n        lambda_neg_0, lambda_neg_1, ..\n        lambda_quad_0, lambda_quad_1, ..\n        lambda_lu_0, lambda_lu_1, ..\n        random_init_variance: variance for random initialization\n      init_nu: Value to initialize nu variable with\n\n    Returns:\n      dual_var: dual variables initialized appropriately.\n    \"\"\"\n    lambda_pos = []\n    lambda_neg = []\n    lambda_quad = []\n    lambda_lu = []\n\n    if init_dual_file is None:\n        for i in range(0, neural_net_params_object.num_hidden_layers + 1):\n            initializer = (\n                np.random.uniform(\n                    0, random_init_variance, size=(neural_net_params_object.sizes[i], 1)\n                )\n            ).astype(np.float32)\n            lambda_pos.append(\n                tf.get_variable(\n                    \"lambda_pos_\" + str(i), initializer=initializer, dtype=tf.float32\n                )\n            )\n            initializer = (\n                np.random.uniform(\n                    0, random_init_variance, size=(neural_net_params_object.sizes[i], 1)\n                )\n            ).astype(np.float32)\n            lambda_neg.append(\n                tf.get_variable(\n                    \"lambda_neg_\" + str(i), initializer=initializer, dtype=tf.float32\n                )\n            )\n            initializer = (\n                np.random.uniform(\n                    0, random_init_variance, size=(neural_net_params_object.sizes[i], 1)\n                )\n            ).astype(np.float32)\n            lambda_quad.append(\n                tf.get_variable(\n                    \"lambda_quad_\" + str(i), initializer=initializer, dtype=tf.float32\n                )\n            )\n            initializer = (\n                np.random.uniform(\n                    0, random_init_variance, size=(neural_net_params_object.sizes[i], 1)\n                )\n            ).astype(np.float32)\n            lambda_lu.append(\n                tf.get_variable(\n                    \"lambda_lu_\" + str(i), initializer=initializer, dtype=tf.float32\n                )\n            )\n        nu = tf.get_variable(\"nu\", initializer=init_nu)\n    else:\n        # Loading from file\n        dual_var_init_val = np.load(init_dual_file).item()\n        for i in range(0, neural_net_params_object.num_hidden_layers + 1):\n            lambda_pos.append(\n                tf.get_variable(\n                    \"lambda_pos_\" + str(i),\n                    initializer=dual_var_init_val[\"lambda_pos\"][i],\n                    dtype=tf.float32,\n                )\n            )\n            lambda_neg.append(\n                tf.get_variable(\n                    \"lambda_neg_\" + str(i),\n                    initializer=dual_var_init_val[\"lambda_neg\"][i],\n                    dtype=tf.float32,\n                )\n            )\n            lambda_quad.append(\n                tf.get_variable(\n                    \"lambda_quad_\" + str(i),\n                    initializer=dual_var_init_val[\"lambda_quad\"][i],\n                    dtype=tf.float32,\n                )\n            )\n            lambda_lu.append(\n                tf.get_variable(\n                    \"lambda_lu_\" + str(i),\n                    initializer=dual_var_init_val[\"lambda_lu\"][i],\n                    dtype=tf.float32,\n                )\n            )\n        nu = tf.get_variable(\"nu\", initializer=1.0 * dual_var_init_val[\"nu\"])\n    dual_var = {\n        \"lambda_pos\": lambda_pos,\n        \"lambda_neg\": lambda_neg,\n        \"lambda_quad\": lambda_quad,\n        \"lambda_lu\": lambda_lu,\n        \"nu\": nu,\n    }\n    return dual_var\n\n\ndef eig_one_step(current_vector, learning_rate, vector_prod_fn):\n    \"\"\"Function that performs one step of gd (variant) for min eigen value.\n\n    Args:\n      current_vector: current estimate of the eigen vector with minimum eigen\n        value.\n      learning_rate: learning rate.\n      vector_prod_fn: function which returns product H*x, where H is a matrix for\n        which we computing eigenvector.\n\n    Returns:\n      updated vector after one step\n    \"\"\"\n    grad = 2 * vector_prod_fn(current_vector)\n    # Current objective = (1/2)*v^T (2*M*v); v = current_vector\n    # grad = 2*M*v\n    current_objective = tf.reshape(\n        tf.matmul(tf.transpose(current_vector), grad) / 2.0, shape=()\n    )\n\n    # Project the gradient into the tangent space of the constraint region.\n    # This way we do not waste time taking steps that try to change the\n    # norm of current_vector\n    grad = grad - current_vector * tf.matmul(tf.transpose(current_vector), grad)\n    grad_norm = tf.norm(grad)\n    grad_norm_sq = tf.square(grad_norm)\n\n    # Computing normalized gradient of unit norm\n    norm_grad = grad / grad_norm\n\n    # Computing directional second derivative (dsd)\n    # dsd = 2*g^T M g, where g is normalized gradient\n    directional_second_derivative = tf.reshape(\n        2 * tf.matmul(tf.transpose(norm_grad), vector_prod_fn(norm_grad)), shape=()\n    )\n\n    # Computing grad^\\top M grad [useful to compute step size later]\n    # Just a rescaling of the directional_second_derivative (which uses\n    # normalized gradient\n    grad_m_grad = directional_second_derivative * grad_norm_sq / 2\n\n    # Directional_second_derivative/2 = objective when vector is norm_grad\n    # If this is smaller than current objective, simply return that\n    if directional_second_derivative / 2.0 < current_objective:\n        return norm_grad\n\n    # If curvature is positive, jump to the bottom of the bowl\n    if directional_second_derivative > 0.0:\n        step = -1.0 * grad_norm / directional_second_derivative\n    else:\n        # If the gradient is very small, do not move\n        if grad_norm_sq <= 1e-16:\n            step = 0.0\n        else:\n            # Make a heuristic guess of the step size\n            step = -2.0 * tf.reduce_sum(current_vector * grad) / grad_norm_sq\n            # Computing gain using the gradient and second derivative\n            gain = -(\n                2 * tf.reduce_sum(current_vector * grad) + (step * step) * grad_m_grad\n            )\n\n            # Fall back to pre-determined learning rate if no gain\n            if gain < 0.0:\n                step = -learning_rate * grad_norm\n    current_vector = current_vector + step * norm_grad\n    return tf.nn.l2_normalize(current_vector)\n\n\ndef minimum_eigen_vector(x, num_steps, learning_rate, vector_prod_fn):\n    \"\"\"Computes eigenvector which corresponds to minimum eigenvalue.\n\n    Args:\n      x: initial value of eigenvector.\n      num_steps: number of optimization steps.\n      learning_rate: learning rate.\n      vector_prod_fn: function which takes x and returns product H*x.\n\n    Returns:\n      approximate value of eigenvector.\n\n    This function finds approximate value of eigenvector of matrix H which\n    corresponds to smallest (by absolute value) eigenvalue of H.\n    It works by solving optimization problem x^{T}*H*x -> min.\n    \"\"\"\n    x = tf.nn.l2_normalize(x)\n    for _ in range(num_steps):\n        x = eig_one_step(x, learning_rate, vector_prod_fn)\n    return x\n\n\ndef tf_lanczos_smallest_eigval(\n    vector_prod_fn,\n    matrix_dim,\n    initial_vector,\n    num_iter=1000,\n    max_iter=1000,\n    collapse_tol=1e-9,\n    dtype=tf.float32,\n):\n    \"\"\"Computes smallest eigenvector and eigenvalue using Lanczos in pure TF.\n\n    This function computes smallest eigenvector and eigenvalue of the matrix\n    which is implicitly specified by `vector_prod_fn`.\n    `vector_prod_fn` is a function which takes `x` and returns a product of matrix\n    in consideration and `x`.\n    Computation is done using Lanczos algorithm, see\n    https://en.wikipedia.org/wiki/Lanczos_algorithm#The_algorithm\n\n    Args:\n      vector_prod_fn: function which takes a vector as an input and returns\n        matrix vector product.\n      matrix_dim: dimentionality of the matrix.\n      initial_vector: guess vector to start the algorithm with\n      num_iter: user-defined number of iterations for the algorithm\n      max_iter: maximum number of iterations.\n      collapse_tol: tolerance to determine collapse of the Krylov subspace\n      dtype: type of data\n\n    Returns:\n      tuple of (eigenvalue, eigenvector) of smallest eigenvalue and corresponding\n      eigenvector.\n    \"\"\"\n\n    # alpha will store diagonal elements\n    alpha = tf.TensorArray(dtype, size=1, dynamic_size=True, element_shape=())\n    # beta will store off diagonal elements\n    beta = tf.TensorArray(dtype, size=0, dynamic_size=True, element_shape=())\n    # q will store Krylov space basis\n    q_vectors = tf.TensorArray(\n        dtype, size=1, dynamic_size=True, element_shape=(matrix_dim, 1)\n    )\n\n    # If start vector is all zeros, make it a random normal vector and run for max_iter\n    if tf.norm(initial_vector) < collapse_tol:\n        initial_vector = tf.random_normal(shape=(matrix_dim, 1), dtype=dtype)\n        num_iter = max_iter\n\n    w = initial_vector / tf.norm(initial_vector)\n\n    # Iteration 0 of Lanczos\n    q_vectors = q_vectors.write(0, w)\n    w_ = vector_prod_fn(w)\n    cur_alpha = tf.reduce_sum(w_ * w)\n    alpha = alpha.write(0, cur_alpha)\n    w_ = w_ - tf.scalar_mul(cur_alpha, w)\n    w_prev = w\n    w = w_\n\n    # Subsequent iterations of Lanczos\n    for i in tf.range(1, num_iter):\n        cur_beta = tf.norm(w)\n        if cur_beta < collapse_tol:\n            # return early if Krylov subspace collapsed\n            break\n\n        # cur_beta is larger than collapse_tol,\n        # so division will return finite result.\n        w = w / cur_beta\n\n        w_ = vector_prod_fn(w)\n        cur_alpha = tf.reduce_sum(w_ * w)\n\n        q_vectors = q_vectors.write(i, w)\n        alpha = alpha.write(i, cur_alpha)\n        beta = beta.write(i - 1, cur_beta)\n\n        w_ = w_ - tf.scalar_mul(cur_alpha, w) - tf.scalar_mul(cur_beta, w_prev)\n        w_prev = w\n        w = w_\n\n    alpha = alpha.stack()\n    beta = beta.stack()\n    q_vectors = tf.reshape(q_vectors.stack(), (-1, matrix_dim))\n\n    offdiag_submatrix = tf.linalg.diag(beta)\n    tridiag_matrix = (\n        tf.linalg.diag(alpha)\n        + tf.pad(offdiag_submatrix, [[0, 1], [1, 0]])\n        + tf.pad(offdiag_submatrix, [[1, 0], [0, 1]])\n    )\n\n    eigvals, eigvecs = tf.linalg.eigh(tridiag_matrix)\n\n    smallest_eigval = eigvals[0]\n    smallest_eigvec = tf.matmul(tf.reshape(eigvecs[:, 0], (1, -1)), q_vectors)\n    smallest_eigvec = smallest_eigvec / tf.norm(smallest_eigvec)\n    smallest_eigvec = tf.reshape(smallest_eigvec, (matrix_dim, 1))\n\n    return smallest_eigval, smallest_eigvec\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/initializers.py",
    "content": "\"\"\"\nInitializers.\n\"\"\"\n\nimport tensorflow as tf\n\n\nclass HeReLuNormalInitializer(tf.initializers.random_normal):\n    \"\"\"\n    The initializer from He et al 2015\n    \"\"\"\n\n    def __init__(self, dtype=tf.float32):\n        super(HeReLuNormalInitializer, self).__init__(dtype=dtype)\n\n    def get_config(self):\n        return dict(dtype=self.dtype.name)\n\n    def __call__(self, shape, dtype=None, partition_info=None):\n        del partition_info\n        dtype = self.dtype if dtype is None else dtype\n        std = tf.rsqrt(tf.cast(tf.reduce_prod(shape[:-1]), tf.float32) + 1e-7)\n        return tf.random_normal(shape, stddev=std, dtype=dtype)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/loss.py",
    "content": "\"\"\"Loss functions for training models.\"\"\"\nimport copy\nimport json\nimport os\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks import Attack\nfrom cleverhans.compat import softmax_cross_entropy_with_logits\nfrom cleverhans.model import Model\nfrom cleverhans.utils import safe_zip\n\ntry:\n    import tensorflow_probability as tfp\n\n    tf_distributions = tfp.distributions\nexcept ImportError:\n    tf_distributions = tf.distributions\n\n\nclass Loss(object):\n    \"\"\"\n    An abstract interface for loss wrappers that allows flexible control of\n    real examples, adversarial examples and labels. These losses are used\n    for defenses (during model training).\n    \"\"\"\n\n    def __init__(self, model, hparams=None, attack=None):\n        \"\"\"\n        :param model: Model instance, the model on which to apply the loss.\n        :param hparams: dict, hyper-parameters for the loss.\n        :param attack: cleverhans.attacks.Attack instance\n        \"\"\"\n        assert isinstance(model, Model)\n        standard = attack is None or isinstance(attack, Attack)\n        deprecated = callable(attack)\n        if not standard and not deprecated:\n            raise TypeError(\"`attack` must be `None` or `Attack` subclass instance\")\n        if deprecated:\n            warnings.warn(\n                \"callable attacks are deprecated, switch to an Attack \"\n                \"subclass. callable attacks will not be supported after \"\n                \"2019-05-05.\"\n            )\n\n            class Wrapper(Attack):\n                \"\"\"\n                Temporary wrapper class to be removed when deprecated callable\n                arguments are removed.\n\n                :param f: a callable object implementing the attack\n                \"\"\"\n\n                def __init__(self, f):\n                    dummy_model = Model()\n                    super(Wrapper, self).__init__(model=dummy_model)\n                    self.f = f\n\n                def generate(self, x):\n                    return self.f(x)\n\n            attack = Wrapper(attack)\n        self.model = model\n        self.hparams = hparams\n        self.attack = attack\n\n    def save(self, path):\n        \"\"\"Save loss in json format\"\"\"\n        json.dump(\n            dict(loss=self.__class__.__name__, params=self.hparams),\n            open(os.path.join(path, \"loss.json\"), \"wb\"),\n        )\n\n    def fprop(self, x, y):\n        \"\"\"Forward propagate the loss.\n        Loss should be a scalar value, independent of batch size (i.e. use\n        reduce_mean over batch axis, don't use reduce_sum or return a tensor).\n        Scalar losses are easier to add together, e.g. through `WeightedSum`.\n        Mean losses are easier to redistribute across multiple replicas without\n        needing to change learning rates, etc.\n        :param x: tensor, a batch of inputs.\n        :param y: tensor, a batch of outputs (1-hot labels typically).\n        \"\"\"\n        raise NotImplementedError\n\n\nclass WeightedSum(Loss):\n    \"\"\"\n    A Loss that adds up a weighted sum of other losses.\n    \"\"\"\n\n    def __init__(self, model, terms):\n        self.terms = terms\n\n        Loss.__init__(self, model, locals())\n\n    def fprop(self, x, y, **kwargs):\n        weights, loss_objects = safe_zip(*self.terms)\n        for weight in weights:\n            if isinstance(weight, float):\n                continue\n            if hasattr(weight, \"ndim\"):\n                assert weight.ndim == 0\n                continue\n            raise TypeError(\n                \"weight of %s is not a type that this function \"\n                \"knows it can accept yet\" % str(weight)\n            )\n        losses = [loss.fprop(x, y, **kwargs) for loss in loss_objects]\n        for loss, loss_object in safe_zip(losses, loss_objects):\n            if len(loss.get_shape()) > 0:\n                raise ValueError(\n                    \"%s.fprop returned a non-scalar value\" % str(loss_object)\n                )\n        terms = [weight * loss for weight, loss in safe_zip(weights, losses)]\n\n        return tf.add_n(terms)\n\n\nclass CrossEntropy(Loss):\n    \"\"\"Cross-entropy loss for a multiclass softmax classifier.\n    :param model: Model instance, the model on which to apply the loss.\n    :param smoothing: float, amount of label smoothing for cross-entropy.\n    :param attack: function, given an input x, return an attacked x'.\n    :param pass_y: bool, if True pass y to the attack\n    :param adv_coeff: Coefficient to put on the cross-entropy for\n      adversarial examples, if adversarial examples are used.\n      The coefficient on the cross-entropy for clean examples is\n      1. - adv_coeff.\n    :param attack_params: dict, keyword arguments passed to `attack.generate`\n    \"\"\"\n\n    def __init__(\n        self,\n        model,\n        smoothing=0.0,\n        attack=None,\n        pass_y=False,\n        adv_coeff=0.5,\n        attack_params=None,\n        **kwargs\n    ):\n        if smoothing < 0 or smoothing > 1:\n            raise ValueError(\"Smoothing must be in [0, 1]\", smoothing)\n        self.kwargs = kwargs\n        Loss.__init__(self, model, locals(), attack)\n        self.smoothing = smoothing\n        self.adv_coeff = adv_coeff\n        self.pass_y = pass_y\n        self.attack_params = attack_params\n\n    def fprop(self, x, y, **kwargs):\n        kwargs.update(self.kwargs)\n        if self.attack is not None:\n            attack_params = copy.copy(self.attack_params)\n            if attack_params is None:\n                attack_params = {}\n            if self.pass_y:\n                attack_params[\"y\"] = y\n            x = x, self.attack.generate(x, **attack_params)\n            coeffs = [1.0 - self.adv_coeff, self.adv_coeff]\n            if self.adv_coeff == 1.0:\n                x = (x[1],)\n                coeffs = (coeffs[1],)\n        else:\n            x = tuple([x])\n            coeffs = [1.0]\n        assert np.allclose(sum(coeffs), 1.0)\n\n        # Catching RuntimeError: Variable -= value not supported by tf.eager.\n        try:\n            y -= self.smoothing * (y - 1.0 / tf.cast(y.shape[-1], y.dtype))\n        except RuntimeError:\n            y.assign_sub(self.smoothing * (y - 1.0 / tf.cast(y.shape[-1], y.dtype)))\n\n        logits = [self.model.get_logits(x, **kwargs) for x in x]\n        loss = sum(\n            coeff\n            * tf.reduce_mean(softmax_cross_entropy_with_logits(labels=y, logits=logit))\n            for coeff, logit in safe_zip(coeffs, logits)\n        )\n        return loss\n\n\nclass MixUp(Loss):\n    \"\"\"Mixup ( https://arxiv.org/abs/1710.09412 )\n    :param model: Model instance, the model on which to apply the loss.\n    :param beta: float, beta distribution parameter for MixUp.\n    \"\"\"\n\n    def __init__(self, model, beta, **kwargs):\n        del kwargs\n        Loss.__init__(self, model, locals())\n        self.beta = beta\n\n    def fprop(self, x, y, **kwargs):\n        with tf.device(\"/CPU:0\"):\n            # Prevent error complaining GPU kernels unavailable for this.\n            mix = tf_distributions.Beta(self.beta, self.beta)\n            mix = mix.sample([tf.shape(x)[0]] + [1] * (len(x.shape) - 1))\n        mix = tf.maximum(mix, 1 - mix)\n        mix_label = tf.reshape(mix, [-1, 1])\n        xm = x + mix * (x[::-1] - x)\n        ym = y + mix_label * (y[::-1] - y)\n        logits = self.model.get_logits(xm, **kwargs)\n        loss = tf.reduce_mean(\n            softmax_cross_entropy_with_logits(labels=ym, logits=logits)\n        )\n        return loss\n\n\nclass FeaturePairing(Loss):\n    \"\"\"Feature pairing loss.\n    :param model: Model instance, the model on which to apply the loss.\n    :param weight: float, with of logic pairing loss.\n    :param attack: function, given an input x, return an attacked x'.\n    \"\"\"\n\n    def __init__(self, model, weight, attack, **kwargs):\n        del kwargs\n        Loss.__init__(self, model, locals(), attack)\n        self.weight = weight\n\n    def fprop(self, x, y, **kwargs):\n        x_adv = self.attack.generate(x)\n        d1 = self.model.fprop(x, **kwargs)\n        d2 = self.model.fprop(x_adv, **kwargs)\n        pairing_loss = [\n            tf.reduce_mean(tf.square(a - b))\n            for a, b in zip(d1[Model.O_FEATURES], d2[Model.O_FEATURES])\n        ]\n        pairing_loss = tf.reduce_mean(pairing_loss)\n        loss = tf.reduce_mean(\n            softmax_cross_entropy_with_logits(labels=y, logits=d1[Model.O_LOGITS])\n        )\n        loss += tf.reduce_mean(\n            softmax_cross_entropy_with_logits(labels=y, logits=d2[Model.O_LOGITS])\n        )\n        return loss + self.weight * pairing_loss\n\n\nclass WeightDecay(Loss):\n    \"\"\"Weight decay\"\"\"\n\n    def fprop(self, x, y, **kwargs):\n        terms = [\n            tf.nn.l2_loss(param)\n            for param in self.model.get_params()\n            if len(param.get_shape()) > 1\n        ]\n        out = tf.add_n(terms)\n        assert len(out.get_shape()) == 0\n        return out\n\n\nclass LossCrossEntropy(Loss):\n    \"\"\"\n    Deprecated version of `CrossEntropy` that returns per-example loss rather\n    than mean loss.\n    \"\"\"\n\n    def __init__(self, model, smoothing=0.0, attack=None, **kwargs):\n        \"\"\"Constructor.\n        :param model: Model instance, the model on which to apply the loss.\n        :param smoothing: float, amount of label smoothing for cross-entropy.\n        :param attack: function, given an input x, return an attacked x'.\n        \"\"\"\n        if smoothing < 0 or smoothing > 1:\n            raise ValueError(\"Smoothing must be in [0, 1]\", smoothing)\n        del kwargs\n        Loss.__init__(self, model, locals(), attack)\n        self.smoothing = smoothing\n\n    def fprop(self, x, y, **kwargs):\n        if self.attack is not None:\n            x = x, self.attack(x)\n        else:\n            x = tuple([x])\n\n        # Catching RuntimeError: Variable -= value not supported by tf.eager.\n        try:\n            y -= self.smoothing * (y - 1.0 / tf.cast(y.shape[-1], tf.float32))\n        except RuntimeError:\n            y.assign_sub(self.smoothing * (y - 1.0 / tf.cast(y.shape[-1], tf.float32)))\n\n        logits = [self.model.get_logits(x, **kwargs) for x in x]\n        loss = sum(\n            softmax_cross_entropy_with_logits(labels=y, logits=logit)\n            for logit in logits\n        )\n        warnings.warn(\n            \"LossCrossEntropy is deprecated, switch to \"\n            \"CrossEntropy. LossCrossEntropy may be removed on \"\n            \"or after 2019-03-06.\"\n        )\n        return loss\n\n\nclass LossFeaturePairing(Loss):\n    \"\"\"Deprecated version of `FeaturePairing` that returns per-example loss\n    rather than mean loss.\"\"\"\n\n    def __init__(self, model, weight, attack, **kwargs):\n        \"\"\"Constructor.\n        :param model: Model instance, the model on which to apply the loss.\n        :param weight: float, with of logic pairing loss.\n        :param attack: function, given an input x, return an attacked x'.\n        \"\"\"\n        del kwargs\n        Loss.__init__(self, model, locals(), attack)\n        self.weight = weight\n\n    def fprop(self, x, y, **kwargs):\n        x_adv = self.attack(x)\n        d1 = self.model.fprop(x, **kwargs)\n        d2 = self.model.fprop(x_adv, **kwargs)\n        pairing_loss = [\n            tf.reduce_mean(tf.square(a - b))\n            for a, b in zip(d1[Model.O_FEATURES], d2[Model.O_FEATURES])\n        ]\n        pairing_loss = tf.reduce_mean(pairing_loss)\n        loss = softmax_cross_entropy_with_logits(labels=y, logits=d1[Model.O_LOGITS])\n        loss += softmax_cross_entropy_with_logits(labels=y, logits=d2[Model.O_LOGITS])\n        warnings.warn(\n            \"LossFeaturePairing is deprecated, switch to \"\n            \"FeaturePairing. LossFeaturePairing may be removed \"\n            \"on or after 2019-03-06.\"\n        )\n        return loss + self.weight * pairing_loss\n\n\nclass LossMixUp(Loss):\n    \"\"\"Deprecated version of `MixUp` that returns per-example loss\n    rather than mean loss.\"\"\"\n\n    def __init__(self, model, beta, **kwargs):\n        \"\"\"Constructor.\n        :param model: Model instance, the model on which to apply the loss.\n        :param beta: float, beta distribution parameter for MixUp.\n        \"\"\"\n        del kwargs\n        Loss.__init__(self, model, locals())\n        self.beta = beta\n\n    def fprop(self, x, y, **kwargs):\n        mix = tf_distributions.Beta(self.beta, self.beta)\n        mix = mix.sample([tf.shape(x)[0]] + [1] * (len(x.shape) - 1))\n        xm = x + mix * (x[::-1] - x)\n        ym = y + mix * (y[::-1] - y)\n        logits = self.model.get_logits(xm, **kwargs)\n        loss = softmax_cross_entropy_with_logits(labels=ym, logits=logits)\n        warnings.warn(\n            \"LossMixUp is deprecated, switch to \"\n            \"MixUp. LossFeaturePairing may be removed \"\n            \"on or after 2019-03-06.\"\n        )\n        return loss\n\n\nclass SNNLCrossEntropy(CrossEntropy):\n    \"\"\"A combination loss of Soft Nearest Neighbor Loss calculated at every layer\n    in the network, and standard cross entropy of the logits. Presented in\n    \"Analyzing and Improving Representations with the Soft Nearest Neighbor Loss\"\n    by Nicholas Frosst, Nicolas Papernot, and Geoffrey Hinton.\n    arXiv preprint arXiv:1902.01889 (2019).\"\"\"\n\n    STABILITY_EPS = 0.00001  # used to make the calculation of SNNL more stable\n\n    def __init__(\n        self,\n        model,\n        temperature=100.0,\n        layer_names=None,\n        factor=-10.0,\n        optimize_temperature=True,\n        cos_distance=False,\n    ):\n        \"\"\"Constructor.\n        :param model: Model instance, the model on which to apply the loss.\n        :param temperature: Temperature used for SNNL.\n        :layer_names: The names of the layers at which to calculate SNNL.\n                      If not provided, then SNNL is applied to each internal layer.\n        :factor: The balance factor between SNNL and ross Entropy. If factor is\n                 negative, then SNNL will be maximized.\n        :optimize_temperature: Optimize temperature at each calculation to minimize\n                               the loss. This makes the loss more stable.\n        :cos_distance: Use cosine distance when calculating SNNL.\n        \"\"\"\n        CrossEntropy.__init__(self, model, smoothing=0.0)\n        self.temperature = temperature\n        self.factor = factor\n        self.optimize_temperature = optimize_temperature\n        self.cos_distance = cos_distance\n        self.layer_names = layer_names\n        if not layer_names:\n            # omit the final layer, the classification layer\n            self.layer_names = model.get_layer_names()[:-1]\n\n    @staticmethod\n    def pairwise_euclid_distance(A, B):\n        \"\"\"Pairwise Euclidean distance between two matrices.\n        :param A: a matrix.\n        :param B: a matrix.\n\n        :returns: A tensor for the pairwise Euclidean between A and B.\n        \"\"\"\n        batchA = tf.shape(A)[0]\n        batchB = tf.shape(B)[0]\n\n        sqr_norm_A = tf.reshape(tf.reduce_sum(tf.pow(A, 2), 1), [1, batchA])\n        sqr_norm_B = tf.reshape(tf.reduce_sum(tf.pow(B, 2), 1), [batchB, 1])\n        inner_prod = tf.matmul(B, A, transpose_b=True)\n\n        tile_1 = tf.tile(sqr_norm_A, [batchB, 1])\n        tile_2 = tf.tile(sqr_norm_B, [1, batchA])\n        return tile_1 + tile_2 - 2 * inner_prod\n\n    @staticmethod\n    def pairwise_cos_distance(A, B):\n        \"\"\"Pairwise cosine distance between two matrices.\n        :param A: a matrix.\n        :param B: a matrix.\n\n        :returns: A tensor for the pairwise cosine between A and B.\n        \"\"\"\n        normalized_A = tf.nn.l2_normalize(A, dim=1)\n        normalized_B = tf.nn.l2_normalize(B, dim=1)\n        prod = tf.matmul(normalized_A, normalized_B, adjoint_b=True)\n        return 1 - prod\n\n    @staticmethod\n    def fits(A, B, temp, cos_distance):\n        \"\"\"Exponentiated pairwise distance between each element of A and\n        all those of B.\n        :param A: a matrix.\n        :param B: a matrix.\n        :param temp: Temperature\n        :cos_distance: Boolean for using cosine or Euclidean distance.\n\n        :returns: A tensor for the exponentiated pairwise distance between\n        each element and A and all those of B.\n        \"\"\"\n        if cos_distance:\n            distance_matrix = SNNLCrossEntropy.pairwise_cos_distance(A, B)\n        else:\n            distance_matrix = SNNLCrossEntropy.pairwise_euclid_distance(A, B)\n        return tf.exp(-(distance_matrix / temp))\n\n    @staticmethod\n    def pick_probability(x, temp, cos_distance):\n        \"\"\"Row normalized exponentiated pairwise distance between all the elements\n        of x. Conceptualized as the probability of sampling a neighbor point for\n        every element of x, proportional to the distance between the points.\n        :param x: a matrix\n        :param temp: Temperature\n        :cos_distance: Boolean for using cosine or euclidean distance\n\n        :returns: A tensor for the row normalized exponentiated pairwise distance\n                  between all the elements of x.\n        \"\"\"\n        f = SNNLCrossEntropy.fits(x, x, temp, cos_distance) - tf.eye(tf.shape(x)[0])\n        return f / (\n            SNNLCrossEntropy.STABILITY_EPS + tf.expand_dims(tf.reduce_sum(f, 1), 1)\n        )\n\n    @staticmethod\n    def same_label_mask(y, y2):\n        \"\"\"Masking matrix such that element i,j is 1 iff y[i] == y2[i].\n        :param y: a list of labels\n        :param y2: a list of labels\n\n        :returns: A tensor for the masking matrix.\n        \"\"\"\n        return tf.cast(tf.squeeze(tf.equal(y, tf.expand_dims(y2, 1))), tf.float32)\n\n    @staticmethod\n    def masked_pick_probability(x, y, temp, cos_distance):\n        \"\"\"The pairwise sampling probabilities for the elements of x for neighbor\n        points which share labels.\n        :param x: a matrix\n        :param y: a list of labels for each element of x\n        :param temp: Temperature\n        :cos_distance: Boolean for using cosine or Euclidean distance\n\n        :returns: A tensor for the pairwise sampling probabilities.\n        \"\"\"\n        return SNNLCrossEntropy.pick_probability(\n            x, temp, cos_distance\n        ) * SNNLCrossEntropy.same_label_mask(y, y)\n\n    @staticmethod\n    def SNNL(x, y, temp, cos_distance):\n        \"\"\"Soft Nearest Neighbor Loss\n        :param x: a matrix.\n        :param y: a list of labels for each element of x.\n        :param temp: Temperature.\n        :cos_distance: Boolean for using cosine or Euclidean distance.\n\n        :returns: A tensor for the Soft Nearest Neighbor Loss of the points\n                  in x with labels y.\n        \"\"\"\n        summed_masked_pick_prob = tf.reduce_sum(\n            SNNLCrossEntropy.masked_pick_probability(x, y, temp, cos_distance), 1\n        )\n        return tf.reduce_mean(\n            -tf.log(SNNLCrossEntropy.STABILITY_EPS + summed_masked_pick_prob)\n        )\n\n    @staticmethod\n    def optimized_temp_SNNL(x, y, initial_temp, cos_distance):\n        \"\"\"The optimized variant of Soft Nearest Neighbor Loss. Every time this\n        tensor is evaluated, the temperature is optimized to minimize the loss\n        value, this results in more numerically stable calculations of the SNNL.\n        :param x: a matrix.\n        :param y: a list of labels for each element of x.\n        :param initial_temp: Temperature.\n        :cos_distance: Boolean for using cosine or Euclidean distance.\n\n        :returns: A tensor for the Soft Nearest Neighbor Loss of the points\n                  in x with labels y, optimized for temperature.\n        \"\"\"\n        t = tf.Variable(1, dtype=tf.float32, trainable=False, name=\"temp\")\n\n        def inverse_temp(t):\n            # pylint: disable=missing-docstring\n            # we use inverse_temp because it was observed to be more stable when optimizing.\n            return tf.div(initial_temp, t)\n\n        ent_loss = SNNLCrossEntropy.SNNL(x, y, inverse_temp(t), cos_distance)\n        updated_t = tf.assign(t, tf.subtract(t, 0.1 * tf.gradients(ent_loss, t)[0]))\n        inverse_t = inverse_temp(updated_t)\n        return SNNLCrossEntropy.SNNL(x, y, inverse_t, cos_distance)\n\n    def fprop(self, x, y, **kwargs):\n        cross_entropy = CrossEntropy.fprop(self, x, y, **kwargs)\n        self.layers = [self.model.get_layer(x, name) for name in self.layer_names]\n        loss_fn = self.SNNL\n        if self.optimize_temperature:\n            loss_fn = self.optimized_temp_SNNL\n        layers_SNNL = [\n            loss_fn(\n                tf.layers.flatten(layer),\n                tf.argmax(y, axis=1),\n                self.temperature,\n                self.cos_distance,\n            )\n            for layer in self.layers\n        ]\n        return cross_entropy + self.factor * tf.add_n(layers_SNNL)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model.py",
    "content": "\"\"\"\nThe Model class and related functionality.\n\"\"\"\nfrom abc import ABCMeta\nimport warnings\n\nimport tensorflow as tf\n\nfrom cleverhans import utils_tf\n\n\nclass Model(object):\n    \"\"\"\n    An abstract interface for model wrappers that exposes model symbols\n    needed for making an attack. This abstraction removes the dependency on\n    any specific neural network package (e.g. Keras) from the core\n    code of CleverHans. It can also simplify exposing the hidden features of a\n    model when a specific package does not directly expose them.\n    \"\"\"\n\n    __metaclass__ = ABCMeta\n    O_LOGITS, O_PROBS, O_FEATURES = \"logits probs features\".split()\n\n    def __init__(\n        self, scope=None, nb_classes=None, hparams=None, needs_dummy_fprop=False\n    ):\n        \"\"\"\n        Constructor.\n        :param scope: str, the name of model.\n        :param nb_classes: integer, the number of classes.\n        :param hparams: dict, hyper-parameters for the model.\n        :needs_dummy_fprop: bool, if True the model's parameters are not\n            created until fprop is called.\n        \"\"\"\n        self.scope = scope or self.__class__.__name__\n        self.nb_classes = nb_classes\n        self.hparams = hparams or {}\n        self.needs_dummy_fprop = needs_dummy_fprop\n\n    def __call__(self, *args, **kwargs):\n        \"\"\"\n        For compatibility with functions used as model definitions (taking\n        an input tensor and returning the tensor giving the output\n        of the model on that input).\n        \"\"\"\n\n        warnings.warn(\n            \"Model.__call__ is deprecated. \"\n            \"The call is ambiguous as to whether the output should \"\n            \"be logits or probabilities, and getting the wrong one \"\n            \"can cause serious problems. \"\n            \"The output actually is probabilities, which are a very \"\n            \"dangerous thing to use as part of any interface for \"\n            \"cleverhans, because softmax probabilities are prone \"\n            \"to gradient masking.\"\n            \"On or after 2019-04-24, this method will change to raise \"\n            \"an exception explaining why Model.__call__ should not be \"\n            \"used.\"\n        )\n\n        return self.get_probs(*args, **kwargs)\n\n    def get_logits(self, x, **kwargs):\n        \"\"\"\n        :param x: A symbolic representation (Tensor) of the network input\n        :return: A symbolic representation (Tensor) of the output logits\n        (i.e., the values fed as inputs to the softmax layer).\n        \"\"\"\n        outputs = self.fprop(x, **kwargs)\n        if self.O_LOGITS in outputs:\n            return outputs[self.O_LOGITS]\n        raise NotImplementedError(\n            str(type(self)) + \"must implement `get_logits`\"\n            \" or must define a \" + self.O_LOGITS + \" output in `fprop`\"\n        )\n\n    def get_predicted_class(self, x, **kwargs):\n        \"\"\"\n        :param x: A symbolic representation (Tensor) of the network input\n        :return: A symbolic representation (Tensor) of the predicted label\n        \"\"\"\n        return tf.argmax(self.get_logits(x, **kwargs), axis=1)\n\n    def get_probs(self, x, **kwargs):\n        \"\"\"\n        :param x: A symbolic representation (Tensor) of the network input\n        :return: A symbolic representation (Tensor) of the output\n        probabilities (i.e., the output values produced by the softmax layer).\n        \"\"\"\n        d = self.fprop(x, **kwargs)\n        if self.O_PROBS in d:\n            output = d[self.O_PROBS]\n            min_prob = tf.reduce_min(output)\n            max_prob = tf.reduce_max(output)\n            asserts = [\n                utils_tf.assert_greater_equal(min_prob, tf.cast(0.0, min_prob.dtype)),\n                utils_tf.assert_less_equal(max_prob, tf.cast(1.0, min_prob.dtype)),\n            ]\n            with tf.control_dependencies(asserts):\n                output = tf.identity(output)\n            return output\n        elif self.O_LOGITS in d:\n            return tf.nn.softmax(logits=d[self.O_LOGITS])\n        else:\n            raise ValueError(\"Cannot find probs or logits.\")\n\n    def fprop(self, x, **kwargs):\n        \"\"\"\n        Forward propagation to compute the model outputs.\n        :param x: A symbolic representation of the network input\n        :return: A dictionary mapping layer names to the symbolic\n                 representation of their output.\n        \"\"\"\n        raise NotImplementedError(\"`fprop` not implemented.\")\n\n    def get_params(self):\n        \"\"\"\n        Provides access to the model's parameters.\n        :return: A list of all Variables defining the model parameters.\n        \"\"\"\n\n        if hasattr(self, \"params\"):\n            return list(self.params)\n\n        # Catch eager execution and assert function overload.\n        try:\n            if tf.executing_eagerly():\n                raise NotImplementedError(\n                    \"For Eager execution - get_params \" \"must be overridden.\"\n                )\n        except AttributeError:\n            pass\n\n        # For graph-based execution\n        scope_vars = tf.get_collection(\n            tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + \"/\"\n        )\n\n        if len(scope_vars) == 0:\n            self.make_params()\n            scope_vars = tf.get_collection(\n                tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + \"/\"\n            )\n            assert len(scope_vars) > 0\n\n        # Make sure no parameters have been added or removed\n        if hasattr(self, \"num_params\"):\n            if self.num_params != len(scope_vars):\n                print(\"Scope: \", self.scope)\n                print(\"Expected \" + str(self.num_params) + \" variables\")\n                print(\"Got \" + str(len(scope_vars)))\n                for var in scope_vars:\n                    print(\"\\t\" + str(var))\n                assert False\n        else:\n            self.num_params = len(scope_vars)\n\n        return scope_vars\n\n    def make_params(self):\n        \"\"\"\n        Create all Variables to be returned later by get_params.\n        By default this is a no-op.\n        Models that need their fprop to be called for their params to be\n        created can set `needs_dummy_fprop=True` in the constructor.\n        \"\"\"\n\n        if self.needs_dummy_fprop:\n            if hasattr(self, \"_dummy_input\"):\n                return\n            self._dummy_input = self.make_input_placeholder()\n            self.fprop(self._dummy_input)\n\n    def get_layer_names(self):\n        \"\"\"Return the list of exposed layers for this model.\"\"\"\n        raise NotImplementedError\n\n    def get_layer(self, x, layer, **kwargs):\n        \"\"\"Return a layer output.\n        :param x: tensor, the input to the network.\n        :param layer: str, the name of the layer to compute.\n        :param **kwargs: dict, extra optional params to pass to self.fprop.\n        :return: the content of layer `layer`\n        \"\"\"\n        return self.fprop(x, **kwargs)[layer]\n\n    def make_input_placeholder(self):\n        \"\"\"Create and return a placeholder representing an input to the model.\n\n        This method should respect context managers (e.g. \"with tf.device\")\n        and should not just return a reference to a single pre-created\n        placeholder.\n        \"\"\"\n\n        raise NotImplementedError(\n            str(type(self)) + \" does not implement \" \"make_input_placeholder\"\n        )\n\n    def make_label_placeholder(self):\n        \"\"\"Create and return a placeholder representing class labels.\n\n        This method should respect context managers (e.g. \"with tf.device\")\n        and should not just return a reference to a single pre-created\n        placeholder.\n        \"\"\"\n\n        raise NotImplementedError(\n            str(type(self)) + \" does not implement \" \"make_label_placeholder\"\n        )\n\n    def __hash__(self):\n        return hash(id(self))\n\n    def __eq__(self, other):\n        return self is other\n\n\nclass CallableModelWrapper(Model):\n    \"\"\"A wrapper that turns a callable into a valid Model\"\"\"\n\n    def __init__(self, callable_fn, output_layer):\n        \"\"\"\n        Wrap a callable function that takes a tensor as input and returns\n        a tensor as output with the given layer name.\n        :param callable_fn: The callable function taking a tensor and\n                            returning a given layer as output.\n        :param output_layer: A string of the output layer returned by the\n                             function. (Usually either \"probs\" or \"logits\".)\n        \"\"\"\n\n        super(CallableModelWrapper, self).__init__()\n        self.output_layer = output_layer\n        self.callable_fn = callable_fn\n\n    def fprop(self, x, **kwargs):\n        output = self.callable_fn(x, **kwargs)\n\n        # Do some sanity checking to reduce the chance that probs are used\n        # as logits accidentally or vice versa\n        if self.output_layer == \"probs\":\n            assert output.op.type == \"Softmax\"\n            min_prob = tf.reduce_min(output)\n            max_prob = tf.reduce_max(output)\n            asserts = [\n                utils_tf.assert_greater_equal(min_prob, tf.cast(0.0, min_prob.dtype)),\n                utils_tf.assert_less_equal(max_prob, tf.cast(1.0, max_prob.dtype)),\n            ]\n            with tf.control_dependencies(asserts):\n                output = tf.identity(output)\n        elif self.output_layer == \"logits\":\n            assert output.op.type != \"Softmax\"\n\n        return {self.output_layer: output}\n\n\ndef wrapper_warning():\n    \"\"\"\n    Issue a deprecation warning. Used in multiple places that implemented\n    attacks by automatically wrapping a user-supplied callable with a\n    CallableModelWrapper with output_layer=\"probs\".\n    Using \"probs\" as any part of the attack interface is dangerous.\n    We can't just change output_layer to logits because:\n    - that would be a silent interface change. We'd have no way of detecting\n      code that still means to use probs. Note that we can't just check whether\n      the final output op is a softmax---for example, Inception puts a reshape\n      after the softmax.\n    - automatically wrapping user-supplied callables with output_layer='logits'\n      is even worse, see `wrapper_warning_logits`\n    Note: this function will be removed at the same time as the code that\n    calls it.\n    \"\"\"\n    warnings.warn(\n        \"Passing a callable is deprecated, because using\"\n        \" probabilities is dangerous. It has a high risk \"\n        \" of causing gradient masking due to loss of precision \"\n        \" in the softmax op. Passing a callable rather than a \"\n        \" Model subclass will become an error on or after \"\n        \" 2019-04-24.\"\n    )\n\n\ndef wrapper_warning_logits():\n    \"\"\"\n    Issue a deprecation warning. Used in multiple places that implemented\n    attacks by automatically wrapping a user-supplied callable with a\n    CallableModelWrapper with output_layer=\"logits\".\n    This is dangerous because it is under-the-hood automagic that the user\n    may not realize has been invoked for them. If they pass a callable\n    that actually outputs probs, the probs will be treated as logits,\n    resulting in an incorrect cross-entropy loss and severe gradient\n    masking.\n    \"\"\"\n    warnings.warn(\n        \"Passing a callable is deprecated, because it runs the \"\n        \"risk of accidentally using probabilities in the place \"\n        \"of logits. Please switch to passing a Model subclass \"\n        \"so that you clearly specify which values are the logits. \"\n        \"Passing a callable rather than a Model subclass will become \"\n        \"an error on or after 2019-04-24.\"\n    )\n\n\nclass NoSuchLayerError(ValueError):\n    \"\"\"Raised when a layer that does not exist is requested.\"\"\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/__init__.py",
    "content": "\"\"\"\nA module for hosting a variety of models of interest to the adversarial\nexample community.\n\nWarning:\n  This module is not nearly as conservative as the rest of CleverHans.\n  Most of CleverHans is used to create rigorous vulnerability benchmarks.\n  For example, the error rate caused by an Attack is considered to be\n  part of the API for that Attack, so we upgrade the major version number\n  whenever it changes.\n  Models in the model zoo can be tweaked regularly to improve accuracy,\n  training speed, robustness, etc.\n\"\"\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/all_convolutional.py",
    "content": "\"\"\"Extremely simple model where all parameters are from convolutions.\n\"\"\"\n\nimport math\nimport tensorflow as tf\n\nfrom cleverhans import initializers\nfrom cleverhans.serial import NoRefModel\n\n\nclass ModelAllConvolutional(NoRefModel):\n    \"\"\"\n    A simple model that uses only convolution and downsampling---no batch norm or other techniques that can complicate\n    adversarial training.\n    \"\"\"\n\n    def __init__(self, scope, nb_classes, nb_filters, input_shape, **kwargs):\n        del kwargs\n        NoRefModel.__init__(self, scope, nb_classes, locals())\n        self.nb_filters = nb_filters\n        self.input_shape = input_shape\n\n        # Do a dummy run of fprop to create the variables from the start\n        self.fprop(tf.placeholder(tf.float32, [32] + input_shape))\n        # Put a reference to the params in self so that the params get pickled\n        self.params = self.get_params()\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        conv_args = dict(\n            activation=tf.nn.leaky_relu,\n            kernel_initializer=initializers.HeReLuNormalInitializer,\n            kernel_size=3,\n            padding=\"same\",\n        )\n        y = x\n\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            log_resolution = int(round(math.log(self.input_shape[0]) / math.log(2)))\n            for scale in range(log_resolution - 2):\n                y = tf.layers.conv2d(y, self.nb_filters << scale, **conv_args)\n                y = tf.layers.conv2d(y, self.nb_filters << (scale + 1), **conv_args)\n                y = tf.layers.average_pooling2d(y, 2, 2)\n            y = tf.layers.conv2d(y, self.nb_classes, **conv_args)\n            logits = tf.reduce_mean(y, [1, 2])\n            return {self.O_LOGITS: logits, self.O_PROBS: tf.nn.softmax(logits=logits)}\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/basic_cnn.py",
    "content": "\"\"\"\nA pure TensorFlow implementation of a convolutional neural network.\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport functools\n\nimport tensorflow as tf\n\nfrom cleverhans import initializers\nfrom cleverhans.model import Model\n\n\nclass ModelBasicCNN(Model):\n    def __init__(self, scope, nb_classes, nb_filters, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n        self.nb_filters = nb_filters\n\n        # Do a dummy run of fprop to make sure the variables are created from\n        # the start\n        self.fprop(tf.placeholder(tf.float32, [128, 28, 28, 1]))\n        # Put a reference to the params in self so that the params get pickled\n        self.params = self.get_params()\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        my_conv = functools.partial(\n            tf.layers.conv2d,\n            activation=tf.nn.relu,\n            kernel_initializer=initializers.HeReLuNormalInitializer,\n        )\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            y = my_conv(x, self.nb_filters, 8, strides=2, padding=\"same\")\n            y = my_conv(y, 2 * self.nb_filters, 6, strides=2, padding=\"valid\")\n            y = my_conv(y, 2 * self.nb_filters, 5, strides=1, padding=\"valid\")\n            logits = tf.layers.dense(\n                tf.layers.flatten(y),\n                self.nb_classes,\n                kernel_initializer=initializers.HeReLuNormalInitializer,\n            )\n            return {self.O_LOGITS: logits, self.O_PROBS: tf.nn.softmax(logits=logits)}\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/deep_k_nearest_neighbors/README.md",
    "content": "# Deep k-Nearest Neighbors\n\nCode in `dknn.py` shows how to reproduce one of the results from the\nfollowing paper, using the MNIST dataset. It can be\nadapted to use other datasets and any attack supported by CleverHans.\nThe LSH backend used in the paper is FALCONN.\n\n**Deep k-Nearest Neighbors: Towards Confident, Interpretable and Robust Deep Learning**\n*Nicolas Papernot, Patrick McDaniel*\n\nDeep neural networks(DNNs) enable innovative applications of machine learning\nlike image recognition, machine translation, or malware detection. However, deep\nlearning is often criticized for its lack of robustness in adversarial\nsettings(e.g., vulnerability to adversarial inputs) and general inability to\nrationalize its predictions. In this work, we exploit the structure of deep\nlearning to enable new learning-based inference and decision strategies that\nachieve desirable properties such as robustness and interpretability. We take a\nfirst step in this direction and introduce the Deep k-Nearest Neighbors(DkNN).\nThis hybrid classifier combines the k-nearest neighbors algorithm with\nrepresentations of the data learned by each layer of the DNN: a test input is\ncompared to its neighboring training points according to the distance that\nseparates them in the representations. We show the labels of these neighboring\npoints afford confidence estimates for inputs outside the model's training\nmanifold, including on malicious inputs like adversarial examples--and therein\nprovides protections against inputs that are outside the models understanding.\nThis is because the nearest neighbors can be used to estimate the nonconformity\nof, i.e., the lack of support for, a prediction in the training data. The\nneighbors also constitute human-interpretable explanations of predictions. We\nevaluate the DkNN algorithm on several datasets, and show the confidence\nestimates accurately identify inputs outside the model, and that the\nexplanations provided by nearest neighbors are intuitive and useful in\nunderstanding model failures.\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/deep_k_nearest_neighbors/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/deep_k_nearest_neighbors/dknn.py",
    "content": "\"\"\"\nThis code reproduces the MNIST results from the paper\nDeep k-Nearest Neighbors: Towards Confident, Interpretable and Robust Deep Learning\nhttps://arxiv.org/abs/1803.04765\n\nThe LSH backend used in the paper is FALCONN. This script also demonstrates\nhow to use an alternative backend called FAISS.\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport copy\nimport os\nfrom bisect import bisect_left\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom six.moves import xrange\nimport enum\nimport tensorflow as tf\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.loss import CrossEntropy\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.model import Model\nfrom cleverhans.picklable_model import MLP, Conv2D, ReLU, Flatten, Linear, Softmax\nfrom cleverhans.train import train\nfrom cleverhans.utils_tf import batch_eval, model_eval\n\nif \"DISPLAY\" not in os.environ:\n    matplotlib.use(\"Agg\")\n\n\nFLAGS = tf.flags.FLAGS\n\n\ndef make_basic_picklable_cnn(\n    nb_filters=64, nb_classes=10, input_shape=(None, 28, 28, 1)\n):\n    \"\"\"The model for the picklable models tutorial.\"\"\"\n    layers = [\n        Conv2D(nb_filters, (8, 8), (2, 2), \"SAME\"),\n        ReLU(),\n        Conv2D(nb_filters * 2, (6, 6), (2, 2), \"VALID\"),\n        ReLU(),\n        Conv2D(nb_filters * 2, (5, 5), (1, 1), \"VALID\"),\n        ReLU(),\n        Flatten(),\n        Linear(nb_classes),\n        Softmax(),\n    ]\n    model = MLP(layers, input_shape)\n    return model\n\n\nclass NearestNeighbor:\n    class BACKEND(enum.Enum):\n        FALCONN = 1\n        FAISS = 2\n\n    def __init__(\n        self,\n        backend,\n        dimension,\n        neighbors,\n        number_bits,\n        nb_tables=None,\n    ):\n        assert backend in NearestNeighbor.BACKEND\n\n        self._NEIGHBORS = neighbors\n        self._BACKEND = backend\n\n        if self._BACKEND is NearestNeighbor.BACKEND.FALCONN:\n            self._init_falconn(dimension, number_bits, nb_tables)\n        elif self._BACKEND is NearestNeighbor.BACKEND.FAISS:\n            self._init_faiss(\n                dimension,\n            )\n        else:\n            raise NotImplementedError\n\n    def _init_falconn(\n        self,\n        dimension,\n        number_bits,\n        nb_tables,\n    ):\n        import falconn\n\n        assert nb_tables >= self._NEIGHBORS\n\n        # LSH parameters\n        params_cp = falconn.LSHConstructionParameters()\n        params_cp.dimension = dimension\n        params_cp.lsh_family = falconn.LSHFamily.CrossPolytope\n        params_cp.distance_function = falconn.DistanceFunction.EuclideanSquared\n        params_cp.l = nb_tables\n        params_cp.num_rotations = (\n            2  # for dense set it to 1; for sparse data set it to 2\n        )\n        params_cp.seed = 5721840\n        # we want to use all the available threads to set up\n        params_cp.num_setup_threads = 0\n        params_cp.storage_hash_table = falconn.StorageHashTable.BitPackedFlatHashTable\n\n        # we build number_bits-bit hashes so that each table has\n        # 2^number_bits bins; a rule of thumb is to have the number\n        # of bins be the same order of magnitude as the number of data points\n        falconn.compute_number_of_hash_functions(number_bits, params_cp)\n        self._falconn_table = falconn.LSHIndex(params_cp)\n        self._falconn_query_object = None\n        self._FALCONN_NB_TABLES = nb_tables\n\n    def _init_faiss(\n        self,\n        dimension,\n    ):\n        import faiss\n\n        res = faiss.StandardGpuResources()\n\n        self._faiss_index = faiss.GpuIndexFlatL2(\n            res,\n            dimension,\n        )\n\n    def _find_knns_falconn(self, x, output):\n        # Late falconn query_object construction\n        # Since I suppose there might be an error\n        # if table.setup() will be called after\n        if self._falconn_query_object is None:\n            self._falconn_query_object = self._falconn_table.construct_query_object()\n            self._falconn_query_object.set_num_probes(self._FALCONN_NB_TABLES)\n\n        missing_indices = np.zeros(output.shape, dtype=np.bool)\n\n        for i in range(x.shape[0]):\n            query_res = self._falconn_query_object.find_k_nearest_neighbors(\n                x[i], self._NEIGHBORS\n            )\n            try:\n                output[i, :] = query_res\n            except:  # pylint: disable-msg=W0702\n                # mark missing indices\n                missing_indices[i, len(query_res) :] = True\n\n                output[i, : len(query_res)] = query_res\n\n        return missing_indices\n\n    def _find_knns_faiss(self, x, output):\n        neighbor_distance, neighbor_index = self._faiss_index.search(x, self._NEIGHBORS)\n\n        missing_indices = neighbor_distance == -1\n\n        d1 = neighbor_index.reshape(-1)\n\n        output.reshape(-1)[np.logical_not(missing_indices.flatten())] = d1[\n            np.logical_not(missing_indices.flatten())\n        ]\n\n        return missing_indices\n\n    def add(self, x):\n        if self._BACKEND is NearestNeighbor.BACKEND.FALCONN:\n            self._falconn_table.setup(x)\n        elif self._BACKEND is NearestNeighbor.BACKEND.FAISS:\n            self._faiss_index.add(x)\n        else:\n            raise NotImplementedError\n\n    def find_knns(self, x, output):\n        if self._BACKEND is NearestNeighbor.BACKEND.FALCONN:\n            return self._find_knns_falconn(x, output)\n        elif self._BACKEND is NearestNeighbor.BACKEND.FAISS:\n            return self._find_knns_faiss(x, output)\n        else:\n            raise NotImplementedError\n\n\nclass DkNNModel(Model):\n    def __init__(\n        self,\n        neighbors,\n        layers,\n        get_activations,\n        train_data,\n        train_labels,\n        nb_classes,\n        scope=None,\n        nb_tables=200,\n        number_bits=17,\n    ):\n        \"\"\"\n        Implements the DkNN algorithm. See https://arxiv.org/abs/1803.04765 for more details.\n\n        :param neighbors: number of neighbors to find per layer.\n        :param layers: a list of layer names to include in the DkNN.\n        :param get_activations: a callable that takes a np array and a layer name and returns its activations on the data.\n        :param train_data: a np array of training data.\n        :param train_labels: a np vector of training labels.\n        :param nb_classes: the number of classes in the task.\n        :param scope: a TF scope that was used to create the underlying model.\n        :param nb_tables: number of tables used by FALCONN to perform locality-sensitive hashing.\n        :param number_bits: number of hash bits used by LSH.\n        \"\"\"\n        super(DkNNModel, self).__init__(nb_classes=nb_classes, scope=scope)\n        self.neighbors = neighbors\n        self.nb_tables = nb_tables\n        self.layers = layers\n        self.get_activations = get_activations\n        self.nb_cali = -1\n        self.calibrated = False\n        self.number_bits = number_bits\n\n        # Compute training data activations\n        self.nb_train = train_labels.shape[0]\n        assert self.nb_train == train_data.shape[0]\n        self.train_activations = get_activations(train_data)\n        self.train_labels = train_labels\n\n        # Build locality-sensitive hashing tables for training representations\n        self.train_activations_lsh = copy.copy(self.train_activations)\n        self.init_lsh()\n\n    def init_lsh(self):\n        \"\"\"\n        Initializes locality-sensitive hashing with FALCONN to find nearest neighbors in training data.\n        \"\"\"\n        self.query_objects = (\n            {}\n        )  # contains the object that can be queried to find nearest neighbors at each layer.\n        # mean of training data representation per layer (that needs to be substracted before\n        # NearestNeighbor).\n        self.centers = {}\n        for layer in self.layers:\n            # Normalize all the lenghts, since we care about the cosine similarity.\n            self.train_activations_lsh[layer] /= np.linalg.norm(\n                self.train_activations_lsh[layer], axis=1\n            ).reshape(-1, 1)\n\n            # Center the dataset and the queries: this improves the performance of LSH quite a bit.\n            center = np.mean(self.train_activations_lsh[layer], axis=0)\n            self.train_activations_lsh[layer] -= center\n            self.centers[layer] = center\n\n            print(\"Constructing the NearestNeighbor table\")\n            self.query_objects[layer] = NearestNeighbor(\n                backend=FLAGS.nearest_neighbor_backend,\n                dimension=self.train_activations_lsh[layer].shape[1],\n                number_bits=self.number_bits,\n                neighbors=self.neighbors,\n                nb_tables=self.nb_tables,\n            )\n\n            self.query_objects[layer].add(self.train_activations_lsh[layer])\n\n    def find_train_knns(self, data_activations):\n        \"\"\"\n        Given a data_activation dictionary that contains a np array with activations for each layer,\n        find the knns in the training data.\n        \"\"\"\n        knns_ind = {}\n        knns_labels = {}\n\n        for layer in self.layers:\n            # Pre-process representations of data to normalize and remove training data mean.\n            data_activations_layer = copy.copy(data_activations[layer])\n            nb_data = data_activations_layer.shape[0]\n            data_activations_layer /= np.linalg.norm(\n                data_activations_layer, axis=1\n            ).reshape(-1, 1)\n            data_activations_layer -= self.centers[layer]\n\n            # Use FALCONN to find indices of nearest neighbors in training data.\n            knns_ind[layer] = np.zeros(\n                (data_activations_layer.shape[0], self.neighbors), dtype=np.int32\n            )\n            knn_errors = 0\n\n            knn_missing_indices = self.query_objects[layer].find_knns(\n                data_activations_layer,\n                knns_ind[layer],\n            )\n\n            knn_errors += knn_missing_indices.flatten().sum()\n\n            # Find labels of neighbors found in the training data.\n            knns_labels[layer] = np.zeros((nb_data, self.neighbors), dtype=np.int32)\n\n            knns_labels[layer].reshape(-1)[\n                np.logical_not(knn_missing_indices.flatten())\n            ] = self.train_labels[\n                knns_ind[layer].reshape(-1)[\n                    np.logical_not(knn_missing_indices.flatten())\n                ]\n            ]\n\n        return knns_ind, knns_labels\n\n    def nonconformity(self, knns_labels):\n        \"\"\"\n        Given an dictionary of nb_data x nb_classes dimension, compute the nonconformity of\n        each candidate label for each data point: i.e. the number of knns whose label is\n        different from the candidate label.\n        \"\"\"\n        nb_data = knns_labels[self.layers[0]].shape[0]\n        knns_not_in_class = np.zeros((nb_data, self.nb_classes), dtype=np.int32)\n        for i in range(nb_data):\n            # Compute number of nearest neighbors per class\n            knns_in_class = np.zeros(\n                (len(self.layers), self.nb_classes), dtype=np.int32\n            )\n            for layer_id, layer in enumerate(self.layers):\n                knns_in_class[layer_id, :] = np.bincount(\n                    knns_labels[layer][i], minlength=self.nb_classes\n                )\n\n            # Compute number of knns in other class than class_id\n            for class_id in range(self.nb_classes):\n                knns_not_in_class[i, class_id] = np.sum(knns_in_class) - np.sum(\n                    knns_in_class[:, class_id]\n                )\n        return knns_not_in_class\n\n    def preds_conf_cred(self, knns_not_in_class):\n        \"\"\"\n        Given an array of nb_data x nb_classes dimensions, use conformal prediction to compute\n        the DkNN's prediction, confidence and credibility.\n        \"\"\"\n        nb_data = knns_not_in_class.shape[0]\n        preds_knn = np.zeros(nb_data, dtype=np.int32)\n        confs = np.zeros((nb_data, self.nb_classes), dtype=np.float32)\n        creds = np.zeros((nb_data, self.nb_classes), dtype=np.float32)\n\n        for i in range(nb_data):\n            # p-value of test input for each class\n            p_value = np.zeros(self.nb_classes, dtype=np.float32)\n\n            for class_id in range(self.nb_classes):\n                # p-value of (test point, candidate label)\n                p_value[class_id] = (\n                    float(self.nb_cali)\n                    - bisect_left(\n                        self.cali_nonconformity, knns_not_in_class[i, class_id]\n                    )\n                ) / float(self.nb_cali)\n\n            preds_knn[i] = np.argmax(p_value)\n            confs[i, preds_knn[i]] = 1.0 - np.sort(p_value)[-2]\n            creds[i, preds_knn[i]] = p_value[preds_knn[i]]\n        return preds_knn, confs, creds\n\n    def fprop_np(self, data_np):\n        \"\"\"\n        Performs a forward pass through the DkNN on an numpy array of data.\n        \"\"\"\n        if not self.calibrated:\n            raise ValueError(\n                \"DkNN needs to be calibrated by calling DkNNModel.calibrate method once before inferring.\"\n            )\n        data_activations = self.get_activations(data_np)\n        _, knns_labels = self.find_train_knns(data_activations)\n        knns_not_in_class = self.nonconformity(knns_labels)\n        _, _, creds = self.preds_conf_cred(knns_not_in_class)\n        return creds\n\n    def fprop(self, x):\n        \"\"\"\n        Performs a forward pass through the DkNN on a TF tensor by wrapping\n        the fprop_np method.\n        \"\"\"\n        logits = tf.py_func(self.fprop_np, [x], tf.float32)\n        return {self.O_LOGITS: logits}\n\n    def calibrate(self, cali_data, cali_labels):\n        \"\"\"\n        Runs the DkNN on holdout data to calibrate the credibility metric.\n        :param cali_data: np array of calibration data.\n        :param cali_labels: np vector of calibration labels.\n        \"\"\"\n        self.nb_cali = cali_labels.shape[0]\n        self.cali_activations = self.get_activations(cali_data)\n        self.cali_labels = cali_labels\n\n        print(\"Starting calibration of DkNN.\")\n        cali_knns_ind, cali_knns_labels = self.find_train_knns(self.cali_activations)\n        assert all(\n            [v.shape == (self.nb_cali, self.neighbors) for v in cali_knns_ind.values()]\n        )\n        assert all(\n            [\n                v.shape == (self.nb_cali, self.neighbors)\n                for v in cali_knns_labels.values()\n            ]\n        )\n\n        cali_knns_not_in_class = self.nonconformity(cali_knns_labels)\n        cali_knns_not_in_l = np.zeros(self.nb_cali, dtype=np.int32)\n        for i in range(self.nb_cali):\n            cali_knns_not_in_l[i] = cali_knns_not_in_class[i, cali_labels[i]]\n        cali_knns_not_in_l_sorted = np.sort(cali_knns_not_in_l)\n        self.cali_nonconformity = np.trim_zeros(cali_knns_not_in_l_sorted, trim=\"f\")\n        self.nb_cali = self.cali_nonconformity.shape[0]\n        self.calibrated = True\n        print(\"DkNN calibration complete.\")\n\n\ndef plot_reliability_diagram(confidence, labels, filepath):\n    \"\"\"\n    Takes in confidence values for predictions and correct\n    labels for the data, plots a reliability diagram.\n    :param confidence: nb_samples x nb_classes (e.g., output of softmax)\n    :param labels: vector of nb_samples\n    :param filepath: where to save the diagram\n    :return:\n    \"\"\"\n    assert len(confidence.shape) == 2\n    assert len(labels.shape) == 1\n    assert confidence.shape[0] == labels.shape[0]\n    print(\"Saving reliability diagram at: \" + str(filepath))\n    if confidence.max() <= 1.0:\n        # confidence array is output of softmax\n        bins_start = [b / 10.0 for b in xrange(0, 10)]\n        bins_end = [b / 10.0 for b in xrange(1, 11)]\n        bins_center = [(b + 0.5) / 10.0 for b in xrange(0, 10)]\n        preds_conf = np.max(confidence, axis=1)\n        preds_l = np.argmax(confidence, axis=1)\n    else:\n        raise ValueError(\"Confidence values go above 1.\")\n\n    print(preds_conf.shape, preds_l.shape)\n\n    # Create var for reliability diagram\n    # Will contain mean accuracies for each bin\n    reliability_diag = []\n    num_points = []  # keeps the number of points in each bar\n\n    # Find average accuracy per confidence bin\n    for bin_start, bin_end in zip(bins_start, bins_end):\n        above = preds_conf >= bin_start\n        if bin_end == 1.0:\n            below = preds_conf <= bin_end\n        else:\n            below = preds_conf < bin_end\n        mask = np.multiply(above, below)\n        num_points.append(np.sum(mask))\n        bin_mean_acc = max(0, np.mean(preds_l[mask] == labels[mask]))\n        reliability_diag.append(bin_mean_acc)\n\n    # Plot diagram\n    assert len(reliability_diag) == len(bins_center)\n    print(reliability_diag)\n    print(bins_center)\n    print(num_points)\n    fig, ax1 = plt.subplots()\n    _ = ax1.bar(bins_center, reliability_diag, width=0.1, alpha=0.8)\n    plt.xlim([0, 1.0])\n    ax1.set_ylim([0, 1.0])\n\n    ax2 = ax1.twinx()\n    print(sum(num_points))\n    ax2.plot(bins_center, num_points, color=\"r\", linestyle=\"-\", linewidth=7.0)\n    ax2.set_ylabel(\"Number of points in the data\", fontsize=16, color=\"r\")\n\n    if len(np.argwhere(confidence[0] != 0.0)) == 1:\n        # This is a DkNN diagram\n        ax1.set_xlabel(\"Prediction Credibility\", fontsize=16)\n    else:\n        # This is a softmax diagram\n        ax1.set_xlabel(\"Prediction Confidence\", fontsize=16)\n    ax1.set_ylabel(\"Prediction Accuracy\", fontsize=16)\n    ax1.tick_params(axis=\"both\", labelsize=14)\n    ax2.tick_params(axis=\"both\", labelsize=14, colors=\"r\")\n    fig.tight_layout()\n    plt.savefig(filepath, bbox_inches=\"tight\")\n\n\ndef get_tensorflow_session():\n    gpu_options = tf.GPUOptions()\n    gpu_options.per_process_gpu_memory_fraction = FLAGS.tensorflow_gpu_memory_fraction\n    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))\n\n    return sess\n\n\ndef dknn_tutorial():\n    # Get MNIST data.\n    mnist = MNIST()\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Use Image Parameters.\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    with get_tensorflow_session() as sess:\n        with tf.variable_scope(\"dknn\"):\n            # Define input TF placeholder.\n            x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n            y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n\n            # Define a model.\n            model = make_basic_picklable_cnn()\n            preds = model.get_logits(x)\n            loss = CrossEntropy(model, smoothing=0.0)\n\n            # Define the test set accuracy evaluation.\n            def evaluate():\n                acc = model_eval(\n                    sess,\n                    x,\n                    y,\n                    preds,\n                    x_test,\n                    y_test,\n                    args={\"batch_size\": FLAGS.batch_size},\n                )\n                print(\"Test accuracy on test examples: %0.4f\" % acc)\n\n            # Train the model\n            train_params = {\n                \"nb_epochs\": FLAGS.nb_epochs,\n                \"batch_size\": FLAGS.batch_size,\n                \"learning_rate\": FLAGS.lr,\n            }\n            train(\n                sess,\n                loss,\n                x_train,\n                y_train,\n                evaluate=evaluate,\n                args=train_params,\n                var_list=model.get_params(),\n            )\n\n            # Define callable that returns a dictionary of all activations for a dataset\n            def get_activations(data):\n                data_activations = {}\n                for layer in layers:\n                    layer_sym = tf.layers.flatten(model.get_layer(x, layer))\n                    data_activations[layer] = batch_eval(\n                        sess,\n                        [x],\n                        [layer_sym],\n                        [data],\n                        args={\"batch_size\": FLAGS.batch_size},\n                    )[0]\n                return data_activations\n\n            # Use a holdout of the test set to simulate calibration data for the DkNN.\n            train_data = x_train\n            train_labels = np.argmax(y_train, axis=1)\n            cali_data = x_test[: FLAGS.nb_cali]\n            y_cali = y_test[: FLAGS.nb_cali]\n            cali_labels = np.argmax(y_cali, axis=1)\n            test_data = x_test[FLAGS.nb_cali :]\n            y_test = y_test[FLAGS.nb_cali :]\n\n            # Extract representations for the training and calibration data at each layer of interest to the DkNN.\n            layers = [\"ReLU1\", \"ReLU3\", \"ReLU5\", \"logits\"]\n\n            # Wrap the model into a DkNNModel\n            dknn = DkNNModel(\n                FLAGS.neighbors,\n                layers,\n                get_activations,\n                train_data,\n                train_labels,\n                nb_classes,\n                scope=\"dknn\",\n                number_bits=FLAGS.number_bits,\n            )\n            dknn.calibrate(cali_data, cali_labels)\n\n            # Generate adversarial examples\n            fgsm = FastGradientMethod(model, sess=sess)\n            attack_params = {\"eps\": 0.25, \"clip_min\": 0.0, \"clip_max\": 1.0}\n            adv = sess.run(fgsm.generate(x, **attack_params), feed_dict={x: test_data})\n\n            # Test the DkNN on clean test data and FGSM test data\n            for data_in, fname in zip([test_data, adv], [\"test\", \"adv\"]):\n                dknn_preds = dknn.fprop_np(data_in)\n                print(dknn_preds.shape)\n                print(\n                    np.mean(np.argmax(dknn_preds, axis=1) == np.argmax(y_test, axis=1))\n                )\n                plot_reliability_diagram(\n                    dknn_preds, np.argmax(y_test, axis=1), \"/tmp/dknn_\" + fname + \".pdf\"\n                )\n\n    return True\n\n\ndef main(argv=None):\n    assert dknn_tutorial()\n\n\nif __name__ == \"__main__\":\n    tf.flags.DEFINE_integer(\"number_bits\", 17, \"number of hash bits used by LSH Index\")\n    tf.flags.DEFINE_float(\n        \"tensorflow_gpu_memory_fraction\",\n        0.25,\n        \"amount of the GPU memory to allocate for a tensorflow Session\",\n    )\n    tf.flags.DEFINE_enum_class(\n        \"nearest_neighbor_backend\",\n        NearestNeighbor.BACKEND.FALCONN,\n        NearestNeighbor.BACKEND,\n        \"NearestNeighbor backend\",\n    )\n    tf.flags.DEFINE_integer(\"nb_epochs\", 6, \"Number of epochs to train model\")\n    tf.flags.DEFINE_integer(\"batch_size\", 500, \"Size of training batches\")\n    tf.flags.DEFINE_float(\"lr\", 0.001, \"Learning rate for training\")\n\n    tf.flags.DEFINE_integer(\"nb_cali\", 750, \"Number of calibration points for the DkNN\")\n    tf.flags.DEFINE_integer(\n        \"neighbors\", 75, \"Number of neighbors per layer for the DkNN\"\n    )\n\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/madry_lab_challenges/__init__.py",
    "content": "\"\"\"\nModels from\nhttps://github.com/MadryLab/cifar10_challenge\n\"\"\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/madry_lab_challenges/cifar10_model.py",
    "content": "\"\"\"cleverhans.model.Model implementation of cifar10_challenge.model.Model\n\nThis re-implementation factors variable creation apart from forward\npropagation so it is possible to run forward propagation more than once\nin the same model.\n\nbased on https://github.com/tensorflow/models/tree/master/resnet\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\nimport tensorflow as tf\nfrom cleverhans.serial import NoRefModel\n\n\nclass Layer(object):\n    def get_output_shape(self):\n        return self.output_shape\n\n\nclass ResNet(NoRefModel):\n    \"\"\"ResNet model.\"\"\"\n\n    def __init__(self, layers, input_shape, scope=None):\n        \"\"\"ResNet constructor.\n\n        :param layers: a list of layers in CleverHans format\n          each with set_input_shape() and fprop() methods.\n        :param input_shape: 4-tuple describing input shape (e.g None, 32, 32, 3)\n        :param scope: string name of scope for Variables\n          This works in two ways.\n          If scope is None, the variables are not put in a scope, and the\n          model is compatible with Saver.restore from the public downloads\n          for the CIFAR10 Challenge.\n          If the scope is a string, then Saver.restore won't work, but the\n          model functions as a picklable NoRefModels that finds its variables\n          based on the scope.\n        \"\"\"\n        super(ResNet, self).__init__(scope, 10, {}, scope is not None)\n        if scope is None:\n            before = list(tf.trainable_variables())\n            before_vars = list(tf.global_variables())\n            self.build(layers, input_shape)\n            after = list(tf.trainable_variables())\n            after_vars = list(tf.global_variables())\n            self.params = [param for param in after if param not in before]\n            self.vars = [var for var in after_vars if var not in before_vars]\n        else:\n            with tf.variable_scope(self.scope):\n                self.build(layers, input_shape)\n\n    def get_vars(self):\n        if hasattr(self, \"vars\"):\n            return self.vars\n        return super(ResNet, self).get_vars()\n\n    def build(self, layers, input_shape):\n        self.layer_names = []\n        self.layers = layers\n        self.input_shape = input_shape\n        if isinstance(layers[-1], Softmax):\n            layers[-1].name = \"probs\"\n            layers[-2].name = \"logits\"\n        else:\n            layers[-1].name = \"logits\"\n        for i, layer in enumerate(self.layers):\n            if hasattr(layer, \"name\"):\n                name = layer.name\n            else:\n                name = layer.__class__.__name__ + str(i)\n                layer.name = name\n            self.layer_names.append(name)\n\n            layer.set_input_shape(input_shape)\n            input_shape = layer.get_output_shape()\n\n    def make_input_placeholder(self):\n        return tf.placeholder(tf.float32, (None, 32, 32, 3))\n\n    def make_label_placeholder(self):\n        return tf.placeholder(tf.float32, (None, 10))\n\n    def fprop(self, x, set_ref=False):\n        if self.scope is not None:\n            with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n                return self._fprop(x, set_ref)\n        return self._prop(x, set_ref)\n\n    def _fprop(self, x, set_ref=False):\n        states = []\n        for layer in self.layers:\n            if set_ref:\n                layer.ref = x\n            x = layer.fprop(x)\n            assert x is not None\n            states.append(x)\n        states = dict(zip(self.layer_names, states))\n        return states\n\n    def add_internal_summaries(self):\n        pass\n\n\ndef _stride_arr(stride):\n    \"\"\"Map a stride scalar to the stride array for tf.nn.conv2d.\"\"\"\n    return [1, stride, stride, 1]\n\n\nclass Input(Layer):\n    def __init__(self):\n        pass\n\n    def set_input_shape(self, input_shape):\n        batch_size, rows, cols, input_channels = input_shape\n        # assert self.mode == 'train' or self.mode == 'eval'\n        \"\"\"Build the core model within the graph.\"\"\"\n        input_shape = list(input_shape)\n        input_shape[0] = 1\n        dummy_batch = tf.zeros(input_shape)\n        dummy_output = self.fprop(dummy_batch)\n        output_shape = [int(e) for e in dummy_output.get_shape()]\n        output_shape[0] = batch_size\n        self.output_shape = tuple(output_shape)\n\n    def fprop(self, x):\n        with tf.variable_scope(\"input\", reuse=tf.AUTO_REUSE):\n            input_standardized = tf.map_fn(\n                lambda img: tf.image.per_image_standardization(img), x\n            )\n            return _conv(\"init_conv\", input_standardized, 3, 3, 16, _stride_arr(1))\n\n\nclass Conv2D(Layer):\n    def __init__(self):\n        pass\n\n    def set_input_shape(self, input_shape):\n        batch_size, rows, cols, input_channels = input_shape\n\n        # Uncomment the following codes to use w28-10 wide residual network.\n        # It is more memory efficient than very deep residual network and has\n        # comparably good performance.\n        # https://arxiv.org/pdf/1605.07146v1.pdf\n        input_shape = list(input_shape)\n        input_shape[0] = 1\n        dummy_batch = tf.zeros(input_shape)\n        dummy_output = self.fprop(dummy_batch)\n        output_shape = [int(e) for e in dummy_output.get_shape()]\n        output_shape[0] = batch_size\n        self.output_shape = tuple(output_shape)\n\n    def fprop(self, x):\n\n        # Update hps.num_residual_units to 9\n        strides = [1, 2, 2]\n        activate_before_residual = [True, False, False]\n        filters = [16, 160, 320, 640]\n        res_func = _residual\n        with tf.variable_scope(\"unit_1_0\", reuse=tf.AUTO_REUSE):\n            x = res_func(\n                x,\n                filters[0],\n                filters[1],\n                _stride_arr(strides[0]),\n                activate_before_residual[0],\n            )\n        for i in range(1, 5):\n            with tf.variable_scope((\"unit_1_%d\" % i), reuse=tf.AUTO_REUSE):\n                x = res_func(x, filters[1], filters[1], _stride_arr(1), False)\n\n        with tf.variable_scope((\"unit_2_0\"), reuse=tf.AUTO_REUSE):\n            x = res_func(\n                x,\n                filters[1],\n                filters[2],\n                _stride_arr(strides[1]),\n                activate_before_residual[1],\n            )\n        for i in range(1, 5):\n            with tf.variable_scope((\"unit_2_%d\" % i), reuse=tf.AUTO_REUSE):\n                x = res_func(x, filters[2], filters[2], _stride_arr(1), False)\n\n        with tf.variable_scope((\"unit_3_0\"), reuse=tf.AUTO_REUSE):\n            x = res_func(\n                x,\n                filters[2],\n                filters[3],\n                _stride_arr(strides[2]),\n                activate_before_residual[2],\n            )\n        for i in range(1, 5):\n            with tf.variable_scope((\"unit_3_%d\" % i), reuse=tf.AUTO_REUSE):\n                x = res_func(x, filters[3], filters[3], _stride_arr(1), False)\n\n        with tf.variable_scope((\"unit_last\"), reuse=tf.AUTO_REUSE):\n            x = _batch_norm(\"final_bn\", x)\n            x = _relu(x, 0.1)\n            x = _global_avg_pool(x)\n\n        return x\n\n\nclass Linear(Layer):\n    def __init__(self, num_hid):\n        self.num_hid = num_hid\n\n    def set_input_shape(self, input_shape):\n        batch_size, dim = input_shape\n        self.input_shape = [batch_size, dim]\n        self.dim = dim\n        self.output_shape = [batch_size, self.num_hid]\n        self.make_vars()\n\n    def make_vars(self):\n        with tf.variable_scope(\"logit\", reuse=tf.AUTO_REUSE):\n            w = tf.get_variable(\n                \"DW\",\n                [self.dim, self.num_hid],\n                initializer=tf.initializers.variance_scaling(distribution=\"uniform\"),\n            )\n            b = tf.get_variable(\n                \"biases\", [self.num_hid], initializer=tf.initializers.constant()\n            )\n        return w, b\n\n    def fprop(self, x):\n        w, b = self.make_vars()\n        return tf.nn.xw_plus_b(x, w, b)\n\n\ndef _batch_norm(name, x):\n    \"\"\"Batch normalization.\"\"\"\n    with tf.name_scope(name):\n        return tf.contrib.layers.batch_norm(\n            inputs=x,\n            decay=0.9,\n            center=True,\n            scale=True,\n            activation_fn=None,\n            updates_collections=None,\n            is_training=False,\n        )\n\n\ndef _residual(x, in_filter, out_filter, stride, activate_before_residual=False):\n    \"\"\"Residual unit with 2 sub layers.\"\"\"\n    if activate_before_residual:\n        with tf.variable_scope(\"shared_activation\"):\n            x = _batch_norm(\"init_bn\", x)\n            x = _relu(x, 0.1)\n            orig_x = x\n    else:\n        with tf.variable_scope(\"residual_only_activation\"):\n            orig_x = x\n            x = _batch_norm(\"init_bn\", x)\n            x = _relu(x, 0.1)\n\n    with tf.variable_scope(\"sub1\"):\n        x = _conv(\"conv1\", x, 3, in_filter, out_filter, stride)\n\n    with tf.variable_scope(\"sub2\"):\n        x = _batch_norm(\"bn2\", x)\n        x = _relu(x, 0.1)\n        x = _conv(\"conv2\", x, 3, out_filter, out_filter, [1, 1, 1, 1])\n\n    with tf.variable_scope(\"sub_add\"):\n        if in_filter != out_filter:\n            orig_x = tf.nn.avg_pool(orig_x, stride, stride, \"VALID\")\n            orig_x = tf.pad(\n                orig_x,\n                [\n                    [0, 0],\n                    [0, 0],\n                    [0, 0],\n                    [(out_filter - in_filter) // 2, (out_filter - in_filter) // 2],\n                ],\n            )\n        x += orig_x\n\n    tf.logging.debug(\"image after unit %s\", x.get_shape())\n    return x\n\n\ndef _decay():\n    \"\"\"L2 weight decay loss.\"\"\"\n    costs = []\n    for var in tf.trainable_variables():\n        if var.op.name.find(\"DW\") > 0:\n            costs.append(tf.nn.l2_loss(var))\n    return tf.add_n(costs)\n\n\ndef _conv(name, x, filter_size, in_filters, out_filters, strides):\n    \"\"\"Convolution.\"\"\"\n    with tf.variable_scope(name, reuse=tf.AUTO_REUSE):\n        n = filter_size * filter_size * out_filters\n        kernel = tf.get_variable(\n            \"DW\",\n            [filter_size, filter_size, in_filters, out_filters],\n            tf.float32,\n            initializer=tf.random_normal_initializer(stddev=np.sqrt(2.0 / n)),\n        )\n        return tf.nn.conv2d(x, kernel, strides, padding=\"SAME\")\n\n\ndef _relu(x, leakiness=0.0):\n    \"\"\"Relu, with optional leaky support.\"\"\"\n    return tf.where(tf.less(x, 0.0), leakiness * x, x, name=\"leaky_relu\")\n\n\ndef _global_avg_pool(x):\n    assert x.get_shape().ndims == 4\n    return tf.reduce_mean(x, [1, 2])\n\n\nclass Softmax(Layer):\n    def __init__(self):\n        pass\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def fprop(self, x):\n        return tf.nn.softmax(x)\n\n\nclass Flatten(Layer):\n    def __init__(self):\n        pass\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        output_width = 1\n        for factor in shape[1:]:\n            output_width *= factor\n        self.output_width = output_width\n        self.output_shape = [None, output_width]\n\n    def fprop(self, x):\n        return tf.reshape(x, [-1, self.output_width])\n\n\ndef make_wresnet(nb_classes=10, input_shape=(None, 32, 32, 3), scope=None):\n    layers = [\n        Input(),\n        Conv2D(),  # the whole ResNet is basically created in this layer\n        Flatten(),\n        Linear(nb_classes),\n        Softmax(),\n    ]\n\n    model = ResNet(layers, input_shape, scope)\n    return model\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/madry_lab_challenges/make_cifar10_joblib.py",
    "content": "\"\"\"Makes a .joblib file containing the trained model\n\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport sys\nimport time\nimport numpy as np\nimport logging\n\nimport tensorflow as tf\nfrom tensorflow.python.platform import app, flags\nfrom cleverhans.utils import set_log_level, to_categorical, safe_zip\nfrom cleverhans.utils_tf import model_eval\nfrom cleverhans import serial\nfrom cleverhans.dataset import CIFAR10, Factory\nfrom cleverhans.model_zoo.madry_lab_challenges.cifar10_model import make_wresnet\n\n\nFLAGS = flags.FLAGS\n\n\ndef main(argv):\n\n    model_file = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)\n\n    if model_file is None:\n        print(\"No model found\")\n        sys.exit()\n\n    set_log_level(logging.DEBUG)\n\n    sess = tf.Session()\n    with sess.as_default():\n\n        model = make_wresnet()\n        saver = tf.train.Saver()\n        # Restore the checkpoint\n        saver.restore(sess, model_file)\n        SCOPE = \"cifar10_challenge\"\n        model2 = make_wresnet(scope=SCOPE)\n        assert len(model.get_vars()) == len(model2.get_vars())\n        found = [False] * len(model2.get_vars())\n        for var1 in model.get_vars():\n            var1_found = False\n            var2_name = SCOPE + \"/\" + var1.name\n            for idx, var2 in enumerate(model2.get_vars()):\n                if var2.name == var2_name:\n                    var1_found = True\n                    found[idx] = True\n                    sess.run(tf.assign(var2, var1))\n                    break\n            assert var1_found, var1.name\n        assert all(found)\n\n        model2.dataset_factory = Factory(CIFAR10, {\"max_val\": 255})\n\n        serial.save(\"model.joblib\", model2)\n\n\nif __name__ == \"__main__\":\n\n    cifar10_root = os.environ[\"CIFAR10_CHALLENGE_DIR\"]\n    default_ckpt_dir = os.path.join(cifar10_root, \"models/model_0\")\n\n    flags.DEFINE_string(\n        \"checkpoint_dir\", default_ckpt_dir, \"Checkpoint directory to load\"\n    )\n\n    app.run(main)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/soft_nearest_neighbor_loss/SNNL_regularized_model.py",
    "content": "\"\"\"\nA Simple Neural Net to optimize with SNNL and Cross Entropy\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport functools\n\nimport tensorflow as tf\n\nfrom cleverhans import initializers\nfrom cleverhans.model import Model\n\n\nclass ModelBasicCNN(Model):\n    def __init__(self, scope, nb_classes, nb_filters, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n        self.nb_filters = nb_filters\n\n        self.fprop(self.make_input_placeholder())\n\n        self.params = self.get_params()\n\n    def make_input_placeholder(self):\n        return tf.placeholder(tf.float32, [128, 28, 28, 1])\n\n    def get_layer_names(self):\n        return [\"conv1\", \"conv2\", \"conv3\", \"logits\"]\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        my_conv = functools.partial(\n            tf.layers.conv2d,\n            activation=tf.nn.relu,\n            kernel_initializer=initializers.HeReLuNormalInitializer,\n        )\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            conv1 = my_conv(x, self.nb_filters, 8, strides=2, padding=\"same\")\n            conv2 = my_conv(conv1, 2 * self.nb_filters, 6, strides=2, padding=\"valid\")\n            conv3 = my_conv(\n                conv2,\n                2 * self.nb_filters,\n                5,\n                strides=1,\n                padding=\"valid\",\n            )\n            logits = tf.layers.dense(\n                tf.layers.flatten(conv3),\n                self.nb_classes,\n                kernel_initializer=initializers.HeReLuNormalInitializer,\n            )\n            return {\n                self.O_LOGITS: logits,\n                self.O_PROBS: tf.nn.softmax(logits=logits),\n                \"conv1\": conv1,\n                \"conv2\": conv2,\n                \"conv3\": conv3,\n            }\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/soft_nearest_neighbor_loss/SNNL_regularized_train.py",
    "content": "\"\"\"\nThis model shows how to train a model with Soft Nearest Neighbor Loss\nregularization. The paper which presents this method can be found at\nhttps://arxiv.org/abs/1902.01889\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport numpy as np\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nfrom matplotlib.offsetbox import OffsetImage, AnnotationBbox\nfrom sklearn.manifold import TSNE\n\nfrom cleverhans.compat import flags\nfrom cleverhans.loss import SNNLCrossEntropy, CrossEntropy\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.utils_tf import model_eval\nfrom cleverhans.train import train\nfrom cleverhans.utils import AccuracyReport, set_log_level\nfrom cleverhans.model_zoo.soft_nearest_neighbor_loss.SNNL_regularized_model import (\n    ModelBasicCNN,\n)\n\nFLAGS = flags.FLAGS\n\nNB_EPOCHS = 6\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\nNB_FILTERS = 64\nSNNL_FACTOR = -10.0\nOUTPUT_DIR = \"/tmp/\"\n\n\ndef SNNL_example(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    learning_rate=LEARNING_RATE,\n    nb_filters=NB_FILTERS,\n    SNNL_factor=SNNL_FACTOR,\n    output_dir=OUTPUT_DIR,\n):\n    \"\"\"\n    A simple model trained to minimize Cross Entropy and Maximize Soft Nearest\n    Neighbor Loss at each internal layer. This outputs a TSNE of the sign of\n    the adversarial gradients of a trained model. A model with a negative\n    SNNL_factor will show little or no class clusters, while a model with a\n    0 SNNL_factor will have class clusters in the adversarial gradient direction.\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param learning_rate: learning rate for training\n    :param SNNL_factor: multiplier for Soft Nearest Neighbor Loss\n    :return: an AccuracyReport object\n    \"\"\"\n\n    # Object used to keep track of (and return) key accuracies\n    report = AccuracyReport()\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Set logging level to see debug information\n    set_log_level(logging.DEBUG)\n\n    # Create TF session\n    sess = tf.Session()\n\n    # Get MNIST data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Use Image Parameters\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    # Define input TF placeholder\n    x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n    y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n\n    # Train an MNIST model\n    train_params = {\n        \"nb_epochs\": nb_epochs,\n        \"batch_size\": batch_size,\n        \"learning_rate\": learning_rate,\n    }\n    eval_params = {\"batch_size\": batch_size}\n    rng = np.random.RandomState([2017, 8, 30])\n\n    def do_eval(preds, x_set, y_set, report_key):\n        acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params)\n        setattr(report, report_key, acc)\n        print(\"Test accuracy on legitimate examples: %0.4f\" % (acc))\n\n    model = ModelBasicCNN(\"model\", nb_classes, nb_filters)\n    preds = model.get_logits(x)\n    cross_entropy_loss = CrossEntropy(model)\n    if not SNNL_factor:\n        loss = cross_entropy_loss\n    else:\n        loss = SNNLCrossEntropy(model, factor=SNNL_factor, optimize_temperature=False)\n\n    def evaluate():\n        do_eval(preds, x_test, y_test, \"clean_train_clean_eval\")\n\n    train(\n        sess,\n        loss,\n        x_train,\n        y_train,\n        evaluate=evaluate,\n        args=train_params,\n        rng=rng,\n        var_list=model.get_params(),\n    )\n\n    do_eval(preds, x_train, y_train, \"train_clean_train_clean_eval\")\n\n    def imscatter(points, images, ax=None, zoom=1, cmap=\"hot\"):\n        if ax is None:\n            ax = plt.gca()\n        artists = []\n        i = 0\n        if not isinstance(cmap, list):\n            cmap = [cmap] * len(points)\n        for x0, y0 in points:\n            transformed = (images[i] - np.min(images[i])) / (\n                np.max(images[i]) - np.min(images[i])\n            )\n            im = OffsetImage(transformed[:, :, 0], zoom=zoom, cmap=cmap[i])\n            ab = AnnotationBbox(im, (x0, y0), xycoords=\"data\", frameon=False)\n            artists.append(ax.add_artist(ab))\n            i += 1\n        ax.update_datalim(np.column_stack(np.transpose(points)))\n        ax.autoscale()\n        ax.get_xaxis().set_ticks([])\n        ax.get_yaxis().set_ticks([])\n        return artists\n\n    adv_grads = tf.sign(tf.gradients(cross_entropy_loss.fprop(x, y), x))\n    feed_dict = {x: x_test[:batch_size], y: y_test[:batch_size]}\n    adv_grads_val = sess.run(adv_grads, feed_dict=feed_dict)\n    adv_grads_val = np.reshape(adv_grads_val, (batch_size, img_rows * img_cols))\n\n    X_embedded = TSNE(n_components=2, verbose=0).fit_transform(adv_grads_val)\n    plt.figure(num=None, figsize=(50, 50), dpi=40, facecolor=\"w\", edgecolor=\"k\")\n    plt.title(\n        \"TSNE of Sign of Adv Gradients, SNNLCrossEntropy Model, factor:\"\n        + str(FLAGS.SNNL_factor),\n        fontsize=42,\n    )\n    imscatter(X_embedded, x_test[:batch_size], zoom=2, cmap=\"Purples\")\n    plt.savefig(\n        output_dir + \"adversarial_gradients_SNNL_factor_\" + str(SNNL_factor) + \".png\"\n    )\n\n\ndef main(argv=None):\n    SNNL_example(\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        learning_rate=FLAGS.learning_rate,\n        nb_filters=FLAGS.nb_filters,\n        SNNL_factor=FLAGS.SNNL_factor,\n        output_dir=FLAGS.output_dir,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_filters\", NB_FILTERS, \"Model size multiplier\")\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_float(\n        \"SNNL_factor\", SNNL_FACTOR, \"Multiplier for Soft Nearest Neighbor Loss\"\n    )\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n    flags.DEFINE_string(\"output_dir\", OUTPUT_DIR, \"output directory for saving figures\")\n\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/model_zoo/soft_nearest_neighbor_loss/__init__.py",
    "content": "\"\"\"\nA model to demonstrate the use of soft nearest neighbor loss presented in\nFrosst, Nicholas, Nicolas Papernot, and Geoffrey Hinton. \"Analyzing and\nImproving Representations with the Soft Nearest Neighbor Loss.\" arXiv preprint\narXiv:1902.01889 (2019).\n\"\"\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/picklable_model.py",
    "content": "\"\"\"Models that support pickling.\n\nNOTE: This module is much more free to change than many other modules\nin CleverHans. CleverHans is very conservative about changes to any\ncode that affects the output of benchmark tests (attacks, evaluation\nmethods, etc.). This module provides *models* not *benchmarks* and\nthus is free to change rapidly to provide better speed, accuracy,\netc.\n\"\"\"\n# pylint: disable=missing-docstring\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport tensorflow as tf\nimport numpy as np\n\nfrom cleverhans.compat import reduce_mean, reduce_prod\nfrom cleverhans.model import Model\nfrom cleverhans.serial import PicklableVariable as PV\nfrom cleverhans.utils import ordered_union\n\n\nclass PicklableModel(Model):\n    \"\"\"\n    A Model that supports pickling.\n\n    Subclasses of this model must use only PicklableVariable and must refer\n    to their variables only by referencing the Python objects, not using\n    TensorFlow names (so no variable scopes). Pickle cannot find variables\n    referenced only by name and thus may fail to save them. Pickle may not\n    be able to get the original name back when restoring the variable so the\n    names should not be relied on.\n    \"\"\"\n\n    def __init__(self):\n        super(PicklableModel, self).__init__()\n        del self.scope  # Must not use Variable scopes / names for anything\n\n    def get_params(self):\n        raise NotImplementedError(\n            str(type(self)) + \" does not implement\" \" get_params.\"\n        )\n\n\nclass MLP(PicklableModel):\n    \"\"\"\n    A picklable multilayer perceptron\n    \"\"\"\n\n    def __hash__(self):\n        return hash(id(self))\n\n    def __init__(self, layers, input_shape):\n        super(MLP, self).__init__()\n\n        if not isinstance(layers, list):\n            raise ValueError(\"`layers` must be a list.\")\n\n        self.layer_names = []\n        self.layers = layers\n        self.input_shape = input_shape\n\n        if isinstance(layers[-1], Softmax):\n            if not hasattr(layers[-1], \"name\"):\n                layers[-1].name = \"probs\"\n            if not hasattr(layers[-2], \"name\"):\n                layers[-2].name = \"logits\"\n        else:\n            if not hasattr(layers[-1], \"name\"):\n                layers[-1].name = \"logits\"\n        for i, layer in enumerate(self.layers):\n            if layer.parent is None:\n                if i == 0:\n                    layer.parent = \"input\"\n                else:\n                    layer.parent = layers[i - 1].name\n            if hasattr(layer, \"name\"):\n                name = layer.name\n            else:\n                name = layer.__class__.__name__ + str(i)\n                layer.name = name\n            self.layer_names.append(name)\n\n            layer.set_input_shape(input_shape)\n            input_shape = layer.get_output_shape()\n\n    def get_params(self):\n        out = []\n        for layer in self.layers:\n            out = ordered_union(out, layer.get_params())\n        return out\n\n    def fprop(self, x=None, given=None, **kwargs):\n\n        # Note: this currently isn't great.\n        # A layer can have any parent it wants, but the parent\n        # must come earlier in the list.\n        # There's no way to have > 1 parent.\n        # This means we can support branched structures that split,\n        # e.g. for multiple output heads, but not structures\n        # that converge.\n        # We can feed a value in the middle using \"given\" but\n        # only layers after the given one are run using the current\n        # implementation, so the feed must happen before any branch\n        # point.\n\n        if x is None:\n            if given is None:\n                raise ValueError(\"One of `x` or `given` must be specified\")\n        else:\n            assert given is None\n            given = (\"input\", x)\n        name, value = given\n        out = {name: value}\n        x = value\n\n        if name == \"input\":\n            layers = self.layers\n        else:\n            for i, layer in enumerate(self.layers[:-1]):\n                if layer.name == name:\n                    layers = self.layers[i + 1 :]\n                    break\n\n        for layer in layers:\n            x = out[layer.parent]\n            try:\n                x = layer.fprop(x, **kwargs)\n            except TypeError as e:\n                msg = \"TypeError in fprop for %s of type %s: %s\"\n                msg = msg % (layer.name, str(type(layer)), str(e))\n                raise TypeError(msg)\n            assert x is not None\n            out[layer.name] = x\n        return out\n\n    def make_input_placeholder(self):\n        return tf.placeholder(tf.float32, tuple(self.input_shape))\n\n    def make_label_placeholder(self):\n        try:\n            return self.layers[-1].make_label_placeholder()\n        except NotImplementedError:\n            return tf.placeholder(tf.float32, self.layers[-1].get_output_shape())\n\n\nclass Layer(PicklableModel):\n    def __init__(self, name=None, parent=None):\n        super(Layer, self).__init__()\n        if name is not None:\n            self.name = name\n        self.parent = parent\n\n    def get_output_shape(self):\n        return self.output_shape\n\n\nclass Linear(Layer):\n    \"\"\"\n    Linear, fully connected layer.\n    :param init_mode: string\n        \"norm\" : the weight vector for each output is initialized to have\n                 the same norm, given by `init_scale`\n       \"uniform_unit_scaling\" :  U(-sqrt(3/input_dim), sqrt(3/input_dim))\n            from https://arxiv.org/abs/1412.6558\n    \"\"\"\n\n    def __init__(\n        self,\n        num_hid,\n        init_scale=1.0,\n        init_b=0.0,\n        use_bias=True,\n        init_mode=\"norm\",\n        **kwargs\n    ):\n        super(Linear, self).__init__(**kwargs)\n        self.num_hid = num_hid\n        self.init_scale = init_scale\n        self.init_b = init_b\n        self.use_bias = use_bias\n        self.init_mode = init_mode\n\n    def set_input_shape(self, input_shape):\n        batch_size, dim = input_shape\n        self.input_shape = [batch_size, dim]\n        self.output_shape = [batch_size, self.num_hid]\n        if self.init_mode == \"norm\":\n            init = tf.random_normal([dim, self.num_hid], dtype=tf.float32)\n            init = init / tf.sqrt(\n                1e-7 + tf.reduce_sum(tf.square(init), axis=0, keep_dims=True)\n            )\n            init = init * self.init_scale\n        elif self.init_mode == \"uniform_unit_scaling\":\n            scale = np.sqrt(3.0 / dim)\n            init = tf.random_uniform(\n                [dim, self.num_hid], dtype=tf.float32, minval=-scale, maxval=scale\n            )\n        else:\n            raise ValueError(self.init_mode)\n        self.W = PV(init)\n        if self.use_bias:\n            self.b = PV((np.zeros((self.num_hid,)) + self.init_b).astype(\"float32\"))\n\n    def fprop(self, x, **kwargs):\n        out = tf.matmul(x, self.W.var)\n        if self.use_bias:\n            out = out + self.b.var\n        return out\n\n    def get_params(self):\n        out = [self.W.var]\n        if self.use_bias:\n            out.append(self.b.var)\n        return out\n\n\nclass Conv2D(Layer):\n    \"\"\"\n    2-D Convolution. Uses NHWC format for input and output.\n    :param output_channels: int\n        The number of channels to output\n    :param kernel_shape: tuple of two ints\n        (kernel rows, kernel columns)\n        Do not include input channels or output channels in kernel_shape.\n    :param strides: tuple of two ints\n        (row stride, column stride)\n        Do not include channel or batch strides.\n    :param use_bias: bool\n        If True (default is False) adds a per-channel bias term to the output\n    :param init_mode: string\n        \"norm\" : each kernel is initialized to have the same norm,\n                 given by `init_scale`\n       \"inv_sqrt\" :  Gaussian with standard devation given by sqrt(2/fan_out)\n       \"glorot_uniform\" : U(+/- sqrt(6/(fan_in+fan_out))\n    \"\"\"\n\n    def __init__(\n        self,\n        output_channels,\n        kernel_shape,\n        strides,\n        padding,\n        use_bias=False,\n        init_scale=1.0,\n        init_mode=\"norm\",\n        **kwargs\n    ):\n        self.__dict__.update(locals())\n        del self.self\n        super(Conv2D, self).__init__(**kwargs)\n\n    def set_input_shape(self, input_shape):\n        _batch_size, _rows, _cols, input_channels = input_shape\n        assert len(self.kernel_shape) == 2\n        kernel_shape = tuple(self.kernel_shape) + (input_channels, self.output_channels)\n        assert len(kernel_shape) == 4\n        assert all(isinstance(e, int) for e in kernel_shape), kernel_shape\n        fan_in = self.kernel_shape[0] * self.kernel_shape[1] * input_channels\n        fan_out = self.kernel_shape[0] * self.kernel_shape[1] * self.output_channels\n        if self.init_mode == \"norm\":\n            init = tf.random_normal(kernel_shape, dtype=tf.float32)\n            squared_norms = tf.reduce_sum(tf.square(init), axis=(0, 1, 2))\n            denom = tf.sqrt(1e-7 + squared_norms)\n            init = self.init_scale * init / denom\n        elif self.init_mode == \"inv_sqrt\":\n            init = tf.random_normal(\n                kernel_shape, dtype=tf.float32, stddev=np.sqrt(2.0 / fan_out)\n            )\n        elif self.init_mode == \"glorot_uniform\":\n            scale = np.sqrt(6.0 / (fan_in + fan_out))\n            init = tf.random_uniform(\n                kernel_shape, dtype=tf.float32, minval=-scale, maxval=scale\n            )\n        else:\n            raise ValueError(self.init_mode)\n        self.kernels = PV(init, name=self.name + \"_kernels\")\n        if self.use_bias:\n            self.b = PV(np.zeros((self.output_channels,)).astype(\"float32\"))\n        input_shape = list(input_shape)\n        orig_batch_size = input_shape[0]\n        input_shape[0] = 1\n        dummy_batch = tf.zeros(input_shape)\n        dummy_output = self.fprop(dummy_batch)\n        output_shape = [int(e) for e in dummy_output.get_shape()]\n        output_shape[0] = orig_batch_size\n        self.output_shape = tuple(output_shape)\n\n    def fprop(self, x, **kwargs):\n        assert len(self.strides) == 2\n        out = tf.nn.conv2d(\n            x, self.kernels.var, (1,) + tuple(self.strides) + (1,), self.padding\n        )\n        if self.use_bias:\n            out = out + self.b.var\n        return out\n\n    def get_params(self):\n        out = [self.kernels.var]\n        if self.use_bias:\n            out.append(self.b.var)\n        return out\n\n\nclass ReLU(Layer):\n    def __init__(self, leak=0.0, **kwargs):\n        super(ReLU, self).__init__(**kwargs)\n        self.leak = leak\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def get_output_shape(self):\n        return self.output_shape\n\n    def fprop(self, x, **kwargs):\n        out = tf.nn.relu(x)\n        if self.leak != 0.0:\n            # The code commented below resulted in the time per epoch of\n            # an 8-GPU wide resnet increasing by about 5% relative to the\n            # code now in use.\n            # The two different implementations have the same forward prop\n            # down to machine precision on all inputs I have tested, but\n            # sometimes have different derivatives.\n            # Both obtain about the same training accuracy but the faster\n            # version seems to also be slightly more accurate.\n            # The commented code and these performance notes are included to\n            # aid future revision efforts.\n            #\n            # out = out - self.leak * tf.nn.relu(-x)\n            #\n\n            out = tf.where(tf.less(x, 0.0), self.leak * x, x)\n        return out\n\n    def get_params(self):\n        return []\n\n\nclass Sigmoid(Layer):\n    def __init__(self, **kwargs):\n        super(Sigmoid, self).__init__(**kwargs)\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def get_output_shape(self):\n        return self.output_shape\n\n    def fprop(self, x, **kwargs):\n        return tf.nn.sigmoid(x)\n\n    def get_params(self):\n        return []\n\n\nclass Tanh(Layer):\n    def __init__(self, **kwargs):\n        super(Tanh, self).__init__(**kwargs)\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def get_output_shape(self):\n        return self.output_shape\n\n    def fprop(self, x, **kwargs):\n        return tf.nn.tanh(x)\n\n    def get_params(self):\n        return []\n\n\nclass LeakyReLU(ReLU):\n    def __init__(self, leak=0.2, **kwargs):\n        super(LeakyReLU, self).__init__(leak=leak, **kwargs)\n\n\nclass ELU(Layer):\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def get_output_shape(self):\n        return self.output_shape\n\n    def fprop(self, x, **kwargs):\n        return tf.nn.elu(x)\n\n    def get_params(self):\n        return []\n\n\nclass SELU(Layer):\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def get_output_shape(self):\n        return self.output_shape\n\n    def fprop(self, x, **kwargs):\n        alpha = 1.6732632423543772848170429916717\n        scale = 1.0507009873554804934193349852946\n        mask = tf.to_float(x >= 0.0)\n        out = mask * x + (1.0 - mask) * (alpha * tf.exp((1.0 - mask) * x) - alpha)\n        return scale * out\n\n    def get_params(self):\n        return []\n\n\nclass TanH(Layer):\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def get_output_shape(self):\n        return self.output_shape\n\n    def fprop(self, x, **kwargs):\n        return tf.nn.tanh(x)\n\n\nclass Softmax(Layer):\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def fprop(self, x, **kwargs):\n        out = tf.nn.softmax(x)\n        return out\n\n    def get_params(self):\n        return []\n\n    def make_label_placeholder(self):\n        return tf.placeholder(tf.float32, self.output_shape)\n\n\nclass Flatten(Layer):\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        output_width = 1\n        for factor in shape[1:]:\n            output_width *= factor\n        self.output_width = output_width\n        self.output_shape = [None, output_width]\n\n    def fprop(self, x, **kwargs):\n        return tf.reshape(x, [-1, self.output_width])\n\n    def get_params(self):\n        return []\n\n\nclass Print(Layer):\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def get_params(self):\n        return []\n\n    def fprop(self, x, **kwargs):\n        mean = tf.reduce_mean(x)\n        std = tf.sqrt(tf.reduce_mean(tf.square(x - mean)))\n        return tf.Print(\n            x, [tf.reduce_min(x), mean, tf.reduce_max(x), std], \"Print layer\"\n        )\n\n\nclass Add(Layer):\n    \"\"\"\n    A Layer that adds a function to its input.\n    The function to add is specified in terms of multiple layers, just like\n    in the MLP class.\n    The Add layer is useful for implementing residual networks.\n    \"\"\"\n\n    def __hash__(self):\n        return hash(id(self))\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        shapes = {\"input\": shape}\n        for layer in self.layers:\n            layer.set_input_shape(shapes[layer.parent])\n            shapes[layer.name] = layer.get_output_shape()\n        self.output_shape = shapes[self.layers[-1].name]\n\n    def __init__(self, layers):\n        super(Add, self).__init__()\n\n        self.layer_names = []\n        self.layers = layers\n\n        for i, layer in enumerate(self.layers):\n            if layer.parent is None:\n                if i == 0:\n                    layer.parent = \"input\"\n                else:\n                    layer.parent = layers[i - 1].name\n            if hasattr(layer, \"name\"):\n                name = layer.name\n            else:\n                name = layer.__class__.__name__ + str(i)\n                layer.name = name\n            self.layer_names.append(name)\n\n    def get_params(self):\n        out = []\n        for layer in self.layers:\n            out = ordered_union(out, layer.get_params())\n        return out\n\n    def fprop(self, x, **kwargs):\n\n        orig_x = x\n\n        # Note: this currently isn't great.\n        # A layer can have any parent it wants, but the parent\n        # must come earlier in the list.\n        # There's no way to have > 1 parent.\n        # This means we can support branched structures that split,\n        # e.g. for multiple output heads, but not structures\n        # that converge.\n        # We can feed a value in the middle using \"given\" but\n        # only layers after the given one are run using the current\n        # implementation, so the feed must happen before any branch\n        # point.\n\n        out = {\"input\": x}\n\n        for layer in self.layers:\n            x = out[layer.parent]\n            try:\n                x = layer.fprop(x)\n            except TypeError as e:\n                msg = \"TypeError in fprop for layer %s of type %s: %s\"\n                msg = msg % (layer.name, str(type(layer)), str(e))\n                raise TypeError(msg)\n            assert x is not None\n            out[layer.name] = x\n\n        return orig_x + out[self.layers[-1].name]\n\n\nclass PerImageStandardize(Layer):\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def get_params(self):\n        return []\n\n    def fprop(self, x, **kwargs):\n        axis = [1, 2, 3]\n        mean = reduce_mean(x, axis=axis, keepdims=True)\n        variance = reduce_mean(tf.square(x), axis=axis, keepdims=True) - tf.square(mean)\n        variance = tf.nn.relu(variance)\n        stddev = tf.sqrt(variance)\n\n        num_pixels = reduce_prod(tf.shape(x)[1:])\n\n        min_stddev = tf.rsqrt(tf.to_float(num_pixels))\n        pixel_value_scale = tf.maximum(stddev, min_stddev)\n        pixel_value_offset = mean\n\n        x = tf.subtract(x, pixel_value_offset)\n        x = tf.div(x, pixel_value_scale)\n        return x\n\n\nclass Dropout(Layer):\n    \"\"\"Dropout layer.\n\n    By default, is a no-op. Activate it during training using the kwargs\n\n    The default use case is that you never specify include_prob anywhere.\n    During evaluation, you don't do anything special regarding dropout,\n    and nothing gets dropped. During training, you pass \"dropout=True\"\n    to make units get randomly dropped.\n    If you've done nothing else, include_prob defaults to 0.5 in the\n    Dropout class constructor.\n\n    A slightly more advanced use case is that you want to use different\n    include_probs for some layer. For example, people usually use\n    include_prob=0.8 for the input layer. To do this, you specify\n    include_prob in the constructor arguments for those layers.\n    Other than that, it's the same as the basic use case case. You do\n    nothing special at test time and nothing is dropped.\n    You pass dropout=True at train time and units in each layer are dropped\n    based on their include_prob specified in their layer's constructor.\n\n    The most advanced use case is if you want to change dropout include\n    probabilities for a specific fprop call. In this case, you pass\n    dropout=True and dropout_dict for that call. Each layer uses the\n    include_prob specified in the dropout_dict for that call.of MLP.fprop.\n    \"\"\"\n\n    def __init__(self, include_prob=0.5, **kwargs):\n        super(Dropout, self).__init__(**kwargs)\n        self.include_prob = include_prob\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def get_params(self):\n        return []\n\n    def fprop(self, x, dropout=False, dropout_dict=None, **kwargs):\n        \"\"\"\n        Forward propagation as either no-op or dropping random units.\n        :param x: The input to the layer\n        :param dropout: bool specifying whether to drop units\n        :param dropout_dict: dict\n            This dictionary is usually not needed.\n            In rare cases, generally for research purposes, this dictionary\n            makes it possible to run forward propagation with a different\n            dropout include probability.\n            This dictionary should be passed as a named argument to the MLP\n            class, which will then pass it to *all* layers' fprop methods.\n            Other layers will just receive this as an ignored kwargs entry.\n            Each dropout layer looks up its own name in this dictionary\n            to read out its include probability.\n        \"\"\"\n        include_prob = self.include_prob\n        if dropout_dict is not None:\n            assert dropout\n            if self.name in dropout_dict:\n                include_prob = dropout_dict[self.name]\n        if dropout:\n            return tf.nn.dropout(x, include_prob)\n        return x\n\n\nclass ResidualWithGroupNorm(Layer):\n    \"\"\"A residual network layer that uses group normalization.\n\n    :param out_filter: Number of output filters\n    :param stride: int\n        Stride for convolutional layers. Replicated to both row and column.\n    \"\"\"\n\n    def __init__(\n        self, out_filter, stride, activate_before_residual=False, leak=0.1, **kwargs\n    ):\n        assert isinstance(stride, int)\n        self.__dict__.update(locals())\n        del self.self\n        self.lrelu = LeakyReLU(leak)\n        super(ResidualWithGroupNorm, self).__init__(**kwargs)\n\n    def set_input_shape(self, shape):\n        self.input_shape = tuple(shape)\n        self.in_filter = shape[-1]\n        self.gn1 = GroupNorm(name=self.name + \"_gn1\")\n        self.gn1.set_input_shape(shape)\n        strides = (self.stride, self.stride)\n        self.conv1 = Conv2D(\n            self.out_filter,\n            (3, 3),\n            strides,\n            \"SAME\",\n            name=self.name + \"_conv1\",\n            init_mode=\"inv_sqrt\",\n        )\n        self.conv1.set_input_shape(shape)\n        self.gn2 = GroupNorm(name=self.name + \"_gn2\")\n        self.gn2.set_input_shape(self.conv1.get_output_shape())\n        self.conv2 = Conv2D(\n            self.out_filter,\n            (3, 3),\n            (1, 1),\n            \"SAME\",\n            name=self.name + \"_conv2\",\n            init_mode=\"inv_sqrt\",\n        )\n        self.conv2.set_input_shape(self.conv1.get_output_shape())\n        self.output_shape = self.conv2.get_output_shape()\n\n    def get_params(self):\n        sublayers = [self.conv1, self.conv2, self.gn1, self.gn2]\n        params = []\n        for sublayer in sublayers:\n            params = params + sublayer.get_params()\n        assert self.conv1.kernels.var in params\n        return params\n\n    def fprop(self, x, **kwargs):\n        if self.activate_before_residual:\n            x = self.gn1.fprop(x)\n            x = self.lrelu.fprop(x)\n            orig_x = x\n        else:\n            orig_x = x\n            x = self.gn1.fprop(x)\n            x = self.lrelu.fprop(x)\n        x = self.conv1.fprop(x)\n        x = self.gn2.fprop(x)\n        x = self.lrelu.fprop(x)\n        x = self.conv2.fprop(x)\n        if self.stride != 1:\n            stride = [1, self.stride, self.stride, 1]\n            orig_x = tf.nn.avg_pool(orig_x, stride, stride, \"VALID\")\n        out_filter = self.out_filter\n        in_filter = self.in_filter\n        if in_filter != out_filter:\n            orig_x = tf.pad(\n                orig_x,\n                [\n                    [0, 0],\n                    [0, 0],\n                    [0, 0],\n                    [(out_filter - in_filter) // 2, (out_filter - in_filter) // 2],\n                ],\n            )\n        x = x + orig_x\n        return x\n\n\nclass GlobalAveragePool(Layer):\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = [shape[0], shape[-1]]\n\n    def get_params(self):\n        return []\n\n    def fprop(self, x, **kwargs):\n        assert len(list(x.get_shape())) == 4\n        return tf.reduce_mean(x, [1, 2])\n\n\nclass GroupNorm(Layer):\n    \"\"\"\n    Group normalization\n\n    https://arxiv.org/abs/1803.08494\n    \"\"\"\n\n    def __init__(self, num_groups=32, eps=1e-3, init_gamma=1.0, **kwargs):\n        self.num_groups = num_groups\n        self.eps = eps\n        self.init_gamma = init_gamma\n        super(GroupNorm, self).__init__(**kwargs)\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n        channels = shape[-1]\n        self.channels = channels\n        self.actual_num_groups = min(self.channels, self.num_groups)\n        extra_dims = (self.channels // self.actual_num_groups, self.actual_num_groups)\n        self.expanded_shape = tuple(shape[1:3]) + tuple(extra_dims)\n        init_value = np.ones((channels,), dtype=\"float32\") * self.init_gamma\n        self.gamma = PV(init_value, name=self.name + \"_gamma\")\n        self.beta = PV(\n            np.zeros((self.channels,), dtype=\"float32\"), name=self.name + \"_beta\"\n        )\n\n    def fprop(self, x, **kwargs):\n        shape = tf.shape(x)\n        batch_size = shape[0]\n        x = tf.reshape(x, (batch_size,) + self.expanded_shape)\n        mean, var = tf.nn.moments(x, [1, 2, 3], keep_dims=True)\n        x = (x - mean) * tf.rsqrt(var + self.eps)\n        x = tf.reshape(x, shape)\n        x = x * self.gamma.var + self.beta.var\n        return x\n\n    def get_params(self):\n        return [self.gamma.var, self.beta.var]\n\n\nclass BatchNorm(Layer):\n    \"\"\"\n    This BatchNorm is always run in train mode for now\n    \"\"\"\n\n    def __init__(self, eps=1e-3, init_gamma=1.0, **kwargs):\n        self.eps = eps\n        self.init_gamma = init_gamma\n        super(BatchNorm, self).__init__(**kwargs)\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n        channels = shape[-1]\n        init_value = np.ones((channels,), dtype=\"float32\") * self.init_gamma\n        self.gamma = PV(init_value, name=self.name + \"_gamma\")\n        self.beta = PV(np.zeros((channels,), dtype=\"float32\"), name=self.name + \"_beta\")\n\n    def fprop(self, x, **kwargs):\n        mean, var = tf.nn.moments(x, [0, 1, 2], keep_dims=True)\n        x = (x - mean) * tf.rsqrt(var + self.eps)\n        x = x * self.gamma.var + self.beta.var\n        return x\n\n    def get_params(self):\n        return [self.gamma.var, self.beta.var]\n\n\nclass ResidualWithBatchNorm(Layer):\n    \"\"\"A residual network layer that uses batch normalization.\n\n    :param out_filter: Number of output filters\n    :param stride: int\n        Stride for convolutional layers. Replicated to both row and column.\n    \"\"\"\n\n    def __init__(\n        self, out_filter, stride, activate_before_residual=False, leak=0.1, **kwargs\n    ):\n        assert isinstance(stride, int)\n        self.__dict__.update(locals())\n        del self.self\n        self.lrelu = LeakyReLU(leak)\n        super(ResidualWithBatchNorm, self).__init__(**kwargs)\n\n    def set_input_shape(self, shape):\n        self.input_shape = tuple(shape)\n        self.in_filter = shape[-1]\n        self.bn1 = BatchNorm(name=self.name + \"_bn1\")\n        self.bn1.set_input_shape(shape)\n        strides = (self.stride, self.stride)\n        self.conv1 = Conv2D(\n            self.out_filter,\n            (3, 3),\n            strides,\n            \"SAME\",\n            name=self.name + \"_conv1\",\n            init_mode=\"inv_sqrt\",\n        )\n        self.conv1.set_input_shape(shape)\n        self.bn2 = BatchNorm(name=self.name + \"_bn2\")\n        self.bn2.set_input_shape(self.conv1.get_output_shape())\n        self.conv2 = Conv2D(\n            self.out_filter,\n            (3, 3),\n            (1, 1),\n            \"SAME\",\n            name=self.name + \"_conv2\",\n            init_mode=\"inv_sqrt\",\n        )\n        self.conv2.set_input_shape(self.conv1.get_output_shape())\n        self.output_shape = self.conv2.get_output_shape()\n\n    def get_params(self):\n        sublayers = [self.conv1, self.conv2, self.bn1, self.bn2]\n        params = []\n        for sublayer in sublayers:\n            params = params + sublayer.get_params()\n        assert self.conv1.kernels.var in params\n        return params\n\n    def fprop(self, x, **kwargs):\n        if self.activate_before_residual:\n            x = self.bn1.fprop(x)\n            x = self.lrelu.fprop(x)\n            orig_x = x\n        else:\n            orig_x = x\n            x = self.bn1.fprop(x)\n            x = self.lrelu.fprop(x)\n        x = self.conv1.fprop(x)\n        x = self.bn2.fprop(x)\n        x = self.lrelu.fprop(x)\n        x = self.conv2.fprop(x)\n        if self.stride != 1:\n            stride = [1, self.stride, self.stride, 1]\n            orig_x = tf.nn.avg_pool(orig_x, stride, stride, \"VALID\")\n        out_filter = self.out_filter\n        in_filter = self.in_filter\n        if in_filter != out_filter:\n            orig_x = tf.pad(\n                orig_x,\n                [\n                    [0, 0],\n                    [0, 0],\n                    [0, 0],\n                    [(out_filter - in_filter) // 2, (out_filter - in_filter) // 2],\n                ],\n            )\n        x = x + orig_x\n        return x\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/plot/__init__.py",
    "content": "\"\"\"\nPlotting and visualization\n\"\"\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/plot/image.py",
    "content": "\"\"\"\nFunctionality for displaying or saving images.\n\"\"\"\nfrom tempfile import mkstemp\nimport os\nimport platform\n\nimport numpy as np\nfrom PIL import Image\n\nfrom cleverhans.utils import shell_call\n\n\ndef show(ndarray, min_val=None, max_val=None):\n    \"\"\"\n    Display an image.\n    :param ndarray: The image as an ndarray\n    :param min_val: The minimum pixel value in the image format\n    :param max_val: The maximum pixel valie in the image format\n      If min_val and max_val are not specified, attempts to\n      infer whether the image is in any of the common ranges:\n        [0, 1], [-1, 1], [0, 255]\n      This can be ambiguous, so it is better to specify if known.\n    \"\"\"\n\n    # Create a temporary file with the suffix '.png'.\n    fd, path = mkstemp(suffix=\".png\")\n    os.close(fd)\n    save(path, ndarray, min_val, max_val)\n    shell_call(VIEWER_COMMAND + [path])\n\n\ndef save(path, ndarray, min_val=None, max_val=None):\n    \"\"\"\n    Save an image, represented as an ndarray, to the filesystem\n    :param path: string, filepath\n    :param ndarray: The image as an ndarray\n    :param min_val: The minimum pixel value in the image format\n    :param max_val: The maximum pixel valie in the image format\n      If min_val and max_val are not specified, attempts to\n      infer whether the image is in any of the common ranges:\n        [0, 1], [-1, 1], [0, 255]\n      This can be ambiguous, so it is better to specify if known.\n    \"\"\"\n    as_pil(ndarray, min_val, max_val).save(path)\n\n\ndef as_pil(ndarray, min_val=None, max_val=None):\n    \"\"\"\n    Converts an ndarray to a PIL image.\n    :param ndarray: The numpy ndarray to convert\n    :param min_val: The minimum pixel value in the image format\n    :param max_val: The maximum pixel valie in the image format\n      If min_val and max_val are not specified, attempts to\n      infer whether the image is in any of the common ranges:\n        [0, 1], [-1, 1], [0, 255]\n      This can be ambiguous, so it is better to specify if known.\n    \"\"\"\n\n    assert isinstance(ndarray, np.ndarray)\n\n    # rows x cols for grayscale image\n    # rows x cols x channels for color\n    assert ndarray.ndim in [2, 3]\n    if ndarray.ndim == 3:\n        channels = ndarray.shape[2]\n        # grayscale or RGB\n        assert channels in [1, 3]\n\n    actual_min = ndarray.min()\n    actual_max = ndarray.max()\n\n    if min_val is not None:\n        assert actual_min >= min_val\n        assert actual_max <= max_val\n\n    if np.issubdtype(ndarray.dtype, np.floating):\n        if min_val is None:\n            if actual_min < -1.0:\n                raise ValueError(\"Unrecognized range\")\n            if actual_min < 0:\n                min_val = -1.0\n            else:\n                min_val = 0.0\n        if max_val is None:\n            if actual_max > 255.0:\n                raise ValueError(\"Unrecognized range\")\n            if actual_max > 1.0:\n                max_val = 255.0\n            else:\n                max_val = 1.0\n        ndarray = ndarray - min_val\n        value_range = max_val - min_val\n        ndarray *= 255.0 / value_range\n        ndarray = np.cast[\"uint8\"](ndarray)\n    elif \"int\" in str(ndarray.dtype):\n        if min_val is not None:\n            assert min_val == 0\n        else:\n            assert actual_min >= 0.0\n        if max_val is not None:\n            assert max_val == 255\n        else:\n            assert actual_max <= 255.0\n    else:\n        raise ValueError(\"Unrecognized dtype\")\n\n    out = Image.fromarray(ndarray)\n\n    return out\n\n\ndef make_grid(image_batch):\n    \"\"\"\n    Turns a batch of images into one big image.\n    :param image_batch: ndarray, shape (batch_size, rows, cols, channels)\n    :returns : a big image containing all `batch_size` images in a grid\n    \"\"\"\n    m, ir, ic, ch = image_batch.shape\n\n    pad = 3\n\n    padded = np.zeros((m, ir + pad * 2, ic + pad * 2, ch))\n    padded[:, pad:-pad, pad:-pad, :] = image_batch\n\n    m, ir, ic, ch = padded.shape\n\n    pr = int(np.sqrt(m))\n    pc = int(np.ceil(float(m) / pr))\n    extra_m = pr * pc\n    assert extra_m > m\n\n    padded = np.concatenate((padded, np.zeros((extra_m - m, ir, ic, ch))), axis=0)\n\n    row_content = np.split(padded, pr)\n    row_content = [np.split(content, pc) for content in row_content]\n    rows = [np.concatenate(content, axis=2) for content in row_content]\n    grid = np.concatenate(rows, axis=1)\n    assert grid.shape[0] == 1, grid.shape\n    grid = grid[0]\n\n    return grid\n\n\nif platform.system() == \"Darwin\":\n    VIEWER_COMMAND = [\"open\", \"-a\", \"Preview\"]\nelse:\n    VIEWER_COMMAND = [\"eog\", \"--new-instance\"]\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/plot/pyplot_defaults.py",
    "content": "\"\"\"Defaults for pyplot\n\nImport this file to set some default parameters for pyplot.\nThese are designed to make the plot look good in the context of a LaTeX\ndocument.\nIf you have installed the Computer Modern fonts\n( ftp://canopus.iacp.dvo.ru/pub/Font/cm_unicode/cm-unicode-0.6.3a-otf.tar.gz )\nthese defaults will use them, so that text in your pyplot figures will\nmatch text in the rest of your document.\nIf you do not have those fonts installed, pyplot commands will still work.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport matplotlib\nfrom matplotlib import pyplot\n\nmatplotlib.rcParams[\"text.latex.preamble\"] = r\"\\usepackage{bm}\"\nmatplotlib.rcParams[\"text.usetex\"] = True\npyplot.rcParams[\"pdf.fonttype\"] = 42\npyplot.rcParams[\"font.family\"] = \"serif\"\npyplot.rcParams[\"font.serif\"] = \"CMU Serif\"\npyplot.rcParams[\"font.size\"] = 8\n# Note: if you get an error, delete fontList.cache\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/plot/pyplot_image.py",
    "content": "\"\"\"\nFunctionality for showing images in pyplot.\nSee also cleverhans.plot.image for loading/saving image files, showing\nimages in 3rd party viewers, etc.\n\"\"\"\nimport numpy as np\nfrom six.moves import range\n\n\ndef pair_visual(original, adversarial, figure=None):\n    \"\"\"\n    This function displays two images: the original and the adversarial sample\n    :param original: the original input\n    :param adversarial: the input after perturbations have been applied\n    :param figure: if we've already displayed images, use the same plot\n    :return: the matplot figure to reuse for future samples\n    \"\"\"\n    import matplotlib.pyplot as plt\n\n    # Squeeze the image to remove single-dimensional entries from array shape\n    original = np.squeeze(original)\n    adversarial = np.squeeze(adversarial)\n\n    # Ensure our inputs are of proper shape\n    assert len(original.shape) == 2 or len(original.shape) == 3\n\n    # To avoid creating figures per input sample, reuse the sample plot\n    if figure is None:\n        plt.ion()\n        figure = plt.figure()\n        figure.canvas.set_window_title(\"Cleverhans: Pair Visualization\")\n\n    # Add the images to the plot\n    perturbations = adversarial - original\n    for index, image in enumerate((original, perturbations, adversarial)):\n        figure.add_subplot(1, 3, index + 1)\n        plt.axis(\"off\")\n\n        # If the image is 2D, then we have 1 color channel\n        if len(image.shape) == 2:\n            plt.imshow(image, cmap=\"gray\")\n        else:\n            plt.imshow(image)\n\n        # Give the plot some time to update\n        plt.pause(0.01)\n\n    # Draw the plot and return\n    plt.show()\n    return figure\n\n\ndef grid_visual(data):\n    \"\"\"\n    This function displays a grid of images to show full misclassification\n    :param data: grid data of the form;\n        [nb_classes : nb_classes : img_rows : img_cols : nb_channels]\n    :return: if necessary, the matplot figure to reuse\n    \"\"\"\n    import matplotlib.pyplot as plt\n\n    # Ensure interactive mode is disabled and initialize our graph\n    plt.ioff()\n    figure = plt.figure()\n    figure.canvas.set_window_title(\"Cleverhans: Grid Visualization\")\n\n    # Add the images to the plot\n    num_cols = data.shape[0]\n    num_rows = data.shape[1]\n    num_channels = data.shape[4]\n    for y in range(num_rows):\n        for x in range(num_cols):\n            figure.add_subplot(num_rows, num_cols, (x + 1) + (y * num_cols))\n            plt.axis(\"off\")\n\n            if num_channels == 1:\n                plt.imshow(data[x, y, :, :, 0], cmap=\"gray\")\n            else:\n                plt.imshow(data[x, y, :, :, :])\n\n    # Draw the plot and return\n    plt.show()\n    return figure\n\n\ndef get_logits_over_interval(\n    sess, model, x_data, fgsm_params, min_epsilon=-10.0, max_epsilon=10.0, num_points=21\n):\n    \"\"\"Get logits when the input is perturbed in an interval in adv direction.\n\n    Args:\n        sess: Tf session\n        model: Model for which we wish to get logits.\n        x_data: Numpy array corresponding to single data.\n                point of shape [height, width, channels].\n        fgsm_params: Parameters for generating adversarial examples.\n        min_epsilon: Minimum value of epsilon over the interval.\n        max_epsilon: Maximum value of epsilon over the interval.\n        num_points: Number of points used to interpolate.\n\n    Returns:\n        Numpy array containing logits.\n\n    Raises:\n        ValueError if min_epsilon is larger than max_epsilon.\n    \"\"\"\n    # Get the height, width and number of channels\n    height = x_data.shape[0]\n    width = x_data.shape[1]\n    channels = x_data.shape[2]\n\n    x_data = np.expand_dims(x_data, axis=0)\n    import tensorflow as tf\n    from cleverhans.attacks import FastGradientMethod\n\n    # Define the data placeholder\n    x = tf.placeholder(dtype=tf.float32, shape=[1, height, width, channels], name=\"x\")\n    # Define adv_x\n    fgsm = FastGradientMethod(model, sess=sess)\n    adv_x = fgsm.generate(x, **fgsm_params)\n\n    if min_epsilon > max_epsilon:\n        raise ValueError(\"Minimum epsilon is less than maximum epsilon\")\n\n    eta = tf.nn.l2_normalize(adv_x - x, dim=0)\n    epsilon = tf.reshape(\n        tf.lin_space(float(min_epsilon), float(max_epsilon), num_points),\n        (num_points, 1, 1, 1),\n    )\n    lin_batch = x + epsilon * eta\n    logits = model.get_logits(lin_batch)\n    with sess.as_default():\n        log_prob_adv_array = sess.run(logits, feed_dict={x: x_data})\n    return log_prob_adv_array\n\n\ndef linear_extrapolation_plot(\n    log_prob_adv_array, y, file_name, min_epsilon=-10, max_epsilon=10, num_points=21\n):\n    \"\"\"Generate linear extrapolation plot.\n\n    Args:\n        log_prob_adv_array: Numpy array containing log probabilities\n        y: Tf placeholder for the labels\n        file_name: Plot filename\n        min_epsilon: Minimum value of epsilon over the interval\n        max_epsilon: Maximum value of epsilon over the interval\n        num_points: Number of points used to interpolate\n    \"\"\"\n    import matplotlib\n\n    matplotlib.use(\"Agg\")\n    import matplotlib.pyplot as plt\n\n    figure = plt.figure()\n    figure.canvas.set_window_title(\"Cleverhans: Linear Extrapolation Plot\")\n\n    correct_idx = np.argmax(y, axis=0)\n    fig = plt.figure()\n    plt.xlabel(\"Epsilon\")\n    plt.ylabel(\"Logits\")\n    x_axis = np.linspace(min_epsilon, max_epsilon, num_points)\n    plt.xlim(min_epsilon - 1, max_epsilon + 1)\n    for i in range(y.shape[0]):\n        if i == correct_idx:\n            ls = \"-\"\n            linewidth = 5\n        else:\n            ls = \"--\"\n            linewidth = 2\n        plt.plot(\n            x_axis,\n            log_prob_adv_array[:, i],\n            ls=ls,\n            linewidth=linewidth,\n            label=\"{}\".format(i),\n        )\n    plt.legend(loc=\"best\", fontsize=14)\n    plt.show()\n    fig.savefig(file_name)\n    plt.clf()\n    return figure\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/plot/save_pdf.py",
    "content": "\"\"\"\nThe save_pdf function.\n\"\"\"\nfrom matplotlib.backends.backend_pdf import PdfPages\nfrom matplotlib import pyplot\n\n\ndef save_pdf(path):\n    \"\"\"\n    Saves a pdf of the current matplotlib figure.\n\n    :param path: str, filepath to save to\n    \"\"\"\n\n    pp = PdfPages(path)\n    pp.savefig(pyplot.gcf())\n    pp.close()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/plot/success_fail.py",
    "content": "\"\"\"Functions for plotting succes-failure curves\n\nReference: https://openreview.net/forum?id=H1g0piA9tQ\n\"\"\"\nimport warnings\n\nimport numpy as np\nfrom matplotlib import pyplot\n\nfrom cleverhans.serial import load\nfrom cleverhans.utils import safe_zip\n\nLINEWIDTH = 2\nDEFAULT_SUCCESS_NAME = \"clean\"\n# This must be a tuple or it is not safe to use as a param default\nDEFAULT_FAIL_NAMES = (\"mc\", \"bundled\")\n\n\ndef plot_report_from_path(\n    path,\n    success_name=DEFAULT_SUCCESS_NAME,\n    fail_names=DEFAULT_FAIL_NAMES,\n    label=None,\n    is_max_confidence=True,\n    linewidth=LINEWIDTH,\n    plot_upper_bound=True,\n):\n    \"\"\"\n    Plots a success-fail curve from a confidence report stored on disk,\n    :param path: string filepath for the stored report.\n      (Should be the output of make_confidence_report*.py)\n    :param success_name: The name (confidence report key) of the data that\n      should be used to measure success rate\n    :param fail_names: A list of names (confidence report keys) of the data\n      that should be used to measure failure rate.\n      *Only one of these keys will be plotted*. Each key will be tried in\n      order until one is found in the report. This is to support both the\n      output of `make_confidence_report` and `make_confidence_report_bundled`.\n    :param label: Optional string. Name to use for this curve in the legend.\n    :param is_max_confidence: bool.\n      If True, when measuring the failure rate, treat the data as the output\n      of a maximum confidence attack procedure.\n      This means that the attack is optimal (assuming the underlying optimizer\n      is good enough, *which is probably false*, so interpret the plot\n      accordingly) for thresholds >= .5 but for lower thresholds the observed\n      failure rate is a lower bound on the true worst failure rate and the\n      observed coverage is an upper bound (assuming good enough optimization)\n      on the true failure rate.\n      The plot thus draws the threshold >= .5 portion of the curve with a solid\n      line and the upper and lower bounds with a dashed line.\n      See https://openreview.net/forum?id=H1g0piA9tQ for details.\n      If False, the attack procedure is regarded as an ad hoc way of obtaining\n      a loose lower bound, and thus the whole curve is drawn with dashed lines.\n    :param linewidth: thickness of the line to draw\n    :param plot_upper_bound: include upper bound on error rate in plot\n    \"\"\"\n    report = load(path)\n    plot_report(\n        report,\n        success_name,\n        fail_names,\n        label,\n        is_max_confidence,\n        linewidth,\n        plot_upper_bound,\n    )\n\n\ndef plot_report(\n    report,\n    success_name,\n    fail_names,\n    label=None,\n    is_max_confidence=True,\n    linewidth=LINEWIDTH,\n    plot_upper_bound=True,\n):\n    \"\"\"\n    Plot a success fail curve from a confidence report\n    :param report: A confidence report\n      (the type of object saved by make_confidence_report.py)\n    :param success_name: see plot_report_from_path\n    :param fail_names: see plot_report_from_path\n    :param label: see plot_report_from_path\n    :param is_max_confidence: see plot_report_from_path\n    :param linewidth: see plot_report_from_path\n    \"\"\"\n    (\n        fail_optimal,\n        success_optimal,\n        fail_lower_bound,\n        fail_upper_bound,\n        success_bounded,\n    ) = make_curve(report, success_name, fail_names)\n    assert len(fail_lower_bound) == len(fail_upper_bound)\n    fail_optimal = np.array(fail_optimal)\n    fail_lower_bound = np.array(fail_lower_bound)\n    fail_upper_bound = np.array(fail_upper_bound)\n\n    if is_max_confidence:\n        (p,) = pyplot.plot(\n            fail_optimal, success_optimal, label=label, linewidth=linewidth\n        )\n        color = p.get_color()\n        pyplot.plot(fail_lower_bound, success_bounded, \"--\", color=color)\n        if plot_upper_bound:\n            pyplot.plot(fail_upper_bound, success_bounded, \"--\", color=color)\n    else:\n        # If the attack was not MaxConfidence, then this whole curve is just\n        # a loose lower bound\n        all_fail = np.concatenate((fail_optimal, fail_lower_bound), axis=0)\n        pyplot.plot(\n            all_fail,\n            success_optimal + success_bounded,\n            \"--\",\n            label=label,\n            linewidth=linewidth,\n        )\n\n    pyplot.xlabel(\"Failure rate on adversarial examples\")\n    pyplot.ylabel(\"Success rate on clean examples\")\n    gap = fail_upper_bound - fail_lower_bound\n    if gap.size > 0:\n        assert gap.min() >= 0.0\n        print(\"Max gap: \", gap.max())\n\n\ndef make_curve(report, success_name, fail_names):\n    \"\"\"\n    Make a success-failure curve.\n    :param report: A confidence report\n      (the type of object saved by make_confidence_report.py)\n    :param success_name: see plot_report_from_path\n    :param fail_names: see plot_report_from_path\n    :returns:\n      fail_optimal: list of failure rates on adversarial data for the optimal\n        (t >= .5) part of the curve. Each entry corresponds to a different\n        threshold. Thresholds are chosen to make the smoothest possible curve\n        from the available data, e.g. one threshold between each unique\n        confidence value observed in the data. To make sure that linear\n        interpolation between points in the curve never overestimates the\n        failure rate for a specific success rate, the curve also includes\n        extra points that increment the failure rate prior to any point\n        that increments the success rate, so the curve moves up and to the\n        right in a series of backwards \"L\" shapes rather than moving up\n        and to the right along diagonal lines. For large datasets these\n        maximally pessimistic points will usually not be visible and the\n        curve will appear smooth.\n      success_optimal: list of success rates on clean data on the optimal\n        part of the curve. Matches up with `fail_optimal`.\n      fail_lower_bound: list of observed failure rates on the t < .5 portion\n        of the curve where MaxConfidence is not optimal.\n      fail_upper_bound: list of upper bounds (assuming good enough optimization,\n        so not a true upper bound) on the failure rates on the t < .5 portion\n        of the curve where MaxConfidence is not optimal. Matches up with\n        `fail_lower_bound`.\n      success_bounded: success rates on the non-optimal part of the curve.\n        Matches up with `fail_lower_bound` and `fail_upper_bound`.\n    \"\"\"\n    success_results = report[success_name]\n    fail_name = None  # pacify pylint\n    found = False\n    for fail_name in fail_names:\n        if fail_name in report:\n            found = True\n            break\n    if not found:\n        raise ValueError(\n            fail_name + \" not in report.\" \"Available keys: \" + str(report.keys())\n        )\n    fail_results = report[fail_name]\n\n    # \"good\" means drawn from the distribution where we measure success rate.\n    # \"bad\" means drawn from the distribution where we measure failure rate.\n    # From here on out we use those terms, to avoid confusion between examples\n    # that actually failed and examples that were drawn from the distribution\n    # where we measured failure rate.\n\n    old_all_probs_version = False\n    if isinstance(success_results, dict):\n        # This dictionary key lookup will trigger a deprecation warning if `success_results` is not the old dictionary\n        # style of report, so we don't want to do a dictionary lookup unless we really are using the old version.\n        old_all_probs_version = \"all_probs\" in success_results\n\n    if old_all_probs_version:\n        warnings.warn(\n            \"The 'all_probs' key is included only to support \"\n            \" old files from a private development codebase. \"\n            \"Support for this key can be dropped at any time \"\n            \" without warning.\"\n        )\n        good_probs = success_results[\"all_probs\"]\n        bad_probs = fail_results[\"all_probs\"]\n        bad_corrects = fail_results[\"correctness_mask\"]\n        good_corrects = success_results[\"correctness_mask\"]\n    else:\n        if isinstance(success_results, dict):\n            # Still using dict, but using newer key names\n            warnings.warn(\n                \"Support for dictionary confidence reports is deprecated. Switch to using the classes in \"\n                \"cleverhans.confidence_report. Support for old dictionary-style reports may be removed \"\n                \"on or after 2019-07-19.\"\n            )\n            good_probs = success_results[\"confidence\"]\n            bad_probs = fail_results[\"confidence\"]\n            good_corrects = success_results[\"correctness\"]\n            bad_corrects = fail_results[\"correctness\"]\n        else:\n            # current version\n            good_probs = success_results.confidence\n            bad_probs = fail_results.confidence\n            good_corrects = success_results.correctness\n            bad_corrects = fail_results.correctness\n    good_triplets = [\n        (prob, correct, True) for prob, correct in safe_zip(good_probs, good_corrects)\n    ]\n    bad_triplets = [\n        (prob, correct, False) for prob, correct in safe_zip(bad_probs, bad_corrects)\n    ]\n    total_good = len(good_triplets)\n    total_bad = len(bad_triplets)\n    if total_good != 10000:\n        warnings.warn(\n            \"Not using full test set? Found \"\n            + str(total_good)\n            + \" examples for measuring success rate\"\n        )\n    if total_bad != 10000:\n        warnings.warn(\"Not using full test set for adversarial examples?\")\n    all_triplets = good_triplets + bad_triplets\n    all_triplets = sorted(all_triplets, key=lambda x: -x[0])\n\n    # Start with the case for threshold t = 1.\n    # Examples are covered only if prob > t (strict inequality)\n    # So initially nothing is covered\n    good_covered_and_correct = 0\n    bad_covered_and_incorrect = 0\n\n    # Number of examples that are bad, incorrect, and covered by\n    # a t >= 0.5, or that were merely covered by a t < 0.5\n    failure_opportunities = 0\n\n    next_idx = 0\n\n    fail_optimal = []\n    success_optimal = []\n    fail_upper_bound = []\n    fail_lower_bound = []\n    success_bounded = []\n\n    bounded = False\n\n    # NOTE: the loop always exits via an internal break statement.\n    # Copied the termination condition to the while statement for ease\n    # of reading.\n    while next_idx < len(all_triplets):\n        gs = float(good_covered_and_correct) / total_good\n        bf = float(bad_covered_and_incorrect) / total_bad\n        # Add results for current threshold to the list\n        if not bounded:\n\n            # Sometimes when there are big jumps the failure rate it makes\n            # artifacts in the plot, where there's a long linear track.\n            # This implies the real success-fail curve is linear when\n            # actually it just isn't sampled by the data.\n            # To avoid implying that the model reaches a higher success\n            # rate than it actually does, we avoid these plotting artifacts\n            # by introducing extra points that make the graph move horizontally\n            # to the right first, then vertically.\n            if len(fail_optimal) > 0:\n                prev_bf = fail_optimal[-1]\n                prev_gs = success_optimal[-1]\n\n                if gs > prev_gs and bf > prev_bf:\n                    fail_optimal.append(bf)\n                    success_optimal.append(prev_gs)\n\n            success_optimal.append(gs)\n            fail_optimal.append(bf)\n        else:\n            success_bounded.append(gs)\n            fail_lower_bound.append(bf)\n            fail_upper_bound.append(float(failure_opportunities) / total_bad)\n\n        if next_idx == len(all_triplets):\n            break\n\n        # next_prob_to_include is not quite the same thing as the threshold.\n        # The threshold is infinitesimally smaller than this value.\n        next_prob_to_include = all_triplets[next_idx][0]\n\n        # Process all ties\n        while next_prob_to_include == all_triplets[next_idx][0]:\n            _prob, correct, is_good = all_triplets[next_idx]\n            if is_good:\n                good_covered_and_correct += correct\n            else:\n                if next_prob_to_include <= 0.5:\n                    failure_opportunities += 1\n                else:\n                    failure_opportunities += 1 - correct\n                bad_covered_and_incorrect += 1 - correct\n            next_idx += 1\n            if next_idx == len(all_triplets):\n                break\n\n        if next_prob_to_include <= 0.5:\n            bounded = True\n\n    out = (\n        fail_optimal,\n        success_optimal,\n        fail_lower_bound,\n        fail_upper_bound,\n        success_bounded,\n    )\n    return out\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/serial.py",
    "content": "\"\"\"Serialization functionality.\n\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport warnings\n\nimport joblib\nimport tensorflow as tf\n\nfrom cleverhans.model import Model\nfrom cleverhans.utils import ordered_union\nfrom cleverhans.utils import safe_zip\n\n\nclass PicklableVariable(object):\n    \"\"\"\n    A wrapper around a Variable that makes it picklable.\n\n    The name of the Variable will not be reliable, only the value. Models\n    intended to be picklable should identify variables by referencing\n    Python objects rather than by using TensorFlow's names.\n\n    TensorFlow Variables have different values associated with each Session.\n    For this class, the value associated with the default Session will be used\n    for both saving and loading, so both operations require that a default\n    Session has been selected.\n\n    Pickle is not secure. Unpickle only files you made yourself.\n\n    See cleverhans_tutorials/mnist_tutorial_picklable.py for examples of a\n    complete model training, pickling, and unpickling process using\n    PicklableVariable.\n\n    See cleverhans.picklable_model for models built using PicklableVariable.\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        self.var = tf.Variable(*args, **kwargs)\n\n    def __getstate__(self):\n        sess = tf.get_default_session()\n        if sess is None:\n            raise RuntimeError(\n                \"PicklableVariable requires a default \" \"TensorFlow session\"\n            )\n        return {\"var\": sess.run(self.var)}\n\n    def __setstate__(self, d):\n        self.var = tf.Variable(d[\"var\"])\n        sess = tf.get_default_session()\n        if sess is None:\n            raise RuntimeError(\n                \"PicklableVariable requires a default \" \"TensorFlow session\"\n            )\n        sess.run(self.var.initializer)\n\n\nclass NoRefModel(Model):\n    \"\"\"\n    A Model that can be pickled because it contains no references to any\n    Variables (e.g. it identifies Variables only by name).\n    The Model must be able to find all of its Variables via get_vars\n    for them to be pickled.\n    Note that NoRefModel may have different Variable names after it is\n    restored, e.g. if the unpickling is run with a different enclosing\n    scope. NoRefModel will still work in these circumstances as long\n    as get_params returns the same order of Variables after unpickling\n    as it did before pickling.\n    See also cleverhans.picklable_model for a different, complementary\n    pickling strategy: models that can be pickled because they use *only*\n    references to Variables and work regardless of Variable names.\n    \"\"\"\n\n    def __getstate__(self):\n        # Serialize everything except the Variables\n        out = self.__dict__.copy()\n\n        # The base Model class adds this tf reference to self\n        # We mustn't pickle anything tf, this will need to be\n        # regenerated after the model is reloaded.\n        if \"_dummy_input\" in out:\n            del out[\"_dummy_input\"]\n\n        # Add the Variables\n        sess = tf.get_default_session()\n        if sess is None:\n            raise RuntimeError(\"NoRefModel requires a default \" \"TensorFlow session\")\n        tf_variables = self.get_vars()\n        out[VARS] = sess.run(tf_variables)\n        out[VAR_NAMES] = [var.name for var in tf_variables]\n        return out\n\n    def __setstate__(self, d):\n        tf_variables = d[VARS]\n        del d[VARS]\n        tf_variable_names = None\n        # older joblib files may not have \"_tf_variable_names\"\n        if VAR_NAMES in d:\n            tf_variable_names = d[VAR_NAMES]\n            del d[VAR_NAMES]\n        else:\n            warnings.warn(\n                \"This joblib file has no \" + VAR_NAMES + \" field. \"\n                \"The field may become required on or after 2019-04-11.\"\n                \"You can make your file compatible with the new format by\"\n                \" loading the file and re-saving it.\"\n            )\n        # Deserialize everything except the Variables\n        self.__dict__ = d\n        # Deserialize the Variables\n        sess = tf.get_default_session()\n        if sess is None:\n            raise RuntimeError(\"NoRefModel requires a default \" \"TensorFlow session\")\n        cur_vars = self.get_vars()\n        if len(cur_vars) != len(tf_variables):\n            print(\"Model format mismatch\")\n            print(\"Current model has \" + str(len(cur_vars)) + \" variables\")\n            print(\"Saved model has \" + str(len(tf_variables)) + \" variables\")\n            print(\"Names of current vars:\")\n            for var in cur_vars:\n                print(\"\\t\" + var.name)\n            if tf_variable_names is not None:\n                print(\"Names of saved vars:\")\n                for name in tf_variable_names:\n                    print(\"\\t\" + name)\n            else:\n                print(\"Saved vars use old format, no names available for them\")\n            assert False\n\n        found = [False] * len(cur_vars)\n        if tf_variable_names is not None:\n            # New version using the names to handle changes in ordering\n            for value, name in safe_zip(tf_variables, tf_variable_names):\n                value_found = False\n                for idx, cur_var in enumerate(cur_vars):\n                    if cur_var.name == name:\n                        assert not found[idx]\n                        value_found = True\n                        found[idx] = True\n                        cur_var.load(value, sess)\n                        break\n                assert value_found\n            assert all(found)\n        else:\n            # Old version that works if and only if the order doesn't change\n            for var, value in safe_zip(cur_vars, tf_variables):\n                var.load(value, sess)\n\n    def get_vars(self):\n        \"\"\"\n        Provides access to the model's Variables.\n        This may include Variables that are not parameters, such as batch\n        norm running moments.\n        :return: A list of all Variables defining the model.\n        \"\"\"\n\n        # Catch eager execution and assert function overload.\n        try:\n            if tf.executing_eagerly():\n                raise NotImplementedError(\n                    \"For Eager execution - get_vars \" \"must be overridden.\"\n                )\n        except AttributeError:\n            pass\n\n        done = False\n        tried_to_make_params = False\n        while not done:\n            # Most models in cleverhans use only trainable variables and do not\n            # make sure the other collections are updated correctly.\n            trainable_vars = tf.get_collection(\n                tf.GraphKeys.TRAINABLE_VARIABLES, self.scope + \"/\"\n            )\n            # When wrapping other code, such as the CIFAR 10 challenge models,\n            # we need to make sure we get the batch norm running averages as well\n            # as the trainable variables.\n            model_vars = tf.get_collection(\n                tf.GraphKeys.MODEL_VARIABLES, self.scope + \"/\"\n            )\n            scope_vars = ordered_union(trainable_vars, model_vars)\n\n            if len(scope_vars) > 0:\n                done = True\n            else:\n                assert not tried_to_make_params\n                tried_to_make_params = True\n                self.make_params()\n\n        # Make sure no variables have been added or removed\n        if hasattr(self, \"num_vars\"):\n            assert self.num_vars == len(scope_vars)\n        else:\n            self.num_vars = len(scope_vars)\n\n        return scope_vars\n\n\ndef save(filepath, obj):\n    \"\"\"Saves an object to the specified filepath using joblib.\n\n    joblib is like pickle but will save NumPy arrays as separate files for\n    greater efficiency.\n\n    :param filepath: str, path to save to\n    :obj filepath: object to save\n    \"\"\"\n\n    joblib.dump(obj, filepath)\n\n\ndef load(filepath):\n    \"\"\"Returns an object stored via `save`\"\"\"\n\n    obj = joblib.load(filepath)\n\n    return obj\n\n\nVARS = \"_tf_variables\"\nVAR_NAMES = \"_tf_variable_names\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/train.py",
    "content": "\"\"\"\nMulti-replica synchronous training\n\n\nNOTE: This module is much more free to change than many other modules\nin CleverHans. CleverHans is very conservative about changes to any\ncode that affects the output of benchmark tests (attacks, evaluation\nmethods, etc.). This module provides *model training* functionality\nnot *benchmarks* and thus is free to change rapidly to provide better\nspeed, accuracy, etc.\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport os\nimport time\nimport warnings\n\nimport math\nimport numpy as np\nfrom six.moves import xrange\nimport tensorflow as tf\n\nfrom cleverhans import canary\nfrom cleverhans.utils import _ArgsWrapper, create_logger\nfrom cleverhans.utils import safe_zip\nfrom cleverhans.utils_tf import infer_devices\nfrom cleverhans.utils_tf import initialize_uninitialized_global_variables\n\n\n_logger = create_logger(\"train\")\n_logger.setLevel(logging.INFO)\n\n\ndef train(\n    sess,\n    loss,\n    x_train,\n    y_train,\n    init_all=False,\n    evaluate=None,\n    feed=None,\n    args=None,\n    rng=None,\n    var_list=None,\n    fprop_args=None,\n    optimizer=None,\n    devices=None,\n    x_batch_preprocessor=None,\n    use_ema=False,\n    ema_decay=0.998,\n    run_canary=None,\n    loss_threshold=1e5,\n    dataset_train=None,\n    dataset_size=None,\n):\n    \"\"\"\n    Run (optionally multi-replica, synchronous) training to minimize `loss`\n    :param sess: TF session to use when training the graph\n    :param loss: tensor, the loss to minimize\n    :param x_train: numpy array with training inputs or tf Dataset\n    :param y_train: numpy array with training outputs or tf Dataset\n    :param init_all: (boolean) If set to true, all TF variables in the session\n                     are (re)initialized, otherwise only previously\n                     uninitialized variables are initialized before training.\n    :param evaluate: function that is run after each training iteration\n                     (typically to display the test/validation accuracy).\n    :param feed: An optional dictionary that is appended to the feeding\n                 dictionary before the session runs. Can be used to feed\n                 the learning phase of a Keras model for instance.\n    :param args: dict or argparse `Namespace` object.\n                 Should contain `nb_epochs`, `learning_rate`,\n                 `batch_size`\n    :param rng: Instance of numpy.random.RandomState\n    :param var_list: Optional list of parameters to train.\n    :param fprop_args: dict, extra arguments to pass to fprop (loss and model).\n    :param optimizer: Optimizer to be used for training\n    :param devices: list of device names to use for training\n        If None, defaults to: all GPUs, if GPUs are available\n                              all devices, if no GPUs are available\n    :param x_batch_preprocessor: callable\n        Takes a single tensor containing an x_train batch as input\n        Returns a single tensor containing an x_train batch as output\n        Called to preprocess the data before passing the data to the Loss\n    :param use_ema: bool\n        If true, uses an exponential moving average of the model parameters\n    :param ema_decay: float or callable\n        The decay parameter for EMA, if EMA is used\n        If a callable rather than a float, this is a callable that takes\n        the epoch and batch as arguments and returns the ema_decay for\n        the current batch.\n    :param loss_threshold: float\n        Raise an exception if the loss exceeds this value.\n        This is intended to rapidly detect numerical problems.\n        Sometimes the loss may legitimately be higher than this value. In\n        such cases, raise the value. If needed it can be np.inf.\n    :param dataset_train: tf Dataset instance.\n        Used as a replacement for x_train, y_train for faster performance.\n      :param dataset_size: integer, the size of the dataset_train.\n    :return: True if model trained\n    \"\"\"\n\n    # Check whether the hardware is working correctly\n    canary.run_canary()\n    if run_canary is not None:\n        warnings.warn(\n            \"The `run_canary` argument is deprecated. The canary \"\n            \"is now much cheaper and thus runs all the time. The \"\n            \"canary now uses its own loss function so it is not \"\n            \"necessary to turn off the canary when training with \"\n            \" a stochastic loss. Simply quit passing `run_canary`.\"\n            \"Passing `run_canary` may become an error on or after \"\n            \"2019-10-16.\"\n        )\n\n    args = _ArgsWrapper(args or {})\n    fprop_args = fprop_args or {}\n\n    # Check that necessary arguments were given (see doc above)\n    # Be sure to support 0 epochs for debugging purposes\n    if args.nb_epochs is None:\n        raise ValueError(\"`args` must specify number of epochs\")\n    if optimizer is None:\n        if args.learning_rate is None:\n            raise ValueError(\"Learning rate was not given in args dict\")\n    assert args.batch_size, \"Batch size was not given in args dict\"\n\n    if rng is None:\n        rng = np.random.RandomState()\n\n    if optimizer is None:\n        optimizer = tf.train.AdamOptimizer(learning_rate=args.learning_rate)\n    else:\n        if not isinstance(optimizer, tf.train.Optimizer):\n            raise ValueError(\n                \"optimizer object must be from a child class of \" \"tf.train.Optimizer\"\n            )\n\n    grads = []\n    xs = []\n    preprocessed_xs = []\n    ys = []\n    if dataset_train is not None:\n        assert x_train is None and y_train is None and x_batch_preprocessor is None\n        if dataset_size is None:\n            raise ValueError(\"You must provide a dataset size\")\n        data_iterator = dataset_train.make_one_shot_iterator().get_next()\n        x_train, y_train = sess.run(data_iterator)\n\n    devices = infer_devices(devices)\n    for device in devices:\n        with tf.device(device):\n            x = tf.placeholder(x_train.dtype, (None,) + x_train.shape[1:])\n            y = tf.placeholder(y_train.dtype, (None,) + y_train.shape[1:])\n            xs.append(x)\n            ys.append(y)\n\n            if x_batch_preprocessor is not None:\n                x = x_batch_preprocessor(x)\n\n            # We need to keep track of these so that the canary can feed\n            # preprocessed values. If the canary had to feed raw values,\n            # stochastic preprocessing could make the canary fail.\n            preprocessed_xs.append(x)\n\n            loss_value = loss.fprop(x, y, **fprop_args)\n\n            grads.append(optimizer.compute_gradients(loss_value, var_list=var_list))\n    num_devices = len(devices)\n    print(\"num_devices: \", num_devices)\n\n    grad = avg_grads(grads)\n    # Trigger update operations within the default graph (such as batch_norm).\n    with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):\n        train_step = optimizer.apply_gradients(grad)\n\n    epoch_tf = tf.placeholder(tf.int32, [])\n    batch_tf = tf.placeholder(tf.int32, [])\n\n    if use_ema:\n        if callable(ema_decay):\n            ema_decay = ema_decay(epoch_tf, batch_tf)\n        ema = tf.train.ExponentialMovingAverage(decay=ema_decay)\n        with tf.control_dependencies([train_step]):\n            train_step = ema.apply(var_list)\n        # Get pointers to the EMA's running average variables\n        avg_params = [ema.average(param) for param in var_list]\n        # Make temporary buffers used for swapping the live and running average\n        # parameters\n        tmp_params = [tf.Variable(param, trainable=False) for param in var_list]\n        # Define the swapping operation\n        param_to_tmp = [\n            tf.assign(tmp, param) for tmp, param in safe_zip(tmp_params, var_list)\n        ]\n        with tf.control_dependencies(param_to_tmp):\n            avg_to_param = [\n                tf.assign(param, avg) for param, avg in safe_zip(var_list, avg_params)\n            ]\n        with tf.control_dependencies(avg_to_param):\n            tmp_to_avg = [\n                tf.assign(avg, tmp) for avg, tmp in safe_zip(avg_params, tmp_params)\n            ]\n        swap = tmp_to_avg\n\n    batch_size = args.batch_size\n\n    assert batch_size % num_devices == 0\n    device_batch_size = batch_size // num_devices\n\n    if init_all:\n        sess.run(tf.global_variables_initializer())\n    else:\n        initialize_uninitialized_global_variables(sess)\n\n    for epoch in xrange(args.nb_epochs):\n        if dataset_train is not None:\n            nb_batches = int(math.ceil(float(dataset_size) / batch_size))\n        else:\n            # Indices to shuffle training set\n            index_shuf = list(range(len(x_train)))\n            # Randomly repeat a few training examples each epoch to avoid\n            # having a too-small batch\n            while len(index_shuf) % batch_size != 0:\n                index_shuf.append(rng.randint(len(x_train)))\n            nb_batches = len(index_shuf) // batch_size\n            rng.shuffle(index_shuf)\n            # Shuffling here versus inside the loop doesn't seem to affect\n            # timing very much, but shuffling here makes the code slightly\n            # easier to read\n            x_train_shuffled = x_train[index_shuf]\n            y_train_shuffled = y_train[index_shuf]\n\n        prev = time.time()\n        for batch in range(nb_batches):\n            if dataset_train is not None:\n                x_train_shuffled, y_train_shuffled = sess.run(data_iterator)\n                start, end = 0, batch_size\n            else:\n                # Compute batch start and end indices\n                start = batch * batch_size\n                end = (batch + 1) * batch_size\n                # Perform one training step\n                diff = end - start\n                assert diff == batch_size\n\n            feed_dict = {epoch_tf: epoch, batch_tf: batch}\n            for dev_idx in xrange(num_devices):\n                cur_start = start + dev_idx * device_batch_size\n                cur_end = start + (dev_idx + 1) * device_batch_size\n                feed_dict[xs[dev_idx]] = x_train_shuffled[cur_start:cur_end]\n                feed_dict[ys[dev_idx]] = y_train_shuffled[cur_start:cur_end]\n            if cur_end != end and dataset_train is None:\n                msg = (\n                    \"batch_size (%d) must be a multiple of num_devices \"\n                    \"(%d).\\nCUDA_VISIBLE_DEVICES: %s\"\n                    \"\\ndevices: %s\"\n                )\n                args = (\n                    batch_size,\n                    num_devices,\n                    os.environ[\"CUDA_VISIBLE_DEVICES\"],\n                    str(devices),\n                )\n                raise ValueError(msg % args)\n            if feed is not None:\n                feed_dict.update(feed)\n\n            _, loss_numpy = sess.run([train_step, loss_value], feed_dict=feed_dict)\n\n            if np.abs(loss_numpy) > loss_threshold:\n                raise ValueError(\"Extreme loss during training: \", loss_numpy)\n            if np.isnan(loss_numpy) or np.isinf(loss_numpy):\n                raise ValueError(\"NaN/Inf loss during training\")\n        assert dataset_train is not None or end == len(\n            index_shuf\n        )  # Check that all examples were used\n        cur = time.time()\n        _logger.info(\"Epoch \" + str(epoch) + \" took \" + str(cur - prev) + \" seconds\")\n        if evaluate is not None:\n            if use_ema:\n                # Before running evaluation, load the running average\n                # parameters into the live slot, so we can see how well\n                # the EMA parameters are performing\n                sess.run(swap)\n            evaluate()\n            if use_ema:\n                # Swap the parameters back, so that we continue training\n                # on the live parameters\n                sess.run(swap)\n    if use_ema:\n        # When training is done, swap the running average parameters into\n        # the live slot, so that we use them when we deploy the model\n        sess.run(swap)\n\n    return True\n\n\ndef avg_grads(tower_grads):\n    \"\"\"Calculate the average gradient for each shared variable across all\n    towers.\n    Note that this function provides a synchronization point across all towers.\n    Args:\n      tower_grads: List of lists of (gradient, variable) tuples. The outer list\n        is over individual gradients. The inner list is over the gradient\n        calculation for each tower.\n    Returns:\n       List of pairs of (gradient, variable) where the gradient has been\n       averaged across all towers.\n\n    Modified from this tutorial: https://tinyurl.com/n3jr2vm\n    \"\"\"\n    if len(tower_grads) == 1:\n        return tower_grads[0]\n    average_grads = []\n    for grad_and_vars in zip(*tower_grads):\n        # Note that each grad_and_vars looks like the following:\n        #   ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN))\n        grads = [g for g, _ in grad_and_vars]\n\n        # Average over the 'tower' dimension.\n        grad = tf.add_n(grads) / len(grads)\n\n        # Keep in mind that the Variables are redundant because they are shared\n        # across towers. So .. we will just return the first tower's pointer to\n        # the Variable.\n        v = grad_and_vars[0][1]\n        assert all(v is grad_and_var[1] for grad_and_var in grad_and_vars)\n        grad_and_var = (grad, v)\n        average_grads.append(grad_and_var)\n    return average_grads\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/utils.py",
    "content": "\"\"\"\nGeneric utility functions useful for writing Python code in general\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nfrom collections import OrderedDict\nimport warnings\nimport logging\nimport os\nimport re\nimport subprocess\n\nimport numpy as np\nfrom six.moves import xrange\n\nknown_number_types = (\n    int,\n    float,\n    np.float16,\n    np.float32,\n    np.float64,\n    np.int8,\n    np.int16,\n    np.int32,\n    np.int32,\n    np.int64,\n    np.uint8,\n    np.uint16,\n    np.uint32,\n    np.uint64,\n)\n\n\nCLEVERHANS_ROOT = os.path.dirname(os.path.dirname(__file__))\n\n\nclass _ArgsWrapper(object):\n\n    \"\"\"\n    Wrapper that allows attribute access to dictionaries\n    \"\"\"\n\n    def __init__(self, args):\n        if not isinstance(args, dict):\n            args = vars(args)\n        self.args = args\n\n    def __getattr__(self, name):\n        return self.args.get(name)\n\n\nclass AccuracyReport(object):\n\n    \"\"\"\n    An object summarizing the accuracy results for experiments involving\n    training on clean examples or adversarial examples, then evaluating\n    on clean or adversarial examples.\n    \"\"\"\n\n    def __init__(self):\n        self.clean_train_clean_eval = 0.0\n        self.clean_train_adv_eval = 0.0\n        self.adv_train_clean_eval = 0.0\n        self.adv_train_adv_eval = 0.0\n\n        # Training data accuracy results to be used by tutorials\n        self.train_clean_train_clean_eval = 0.0\n        self.train_clean_train_adv_eval = 0.0\n        self.train_adv_train_clean_eval = 0.0\n        self.train_adv_train_adv_eval = 0.0\n\n\ndef batch_indices(batch_nb, data_length, batch_size):\n    \"\"\"\n    This helper function computes a batch start and end index\n    :param batch_nb: the batch number\n    :param data_length: the total length of the data being parsed by batches\n    :param batch_size: the number of inputs in each batch\n    :return: pair of (start, end) indices\n    \"\"\"\n    # Batch start and end index\n    start = int(batch_nb * batch_size)\n    end = int((batch_nb + 1) * batch_size)\n\n    # When there are not enough inputs left, we reuse some to complete the\n    # batch\n    if end > data_length:\n        shift = end - data_length\n        start -= shift\n        end -= shift\n\n    return start, end\n\n\ndef other_classes(nb_classes, class_ind):\n    \"\"\"\n    Returns a list of class indices excluding the class indexed by class_ind\n    :param nb_classes: number of classes in the task\n    :param class_ind: the class index to be omitted\n    :return: list of class indices excluding the class indexed by class_ind\n    \"\"\"\n    if class_ind < 0 or class_ind >= nb_classes:\n        error_str = \"class_ind must be within the range (0, nb_classes - 1)\"\n        raise ValueError(error_str)\n\n    other_classes_list = list(range(nb_classes))\n    other_classes_list.remove(class_ind)\n\n    return other_classes_list\n\n\ndef to_categorical(y, nb_classes, num_classes=None):\n    \"\"\"\n    Converts a class vector (integers) to binary class matrix.\n    This is adapted from the Keras function with the same name.\n    :param y: class vector to be converted into a matrix\n              (integers from 0 to nb_classes).\n    :param nb_classes: nb_classes: total number of classes.\n    :param num_classses: depricated version of nb_classes\n    :return: A binary matrix representation of the input.\n    \"\"\"\n    if num_classes is not None:\n        if nb_classes is not None:\n            raise ValueError(\n                \"Should not specify both nb_classes and its deprecated \"\n                \"alias, num_classes\"\n            )\n        warnings.warn(\n            \"`num_classes` is deprecated. Switch to `nb_classes`.\"\n            \" `num_classes` may be removed on or after 2019-04-23.\"\n        )\n        nb_classes = num_classes\n        del num_classes\n    y = np.array(y, dtype=\"int\").ravel()\n    n = y.shape[0]\n    categorical = np.zeros((n, nb_classes))\n    categorical[np.arange(n), y] = 1\n    return categorical\n\n\ndef random_targets(gt, nb_classes):\n    \"\"\"\n    Take in an array of correct labels and randomly select a different label\n    for each label in the array. This is typically used to randomly select a\n    target class in targeted adversarial examples attacks (i.e., when the\n    search algorithm takes in both a source class and target class to compute\n    the adversarial example).\n    :param gt: the ground truth (correct) labels. They can be provided as a\n               1D vector or 2D array of one-hot encoded labels.\n    :param nb_classes: The number of classes for this task. The random class\n                       will be chosen between 0 and nb_classes such that it\n                       is different from the correct class.\n    :return: A numpy array holding the randomly-selected target classes\n             encoded as one-hot labels.\n    \"\"\"\n    # If the ground truth labels are encoded as one-hot, convert to labels.\n    if len(gt.shape) == 2:\n        gt = np.argmax(gt, axis=1)\n\n    # This vector will hold the randomly selected labels.\n    result = np.zeros(gt.shape, dtype=np.int32)\n\n    for class_ind in xrange(nb_classes):\n        # Compute all indices in that class.\n        in_cl = gt == class_ind\n        size = np.sum(in_cl)\n\n        # Compute the set of potential targets for this class.\n        potential_targets = other_classes(nb_classes, class_ind)\n\n        # Draw with replacement random targets among the potential targets.\n        result[in_cl] = np.random.choice(potential_targets, size=size)\n\n    # Encode vector of random labels as one-hot labels.\n    result = to_categorical(result, nb_classes)\n    result = result.astype(np.int32)\n\n    return result\n\n\ndef pair_visual(*args, **kwargs):\n    \"\"\"Deprecation wrapper\"\"\"\n    warnings.warn(\n        \"`pair_visual` has moved to `cleverhans.plot.pyplot_image`. \"\n        \"cleverhans.utils.pair_visual may be removed on or after \"\n        \"2019-04-24.\"\n    )\n    from cleverhans.plot.pyplot_image import pair_visual as new_pair_visual\n\n    return new_pair_visual(*args, **kwargs)\n\n\ndef grid_visual(*args, **kwargs):\n    \"\"\"Deprecation wrapper\"\"\"\n    warnings.warn(\n        \"`grid_visual` has moved to `cleverhans.plot.pyplot_image`. \"\n        \"cleverhans.utils.grid_visual may be removed on or after \"\n        \"2019-04-24.\"\n    )\n    from cleverhans.plot.pyplot_image import grid_visual as new_grid_visual\n\n    return new_grid_visual(*args, **kwargs)\n\n\ndef get_logits_over_interval(*args, **kwargs):\n    \"\"\"Deprecation wrapper\"\"\"\n    warnings.warn(\n        \"`get_logits_over_interval` has moved to \"\n        \"`cleverhans.plot.pyplot_image`. \"\n        \"cleverhans.utils.get_logits_over_interval may be removed on \"\n        \"or after 2019-04-24.\"\n    )\n    # pylint:disable=line-too-long\n    from cleverhans.plot.pyplot_image import (\n        get_logits_over_interval as new_get_logits_over_interval,\n    )\n\n    return new_get_logits_over_interval(*args, **kwargs)\n\n\ndef linear_extrapolation_plot(*args, **kwargs):\n    \"\"\"Deprecation wrapper\"\"\"\n    warnings.warn(\n        \"`linear_extrapolation_plot` has moved to \"\n        \"`cleverhans.plot.pyplot_image`. \"\n        \"cleverhans.utils.linear_extrapolation_plot may be removed on \"\n        \"or after 2019-04-24.\"\n    )\n    # pylint:disable=line-too-long\n    from cleverhans.plot.pyplot_image import (\n        linear_extrapolation_plot as new_linear_extrapolation_plot,\n    )\n\n    return new_linear_extrapolation_plot(*args, **kwargs)\n\n\ndef set_log_level(level, name=\"cleverhans\"):\n    \"\"\"\n    Sets the threshold for the cleverhans logger to level\n    :param level: the logger threshold. You can find values here:\n                  https://docs.python.org/2/library/logging.html#levels\n    :param name: the name used for the cleverhans logger\n    \"\"\"\n    logging.getLogger(name).setLevel(level)\n\n\ndef get_log_level(name=\"cleverhans\"):\n    \"\"\"\n    Gets the current threshold for the cleverhans logger\n    :param name: the name used for the cleverhans logger\n    \"\"\"\n    return logging.getLogger(name).getEffectiveLevel()\n\n\nclass TemporaryLogLevel(object):\n    \"\"\"\n    A ContextManager that changes a log level temporarily.\n\n    Note that the log level will be set back to its original value when\n    the context manager exits, even if the log level has been changed\n    again in the meantime.\n    \"\"\"\n\n    def __init__(self, level, name):\n        self.name = name\n        self.level = level\n\n    def __enter__(self):\n        self.old_level = get_log_level(self.name)\n        set_log_level(self.level, self.name)\n\n    def __exit__(self, type, value, traceback):\n        set_log_level(self.old_level, self.name)\n        return True\n\n\ndef create_logger(name):\n    \"\"\"\n    Create a logger object with the given name.\n\n    If this is the first time that we call this method, then initialize the\n    formatter.\n    \"\"\"\n    base = logging.getLogger(\"cleverhans\")\n    if len(base.handlers) == 0:\n        ch = logging.StreamHandler()\n        formatter = logging.Formatter(\n            \"[%(levelname)s %(asctime)s %(name)s] \" + \"%(message)s\"\n        )\n        ch.setFormatter(formatter)\n        base.addHandler(ch)\n\n    return base\n\n\ndef deterministic_dict(normal_dict):\n    \"\"\"\n    Returns a version of `normal_dict` whose iteration order is always the same\n    \"\"\"\n    out = OrderedDict()\n    for key in sorted(normal_dict.keys()):\n        out[key] = normal_dict[key]\n    return out\n\n\ndef ordered_union(l1, l2):\n    \"\"\"\n    Return the union of l1 and l2, with a deterministic ordering.\n    (Union of python sets does not necessarily have a consisten iteration\n    order)\n    :param l1: list of items\n    :param l2: list of items\n    :returns: list containing one copy of each item that is in l1 or in l2\n    \"\"\"\n    out = []\n    for e in l1 + l2:\n        if e not in out:\n            out.append(e)\n    return out\n\n\ndef safe_zip(*args):\n    \"\"\"like zip but with these properties:\n    - returns a list, rather than an iterator. This is the old Python2 zip behavior.\n    - a guarantee that all arguments are the same length.\n    (normal zip silently drops entries to make them the same length)\n    \"\"\"\n    length = len(args[0])\n    if not all(len(arg) == length for arg in args):\n        raise ValueError(\n            \"Lengths of arguments do not match: \" + str([len(arg) for arg in args])\n        )\n    return list(zip(*args))\n\n\ndef shell_call(command, **kwargs):\n    \"\"\"Calls shell command with argument substitution.\n\n    Args:\n      command: command represented as a list. Each element of the list is one\n        token of the command. For example \"cp a b\" becomes ['cp', 'a', 'b']\n        If any element of the list looks like '${NAME}' then it will be replaced\n        by value from **kwargs with key 'NAME'.\n      **kwargs: dictionary with argument substitution\n\n    Returns:\n      output of the command\n\n    Raises:\n      subprocess.CalledProcessError if command return value is not zero\n\n    This function is useful when you need to do variable substitution prior\n    running the command. Below are few examples of how it works:\n\n      shell_call(['cp', 'a', 'b'], a='asd') calls command 'cp a b'\n\n      shell_call(['cp', '${a}', 'b'], a='asd') calls command 'cp asd b',\n      '${a}; was replaced with 'asd' before calling the command\n    \"\"\"\n    # Regular expression to find instances of '${NAME}' in a string\n    CMD_VARIABLE_RE = re.compile(\"^\\\\$\\\\{(\\\\w+)\\\\}$\")\n    command = list(command)\n    for i in range(len(command)):\n        m = CMD_VARIABLE_RE.match(command[i])\n        if m:\n            var_id = m.group(1)\n            if var_id in kwargs:\n                command[i] = kwargs[var_id]\n    str_command = \" \".join(command)\n    logging.debug(\"Executing shell command: %s\" % str_command)\n    return subprocess.check_output(command)\n\n\ndef deep_copy(numpy_dict):\n    \"\"\"\n    Returns a copy of a dictionary whose values are numpy arrays.\n    Copies their values rather than copying references to them.\n    \"\"\"\n    out = {}\n    for key in numpy_dict:\n        out[key] = numpy_dict[key].copy()\n    return out\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/utils_keras.py",
    "content": "\"\"\"\nModel construction utilities based on keras\n\"\"\"\nfrom distutils.version import LooseVersion\nimport warnings\nimport tensorflow as tf\n\nfrom .model import Model, NoSuchLayerError\n\n# Assignment rather than import because direct import from within Keras\n# doesn't work in tf 1.8\nSequential = tf.keras.models.Sequential\nConv2D = tf.keras.layers.Conv2D\nDense = tf.keras.layers.Dense\nActivation = tf.keras.layers.Activation\nFlatten = tf.keras.layers.Flatten\nKerasModel = tf.keras.models.Model\n\n\ndef conv_2d(filters, kernel_shape, strides, padding, input_shape=None):\n    \"\"\"\n    Defines the right convolutional layer according to the\n    version of Keras that is installed.\n    :param filters: (required integer) the dimensionality of the output\n                    space (i.e. the number output of filters in the\n                    convolution)\n    :param kernel_shape: (required tuple or list of 2 integers) specifies\n                         the kernel shape of the convolution\n    :param strides: (required tuple or list of 2 integers) specifies\n                         the strides of the convolution along the width and\n                         height.\n    :param padding: (required string) can be either 'valid' (no padding around\n                    input or feature map) or 'same' (pad to ensure that the\n                    output feature map size is identical to the layer input)\n    :param input_shape: (optional) give input shape if this is the first\n                        layer of the model\n    :return: the Keras layer\n    \"\"\"\n    if input_shape is not None:\n        return Conv2D(\n            filters=filters,\n            kernel_size=kernel_shape,\n            strides=strides,\n            padding=padding,\n            input_shape=input_shape,\n        )\n    else:\n        return Conv2D(\n            filters=filters, kernel_size=kernel_shape, strides=strides, padding=padding\n        )\n\n\ndef cnn_model(\n    logits=False,\n    input_ph=None,\n    img_rows=28,\n    img_cols=28,\n    channels=1,\n    nb_filters=64,\n    nb_classes=10,\n):\n    \"\"\"\n    Defines a CNN model using Keras sequential model\n    :param logits: If set to False, returns a Keras model, otherwise will also\n                    return logits tensor\n    :param input_ph: The TensorFlow tensor for the input\n                    (needed if returning logits)\n                    (\"ph\" stands for placeholder but it need not actually be a\n                    placeholder)\n    :param img_rows: number of row in the image\n    :param img_cols: number of columns in the image\n    :param channels: number of color channels (e.g., 1 for MNIST)\n    :param nb_filters: number of convolutional filters per layer\n    :param nb_classes: the number of output classes\n    :return:\n    \"\"\"\n    model = Sequential()\n\n    # Define the layers successively (convolution layers are version dependent)\n    if tf.keras.backend.image_data_format() == \"channels_first\":\n        input_shape = (channels, img_rows, img_cols)\n    else:\n        assert tf.keras.backend.image_data_format() == \"channels_last\"\n        input_shape = (img_rows, img_cols, channels)\n\n    layers = [\n        conv_2d(nb_filters, (8, 8), (2, 2), \"same\", input_shape=input_shape),\n        Activation(\"relu\"),\n        conv_2d((nb_filters * 2), (6, 6), (2, 2), \"valid\"),\n        Activation(\"relu\"),\n        conv_2d((nb_filters * 2), (5, 5), (1, 1), \"valid\"),\n        Activation(\"relu\"),\n        Flatten(),\n        Dense(nb_classes),\n    ]\n\n    for layer in layers:\n        model.add(layer)\n\n    if logits:\n        logits_tensor = model(input_ph)\n    model.add(Activation(\"softmax\"))\n\n    if logits:\n        return model, logits_tensor\n    else:\n        return model\n\n\nclass KerasModelWrapper(Model):\n    \"\"\"\n    An implementation of `Model` that wraps a Keras model. It\n    specifically exposes the hidden features of a model by creating new models.\n    The symbolic graph is reused and so there is little overhead. Splitting\n    in-place operations can incur an overhead.\n    \"\"\"\n\n    def __init__(self, model):\n        \"\"\"\n        Create a wrapper for a Keras model\n        :param model: A Keras model\n        \"\"\"\n        super(KerasModelWrapper, self).__init__(None, None, {})\n\n        if model is None:\n            raise ValueError(\"model argument must be supplied.\")\n\n        self.model = model\n        self.keras_model = None\n\n    def _get_softmax_name(self):\n        \"\"\"\n        Looks for the name of the softmax layer.\n        :return: Softmax layer name\n        \"\"\"\n        for layer in self.model.layers:\n            cfg = layer.get_config()\n            if \"activation\" in cfg and cfg[\"activation\"] == \"softmax\":\n                return layer.name\n\n        raise Exception(\"No softmax layers found\")\n\n    def _get_abstract_layer_name(self):\n        \"\"\"\n        Looks for the name of abstracted layer.\n        Usually these layers appears when model is stacked.\n        :return: List of abstracted layers\n        \"\"\"\n        abstract_layers = []\n        for layer in self.model.layers:\n            if \"layers\" in layer.get_config():\n                abstract_layers.append(layer.name)\n\n        return abstract_layers\n\n    def _get_logits_name(self):\n        \"\"\"\n        Looks for the name of the layer producing the logits.\n        :return: name of layer producing the logits\n        \"\"\"\n        softmax_name = self._get_softmax_name()\n        softmax_layer = self.model.get_layer(softmax_name)\n\n        if not isinstance(softmax_layer, Activation):\n            # In this case, the activation is part of another layer\n            return softmax_name\n\n        if not hasattr(softmax_layer, \"_inbound_nodes\"):\n            raise RuntimeError(\"Please update keras to version >= 2.1.3\")\n\n        node = softmax_layer._inbound_nodes[0]\n\n        if LooseVersion(tf.__version__) < LooseVersion(\"1.14.0\"):\n            logits_name = node.inbound_layers[0].name\n        else:\n            logits_name = node.inbound_layers.name\n\n        return logits_name\n\n    def get_logits(self, x):\n        \"\"\"\n        :param x: A symbolic representation of the network input.\n        :return: A symbolic representation of the logits\n        \"\"\"\n        logits_name = self._get_logits_name()\n        logits_layer = self.get_layer(x, logits_name)\n\n        # Need to deal with the case where softmax is part of the\n        # logits layer\n        if logits_name == self._get_softmax_name():\n            softmax_logit_layer = self.get_layer(x, logits_name)\n\n            # The final op is the softmax. Return its input\n            logits_layer = softmax_logit_layer._op.inputs[0]\n\n        return logits_layer\n\n    def get_probs(self, x):\n        \"\"\"\n        :param x: A symbolic representation of the network input.\n        :return: A symbolic representation of the probs\n        \"\"\"\n        name = self._get_softmax_name()\n\n        return self.get_layer(x, name)\n\n    def get_layer_names(self):\n        \"\"\"\n        :return: Names of all the layers kept by Keras\n        \"\"\"\n        layer_names = [x.name for x in self.model.layers]\n        return layer_names\n\n    def fprop(self, x):\n        \"\"\"\n        Exposes all the layers of the model returned by get_layer_names.\n        :param x: A symbolic representation of the network input\n        :return: A dictionary mapping layer names to the symbolic\n                 representation of their output.\n        \"\"\"\n\n        if self.keras_model is None:\n            # Get the input layer\n            new_input = self.model.get_input_at(0)\n\n            # Make a new model that returns each of the layers as output\n            abstract_layers = self._get_abstract_layer_name()\n            if abstract_layers:\n                warnings.warn(\n                    \"Abstract layer detected, picking last ouput node as default.\"\n                    \"This could happen due to using of stacked model.\"\n                )\n\n            layer_outputs = []\n            # For those abstract model layers, return their last output node as\n            # default.\n            for x_layer in self.model.layers:\n                if x_layer.name not in abstract_layers:\n                    layer_outputs.append(x_layer.output)\n                else:\n                    layer_outputs.append(x_layer.get_output_at(-1))\n\n            self.keras_model = KerasModel(new_input, layer_outputs)\n\n        # and get the outputs for that model on the input x\n        outputs = self.keras_model(x)\n\n        # Keras only returns a list for outputs of length >= 1, if the model\n        # is only one layer, wrap a list\n        if len(self.model.layers) == 1:\n            outputs = [outputs]\n\n        # compute the dict to return\n        fprop_dict = dict(zip(self.get_layer_names(), outputs))\n\n        return fprop_dict\n\n    def get_layer(self, x, layer):\n        \"\"\"\n        Expose the hidden features of a model given a layer name.\n        :param x: A symbolic representation of the network input\n        :param layer: The name of the hidden layer to return features at.\n        :return: A symbolic representation of the hidden features\n        :raise: NoSuchLayerError if `layer` is not in the model.\n        \"\"\"\n        # Return the symbolic representation for this layer.\n        output = self.fprop(x)\n        try:\n            requested = output[layer]\n        except KeyError:\n            raise NoSuchLayerError()\n        return requested\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/utils_mnist.py",
    "content": "# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport os\nimport tempfile\nimport warnings\n\nfrom cleverhans import dataset\n\nutils_mnist_warning = (\n    \"cleverhans.utils_mnist is deprecrated and will be \"\n    \"removed on or after 2019-03-26. Switch to \"\n    \"cleverhans.dataset instead.\"\n)\n\n\ndef maybe_download_mnist_file(file_name, datadir=None, force=False):\n    warnings.warn(utils_mnist_warning)\n    url = os.path.join('https://storage.googleapis.com/cvdf-datasets/mnist/', file_name)\n    return dataset.maybe_download_file(url, datadir=None, force=False)\n\n\ndef download_and_parse_mnist_file(file_name, datadir=None, force=False):\n    warnings.warn(utils_mnist_warning)\n    return dataset.download_and_parse_mnist_file(file_name, datadir=None, force=False)\n\n\ndef data_mnist(\n    datadir=tempfile.gettempdir(),\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n):\n    warnings.warn(utils_mnist_warning)\n    mnist = dataset.MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n        center=False,\n    )\n    return mnist.get_set(\"train\") + mnist.get_set(\"test\")\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/utils_pytorch.py",
    "content": "\"\"\"Basic utilities for pytorch code\"\"\"\n\nimport warnings\nfrom random import getrandbits\n\nimport numpy as np\nimport tensorflow as tf\nimport torch\nfrom torch.autograd import Variable\n\n\n# https://gist.github.com/kingspp/3ec7d9958c13b94310c1a365759aa3f4\n# Pyfunc Gradient Function\ndef _py_func_with_gradient(func, inp, Tout, stateful=True, name=None, grad_func=None):\n    \"\"\"\n    PyFunc defined as given by Tensorflow\n    :param func: Custom Function\n    :param inp: Function Inputs\n    :param Tout: Ouput Type of out Custom Function\n    :param stateful: Calculate Gradients when stateful is True\n    :param name: Name of the PyFunction\n    :param grad: Custom Gradient Function\n    :return:\n    \"\"\"\n    # Generate random name in order to avoid conflicts with inbuilt names\n    rnd_name = \"PyFuncGrad-\" + \"%0x\" % getrandbits(30 * 4)\n\n    # Register Tensorflow Gradient\n    tf.RegisterGradient(rnd_name)(grad_func)\n\n    # Get current graph\n    g = tf.get_default_graph()\n\n    # Add gradient override map\n    with g.gradient_override_map({\"PyFunc\": rnd_name, \"PyFuncStateless\": rnd_name}):\n        return tf.py_func(func, inp, Tout, stateful=stateful, name=name)\n\n\ndef convert_pytorch_model_to_tf(model, out_dims=None):\n    \"\"\"\n    Convert a pytorch model into a tensorflow op that allows backprop\n    :param model: A pytorch nn.Module object\n    :param out_dims: The number of output dimensions (classes) for the model\n    :return: A model function that maps an input (tf.Tensor) to the\n    output of the model (tf.Tensor)\n    \"\"\"\n    warnings.warn(\n        \"convert_pytorch_model_to_tf is deprecated, switch to\"\n        + \" dedicated PyTorch support provided by CleverHans v4.\"\n    )\n\n    torch_state = {\n        \"logits\": None,\n        \"x\": None,\n    }\n    if not out_dims:\n        out_dims = list(model.modules())[-1].out_features\n\n    def _fprop_fn(x_np):\n        \"\"\"TODO: write this\"\"\"\n        x_tensor = torch.Tensor(x_np)\n        if torch.cuda.is_available():\n            x_tensor = x_tensor.cuda()\n        torch_state[\"x\"] = Variable(x_tensor, requires_grad=True)\n        torch_state[\"logits\"] = model(torch_state[\"x\"])\n        return torch_state[\"logits\"].data.cpu().numpy()\n\n    def _bprop_fn(x_np, grads_in_np):\n        \"\"\"TODO: write this\"\"\"\n        _fprop_fn(x_np)\n\n        grads_in_tensor = torch.Tensor(grads_in_np)\n        if torch.cuda.is_available():\n            grads_in_tensor = grads_in_tensor.cuda()\n\n        # Run our backprop through our logits to our xs\n        loss = torch.sum(torch_state[\"logits\"] * grads_in_tensor)\n        loss.backward()\n        return torch_state[\"x\"].grad.cpu().data.numpy()\n\n    def _tf_gradient_fn(op, grads_in):\n        \"\"\"TODO: write this\"\"\"\n        return tf.py_func(_bprop_fn, [op.inputs[0], grads_in], Tout=[tf.float32])\n\n    def tf_model_fn(x_op):\n        \"\"\"TODO: write this\"\"\"\n        out = _py_func_with_gradient(\n            _fprop_fn,\n            [x_op],\n            Tout=[tf.float32],\n            stateful=True,\n            grad_func=_tf_gradient_fn,\n        )[0]\n        out.set_shape([None, out_dims])\n        return out\n\n    return tf_model_fn\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/utils_tf.py",
    "content": "\"\"\"Utility functions for writing TensorFlow code\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport math\nimport os\nimport time\nimport warnings\n\nimport numpy as np\nimport six\nfrom six.moves import xrange\nimport tensorflow as tf\n\nfrom cleverhans.compat import device_lib\nfrom cleverhans.compat import reduce_sum, reduce_mean\nfrom cleverhans.compat import reduce_max\nfrom cleverhans.compat import softmax_cross_entropy_with_logits\nfrom cleverhans.utils import batch_indices, _ArgsWrapper, create_logger\n\n_logger = create_logger(\"cleverhans.utils.tf\")\n_logger.setLevel(logging.INFO)\n\n\ndef model_loss(y, model, mean=True):\n    \"\"\"\n    Define loss of TF graph\n    :param y: correct labels\n    :param model: output of the model\n    :param mean: boolean indicating whether should return mean of loss\n                 or vector of losses for each input of the batch\n    :return: return mean of loss if True, otherwise return vector with per\n             sample loss\n    \"\"\"\n    warnings.warn(\n        \"This function is deprecated and will be removed on or after\"\n        \" 2019-04-05. Switch to cleverhans.train.train.\"\n    )\n    op = model.op\n    if op.type == \"Softmax\":\n        (logits,) = op.inputs\n    else:\n        logits = model\n\n    out = softmax_cross_entropy_with_logits(logits=logits, labels=y)\n\n    if mean:\n        out = reduce_mean(out)\n    return out\n\n\ndef initialize_uninitialized_global_variables(sess):\n    \"\"\"\n    Only initializes the variables of a TensorFlow session that were not\n    already initialized.\n    :param sess: the TensorFlow session\n    :return:\n    \"\"\"\n    # List all global variables\n    global_vars = tf.global_variables()\n\n    # Find initialized status for all variables\n    is_var_init = [tf.is_variable_initialized(var) for var in global_vars]\n    is_initialized = sess.run(is_var_init)\n\n    # List all variables that were not initialized previously\n    not_initialized_vars = [\n        var for (var, init) in zip(global_vars, is_initialized) if not init\n    ]\n\n    # Initialize all uninitialized variables found, if any\n    if len(not_initialized_vars):\n        sess.run(tf.variables_initializer(not_initialized_vars))\n\n\ndef train(\n    sess,\n    loss,\n    x,\n    y,\n    X_train,\n    Y_train,\n    save=False,\n    init_all=False,\n    evaluate=None,\n    feed=None,\n    args=None,\n    rng=None,\n    var_list=None,\n    fprop_args=None,\n    optimizer=None,\n):\n    \"\"\"\n    Train a TF graph.\n    This function is deprecated. Prefer cleverhans.train.train when possible.\n    cleverhans.train.train supports multiple GPUs but this function is still\n    needed to support legacy models that do not support calling fprop more\n    than once.\n\n    :param sess: TF session to use when training the graph\n    :param loss: tensor, the model training loss.\n    :param x: input placeholder\n    :param y: output placeholder (for labels)\n    :param X_train: numpy array with training inputs\n    :param Y_train: numpy array with training outputs\n    :param save: boolean controlling the save operation\n    :param init_all: (boolean) If set to true, all TF variables in the session\n                     are (re)initialized, otherwise only previously\n                     uninitialized variables are initialized before training.\n    :param evaluate: function that is run after each training iteration\n                     (typically to display the test/validation accuracy).\n    :param feed: An optional dictionary that is appended to the feeding\n                 dictionary before the session runs. Can be used to feed\n                 the learning phase of a Keras model for instance.\n    :param args: dict or argparse `Namespace` object.\n                 Should contain `nb_epochs`, `learning_rate`,\n                 `batch_size`\n                 If save is True, should also contain 'train_dir'\n                 and 'filename'\n    :param rng: Instance of numpy.random.RandomState\n    :param var_list: Optional list of parameters to train.\n    :param fprop_args: dict, extra arguments to pass to fprop (loss and model).\n    :param optimizer: Optimizer to be used for training\n    :return: True if model trained\n    \"\"\"\n    warnings.warn(\n        \"This function is deprecated and will be removed on or after\"\n        \" 2019-04-05. Switch to cleverhans.train.train.\"\n    )\n\n    args = _ArgsWrapper(args or {})\n    fprop_args = fprop_args or {}\n\n    # Check that necessary arguments were given (see doc above)\n    assert args.nb_epochs, \"Number of epochs was not given in args dict\"\n    if optimizer is None:\n        assert args.learning_rate is not None, (\n            \"Learning rate was not given \" \"in args dict\"\n        )\n    assert args.batch_size, \"Batch size was not given in args dict\"\n\n    if save:\n        assert args.train_dir, \"Directory for save was not given in args dict\"\n        assert args.filename, \"Filename for save was not given in args dict\"\n\n    if rng is None:\n        rng = np.random.RandomState()\n\n    # Define optimizer\n    loss_value = loss.fprop(x, y, **fprop_args)\n    if optimizer is None:\n        optimizer = tf.train.AdamOptimizer(learning_rate=args.learning_rate)\n    else:\n        if not isinstance(optimizer, tf.train.Optimizer):\n            raise ValueError(\n                \"optimizer object must be from a child class of \" \"tf.train.Optimizer\"\n            )\n    # Trigger update operations within the default graph (such as batch_norm).\n    with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):\n        train_step = optimizer.minimize(loss_value, var_list=var_list)\n\n    with sess.as_default():\n        if hasattr(tf, \"global_variables_initializer\"):\n            if init_all:\n                tf.global_variables_initializer().run()\n            else:\n                initialize_uninitialized_global_variables(sess)\n        else:\n            warnings.warn(\n                \"Update your copy of tensorflow; future versions of \"\n                \"CleverHans may drop support for this version.\"\n            )\n            sess.run(tf.initialize_all_variables())\n\n        for epoch in xrange(args.nb_epochs):\n            # Compute number of batches\n            nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size))\n            assert nb_batches * args.batch_size >= len(X_train)\n\n            # Indices to shuffle training set\n            index_shuf = list(range(len(X_train)))\n            rng.shuffle(index_shuf)\n\n            prev = time.time()\n            for batch in range(nb_batches):\n\n                # Compute batch start and end indices\n                start, end = batch_indices(batch, len(X_train), args.batch_size)\n\n                # Perform one training step\n                feed_dict = {\n                    x: X_train[index_shuf[start:end]],\n                    y: Y_train[index_shuf[start:end]],\n                }\n                if feed is not None:\n                    feed_dict.update(feed)\n                train_step.run(feed_dict=feed_dict)\n            assert end >= len(X_train)  # Check that all examples were used\n            cur = time.time()\n            _logger.info(\n                \"Epoch \" + str(epoch) + \" took \" + str(cur - prev) + \" seconds\"\n            )\n            if evaluate is not None:\n                evaluate()\n\n        if save:\n            save_path = os.path.join(args.train_dir, args.filename)\n            saver = tf.train.Saver()\n            saver.save(sess, save_path)\n            _logger.info(\"Completed model training and saved at: \" + str(save_path))\n        else:\n            _logger.info(\"Completed model training.\")\n\n    return True\n\n\ndef model_eval(sess, x, y, predictions, X_test=None, Y_test=None, feed=None, args=None):\n    \"\"\"\n    Compute the accuracy of a TF model on some data\n    :param sess: TF session to use\n    :param x: input placeholder\n    :param y: output placeholder (for labels)\n    :param predictions: model output predictions\n    :param X_test: numpy array with training inputs\n    :param Y_test: numpy array with training outputs\n    :param feed: An optional dictionary that is appended to the feeding\n             dictionary before the session runs. Can be used to feed\n             the learning phase of a Keras model for instance.\n    :param args: dict or argparse `Namespace` object.\n                 Should contain `batch_size`\n    :return: a float with the accuracy value\n    \"\"\"\n    global _model_eval_cache\n    args = _ArgsWrapper(args or {})\n\n    assert args.batch_size, \"Batch size was not given in args dict\"\n    if X_test is None or Y_test is None:\n        raise ValueError(\"X_test argument and Y_test argument \" \"must be supplied.\")\n\n    # Define accuracy symbolically\n    key = (y, predictions)\n    if key in _model_eval_cache:\n        correct_preds = _model_eval_cache[key]\n    else:\n        correct_preds = tf.equal(tf.argmax(y, axis=-1), tf.argmax(predictions, axis=-1))\n        _model_eval_cache[key] = correct_preds\n\n    # Init result var\n    accuracy = 0.0\n\n    with sess.as_default():\n        # Compute number of batches\n        nb_batches = int(math.ceil(float(len(X_test)) / args.batch_size))\n        assert nb_batches * args.batch_size >= len(X_test)\n\n        X_cur = np.zeros((args.batch_size,) + X_test.shape[1:], dtype=X_test.dtype)\n        Y_cur = np.zeros((args.batch_size,) + Y_test.shape[1:], dtype=Y_test.dtype)\n        for batch in range(nb_batches):\n            if batch % 100 == 0 and batch > 0:\n                _logger.debug(\"Batch \" + str(batch))\n\n            # Must not use the `batch_indices` function here, because it\n            # repeats some examples.\n            # It's acceptable to repeat during training, but not eval.\n            start = batch * args.batch_size\n            end = min(len(X_test), start + args.batch_size)\n\n            # The last batch may be smaller than all others. This should not\n            # affect the accuarcy disproportionately.\n            cur_batch_size = end - start\n            X_cur[:cur_batch_size] = X_test[start:end]\n            Y_cur[:cur_batch_size] = Y_test[start:end]\n            feed_dict = {x: X_cur, y: Y_cur}\n            if feed is not None:\n                feed_dict.update(feed)\n            cur_corr_preds = correct_preds.eval(feed_dict=feed_dict)\n\n            accuracy += cur_corr_preds[:cur_batch_size].sum()\n\n        assert end >= len(X_test)\n\n        # Divide by number of examples to get final value\n        accuracy /= len(X_test)\n\n    return accuracy\n\n\n_model_eval_cache = {}\n\n\ndef tf_model_load(sess, file_path=None):\n    \"\"\"\n\n    :param sess: the session object to restore\n    :param file_path: path to the restored session, if None is\n                      taken from FLAGS.train_dir and FLAGS.filename\n    :return:\n    \"\"\"\n    with sess.as_default():\n        saver = tf.train.Saver()\n        if file_path is None:\n            error = \"file_path argument is missing.\"\n            raise ValueError(error)\n        saver.restore(sess, file_path)\n\n    return True\n\n\ndef batch_eval(*args, **kwargs):\n    \"\"\"\n    Wrapper around deprecated function.\n    \"\"\"\n    # Inside function to avoid circular import\n    from cleverhans.evaluation import batch_eval as new_batch_eval\n\n    warnings.warn(\n        \"batch_eval has moved to cleverhans.evaluation. \"\n        \"batch_eval will be removed from utils_tf on or after \"\n        \"2019-03-09.\"\n    )\n    return new_batch_eval(*args, **kwargs)\n\n\ndef model_argmax(sess, x, predictions, samples, feed=None):\n    \"\"\"\n    Helper function that computes the current class prediction\n    :param sess: TF session\n    :param x: the input placeholder\n    :param predictions: the model's symbolic output\n    :param samples: numpy array with input samples (dims must match x)\n    :param feed: An optional dictionary that is appended to the feeding\n             dictionary before the session runs. Can be used to feed\n             the learning phase of a Keras model for instance.\n    :return: the argmax output of predictions, i.e. the current predicted class\n    \"\"\"\n    feed_dict = {x: samples}\n    if feed is not None:\n        feed_dict.update(feed)\n    probabilities = sess.run(predictions, feed_dict)\n\n    if samples.shape[0] == 1:\n        return np.argmax(probabilities)\n    else:\n        return np.argmax(probabilities, axis=1)\n\n\ndef l2_batch_normalize(x, epsilon=1e-12, scope=None):\n    \"\"\"\n    Helper function to normalize a batch of vectors.\n    :param x: the input placeholder\n    :param epsilon: stabilizes division\n    :return: the batch of l2 normalized vector\n    \"\"\"\n    with tf.name_scope(scope, \"l2_batch_normalize\") as name_scope:\n        x_shape = tf.shape(x)\n        x = tf.contrib.layers.flatten(x)\n        x /= epsilon + reduce_max(tf.abs(x), 1, keepdims=True)\n        square_sum = reduce_sum(tf.square(x), 1, keepdims=True)\n        x_inv_norm = tf.rsqrt(np.sqrt(epsilon) + square_sum)\n        x_norm = tf.multiply(x, x_inv_norm)\n        return tf.reshape(x_norm, x_shape, name_scope)\n\n\ndef kl_with_logits(\n    p_logits, q_logits, scope=None, loss_collection=tf.GraphKeys.REGULARIZATION_LOSSES\n):\n    \"\"\"Helper function to compute kl-divergence KL(p || q)\"\"\"\n    with tf.name_scope(scope, \"kl_divergence\") as name:\n        p = tf.nn.softmax(p_logits)\n        p_log = tf.nn.log_softmax(p_logits)\n        q_log = tf.nn.log_softmax(q_logits)\n        loss = reduce_mean(reduce_sum(p * (p_log - q_log), axis=1), name=name)\n        tf.losses.add_loss(loss, loss_collection)\n        return loss\n\n\ndef clip_eta(eta, ord, eps):\n    \"\"\"\n    Helper function to clip the perturbation to epsilon norm ball.\n    :param eta: A tensor with the current perturbation.\n    :param ord: Order of the norm (mimics Numpy).\n                Possible values: np.inf, 1 or 2.\n    :param eps: Epsilon, bound of the perturbation.\n    \"\"\"\n\n    # Clipping perturbation eta to self.ord norm ball\n    if ord not in [np.inf, 1, 2]:\n        raise ValueError(\"ord must be np.inf, 1, or 2.\")\n    reduc_ind = list(xrange(1, len(eta.get_shape())))\n    avoid_zero_div = 1e-12\n    if ord == np.inf:\n        eta = clip_by_value(eta, -eps, eps)\n    elif ord == 1:\n        # Implements a projection algorithm onto the l1-ball from\n        # (Duchi et al. 2008) that runs in time O(d*log(d)) where d is the\n        # input dimension.\n        # Paper link (Duchi et al. 2008): https://dl.acm.org/citation.cfm?id=1390191\n\n        eps = tf.cast(eps, eta.dtype)\n\n        dim = tf.reduce_prod(tf.shape(eta)[1:])\n        eta_flat = tf.reshape(eta, (-1, dim))\n        abs_eta = tf.abs(eta_flat)\n\n        if \"sort\" in dir(tf):\n            mu = -tf.sort(-abs_eta, axis=-1)\n        else:\n            # `tf.sort` is only available in TF 1.13 onwards\n            mu = tf.nn.top_k(abs_eta, k=dim, sorted=True)[0]\n        cumsums = tf.cumsum(mu, axis=-1)\n        js = tf.cast(tf.divide(1, tf.range(1, dim + 1)), eta.dtype)\n        t = tf.cast(tf.greater(mu - js * (cumsums - eps), 0), eta.dtype)\n\n        rho = tf.argmax(t * cumsums, axis=-1)\n        rho_val = tf.reduce_max(t * cumsums, axis=-1)\n        theta = tf.divide(rho_val - eps, tf.cast(1 + rho, eta.dtype))\n\n        eta_sgn = tf.sign(eta_flat)\n        eta_proj = eta_sgn * tf.maximum(abs_eta - theta[:, tf.newaxis], 0)\n        eta_proj = tf.reshape(eta_proj, tf.shape(eta))\n\n        norm = tf.reduce_sum(tf.abs(eta), reduc_ind)\n        eta = tf.where(tf.greater(norm, eps), eta_proj, eta)\n\n    elif ord == 2:\n        # avoid_zero_div must go inside sqrt to avoid a divide by zero\n        # in the gradient through this operation\n        norm = tf.sqrt(\n            tf.maximum(\n                avoid_zero_div, reduce_sum(tf.square(eta), reduc_ind, keepdims=True)\n            )\n        )\n        # We must *clip* to within the norm ball, not *normalize* onto the\n        # surface of the ball\n        factor = tf.minimum(1.0, div(eps, norm))\n        eta = eta * factor\n    return eta\n\n\ndef zero_out_clipped_grads(grad, x, clip_min, clip_max):\n    \"\"\"\n    Helper function to erase entries in the gradient where the update would be\n    clipped.\n    :param grad: The gradient\n    :param x: The current input\n    :param clip_min: Minimum input component value\n    :param clip_max: Maximum input component value\n    \"\"\"\n    signed_grad = tf.sign(grad)\n\n    # Find input components that lie at the boundary of the input range, and\n    # where the gradient points in the wrong direction.\n    clip_low = tf.logical_and(\n        tf.less_equal(x, tf.cast(clip_min, x.dtype)), tf.less(signed_grad, 0)\n    )\n    clip_high = tf.logical_and(\n        tf.greater_equal(x, tf.cast(clip_max, x.dtype)), tf.greater(signed_grad, 0)\n    )\n    clip = tf.logical_or(clip_low, clip_high)\n    grad = tf.where(clip, mul(grad, 0), grad)\n\n    return grad\n\n\ndef random_exponential(shape, rate=1.0, dtype=tf.float32, seed=None):\n    \"\"\"\n    Helper function to sample from the exponential distribution, which is not\n    included in core TensorFlow.\n\n    :shape: shape of the sampled tensor.\n    :rate: (optional) rate parameter of the exponential distribution, defaults to 1.0.\n    :dtype: (optional) data type of the sempled tensor, defaults to tf.float32.\n    :seed: (optional) custom seed to be used for sampling.\n    \"\"\"\n    return tf.random_gamma(shape, alpha=1, beta=1.0 / rate, dtype=dtype, seed=seed)\n\n\ndef random_laplace(shape, loc=0.0, scale=1.0, dtype=tf.float32, seed=None):\n    \"\"\"\n    Helper function to sample from the Laplace distribution, which is not\n    included in core TensorFlow.\n\n    :shape: shape of the sampled tensor.\n    :loc: (optional) mean of the laplace distribution, defaults to 0.0.\n    :scale: (optional) scale parameter of the laplace diustribution, defaults to 1.0.\n    :dtype: (optional) data type of the sempled tensor, defaults to tf.float32.\n    :seed: (optional) custom seed to be used for sampling.\n    \"\"\"\n    z1 = random_exponential(shape, 1.0 / scale, dtype=dtype, seed=seed)\n    z2 = random_exponential(shape, 1.0 / scale, dtype=dtype, seed=seed)\n    return z1 - z2 + loc\n\n\ndef random_lp_vector(shape, ord, eps, dtype=tf.float32, seed=None):\n    \"\"\"\n    Helper function to generate uniformly random vectors from a norm ball of\n    radius epsilon.\n    :param shape: Output shape of the random sample. The shape is expected to be\n                  of the form `(n, d1, d2, ..., dn)` where `n` is the number of\n                  i.i.d. samples that will be drawn from a norm ball of dimension\n                  `d1*d1*...*dn`.\n    :param ord: Order of the norm (mimics Numpy).\n                Possible values: np.inf, 1 or 2.\n    :param eps: Epsilon, radius of the norm ball.\n    \"\"\"\n    if ord not in [np.inf, 1, 2]:\n        raise ValueError(\"ord must be np.inf, 1, or 2.\")\n\n    if ord == np.inf:\n        r = tf.random_uniform(shape, -eps, eps, dtype=dtype, seed=seed)\n    else:\n\n        # For ord=1 and ord=2, we use the generic technique from\n        # (Calafiore et al. 1998) to sample uniformly from a norm ball.\n        # Paper link (Calafiore et al. 1998):\n        # https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=758215&tag=1\n        # We first sample from the surface of the norm ball, and then scale by\n        # a factor `w^(1/d)` where `w~U[0,1]` is a standard uniform random variable\n        # and `d` is the dimension of the ball. In high dimensions, this is roughly\n        # equivalent to sampling from the surface of the ball.\n\n        dim = tf.reduce_prod(shape[1:])\n\n        if ord == 1:\n            x = random_laplace(\n                (shape[0], dim), loc=1.0, scale=1.0, dtype=dtype, seed=seed\n            )\n            norm = tf.reduce_sum(tf.abs(x), axis=-1, keepdims=True)\n        elif ord == 2:\n            x = tf.random_normal((shape[0], dim), dtype=dtype, seed=seed)\n            norm = tf.sqrt(tf.reduce_sum(tf.square(x), axis=-1, keepdims=True))\n        else:\n            raise ValueError(\"ord must be np.inf, 1, or 2.\")\n\n        w = tf.pow(\n            tf.random.uniform((shape[0], 1), dtype=dtype, seed=seed),\n            1.0 / tf.cast(dim, dtype),\n        )\n        r = eps * tf.reshape(w * x / norm, shape)\n\n    return r\n\n\ndef model_train(\n    sess,\n    x,\n    y,\n    predictions,\n    X_train,\n    Y_train,\n    save=False,\n    predictions_adv=None,\n    init_all=True,\n    evaluate=None,\n    feed=None,\n    args=None,\n    rng=None,\n    var_list=None,\n):\n    \"\"\"\n    Train a TF graph\n    :param sess: TF session to use when training the graph\n    :param x: input placeholder\n    :param y: output placeholder (for labels)\n    :param predictions: model output predictions\n    :param X_train: numpy array with training inputs\n    :param Y_train: numpy array with training outputs\n    :param save: boolean controlling the save operation\n    :param predictions_adv: if set with the adversarial example tensor,\n                            will run adversarial training\n    :param init_all: (boolean) If set to true, all TF variables in the session\n                     are (re)initialized, otherwise only previously\n                     uninitialized variables are initialized before training.\n    :param evaluate: function that is run after each training iteration\n                     (typically to display the test/validation accuracy).\n    :param feed: An optional dictionary that is appended to the feeding\n                 dictionary before the session runs. Can be used to feed\n                 the learning phase of a Keras model for instance.\n    :param args: dict or argparse `Namespace` object.\n                 Should contain `nb_epochs`, `learning_rate`,\n                 `batch_size`\n                 If save is True, should also contain 'train_dir'\n                 and 'filename'\n    :param rng: Instance of numpy.random.RandomState\n    :param var_list: Optional list of parameters to train.\n    :return: True if model trained\n    \"\"\"\n    warnings.warn(\n        \"This function is deprecated and will be removed on or after\"\n        \" 2019-04-05. Switch to cleverhans.train.train.\"\n    )\n    args = _ArgsWrapper(args or {})\n\n    # Check that necessary arguments were given (see doc above)\n    assert args.nb_epochs, \"Number of epochs was not given in args dict\"\n    assert args.learning_rate, \"Learning rate was not given in args dict\"\n    assert args.batch_size, \"Batch size was not given in args dict\"\n\n    if save:\n        assert args.train_dir, \"Directory for save was not given in args dict\"\n        assert args.filename, \"Filename for save was not given in args dict\"\n\n    if rng is None:\n        rng = np.random.RandomState()\n\n    # Define loss\n    loss = model_loss(y, predictions)\n    if predictions_adv is not None:\n        loss = (loss + model_loss(y, predictions_adv)) / 2\n\n    train_step = tf.train.AdamOptimizer(learning_rate=args.learning_rate)\n    train_step = train_step.minimize(loss, var_list=var_list)\n\n    with sess.as_default():\n        if hasattr(tf, \"global_variables_initializer\"):\n            if init_all:\n                tf.global_variables_initializer().run()\n            else:\n                initialize_uninitialized_global_variables(sess)\n        else:\n            warnings.warn(\n                \"Update your copy of tensorflow; future versions of \"\n                \"CleverHans may drop support for this version.\"\n            )\n            sess.run(tf.initialize_all_variables())\n\n        for epoch in xrange(args.nb_epochs):\n            # Compute number of batches\n            nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size))\n            assert nb_batches * args.batch_size >= len(X_train)\n\n            # Indices to shuffle training set\n            index_shuf = list(range(len(X_train)))\n            rng.shuffle(index_shuf)\n\n            prev = time.time()\n            for batch in range(nb_batches):\n\n                # Compute batch start and end indices\n                start, end = batch_indices(batch, len(X_train), args.batch_size)\n\n                # Perform one training step\n                feed_dict = {\n                    x: X_train[index_shuf[start:end]],\n                    y: Y_train[index_shuf[start:end]],\n                }\n                if feed is not None:\n                    feed_dict.update(feed)\n                train_step.run(feed_dict=feed_dict)\n            assert end >= len(X_train)  # Check that all examples were used\n            cur = time.time()\n            _logger.info(\n                \"Epoch \" + str(epoch) + \" took \" + str(cur - prev) + \" seconds\"\n            )\n            if evaluate is not None:\n                evaluate()\n\n        if save:\n            save_path = os.path.join(args.train_dir, args.filename)\n            saver = tf.train.Saver()\n            saver.save(sess, save_path)\n            _logger.info(\"Completed model training and saved at: \" + str(save_path))\n        else:\n            _logger.info(\"Completed model training.\")\n\n    return True\n\n\ndef infer_devices(devices=None):\n    \"\"\"\n    Returns the list of devices that multi-replica code should use.\n    :param devices: list of string device names, e.g. [\"/GPU:0\"]\n        If the user specifies this, `infer_devices` checks that it is\n        valid, and then uses this user-specified list.\n        If the user does not specify this, infer_devices uses:\n            - All available GPUs, if there are any\n            - CPU otherwise\n    \"\"\"\n    if devices is None:\n        devices = get_available_gpus()\n        if len(devices) == 0:\n            warnings.warn(\"No GPUS, running on CPU\")\n            # Set device to empy string, tf will figure out whether to use\n            # XLA or not, etc., automatically\n            devices = [\"\"]\n    else:\n        assert len(devices) > 0\n        for device in devices:\n            assert isinstance(device, six.string_types), type(device)\n    return devices\n\n\ndef get_available_gpus():\n    \"\"\"\n    Returns a list of string names of all available GPUs\n    \"\"\"\n    local_device_protos = device_lib.list_local_devices()\n    return [x.name for x in local_device_protos if x.device_type == \"GPU\"]\n\n\ndef silence():\n    \"\"\"\n    Silences tensorflaw's default printed messages\n    \"\"\"\n    os.environ[\"TF_CPP_MIN_LOG_LEVEL\"] = \"3\"\n\n\ndef clip_by_value(t, clip_value_min, clip_value_max, name=None):\n    \"\"\"\n    A wrapper for clip_by_value that casts the clipping range if needed.\n    \"\"\"\n\n    def cast_clip(clip):\n        \"\"\"\n        Cast clipping range argument if needed.\n        \"\"\"\n        if t.dtype in (tf.float32, tf.float64):\n            if hasattr(clip, \"dtype\"):\n                # Convert to tf dtype in case this is a numpy dtype\n                clip_dtype = tf.as_dtype(clip.dtype)\n                if clip_dtype != t.dtype:\n                    return tf.cast(clip, t.dtype)\n        return clip\n\n    clip_value_min = cast_clip(clip_value_min)\n    clip_value_max = cast_clip(clip_value_max)\n\n    return tf.clip_by_value(t, clip_value_min, clip_value_max, name)\n\n\ndef mul(a, b):\n    \"\"\"\n    A wrapper around tf multiplication that does more automatic casting of\n    the input.\n    \"\"\"\n\n    def multiply(a, b):\n        \"\"\"Multiplication\"\"\"\n        return a * b\n\n    return op_with_scalar_cast(a, b, multiply)\n\n\ndef div(a, b):\n    \"\"\"\n    A wrapper around tf division that does more automatic casting of\n    the input.\n    \"\"\"\n\n    def divide(a, b):\n        \"\"\"Division\"\"\"\n        return a / b\n\n    return op_with_scalar_cast(a, b, divide)\n\n\ndef op_with_scalar_cast(a, b, f):\n    \"\"\"\n    Builds the graph to compute f(a, b).\n    If only one of the two arguments is a scalar and the operation would\n    cause a type error without casting, casts the scalar to match the\n    tensor.\n    :param a: a tf-compatible array or scalar\n    :param b: a tf-compatible array or scalar\n    \"\"\"\n\n    try:\n        return f(a, b)\n    except (TypeError, ValueError):\n        pass\n\n    def is_scalar(x):\n        \"\"\"Return True if `x` is a scalar\"\"\"\n        if hasattr(x, \"get_shape\"):\n            shape = x.get_shape()\n            return shape.ndims == 0\n        if hasattr(x, \"ndim\"):\n            return x.ndim == 0\n        assert isinstance(x, (int, float))\n        return True\n\n    a_scalar = is_scalar(a)\n    b_scalar = is_scalar(b)\n\n    if a_scalar and b_scalar:\n        raise TypeError(\"Trying to apply \" + str(f) + \" with mixed types\")\n\n    if a_scalar and not b_scalar:\n        a = tf.cast(a, b.dtype)\n\n    if b_scalar and not a_scalar:\n        b = tf.cast(b, a.dtype)\n\n    return f(a, b)\n\n\ndef assert_less_equal(*args, **kwargs):\n    \"\"\"\n    Wrapper for tf.assert_less_equal\n    Overrides tf.device so that the assert always goes on CPU.\n    The unwrapped version raises an exception if used with tf.device(\"/GPU:x\").\n    \"\"\"\n    with tf.device(\"/CPU:0\"):\n        return tf.assert_less_equal(*args, **kwargs)\n\n\ndef assert_greater_equal(*args, **kwargs):\n    \"\"\"\n    Wrapper for tf.assert_greater_equal.\n    Overrides tf.device so that the assert always goes on CPU.\n    The unwrapped version raises an exception if used with tf.device(\"/GPU:x\").\n    \"\"\"\n    with tf.device(\"/CPU:0\"):\n        return tf.assert_greater_equal(*args, **kwargs)\n\n\ndef assert_equal(*args, **kwargs):\n    \"\"\"\n    Wrapper for tf.assert_equal.\n    Overrides tf.device so that the assert always goes on CPU.\n    The unwrapped version raises an exception if used with tf.device(\"/GPU:x\").\n    \"\"\"\n    with tf.device(\"/CPU:0\"):\n        return tf.assert_equal(*args, **kwargs)\n\n\ndef jacobian_graph(predictions, x, nb_classes):\n    \"\"\"\n    Create the Jacobian graph to be ran later in a TF session\n    :param predictions: the model's symbolic output (linear output,\n        pre-softmax)\n    :param x: the input placeholder\n    :param nb_classes: the number of classes the model has\n    :return:\n    \"\"\"\n\n    # This function will return a list of TF gradients\n    list_derivatives = []\n\n    # Define the TF graph elements to compute our derivatives for each class\n    for class_ind in xrange(nb_classes):\n        (derivatives,) = tf.gradients(predictions[:, class_ind], x)\n        list_derivatives.append(derivatives)\n\n    return list_derivatives\n\n\ndef jacobian_augmentation(\n    sess, x, X_sub_prev, Y_sub, grads, lmbda, aug_batch_size=512, feed=None\n):\n    \"\"\"\n    Augment an adversary's substitute training set using the Jacobian\n    of a substitute model to generate new synthetic inputs.\n    See https://arxiv.org/abs/1602.02697 for more details.\n    See cleverhans_tutorials/mnist_blackbox.py for example use case\n    :param sess: TF session in which the substitute model is defined\n    :param x: input TF placeholder for the substitute model\n    :param X_sub_prev: substitute training data available to the adversary\n                       at the previous iteration\n    :param Y_sub: substitute training labels available to the adversary\n                  at the previous iteration\n    :param grads: Jacobian symbolic graph for the substitute\n                  (should be generated using utils_tf.jacobian_graph)\n    :return: augmented substitute data (will need to be labeled by oracle)\n    \"\"\"\n    assert len(x.get_shape()) == len(np.shape(X_sub_prev))\n    assert len(grads) >= np.max(Y_sub) + 1\n    assert len(X_sub_prev) == len(Y_sub)\n\n    aug_batch_size = min(aug_batch_size, X_sub_prev.shape[0])\n\n    # Prepare input_shape (outside loop) for feeding dictionary below\n    input_shape = list(x.get_shape())\n    input_shape[0] = 1\n\n    # Create new numpy array for adversary training data\n    # with twice as many components on the first dimension.\n    X_sub = np.vstack([X_sub_prev, X_sub_prev])\n    num_samples = X_sub_prev.shape[0]\n\n    # Creating and processing as batch\n    for p_idxs in range(0, num_samples, aug_batch_size):\n        X_batch = X_sub_prev[p_idxs : p_idxs + aug_batch_size, ...]\n        feed_dict = {x: X_batch}\n        if feed is not None:\n            feed_dict.update(feed)\n\n        # Compute sign matrix\n        grad_val = sess.run([tf.sign(grads)], feed_dict=feed_dict)[0]\n\n        # Create new synthetic point in adversary substitute training set\n        for (indx, ind) in zip(\n            range(p_idxs, p_idxs + X_batch.shape[0]), range(X_batch.shape[0])\n        ):\n            X_sub[num_samples + indx] = (\n                X_batch[ind] + lmbda * grad_val[Y_sub[indx], ind, ...]\n            )\n\n    # Return augmented training data (needs to be labeled afterwards)\n    return X_sub\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans/utils_tfe.py",
    "content": "\"\"\"\nUtility functions for writing tf eager code\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport math\nimport os\nimport time\n\nimport numpy as np\nimport tensorflow as tf\nfrom six.moves import xrange\n\nfrom cleverhans.loss import LossCrossEntropy\nfrom cleverhans.model import Model\nfrom .utils import batch_indices, _ArgsWrapper, create_logger\n\n_logger = create_logger(\"cleverhans.utils.tfe\")\n\n\ndef train(\n    model,\n    X_train=None,\n    Y_train=None,\n    save=False,\n    predictions_adv=None,\n    evaluate=None,\n    args=None,\n    rng=None,\n    var_list=None,\n    attack=None,\n    attack_args=None,\n):\n    \"\"\"\n    Train a TF Eager model\n    :param model: cleverhans.model.Model\n    :param X_train: numpy array with training inputs\n    :param Y_train: numpy array with training outputs\n    :param save: boolean controlling the save operation\n    :param predictions_adv: if set with the adversarial example tensor,\n                            will run adversarial training\n    :param evaluate: function that is run after each training iteration\n                     (typically to display the test/validation accuracy).\n    :param args: dict or argparse `Namespace` object.\n                 Should contain `nb_epochs`, `learning_rate`,\n                 `batch_size`\n                 If save is True, should also contain 'train_dir'\n                 and 'filename'\n    :param rng: Instance of numpy.random.RandomState\n    :param var_list: List of variables to train.\n    :param attack: Instance of the class cleverhans.attacks.attacks_eager\n    :param attack_args: Parameters required for the attack.\n    :return: True if model trained\n    \"\"\"\n    assert isinstance(model, Model)\n    args = _ArgsWrapper(args or {})\n    if (attack is None) != (attack_args is None):\n        raise ValueError(\"attack and attack_args must be \" \"passed together.\")\n    if X_train is None or Y_train is None:\n        raise ValueError(\"X_train argument and Y_train argument \" \"must be supplied.\")\n    # Check that necessary arguments were given (see doc above)\n    assert args.nb_epochs, \"Number of epochs was not given in args dict\"\n    assert args.learning_rate, \"Learning rate was not given in args dict\"\n    assert args.batch_size, \"Batch size was not given in args dict\"\n\n    if save:\n        assert args.train_dir, \"Directory for save was not given in args dict\"\n        assert args.filename, \"Filename for save was not given in args dict\"\n\n    if rng is None:\n        rng = np.random.RandomState()\n\n    # Optimizer\n    tfe = tf.contrib.eager\n    optimizer = tf.train.AdamOptimizer(learning_rate=args.learning_rate)\n    batch_x = tfe.Variable(X_train[0 : args.batch_size], dtype=tf.float32)\n    batch_y = tfe.Variable(Y_train[0 : args.batch_size], dtype=tf.float32)\n\n    # One epoch of training.\n    for epoch in xrange(args.nb_epochs):\n        # Compute number of batches\n        nb_batches = int(math.ceil(float(len(X_train)) / args.batch_size))\n        assert nb_batches * args.batch_size >= len(X_train)\n\n        # Indices to shuffle training set\n        index_shuf = list(range(len(X_train)))\n        rng.shuffle(index_shuf)\n\n        prev = time.time()\n        for batch in range(nb_batches):\n\n            # Compute batch start and end indices\n            start, end = batch_indices(batch, len(X_train), args.batch_size)\n\n            # Perform one training step\n            tf.assign(batch_x, X_train[index_shuf[start:end]])\n            tf.assign(batch_y, Y_train[index_shuf[start:end]])\n            # Compute grads\n            with tf.GradientTape() as tape:\n                # Define loss\n                loss_clean_obj = LossCrossEntropy(model, smoothing=0.0)\n                loss_clean = loss_clean_obj.fprop(x=batch_x, y=batch_y)\n                loss = loss_clean\n                # Adversarial training\n                if attack is not None:\n                    batch_adv_x = attack.generate(batch_x, **attack_args)\n                    loss_adv_obj = LossCrossEntropy(model, smoothing=0.0)\n                    loss_adv = loss_adv_obj.fprop(x=batch_adv_x, y=batch_y)\n                    loss = (loss_clean + loss_adv) / 2.0\n            # Apply grads\n            model_variables = model.get_params()\n            grads = tape.gradient(loss, model_variables)\n            optimizer.apply_gradients(zip(grads, model_variables))\n\n        assert end >= len(X_train)  # Check that all examples were used\n        cur = time.time()\n        _logger.info(\"Epoch \" + str(epoch) + \" took \" + str(cur - prev) + \" seconds\")\n        if evaluate is not None:\n            evaluate()\n\n    if save:\n        save_path = os.path.join(args.train_dir, args.filename)\n        saver = tf.train.Saver()\n        saver.save(save_path, model_variables)\n        _logger.info(\"Completed model training and saved at: \" + str(save_path))\n    else:\n        _logger.info(\"Completed model training.\")\n\n    return True\n\n\ndef model_eval(\n    model, X_test=None, Y_test=None, args=None, attack=None, attack_args=None\n):\n    \"\"\"\n    Compute the accuracy of a TF Eager model on some data\n    :param model: instance of cleverhans.model.Model_Eager\n                    with pretrained weights for evaluation.\n    :param X_test: numpy array with training inputs\n    :param Y_test: numpy array with training outputs\n    :param args: dict or argparse `Namespace` object.\n                 Should contain `batch_size`\n    :param attack: instance of the class cleverhans.attacks.attacks_eager\n    :param attack_args: parameters required for the attack.\n    :return: a float with the accuracy value\n    \"\"\"\n    args = _ArgsWrapper(args or {})\n\n    if (attack is None) != (attack_args is None):\n        raise ValueError(\"attack and attack_args must be \" \"passed together.\")\n    assert args.batch_size, \"Batch size was not given in args dict\"\n    if X_test is None or Y_test is None:\n        raise ValueError(\"X_test argument and Y_test argument \" \"must be supplied.\")\n\n    # Init result var\n    accuracy = 0.0\n\n    # Compute number of batches\n    nb_batches = int(math.ceil(float(len(X_test)) / args.batch_size))\n    assert nb_batches * args.batch_size >= len(X_test)\n\n    X_cur = np.zeros((args.batch_size,) + X_test.shape[1:], dtype=X_test.dtype)\n    Y_cur = np.zeros((args.batch_size,) + Y_test.shape[1:], dtype=Y_test.dtype)\n\n    tfe = tf.contrib.eager\n    batch_x = tfe.Variable(X_test[0 : args.batch_size], dtype=tf.float32)\n    batch_y = tfe.Variable(Y_test[0 : args.batch_size], dtype=tf.float32)\n    for batch in range(nb_batches):\n        if batch % 100 == 0 and batch > 0:\n            _logger.debug(\"Batch \" + str(batch))\n\n        # Must not use the `batch_indices` function here, because it\n        # repeats some examples.\n        # It's acceptable to repeat during training, but not eval.\n        start = batch * args.batch_size\n        end = min(len(X_test), start + args.batch_size)\n\n        # The last batch may be smaller than all others. This should not\n        # affect the accuarcy disproportionately.\n        cur_batch_size = end - start\n        X_cur[:cur_batch_size] = X_test[start:end]\n        Y_cur[:cur_batch_size] = Y_test[start:end]\n        tf.assign(batch_x, X_cur)\n        tf.assign(batch_y, Y_cur)\n        if attack is not None:\n            batch_adv_x = attack.generate(batch_x, **attack_args)\n            predictions = model.get_probs(batch_adv_x)\n        else:\n            predictions = model.get_probs(batch_x)\n        cur_corr_preds = tf.equal(\n            tf.argmax(batch_y, axis=-1), tf.argmax(predictions, axis=-1)\n        )\n\n        accuracy += cur_corr_preds.numpy()[:cur_batch_size].sum()\n\n    assert end >= len(X_test)\n\n    # Divide by number of examples to get final value\n    accuracy /= len(X_test)\n\n    return accuracy\n\n\ndef model_argmax(model, samples):\n    \"\"\"\n    Helper function that computes the current class prediction\n    :param samples: numpy array with input samples (dims must match x)\n    :return: the argmax output of predictions, i.e. the current predicted class\n    \"\"\"\n    tfe = tf.contrib.eager\n    tf_samples = tfe.Variable(samples)\n    probabilities = model.get_probs(tf_samples)\n\n    if samples.shape[0] == 1:\n        return tf.argmax(probabilities)\n    else:\n        return tf.argmax(probabilities, axis=1)\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/__init__.py",
    "content": "\"\"\"\nThe CleverHans tutorials.\nWhile mostly designed to be run as standalone scripts, the tutorials together also form an importable module.\nModule importation is mostly intended to support writing unit tests of the tutorials themselves, etc.\nThe tutorial code is not part of our API contract and can change rapidly without warning.\n\"\"\"\nimport os\nimport warnings\n\nimport cleverhans\n\n\ndef check_installation(cur_file):\n    \"\"\"Warn user if running cleverhans from a different directory than tutorial.\"\"\"\n    cur_dir = os.path.split(os.path.dirname(os.path.abspath(cur_file)))[0]\n    ch_dir = os.path.split(cleverhans.__path__[0])[0]\n    if cur_dir != ch_dir:\n        warnings.warn(\n            \"It appears that you have at least two versions of \"\n            \"cleverhans installed, one at %s and one at\"\n            \" %s. You are running the tutorial script from the \"\n            \"former but python imported the library module from the \"\n            \"latter. This may cause errors, for example if the tutorial\"\n            \" version is newer than the library version and attempts to\"\n            \" call new features.\" % (cur_dir, ch_dir)\n        )\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/cifar10_tutorial_tf.py",
    "content": "\"\"\"\nThis tutorial shows how to generate adversarial examples using FGSM\nand train a model using adversarial training with TensorFlow.\nThe original paper can be found at:\nhttps://arxiv.org/abs/1412.6572\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.augmentation import random_horizontal_flip, random_shift\nfrom cleverhans.compat import flags\nfrom cleverhans.dataset import CIFAR10\nfrom cleverhans.loss import CrossEntropy\nfrom cleverhans.model_zoo.all_convolutional import ModelAllConvolutional\nfrom cleverhans.train import train\nfrom cleverhans.utils import AccuracyReport, set_log_level\nfrom cleverhans.utils_tf import model_eval\n\nFLAGS = flags.FLAGS\n\nNB_EPOCHS = 6\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\nCLEAN_TRAIN = True\nBACKPROP_THROUGH_ATTACK = False\nNB_FILTERS = 64\n\n\ndef cifar10_tutorial(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    learning_rate=LEARNING_RATE,\n    clean_train=CLEAN_TRAIN,\n    testing=False,\n    backprop_through_attack=BACKPROP_THROUGH_ATTACK,\n    nb_filters=NB_FILTERS,\n    num_threads=None,\n    label_smoothing=0.1,\n):\n    \"\"\"\n    CIFAR10 cleverhans tutorial\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param learning_rate: learning rate for training\n    :param clean_train: perform normal training on clean examples only\n                        before performing adversarial training.\n    :param testing: if true, complete an AccuracyReport for unit tests\n                    to verify that performance is adequate\n    :param backprop_through_attack: If True, backprop through adversarial\n                                    example construction process during\n                                    adversarial training.\n    :param label_smoothing: float, amount of label smoothing for cross entropy\n    :return: an AccuracyReport object\n    \"\"\"\n\n    # Object used to keep track of (and return) key accuracies\n    report = AccuracyReport()\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Set logging level to see debug information\n    set_log_level(logging.DEBUG)\n\n    # Create TF session\n    if num_threads:\n        config_args = dict(intra_op_parallelism_threads=1)\n    else:\n        config_args = {}\n    sess = tf.Session(config=tf.ConfigProto(**config_args))\n\n    # Get CIFAR10 data\n    data = CIFAR10(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    dataset_size = data.x_train.shape[0]\n    dataset_train = data.to_tensorflow()[0]\n    dataset_train = dataset_train.map(\n        lambda x, y: (random_shift(random_horizontal_flip(x)), y), 4\n    )\n    dataset_train = dataset_train.batch(batch_size)\n    dataset_train = dataset_train.prefetch(16)\n    x_train, y_train = data.get_set(\"train\")\n    x_test, y_test = data.get_set(\"test\")\n\n    # Use Image Parameters\n    img_rows, img_cols, nchannels = x_test.shape[1:4]\n    nb_classes = y_test.shape[1]\n\n    # Define input TF placeholder\n    x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n    y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n\n    # Train an MNIST model\n    train_params = {\n        \"nb_epochs\": nb_epochs,\n        \"batch_size\": batch_size,\n        \"learning_rate\": learning_rate,\n    }\n    eval_params = {\"batch_size\": batch_size}\n    fgsm_params = {\"eps\": 0.3, \"clip_min\": 0.0, \"clip_max\": 1.0}\n    rng = np.random.RandomState([2017, 8, 30])\n\n    def do_eval(preds, x_set, y_set, report_key, is_adv=None):\n        acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params)\n        setattr(report, report_key, acc)\n        if is_adv is None:\n            report_text = None\n        elif is_adv:\n            report_text = \"adversarial\"\n        else:\n            report_text = \"legitimate\"\n        if report_text:\n            print(\"Test accuracy on %s examples: %0.4f\" % (report_text, acc))\n\n    if clean_train:\n        model = ModelAllConvolutional(\n            \"model1\", nb_classes, nb_filters, input_shape=[32, 32, 3]\n        )\n        preds = model.get_logits(x)\n        loss = CrossEntropy(model, smoothing=label_smoothing)\n\n        def evaluate():\n            do_eval(preds, x_test, y_test, \"clean_train_clean_eval\", False)\n\n        train(\n            sess,\n            loss,\n            None,\n            None,\n            dataset_train=dataset_train,\n            dataset_size=dataset_size,\n            evaluate=evaluate,\n            args=train_params,\n            rng=rng,\n            var_list=model.get_params(),\n        )\n\n        # Calculate training error\n        if testing:\n            do_eval(preds, x_train, y_train, \"train_clean_train_clean_eval\")\n\n        # Initialize the Fast Gradient Sign Method (FGSM) attack object and\n        # graph\n        fgsm = FastGradientMethod(model, sess=sess)\n        adv_x = fgsm.generate(x, **fgsm_params)\n        preds_adv = model.get_logits(adv_x)\n\n        # Evaluate the accuracy of the MNIST model on adversarial examples\n        do_eval(preds_adv, x_test, y_test, \"clean_train_adv_eval\", True)\n\n        # Calculate training error\n        if testing:\n            do_eval(preds_adv, x_train, y_train, \"train_clean_train_adv_eval\")\n\n        print(\"Repeating the process, using adversarial training\")\n\n    # Create a new model and train it to be robust to FastGradientMethod\n    model2 = ModelAllConvolutional(\n        \"model2\", nb_classes, nb_filters, input_shape=[32, 32, 3]\n    )\n    fgsm2 = FastGradientMethod(model2, sess=sess)\n\n    def attack(x):\n        return fgsm2.generate(x, **fgsm_params)\n\n    loss2 = CrossEntropy(model2, smoothing=label_smoothing, attack=attack)\n    preds2 = model2.get_logits(x)\n    adv_x2 = attack(x)\n\n    if not backprop_through_attack:\n        # For the fgsm attack used in this tutorial, the attack has zero\n        # gradient so enabling this flag does not change the gradient.\n        # For some other attacks, enabling this flag increases the cost of\n        # training, but gives the defender the ability to anticipate how\n        # the atacker will change their strategy in response to updates to\n        # the defender's parameters.\n        adv_x2 = tf.stop_gradient(adv_x2)\n    preds2_adv = model2.get_logits(adv_x2)\n\n    def evaluate2():\n        # Accuracy of adversarially trained model on legitimate test inputs\n        do_eval(preds2, x_test, y_test, \"adv_train_clean_eval\", False)\n        # Accuracy of the adversarially trained model on adversarial examples\n        do_eval(preds2_adv, x_test, y_test, \"adv_train_adv_eval\", True)\n\n    # Perform and evaluate adversarial training\n    train(\n        sess,\n        loss2,\n        None,\n        None,\n        dataset_train=dataset_train,\n        dataset_size=dataset_size,\n        evaluate=evaluate2,\n        args=train_params,\n        rng=rng,\n        var_list=model2.get_params(),\n    )\n\n    # Calculate training errors\n    if testing:\n        do_eval(preds2, x_train, y_train, \"train_adv_train_clean_eval\")\n        do_eval(preds2_adv, x_train, y_train, \"train_adv_train_adv_eval\")\n\n    return report\n\n\ndef main(argv=None):\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    cifar10_tutorial(\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        learning_rate=FLAGS.learning_rate,\n        clean_train=FLAGS.clean_train,\n        backprop_through_attack=FLAGS.backprop_through_attack,\n        nb_filters=FLAGS.nb_filters,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_filters\", NB_FILTERS, \"Model size multiplier\")\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n    flags.DEFINE_bool(\"clean_train\", CLEAN_TRAIN, \"Train on clean examples\")\n    flags.DEFINE_bool(\n        \"backprop_through_attack\",\n        BACKPROP_THROUGH_ATTACK,\n        (\n            \"If True, backprop through adversarial example \"\n            \"construction process during adversarial training\"\n        ),\n    )\n\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/evaluate_pickled_model.py",
    "content": "\"\"\"\nThis script evaluates trained models that have been saved to the filesystem.\nSee mnist_tutorial_picklable.py for instructions.\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\n\nimport tensorflow as tf\n\nfrom cleverhans.compat import flags\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.utils import set_log_level\nfrom cleverhans.utils_tf import model_eval, silence\nfrom cleverhans.serial import load\n\nsilence()\n\nFLAGS = flags.FLAGS\n\n\ndef evaluate_model(\n    filepath,\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    batch_size=128,\n    testing=False,\n    num_threads=None,\n):\n    \"\"\"\n    Run evaluation on a saved model\n    :param filepath: path to model to evaluate\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :param batch_size: size of evaluation batches\n    \"\"\"\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Set logging level to see debug information\n    set_log_level(logging.INFO)\n\n    # Create TF session\n    if num_threads:\n        config_args = dict(intra_op_parallelism_threads=1)\n    else:\n        config_args = {}\n    sess = tf.Session(config=tf.ConfigProto(**config_args))\n\n    # Get MNIST test data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Use Image Parameters\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    # Define input TF placeholder\n    x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n    y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n\n    eval_params = {\"batch_size\": batch_size}\n    fgsm_params = {\"eps\": 0.3, \"clip_min\": 0.0, \"clip_max\": 1.0}\n\n    def do_eval(preds, x_set, y_set, report_key, is_adv=None):\n        acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params)\n        if is_adv is None:\n            report_text = None\n        elif is_adv:\n            report_text = \"adversarial\"\n        else:\n            report_text = \"legitimate\"\n        if report_text:\n            print(\"Test accuracy on %s examples: %0.4f\" % (report_text, acc))\n\n    with sess.as_default():\n        model = load(filepath)\n    assert len(model.get_params()) > 0\n\n    # Initialize the Fast Gradient Sign Method (FGSM) attack object and\n    # graph\n    fgsm = FastGradientMethod(model, sess=sess)\n    adv_x = fgsm.generate(x, **fgsm_params)\n    preds_adv = model.get_logits(adv_x)\n    preds = model.get_logits(x)\n\n    # Evaluate the accuracy of the MNIST model on adversarial examples\n    do_eval(preds, x_test, y_test, \"train_clean_train_clean_eval\", False)\n    do_eval(preds_adv, x_test, y_test, \"clean_train_adv_eval\", True)\n\n\ndef main(argv=None):\n    _, filepath = argv\n    evaluate_model(filepath=filepath)\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/mnist_blackbox.py",
    "content": "\"\"\"\nThis tutorial shows how to generate adversarial examples\nusing FGSM in black-box setting.\nThe original paper can be found at:\nhttps://arxiv.org/abs/1602.02697\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport functools\nimport logging\nimport numpy as np\nfrom six.moves import xrange\nimport tensorflow as tf\n\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.utils_tf import jacobian_graph, jacobian_augmentation\nfrom cleverhans.compat import flags\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.initializers import HeReLuNormalInitializer\nfrom cleverhans.loss import CrossEntropy\nfrom cleverhans.model import Model\nfrom cleverhans.train import train\nfrom cleverhans.utils import set_log_level\nfrom cleverhans.utils import TemporaryLogLevel\nfrom cleverhans.utils import to_categorical\nfrom cleverhans.utils_tf import model_eval, batch_eval\n\nfrom cleverhans.model_zoo.basic_cnn import ModelBasicCNN\n\nFLAGS = flags.FLAGS\n\nNB_CLASSES = 10\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\nNB_EPOCHS = 10\nHOLDOUT = 150\nDATA_AUG = 6\nNB_EPOCHS_S = 10\nLMBDA = 0.1\nAUG_BATCH_SIZE = 512\n\n\ndef setup_tutorial():\n    \"\"\"\n    Helper function to check correct configuration of tf for tutorial\n    :return: True if setup checks completed\n    \"\"\"\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    return True\n\n\ndef prep_bbox(\n    sess,\n    x,\n    y,\n    x_train,\n    y_train,\n    x_test,\n    y_test,\n    nb_epochs,\n    batch_size,\n    learning_rate,\n    rng,\n    nb_classes=10,\n    img_rows=28,\n    img_cols=28,\n    nchannels=1,\n):\n    \"\"\"\n    Define and train a model that simulates the \"remote\"\n    black-box oracle described in the original paper.\n    :param sess: the TF session\n    :param x: the input placeholder for MNIST\n    :param y: the ouput placeholder for MNIST\n    :param x_train: the training data for the oracle\n    :param y_train: the training labels for the oracle\n    :param x_test: the testing data for the oracle\n    :param y_test: the testing labels for the oracle\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param learning_rate: learning rate for training\n    :param rng: numpy.random.RandomState\n    :return:\n    \"\"\"\n\n    # Define TF model graph (for the black-box model)\n    nb_filters = 64\n    model = ModelBasicCNN(\"model1\", nb_classes, nb_filters)\n    loss = CrossEntropy(model, smoothing=0.1)\n    predictions = model.get_logits(x)\n    print(\"Defined TensorFlow model graph.\")\n\n    # Train an MNIST model\n    train_params = {\n        \"nb_epochs\": nb_epochs,\n        \"batch_size\": batch_size,\n        \"learning_rate\": learning_rate,\n    }\n    train(sess, loss, x_train, y_train, args=train_params, rng=rng)\n\n    # Print out the accuracy on legitimate data\n    eval_params = {\"batch_size\": batch_size}\n    accuracy = model_eval(sess, x, y, predictions, x_test, y_test, args=eval_params)\n    print(\"Test accuracy of black-box on legitimate test \" \"examples: \" + str(accuracy))\n\n    return model, predictions, accuracy\n\n\nclass ModelSubstitute(Model):\n    def __init__(self, scope, nb_classes, nb_filters=200, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n        self.nb_filters = nb_filters\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        my_dense = functools.partial(\n            tf.layers.dense, kernel_initializer=HeReLuNormalInitializer\n        )\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            y = tf.layers.flatten(x)\n            y = my_dense(y, self.nb_filters, activation=tf.nn.relu)\n            y = my_dense(y, self.nb_filters, activation=tf.nn.relu)\n            logits = my_dense(y, self.nb_classes)\n            return {self.O_LOGITS: logits, self.O_PROBS: tf.nn.softmax(logits=logits)}\n\n\ndef train_sub(\n    sess,\n    x,\n    y,\n    bbox_preds,\n    x_sub,\n    y_sub,\n    nb_classes,\n    nb_epochs_s,\n    batch_size,\n    learning_rate,\n    data_aug,\n    lmbda,\n    aug_batch_size,\n    rng,\n    img_rows=28,\n    img_cols=28,\n    nchannels=1,\n):\n    \"\"\"\n    This function creates the substitute by alternatively\n    augmenting the training data and training the substitute.\n    :param sess: TF session\n    :param x: input TF placeholder\n    :param y: output TF placeholder\n    :param bbox_preds: output of black-box model predictions\n    :param x_sub: initial substitute training data\n    :param y_sub: initial substitute training labels\n    :param nb_classes: number of output classes\n    :param nb_epochs_s: number of epochs to train substitute model\n    :param batch_size: size of training batches\n    :param learning_rate: learning rate for training\n    :param data_aug: number of times substitute training data is augmented\n    :param lmbda: lambda from arxiv.org/abs/1602.02697\n    :param rng: numpy.random.RandomState instance\n    :return:\n    \"\"\"\n    # Define TF model graph (for the black-box model)\n    model_sub = ModelSubstitute(\"model_s\", nb_classes)\n    preds_sub = model_sub.get_logits(x)\n    loss_sub = CrossEntropy(model_sub, smoothing=0)\n\n    print(\"Defined TensorFlow model graph for the substitute.\")\n\n    # Define the Jacobian symbolically using TensorFlow\n    grads = jacobian_graph(preds_sub, x, nb_classes)\n\n    # Train the substitute and augment dataset alternatively\n    for rho in xrange(data_aug):\n        print(\"Substitute training epoch #\" + str(rho))\n        train_params = {\n            \"nb_epochs\": nb_epochs_s,\n            \"batch_size\": batch_size,\n            \"learning_rate\": learning_rate,\n        }\n        with TemporaryLogLevel(logging.WARNING, \"cleverhans.utils.tf\"):\n            train(\n                sess,\n                loss_sub,\n                x_sub,\n                to_categorical(y_sub, nb_classes),\n                init_all=False,\n                args=train_params,\n                rng=rng,\n                var_list=model_sub.get_params(),\n            )\n\n        # If we are not at last substitute training iteration, augment dataset\n        if rho < data_aug - 1:\n            print(\"Augmenting substitute training data.\")\n            # Perform the Jacobian augmentation\n            lmbda_coef = 2 * int(int(rho / 3) % 2 == 0) - 1\n            x_sub = jacobian_augmentation(\n                sess, x, x_sub, y_sub, grads, lmbda_coef * lmbda, aug_batch_size\n            )\n\n            print(\"Labeling substitute training data.\")\n            # Label the newly generated synthetic points using the black-box\n            y_sub = np.hstack([y_sub, y_sub])\n            x_sub_prev = x_sub[int(len(x_sub) / 2) :]\n            eval_params = {\"batch_size\": batch_size}\n            bbox_val = batch_eval(\n                sess, [x], [bbox_preds], [x_sub_prev], args=eval_params\n            )[0]\n            # Note here that we take the argmax because the adversary\n            # only has access to the label (not the probabilities) output\n            # by the black-box model\n            y_sub[int(len(x_sub) / 2) :] = np.argmax(bbox_val, axis=1)\n\n    return model_sub, preds_sub\n\n\ndef mnist_blackbox(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    nb_classes=NB_CLASSES,\n    batch_size=BATCH_SIZE,\n    learning_rate=LEARNING_RATE,\n    nb_epochs=NB_EPOCHS,\n    holdout=HOLDOUT,\n    data_aug=DATA_AUG,\n    nb_epochs_s=NB_EPOCHS_S,\n    lmbda=LMBDA,\n    aug_batch_size=AUG_BATCH_SIZE,\n):\n    \"\"\"\n    MNIST tutorial for the black-box attack from arxiv.org/abs/1602.02697\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :return: a dictionary with:\n             * black-box model accuracy on test set\n             * substitute model accuracy on test set\n             * black-box model accuracy on adversarial examples transferred\n               from the substitute model\n    \"\"\"\n\n    # Set logging level to see debug information\n    set_log_level(logging.DEBUG)\n\n    # Dictionary used to keep track and return key accuracies\n    accuracies = {}\n\n    # Perform tutorial setup\n    assert setup_tutorial()\n\n    # Create TF session\n    sess = tf.Session()\n\n    # Get MNIST data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Initialize substitute training set reserved for adversary\n    x_sub = x_test[:holdout]\n    y_sub = np.argmax(y_test[:holdout], axis=1)\n\n    # Redefine test set as remaining samples unavailable to adversaries\n    x_test = x_test[holdout:]\n    y_test = y_test[holdout:]\n\n    # Obtain Image parameters\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    # Define input TF placeholder\n    x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n    y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n\n    # Seed random number generator so tutorial is reproducible\n    rng = np.random.RandomState([2017, 8, 30])\n\n    # Simulate the black-box model locally\n    # You could replace this by a remote labeling API for instance\n    print(\"Preparing the black-box model.\")\n    prep_bbox_out = prep_bbox(\n        sess,\n        x,\n        y,\n        x_train,\n        y_train,\n        x_test,\n        y_test,\n        nb_epochs,\n        batch_size,\n        learning_rate,\n        rng,\n        nb_classes,\n        img_rows,\n        img_cols,\n        nchannels,\n    )\n    model, bbox_preds, accuracies[\"bbox\"] = prep_bbox_out\n\n    # Train substitute using method from https://arxiv.org/abs/1602.02697\n    print(\"Training the substitute model.\")\n    train_sub_out = train_sub(\n        sess,\n        x,\n        y,\n        bbox_preds,\n        x_sub,\n        y_sub,\n        nb_classes,\n        nb_epochs_s,\n        batch_size,\n        learning_rate,\n        data_aug,\n        lmbda,\n        aug_batch_size,\n        rng,\n        img_rows,\n        img_cols,\n        nchannels,\n    )\n    model_sub, preds_sub = train_sub_out\n\n    # Evaluate the substitute model on clean test examples\n    eval_params = {\"batch_size\": batch_size}\n    acc = model_eval(sess, x, y, preds_sub, x_test, y_test, args=eval_params)\n    accuracies[\"sub\"] = acc\n\n    # Initialize the Fast Gradient Sign Method (FGSM) attack object.\n    fgsm_par = {\"eps\": 0.3, \"ord\": np.inf, \"clip_min\": 0.0, \"clip_max\": 1.0}\n    fgsm = FastGradientMethod(model_sub, sess=sess)\n\n    # Craft adversarial examples using the substitute\n    eval_params = {\"batch_size\": batch_size}\n    x_adv_sub = fgsm.generate(x, **fgsm_par)\n\n    # Evaluate the accuracy of the \"black-box\" model on adversarial examples\n    accuracy = model_eval(\n        sess, x, y, model.get_logits(x_adv_sub), x_test, y_test, args=eval_params\n    )\n    print(\n        \"Test accuracy of oracle on adversarial examples generated \"\n        \"using the substitute: \" + str(accuracy)\n    )\n    accuracies[\"bbox_on_sub_adv_ex\"] = accuracy\n\n    return accuracies\n\n\ndef main(argv=None):\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    mnist_blackbox(\n        nb_classes=FLAGS.nb_classes,\n        batch_size=FLAGS.batch_size,\n        learning_rate=FLAGS.learning_rate,\n        nb_epochs=FLAGS.nb_epochs,\n        holdout=FLAGS.holdout,\n        data_aug=FLAGS.data_aug,\n        nb_epochs_s=FLAGS.nb_epochs_s,\n        lmbda=FLAGS.lmbda,\n        aug_batch_size=FLAGS.data_aug_batch_size,\n    )\n\n\nif __name__ == \"__main__\":\n\n    # General flags\n    flags.DEFINE_integer(\"nb_classes\", NB_CLASSES, \"Number of classes in problem\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n\n    # Flags related to oracle\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n\n    # Flags related to substitute\n    flags.DEFINE_integer(\"holdout\", HOLDOUT, \"Test set holdout for adversary\")\n    flags.DEFINE_integer(\n        \"data_aug\", DATA_AUG, \"Number of substitute data augmentations\"\n    )\n    flags.DEFINE_integer(\"nb_epochs_s\", NB_EPOCHS_S, \"Training epochs for substitute\")\n    flags.DEFINE_float(\"lmbda\", LMBDA, \"Lambda from arxiv.org/abs/1602.02697\")\n    flags.DEFINE_integer(\n        \"data_aug_batch_size\", AUG_BATCH_SIZE, \"Batch size for augmentation\"\n    )\n\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_cw.py",
    "content": "\"\"\"\nThis tutorial shows how to generate adversarial examples\nusing C&W attack in white-box setting.\nThe original paper can be found at:\nhttps://nicholas.carlini.com/papers/2017_sp_nnrobustattacks.pdf\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport os\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks import CarliniWagnerL2\nfrom cleverhans.compat import flags\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.loss import CrossEntropy\nfrom cleverhans.utils import grid_visual, AccuracyReport\nfrom cleverhans.utils import set_log_level\nfrom cleverhans.utils_tf import model_eval, tf_model_load\nfrom cleverhans.train import train\nfrom cleverhans.model_zoo.basic_cnn import ModelBasicCNN\n\nFLAGS = flags.FLAGS\n\nVIZ_ENABLED = True\nBATCH_SIZE = 128\nNB_EPOCHS = 6\nSOURCE_SAMPLES = 10\nLEARNING_RATE = 0.001\nCW_LEARNING_RATE = 0.2\nATTACK_ITERATIONS = 100\nMODEL_PATH = os.path.join(\"models\", \"mnist\")\nTARGETED = True\n\n\ndef mnist_tutorial_cw(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    viz_enabled=VIZ_ENABLED,\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    source_samples=SOURCE_SAMPLES,\n    learning_rate=LEARNING_RATE,\n    attack_iterations=ATTACK_ITERATIONS,\n    model_path=MODEL_PATH,\n    targeted=TARGETED,\n):\n    \"\"\"\n    MNIST tutorial for Carlini and Wagner's attack\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :param viz_enabled: (boolean) activate plots of adversarial examples\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param nb_classes: number of output classes\n    :param source_samples: number of test inputs to attack\n    :param learning_rate: learning rate for training\n    :param model_path: path to the model file\n    :param targeted: should we run a targeted attack? or untargeted?\n    :return: an AccuracyReport object\n    \"\"\"\n    # Object used to keep track of (and return) key accuracies\n    report = AccuracyReport()\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Create TF session\n    sess = tf.Session()\n    print(\"Created TensorFlow session.\")\n\n    set_log_level(logging.DEBUG)\n\n    # Get MNIST test data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Obtain Image Parameters\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    # Define input TF placeholder\n    x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n    y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n    nb_filters = 64\n\n    # Define TF model graph\n    model = ModelBasicCNN(\"model1\", nb_classes, nb_filters)\n    preds = model.get_logits(x)\n    loss = CrossEntropy(model, smoothing=0.1)\n    print(\"Defined TensorFlow model graph.\")\n\n    ###########################################################################\n    # Training the model using TensorFlow\n    ###########################################################################\n\n    # Train an MNIST model\n    train_params = {\n        \"nb_epochs\": nb_epochs,\n        \"batch_size\": batch_size,\n        \"learning_rate\": learning_rate,\n        \"filename\": os.path.split(model_path)[-1],\n    }\n\n    rng = np.random.RandomState([2017, 8, 30])\n    # check if we've trained before, and if we have, use that pre-trained model\n    if os.path.exists(model_path + \".meta\"):\n        tf_model_load(sess, model_path)\n    else:\n        train(sess, loss, x_train, y_train, args=train_params, rng=rng)\n        saver = tf.train.Saver()\n        saver.save(sess, model_path)\n\n    # Evaluate the accuracy of the MNIST model on legitimate test examples\n    eval_params = {\"batch_size\": batch_size}\n    accuracy = model_eval(sess, x, y, preds, x_test, y_test, args=eval_params)\n    assert x_test.shape[0] == test_end - test_start, x_test.shape\n    print(\"Test accuracy on legitimate test examples: {0}\".format(accuracy))\n    report.clean_train_clean_eval = accuracy\n\n    ###########################################################################\n    # Craft adversarial examples using Carlini and Wagner's approach\n    ###########################################################################\n    nb_adv_per_sample = str(nb_classes - 1) if targeted else \"1\"\n    print(\n        \"Crafting \"\n        + str(source_samples)\n        + \" * \"\n        + nb_adv_per_sample\n        + \" adversarial examples\"\n    )\n    print(\"This could take some time ...\")\n\n    # Instantiate a CW attack object\n    cw = CarliniWagnerL2(model, sess=sess)\n\n    if viz_enabled:\n        assert source_samples == nb_classes\n        idxs = [\n            np.where(np.argmax(y_test, axis=1) == i)[0][0] for i in range(nb_classes)\n        ]\n    if targeted:\n        if viz_enabled:\n            # Initialize our array for grid visualization\n            grid_shape = (nb_classes, nb_classes, img_rows, img_cols, nchannels)\n            grid_viz_data = np.zeros(grid_shape, dtype=\"f\")\n\n            adv_inputs = np.array(\n                [[instance] * nb_classes for instance in x_test[idxs]], dtype=np.float32\n            )\n        else:\n            adv_inputs = np.array(\n                [[instance] * nb_classes for instance in x_test[:source_samples]],\n                dtype=np.float32,\n            )\n\n        one_hot = np.zeros((nb_classes, nb_classes))\n        one_hot[np.arange(nb_classes), np.arange(nb_classes)] = 1\n\n        adv_inputs = adv_inputs.reshape(\n            (source_samples * nb_classes, img_rows, img_cols, nchannels)\n        )\n        adv_ys = np.array([one_hot] * source_samples, dtype=np.float32).reshape(\n            (source_samples * nb_classes, nb_classes)\n        )\n        yname = \"y_target\"\n    else:\n        if viz_enabled:\n            # Initialize our array for grid visualization\n            grid_shape = (nb_classes, 2, img_rows, img_cols, nchannels)\n            grid_viz_data = np.zeros(grid_shape, dtype=\"f\")\n\n            adv_inputs = x_test[idxs]\n        else:\n            adv_inputs = x_test[:source_samples]\n\n        adv_ys = None\n        yname = \"y\"\n\n    if targeted:\n        cw_params_batch_size = source_samples * nb_classes\n    else:\n        cw_params_batch_size = source_samples\n    cw_params = {\n        \"binary_search_steps\": 1,\n        yname: adv_ys,\n        \"max_iterations\": attack_iterations,\n        \"learning_rate\": CW_LEARNING_RATE,\n        \"batch_size\": cw_params_batch_size,\n        \"initial_const\": 10,\n    }\n\n    adv = cw.generate_np(adv_inputs, **cw_params)\n\n    eval_params = {\"batch_size\": np.minimum(nb_classes, source_samples)}\n    if targeted:\n        adv_accuracy = model_eval(sess, x, y, preds, adv, adv_ys, args=eval_params)\n    else:\n        if viz_enabled:\n            err = model_eval(sess, x, y, preds, adv, y_test[idxs], args=eval_params)\n            adv_accuracy = 1 - err\n        else:\n            err = model_eval(\n                sess, x, y, preds, adv, y_test[:source_samples], args=eval_params\n            )\n            adv_accuracy = 1 - err\n\n    if viz_enabled:\n        for j in range(nb_classes):\n            if targeted:\n                for i in range(nb_classes):\n                    grid_viz_data[i, j] = adv[i * nb_classes + j]\n            else:\n                grid_viz_data[j, 0] = adv_inputs[j]\n                grid_viz_data[j, 1] = adv[j]\n\n        print(grid_viz_data.shape)\n\n    print(\"--------------------------------------\")\n\n    # Compute the number of adversarial examples that were successfully found\n    print(\"Avg. rate of successful adv. examples {0:.4f}\".format(adv_accuracy))\n    report.clean_train_adv_eval = 1.0 - adv_accuracy\n\n    # Compute the average distortion introduced by the algorithm\n    percent_perturbed = np.mean(np.sum((adv - adv_inputs) ** 2, axis=(1, 2, 3)) ** 0.5)\n    print(\"Avg. L_2 norm of perturbations {0:.4f}\".format(percent_perturbed))\n\n    # Close TF session\n    sess.close()\n\n    # Finally, block & display a grid of all the adversarial examples\n    if viz_enabled:\n        _ = grid_visual(grid_viz_data)\n\n    return report\n\n\ndef main(argv=None):\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    mnist_tutorial_cw(\n        viz_enabled=FLAGS.viz_enabled,\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        source_samples=FLAGS.source_samples,\n        learning_rate=FLAGS.learning_rate,\n        attack_iterations=FLAGS.attack_iterations,\n        model_path=FLAGS.model_path,\n        targeted=FLAGS.targeted,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_boolean(\"viz_enabled\", VIZ_ENABLED, \"Visualize adversarial ex.\")\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_integer(\n        \"source_samples\", SOURCE_SAMPLES, \"Number of test inputs to attack\"\n    )\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n    flags.DEFINE_string(\"model_path\", MODEL_PATH, \"Path to save or load the model file\")\n    flags.DEFINE_integer(\n        \"attack_iterations\",\n        ATTACK_ITERATIONS,\n        \"Number of iterations to run attack; 1000 is good\",\n    )\n    flags.DEFINE_boolean(\"targeted\", TARGETED, \"Run the tutorial in targeted mode?\")\n\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_jsma.py",
    "content": "\"\"\"\nThis tutorial shows how to generate adversarial examples\nusing JSMA in white-box setting.\nThe original paper can be found at:\nhttps://arxiv.org/abs/1511.07528\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport numpy as np\nfrom six.moves import xrange\nimport tensorflow as tf\n\nfrom cleverhans.attacks import SaliencyMapMethod\nfrom cleverhans.compat import flags\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.loss import CrossEntropy\nfrom cleverhans.utils import other_classes, set_log_level\nfrom cleverhans.utils import pair_visual, grid_visual, AccuracyReport\nfrom cleverhans.utils_tf import model_eval, model_argmax\nfrom cleverhans.train import train\nfrom cleverhans.model_zoo.basic_cnn import ModelBasicCNN\n\nFLAGS = flags.FLAGS\n\nVIZ_ENABLED = True\nNB_EPOCHS = 6\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\nSOURCE_SAMPLES = 10\n\n\ndef mnist_tutorial_jsma(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    viz_enabled=VIZ_ENABLED,\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    source_samples=SOURCE_SAMPLES,\n    learning_rate=LEARNING_RATE,\n):\n    \"\"\"\n    MNIST tutorial for the Jacobian-based saliency map approach (JSMA)\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :param viz_enabled: (boolean) activate plots of adversarial examples\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param nb_classes: number of output classes\n    :param source_samples: number of test inputs to attack\n    :param learning_rate: learning rate for training\n    :return: an AccuracyReport object\n    \"\"\"\n    # Object used to keep track of (and return) key accuracies\n    report = AccuracyReport()\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Create TF session and set as Keras backend session\n    sess = tf.Session()\n    print(\"Created TensorFlow session.\")\n\n    set_log_level(logging.DEBUG)\n\n    # Get MNIST test data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Obtain Image Parameters\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    # Define input TF placeholder\n    x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n    y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n\n    nb_filters = 64\n    # Define TF model graph\n    model = ModelBasicCNN(\"model1\", nb_classes, nb_filters)\n    preds = model.get_logits(x)\n    loss = CrossEntropy(model, smoothing=0.1)\n    print(\"Defined TensorFlow model graph.\")\n\n    ###########################################################################\n    # Training the model using TensorFlow\n    ###########################################################################\n\n    # Train an MNIST model\n    train_params = {\n        \"nb_epochs\": nb_epochs,\n        \"batch_size\": batch_size,\n        \"learning_rate\": learning_rate,\n    }\n    sess.run(tf.global_variables_initializer())\n    rng = np.random.RandomState([2017, 8, 30])\n    train(sess, loss, x_train, y_train, args=train_params, rng=rng)\n\n    # Evaluate the accuracy of the MNIST model on legitimate test examples\n    eval_params = {\"batch_size\": batch_size}\n    accuracy = model_eval(sess, x, y, preds, x_test, y_test, args=eval_params)\n    assert x_test.shape[0] == test_end - test_start, x_test.shape\n    print(\"Test accuracy on legitimate test examples: {0}\".format(accuracy))\n    report.clean_train_clean_eval = accuracy\n\n    ###########################################################################\n    # Craft adversarial examples using the Jacobian-based saliency map approach\n    ###########################################################################\n    print(\n        \"Crafting \"\n        + str(source_samples)\n        + \" * \"\n        + str(nb_classes - 1)\n        + \" adversarial examples\"\n    )\n\n    # Keep track of success (adversarial example classified in target)\n    results = np.zeros((nb_classes, source_samples), dtype=\"i\")\n\n    # Rate of perturbed features for each test set example and target class\n    perturbations = np.zeros((nb_classes, source_samples), dtype=\"f\")\n\n    # Initialize our array for grid visualization\n    grid_shape = (nb_classes, nb_classes, img_rows, img_cols, nchannels)\n    grid_viz_data = np.zeros(grid_shape, dtype=\"f\")\n\n    # Instantiate a SaliencyMapMethod attack object\n    jsma = SaliencyMapMethod(model, sess=sess)\n    jsma_params = {\n        \"theta\": 1.0,\n        \"gamma\": 0.1,\n        \"clip_min\": 0.0,\n        \"clip_max\": 1.0,\n        \"y_target\": None,\n    }\n\n    figure = None\n    # Loop over the samples we want to perturb into adversarial examples\n    for sample_ind in xrange(0, source_samples):\n        print(\"--------------------------------------\")\n        print(\"Attacking input %i/%i\" % (sample_ind + 1, source_samples))\n        sample = x_test[sample_ind : (sample_ind + 1)]\n\n        # We want to find an adversarial example for each possible target class\n        # (i.e. all classes that differ from the label given in the dataset)\n        current_class = int(np.argmax(y_test[sample_ind]))\n        target_classes = other_classes(nb_classes, current_class)\n\n        # For the grid visualization, keep original images along the diagonal\n        grid_viz_data[current_class, current_class, :, :, :] = np.reshape(\n            sample, (img_rows, img_cols, nchannels)\n        )\n\n        # Loop over all target classes\n        for target in target_classes:\n            print(\"Generating adv. example for target class %i\" % target)\n\n            # This call runs the Jacobian-based saliency map approach\n            one_hot_target = np.zeros((1, nb_classes), dtype=np.float32)\n            one_hot_target[0, target] = 1\n            jsma_params[\"y_target\"] = one_hot_target\n            adv_x = jsma.generate_np(sample, **jsma_params)\n\n            # Check if success was achieved\n            res = int(model_argmax(sess, x, preds, adv_x) == target)\n\n            # Compute number of modified features\n            adv_x_reshape = adv_x.reshape(-1)\n            test_in_reshape = x_test[sample_ind].reshape(-1)\n            nb_changed = np.where(adv_x_reshape != test_in_reshape)[0].shape[0]\n            percent_perturb = float(nb_changed) / adv_x.reshape(-1).shape[0]\n\n            # Display the original and adversarial images side-by-side\n            if viz_enabled:\n                figure = pair_visual(\n                    np.reshape(sample, (img_rows, img_cols, nchannels)),\n                    np.reshape(adv_x, (img_rows, img_cols, nchannels)),\n                    figure,\n                )\n\n            # Add our adversarial example to our grid data\n            grid_viz_data[target, current_class, :, :, :] = np.reshape(\n                adv_x, (img_rows, img_cols, nchannels)\n            )\n\n            # Update the arrays for later analysis\n            results[target, sample_ind] = res\n            perturbations[target, sample_ind] = percent_perturb\n\n    print(\"--------------------------------------\")\n\n    # Compute the number of adversarial examples that were successfully found\n    nb_targets_tried = (nb_classes - 1) * source_samples\n    succ_rate = float(np.sum(results)) / nb_targets_tried\n    print(\"Avg. rate of successful adv. examples {0:.4f}\".format(succ_rate))\n    report.clean_train_adv_eval = 1.0 - succ_rate\n\n    # Compute the average distortion introduced by the algorithm\n    percent_perturbed = np.mean(perturbations[np.where(perturbations != 0)])\n    print(\"Avg. rate of perturbed features {0:.4f}\".format(percent_perturbed))\n\n    # Compute the average distortion introduced for successful samples only\n    percent_perturb_succ = np.mean(\n        perturbations[np.where(perturbations != 0)]\n        * (results[np.where(perturbations != 0)] == 1)\n    )\n    print(\n        \"Avg. rate of perturbed features for successful \"\n        \"adversarial examples {0:.4f}\".format(percent_perturb_succ)\n    )\n\n    # Close TF session\n    sess.close()\n\n    # Finally, block & display a grid of all the adversarial examples\n    if viz_enabled:\n        import matplotlib.pyplot as plt\n\n        plt.close(figure)\n        _ = grid_visual(grid_viz_data)\n\n    return report\n\n\ndef main(argv=None):\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    mnist_tutorial_jsma(\n        viz_enabled=FLAGS.viz_enabled,\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        source_samples=FLAGS.source_samples,\n        learning_rate=FLAGS.learning_rate,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_boolean(\"viz_enabled\", VIZ_ENABLED, \"Visualize adversarial ex.\")\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_integer(\n        \"source_samples\", SOURCE_SAMPLES, \"Nb of test inputs to attack\"\n    )\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_keras.py",
    "content": "\"\"\"\nThis tutorial shows how to generate adversarial examples using FGSM\nand train a model using adversarial training with Keras.\nThe original paper can be found at:\nhttps://arxiv.org/abs/1412.6572\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport tensorflow as tf\nfrom tensorflow import keras\n\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.compat import flags\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.utils import AccuracyReport\nfrom cleverhans.utils_keras import cnn_model\nfrom cleverhans.utils_keras import KerasModelWrapper\n\nFLAGS = flags.FLAGS\n\nNB_EPOCHS = 6\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\n\n\ndef mnist_tutorial(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    learning_rate=LEARNING_RATE,\n    testing=False,\n    label_smoothing=0.1,\n):\n    \"\"\"\n    MNIST CleverHans tutorial\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param learning_rate: learning rate for training\n    :param testing: if true, training error is calculated\n    :param label_smoothing: float, amount of label smoothing for cross entropy\n    :return: an AccuracyReport object\n    \"\"\"\n\n    # Object used to keep track of (and return) key accuracies\n    report = AccuracyReport()\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n    # Force TensorFlow to use single thread to improve reproducibility\n    config = tf.ConfigProto(\n        intra_op_parallelism_threads=1, inter_op_parallelism_threads=1\n    )\n\n    if keras.backend.image_data_format() != \"channels_last\":\n        raise NotImplementedError(\n            \"this tutorial requires keras to be configured to channels_last format\"\n        )\n\n    # Create TF session and set as Keras backend session\n    sess = tf.Session(config=config)\n    keras.backend.set_session(sess)\n\n    # Get MNIST test data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Obtain Image Parameters\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    # Label smoothing\n    y_train -= label_smoothing * (y_train - 1.0 / nb_classes)\n\n    # Define Keras model\n    model = cnn_model(\n        img_rows=img_rows,\n        img_cols=img_cols,\n        channels=nchannels,\n        nb_filters=64,\n        nb_classes=nb_classes,\n    )\n    print(\"Defined Keras model.\")\n\n    # To be able to call the model in the custom loss, we need to call it once\n    # before, see https://github.com/tensorflow/tensorflow/issues/23769\n    model(model.input)\n\n    # Initialize the Fast Gradient Sign Method (FGSM) attack object\n    wrap = KerasModelWrapper(model)\n    fgsm = FastGradientMethod(wrap, sess=sess)\n    fgsm_params = {\"eps\": 0.3, \"clip_min\": 0.0, \"clip_max\": 1.0}\n\n    adv_acc_metric = get_adversarial_acc_metric(model, fgsm, fgsm_params)\n    model.compile(\n        optimizer=keras.optimizers.Adam(learning_rate),\n        loss=\"categorical_crossentropy\",\n        metrics=[\"accuracy\", adv_acc_metric],\n    )\n\n    # Train an MNIST model\n    model.fit(\n        x_train,\n        y_train,\n        batch_size=batch_size,\n        epochs=nb_epochs,\n        validation_data=(x_test, y_test),\n        verbose=2,\n    )\n\n    # Evaluate the accuracy on legitimate and adversarial test examples\n    _, acc, adv_acc = model.evaluate(x_test, y_test, batch_size=batch_size, verbose=0)\n    report.clean_train_clean_eval = acc\n    report.clean_train_adv_eval = adv_acc\n    print(\"Test accuracy on legitimate examples: %0.4f\" % acc)\n    print(\"Test accuracy on adversarial examples: %0.4f\\n\" % adv_acc)\n\n    # Calculate training error\n    if testing:\n        _, train_acc, train_adv_acc = model.evaluate(\n            x_train, y_train, batch_size=batch_size, verbose=0\n        )\n        report.train_clean_train_clean_eval = train_acc\n        report.train_clean_train_adv_eval = train_adv_acc\n\n    print(\"Repeating the process, using adversarial training\")\n    # Redefine Keras model\n    model_2 = cnn_model(\n        img_rows=img_rows,\n        img_cols=img_cols,\n        channels=nchannels,\n        nb_filters=64,\n        nb_classes=nb_classes,\n    )\n    model_2(model_2.input)\n    wrap_2 = KerasModelWrapper(model_2)\n    fgsm_2 = FastGradientMethod(wrap_2, sess=sess)\n\n    # Use a loss function based on legitimate and adversarial examples\n    adv_loss_2 = get_adversarial_loss(model_2, fgsm_2, fgsm_params)\n    adv_acc_metric_2 = get_adversarial_acc_metric(model_2, fgsm_2, fgsm_params)\n    model_2.compile(\n        optimizer=keras.optimizers.Adam(learning_rate),\n        loss=adv_loss_2,\n        metrics=[\"accuracy\", adv_acc_metric_2],\n    )\n\n    # Train an MNIST model\n    model_2.fit(\n        x_train,\n        y_train,\n        batch_size=batch_size,\n        epochs=nb_epochs,\n        validation_data=(x_test, y_test),\n        verbose=2,\n    )\n\n    # Evaluate the accuracy on legitimate and adversarial test examples\n    _, acc, adv_acc = model_2.evaluate(x_test, y_test, batch_size=batch_size, verbose=0)\n    report.adv_train_clean_eval = acc\n    report.adv_train_adv_eval = adv_acc\n    print(\"Test accuracy on legitimate examples: %0.4f\" % acc)\n    print(\"Test accuracy on adversarial examples: %0.4f\\n\" % adv_acc)\n\n    # Calculate training error\n    if testing:\n        _, train_acc, train_adv_acc = model_2.evaluate(\n            x_train, y_train, batch_size=batch_size, verbose=0\n        )\n        report.train_adv_train_clean_eval = train_acc\n        report.train_adv_train_adv_eval = train_adv_acc\n\n    return report\n\n\ndef get_adversarial_acc_metric(model, fgsm, fgsm_params):\n    def adv_acc(y, _):\n        # Generate adversarial examples\n        x_adv = fgsm.generate(model.input, **fgsm_params)\n        # Consider the attack to be constant\n        x_adv = tf.stop_gradient(x_adv)\n\n        # Accuracy on the adversarial examples\n        preds_adv = model(x_adv)\n        return keras.metrics.categorical_accuracy(y, preds_adv)\n\n    return adv_acc\n\n\ndef get_adversarial_loss(model, fgsm, fgsm_params):\n    def adv_loss(y, preds):\n        # Cross-entropy on the legitimate examples\n        cross_ent = keras.losses.categorical_crossentropy(y, preds)\n\n        # Generate adversarial examples\n        x_adv = fgsm.generate(model.input, **fgsm_params)\n        # Consider the attack to be constant\n        x_adv = tf.stop_gradient(x_adv)\n\n        # Cross-entropy on the adversarial examples\n        preds_adv = model(x_adv)\n        cross_ent_adv = keras.losses.categorical_crossentropy(y, preds_adv)\n\n        return 0.5 * cross_ent + 0.5 * cross_ent_adv\n\n    return adv_loss\n\n\ndef main(argv=None):\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    mnist_tutorial(\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        learning_rate=FLAGS.learning_rate,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_keras_tf.py",
    "content": "\"\"\"\nThis tutorial shows how to generate adversarial examples using FGSM\nand train a model using adversarial training with Keras.\nIt is very similar to mnist_tutorial_tf.py, which does the same\nthing but without a dependence on keras.\nThe original paper can be found at:\nhttps://arxiv.org/abs/1412.6572\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport os\n\nimport tensorflow as tf\nfrom tensorflow import keras\nimport numpy as np\n\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.compat import flags\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.loss import CrossEntropy\nfrom cleverhans.train import train\nfrom cleverhans.utils import AccuracyReport\nfrom cleverhans.utils_keras import cnn_model\nfrom cleverhans.utils_keras import KerasModelWrapper\nfrom cleverhans.utils_tf import model_eval\n\nFLAGS = flags.FLAGS\n\nNB_EPOCHS = 6\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\nTRAIN_DIR = \"train_dir\"\nFILENAME = \"mnist.ckpt\"\nLOAD_MODEL = False\n\n\ndef mnist_tutorial(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    learning_rate=LEARNING_RATE,\n    train_dir=TRAIN_DIR,\n    filename=FILENAME,\n    load_model=LOAD_MODEL,\n    testing=False,\n    label_smoothing=0.1,\n):\n    \"\"\"\n    MNIST CleverHans tutorial\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param learning_rate: learning rate for training\n    :param train_dir: Directory storing the saved model\n    :param filename: Filename to save model under\n    :param load_model: True for load, False for not load\n    :param testing: if true, test error is calculated\n    :param label_smoothing: float, amount of label smoothing for cross entropy\n    :return: an AccuracyReport object\n    \"\"\"\n    tf.keras.backend.set_learning_phase(0)\n\n    # Object used to keep track of (and return) key accuracies\n    report = AccuracyReport()\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    if keras.backend.image_data_format() != \"channels_last\":\n        raise NotImplementedError(\n            \"this tutorial requires keras to be configured to channels_last format\"\n        )\n\n    # Create TF session and set as Keras backend session\n    sess = tf.Session()\n    keras.backend.set_session(sess)\n\n    # Get MNIST test data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Obtain Image Parameters\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    # Define input TF placeholder\n    x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n    y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n\n    # Define TF model graph\n    model = cnn_model(\n        img_rows=img_rows,\n        img_cols=img_cols,\n        channels=nchannels,\n        nb_filters=64,\n        nb_classes=nb_classes,\n    )\n    preds = model(x)\n    print(\"Defined TensorFlow model graph.\")\n\n    def evaluate():\n        # Evaluate the accuracy of the MNIST model on legitimate test examples\n        eval_params = {\"batch_size\": batch_size}\n        acc = model_eval(sess, x, y, preds, x_test, y_test, args=eval_params)\n        report.clean_train_clean_eval = acc\n        #        assert X_test.shape[0] == test_end - test_start, X_test.shape\n        print(\"Test accuracy on legitimate examples: %0.4f\" % acc)\n\n    # Train an MNIST model\n    train_params = {\n        \"nb_epochs\": nb_epochs,\n        \"batch_size\": batch_size,\n        \"learning_rate\": learning_rate,\n        \"train_dir\": train_dir,\n        \"filename\": filename,\n    }\n\n    rng = np.random.RandomState([2017, 8, 30])\n    if not os.path.exists(train_dir):\n        os.mkdir(train_dir)\n\n    ckpt = tf.train.get_checkpoint_state(train_dir)\n    print(train_dir, ckpt)\n    ckpt_path = False if ckpt is None else ckpt.model_checkpoint_path\n    wrap = KerasModelWrapper(model)\n\n    if load_model and ckpt_path:\n        saver = tf.train.Saver()\n        print(ckpt_path)\n        saver.restore(sess, ckpt_path)\n        print(\"Model loaded from: {}\".format(ckpt_path))\n        evaluate()\n    else:\n        print(\"Model was not loaded, training from scratch.\")\n        loss = CrossEntropy(wrap, smoothing=label_smoothing)\n        train(\n            sess, loss, x_train, y_train, evaluate=evaluate, args=train_params, rng=rng\n        )\n\n    # Calculate training error\n    if testing:\n        eval_params = {\"batch_size\": batch_size}\n        acc = model_eval(sess, x, y, preds, x_train, y_train, args=eval_params)\n        report.train_clean_train_clean_eval = acc\n\n    # Initialize the Fast Gradient Sign Method (FGSM) attack object and graph\n    fgsm = FastGradientMethod(wrap, sess=sess)\n    fgsm_params = {\"eps\": 0.3, \"clip_min\": 0.0, \"clip_max\": 1.0}\n    adv_x = fgsm.generate(x, **fgsm_params)\n    # Consider the attack to be constant\n    adv_x = tf.stop_gradient(adv_x)\n    preds_adv = model(adv_x)\n\n    # Evaluate the accuracy of the MNIST model on adversarial examples\n    eval_par = {\"batch_size\": batch_size}\n    acc = model_eval(sess, x, y, preds_adv, x_test, y_test, args=eval_par)\n    print(\"Test accuracy on adversarial examples: %0.4f\\n\" % acc)\n    report.clean_train_adv_eval = acc\n\n    # Calculating train error\n    if testing:\n        eval_par = {\"batch_size\": batch_size}\n        acc = model_eval(sess, x, y, preds_adv, x_train, y_train, args=eval_par)\n        report.train_clean_train_adv_eval = acc\n\n    print(\"Repeating the process, using adversarial training\")\n    # Redefine TF model graph\n    model_2 = cnn_model(\n        img_rows=img_rows,\n        img_cols=img_cols,\n        channels=nchannels,\n        nb_filters=64,\n        nb_classes=nb_classes,\n    )\n    wrap_2 = KerasModelWrapper(model_2)\n    preds_2 = model_2(x)\n    fgsm2 = FastGradientMethod(wrap_2, sess=sess)\n\n    def attack(x):\n        return fgsm2.generate(x, **fgsm_params)\n\n    preds_2_adv = model_2(attack(x))\n    loss_2 = CrossEntropy(wrap_2, smoothing=label_smoothing, attack=attack)\n\n    def evaluate_2():\n        # Accuracy of adversarially trained model on legitimate test inputs\n        eval_params = {\"batch_size\": batch_size}\n        accuracy = model_eval(sess, x, y, preds_2, x_test, y_test, args=eval_params)\n        print(\"Test accuracy on legitimate examples: %0.4f\" % accuracy)\n        report.adv_train_clean_eval = accuracy\n\n        # Accuracy of the adversarially trained model on adversarial examples\n        accuracy = model_eval(sess, x, y, preds_2_adv, x_test, y_test, args=eval_params)\n        print(\"Test accuracy on adversarial examples: %0.4f\" % accuracy)\n        report.adv_train_adv_eval = accuracy\n\n    # Perform and evaluate adversarial training\n    train(\n        sess, loss_2, x_train, y_train, evaluate=evaluate_2, args=train_params, rng=rng\n    )\n\n    # Calculate training errors\n    if testing:\n        eval_params = {\"batch_size\": batch_size}\n        accuracy = model_eval(sess, x, y, preds_2, x_train, y_train, args=eval_params)\n        report.train_adv_train_clean_eval = accuracy\n        accuracy = model_eval(\n            sess, x, y, preds_2_adv, x_train, y_train, args=eval_params\n        )\n        report.train_adv_train_adv_eval = accuracy\n\n    return report\n\n\ndef main(argv=None):\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    mnist_tutorial(\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        learning_rate=FLAGS.learning_rate,\n        train_dir=FLAGS.train_dir,\n        filename=FLAGS.filename,\n        load_model=FLAGS.load_model,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n    flags.DEFINE_string(\"train_dir\", TRAIN_DIR, \"Directory where to save model.\")\n    flags.DEFINE_string(\"filename\", FILENAME, \"Checkpoint filename.\")\n    flags.DEFINE_boolean(\"load_model\", LOAD_MODEL, \"Load saved model or train.\")\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_picklable.py",
    "content": "\"\"\"\nThis tutorial shows how to use cleverhans.picklable_model\nto create models that can be saved for evaluation later.\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.compat import flags\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.loss import CrossEntropy\nfrom cleverhans.serial import save\nfrom cleverhans.utils_tf import model_eval, silence\nfrom cleverhans.train import train\nfrom cleverhans.utils import AccuracyReport, set_log_level\nfrom cleverhans_tutorials.tutorial_models import make_basic_picklable_cnn\n\nsilence()\n\nFLAGS = flags.FLAGS\n\nNB_EPOCHS = 6\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\nNB_FILTERS = 64\nCLEAN_TRAIN = True\nBACKPROP_THROUGH_ATTACK = False\n\n\ndef mnist_tutorial(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    learning_rate=LEARNING_RATE,\n    clean_train=CLEAN_TRAIN,\n    testing=False,\n    backprop_through_attack=BACKPROP_THROUGH_ATTACK,\n    nb_filters=NB_FILTERS,\n    num_threads=None,\n    label_smoothing=0.1,\n):\n    \"\"\"\n    MNIST cleverhans tutorial\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param learning_rate: learning rate for training\n    :param clean_train: perform normal training on clean examples only\n                        before performing adversarial training.\n    :param testing: if true, complete an AccuracyReport for unit tests\n                    to verify that performance is adequate\n    :param backprop_through_attack: If True, backprop through adversarial\n                                    example construction process during\n                                    adversarial training.\n    :param label_smoothing: float, amount of label smoothing for cross entropy\n    :return: an AccuracyReport object\n    \"\"\"\n\n    # Object used to keep track of (and return) key accuracies\n    report = AccuracyReport()\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Set logging level to see debug information\n    set_log_level(logging.DEBUG)\n\n    # Create TF session\n    if num_threads:\n        config_args = dict(intra_op_parallelism_threads=1)\n    else:\n        config_args = {}\n    sess = tf.Session(config=tf.ConfigProto(**config_args))\n\n    # Get MNIST test data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Use Image Parameters\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    # Define input TF placeholder\n    x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n    y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n\n    # Train an MNIST model\n    train_params = {\n        \"nb_epochs\": nb_epochs,\n        \"batch_size\": batch_size,\n        \"learning_rate\": learning_rate,\n    }\n    eval_params = {\"batch_size\": batch_size}\n    fgsm_params = {\"eps\": 0.3, \"clip_min\": 0.0, \"clip_max\": 1.0}\n    rng = np.random.RandomState([2017, 8, 30])\n\n    def do_eval(preds, x_set, y_set, report_key, is_adv=None):\n        \"\"\"\n        Run the evaluation and print the results.\n        \"\"\"\n        acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params)\n        setattr(report, report_key, acc)\n        if is_adv is None:\n            report_text = None\n        elif is_adv:\n            report_text = \"adversarial\"\n        else:\n            report_text = \"legitimate\"\n        if report_text:\n            print(\"Test accuracy on %s examples: %0.4f\" % (report_text, acc))\n\n    if clean_train:\n        model = make_basic_picklable_cnn()\n        # Tag the model so that when it is saved to disk, future scripts will\n        # be able to tell what data it was trained on\n        model.dataset_factory = mnist.get_factory()\n        preds = model.get_logits(x)\n        assert len(model.get_params()) > 0\n        loss = CrossEntropy(model, smoothing=label_smoothing)\n\n        def evaluate():\n            \"\"\"\n            Run evaluation for the naively trained model on clean examples.\n            \"\"\"\n            do_eval(preds, x_test, y_test, \"clean_train_clean_eval\", False)\n\n        train(\n            sess,\n            loss,\n            x_train,\n            y_train,\n            evaluate=evaluate,\n            args=train_params,\n            rng=rng,\n            var_list=model.get_params(),\n        )\n\n        with sess.as_default():\n            save(\"clean_model.joblib\", model)\n\n            print(\n                \"Now that the model has been saved, you can evaluate it in a\"\n                \" separate process using `evaluate_pickled_model.py`. \"\n                \"You should get exactly the same result for both clean and \"\n                \"adversarial accuracy as you get within this program.\"\n            )\n\n        # Calculate training error\n        if testing:\n            do_eval(preds, x_train, y_train, \"train_clean_train_clean_eval\")\n\n        # Initialize the Fast Gradient Sign Method (FGSM) attack object and\n        # graph\n        fgsm = FastGradientMethod(model, sess=sess)\n        adv_x = fgsm.generate(x, **fgsm_params)\n        preds_adv = model.get_logits(adv_x)\n\n        # Evaluate the accuracy of the MNIST model on adversarial examples\n        do_eval(preds_adv, x_test, y_test, \"clean_train_adv_eval\", True)\n\n        # Calculate training error\n        if testing:\n            do_eval(preds_adv, x_train, y_train, \"train_clean_train_adv_eval\")\n\n        print(\"Repeating the process, using adversarial training\")\n\n    # Create a new model and train it to be robust to FastGradientMethod\n    model2 = make_basic_picklable_cnn()\n    # Tag the model so that when it is saved to disk, future scripts will\n    # be able to tell what data it was trained on\n    model2.dataset_factory = mnist.get_factory()\n    fgsm2 = FastGradientMethod(model2, sess=sess)\n\n    def attack(x):\n        \"\"\"Return an adversarial example near clean example `x`\"\"\"\n        return fgsm2.generate(x, **fgsm_params)\n\n    loss2 = CrossEntropy(model2, smoothing=label_smoothing, attack=attack)\n    preds2 = model2.get_logits(x)\n    adv_x2 = attack(x)\n\n    if not backprop_through_attack:\n        # For the fgsm attack used in this tutorial, the attack has zero\n        # gradient so enabling this flag does not change the gradient.\n        # For some other attacks, enabling this flag increases the cost of\n        # training, but gives the defender the ability to anticipate how\n        # the atacker will change their strategy in response to updates to\n        # the defender's parameters.\n        adv_x2 = tf.stop_gradient(adv_x2)\n    preds2_adv = model2.get_logits(adv_x2)\n\n    def evaluate_adv():\n        \"\"\"\n        Evaluate the adversarially trained model.\n        \"\"\"\n        # Accuracy of adversarially trained model on legitimate test inputs\n        do_eval(preds2, x_test, y_test, \"adv_train_clean_eval\", False)\n        # Accuracy of the adversarially trained model on adversarial examples\n        do_eval(preds2_adv, x_test, y_test, \"adv_train_adv_eval\", True)\n\n    # Perform and evaluate adversarial training\n    train(\n        sess,\n        loss2,\n        x_train,\n        y_train,\n        evaluate=evaluate_adv,\n        args=train_params,\n        rng=rng,\n        var_list=model2.get_params(),\n    )\n\n    with sess.as_default():\n        save(\"adv_model.joblib\", model2)\n        print(\n            \"Now that the model has been saved, you can evaluate it in a \"\n            \"separate process using \"\n            \"`python evaluate_pickled_model.py adv_model.joblib`. \"\n            \"You should get exactly the same result for both clean and \"\n            \"adversarial accuracy as you get within this program.\"\n            \" You can also move beyond the tutorials directory and run the \"\n            \" real `compute_accuracy.py` script (make sure cleverhans/scripts \"\n            \"is in your PATH) to see that this FGSM-trained \"\n            \"model is actually not very robust---it's just a model that trains \"\n            \" quickly so the tutorial does not take a long time\"\n        )\n\n    # Calculate training errors\n    if testing:\n        do_eval(preds2, x_train, y_train, \"train_adv_train_clean_eval\")\n        do_eval(preds2_adv, x_train, y_train, \"train_adv_train_adv_eval\")\n\n    return report\n\n\ndef main(argv=None):\n    \"\"\"\n    Run the tutorial using command line flags\n    \"\"\"\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    mnist_tutorial(\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        learning_rate=FLAGS.learning_rate,\n        clean_train=FLAGS.clean_train,\n        backprop_through_attack=FLAGS.backprop_through_attack,\n        nb_filters=FLAGS.nb_filters,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_filters\", NB_FILTERS, \"Model size multiplier\")\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n    flags.DEFINE_bool(\"clean_train\", CLEAN_TRAIN, \"Train on clean examples\")\n    flags.DEFINE_bool(\n        \"backprop_through_attack\",\n        BACKPROP_THROUGH_ATTACK,\n        (\n            \"If True, backprop through adversarial example \"\n            \"construction process during adversarial training\"\n        ),\n    )\n\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_pytorch.py",
    "content": "\"\"\"\nThis tutorial shows how to generate adversarial examples using FGSM\nand train a model using adversarial training with TensorFlow.\nIt is very similar to mnist_tutorial_keras_tf.py, which does the same\nthing but with a dependence on keras.\nThe original paper can be found at:\nhttps://arxiv.org/abs/1412.6572\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport warnings\nimport numpy as np\nimport tensorflow as tf\nimport torch\nfrom torch import nn\nimport torch.nn.functional as F\nfrom torch import optim\nfrom torch.autograd import Variable\nfrom torchvision import datasets, transforms\n\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.compat import flags\nfrom cleverhans.model import CallableModelWrapper\nfrom cleverhans.utils import AccuracyReport\nfrom cleverhans.utils_pytorch import convert_pytorch_model_to_tf\n\nFLAGS = flags.FLAGS\n\nNB_EPOCHS = 6\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\n\n\nwarnings.warn(\n    \"convert_pytorch_model_to_tf is deprecated, switch to\"\n    + \" dedicated PyTorch support provided by CleverHans v4.\"\n)\n\n\nclass PytorchMnistModel(nn.Module):\n    \"\"\"Basic MNIST model from github\n    https://github.com/rickiepark/pytorch-examples/blob/master/mnist.ipynb\n    \"\"\"\n\n    def __init__(self):\n        super(PytorchMnistModel, self).__init__()\n        # input is 28x28\n        # padding=2 for same padding\n        self.conv1 = nn.Conv2d(1, 32, 5, padding=2)\n        # feature map size is 14*14 by pooling\n        # padding=2 for same padding\n        self.conv2 = nn.Conv2d(32, 64, 5, padding=2)\n        # feature map size is 7*7 by pooling\n        self.fc1 = nn.Linear(64 * 7 * 7, 1024)\n        self.fc2 = nn.Linear(1024, 10)\n\n    def forward(self, x):\n        x = F.max_pool2d(F.relu(self.conv1(x)), 2)\n        x = F.max_pool2d(F.relu(self.conv2(x)), 2)\n        x = x.view(-1, 64 * 7 * 7)  # reshape Variable\n        x = F.relu(self.fc1(x))\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=-1)\n\n\ndef mnist_tutorial(\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    train_end=-1,\n    test_end=-1,\n    learning_rate=LEARNING_RATE,\n):\n    \"\"\"\n    MNIST cleverhans tutorial\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param learning_rate: learning rate for training\n    :return: an AccuracyReport object\n    \"\"\"\n    # Train a pytorch MNIST model\n    torch_model = PytorchMnistModel()\n    if torch.cuda.is_available():\n        torch_model = torch_model.cuda()\n    report = AccuracyReport()\n\n    train_loader = torch.utils.data.DataLoader(\n        datasets.MNIST(\n            \"data\", train=True, download=True, transform=transforms.ToTensor()\n        ),\n        batch_size=batch_size,\n        shuffle=True,\n    )\n    test_loader = torch.utils.data.DataLoader(\n        datasets.MNIST(\"data\", train=False, transform=transforms.ToTensor()),\n        batch_size=batch_size,\n    )\n\n    # Truncate the datasets so that our test run more quickly\n    train_loader.dataset.train_data = train_loader.dataset.train_data[:train_end]\n    test_loader.dataset.test_data = test_loader.dataset.test_data[:test_end]\n\n    # Train our model\n    optimizer = optim.Adam(torch_model.parameters(), lr=learning_rate)\n    train_loss = []\n\n    total = 0\n    correct = 0\n    step = 0\n    for _epoch in range(nb_epochs):\n        for xs, ys in train_loader:\n            xs, ys = Variable(xs), Variable(ys)\n            if torch.cuda.is_available():\n                xs, ys = xs.cuda(), ys.cuda()\n            optimizer.zero_grad()\n            preds = torch_model(xs)\n            loss = F.nll_loss(preds, ys)\n            loss.backward()  # calc gradients\n            train_loss.append(loss.data.item())\n            optimizer.step()  # update gradients\n\n            preds_np = preds.cpu().detach().numpy()\n            correct += (np.argmax(preds_np, axis=1) == ys.cpu().detach().numpy()).sum()\n            total += train_loader.batch_size\n            step += 1\n            if total % 1000 == 0:\n                acc = float(correct) / total\n                print(\"[%s] Training accuracy: %.2f%%\" % (step, acc * 100))\n                total = 0\n                correct = 0\n\n    # Evaluate on clean data\n    total = 0\n    correct = 0\n    for xs, ys in test_loader:\n        xs, ys = Variable(xs), Variable(ys)\n        if torch.cuda.is_available():\n            xs, ys = xs.cuda(), ys.cuda()\n\n        preds = torch_model(xs)\n        preds_np = preds.cpu().detach().numpy()\n\n        correct += (np.argmax(preds_np, axis=1) == ys.cpu().detach().numpy()).sum()\n        total += len(xs)\n\n    acc = float(correct) / total\n    report.clean_train_clean_eval = acc\n    print(\"[%s] Clean accuracy: %.2f%%\" % (step, acc * 100))\n\n    # We use tf for evaluation on adversarial data\n    sess = tf.Session()\n    x_op = tf.placeholder(\n        tf.float32,\n        shape=(\n            None,\n            1,\n            28,\n            28,\n        ),\n    )\n\n    # Convert pytorch model to a tf_model and wrap it in cleverhans\n    tf_model_fn = convert_pytorch_model_to_tf(torch_model)\n    cleverhans_model = CallableModelWrapper(tf_model_fn, output_layer=\"logits\")\n\n    # Create an FGSM attack\n    fgsm_op = FastGradientMethod(cleverhans_model, sess=sess)\n    fgsm_params = {\"eps\": 0.3, \"clip_min\": 0.0, \"clip_max\": 1.0}\n    adv_x_op = fgsm_op.generate(x_op, **fgsm_params)\n    adv_preds_op = tf_model_fn(adv_x_op)\n\n    # Run an evaluation of our model against fgsm\n    total = 0\n    correct = 0\n    for xs, ys in test_loader:\n        adv_preds = sess.run(adv_preds_op, feed_dict={x_op: xs})\n        correct += (np.argmax(adv_preds, axis=1) == ys.cpu().detach().numpy()).sum()\n        total += test_loader.batch_size\n\n    acc = float(correct) / total\n    print(\"Adv accuracy: {:.3f}\".format(acc * 100))\n    report.clean_train_adv_eval = acc\n    return report\n\n\ndef main(_=None):\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    mnist_tutorial(\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        learning_rate=FLAGS.learning_rate,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_tf.py",
    "content": "\"\"\"\nThis tutorial shows how to generate adversarial examples using FGSM\nand train a model using adversarial training with TensorFlow.\nIt is very similar to mnist_tutorial_keras_tf.py, which does the same\nthing but with a dependence on keras.\nThe original paper can be found at:\nhttps://arxiv.org/abs/1412.6572\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.compat import flags\nfrom cleverhans.loss import CrossEntropy\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.utils_tf import model_eval\nfrom cleverhans.train import train\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.utils import AccuracyReport, set_log_level\nfrom cleverhans.model_zoo.basic_cnn import ModelBasicCNN\n\nFLAGS = flags.FLAGS\n\nNB_EPOCHS = 6\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\nCLEAN_TRAIN = True\nBACKPROP_THROUGH_ATTACK = False\nNB_FILTERS = 64\n\n\ndef mnist_tutorial(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    learning_rate=LEARNING_RATE,\n    clean_train=CLEAN_TRAIN,\n    testing=False,\n    backprop_through_attack=BACKPROP_THROUGH_ATTACK,\n    nb_filters=NB_FILTERS,\n    num_threads=None,\n    label_smoothing=0.1,\n):\n    \"\"\"\n    MNIST cleverhans tutorial\n    :param train_start: index of first training set example\n    :param train_end: index of last training set example\n    :param test_start: index of first test set example\n    :param test_end: index of last test set example\n    :param nb_epochs: number of epochs to train model\n    :param batch_size: size of training batches\n    :param learning_rate: learning rate for training\n    :param clean_train: perform normal training on clean examples only\n                        before performing adversarial training.\n    :param testing: if true, complete an AccuracyReport for unit tests\n                    to verify that performance is adequate\n    :param backprop_through_attack: If True, backprop through adversarial\n                                    example construction process during\n                                    adversarial training.\n    :param label_smoothing: float, amount of label smoothing for cross entropy\n    :return: an AccuracyReport object\n    \"\"\"\n\n    # Object used to keep track of (and return) key accuracies\n    report = AccuracyReport()\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Set logging level to see debug information\n    set_log_level(logging.DEBUG)\n\n    # Create TF session\n    if num_threads:\n        config_args = dict(intra_op_parallelism_threads=1)\n    else:\n        config_args = {}\n    sess = tf.Session(config=tf.ConfigProto(**config_args))\n\n    # Get MNIST data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    x_train, y_train = mnist.get_set(\"train\")\n    x_test, y_test = mnist.get_set(\"test\")\n\n    # Use Image Parameters\n    img_rows, img_cols, nchannels = x_train.shape[1:4]\n    nb_classes = y_train.shape[1]\n\n    # Define input TF placeholder\n    x = tf.placeholder(tf.float32, shape=(None, img_rows, img_cols, nchannels))\n    y = tf.placeholder(tf.float32, shape=(None, nb_classes))\n\n    # Train an MNIST model\n    train_params = {\n        \"nb_epochs\": nb_epochs,\n        \"batch_size\": batch_size,\n        \"learning_rate\": learning_rate,\n    }\n    eval_params = {\"batch_size\": batch_size}\n    fgsm_params = {\"eps\": 0.3, \"clip_min\": 0.0, \"clip_max\": 1.0}\n    rng = np.random.RandomState([2017, 8, 30])\n\n    def do_eval(preds, x_set, y_set, report_key, is_adv=None):\n        acc = model_eval(sess, x, y, preds, x_set, y_set, args=eval_params)\n        setattr(report, report_key, acc)\n        if is_adv is None:\n            report_text = None\n        elif is_adv:\n            report_text = \"adversarial\"\n        else:\n            report_text = \"legitimate\"\n        if report_text:\n            print(\"Test accuracy on %s examples: %0.4f\" % (report_text, acc))\n\n    if clean_train:\n        model = ModelBasicCNN(\"model1\", nb_classes, nb_filters)\n        preds = model.get_logits(x)\n        loss = CrossEntropy(model, smoothing=label_smoothing)\n\n        def evaluate():\n            do_eval(preds, x_test, y_test, \"clean_train_clean_eval\", False)\n\n        train(\n            sess,\n            loss,\n            x_train,\n            y_train,\n            evaluate=evaluate,\n            args=train_params,\n            rng=rng,\n            var_list=model.get_params(),\n        )\n\n        # Calculate training error\n        if testing:\n            do_eval(preds, x_train, y_train, \"train_clean_train_clean_eval\")\n\n        # Initialize the Fast Gradient Sign Method (FGSM) attack object and\n        # graph\n        fgsm = FastGradientMethod(model, sess=sess)\n        adv_x = fgsm.generate(x, **fgsm_params)\n        preds_adv = model.get_logits(adv_x)\n\n        # Evaluate the accuracy of the MNIST model on adversarial examples\n        do_eval(preds_adv, x_test, y_test, \"clean_train_adv_eval\", True)\n\n        # Calculate training error\n        if testing:\n            do_eval(preds_adv, x_train, y_train, \"train_clean_train_adv_eval\")\n\n        print(\"Repeating the process, using adversarial training\")\n\n    # Create a new model and train it to be robust to FastGradientMethod\n    model2 = ModelBasicCNN(\"model2\", nb_classes, nb_filters)\n    fgsm2 = FastGradientMethod(model2, sess=sess)\n\n    def attack(x):\n        return fgsm2.generate(x, **fgsm_params)\n\n    loss2 = CrossEntropy(model2, smoothing=label_smoothing, attack=attack)\n    preds2 = model2.get_logits(x)\n    adv_x2 = attack(x)\n\n    if not backprop_through_attack:\n        # For the fgsm attack used in this tutorial, the attack has zero\n        # gradient so enabling this flag does not change the gradient.\n        # For some other attacks, enabling this flag increases the cost of\n        # training, but gives the defender the ability to anticipate how\n        # the atacker will change their strategy in response to updates to\n        # the defender's parameters.\n        adv_x2 = tf.stop_gradient(adv_x2)\n    preds2_adv = model2.get_logits(adv_x2)\n\n    def evaluate2():\n        # Accuracy of adversarially trained model on legitimate test inputs\n        do_eval(preds2, x_test, y_test, \"adv_train_clean_eval\", False)\n        # Accuracy of the adversarially trained model on adversarial examples\n        do_eval(preds2_adv, x_test, y_test, \"adv_train_adv_eval\", True)\n\n    # Perform and evaluate adversarial training\n    train(\n        sess,\n        loss2,\n        x_train,\n        y_train,\n        evaluate=evaluate2,\n        args=train_params,\n        rng=rng,\n        var_list=model2.get_params(),\n    )\n\n    # Calculate training errors\n    if testing:\n        do_eval(preds2, x_train, y_train, \"train_adv_train_clean_eval\")\n        do_eval(preds2_adv, x_train, y_train, \"train_adv_train_adv_eval\")\n\n    return report\n\n\ndef main(argv=None):\n    \"\"\"\n    Run the tutorial using command line flags.\n    \"\"\"\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    mnist_tutorial(\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        learning_rate=FLAGS.learning_rate,\n        clean_train=FLAGS.clean_train,\n        backprop_through_attack=FLAGS.backprop_through_attack,\n        nb_filters=FLAGS.nb_filters,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_filters\", NB_FILTERS, \"Model size multiplier\")\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n    flags.DEFINE_bool(\"clean_train\", CLEAN_TRAIN, \"Train on clean examples\")\n    flags.DEFINE_bool(\n        \"backprop_through_attack\",\n        BACKPROP_THROUGH_ATTACK,\n        (\n            \"If True, backprop through adversarial example \"\n            \"construction process during adversarial training\"\n        ),\n    )\n\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/mnist_tutorial_tfe.py",
    "content": "\"\"\"\nThis tutorial shows how to generate adversarial examples using FGSM\nand train a model using adversarial training with TensorFlow Eager.\n\nIt is similar to mnist_tutorial_tf.py.\nmnist_tutorial_tf - dynaminc eager execution.\nmnist_tutorial_tf - graph based execution.\nThe original paper can be found at:\nhttps://arxiv.org/abs/1412.6572\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.compat import flags\nfrom cleverhans.utils import AccuracyReport\nfrom cleverhans.utils_tfe import train, model_eval\nfrom cleverhans.attacks_tfe import BasicIterativeMethod\nfrom cleverhans.attacks_tfe import FastGradientMethod\nfrom cleverhans.dataset import MNIST\nfrom cleverhans.utils import set_log_level\nfrom cleverhans_tutorials.tutorial_models_tfe import ModelBasicCNNTFE\n\nif tf.executing_eagerly() is True:\n    print(\"TF Eager Activated.\")\nelse:\n    raise Exception(\"Error Enabling Eager Execution.\")\ntfe = tf.contrib.eager\n\nFLAGS = flags.FLAGS\n\nNB_EPOCHS = 6\nBATCH_SIZE = 128\nLEARNING_RATE = 0.001\nNB_FILTERS = 64\n\n# Keeps track of implemented attacks.\n# Maps attack string taken from bash to attack class\n# -- 'fgsm' : FastGradientMethod\n# -- 'bim': BasicIterativeMethod\n\nAVAILABLE_ATTACKS = {\"fgsm\": FastGradientMethod, \"bim\": BasicIterativeMethod}\n\n\ndef attack_selection(attack_string):\n    \"\"\"\n    Selects the Attack Class using string input.\n    :param attack_string: adversarial attack name in string format\n    :return: attack class defined in cleverhans.attacks_eager\n    \"\"\"\n\n    # List of Implemented attacks\n    attacks_list = AVAILABLE_ATTACKS.keys()\n\n    # Checking for  requested attack in list of available attacks.\n    if attack_string is None:\n        raise AttributeError(\n            \"Attack type is not specified, \"\n            \"list of available attacks\\t\".join(attacks_list)\n        )\n    if attack_string not in attacks_list:\n        raise AttributeError(\n            \"Attack not available \" \"list of available attacks\\t\".join(attacks_list)\n        )\n    # Mapping attack from string to class.\n    attack_class = AVAILABLE_ATTACKS[attack_string]\n    return attack_class\n\n\ndef mnist_tutorial(\n    train_start=0,\n    train_end=60000,\n    test_start=0,\n    test_end=10000,\n    nb_epochs=NB_EPOCHS,\n    batch_size=BATCH_SIZE,\n    learning_rate=LEARNING_RATE,\n    clean_train=True,\n    testing=False,\n    backprop_through_attack=False,\n    nb_filters=NB_FILTERS,\n    num_threads=None,\n    attack_string=None,\n):\n    \"\"\"\n    MNIST cleverhans tutorial\n    :param train_start: index of first training set example.\n    :param train_end: index of last training set example.\n    :param test_start: index of first test set example.\n    :param test_end: index of last test set example.\n    :param nb_epochs: number of epochs to train model.\n    :param batch_size: size of training batches.\n    :param learning_rate: learning rate for training.\n    :param clean_train: perform normal training on clean examples only\n                        before performing adversarial training.\n    :param testing: if true, complete an AccuracyReport for unit tests\n                    to verify that performance is adequate.\n    :param backprop_through_attack: If True, backprop through adversarial\n                                    example construction process during\n                                    adversarial training.\n    :param nb_filters: number of filters in the CNN used for training.\n    :param num_threads: number of threads used for running the process.\n    :param attack_string: attack name for crafting adversarial attacks and\n                            adversarial training, in string format.\n    :return: an AccuracyReport object\n    \"\"\"\n\n    # Object used to keep track of (and return) key accuracies\n    report = AccuracyReport()\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Set logging level to see debug information\n    set_log_level(logging.DEBUG)\n\n    # Get MNIST test data\n    mnist = MNIST(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n    X_train, Y_train = mnist.get_set(\"train\")\n    X_test, Y_test = mnist.get_set(\"test\")\n\n    # Use label smoothing\n    assert Y_train.shape[1] == 10\n    label_smooth = 0.1\n    Y_train = Y_train.clip(label_smooth / 9.0, 1.0 - label_smooth)\n\n    # Train an MNIST model\n    train_params = {\n        \"nb_epochs\": nb_epochs,\n        \"batch_size\": batch_size,\n        \"learning_rate\": learning_rate,\n    }\n\n    # Initialize the attack object\n    attack_class = attack_selection(attack_string)\n    attack_params = {\"eps\": 0.3, \"clip_min\": 0.0, \"clip_max\": 1.0}\n\n    rng = np.random.RandomState([2018, 6, 18])\n    if clean_train:\n        model = ModelBasicCNNTFE(nb_filters=nb_filters)\n\n        def evaluate_clean():\n            \"\"\"Evaluate the accuracy of the MNIST model on legitimate test\n            examples\n            \"\"\"\n            eval_params = {\"batch_size\": batch_size}\n            acc = model_eval(model, X_test, Y_test, args=eval_params)\n            report.clean_train_clean_eval = acc\n            assert X_test.shape[0] == test_end - test_start, X_test.shape\n            print(\"Test accuracy on legitimate examples: %0.4f\" % acc)\n\n        train(\n            model,\n            X_train,\n            Y_train,\n            evaluate=evaluate_clean,\n            args=train_params,\n            rng=rng,\n            var_list=model.get_params(),\n        )\n\n        if testing:\n            # Calculate training error\n            eval_params = {\"batch_size\": batch_size}\n            acc = model_eval(model, X_train, Y_train, args=eval_params)\n            report.train_clean_train_clean_eval = acc\n\n        # Evaluate the accuracy of the MNIST model on adversarial examples\n        eval_par = {\"batch_size\": batch_size}\n        attack = attack_class(model)\n        acc = model_eval(\n            model,\n            X_test,\n            Y_test,\n            args=eval_par,\n            attack=attack,\n            attack_args=attack_params,\n        )\n        print(\"Test accuracy on adversarial examples: %0.4f\\n\" % acc)\n        report.clean_train_adv_eval = acc\n\n        # Calculate training error\n        if testing:\n            eval_par = {\"batch_size\": batch_size}\n            acc = model_eval(\n                model,\n                X_train,\n                Y_train,\n                args=eval_par,\n                attack=attack,\n                attack_args=attack_params,\n            )\n            print(\"Train accuracy on adversarial examples: %0.4f\\n\" % acc)\n            report.train_clean_train_adv_eval = acc\n\n        attack = None\n        print(\"Repeating the process, using adversarial training\")\n\n    model_adv_train = ModelBasicCNNTFE(nb_filters=nb_filters)\n    attack = attack_class(model_adv_train)\n\n    def evaluate_adv():\n        # Accuracy of adversarially trained model on legitimate test inputs\n        eval_params = {\"batch_size\": batch_size}\n        accuracy = model_eval(model_adv_train, X_test, Y_test, args=eval_params)\n        print(\"Test accuracy on legitimate examples: %0.4f\" % accuracy)\n        report.adv_train_clean_eval = accuracy\n        # Accuracy of the adversarially trained model on adversarial examples\n        accuracy = model_eval(\n            model_adv_train,\n            X_test,\n            Y_test,\n            args=eval_params,\n            attack=attack,\n            attack_args=attack_params,\n        )\n        print(\"Test accuracy on adversarial examples: %0.4f\" % accuracy)\n        report.adv_train_adv_eval = accuracy\n\n    # Perform and evaluate adversarial training\n    train(\n        model_adv_train,\n        X_train,\n        Y_train,\n        evaluate=evaluate_adv,\n        args=train_params,\n        rng=rng,\n        var_list=model_adv_train.get_params(),\n        attack=attack,\n        attack_args=attack_params,\n    )\n\n    # Calculate training errors\n    if testing:\n        eval_params = {\"batch_size\": batch_size}\n        accuracy = model_eval(\n            model_adv_train,\n            X_train,\n            Y_train,\n            args=eval_params,\n            attack=None,\n            attack_args=None,\n        )\n        report.train_adv_train_clean_eval = accuracy\n        accuracy = model_eval(\n            model_adv_train,\n            X_train,\n            Y_train,\n            args=eval_params,\n            attack=attack,\n            attack_args=attack_params,\n        )\n        report.train_adv_train_adv_eval = accuracy\n    return report\n\n\ndef main(argv=None):\n    from cleverhans_tutorials import check_installation\n\n    check_installation(__file__)\n\n    mnist_tutorial(\n        nb_epochs=FLAGS.nb_epochs,\n        batch_size=FLAGS.batch_size,\n        learning_rate=FLAGS.learning_rate,\n        clean_train=FLAGS.clean_train,\n        backprop_through_attack=FLAGS.backprop_through_attack,\n        nb_filters=FLAGS.nb_filters,\n        attack_string=FLAGS.attack,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_filters\", NB_FILTERS, \"Model size multiplier\")\n    flags.DEFINE_integer(\"nb_epochs\", NB_EPOCHS, \"Number of epochs to train model\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Size of training batches\")\n    flags.DEFINE_float(\"learning_rate\", LEARNING_RATE, \"Learning rate for training\")\n    flags.DEFINE_bool(\"clean_train\", True, \"Train on clean examples\")\n    flags.DEFINE_bool(\n        \"backprop_through_attack\",\n        False,\n        (\n            \"If True, backprop through adversarial example \"\n            \"construction process during adversarial training\"\n        ),\n    )\n    flags.DEFINE_string(\n        \"attack\", \"fgsm\", \"Adversarial attack crafted and used for training\"\n    )\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/tutorial_models.py",
    "content": "\"\"\"\nA pure TensorFlow implementation of a neural network. This can be\nused as a drop-in replacement for a Keras model.\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nfrom cleverhans.picklable_model import MLP, Conv2D, ReLU, Flatten, Linear\nfrom cleverhans.picklable_model import Softmax\n\n\ndef make_basic_picklable_cnn(\n    nb_filters=64, nb_classes=10, input_shape=(None, 28, 28, 1)\n):\n    \"\"\"The model for the picklable models tutorial.\"\"\"\n    layers = [\n        Conv2D(nb_filters, (8, 8), (2, 2), \"SAME\"),\n        ReLU(),\n        Conv2D(nb_filters * 2, (6, 6), (2, 2), \"VALID\"),\n        ReLU(),\n        Conv2D(nb_filters * 2, (5, 5), (1, 1), \"VALID\"),\n        ReLU(),\n        Flatten(),\n        Linear(nb_classes),\n        Softmax(),\n    ]\n    model = MLP(layers, input_shape)\n    return model\n"
  },
  {
    "path": "cleverhans_v3.1.0/cleverhans_tutorials/tutorial_models_tfe.py",
    "content": "\"\"\"\nA TensorFlow Eager implementation of a neural network.\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport tensorflow as tf\nfrom cleverhans.model import Model\n\n\nclass ModelBasicCNNTFE(Model):\n    \"\"\"\n    Basic CNN model for tensorflow eager execution.\n    \"\"\"\n\n    def __init__(\n        self, nb_classes=10, nb_filters=64, dummy_input=tf.zeros((32, 28, 28, 1))\n    ):\n        Model.__init__(self, nb_classes=nb_classes)\n\n        # Parametes\n        # number of filters, number of classes.\n        self.nb_filters = nb_filters\n        self.nb_classes = nb_classes\n\n        # Lists for layers attributes.\n        # layer names , layers, layer activations\n        self.layer_names = [\"input\", \"conv_1\", \"conv_2\", \"conv_3\", \"flatten\", \"logits\"]\n        self.layers = {}\n        self.layer_acts = {}\n\n        # layer definitions\n        self.layers[\"conv_1\"] = tf.layers.Conv2D(\n            filters=self.nb_filters,\n            kernel_size=8,\n            strides=2,\n            padding=\"same\",\n            activation=tf.nn.relu,\n        )\n        self.layers[\"conv_2\"] = tf.layers.Conv2D(\n            filters=self.nb_filters * 2,\n            kernel_size=6,\n            strides=2,\n            padding=\"valid\",\n            activation=tf.nn.relu,\n        )\n        self.layers[\"conv_3\"] = tf.layers.Conv2D(\n            filters=self.nb_filters * 2,\n            kernel_size=5,\n            strides=1,\n            padding=\"valid\",\n            activation=tf.nn.relu,\n        )\n        self.layers[\"flatten\"] = tf.layers.Flatten()\n        self.layers[\"logits\"] = tf.layers.Dense(self.nb_classes, activation=None)\n\n        # Dummy fprop to activate the network.\n        self.fprop(dummy_input)\n\n    def fprop(self, x):\n        \"\"\"\n        Forward propagation throught the network\n        :return: dictionary with layer names mapping to activation values.\n        \"\"\"\n\n        # Feed forward through the network layers\n        for layer_name in self.layer_names:\n            if layer_name == \"input\":\n                prev_layer_act = x\n                continue\n            else:\n                self.layer_acts[layer_name] = self.layers[layer_name](prev_layer_act)\n                prev_layer_act = self.layer_acts[layer_name]\n\n        # Adding softmax values to list of activations.\n        self.layer_acts[\"probs\"] = tf.nn.softmax(logits=self.layer_acts[\"logits\"])\n        return self.layer_acts\n\n    def get_layer_params(self, layer_name):\n        \"\"\"\n        Provides access to the parameters of the given layer.\n        Works arounds the non-availability of graph collections in\n                    eager mode.\n        :layer_name: name of the layer for which parameters are\n                    required, must be one of the string in the\n                    list layer_names\n        :return: list of parameters corresponding to the given\n                    layer.\n        \"\"\"\n        assert layer_name in self.layer_names\n\n        out = []\n        layer = self.layers[layer_name]\n        layer_variables = layer.variables\n\n        # For each parameter in a layer.\n        for param in layer_variables:\n            if param not in out:\n                out.append(param)\n        return out\n\n    def get_params(self):\n        \"\"\"\n        Provides access to the model's parameters.\n        Works arounds the non-availability of graph collections in\n                        eager mode.\n        :return: A list of all Variables defining the model parameters.\n        \"\"\"\n        assert tf.executing_eagerly()\n        out = []\n\n        # Collecting params from each layer.\n        for layer_name in self.layers:\n            out += self.get_layer_params(layer_name)\n        return out\n\n    def get_layer_names(self):\n        \"\"\":return: the list of exposed layers for this model.\"\"\"\n        return self.layer_names\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/.nojekyll",
    "content": ""
  },
  {
    "path": "cleverhans_v3.1.0/docs/README.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>&lt;no title&gt; &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <p># Generate documentation</p>\n<p>To generate the documentation do:\n<cite>make github</cite></p>\n<p>The documentation files will be copied to the <cite>cleverhans/docs</cite> directory.</p>\n<p>### Preparation</p>\n<p>Please do:\n<cite>pip install sphinx</cite></p>\n<p>Add a <cite>.nojekyll</cite> file in the <cite>cleverhans/docs</cite> directory. When GitHub sees\na <cite>.nojekyll</cite> file, it serves the root <cite>index.html</cite> file. The <cite>.nojekyll</cite> file\nindicates that we are not using Jekyll as our static site generator in this\nrepository.</p>\n<p>### Enable GitHub Pages for the GitHub repository</p>\n<ol class=\"arabic simple\">\n<li><p>Go to the repository on the GitHub website and make sure you are logged in.</p></li>\n<li><p>Add a /docs directory to the master branch. Otherwise you do not get the\nmaster branch /docs folder for the Source option in the drop-down list.</p></li>\n<li><p>Click the Settings tab. You first go to the Options section.</p></li>\n<li><p>Scroll down to the GitHub Pages section and choose the drop-down list under\nSource. Note: Your choices will differ based on whether you’re in a User repo\nor an Org repository.</p></li>\n<li><p>To keep source and output HTML separate, choose master branch /docs folder\nfor Source.</p></li>\n</ol>\n<p>### Build Sphinx locally and publish on GitHub Pages</p>\n<p>We keep the source docsource and output docs separate, but still are able to\npublish on GitHub Pages and preview builds locally.</p>\n<p>We have the following option in the Makefile:</p>\n<dl class=\"simple\">\n<dt><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a><a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a></dt><dd><dl class=\"simple\">\n<dt>github:</dt><dd><p>&#64;make html\n&#64;cp -a _build/html/. ../docs</p>\n</dd>\n</dl>\n</dd>\n</dl>\n<p><a href=\"#id5\"><span class=\"problematic\" id=\"id6\">``</span></a><a href=\"#id7\"><span class=\"problematic\" id=\"id8\">`</span></a></p>\n<p>Thus, we can run <cite>make github</cite> from the <cite>docsource</cite> directory to generate a\nlocal preview and move the docs where GitHub wants to serve them from.</p>\n<p>### Hacks</p>\n<p>If you cannot build the docs for attacks, uncomment\n<cite>import tensorflow_addons as tfa</cite> in <cite>cleverhans/attacks/spsa.py</cite>.</p>\n<p>Otherwise:</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">`angular2html</span>\n<span class=\"pre\">WARNING:</span> <span class=\"pre\">autodoc:</span> <span class=\"pre\">failed</span> <span class=\"pre\">to</span> <span class=\"pre\">import</span> <span class=\"pre\">module</span> <span class=\"pre\">'attacks'</span> <span class=\"pre\">from</span> <span class=\"pre\">module</span> <span class=\"pre\">'cleverhans';</span> <span class=\"pre\">the</span> <span class=\"pre\">following</span> <span class=\"pre\">exception</span> <span class=\"pre\">was</span> <span class=\"pre\">raised:</span>\n<span class=\"pre\">cannot</span> <span class=\"pre\">import</span> <span class=\"pre\">name</span> <span class=\"pre\">'keras_tensor'</span>\n<span class=\"pre\">`</span></code></p>\n<p>It is convenient to create a virtual environment to install all the specific\nlibraries (e.g. virutalen cleverhans).</p>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/abc.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>abc &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for abc</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"c1\"># Copyright 2007 Google, Inc. All Rights Reserved.</span>\n<span class=\"c1\"># Licensed to PSF under a Contributor Agreement.</span>\n\n<span class=\"sd\">&quot;&quot;&quot;Abstract Base Classes (ABCs) according to PEP 3119.&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">_weakrefset</span> <span class=\"kn\">import</span> <span class=\"n\">WeakSet</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">abstractmethod</span><span class=\"p\">(</span><span class=\"n\">funcobj</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;A decorator indicating abstract methods.</span>\n\n<span class=\"sd\">    Requires that the metaclass is ABCMeta or derived from it.  A</span>\n<span class=\"sd\">    class that has a metaclass derived from ABCMeta cannot be</span>\n<span class=\"sd\">    instantiated unless all of its abstract methods are overridden.</span>\n<span class=\"sd\">    The abstract methods can be called using any of the normal</span>\n<span class=\"sd\">    &#39;super&#39; call mechanisms.</span>\n\n<span class=\"sd\">    Usage:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            @abstractmethod</span>\n<span class=\"sd\">            def my_abstract_method(self, ...):</span>\n<span class=\"sd\">                ...</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">funcobj</span><span class=\"o\">.</span><span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"k\">return</span> <span class=\"n\">funcobj</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">abstractclassmethod</span><span class=\"p\">(</span><span class=\"nb\">classmethod</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A decorator indicating abstract classmethods.</span>\n\n<span class=\"sd\">    Similar to abstractmethod.</span>\n\n<span class=\"sd\">    Usage:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            @abstractclassmethod</span>\n<span class=\"sd\">            def my_abstract_classmethod(cls, ...):</span>\n<span class=\"sd\">                ...</span>\n\n<span class=\"sd\">    &#39;abstractclassmethod&#39; is deprecated. Use &#39;classmethod&#39; with</span>\n<span class=\"sd\">    &#39;abstractmethod&#39; instead.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">callable</span><span class=\"p\">):</span>\n        <span class=\"n\">callable</span><span class=\"o\">.</span><span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">callable</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">abstractstaticmethod</span><span class=\"p\">(</span><span class=\"nb\">staticmethod</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A decorator indicating abstract staticmethods.</span>\n\n<span class=\"sd\">    Similar to abstractmethod.</span>\n\n<span class=\"sd\">    Usage:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            @abstractstaticmethod</span>\n<span class=\"sd\">            def my_abstract_staticmethod(...):</span>\n<span class=\"sd\">                ...</span>\n\n<span class=\"sd\">    &#39;abstractstaticmethod&#39; is deprecated. Use &#39;staticmethod&#39; with</span>\n<span class=\"sd\">    &#39;abstractmethod&#39; instead.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">callable</span><span class=\"p\">):</span>\n        <span class=\"n\">callable</span><span class=\"o\">.</span><span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">callable</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">abstractproperty</span><span class=\"p\">(</span><span class=\"nb\">property</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A decorator indicating abstract properties.</span>\n\n<span class=\"sd\">    Requires that the metaclass is ABCMeta or derived from it.  A</span>\n<span class=\"sd\">    class that has a metaclass derived from ABCMeta cannot be</span>\n<span class=\"sd\">    instantiated unless all of its abstract properties are overridden.</span>\n<span class=\"sd\">    The abstract properties can be called using any of the normal</span>\n<span class=\"sd\">    &#39;super&#39; call mechanisms.</span>\n\n<span class=\"sd\">    Usage:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            @abstractproperty</span>\n<span class=\"sd\">            def my_abstract_property(self):</span>\n<span class=\"sd\">                ...</span>\n\n<span class=\"sd\">    This defines a read-only property; you can also define a read-write</span>\n<span class=\"sd\">    abstract property using the &#39;long&#39; form of property declaration:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            def getx(self): ...</span>\n<span class=\"sd\">            def setx(self, value): ...</span>\n<span class=\"sd\">            x = abstractproperty(getx, setx)</span>\n\n<span class=\"sd\">    &#39;abstractproperty&#39; is deprecated. Use &#39;property&#39; with &#39;abstractmethod&#39;</span>\n<span class=\"sd\">    instead.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n\n<div class=\"viewcode-block\" id=\"ABCMeta\"><a class=\"viewcode-back\" href=\"../source/attacks.html#cleverhans.attacks.ABCMeta\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">ABCMeta</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">):</span>\n\n    <span class=\"sd\">&quot;&quot;&quot;Metaclass for defining Abstract Base Classes (ABCs).</span>\n\n<span class=\"sd\">    Use this metaclass to create an ABC.  An ABC can be subclassed</span>\n<span class=\"sd\">    directly, and then acts as a mix-in class.  You can also register</span>\n<span class=\"sd\">    unrelated concrete classes (even built-in classes) and unrelated</span>\n<span class=\"sd\">    ABCs as &#39;virtual subclasses&#39; -- these and their descendants will</span>\n<span class=\"sd\">    be considered subclasses of the registering ABC by the built-in</span>\n<span class=\"sd\">    issubclass() function, but the registering ABC won&#39;t show up in</span>\n<span class=\"sd\">    their MRO (Method Resolution Order) nor will method</span>\n<span class=\"sd\">    implementations defined by the registering ABC be callable (not</span>\n<span class=\"sd\">    even via super()).</span>\n\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># A global counter that is incremented each time a class is</span>\n    <span class=\"c1\"># registered as a virtual subclass of anything.  It forces the</span>\n    <span class=\"c1\"># negative cache to be cleared before its next use.</span>\n    <span class=\"c1\"># Note: this counter is private. Use `abc.get_cache_token()` for</span>\n    <span class=\"c1\">#       external code.</span>\n    <span class=\"n\">_abc_invalidation_counter</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__new__</span><span class=\"p\">(</span><span class=\"n\">mcls</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">bases</span><span class=\"p\">,</span> <span class=\"n\">namespace</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"bp\">cls</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__new__</span><span class=\"p\">(</span><span class=\"n\">mcls</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">bases</span><span class=\"p\">,</span> <span class=\"n\">namespace</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"c1\"># Compute set of abstract method names</span>\n        <span class=\"n\">abstracts</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">name</span>\n                     <span class=\"k\">for</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">namespace</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()</span>\n                     <span class=\"k\">if</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"s2\">&quot;__isabstractmethod__&quot;</span><span class=\"p\">,</span> <span class=\"kc\">False</span><span class=\"p\">)}</span>\n        <span class=\"k\">for</span> <span class=\"n\">base</span> <span class=\"ow\">in</span> <span class=\"n\">bases</span><span class=\"p\">:</span>\n            <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">base</span><span class=\"p\">,</span> <span class=\"s2\">&quot;__abstractmethods__&quot;</span><span class=\"p\">,</span> <span class=\"nb\">set</span><span class=\"p\">()):</span>\n                <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n                <span class=\"k\">if</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"s2\">&quot;__isabstractmethod__&quot;</span><span class=\"p\">,</span> <span class=\"kc\">False</span><span class=\"p\">):</span>\n                    <span class=\"n\">abstracts</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">)</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">__abstractmethods__</span> <span class=\"o\">=</span> <span class=\"nb\">frozenset</span><span class=\"p\">(</span><span class=\"n\">abstracts</span><span class=\"p\">)</span>\n        <span class=\"c1\"># Set up inheritance registry</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_registry</span> <span class=\"o\">=</span> <span class=\"n\">WeakSet</span><span class=\"p\">()</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span> <span class=\"o\">=</span> <span class=\"n\">WeakSet</span><span class=\"p\">()</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span> <span class=\"o\">=</span> <span class=\"n\">WeakSet</span><span class=\"p\">()</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache_version</span> <span class=\"o\">=</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span>\n        <span class=\"k\">return</span> <span class=\"bp\">cls</span>\n\n<div class=\"viewcode-block\" id=\"ABCMeta.register\"><a class=\"viewcode-back\" href=\"../source/attacks.html#cleverhans.attacks.ABCMeta.register\">[docs]</a>    <span class=\"k\">def</span> <span class=\"nf\">register</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">subclass</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Register a virtual subclass of an ABC.</span>\n\n<span class=\"sd\">        Returns the subclass, to allow usage as a class decorator.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"nb\">type</span><span class=\"p\">):</span>\n            <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Can only register classes&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"nb\">issubclass</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"bp\">cls</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"n\">subclass</span>  <span class=\"c1\"># Already a subclass</span>\n        <span class=\"c1\"># Subtle: test for cycles *after* testing for &quot;already a subclass&quot;;</span>\n        <span class=\"c1\"># this means we allow X.register(X) and interpret it as a no-op.</span>\n        <span class=\"k\">if</span> <span class=\"nb\">issubclass</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">subclass</span><span class=\"p\">):</span>\n            <span class=\"c1\"># This would create a cycle, which is bad for the algorithm below</span>\n            <span class=\"k\">raise</span> <span class=\"ne\">RuntimeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Refusing to create an inheritance cycle&quot;</span><span class=\"p\">)</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_registry</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n        <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span> <span class=\"o\">+=</span> <span class=\"mi\">1</span>  <span class=\"c1\"># Invalidate negative cache</span>\n        <span class=\"k\">return</span> <span class=\"n\">subclass</span></div>\n\n    <span class=\"k\">def</span> <span class=\"nf\">_dump_registry</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">file</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Debug helper to print the ABC registry.&quot;&quot;&quot;</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Class: </span><span class=\"si\">%s</span><span class=\"s2\">.</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"vm\">__module__</span><span class=\"p\">,</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"vm\">__qualname__</span><span class=\"p\">),</span> <span class=\"n\">file</span><span class=\"o\">=</span><span class=\"n\">file</span><span class=\"p\">)</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Inv.counter: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span><span class=\"p\">,</span> <span class=\"n\">file</span><span class=\"o\">=</span><span class=\"n\">file</span><span class=\"p\">)</span>\n        <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"nb\">sorted</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"vm\">__dict__</span><span class=\"p\">):</span>\n            <span class=\"k\">if</span> <span class=\"n\">name</span><span class=\"o\">.</span><span class=\"n\">startswith</span><span class=\"p\">(</span><span class=\"s2\">&quot;_abc_&quot;</span><span class=\"p\">):</span>\n                <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">)</span>\n                <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">WeakSet</span><span class=\"p\">):</span>\n                    <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n                <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">: </span><span class=\"si\">%r</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">),</span> <span class=\"n\">file</span><span class=\"o\">=</span><span class=\"n\">file</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__instancecheck__</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">instance</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Override for isinstance(instance, cls).&quot;&quot;&quot;</span>\n        <span class=\"c1\"># Inline the cache checking</span>\n        <span class=\"n\">subclass</span> <span class=\"o\">=</span> <span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"vm\">__class__</span>\n        <span class=\"k\">if</span> <span class=\"n\">subclass</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"n\">subtype</span> <span class=\"o\">=</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">subtype</span> <span class=\"ow\">is</span> <span class=\"n\">subclass</span><span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache_version</span> <span class=\"o\">==</span>\n                <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span> <span class=\"ow\">and</span>\n                <span class=\"n\">subclass</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span><span class=\"p\">):</span>\n                <span class=\"k\">return</span> <span class=\"kc\">False</span>\n            <span class=\"c1\"># Fall back to the subclass check.</span>\n            <span class=\"k\">return</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"fm\">__subclasscheck__</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">any</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"fm\">__subclasscheck__</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">c</span> <span class=\"ow\">in</span> <span class=\"p\">{</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"n\">subtype</span><span class=\"p\">})</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__subclasscheck__</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">subclass</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Override for issubclass(subclass, cls).&quot;&quot;&quot;</span>\n        <span class=\"c1\"># Check cache</span>\n        <span class=\"k\">if</span> <span class=\"n\">subclass</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"c1\"># Check negative cache; may have to invalidate</span>\n        <span class=\"k\">if</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache_version</span> <span class=\"o\">&lt;</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span><span class=\"p\">:</span>\n            <span class=\"c1\"># Invalidate the negative cache</span>\n            <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span> <span class=\"o\">=</span> <span class=\"n\">WeakSet</span><span class=\"p\">()</span>\n            <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache_version</span> <span class=\"o\">=</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span>\n        <span class=\"k\">elif</span> <span class=\"n\">subclass</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">False</span>\n        <span class=\"c1\"># Check the subclass hook</span>\n        <span class=\"n\">ok</span> <span class=\"o\">=</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">__subclasshook__</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">ok</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"bp\">NotImplemented</span><span class=\"p\">:</span>\n            <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">ok</span><span class=\"p\">,</span> <span class=\"nb\">bool</span><span class=\"p\">)</span>\n            <span class=\"k\">if</span> <span class=\"n\">ok</span><span class=\"p\">:</span>\n                <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n            <span class=\"k\">else</span><span class=\"p\">:</span>\n                <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"n\">ok</span>\n        <span class=\"c1\"># Check if it&#39;s a direct subclass</span>\n        <span class=\"k\">if</span> <span class=\"bp\">cls</span> <span class=\"ow\">in</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"s1\">&#39;__mro__&#39;</span><span class=\"p\">,</span> <span class=\"p\">()):</span>\n            <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"c1\"># Check if it&#39;s a subclass of a registered class (recursive)</span>\n        <span class=\"k\">for</span> <span class=\"n\">rcls</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_registry</span><span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"nb\">issubclass</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"n\">rcls</span><span class=\"p\">):</span>\n                <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n                <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"c1\"># Check if it&#39;s a subclass of a subclass (recursive)</span>\n        <span class=\"k\">for</span> <span class=\"n\">scls</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">__subclasses__</span><span class=\"p\">():</span>\n            <span class=\"k\">if</span> <span class=\"nb\">issubclass</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"n\">scls</span><span class=\"p\">):</span>\n                <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n                <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"c1\"># No dice; update negative cache</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"kc\">False</span></div>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ABC</span><span class=\"p\">(</span><span class=\"n\">metaclass</span><span class=\"o\">=</span><span class=\"n\">ABCMeta</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Helper class that provides a standard way to create an ABC using</span>\n<span class=\"sd\">    inheritance.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">pass</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">get_cache_token</span><span class=\"p\">():</span>\n    <span class=\"sd\">&quot;&quot;&quot;Returns the current ABC cache token.</span>\n\n<span class=\"sd\">    The token is an opaque object (supporting equality testing) identifying the</span>\n<span class=\"sd\">    current version of the ABC cache for virtual subclasses. The token changes</span>\n<span class=\"sd\">    with every call to ``register()`` on any ABC.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n  <li><a href=\"index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/attack.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.attack &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.attack</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The Attack interface.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">abc</span> <span class=\"kn\">import</span> <span class=\"n\">ABCMeta</span>\n<span class=\"kn\">import</span> <span class=\"nn\">collections</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.attack&quot;</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"Attack\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">Attack</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Abstract base class for all attack classes.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">__metaclass__</span> <span class=\"o\">=</span> <span class=\"n\">ABCMeta</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param model: An instance of the cleverhans.model.Model class.</span>\n<span class=\"sd\">    :param sess: The (possibly optional) tf.Session to run graphs in.</span>\n<span class=\"sd\">    :param dtypestr: Floating point precision to use (change to float64</span>\n<span class=\"sd\">                     to avoid numerical instabilities).</span>\n<span class=\"sd\">    :param back: (deprecated and will be removed on or after 2019-03-26).</span>\n<span class=\"sd\">                 The backend to use. Currently &#39;tf&#39; is the only option.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;back&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;back&#39;</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;tf&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Argument back to attack constructors is not needed&quot;</span>\n                      <span class=\"s2\">&quot; anymore and will be removed on or after 2019-03-26.&quot;</span>\n                      <span class=\"s2\">&quot; All attacks are implemented using TensorFlow.&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Backend argument must be &#39;tf&#39; and is now deprecated&quot;</span>\n                         <span class=\"s2\">&quot;It will be removed on or after 2019-03-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"n\">dtypestr</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"n\">dtypestr</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Session</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;sess is not an instance of tf.Session&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">attacks_tf</span>\n    <span class=\"n\">attacks_tf</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span>\n    <span class=\"n\">attacks_tf</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span>\n\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;The model argument should be an instance of&quot;</span>\n                      <span class=\"s2\">&quot; the cleverhans.model.Model class.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Prepare attributes</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">model</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">sess</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dtypestr</span> <span class=\"o\">=</span> <span class=\"n\">dtypestr</span>\n\n    <span class=\"c1\"># We are going to keep track of old graphs and cache them.</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n\n    <span class=\"c1\"># When calling generate_np, arguments in the following set should be</span>\n    <span class=\"c1\"># fed into the graph, as they are not structural items that require</span>\n    <span class=\"c1\"># generating a new graph.</span>\n    <span class=\"c1\"># This dict should map names of arguments to the types they should</span>\n    <span class=\"c1\"># have.</span>\n    <span class=\"c1\"># (Usually, the target class will be a feedable keyword argument.)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># When calling generate_np, arguments in the following set should NOT</span>\n    <span class=\"c1\"># be fed into the graph, as they ARE structural items that require</span>\n    <span class=\"c1\"># generating a new graph.</span>\n    <span class=\"c1\"># This list should contain the names of the structural arguments.</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n<div class=\"viewcode-block\" id=\"Attack.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate the attack&#39;s symbolic graph for adversarial examples. This</span>\n<span class=\"sd\">    method should be overriden in any child class that implements an</span>\n<span class=\"sd\">    attack that is expressable symbolically. Otherwise, it will wrap the</span>\n<span class=\"sd\">    numerical implementation as a symbolic operator.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param **kwargs: optional parameters used by child classes.</span>\n<span class=\"sd\">      Each child class defines additional parameters as needed.</span>\n<span class=\"sd\">      Child classes that use the following concepts should use the following</span>\n<span class=\"sd\">      names:</span>\n<span class=\"sd\">        clip_min: minimum feature value</span>\n<span class=\"sd\">        clip_max: maximum feature value</span>\n<span class=\"sd\">        eps: size of norm constraint on adversarial perturbation</span>\n<span class=\"sd\">        ord: order of norm constraint</span>\n<span class=\"sd\">        nb_iter: number of iterations</span>\n<span class=\"sd\">        eps_iter: size of norm constraint on iteration</span>\n<span class=\"sd\">        y_target: if specified, the attack is targeted.</span>\n<span class=\"sd\">        y: Do not specify if y_target is specified.</span>\n<span class=\"sd\">           If specified, the attack is untargeted, aims to make the output</span>\n<span class=\"sd\">           class not be y.</span>\n<span class=\"sd\">           If neither y_target nor y is specified, y is inferred by having</span>\n<span class=\"sd\">           the model classify the input.</span>\n<span class=\"sd\">      For other concepts, it&#39;s generally a good idea to read other classes</span>\n<span class=\"sd\">      and check for name consistency.</span>\n<span class=\"sd\">    :return: A symbolic representation of the adversarial examples.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">error</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Sub-classes must implement generate.&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"n\">error</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Include an unused return so pylint understands the method signature</span>\n    <span class=\"k\">return</span> <span class=\"n\">x</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.construct_graph\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.construct_graph\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">construct_graph</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">fixed</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">hash_key</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Construct the graph required to run the attack through generate_np.</span>\n\n<span class=\"sd\">    :param fixed: Structural elements that require defining a new graph.</span>\n<span class=\"sd\">    :param feedable: Arguments that can be fed to the same graph when</span>\n<span class=\"sd\">                     they take different values.</span>\n<span class=\"sd\">    :param x_val: symbolic adversarial example</span>\n<span class=\"sd\">    :param hash_key: the key used to store this graph in our cache</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># try our very best to create a TF placeholder for each of the</span>\n    <span class=\"c1\"># feedable keyword arguments, and check the types are one of</span>\n    <span class=\"c1\"># the allowed types</span>\n    <span class=\"n\">class_name</span> <span class=\"o\">=</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"vm\">__class__</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;.&quot;</span><span class=\"p\">)[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">][:</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n    <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Constructing new graph for attack &quot;</span> <span class=\"o\">+</span> <span class=\"n\">class_name</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># remove the None arguments, they are just left blank</span>\n    <span class=\"k\">for</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">feedable</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()):</span>\n      <span class=\"k\">if</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">del</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># process all of the rest and create placeholders for them</span>\n    <span class=\"n\">new_kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">dict</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">fixed</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">())</span>\n    <span class=\"k\">for</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">feedable</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">():</span>\n      <span class=\"n\">given_type</span> <span class=\"o\">=</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">dtype</span>\n      <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ndarray</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">ndim</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"c1\"># This is pretty clearly not a batch of data</span>\n          <span class=\"n\">new_kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">given_type</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"c1\"># Assume that this is a batch of data, make the first axis variable</span>\n          <span class=\"c1\"># in size</span>\n          <span class=\"n\">new_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n          <span class=\"n\">new_kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">given_type</span><span class=\"p\">,</span> <span class=\"n\">new_shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">)</span>\n      <span class=\"k\">elif</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">known_number_types</span><span class=\"p\">):</span>\n        <span class=\"n\">new_kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">given_type</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">)</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Could not identify type of argument &quot;</span> <span class=\"o\">+</span>\n                         <span class=\"n\">name</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;: &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># x is a special placeholder we always want to have</span>\n    <span class=\"n\">x_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">:]</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"n\">x_shape</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># now we generate the graph that we want</span>\n    <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">generate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">new_kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span><span class=\"p\">[</span><span class=\"n\">hash_key</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">new_kwargs</span><span class=\"p\">,</span> <span class=\"n\">x_adv</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">10</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Calling generate_np() with multiple different &quot;</span>\n                    <span class=\"s2\">&quot;structural parameters is inefficient and should&quot;</span>\n                    <span class=\"s2\">&quot; be avoided. Calling generate() is preferred.&quot;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.generate_np\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.generate_np\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate_np</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate adversarial examples and return them as a NumPy array.</span>\n<span class=\"sd\">    Sub-classes *should not* implement this method unless they must</span>\n<span class=\"sd\">    perform special handling of arguments.</span>\n\n<span class=\"sd\">    :param x_val: A NumPy array with the original inputs.</span>\n<span class=\"sd\">    :param **kwargs: optional parameters used by child classes.</span>\n<span class=\"sd\">    :return: A NumPy array holding the adversarial examples.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Cannot use `generate_np` when no `sess` was&quot;</span>\n                       <span class=\"s2\">&quot; provided&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"n\">packed</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">construct_variables</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">fixed</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">hash_key</span> <span class=\"o\">=</span> <span class=\"n\">packed</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">hash_key</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">construct_graph</span><span class=\"p\">(</span><span class=\"n\">fixed</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">hash_key</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># remove the None arguments, they are just left blank</span>\n      <span class=\"k\">for</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">feedable</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()):</span>\n        <span class=\"k\">if</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n          <span class=\"k\">del</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span>\n\n    <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">new_kwargs</span><span class=\"p\">,</span> <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span><span class=\"p\">[</span><span class=\"n\">hash_key</span><span class=\"p\">]</span>\n\n    <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">x_val</span><span class=\"p\">}</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">feedable</span><span class=\"p\">:</span>\n      <span class=\"n\">feed_dict</span><span class=\"p\">[</span><span class=\"n\">new_kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]]</span> <span class=\"o\">=</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span>\n\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">x_adv</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.construct_variables\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.construct_variables\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">construct_variables</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Construct the inputs to the attack graph to be used by generate_np.</span>\n\n<span class=\"sd\">    :param kwargs: Keyword arguments to generate_np.</span>\n<span class=\"sd\">    :return:</span>\n<span class=\"sd\">      Structural arguments</span>\n<span class=\"sd\">      Feedable arguments</span>\n<span class=\"sd\">      Output of `arg_type` describing feedable arguments</span>\n<span class=\"sd\">      A unique key</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span><span class=\"p\">,</span> <span class=\"nb\">dict</span><span class=\"p\">):</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Using a dict for `feedable_kwargs is deprecated.&quot;</span>\n                    <span class=\"s2\">&quot;Switch to using a tuple.&quot;</span>\n                    <span class=\"s2\">&quot;It is not longer necessary to specify the types &quot;</span>\n                    <span class=\"s2\">&quot;of the arguments---we build a different graph &quot;</span>\n                    <span class=\"s2\">&quot;for each received type.&quot;</span>\n                    <span class=\"s2\">&quot;Using a dict may become an error on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-18.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">feedable_names</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"nb\">sorted</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">feedable_names</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span>\n      <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">feedable_names</span><span class=\"p\">,</span> <span class=\"nb\">tuple</span><span class=\"p\">):</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Attack.feedable_kwargs should be a tuple, but &quot;</span>\n                        <span class=\"s2\">&quot;for subclass &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; it is &quot;</span>\n                        <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; of type &quot;</span>\n                        <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># the set of arguments that are structural properties of the attack</span>\n    <span class=\"c1\"># if these arguments are different, we must construct a new graph</span>\n    <span class=\"n\">fixed</span> <span class=\"o\">=</span> <span class=\"nb\">dict</span><span class=\"p\">(</span>\n        <span class=\"p\">(</span><span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># the set of arguments that are passed as placeholders to the graph</span>\n    <span class=\"c1\"># on each call, and can change without constructing a new graph</span>\n    <span class=\"n\">feedable</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">k</span><span class=\"p\">:</span> <span class=\"n\">v</span> <span class=\"k\">for</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"n\">feedable_names</span><span class=\"p\">}</span>\n    <span class=\"k\">for</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"n\">feedable</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">],</span> <span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">)):</span>\n        <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">])</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">key</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">key</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">fixed</span> <span class=\"ow\">and</span> <span class=\"n\">key</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">feedable</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;: Undeclared argument: &quot;</span> <span class=\"o\">+</span> <span class=\"n\">key</span><span class=\"p\">)</span>\n\n    <span class=\"n\">feed_arg_type</span> <span class=\"o\">=</span> <span class=\"n\">arg_type</span><span class=\"p\">(</span><span class=\"n\">feedable_names</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">all</span><span class=\"p\">(</span><span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">collections</span><span class=\"o\">.</span><span class=\"n\">Hashable</span><span class=\"p\">)</span>\n               <span class=\"k\">for</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">fixed</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()):</span>\n      <span class=\"c1\"># we have received a fixed value that isn&#39;t hashable</span>\n      <span class=\"c1\"># this means we can&#39;t cache this graph for later use,</span>\n      <span class=\"c1\"># and it will have to be discarded later</span>\n      <span class=\"n\">hash_key</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># create a unique key for this set of fixed paramaters</span>\n      <span class=\"n\">hash_key</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"nb\">sorted</span><span class=\"p\">(</span><span class=\"n\">fixed</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()))</span> <span class=\"o\">+</span> <span class=\"nb\">tuple</span><span class=\"p\">([</span><span class=\"n\">feed_arg_type</span><span class=\"p\">])</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">fixed</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">,</span> <span class=\"n\">feed_arg_type</span><span class=\"p\">,</span> <span class=\"n\">hash_key</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.get_or_guess_labels\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.get_or_guess_labels\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Get the label to use in generating an adversarial example for x.</span>\n<span class=\"sd\">    The kwargs are fed directly from the kwargs of the attack.</span>\n<span class=\"sd\">    If &#39;y&#39; is in kwargs, then assume it&#39;s an untargeted attack and</span>\n<span class=\"sd\">    use that as the label.</span>\n<span class=\"sd\">    If &#39;y_target&#39; is in kwargs and is not none, then assume it&#39;s a</span>\n<span class=\"sd\">    targeted attack and use that as the label.</span>\n<span class=\"sd\">    Otherwise, use the model&#39;s prediction as the label and perform an</span>\n<span class=\"sd\">    untargeted attack.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Can not set both &#39;y&#39; and &#39;y_target&#39;.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">elif</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">]</span>\n    <span class=\"k\">elif</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n      <span class=\"n\">original_predictions</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n      <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">original_predictions</span><span class=\"p\">)</span>\n      <span class=\"k\">del</span> <span class=\"n\">preds</span>\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ndarray</span><span class=\"p\">):</span>\n      <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">labels</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">labels</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    :param params: a dictionary of attack-specific parameters</span>\n<span class=\"sd\">    :return: True when parsing was successful</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">params</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`params` is unused and will be removed &quot;</span>\n                    <span class=\"s2\">&quot; on or after 2019-04-26.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">arg_type</span><span class=\"p\">(</span><span class=\"n\">arg_names</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Returns a hashable summary of the types of arg_names within kwargs.</span>\n<span class=\"sd\">  :param arg_names: tuple containing names of relevant arguments</span>\n<span class=\"sd\">  :param kwargs: dict mapping string argument names to values.</span>\n<span class=\"sd\">    These must be values for which we can create a tf placeholder.</span>\n<span class=\"sd\">    Currently supported: numpy darray or something that can ducktype it</span>\n<span class=\"sd\">  returns:</span>\n<span class=\"sd\">    API contract is to return a hashable object describing all</span>\n<span class=\"sd\">    structural consequences of argument values that can otherwise</span>\n<span class=\"sd\">    be fed into a graph of fixed structure.</span>\n<span class=\"sd\">    Currently this is implemented as a tuple of tuples that track:</span>\n<span class=\"sd\">      - whether each argument was passed</span>\n<span class=\"sd\">      - whether each argument was passed and not None</span>\n<span class=\"sd\">      - the dtype of each argument</span>\n<span class=\"sd\">    Callers shouldn&#39;t rely on the exact structure of this object,</span>\n<span class=\"sd\">    just its hashability and one-to-one mapping between graph structures.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">arg_names</span><span class=\"p\">,</span> <span class=\"nb\">tuple</span><span class=\"p\">)</span>\n  <span class=\"n\">passed</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">arg_names</span><span class=\"p\">)</span>\n  <span class=\"n\">passed_and_not_none</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n  <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">arg_names</span><span class=\"p\">:</span>\n    <span class=\"k\">if</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">passed_and_not_none</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">passed_and_not_none</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n  <span class=\"n\">passed_and_not_none</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"n\">passed_and_not_none</span><span class=\"p\">)</span>\n  <span class=\"n\">dtypes</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n  <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">arg_names</span><span class=\"p\">:</span>\n    <span class=\"k\">if</span> <span class=\"n\">name</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">dtypes</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n      <span class=\"k\">continue</span>\n    <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">dtypes</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n      <span class=\"k\">continue</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dtype&#39;</span><span class=\"p\">),</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n    <span class=\"n\">dtype</span> <span class=\"o\">=</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">dtype</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">):</span>\n      <span class=\"n\">dtype</span> <span class=\"o\">=</span> <span class=\"n\">dtype</span><span class=\"o\">.</span><span class=\"n\">as_np_dtype</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">dtypes</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n  <span class=\"n\">dtypes</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"n\">dtypes</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"n\">passed</span><span class=\"p\">,</span> <span class=\"n\">passed_and_not_none</span><span class=\"p\">,</span> <span class=\"n\">dtypes</span><span class=\"p\">)</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/basic_iterative_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.basic_iterative_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.basic_iterative_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The BasicIterativeMethod attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.projected_gradient_descent</span> <span class=\"kn\">import</span> <span class=\"n\">ProjectedGradientDescent</span>\n\n\n<div class=\"viewcode-block\" id=\"BasicIterativeMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.BasicIterativeMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">BasicIterativeMethod</span><span class=\"p\">(</span><span class=\"n\">ProjectedGradientDescent</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The BasicIterativeMethod attack.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">BasicIterativeMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                                               <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                               <span class=\"n\">default_rand_init</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                                               <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/carlini_wagner_l2.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.carlini_wagner_l2 &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.carlini_wagner_l2</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The CarliniWagnerL2 attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n\n<span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.carlini_wagner_l2&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"CarliniWagnerL2\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.CarliniWagnerL2\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">CarliniWagnerL2</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This attack was originally proposed by Carlini and Wagner. It is an</span>\n<span class=\"sd\">  iterative attack that finds adversarial examples on many defenses that</span>\n<span class=\"sd\">  are robust to other attacks.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1608.04644</span>\n\n<span class=\"sd\">  At a high level, this attack is an iterative attack using Adam and</span>\n<span class=\"sd\">  a specially-chosen loss function to find adversarial examples with</span>\n<span class=\"sd\">  lower distortion than other attacks. This comes at the cost of speed,</span>\n<span class=\"sd\">  as this attack is often much slower than others.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">CarliniWagnerL2</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;batch_size&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;confidence&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;targeted&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;learning_rate&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;binary_search_steps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;max_iterations&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;abort_early&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;initial_const&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"CarliniWagnerL2.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.CarliniWagnerL2.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param x: A tensor with the inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">attack</span> <span class=\"o\">=</span> <span class=\"n\">CWL2</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">confidence</span><span class=\"p\">,</span>\n                  <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">,</span>\n                  <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span><span class=\"p\">,</span>\n                  <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">abort_early</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                  <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">,</span>\n                  <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cw_wrap</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">attack</span><span class=\"o\">.</span><span class=\"n\">attack</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">cw_wrap</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"CarliniWagnerL2.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.CarliniWagnerL2.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n                   <span class=\"n\">confidence</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"mf\">5e-3</span><span class=\"p\">,</span>\n                   <span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"mi\">1000</span><span class=\"p\">,</span>\n                   <span class=\"n\">abort_early</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"mf\">1e-2</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels for an untargeted</span>\n<span class=\"sd\">              attack. If None (and y_target is None) then use the</span>\n<span class=\"sd\">              original labels the classifier assigns.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the target labels for a</span>\n<span class=\"sd\">              targeted attack.</span>\n<span class=\"sd\">    :param confidence: Confidence of adversarial examples: higher produces</span>\n<span class=\"sd\">                       examples with larger l2 distortion, but more</span>\n<span class=\"sd\">                       strongly classified as adversarial.</span>\n<span class=\"sd\">    :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">    :param learning_rate: The learning rate for the attack algorithm.</span>\n<span class=\"sd\">                          Smaller values produce better results but are</span>\n<span class=\"sd\">                          slower to converge.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the purturbation</span>\n<span class=\"sd\">                                and confidence of the classification.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations. Setting this</span>\n<span class=\"sd\">                           to a larger value will produce lower distortion</span>\n<span class=\"sd\">                           results. Using only a few iterations requires</span>\n<span class=\"sd\">                           a larger learning rate, and will produce larger</span>\n<span class=\"sd\">                           distortion results.</span>\n<span class=\"sd\">    :param abort_early: If true, allows early aborts if gradient descent</span>\n<span class=\"sd\">                        is unable to make progress (i.e., gets stuck in</span>\n<span class=\"sd\">                        a local minimum).</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the perturbation</span>\n<span class=\"sd\">                          and confidence of classification.</span>\n<span class=\"sd\">                          If binary_search_steps is large, the initial</span>\n<span class=\"sd\">                          constant is not important. A smaller value of</span>\n<span class=\"sd\">                          this constant gives lower distortion results.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ignore the y and y_target argument</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">confidence</span> <span class=\"o\">=</span> <span class=\"n\">confidence</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span> <span class=\"o\">=</span> <span class=\"n\">learning_rate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">abort_early</span> <span class=\"o\">=</span> <span class=\"n\">abort_early</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">ZERO</span><span class=\"p\">():</span>\n  <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CWL2</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">confidence</span><span class=\"p\">,</span> <span class=\"n\">targeted</span><span class=\"p\">,</span>\n               <span class=\"n\">learning_rate</span><span class=\"p\">,</span> <span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"n\">max_iterations</span><span class=\"p\">,</span>\n               <span class=\"n\">abort_early</span><span class=\"p\">,</span> <span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">,</span>\n               <span class=\"n\">shape</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param sess: a TF session.</span>\n<span class=\"sd\">    :param model: a cleverhans.model.Model object.</span>\n<span class=\"sd\">    :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">    :param confidence: Confidence of adversarial examples: higher produces</span>\n<span class=\"sd\">                       examples with larger l2 distortion, but more</span>\n<span class=\"sd\">                       strongly classified as adversarial.</span>\n<span class=\"sd\">    :param targeted: boolean controlling the behavior of the adversarial</span>\n<span class=\"sd\">                     examples produced. If set to False, they will be</span>\n<span class=\"sd\">                     misclassified in any wrong class. If set to True,</span>\n<span class=\"sd\">                     they will be misclassified in a chosen target class.</span>\n<span class=\"sd\">    :param learning_rate: The learning rate for the attack algorithm.</span>\n<span class=\"sd\">                          Smaller values produce better results but are</span>\n<span class=\"sd\">                          slower to converge.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the purturbation</span>\n<span class=\"sd\">                                and confidence of the classification.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations. Setting this</span>\n<span class=\"sd\">                           to a larger value will produce lower distortion</span>\n<span class=\"sd\">                           results. Using only a few iterations requires</span>\n<span class=\"sd\">                           a larger learning rate, and will produce larger</span>\n<span class=\"sd\">                           distortion results.</span>\n<span class=\"sd\">    :param abort_early: If true, allows early aborts if gradient descent</span>\n<span class=\"sd\">                        is unable to make progress (i.e., gets stuck in</span>\n<span class=\"sd\">                        a local minimum).</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the pururbation</span>\n<span class=\"sd\">                          and confidence of classification.</span>\n<span class=\"sd\">                          If binary_search_steps is large, the initial</span>\n<span class=\"sd\">                          constant is not important. A smaller value of</span>\n<span class=\"sd\">                          this constant gives lower distortion results.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value.</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value.</span>\n<span class=\"sd\">    :param num_labels: the number of classes in the model&#39;s output.</span>\n<span class=\"sd\">    :param shape: the shape of the model&#39;s input tensor.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">sess</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span> <span class=\"o\">=</span> <span class=\"n\">targeted</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">LEARNING_RATE</span> <span class=\"o\">=</span> <span class=\"n\">learning_rate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ABORT_EARLY</span> <span class=\"o\">=</span> <span class=\"n\">abort_early</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span> <span class=\"o\">=</span> <span class=\"n\">confidence</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">model</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">10</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">([</span><span class=\"n\">batch_size</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># the variable we&#39;re going to optimize over</span>\n    <span class=\"n\">modifier</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np_dtype</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># these are variables to be more efficient in sending data to tf</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;timg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">)),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;tlab&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># and here&#39;s what we use to assign them</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_timg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_tlab&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">batch_size</span><span class=\"p\">],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># the resulting instance, tanh&#39;d to keep bounded from clip_min</span>\n    <span class=\"c1\"># to clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">tanh</span><span class=\"p\">(</span><span class=\"n\">modifier</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"o\">-</span> <span class=\"n\">clip_min</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">clip_min</span>\n\n    <span class=\"c1\"># prediction BEFORE-SOFTMAX of the model</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># distance to the input data</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">other</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">tanh</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">/</span> \\\n        <span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"o\">-</span> <span class=\"n\">clip_min</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">other</span><span class=\"p\">),</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n\n    <span class=\"c1\"># compute the probability of the label class versus the maximum other</span>\n    <span class=\"n\">real</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">other</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">((</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">*</span> <span class=\"mi\">10000</span><span class=\"p\">,</span>\n                       <span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n      <span class=\"c1\"># if targeted, optimize for making the other class most likely</span>\n      <span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">other</span> <span class=\"o\">-</span> <span class=\"n\">real</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># if untargeted, optimize for making this class least likely.</span>\n      <span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">real</span> <span class=\"o\">-</span> <span class=\"n\">other</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># sum up the losses</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">*</span> <span class=\"n\">loss1</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2</span>\n\n    <span class=\"c1\"># Setup the adam optimizer and keep track of variables we&#39;re creating</span>\n    <span class=\"n\">start_vars</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">())</span>\n    <span class=\"n\">optimizer</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">AdamOptimizer</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">LEARNING_RATE</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">train</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">modifier</span><span class=\"p\">])</span>\n    <span class=\"n\">end_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">()</span>\n    <span class=\"n\">new_vars</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">x</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">end_vars</span> <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">start_vars</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># these are the variables to initialize when we run</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span><span class=\"p\">))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span><span class=\"p\">))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span><span class=\"p\">))</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">init</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">variables_initializer</span><span class=\"p\">(</span><span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">modifier</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">new_vars</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Perform the L_2 attack on the given instance for the given targets.</span>\n\n<span class=\"sd\">    If self.targeted is true, then the targets represents the target labels</span>\n<span class=\"sd\">    If self.targeted is false, then targets are the original class labels</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">),</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span>\n          <span class=\"p\">(</span><span class=\"s2\">&quot;Running CWL2 attack on instance </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)))</span>\n      <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_batch</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">:</span><span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">],</span>\n                            <span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">:</span><span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">]))</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack_batch</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"n\">labs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Run the attack on a batch of instance and labels.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">compare</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">)):</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">-=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">+=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">==</span> <span class=\"n\">y</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">!=</span> <span class=\"n\">y</span>\n\n    <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n\n    <span class=\"n\">oimgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># re-scale instances to be within range [0, 1]</span>\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">imgs</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">)</span>\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"c1\"># now convert to [-1, 1]</span>\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">imgs</span> <span class=\"o\">*</span> <span class=\"mi\">2</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mi\">1</span>\n    <span class=\"c1\"># convert to tanh-space</span>\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">arctanh</span><span class=\"p\">(</span><span class=\"n\">imgs</span> <span class=\"o\">*</span> <span class=\"o\">.</span><span class=\"mi\">999999</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># set the lower and upper bounds accordingly</span>\n    <span class=\"n\">lower_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n    <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span>\n    <span class=\"n\">upper_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"mf\">1e10</span>\n\n    <span class=\"c1\"># placeholders for the best l2, score, and instance attack found so far</span>\n    <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestscore</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestattack</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">outer_step</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span><span class=\"p\">):</span>\n      <span class=\"c1\"># completely reset adam&#39;s internal state.</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">init</span><span class=\"p\">)</span>\n      <span class=\"n\">batch</span> <span class=\"o\">=</span> <span class=\"n\">imgs</span><span class=\"p\">[:</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n      <span class=\"n\">batchlab</span> <span class=\"o\">=</span> <span class=\"n\">labs</span><span class=\"p\">[:</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n\n      <span class=\"n\">bestl2</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n      <span class=\"n\">bestscore</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Binary search step </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n                    <span class=\"n\">outer_step</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># The last iteration (if we run many steps) repeat the search once.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"ow\">and</span> <span class=\"n\">outer_step</span> <span class=\"o\">==</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">upper_bound</span>\n\n      <span class=\"c1\"># set the variables so that we don&#39;t have to send them over again</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"p\">,</span> <span class=\"p\">{</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span><span class=\"p\">:</span> <span class=\"n\">batchlab</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span><span class=\"p\">:</span> <span class=\"n\">CONST</span>\n          <span class=\"p\">})</span>\n\n      <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"mf\">1e6</span>\n      <span class=\"k\">for</span> <span class=\"n\">iteration</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">):</span>\n        <span class=\"c1\"># perform the attack</span>\n        <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">l</span><span class=\"p\">,</span> <span class=\"n\">l2s</span><span class=\"p\">,</span> <span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">nimg</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span><span class=\"p\">,</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span>\n        <span class=\"p\">])</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">//</span> <span class=\"mi\">10</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">((</span><span class=\"s2\">&quot;    Iteration </span><span class=\"si\">{}</span><span class=\"s2\"> of </span><span class=\"si\">{}</span><span class=\"s2\">: loss=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> &quot;</span> <span class=\"o\">+</span>\n                         <span class=\"s2\">&quot;l2=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> f=</span><span class=\"si\">{:.3g}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n                             <span class=\"n\">iteration</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">,</span> <span class=\"n\">l</span><span class=\"p\">,</span>\n                             <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">l2s</span><span class=\"p\">),</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">scores</span><span class=\"p\">)))</span>\n\n        <span class=\"c1\"># check if we should abort search if we&#39;re getting nowhere.</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ABORT_EARLY</span> <span class=\"ow\">and</span> \\\n           <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">//</span> <span class=\"mi\">10</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"k\">if</span> <span class=\"n\">l</span> <span class=\"o\">&gt;</span> <span class=\"n\">prev</span> <span class=\"o\">*</span> <span class=\"o\">.</span><span class=\"mi\">9999</span><span class=\"p\">:</span>\n            <span class=\"n\">msg</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;    Failed to make progress; stop early&quot;</span>\n            <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"n\">msg</span><span class=\"p\">)</span>\n            <span class=\"k\">break</span>\n          <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"n\">l</span>\n\n        <span class=\"c1\"># adjust the best result found so far</span>\n        <span class=\"k\">for</span> <span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">l2</span><span class=\"p\">,</span> <span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">ii</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">l2s</span><span class=\"p\">,</span> <span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">nimg</span><span class=\"p\">)):</span>\n          <span class=\"n\">lab</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">batchlab</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">l2</span> <span class=\"o\">&lt;</span> <span class=\"n\">bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">lab</span><span class=\"p\">):</span>\n            <span class=\"n\">bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">l2</span>\n            <span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">)</span>\n          <span class=\"k\">if</span> <span class=\"n\">l2</span> <span class=\"o\">&lt;</span> <span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">lab</span><span class=\"p\">):</span>\n            <span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">l2</span>\n            <span class=\"n\">o_bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">)</span>\n            <span class=\"n\">o_bestattack</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">ii</span>\n\n      <span class=\"c1\"># adjust the constant as needed</span>\n      <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">batchlab</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]))</span> <span class=\"ow\">and</span> \\\n           <span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">:</span>\n          <span class=\"c1\"># success, divide const by two</span>\n          <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"c1\"># failure, either multiply by 10 if no solution found yet</span>\n          <span class=\"c1\">#          or do binary search with the known upper bound</span>\n          <span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">max</span><span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n          <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">*=</span> <span class=\"mi\">10</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Successfully generated adversarial examples &quot;</span> <span class=\"o\">+</span>\n                    <span class=\"s2\">&quot;on </span><span class=\"si\">{}</span><span class=\"s2\"> of </span><span class=\"si\">{}</span><span class=\"s2\"> instances.&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n                        <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">),</span> <span class=\"n\">batch_size</span><span class=\"p\">))</span>\n      <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">)</span>\n      <span class=\"n\">mean</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">o_bestl2</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">]))</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;   Mean successful distortion: </span><span class=\"si\">{:.4g}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">mean</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># return the best solution found</span>\n    <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">o_bestattack</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/deep_fool.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.deep_fool &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.deep_fool</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The DeepFool attack</span>\n\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">copy</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">,</span> <span class=\"n\">CallableModelWrapper</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.deep_fool&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"DeepFool\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.DeepFool\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">DeepFool</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  DeepFool is an untargeted &amp; iterative attack which is based on an</span>\n<span class=\"sd\">  iterative linearization of the classifier. The implementation here</span>\n<span class=\"sd\">  is w.r.t. the L2 norm.</span>\n<span class=\"sd\">  Paper link: &quot;https://arxiv.org/pdf/1511.04599.pdf&quot;</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a DeepFool instance.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">DeepFool</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;overshoot&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;max_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;nb_candidate&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"DeepFool.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.DeepFool.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils_tf</span> <span class=\"kn\">import</span> <span class=\"n\">jacobian_graph</span>\n\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Define graph wrt to this input placeholder</span>\n    <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span> <span class=\"o\">&lt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;nb_candidate should not be greater than nb_classes&#39;</span>\n    <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">top_k</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">],</span>\n        <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span><span class=\"p\">])</span>\n    <span class=\"c1\"># grads will be the shape [batch_size, nb_candidate, image_size]</span>\n    <span class=\"n\">grads</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">(</span><span class=\"n\">jacobian_graph</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Define graph</span>\n    <span class=\"k\">def</span> <span class=\"nf\">deepfool_wrap</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;deepfool function for py_func&quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">deepfool_batch</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span>\n                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">overshoot</span><span class=\"p\">,</span>\n                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iter</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">deepfool_wrap</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"DeepFool.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.DeepFool.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_candidate</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span>\n                   <span class=\"n\">overshoot</span><span class=\"o\">=</span><span class=\"mf\">0.02</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iter</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mf\">0.</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param nb_candidate: The number of classes to test against, i.e.,</span>\n<span class=\"sd\">                         deepfool only consider nb_candidate classes when</span>\n<span class=\"sd\">                         attacking(thus accelerate speed). The nb_candidate</span>\n<span class=\"sd\">                         classes are chosen according to the prediction</span>\n<span class=\"sd\">                         confidence during implementation.</span>\n<span class=\"sd\">    :param overshoot: A termination criterion to prevent vanishing updates</span>\n<span class=\"sd\">    :param max_iter: Maximum number of iteration for deepfool</span>\n<span class=\"sd\">    :param clip_min: Minimum component value for clipping</span>\n<span class=\"sd\">    :param clip_max: Maximum component value for clipping</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span> <span class=\"o\">=</span> <span class=\"n\">nb_candidate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">overshoot</span> <span class=\"o\">=</span> <span class=\"n\">overshoot</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iter</span> <span class=\"o\">=</span> <span class=\"n\">max_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">deepfool_batch</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                   <span class=\"n\">x</span><span class=\"p\">,</span>\n                   <span class=\"n\">pred</span><span class=\"p\">,</span>\n                   <span class=\"n\">logits</span><span class=\"p\">,</span>\n                   <span class=\"n\">grads</span><span class=\"p\">,</span>\n                   <span class=\"n\">X</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_candidate</span><span class=\"p\">,</span>\n                   <span class=\"n\">overshoot</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iter</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_classes</span><span class=\"p\">,</span>\n                   <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Applies DeepFool to a batch of inputs</span>\n<span class=\"sd\">  :param sess: TF session</span>\n<span class=\"sd\">  :param x: The input placeholder</span>\n<span class=\"sd\">  :param pred: The model&#39;s sorted symbolic output of logits, only the top</span>\n<span class=\"sd\">               nb_candidate classes are contained</span>\n<span class=\"sd\">  :param logits: The model&#39;s unnormalized output tensor (the input to</span>\n<span class=\"sd\">                 the softmax layer)</span>\n<span class=\"sd\">  :param grads: Symbolic gradients of the top nb_candidate classes, procuded</span>\n<span class=\"sd\">                from gradient_graph</span>\n<span class=\"sd\">  :param X: Numpy array with sample inputs</span>\n<span class=\"sd\">  :param nb_candidate: The number of classes to test against, i.e.,</span>\n<span class=\"sd\">                       deepfool only consider nb_candidate classes when</span>\n<span class=\"sd\">                       attacking(thus accelerate speed). The nb_candidate</span>\n<span class=\"sd\">                       classes are chosen according to the prediction</span>\n<span class=\"sd\">                       confidence during implementation.</span>\n<span class=\"sd\">  :param overshoot: A termination criterion to prevent vanishing updates</span>\n<span class=\"sd\">  :param max_iter: Maximum number of iteration for DeepFool</span>\n<span class=\"sd\">  :param clip_min: Minimum value for components of the example returned</span>\n<span class=\"sd\">  :param clip_max: Maximum value for components of the example returned</span>\n<span class=\"sd\">  :param nb_classes: Number of model output classes</span>\n<span class=\"sd\">  :return: Adversarial examples</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">X_adv</span> <span class=\"o\">=</span> <span class=\"n\">deepfool_attack</span><span class=\"p\">(</span>\n      <span class=\"n\">sess</span><span class=\"p\">,</span>\n      <span class=\"n\">x</span><span class=\"p\">,</span>\n      <span class=\"n\">pred</span><span class=\"p\">,</span>\n      <span class=\"n\">logits</span><span class=\"p\">,</span>\n      <span class=\"n\">grads</span><span class=\"p\">,</span>\n      <span class=\"n\">X</span><span class=\"p\">,</span>\n      <span class=\"n\">nb_candidate</span><span class=\"p\">,</span>\n      <span class=\"n\">overshoot</span><span class=\"p\">,</span>\n      <span class=\"n\">max_iter</span><span class=\"p\">,</span>\n      <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n      <span class=\"n\">clip_max</span><span class=\"p\">,</span>\n      <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"n\">X_adv</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">deepfool_attack</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                    <span class=\"n\">x</span><span class=\"p\">,</span>\n                    <span class=\"n\">predictions</span><span class=\"p\">,</span>\n                    <span class=\"n\">logits</span><span class=\"p\">,</span>\n                    <span class=\"n\">grads</span><span class=\"p\">,</span>\n                    <span class=\"n\">sample</span><span class=\"p\">,</span>\n                    <span class=\"n\">nb_candidate</span><span class=\"p\">,</span>\n                    <span class=\"n\">overshoot</span><span class=\"p\">,</span>\n                    <span class=\"n\">max_iter</span><span class=\"p\">,</span>\n                    <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                    <span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                    <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of DeepFool.</span>\n<span class=\"sd\">  Paper link: see https://arxiv.org/pdf/1511.04599.pdf</span>\n<span class=\"sd\">  :param sess: TF session</span>\n<span class=\"sd\">  :param x: The input placeholder</span>\n<span class=\"sd\">  :param predictions: The model&#39;s sorted symbolic output of logits, only the</span>\n<span class=\"sd\">                     top nb_candidate classes are contained</span>\n<span class=\"sd\">  :param logits: The model&#39;s unnormalized output tensor (the input to</span>\n<span class=\"sd\">                 the softmax layer)</span>\n<span class=\"sd\">  :param grads: Symbolic gradients of the top nb_candidate classes, procuded</span>\n<span class=\"sd\">               from gradient_graph</span>\n<span class=\"sd\">  :param sample: Numpy array with sample input</span>\n<span class=\"sd\">  :param nb_candidate: The number of classes to test against, i.e.,</span>\n<span class=\"sd\">                       deepfool only consider nb_candidate classes when</span>\n<span class=\"sd\">                       attacking(thus accelerate speed). The nb_candidate</span>\n<span class=\"sd\">                       classes are chosen according to the prediction</span>\n<span class=\"sd\">                       confidence during implementation.</span>\n<span class=\"sd\">  :param overshoot: A termination criterion to prevent vanishing updates</span>\n<span class=\"sd\">  :param max_iter: Maximum number of iteration for DeepFool</span>\n<span class=\"sd\">  :param clip_min: Minimum value for components of the example returned</span>\n<span class=\"sd\">  :param clip_max: Maximum value for components of the example returned</span>\n<span class=\"sd\">  :return: Adversarial examples</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">copy</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"p\">)</span>\n  <span class=\"c1\"># Initialize the loop variables</span>\n  <span class=\"n\">iteration</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n  <span class=\"n\">current</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">model_argmax</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">current</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">==</span> <span class=\"p\">():</span>\n    <span class=\"n\">current</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"n\">current</span><span class=\"p\">])</span>\n  <span class=\"n\">w</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">squeeze</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]))</span>  <span class=\"c1\"># same shape as original image</span>\n  <span class=\"n\">r_tot</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n  <span class=\"n\">original</span> <span class=\"o\">=</span> <span class=\"n\">current</span>  <span class=\"c1\"># use original label as the reference</span>\n\n  <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span>\n      <span class=\"s2\">&quot;Starting DeepFool attack up to </span><span class=\"si\">%s</span><span class=\"s2\"> iterations&quot;</span><span class=\"p\">,</span> <span class=\"n\">max_iter</span><span class=\"p\">)</span>\n  <span class=\"c1\"># Repeat this main loop until we have achieved misclassification</span>\n  <span class=\"k\">while</span> <span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">any</span><span class=\"p\">(</span><span class=\"n\">current</span> <span class=\"o\">==</span> <span class=\"n\">original</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"n\">iteration</span> <span class=\"o\">&lt;</span> <span class=\"n\">max_iter</span><span class=\"p\">):</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"mi\">5</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"ow\">and</span> <span class=\"n\">iteration</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Attack result at iteration </span><span class=\"si\">%s</span><span class=\"s2\"> is </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"n\">iteration</span><span class=\"p\">,</span> <span class=\"n\">current</span><span class=\"p\">)</span>\n    <span class=\"n\">gradients</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">adv_x</span><span class=\"p\">})</span>\n    <span class=\"n\">predictions_val</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">adv_x</span><span class=\"p\">})</span>\n    <span class=\"k\">for</span> <span class=\"n\">idx</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]):</span>\n      <span class=\"n\">pert</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span>\n      <span class=\"k\">if</span> <span class=\"n\">current</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"n\">original</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]:</span>\n        <span class=\"k\">continue</span>\n      <span class=\"k\">for</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_candidate</span><span class=\"p\">):</span>\n        <span class=\"n\">w_k</span> <span class=\"o\">=</span> <span class=\"n\">gradients</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"n\">gradients</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span>\n        <span class=\"n\">f_k</span> <span class=\"o\">=</span> <span class=\"n\">predictions_val</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"n\">predictions_val</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]</span>\n        <span class=\"c1\"># adding value 0.00001 to prevent f_k = 0</span>\n        <span class=\"n\">pert_k</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nb\">abs</span><span class=\"p\">(</span><span class=\"n\">f_k</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mf\">0.00001</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linalg</span><span class=\"o\">.</span><span class=\"n\">norm</span><span class=\"p\">(</span><span class=\"n\">w_k</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">())</span>\n        <span class=\"k\">if</span> <span class=\"n\">pert_k</span> <span class=\"o\">&lt;</span> <span class=\"n\">pert</span><span class=\"p\">:</span>\n          <span class=\"n\">pert</span> <span class=\"o\">=</span> <span class=\"n\">pert_k</span>\n          <span class=\"n\">w</span> <span class=\"o\">=</span> <span class=\"n\">w_k</span>\n      <span class=\"n\">r_i</span> <span class=\"o\">=</span> <span class=\"n\">pert</span> <span class=\"o\">*</span> <span class=\"n\">w</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linalg</span><span class=\"o\">.</span><span class=\"n\">norm</span><span class=\"p\">(</span><span class=\"n\">w</span><span class=\"p\">)</span>\n      <span class=\"n\">r_tot</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">r_tot</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">r_i</span>\n\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">r_tot</span> <span class=\"o\">+</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"n\">current</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">model_argmax</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">current</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">==</span> <span class=\"p\">():</span>\n      <span class=\"n\">current</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"n\">current</span><span class=\"p\">])</span>\n    <span class=\"c1\"># Update loop variables</span>\n    <span class=\"n\">iteration</span> <span class=\"o\">=</span> <span class=\"n\">iteration</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n\n  <span class=\"c1\"># need more revision, including info like how many succeed</span>\n  <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Attack result at iteration </span><span class=\"si\">%s</span><span class=\"s2\"> is </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"n\">iteration</span><span class=\"p\">,</span> <span class=\"n\">current</span><span class=\"p\">)</span>\n  <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> out of </span><span class=\"si\">%s</span><span class=\"s2\"> become adversarial examples at iteration </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n               <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">current</span> <span class=\"o\">!=</span> <span class=\"n\">original</span><span class=\"p\">),</span>\n               <span class=\"n\">sample</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span>\n               <span class=\"n\">iteration</span><span class=\"p\">)</span>\n  <span class=\"c1\"># need to clip this image into the given range</span>\n  <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">((</span><span class=\"mi\">1</span> <span class=\"o\">+</span> <span class=\"n\">overshoot</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">r_tot</span> <span class=\"o\">+</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">adv_x</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/elastic_net_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.elastic_net_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.elastic_net_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The ElasticNetMethod attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n\n<span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.elastic_net_method&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">ZERO</span><span class=\"p\">():</span>\n  <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"ElasticNetMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ElasticNetMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">ElasticNetMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This attack features L1-oriented adversarial examples and includes</span>\n<span class=\"sd\">  the C&amp;W L2 attack as a special case (when beta is set to 0).</span>\n<span class=\"sd\">  Adversarial examples attain similar performance to those</span>\n<span class=\"sd\">  generated by the C&amp;W L2 attack in the white-box case,</span>\n<span class=\"sd\">  and more importantly, have improved transferability properties</span>\n<span class=\"sd\">  and complement adversarial training.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1709.04114</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">ElasticNetMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;beta&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;decision_rule&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;batch_size&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;confidence&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;targeted&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;learning_rate&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;binary_search_steps&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;max_iterations&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;abort_early&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;initial_const&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_max&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"ElasticNetMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ElasticNetMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param x: (required) A tensor with the inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">attack</span> <span class=\"o\">=</span> <span class=\"n\">EAD</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta</span><span class=\"p\">,</span>\n                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decision_rule</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">confidence</span><span class=\"p\">,</span>\n                 <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">,</span>\n                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span><span class=\"p\">,</span>\n                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">abort_early</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">,</span>\n                 <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">ead_wrap</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">attack</span><span class=\"o\">.</span><span class=\"n\">attack</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">ead_wrap</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"ElasticNetMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ElasticNetMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">beta</span><span class=\"o\">=</span><span class=\"mf\">1e-2</span><span class=\"p\">,</span>\n                   <span class=\"n\">decision_rule</span><span class=\"o\">=</span><span class=\"s1\">&#39;EN&#39;</span><span class=\"p\">,</span>\n                   <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n                   <span class=\"n\">confidence</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"mf\">1e-2</span><span class=\"p\">,</span>\n                   <span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"mi\">9</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"mi\">1000</span><span class=\"p\">,</span>\n                   <span class=\"n\">abort_early</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"mf\">1e-3</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels for an untargeted</span>\n<span class=\"sd\">              attack. If None (and y_target is None) then use the</span>\n<span class=\"sd\">              original labels the classifier assigns.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the target labels for a</span>\n<span class=\"sd\">              targeted attack.</span>\n<span class=\"sd\">    :param beta: Trades off L2 distortion with L1 distortion: higher</span>\n<span class=\"sd\">                 produces examples with lower L1 distortion, at the</span>\n<span class=\"sd\">                 cost of higher L2 (and typically Linf) distortion</span>\n<span class=\"sd\">    :param decision_rule: EN or L1. Select final adversarial example from</span>\n<span class=\"sd\">                          all successful examples based on the least</span>\n<span class=\"sd\">                          elastic-net or L1 distortion criterion.</span>\n<span class=\"sd\">    :param confidence: Confidence of adversarial examples: higher produces</span>\n<span class=\"sd\">                       examples with larger l2 distortion, but more</span>\n<span class=\"sd\">                       strongly classified as adversarial.</span>\n<span class=\"sd\">    :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">    :param learning_rate: The learning rate for the attack algorithm.</span>\n<span class=\"sd\">                          Smaller values produce better results but are</span>\n<span class=\"sd\">                          slower to converge.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the perturbation</span>\n<span class=\"sd\">                                and confidence of the classification. Set</span>\n<span class=\"sd\">                                &#39;initial_const&#39; to a large value and fix</span>\n<span class=\"sd\">                                this param to 1 for speed.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations. Setting this</span>\n<span class=\"sd\">                           to a larger value will produce lower distortion</span>\n<span class=\"sd\">                           results. Using only a few iterations requires</span>\n<span class=\"sd\">                           a larger learning rate, and will produce larger</span>\n<span class=\"sd\">                           distortion results.</span>\n<span class=\"sd\">    :param abort_early: If true, allows early abort when the total</span>\n<span class=\"sd\">                        loss starts to increase (greatly speeds up attack,</span>\n<span class=\"sd\">                        but hurts performance, particularly on ImageNet)</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the perturbation</span>\n<span class=\"sd\">                          and confidence of classification.</span>\n<span class=\"sd\">                          If binary_search_steps is large, the initial</span>\n<span class=\"sd\">                          constant is not important. A smaller value of</span>\n<span class=\"sd\">                          this constant gives lower distortion results.</span>\n<span class=\"sd\">                          For computational efficiency, fix</span>\n<span class=\"sd\">                          binary_search_steps to 1 and set this param</span>\n<span class=\"sd\">                          to a large value.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ignore the y and y_target argument</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta</span> <span class=\"o\">=</span> <span class=\"n\">beta</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decision_rule</span> <span class=\"o\">=</span> <span class=\"n\">decision_rule</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">confidence</span> <span class=\"o\">=</span> <span class=\"n\">confidence</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span> <span class=\"o\">=</span> <span class=\"n\">learning_rate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">abort_early</span> <span class=\"o\">=</span> <span class=\"n\">abort_early</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span></div></div>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">EAD</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">beta</span><span class=\"p\">,</span> <span class=\"n\">decision_rule</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">,</span>\n               <span class=\"n\">confidence</span><span class=\"p\">,</span> <span class=\"n\">targeted</span><span class=\"p\">,</span> <span class=\"n\">learning_rate</span><span class=\"p\">,</span> <span class=\"n\">binary_search_steps</span><span class=\"p\">,</span>\n               <span class=\"n\">max_iterations</span><span class=\"p\">,</span> <span class=\"n\">abort_early</span><span class=\"p\">,</span> <span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n               <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    EAD Attack</span>\n\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param sess: a TF session.</span>\n<span class=\"sd\">    :param model: a cleverhans.model.Model object.</span>\n<span class=\"sd\">    :param beta: Trades off L2 distortion with L1 distortion: higher</span>\n<span class=\"sd\">                 produces examples with lower L1 distortion, at the</span>\n<span class=\"sd\">                 cost of higher L2 (and typically Linf) distortion</span>\n<span class=\"sd\">    :param decision_rule: EN or L1. Select final adversarial example from</span>\n<span class=\"sd\">                          all successful examples based on the least</span>\n<span class=\"sd\">                          elastic-net or L1 distortion criterion.</span>\n<span class=\"sd\">    :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">    :param confidence: Confidence of adversarial examples: higher produces</span>\n<span class=\"sd\">                       examples with larger l2 distortion, but more</span>\n<span class=\"sd\">                       strongly classified as adversarial.</span>\n<span class=\"sd\">    :param targeted: boolean controlling the behavior of the adversarial</span>\n<span class=\"sd\">                     examples produced. If set to False, they will be</span>\n<span class=\"sd\">                     misclassified in any wrong class. If set to True,</span>\n<span class=\"sd\">                     they will be misclassified in a chosen target class.</span>\n<span class=\"sd\">    :param learning_rate: The learning rate for the attack algorithm.</span>\n<span class=\"sd\">                          Smaller values produce better results but are</span>\n<span class=\"sd\">                          slower to converge.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the perturbation</span>\n<span class=\"sd\">                                and confidence of the classification. Set</span>\n<span class=\"sd\">                                &#39;initial_const&#39; to a large value and fix</span>\n<span class=\"sd\">                                this param to 1 for speed.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations. Setting this</span>\n<span class=\"sd\">                           to a larger value will produce lower distortion</span>\n<span class=\"sd\">                           results. Using only a few iterations requires</span>\n<span class=\"sd\">                           a larger learning rate, and will produce larger</span>\n<span class=\"sd\">                           distortion results.</span>\n<span class=\"sd\">    :param abort_early: If true, allows early abort when the total</span>\n<span class=\"sd\">                        loss starts to increase (greatly speeds up attack,</span>\n<span class=\"sd\">                        but hurts performance, particularly on ImageNet)</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the perturbation</span>\n<span class=\"sd\">                          and confidence of classification.</span>\n<span class=\"sd\">                          If binary_search_steps is large, the initial</span>\n<span class=\"sd\">                          constant is not important. A smaller value of</span>\n<span class=\"sd\">                          this constant gives lower distortion results.</span>\n<span class=\"sd\">                          For computational efficiency, fix</span>\n<span class=\"sd\">                          binary_search_steps to 1 and set this param</span>\n<span class=\"sd\">                          to a large value.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value.</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value.</span>\n<span class=\"sd\">    :param num_labels: the number of classes in the model&#39;s output.</span>\n<span class=\"sd\">    :param shape: the shape of the model&#39;s input tensor.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">sess</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span> <span class=\"o\">=</span> <span class=\"n\">targeted</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">LEARNING_RATE</span> <span class=\"o\">=</span> <span class=\"n\">learning_rate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ABORT_EARLY</span> <span class=\"o\">=</span> <span class=\"n\">abort_early</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span> <span class=\"o\">=</span> <span class=\"n\">confidence</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">model</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decision_rule</span> <span class=\"o\">=</span> <span class=\"n\">decision_rule</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta</span> <span class=\"o\">=</span> <span class=\"n\">beta</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">10</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">([</span><span class=\"n\">batch_size</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># these are variables to be more efficient in sending data to tf</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;timg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;newimg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;slack&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">)),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;tlab&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># and here&#39;s what we use to assign them</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_timg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_newimg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_slack&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_tlab&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">batch_size</span><span class=\"p\">],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">trainable</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step_t</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Fast Iterative Shrinkage Thresholding</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">zt</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">divide</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step_t</span><span class=\"p\">,</span>\n                        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step_t</span> <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">))</span>\n    <span class=\"n\">cond1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">subtract</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                               <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">cond2</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">subtract</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span>\n                                                     <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">)),</span>\n                                  <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">cond3</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">subtract</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">negative</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">)),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">upper</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">subtract</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">),</span>\n                       <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">))</span>\n    <span class=\"n\">lower</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">),</span>\n                       <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">))</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"n\">cond1</span><span class=\"p\">,</span> <span class=\"n\">upper</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">+=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"n\">cond2</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">+=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"n\">cond3</span><span class=\"p\">,</span> <span class=\"n\">lower</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span> <span class=\"o\">+=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">zt</span><span class=\"p\">,</span>\n                                     <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># --------------------------------</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter_y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># prediction BEFORE-SOFTMAX of the model</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_y</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># distance to the input data</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                             <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                               <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                             <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                               <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">elasticdist</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span> <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span><span class=\"p\">,</span>\n                                                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">elasticdist_y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist_y</span> <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist_y</span><span class=\"p\">,</span>\n                                                     <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decision_rule</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;EN&#39;</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">elasticdist</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit_p</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Elastic&#39;</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit_p</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;L1&#39;</span>\n\n    <span class=\"c1\"># compute the probability of the label class versus the maximum other</span>\n    <span class=\"n\">real</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">real_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">other</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">((</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span> <span class=\"o\">-</span>\n                       <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">*</span> <span class=\"mi\">10000</span><span class=\"p\">),</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">other_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">((</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_y</span> <span class=\"o\">-</span>\n                         <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">*</span> <span class=\"mi\">10000</span><span class=\"p\">),</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n      <span class=\"c1\"># if targeted, optimize for making the other class most likely</span>\n      <span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">other</span> <span class=\"o\">-</span> <span class=\"n\">real</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n      <span class=\"n\">loss1_y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">other_y</span> <span class=\"o\">-</span> <span class=\"n\">real_y</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># if untargeted, optimize for making this class least likely.</span>\n      <span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">real</span> <span class=\"o\">-</span> <span class=\"n\">other</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n      <span class=\"n\">loss1_y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">real_y</span> <span class=\"o\">-</span> <span class=\"n\">other_y</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># sum up the losses</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss21</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss21_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist_y</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist_y</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">*</span> <span class=\"n\">loss1</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">*</span> <span class=\"n\">loss1_y</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_opt</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1_y</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2_y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1</span><span class=\"o\">+</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2</span><span class=\"o\">+</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss21</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">polynomial_decay</span><span class=\"p\">(</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">LEARNING_RATE</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">,</span>\n        <span class=\"mi\">0</span><span class=\"p\">,</span>\n        <span class=\"n\">power</span><span class=\"o\">=</span><span class=\"mf\">0.5</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Setup the optimizer and keep track of variables we&#39;re creating</span>\n    <span class=\"n\">start_vars</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">())</span>\n    <span class=\"n\">optimizer</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">GradientDescentOptimizer</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">train</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_opt</span><span class=\"p\">,</span>\n                                    <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">],</span>\n                                    <span class=\"n\">global_step</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span><span class=\"p\">)</span>\n    <span class=\"n\">end_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">()</span>\n    <span class=\"n\">new_vars</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">x</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">end_vars</span> <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">start_vars</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># these are the variables to initialize when we run</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span><span class=\"p\">))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span><span class=\"p\">))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span><span class=\"p\">))</span>\n\n    <span class=\"n\">var_list</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"n\">new_vars</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">init</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">variables_initializer</span><span class=\"p\">(</span><span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"n\">var_list</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Perform the EAD attack on the given instance for the given targets.</span>\n\n<span class=\"sd\">    If self.targeted is true, then the targets represents the target labels</span>\n<span class=\"sd\">    If self.targeted is false, then targets are the original class labels</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n    <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">//</span> <span class=\"n\">batch_size</span><span class=\"p\">):</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span>\n          <span class=\"p\">(</span><span class=\"s2\">&quot;Running EAD attack on instance </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n           <span class=\"n\">i</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)))</span>\n      <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_batch</span><span class=\"p\">(</span>\n              <span class=\"n\">imgs</span><span class=\"p\">[</span><span class=\"n\">i</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">:(</span><span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">],</span>\n              <span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">i</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">:(</span><span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">]))</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span> <span class=\"o\">!=</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">last_elements</span> <span class=\"o\">=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span><span class=\"p\">)</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span>\n          <span class=\"p\">(</span><span class=\"s2\">&quot;Running EAD attack on instance </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n           <span class=\"n\">last_elements</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)))</span>\n      <span class=\"n\">temp_imgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">imgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:])</span>\n      <span class=\"n\">temp_targets</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">targets</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:])</span>\n      <span class=\"n\">temp_imgs</span><span class=\"p\">[:(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span><span class=\"p\">)]</span> <span class=\"o\">=</span> <span class=\"n\">imgs</span><span class=\"p\">[</span><span class=\"n\">last_elements</span><span class=\"p\">:]</span>\n      <span class=\"n\">temp_targets</span><span class=\"p\">[:(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span><span class=\"p\">)]</span> <span class=\"o\">=</span> <span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">last_elements</span><span class=\"p\">:]</span>\n      <span class=\"n\">temp_data</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_batch</span><span class=\"p\">(</span><span class=\"n\">temp_imgs</span><span class=\"p\">,</span> <span class=\"n\">temp_targets</span><span class=\"p\">)</span>\n      <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">(</span><span class=\"n\">temp_data</span><span class=\"p\">[:(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span><span class=\"p\">)],</span>\n               <span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">last_elements</span><span class=\"p\">:])</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack_batch</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"n\">labs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Run the attack on a batch of instance and labels.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">compare</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">)):</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">-=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">+=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">==</span> <span class=\"n\">y</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">!=</span> <span class=\"n\">y</span>\n\n    <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># set the lower and upper bounds accordingly</span>\n    <span class=\"n\">lower_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n    <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span>\n    <span class=\"n\">upper_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"mf\">1e10</span>\n\n    <span class=\"c1\"># placeholders for the best en, score, and instance attack found so far</span>\n    <span class=\"n\">o_bestdst</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestscore</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestattack</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">outer_step</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span><span class=\"p\">):</span>\n      <span class=\"c1\"># completely reset the optimizer&#39;s internal state.</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">init</span><span class=\"p\">)</span>\n      <span class=\"n\">batch</span> <span class=\"o\">=</span> <span class=\"n\">imgs</span><span class=\"p\">[:</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n      <span class=\"n\">batchlab</span> <span class=\"o\">=</span> <span class=\"n\">labs</span><span class=\"p\">[:</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n\n      <span class=\"n\">bestdst</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n      <span class=\"n\">bestscore</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Binary search step </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n                    <span class=\"n\">outer_step</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># The last iteration (if we run many steps) repeat the search once.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"ow\">and</span> <span class=\"n\">outer_step</span> <span class=\"o\">==</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">upper_bound</span>\n\n      <span class=\"c1\"># set the variables so that we don&#39;t have to send them over again</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"p\">,</span> <span class=\"p\">{</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span><span class=\"p\">:</span> <span class=\"n\">batchlab</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span><span class=\"p\">:</span> <span class=\"n\">CONST</span>\n          <span class=\"p\">})</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">})</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter_y</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">})</span>\n      <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"mf\">1e6</span>\n      <span class=\"k\">for</span> <span class=\"n\">iteration</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">):</span>\n        <span class=\"c1\"># perform the attack</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"p\">])</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter_y</span><span class=\"p\">])</span>\n        <span class=\"n\">l</span><span class=\"p\">,</span> <span class=\"n\">l2s</span><span class=\"p\">,</span> <span class=\"n\">l1s</span><span class=\"p\">,</span> <span class=\"n\">crit</span><span class=\"p\">,</span> <span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">nimg</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">])</span>\n        <span class=\"k\">if</span> <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">//</span> <span class=\"mi\">10</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">((</span><span class=\"s2\">&quot;    Iteration </span><span class=\"si\">{}</span><span class=\"s2\"> of </span><span class=\"si\">{}</span><span class=\"s2\">: loss=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> &quot;</span> <span class=\"o\">+</span>\n                         <span class=\"s2\">&quot;l2=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> l1=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> f=</span><span class=\"si\">{:.3g}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n                             <span class=\"n\">iteration</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">,</span> <span class=\"n\">l</span><span class=\"p\">,</span>\n                             <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">l2s</span><span class=\"p\">),</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">l1s</span><span class=\"p\">),</span>\n                             <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">scores</span><span class=\"p\">)))</span>\n\n        <span class=\"c1\"># check if we should abort search if we&#39;re getting nowhere.</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ABORT_EARLY</span> <span class=\"ow\">and</span> \\\n           <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">//</span> <span class=\"mi\">10</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"k\">if</span> <span class=\"n\">l</span> <span class=\"o\">&gt;</span> <span class=\"n\">prev</span> <span class=\"o\">*</span> <span class=\"o\">.</span><span class=\"mi\">9999</span><span class=\"p\">:</span>\n            <span class=\"n\">msg</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;    Failed to make progress; stop early&quot;</span>\n            <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"n\">msg</span><span class=\"p\">)</span>\n            <span class=\"k\">break</span>\n          <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"n\">l</span>\n\n        <span class=\"c1\"># adjust the best result found so far</span>\n        <span class=\"k\">for</span> <span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">dst</span><span class=\"p\">,</span> <span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">ii</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">crit</span><span class=\"p\">,</span> <span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">nimg</span><span class=\"p\">)):</span>\n          <span class=\"n\">lab</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">batchlab</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">dst</span> <span class=\"o\">&lt;</span> <span class=\"n\">bestdst</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">lab</span><span class=\"p\">):</span>\n            <span class=\"n\">bestdst</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">dst</span>\n            <span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">)</span>\n          <span class=\"k\">if</span> <span class=\"n\">dst</span> <span class=\"o\">&lt;</span> <span class=\"n\">o_bestdst</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">lab</span><span class=\"p\">):</span>\n            <span class=\"n\">o_bestdst</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">dst</span>\n            <span class=\"n\">o_bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">)</span>\n            <span class=\"n\">o_bestattack</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">ii</span>\n\n      <span class=\"c1\"># adjust the constant as needed</span>\n      <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">batchlab</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]))</span> <span class=\"ow\">and</span> \\\n           <span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">:</span>\n          <span class=\"c1\"># success, divide const by two</span>\n          <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"c1\"># failure, either multiply by 10 if no solution found yet</span>\n          <span class=\"c1\">#          or do binary search with the known upper bound</span>\n          <span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">max</span><span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n          <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">*=</span> <span class=\"mi\">10</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Successfully generated adversarial examples &quot;</span> <span class=\"o\">+</span>\n                    <span class=\"s2\">&quot;on </span><span class=\"si\">{}</span><span class=\"s2\"> of </span><span class=\"si\">{}</span><span class=\"s2\"> instances.&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n                        <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">),</span> <span class=\"n\">batch_size</span><span class=\"p\">))</span>\n      <span class=\"n\">o_bestdst</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestdst</span><span class=\"p\">)</span>\n      <span class=\"n\">mean</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">o_bestdst</span><span class=\"p\">[</span><span class=\"n\">o_bestdst</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">]))</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit_p</span> <span class=\"o\">+</span>\n                    <span class=\"s2\">&quot; Mean successful distortion: </span><span class=\"si\">{:.4g}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">mean</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># return the best solution found</span>\n    <span class=\"n\">o_bestdst</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestdst</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">o_bestattack</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/fast_feature_adversaries.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.fast_feature_adversaries &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.fast_feature_adversaries</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The FastFeatureAdversaries attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils_tf</span> <span class=\"kn\">import</span> <span class=\"n\">clip_eta</span>\n\n\n<div class=\"viewcode-block\" id=\"FastFeatureAdversaries\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastFeatureAdversaries\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">FastFeatureAdversaries</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This is a fast implementation of &quot;Feature Adversaries&quot;, an attack</span>\n<span class=\"sd\">  against a target internal representation of a model.</span>\n<span class=\"sd\">  &quot;Feature adversaries&quot; were originally introduced in (Sabour et al. 2016),</span>\n<span class=\"sd\">  where the optimization was done using LBFGS.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1511.05122</span>\n\n<span class=\"sd\">  This implementation is similar to &quot;Basic Iterative Method&quot;</span>\n<span class=\"sd\">  (Kurakin et al. 2016) but applied to the internal representations.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a FastFeatureAdversaries instance.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">FastFeatureAdversaries</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                                 <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;eps_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;layer&#39;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"FastFeatureAdversaries.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">layer</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"mf\">0.05</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param layer: (required str) name of the layer to target.</span>\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param eps_iter: (optional float) step size for each attack iteration</span>\n<span class=\"sd\">    :param nb_iter: (optional int) Number of attack iterations.</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">                Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">layer</span> <span class=\"o\">=</span> <span class=\"n\">layer</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">=</span> <span class=\"n\">eps_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be either np.inf, 1, or 2.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div>\n\n<div class=\"viewcode-block\" id=\"FastFeatureAdversaries.attack_single_step\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.attack_single_step\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">attack_single_step</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"n\">g_feat</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    TensorFlow implementation of the Fast Feature Gradient. This is a</span>\n<span class=\"sd\">    single step attack similar to Fast Gradient Method that attacks an</span>\n<span class=\"sd\">    internal representation.</span>\n\n<span class=\"sd\">    :param x: the input placeholder</span>\n<span class=\"sd\">    :param eta: A tensor the same shape as x that holds the perturbation.</span>\n<span class=\"sd\">    :param g_feat: model&#39;s internal tensor for guide</span>\n<span class=\"sd\">    :return: a tensor for the adversarial example</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"n\">a_feat</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">layer</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># feat.shape = (batch, c) or (batch, w, h, c)</span>\n    <span class=\"n\">axis</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">a_feat</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># Compute loss</span>\n    <span class=\"c1\"># This is a targeted attack, hence the negative sign</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">a_feat</span> <span class=\"o\">-</span> <span class=\"n\">g_feat</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Define gradient of loss wrt input</span>\n    <span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Multiply by constant epsilon</span>\n    <span class=\"n\">scaled_signed_grad</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Add perturbation to original example to obtain adversarial example</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span> <span class=\"o\">+</span> <span class=\"n\">scaled_signed_grad</span>\n\n    <span class=\"c1\"># If clipping is needed,</span>\n    <span class=\"c1\"># reset all values outside of [clip_min, clip_max]</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span> <span class=\"o\">-</span> <span class=\"n\">x</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">eta</span></div>\n\n<div class=\"viewcode-block\" id=\"FastFeatureAdversaries.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">g</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param g: The target value of the symbolic representation</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">g_feat</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">g</span><span class=\"p\">)[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">layer</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># Initialize loop variables</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">e</span><span class=\"p\">):</span>\n      <span class=\"n\">new_eta</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_single_step</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"n\">g_feat</span><span class=\"p\">)</span>\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">new_eta</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">([]),</span> <span class=\"n\">eta</span><span class=\"p\">),</span> <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                           <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Define adversarial example (and clip if necessary)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/fast_gradient_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.fast_gradient_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.fast_gradient_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The FastGradientMethod attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_max</span><span class=\"p\">,</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n\n<div class=\"viewcode-block\" id=\"FastGradientMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastGradientMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">FastGradientMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This attack was originally implemented by Goodfellow et al. (2014) with the</span>\n<span class=\"sd\">  infinity norm (and is known as the &quot;Fast Gradient Sign Method&quot;). This</span>\n<span class=\"sd\">  implementation extends the attack to other norms, and is therefore called</span>\n<span class=\"sd\">  the Fast Gradient Method.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1412.6572</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a FastGradientMethod instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">FastGradientMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;sanity_checks&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;loss_fn&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"FastGradientMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastGradientMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Returns the graph for Fast Gradient Method adversarial examples.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">_nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">fgm</span><span class=\"p\">(</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span>\n        <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">,</span>\n        <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span>\n        <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span>\n        <span class=\"n\">loss_fn</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_fn</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span><span class=\"p\">,</span>\n        <span class=\"n\">targeted</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">),</span>\n        <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"FastGradientMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastGradientMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">loss_fn</span><span class=\"o\">=</span><span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) attack step size (input variation)</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics NumPy).</span>\n<span class=\"sd\">                Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">    :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels. Only provide</span>\n<span class=\"sd\">              this parameter if you&#39;d like to use true labels when crafting</span>\n<span class=\"sd\">              adversarial samples. Otherwise, model predictions are used as</span>\n<span class=\"sd\">              labels to avoid the &quot;label leaking&quot; effect (explained in this</span>\n<span class=\"sd\">              paper: https://arxiv.org/abs/1611.01236). Default is None.</span>\n<span class=\"sd\">              Labels should be one-hot-encoded.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the labels to target. Leave</span>\n<span class=\"sd\">                     y_target=None if y is also set. Labels should be</span>\n<span class=\"sd\">                     one-hot-encoded.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    :param clip_grad: (optional bool) Ignore gradient components</span>\n<span class=\"sd\">                      at positions where the input is already at the boundary</span>\n<span class=\"sd\">                      of the domain, and the update step will get clipped out.</span>\n<span class=\"sd\">    :param sanity_checks: bool, if True, include asserts</span>\n<span class=\"sd\">      (Turn them off to use less runtime / memory or for unit tests that</span>\n<span class=\"sd\">      intentionally pass strange input)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Save attack-specific parameters</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_fn</span> <span class=\"o\">=</span> <span class=\"n\">loss_fn</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"o\">=</span> <span class=\"n\">clip_grad</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span> <span class=\"o\">=</span> <span class=\"n\">sanity_checks</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must not set both y and y_target&quot;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">)]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be either np.inf, 1, or 2.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must set clip_min and clip_max if clip_grad is set&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<div class=\"viewcode-block\" id=\"fgm\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.fgm\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">fgm</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"n\">logits</span><span class=\"p\">,</span>\n        <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n        <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n        <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n        <span class=\"n\">loss_fn</span><span class=\"o\">=</span><span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"n\">targeted</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of the Fast Gradient Method.</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param logits: output of model.get_logits</span>\n<span class=\"sd\">  :param y: (optional) A placeholder for the true labels. If targeted</span>\n<span class=\"sd\">            is true, then provide the target label. Otherwise, only provide</span>\n<span class=\"sd\">            this parameter if you&#39;d like to use true labels when crafting</span>\n<span class=\"sd\">            adversarial samples. Otherwise, model predictions are used as</span>\n<span class=\"sd\">            labels to avoid the &quot;label leaking&quot; effect (explained in this</span>\n<span class=\"sd\">            paper: https://arxiv.org/abs/1611.01236). Default is None.</span>\n<span class=\"sd\">            Labels should be one-hot-encoded.</span>\n<span class=\"sd\">  :param eps: the epsilon (input variation parameter)</span>\n<span class=\"sd\">  :param ord: (optional) Order of the norm (mimics NumPy).</span>\n<span class=\"sd\">              Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">  :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss</span>\n<span class=\"sd\">  :param clip_min: Minimum float value for adversarial example components</span>\n<span class=\"sd\">  :param clip_max: Maximum float value for adversarial example components</span>\n<span class=\"sd\">  :param clip_grad: (optional bool) Ignore gradient components</span>\n<span class=\"sd\">                    at positions where the input is already at the boundary</span>\n<span class=\"sd\">                    of the domain, and the update step will get clipped out.</span>\n<span class=\"sd\">  :param targeted: Is the attack targeted or untargeted? Untargeted, the</span>\n<span class=\"sd\">                   default, will try to make the label incorrect. Targeted</span>\n<span class=\"sd\">                   will instead try to move in the direction of being more</span>\n<span class=\"sd\">                   like y.</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n  <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n  <span class=\"k\">if</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n  <span class=\"c1\"># Make sure the caller has not passed probs by accident</span>\n  <span class=\"k\">assert</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;Softmax&#39;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Using model predictions as ground truth to avoid label leaking</span>\n    <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n  <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span> <span class=\"o\">/</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Compute loss</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">targeted</span><span class=\"p\">:</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">loss</span>\n\n  <span class=\"c1\"># Define gradient of loss wrt input</span>\n  <span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_grad</span><span class=\"p\">:</span>\n    <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">zero_out_clipped_grads</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n  <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">optimize_linear</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Add perturbation to original example to obtain adversarial example</span>\n  <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">optimal_perturbation</span>\n\n  <span class=\"c1\"># If clipping is needed, reset all values outside of [clip_min, clip_max]</span>\n  <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"c1\"># We don&#39;t currently support one-sided clipping</span>\n    <span class=\"k\">assert</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n    <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n\n<div class=\"viewcode-block\" id=\"optimize_linear\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.optimize_linear\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">optimize_linear</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Solves for the optimal input to a linear function under a norm constraint.</span>\n\n<span class=\"sd\">  Optimal_perturbation = argmax_{eta, ||eta||_{ord} &lt; eps} dot(eta, grad)</span>\n\n<span class=\"sd\">  :param grad: tf tensor containing a batch of gradients</span>\n<span class=\"sd\">  :param eps: float scalar specifying size of constraint region</span>\n<span class=\"sd\">  :param ord: int specifying order of norm</span>\n<span class=\"sd\">  :returns:</span>\n<span class=\"sd\">    tf tensor containing optimal perturbation</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"c1\"># In Python 2, the `list` call in the following line is redundant / harmless.</span>\n  <span class=\"c1\"># In Python 3, the `list` call is needed to convert the iterator returned by `range` into a list.</span>\n  <span class=\"n\">red_ind</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())))</span>\n  <span class=\"n\">avoid_zero_div</span> <span class=\"o\">=</span> <span class=\"mf\">1e-12</span>\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Take sign of gradient</span>\n    <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n    <span class=\"c1\"># The following line should not change the numerical results.</span>\n    <span class=\"c1\"># It applies only because `optimal_perturbation` is the output of</span>\n    <span class=\"c1\"># a `sign` op, which has zero derivative anyway.</span>\n    <span class=\"c1\"># It should not be applied for the other norms, where the</span>\n    <span class=\"c1\"># perturbation has a non-zero derivative.</span>\n    <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">optimal_perturbation</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"n\">abs_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n    <span class=\"n\">sign</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n    <span class=\"n\">max_abs_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">red_ind</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">tied_for_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">max_abs_grad</span><span class=\"p\">))</span>\n    <span class=\"n\">num_ties</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tied_for_max</span><span class=\"p\">,</span> <span class=\"n\">red_ind</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">sign</span> <span class=\"o\">*</span> <span class=\"n\">tied_for_max</span> <span class=\"o\">/</span> <span class=\"n\">num_ties</span>\n  <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n    <span class=\"n\">square</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">avoid_zero_div</span><span class=\"p\">,</span>\n                        <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">),</span>\n                                   <span class=\"n\">reduction_indices</span><span class=\"o\">=</span><span class=\"n\">red_ind</span><span class=\"p\">,</span>\n                                   <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n    <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">grad</span> <span class=\"o\">/</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">square</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Only L-inf, L1 and L2 norms are &quot;</span>\n                              <span class=\"s2\">&quot;currently implemented.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Scale perturbation to be the solution for the norm=eps rather than</span>\n  <span class=\"c1\"># norm=1 problem</span>\n  <span class=\"n\">scaled_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">mul</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">optimal_perturbation</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">scaled_perturbation</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/hop_skip_jump_attack.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.hop_skip_jump_attack &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.hop_skip_jump_attack</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot; Boundary Attack++</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n<span class=\"kn\">from</span> <span class=\"nn\">warnings</span> <span class=\"kn\">import</span> <span class=\"n\">warn</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span><span class=\"p\">,</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.hop_skip_jump_attack&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"HopSkipJumpAttack\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.HopSkipJumpAttack\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">HopSkipJumpAttack</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright.</span>\n<span class=\"sd\">  It is a decision-based attack that requires access to output</span>\n<span class=\"sd\">  labels of a model alone.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1904.02144</span>\n<span class=\"sd\">  At a high level, this attack is an iterative attack composed of three</span>\n<span class=\"sd\">  steps: Binary search to approach the boundary; gradient estimation;</span>\n<span class=\"sd\">  stepsize search. HopSkipJumpAttack requires fewer model queries than</span>\n<span class=\"sd\">  Boundary Attack which was based on rejective sampling.</span>\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor.</span>\n<span class=\"sd\">  see parse_params for details.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">HopSkipJumpAttack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span>\n                                                 <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;stepsize_search&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;constraint&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;num_iterations&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;initial_num_evals&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;max_num_evals&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;batch_size&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;verbose&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;gamma&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"HopSkipJumpAttack.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n<span class=\"sd\">    :param x: A tensor with the inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:]]</span>\n\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"n\">_check_first_dimension</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"s1\">&#39;input&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">_check_first_dimension</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n          <span class=\"s1\">&#39;Require a target image for targeted attack.&#39;</span>\n      <span class=\"n\">_check_first_dimension</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span><span class=\"p\">,</span> <span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Set shape and d.</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"n\">shape</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">prod</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># Set binary search threshold.</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Construct input placeholder and output for decision function.</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">input_ph</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;input_image&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">input_ph</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">hsja_wrap</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">target_label</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot; Wrapper to use tensors as input and output. &quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_hsja</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">target_label</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">),</span>\n                      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"c1\"># targeted attack that requires target label and image.</span>\n      <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">hsja_wrap</span><span class=\"p\">,</span>\n                        <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]],</span>\n                        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"c1\"># untargeted attack with an initialized image.</span>\n        <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">:</span> <span class=\"n\">hsja_wrap</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                            <span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">),</span>\n                          <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]],</span>\n                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># untargeted attack without an initialized image.</span>\n        <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">hsja_wrap</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">),</span>\n                          <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]],</span>\n                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"HopSkipJumpAttack.generate_np\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.generate_np\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate_np</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate adversarial images in a for loop.</span>\n<span class=\"sd\">    :param y: An array of shape (n, nb_classes) for true labels.</span>\n<span class=\"sd\">    :param y_target:  An array of shape (n, nb_classes) for target labels.</span>\n<span class=\"sd\">    Required for targeted attack.</span>\n<span class=\"sd\">    :param image_target: An array of shape (n, **image shape) for initial</span>\n<span class=\"sd\">    target images. Required for targeted attack.</span>\n\n<span class=\"sd\">    See parse_params for other kwargs.</span>\n\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;image_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">image_target</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">])</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">image_target</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">])</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">x_single</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n      <span class=\"n\">img</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">x_single</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">image_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">single_img_target</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">image_target</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">single_img_target</span>\n      <span class=\"k\">if</span> <span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">single_y_target</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">y_target</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">single_y_target</span>\n\n      <span class=\"n\">adv_img</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">HopSkipJumpAttack</span><span class=\"p\">,</span>\n                      <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">generate_np</span><span class=\"p\">(</span><span class=\"n\">img</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n      <span class=\"n\">x_adv</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">adv_img</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">concatenate</span><span class=\"p\">(</span><span class=\"n\">x_adv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"HopSkipJumpAttack.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">image_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">initial_num_evals</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_num_evals</span><span class=\"o\">=</span><span class=\"mi\">10000</span><span class=\"p\">,</span>\n                   <span class=\"n\">stepsize_search</span><span class=\"o\">=</span><span class=\"s1\">&#39;geometric_progression&#39;</span><span class=\"p\">,</span>\n                   <span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"mi\">64</span><span class=\"p\">,</span>\n                   <span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">constraint</span><span class=\"o\">=</span><span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">,</span>\n                   <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">,</span>\n                   <span class=\"n\">verbose</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param y: A tensor of shape (1, nb_classes) for true labels.</span>\n<span class=\"sd\">    :param y_target:  A tensor of shape (1, nb_classes) for target labels.</span>\n<span class=\"sd\">    Required for targeted attack.</span>\n<span class=\"sd\">    :param image_target: A tensor of shape (1, **image shape) for initial</span>\n<span class=\"sd\">    target images. Required for targeted attack.</span>\n<span class=\"sd\">    :param initial_num_evals: initial number of evaluations for</span>\n<span class=\"sd\">                              gradient estimation.</span>\n<span class=\"sd\">    :param max_num_evals: maximum number of evaluations for gradient estimation.</span>\n<span class=\"sd\">    :param stepsize_search: How to search for stepsize; choices are</span>\n<span class=\"sd\">                            &#39;geometric_progression&#39;, &#39;grid_search&#39;.</span>\n<span class=\"sd\">                            &#39;geometric progression&#39; initializes the stepsize</span>\n<span class=\"sd\">                             by ||x_t - x||_p / sqrt(iteration), and keep</span>\n<span class=\"sd\">                             decreasing by half until reaching the target</span>\n<span class=\"sd\">                             side of the boundary. &#39;grid_search&#39; chooses the</span>\n<span class=\"sd\">                             optimal epsilon over a grid, in the scale of</span>\n<span class=\"sd\">                             ||x_t - x||_p.</span>\n<span class=\"sd\">    :param num_iterations: The number of iterations.</span>\n<span class=\"sd\">    :param gamma: The binary search threshold theta is gamma / d^{3/2} for</span>\n<span class=\"sd\">                   l2 attack and gamma / d^2 for linf attack.</span>\n<span class=\"sd\">    :param constraint: The distance to optimize; choices are &#39;l2&#39;, &#39;linf&#39;.</span>\n<span class=\"sd\">    :param batch_size: batch_size for model prediction.</span>\n<span class=\"sd\">    :param verbose: (boolean) Whether distance at each step is printed.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ignore the y and y_target argument</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span> <span class=\"o\">=</span> <span class=\"n\">image_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_num_evals</span> <span class=\"o\">=</span> <span class=\"n\">initial_num_evals</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_num_evals</span> <span class=\"o\">=</span> <span class=\"n\">max_num_evals</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stepsize_search</span> <span class=\"o\">=</span> <span class=\"n\">stepsize_search</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_iterations</span> <span class=\"o\">=</span> <span class=\"n\">num_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span> <span class=\"o\">=</span> <span class=\"n\">gamma</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span> <span class=\"o\">=</span> <span class=\"n\">constraint</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">verbose</span> <span class=\"o\">=</span> <span class=\"n\">verbose</span></div>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_hsja</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">target_label</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Main algorithm for HopSkipJumpAttack.</span>\n\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param sample: input image. Without the batchsize dimension.</span>\n<span class=\"sd\">    :param target_label: integer for targeted attack,</span>\n<span class=\"sd\">      None for nontargeted attack. Without the batchsize dimension.</span>\n<span class=\"sd\">    :param target_image: an array with the same size as sample, or None.</span>\n<span class=\"sd\">      Without the batchsize dimension.</span>\n\n\n<span class=\"sd\">    Output:</span>\n<span class=\"sd\">    perturbed image.</span>\n\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Original label required for untargeted attack.</span>\n    <span class=\"k\">if</span> <span class=\"n\">target_label</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">original_label</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">input_ph</span><span class=\"p\">:</span> <span class=\"n\">sample</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]})</span>\n          <span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">target_label</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">target_label</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">decision_function</span><span class=\"p\">(</span><span class=\"n\">images</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">      Decision function output 1 on the desired side of the boundary,</span>\n<span class=\"sd\">      0 otherwise.</span>\n<span class=\"sd\">      &quot;&quot;&quot;</span>\n      <span class=\"n\">images</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span><span class=\"n\">images</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n      <span class=\"n\">prob</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n      <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">images</span><span class=\"p\">),</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"n\">batch</span> <span class=\"o\">=</span> <span class=\"n\">images</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">:</span><span class=\"n\">i</span><span class=\"o\">+</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n        <span class=\"n\">prob_i</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">input_ph</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">})</span>\n        <span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">prob_i</span><span class=\"p\">)</span>\n      <span class=\"n\">prob</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">concatenate</span><span class=\"p\">(</span><span class=\"n\">prob</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">target_label</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">prob</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"n\">original_label</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">prob</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"n\">target_label</span>\n\n    <span class=\"c1\"># Initialize.</span>\n    <span class=\"k\">if</span> <span class=\"n\">target_image</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">initialize</span><span class=\"p\">(</span><span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                             <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">target_image</span>\n\n    <span class=\"c1\"># Project the initialization to the boundary.</span>\n    <span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">dist_post_update</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_batch</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"p\">,</span>\n                                                      <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">),</span>\n                                                      <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                                                      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                                                      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span>\n                                                      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">)</span>\n\n    <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">compute_distance</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">arange</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_iterations</span><span class=\"p\">):</span>\n      <span class=\"n\">current_iteration</span> <span class=\"o\">=</span> <span class=\"n\">j</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n\n      <span class=\"c1\"># Choose delta.</span>\n      <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"n\">select_delta</span><span class=\"p\">(</span><span class=\"n\">dist_post_update</span><span class=\"p\">,</span> <span class=\"n\">current_iteration</span><span class=\"p\">,</span>\n                           <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"p\">,</span>\n                           <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Choose number of evaluations.</span>\n      <span class=\"n\">num_evals</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"nb\">min</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_num_evals</span> <span class=\"o\">*</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">j</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n                           <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_num_evals</span><span class=\"p\">]))</span>\n\n      <span class=\"c1\"># approximate gradient.</span>\n      <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"n\">approximate_gradient</span><span class=\"p\">(</span><span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">num_evals</span><span class=\"p\">,</span>\n                                   <span class=\"n\">delta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                                   <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">update</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">gradf</span><span class=\"p\">)</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">update</span> <span class=\"o\">=</span> <span class=\"n\">gradf</span>\n\n      <span class=\"c1\"># search step size.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stepsize_search</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;geometric_progression&#39;</span><span class=\"p\">:</span>\n        <span class=\"c1\"># find step size.</span>\n        <span class=\"n\">epsilon</span> <span class=\"o\">=</span> <span class=\"n\">geometric_progression_for_stepsize</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span>\n                                                     <span class=\"n\">update</span><span class=\"p\">,</span> <span class=\"n\">dist</span><span class=\"p\">,</span> <span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">current_iteration</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Update the sample.</span>\n        <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span><span class=\"n\">perturbed</span> <span class=\"o\">+</span> <span class=\"n\">epsilon</span> <span class=\"o\">*</span> <span class=\"n\">update</span><span class=\"p\">,</span>\n                               <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Binary search to return to the boundary.</span>\n        <span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">dist_post_update</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_batch</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"p\">,</span>\n                                                          <span class=\"n\">perturbed</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">],</span>\n                                                          <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                                                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                                                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span>\n                                                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">)</span>\n\n      <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stepsize_search</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;grid_search&#39;</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Grid search for stepsize.</span>\n        <span class=\"n\">epsilons</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">logspace</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">num</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">,</span> <span class=\"n\">endpoint</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">dist</span>\n        <span class=\"n\">epsilons_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">20</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n        <span class=\"n\">perturbeds</span> <span class=\"o\">=</span> <span class=\"n\">perturbed</span> <span class=\"o\">+</span> <span class=\"n\">epsilons</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">epsilons_shape</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">update</span>\n        <span class=\"n\">perturbeds</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span><span class=\"n\">perturbeds</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n        <span class=\"n\">idx_perturbed</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">perturbeds</span><span class=\"p\">)</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">(</span><span class=\"n\">idx_perturbed</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"c1\"># Select the perturbation that yields the minimum distance # after binary search.</span>\n          <span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">dist_post_update</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_batch</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"p\">,</span>\n                                                            <span class=\"n\">perturbeds</span><span class=\"p\">[</span><span class=\"n\">idx_perturbed</span><span class=\"p\">],</span>\n                                                            <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                                                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                                                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span>\n                                                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># compute new distance.</span>\n      <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">compute_distance</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">verbose</span><span class=\"p\">:</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">&#39;iteration: </span><span class=\"si\">{:d}</span><span class=\"s1\">, </span><span class=\"si\">{:s}</span><span class=\"s1\"> distance </span><span class=\"si\">{:.4E}</span><span class=\"s1\">&#39;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n            <span class=\"n\">j</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span> <span class=\"n\">dist</span><span class=\"p\">))</span>\n\n    <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">perturbed</span></div>\n\n\n<div class=\"viewcode-block\" id=\"BoundaryAttackPlusPlus\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.BoundaryAttackPlusPlus\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">BoundaryAttackPlusPlus</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A previous name used for HopSkipJumpAttack.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;BoundaryAttackPlusPlus will be removed after 2019-12-08; use HopSkipJumpAttack.&quot;</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">HopSkipJumpAttack</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span></div>\n\n<span class=\"k\">def</span> <span class=\"nf\">_check_first_dimension</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tensor_name</span><span class=\"p\">):</span>\n  <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Tensor </span><span class=\"si\">{}</span><span class=\"s2\"> should have batch_size of 1.&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">tensor_name</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">check_batch</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"o\">=</span><span class=\"n\">message</span><span class=\"p\">)</span>\n    <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">([</span><span class=\"n\">check_batch</span><span class=\"p\">]):</span>\n      <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"n\">message</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">clip_image</span><span class=\"p\">(</span><span class=\"n\">image</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Clip an image, or an image batch, with upper and lower threshold. &quot;&quot;&quot;</span>\n  <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">image</span><span class=\"p\">),</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">compute_distance</span><span class=\"p\">(</span><span class=\"n\">x_ori</span><span class=\"p\">,</span> <span class=\"n\">x_pert</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"o\">=</span><span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Compute the distance between two images. &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linalg</span><span class=\"o\">.</span><span class=\"n\">norm</span><span class=\"p\">(</span><span class=\"n\">x_ori</span> <span class=\"o\">-</span> <span class=\"n\">x_pert</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">max</span><span class=\"p\">(</span><span class=\"nb\">abs</span><span class=\"p\">(</span><span class=\"n\">x_ori</span> <span class=\"o\">-</span> <span class=\"n\">x_pert</span><span class=\"p\">))</span>\n  <span class=\"k\">return</span> <span class=\"n\">dist</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">approximate_gradient</span><span class=\"p\">(</span><span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">num_evals</span><span class=\"p\">,</span>\n                         <span class=\"n\">delta</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Gradient direction estimation &quot;&quot;&quot;</span>\n  <span class=\"c1\"># Generate random vectors.</span>\n  <span class=\"n\">noise_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">num_evals</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">rv</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">randn</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">noise_shape</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">rv</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">uniform</span><span class=\"p\">(</span><span class=\"n\">low</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">high</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">size</span><span class=\"o\">=</span><span class=\"n\">noise_shape</span><span class=\"p\">)</span>\n\n  <span class=\"n\">axis</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span> <span class=\"o\">+</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">)))</span>\n  <span class=\"n\">rv</span> <span class=\"o\">=</span> <span class=\"n\">rv</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">(</span><span class=\"n\">rv</span> <span class=\"o\">**</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"n\">axis</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n  <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">sample</span> <span class=\"o\">+</span> <span class=\"n\">delta</span> <span class=\"o\">*</span> <span class=\"n\">rv</span>\n  <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n  <span class=\"n\">rv</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">perturbed</span> <span class=\"o\">-</span> <span class=\"n\">sample</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"n\">delta</span>\n\n  <span class=\"c1\"># query the model.</span>\n  <span class=\"n\">decisions</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">)</span>\n  <span class=\"n\">decision_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">decisions</span><span class=\"p\">)]</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n  <span class=\"n\">fval</span> <span class=\"o\">=</span> <span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"n\">decisions</span><span class=\"o\">.</span><span class=\"n\">astype</span><span class=\"p\">(</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">decision_shape</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mf\">1.0</span>\n\n  <span class=\"c1\"># Baseline subtraction (when fval differs)</span>\n  <span class=\"k\">if</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">fval</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mf\">1.0</span><span class=\"p\">:</span>  <span class=\"c1\"># label changes.</span>\n    <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">rv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">fval</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"o\">-</span><span class=\"mf\">1.0</span><span class=\"p\">:</span>  <span class=\"c1\"># label not change.</span>\n    <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"o\">-</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">rv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">fval</span> <span class=\"o\">=</span> <span class=\"n\">fval</span> <span class=\"o\">-</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">fval</span><span class=\"p\">)</span>\n    <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">fval</span> <span class=\"o\">*</span> <span class=\"n\">rv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Get the gradient direction.</span>\n  <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"n\">gradf</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linalg</span><span class=\"o\">.</span><span class=\"n\">norm</span><span class=\"p\">(</span><span class=\"n\">gradf</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">gradf</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">project</span><span class=\"p\">(</span><span class=\"n\">original_image</span><span class=\"p\">,</span> <span class=\"n\">perturbed_images</span><span class=\"p\">,</span> <span class=\"n\">alphas</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Projection onto given l2 / linf balls in a batch. &quot;&quot;&quot;</span>\n  <span class=\"n\">alphas_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">alphas</span><span class=\"p\">)]</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n  <span class=\"n\">alphas</span> <span class=\"o\">=</span> <span class=\"n\">alphas</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">alphas_shape</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">projected</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"o\">-</span><span class=\"n\">alphas</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">original_image</span> <span class=\"o\">+</span> <span class=\"n\">alphas</span> <span class=\"o\">*</span> <span class=\"n\">perturbed_images</span>\n  <span class=\"k\">elif</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">projected</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span>\n        <span class=\"n\">perturbed_images</span><span class=\"p\">,</span>\n        <span class=\"n\">original_image</span> <span class=\"o\">-</span> <span class=\"n\">alphas</span><span class=\"p\">,</span>\n        <span class=\"n\">original_image</span> <span class=\"o\">+</span> <span class=\"n\">alphas</span>\n    <span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">projected</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">binary_search_batch</span><span class=\"p\">(</span><span class=\"n\">original_image</span><span class=\"p\">,</span> <span class=\"n\">perturbed_images</span><span class=\"p\">,</span> <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                        <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">,</span> <span class=\"n\">theta</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Binary search to approach the boundary. &quot;&quot;&quot;</span>\n\n  <span class=\"c1\"># Compute distance between each of perturbed image and original image.</span>\n  <span class=\"n\">dists_post_update</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span>\n      <span class=\"n\">compute_distance</span><span class=\"p\">(</span>\n          <span class=\"n\">original_image</span><span class=\"p\">,</span>\n          <span class=\"n\">perturbed_image</span><span class=\"p\">,</span>\n          <span class=\"n\">constraint</span>\n      <span class=\"p\">)</span>\n      <span class=\"k\">for</span> <span class=\"n\">perturbed_image</span> <span class=\"ow\">in</span> <span class=\"n\">perturbed_images</span><span class=\"p\">])</span>\n\n  <span class=\"c1\"># Choose upper thresholds in binary searchs based on constraint.</span>\n  <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">highs</span> <span class=\"o\">=</span> <span class=\"n\">dists_post_update</span>\n    <span class=\"c1\"># Stopping criteria.</span>\n    <span class=\"n\">thresholds</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"n\">dists_post_update</span> <span class=\"o\">*</span> <span class=\"n\">theta</span><span class=\"p\">,</span> <span class=\"n\">theta</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">highs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">perturbed_images</span><span class=\"p\">))</span>\n    <span class=\"n\">thresholds</span> <span class=\"o\">=</span> <span class=\"n\">theta</span>\n\n  <span class=\"n\">lows</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">perturbed_images</span><span class=\"p\">))</span>\n\n  <span class=\"k\">while</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">max</span><span class=\"p\">((</span><span class=\"n\">highs</span> <span class=\"o\">-</span> <span class=\"n\">lows</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"n\">thresholds</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"c1\"># projection to mids.</span>\n    <span class=\"n\">mids</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">highs</span> <span class=\"o\">+</span> <span class=\"n\">lows</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mf\">2.0</span>\n    <span class=\"n\">mid_images</span> <span class=\"o\">=</span> <span class=\"n\">project</span><span class=\"p\">(</span><span class=\"n\">original_image</span><span class=\"p\">,</span> <span class=\"n\">perturbed_images</span><span class=\"p\">,</span>\n                         <span class=\"n\">mids</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Update highs and lows based on model decisions.</span>\n    <span class=\"n\">decisions</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">mid_images</span><span class=\"p\">)</span>\n    <span class=\"n\">lows</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">where</span><span class=\"p\">(</span><span class=\"n\">decisions</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">mids</span><span class=\"p\">,</span> <span class=\"n\">lows</span><span class=\"p\">)</span>\n    <span class=\"n\">highs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">where</span><span class=\"p\">(</span><span class=\"n\">decisions</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">mids</span><span class=\"p\">,</span> <span class=\"n\">highs</span><span class=\"p\">)</span>\n\n  <span class=\"n\">out_images</span> <span class=\"o\">=</span> <span class=\"n\">project</span><span class=\"p\">(</span><span class=\"n\">original_image</span><span class=\"p\">,</span> <span class=\"n\">perturbed_images</span><span class=\"p\">,</span>\n                       <span class=\"n\">highs</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Compute distance of the output image to select the best choice.</span>\n  <span class=\"c1\"># (only used when stepsize_search is grid_search.)</span>\n  <span class=\"n\">dists</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span>\n      <span class=\"n\">compute_distance</span><span class=\"p\">(</span>\n          <span class=\"n\">original_image</span><span class=\"p\">,</span>\n          <span class=\"n\">out_image</span><span class=\"p\">,</span>\n          <span class=\"n\">constraint</span>\n      <span class=\"p\">)</span>\n      <span class=\"k\">for</span> <span class=\"n\">out_image</span> <span class=\"ow\">in</span> <span class=\"n\">out_images</span><span class=\"p\">])</span>\n  <span class=\"n\">idx</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmin</span><span class=\"p\">(</span><span class=\"n\">dists</span><span class=\"p\">)</span>\n\n  <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">dists_post_update</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span>\n  <span class=\"n\">out_image</span> <span class=\"o\">=</span> <span class=\"n\">out_images</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span>\n  <span class=\"k\">return</span> <span class=\"n\">out_image</span><span class=\"p\">,</span> <span class=\"n\">dist</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">initialize</span><span class=\"p\">(</span><span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Efficient Implementation of BlendedUniformNoiseAttack in Foolbox.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">success</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n  <span class=\"n\">num_evals</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n\n  <span class=\"c1\"># Find a misclassified random noise.</span>\n  <span class=\"k\">while</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n    <span class=\"n\">random_noise</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">uniform</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">size</span><span class=\"o\">=</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n    <span class=\"n\">success</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">random_noise</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">])[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"n\">success</span><span class=\"p\">:</span>\n      <span class=\"k\">break</span>\n    <span class=\"n\">num_evals</span> <span class=\"o\">+=</span> <span class=\"mi\">1</span>\n    <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Initialization failed! Try to use a misclassified image as `target_image`&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"n\">num_evals</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e4</span><span class=\"p\">,</span> <span class=\"n\">message</span>\n\n  <span class=\"c1\"># Binary search to minimize l2 distance to original image.</span>\n  <span class=\"n\">low</span> <span class=\"o\">=</span> <span class=\"mf\">0.0</span>\n  <span class=\"n\">high</span> <span class=\"o\">=</span> <span class=\"mf\">1.0</span>\n  <span class=\"k\">while</span> <span class=\"n\">high</span> <span class=\"o\">-</span> <span class=\"n\">low</span> <span class=\"o\">&gt;</span> <span class=\"mf\">0.001</span><span class=\"p\">:</span>\n    <span class=\"n\">mid</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">high</span> <span class=\"o\">+</span> <span class=\"n\">low</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mf\">2.0</span>\n    <span class=\"n\">blended</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"n\">mid</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">sample</span> <span class=\"o\">+</span> <span class=\"n\">mid</span> <span class=\"o\">*</span> <span class=\"n\">random_noise</span>\n    <span class=\"n\">success</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">blended</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">])[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"n\">success</span><span class=\"p\">:</span>\n      <span class=\"n\">high</span> <span class=\"o\">=</span> <span class=\"n\">mid</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">low</span> <span class=\"o\">=</span> <span class=\"n\">mid</span>\n\n  <span class=\"n\">initialization</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"n\">high</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">sample</span> <span class=\"o\">+</span> <span class=\"n\">high</span> <span class=\"o\">*</span> <span class=\"n\">random_noise</span>\n  <span class=\"k\">return</span> <span class=\"n\">initialization</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">geometric_progression_for_stepsize</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">update</span><span class=\"p\">,</span> <span class=\"n\">dist</span><span class=\"p\">,</span> <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                                       <span class=\"n\">current_iteration</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Geometric progression to search for stepsize.</span>\n<span class=\"sd\">      Keep decreasing stepsize by half until reaching</span>\n<span class=\"sd\">      the desired side of the boundary.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">epsilon</span> <span class=\"o\">=</span> <span class=\"n\">dist</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">current_iteration</span><span class=\"p\">)</span>\n  <span class=\"k\">while</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n    <span class=\"n\">updated</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">epsilon</span> <span class=\"o\">*</span> <span class=\"n\">update</span>\n    <span class=\"n\">success</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">updated</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">])[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"n\">success</span><span class=\"p\">:</span>\n      <span class=\"k\">break</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">epsilon</span> <span class=\"o\">=</span> <span class=\"n\">epsilon</span> <span class=\"o\">/</span> <span class=\"mf\">2.0</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">epsilon</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">select_delta</span><span class=\"p\">(</span><span class=\"n\">dist_post_update</span><span class=\"p\">,</span> <span class=\"n\">current_iteration</span><span class=\"p\">,</span>\n                 <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">d</span><span class=\"p\">,</span> <span class=\"n\">theta</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Choose the delta at the scale of distance</span>\n<span class=\"sd\">   between x and perturbed sample.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">current_iteration</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"mf\">0.1</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"o\">-</span> <span class=\"n\">clip_min</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n      <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">d</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">theta</span> <span class=\"o\">*</span> <span class=\"n\">dist_post_update</span>\n    <span class=\"k\">elif</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n      <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"n\">d</span> <span class=\"o\">*</span> <span class=\"n\">theta</span> <span class=\"o\">*</span> <span class=\"n\">dist_post_update</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">delta</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/lbfgs.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.lbfgs &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.lbfgs</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The LBFGS attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.lbfgs&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"LBFGS\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.LBFGS\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">LBFGS</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  LBFGS is the first adversarial attack for convolutional neural networks,</span>\n<span class=\"sd\">  and is a target &amp; iterative attack.</span>\n<span class=\"sd\">  Paper link: &quot;https://arxiv.org/pdf/1312.6199.pdf&quot;</span>\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;probs&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">LBFGS</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;batch_size&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;binary_search_steps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;max_iterations&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;initial_const&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"LBFGS.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.LBFGS.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n<span class=\"sd\">    :param x: (required) A tensor with the inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"n\">attack</span> <span class=\"o\">=</span> <span class=\"n\">LBFGS_impl</span><span class=\"p\">(</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">lbfgs_wrap</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">      Wrapper creating TensorFlow interface for use with py_func</span>\n<span class=\"sd\">      &quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">attack</span><span class=\"o\">.</span><span class=\"n\">attack</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">lbfgs_wrap</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"LBFGS.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.LBFGS.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n                   <span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"mi\">1000</span><span class=\"p\">,</span>\n                   <span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"mf\">1e-2</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the one-hot target labels.</span>\n<span class=\"sd\">    :param batch_size: The number of inputs to include in a batch and</span>\n<span class=\"sd\">                       process simultaneously.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the purturbation</span>\n<span class=\"sd\">                                and cross-entropy loss of classification.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations.</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the perturbation</span>\n<span class=\"sd\">                          and cross-entropy loss of the classification.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span></div></div>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">LBFGS_impl</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">  input. Generate uses tf.py_func in order to operate over tensors.</span>\n<span class=\"sd\">  :param sess: a TF session.</span>\n<span class=\"sd\">  :param x: A tensor with the inputs.</span>\n<span class=\"sd\">  :param logits: A tensor with model&#39;s output logits.</span>\n<span class=\"sd\">  :param targeted_label: A tensor with the target labels.</span>\n<span class=\"sd\">  :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                              search to find the optimal tradeoff-</span>\n<span class=\"sd\">                              constant between norm of the purturbation</span>\n<span class=\"sd\">                              and cross-entropy loss of classification.</span>\n<span class=\"sd\">  :param max_iterations: The maximum number of iterations.</span>\n<span class=\"sd\">  :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                        relative importance of size of the purturbation</span>\n<span class=\"sd\">                        and cross-entropy loss of the classification.</span>\n<span class=\"sd\">  :param clip_min: Minimum input component value</span>\n<span class=\"sd\">  :param clip_max: Maximum input component value</span>\n<span class=\"sd\">  :param num_labels: The number of classes in the model&#39;s output.</span>\n<span class=\"sd\">  :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">targeted_label</span><span class=\"p\">,</span> <span class=\"n\">targeted_attack</span><span class=\"p\">,</span>\n               <span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"n\">max_iterations</span><span class=\"p\">,</span> <span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n               <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">sess</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">x</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"n\">logits</span>\n    <span class=\"k\">assert</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;Softmax&#39;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_label</span> <span class=\"o\">=</span> <span class=\"n\">targeted_label</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span> <span class=\"o\">=</span> <span class=\"n\">targeted_attack</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">10</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">]</span> <span class=\"o\">+</span>\n                       <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:]))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ori_img</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;ori_img&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">score</span> <span class=\"o\">=</span> <span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span>\n        <span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_label</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ori_img</span><span class=\"p\">))</span>\n    <span class=\"c1\"># small self.const will result small adversarial perturbation</span>\n    <span class=\"c1\"># targeted attack aims at minimize loss against target label</span>\n    <span class=\"c1\"># untargeted attack aims at maximize loss against True label</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">score</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">score</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Perform the attack on the given instance for the given targets.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">lbfgs_objective</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">,</span> <span class=\"n\">oimgs</span><span class=\"p\">,</span> <span class=\"n\">CONST</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot; returns the function value and the gradient for fmin_l_bfgs_b &quot;&quot;&quot;</span>\n      <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span>\n          <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">adv_x</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">),</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_label</span><span class=\"p\">:</span> <span class=\"n\">targets</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ori_img</span><span class=\"p\">:</span> <span class=\"n\">oimgs</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"p\">:</span> <span class=\"n\">CONST</span>\n          <span class=\"p\">})</span>\n      <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad</span><span class=\"p\">,</span>\n          <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">adv_x</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">),</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_label</span><span class=\"p\">:</span> <span class=\"n\">targets</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ori_img</span><span class=\"p\">:</span> <span class=\"n\">oimgs</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"p\">:</span> <span class=\"n\">CONST</span>\n          <span class=\"p\">})</span>\n      <span class=\"k\">return</span> <span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">astype</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">attack_success</span><span class=\"p\">(</span><span class=\"n\">out</span><span class=\"p\">,</span> <span class=\"n\">target</span><span class=\"p\">,</span> <span class=\"n\">targeted_attack</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot; returns attack result &quot;&quot;&quot;</span>\n      <span class=\"k\">if</span> <span class=\"n\">targeted_attack</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">out</span> <span class=\"o\">==</span> <span class=\"n\">target</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">out</span> <span class=\"o\">!=</span> <span class=\"n\">target</span>\n\n    <span class=\"c1\"># begin the main part for the attack</span>\n    <span class=\"kn\">from</span> <span class=\"nn\">scipy.optimize</span> <span class=\"kn\">import</span> <span class=\"n\">fmin_l_bfgs_b</span>\n    <span class=\"n\">oimgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span>\n\n    <span class=\"c1\"># set the lower and upper bounds accordingly</span>\n    <span class=\"n\">lower_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n    <span class=\"n\">upper_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"mf\">1e10</span>\n\n    <span class=\"c1\"># set the box constraints for the optimization function</span>\n    <span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">*</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[:])</span>\n    <span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">*</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[:])</span>\n    <span class=\"n\">clip_bound</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">(),</span> <span class=\"n\">clip_max</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">()))</span>\n\n    <span class=\"c1\"># placeholders for the best l2 and instance attack found so far</span>\n    <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestattack</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">outer_step</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">):</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Binary search step </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n                    <span class=\"n\">outer_step</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># The last iteration (if we run many steps) repeat the search once.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"ow\">and</span> <span class=\"n\">outer_step</span> <span class=\"o\">==</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">upper_bound</span>\n\n      <span class=\"c1\"># optimization function</span>\n      <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">__</span> <span class=\"o\">=</span> <span class=\"n\">fmin_l_bfgs_b</span><span class=\"p\">(</span>\n          <span class=\"n\">lbfgs_objective</span><span class=\"p\">,</span>\n          <span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">astype</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">),</span>\n          <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">,</span> <span class=\"n\">oimgs</span><span class=\"p\">,</span> <span class=\"n\">CONST</span><span class=\"p\">),</span>\n          <span class=\"n\">bounds</span><span class=\"o\">=</span><span class=\"n\">clip_bound</span><span class=\"p\">,</span>\n          <span class=\"n\">maxiter</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span><span class=\"p\">,</span>\n          <span class=\"n\">iprint</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">amax</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span> <span class=\"o\">&lt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">and</span> \\\n          <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">amin</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> \\\n          <span class=\"s1\">&#39;fmin_l_bfgs_b returns are invalid&#39;</span>\n\n      <span class=\"c1\"># adjust the best result (i.e., the adversarial example with the</span>\n      <span class=\"c1\"># smallest perturbation in terms of L_2 norm) found so far</span>\n      <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">atleast_1d</span><span class=\"p\">(</span>\n          <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">model_argmax</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span><span class=\"p\">,</span>\n                                <span class=\"n\">adv_x</span><span class=\"p\">))</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;predicted labels are </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"n\">preds</span><span class=\"p\">)</span>\n\n      <span class=\"n\">l2s</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n      <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"n\">l2s</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"n\">oimgs</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]))</span>\n\n      <span class=\"k\">for</span> <span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">l2</span><span class=\"p\">,</span> <span class=\"n\">pred</span><span class=\"p\">,</span> <span class=\"n\">ii</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">l2s</span><span class=\"p\">,</span> <span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">)):</span>\n        <span class=\"k\">if</span> <span class=\"n\">l2</span> <span class=\"o\">&lt;</span> <span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">attack_success</span><span class=\"p\">(</span><span class=\"n\">pred</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]),</span>\n                                               <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span><span class=\"p\">):</span>\n          <span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">l2</span>\n          <span class=\"n\">o_bestattack</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">ii</span>\n\n      <span class=\"c1\"># adjust the constant as needed</span>\n      <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">attack_success</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]),</span>\n                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span><span class=\"p\">):</span>\n          <span class=\"c1\"># success, divide const by two</span>\n          <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"c1\"># failure, either multiply by 10 if no solution found yet</span>\n          <span class=\"c1\">#          or do binary search with the known upper bound</span>\n          <span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">max</span><span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n          <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">*=</span> <span class=\"mi\">10</span>\n\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Successfully generated adversarial examples &quot;</span>\n                    <span class=\"s2\">&quot;on </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\"> instances.&quot;</span><span class=\"p\">,</span>\n                    <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">),</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n      <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">)</span>\n      <span class=\"n\">mean</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">o_bestl2</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">]))</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;   Mean successful distortion: </span><span class=\"si\">{:.4g}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">mean</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># return the best solution found</span>\n    <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">o_bestattack</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/madry_et_al.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.madry_et_al &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.madry_et_al</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The MadryEtAl attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.projected_gradient_descent</span> <span class=\"kn\">import</span> <span class=\"n\">ProjectedGradientDescent</span>\n\n\n<div class=\"viewcode-block\" id=\"MadryEtAl\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MadryEtAl\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">MadryEtAl</span><span class=\"p\">(</span><span class=\"n\">ProjectedGradientDescent</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The attack from Madry et al 2017</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">MadryEtAl</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                                    <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                    <span class=\"n\">default_rand_init</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                                    <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/max_confidence.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.max_confidence &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.max_confidence</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The MaxConfidence attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.projected_gradient_descent</span> <span class=\"kn\">import</span> <span class=\"n\">ProjectedGradientDescent</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span>\n\n\n<div class=\"viewcode-block\" id=\"MaxConfidence\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">MaxConfidence</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The MaxConfidence attack.</span>\n\n<span class=\"sd\">  An attack designed for use against models that use confidence thresholding</span>\n<span class=\"sd\">  as a defense.</span>\n<span class=\"sd\">  If the underlying optimizer is optimal, this attack procedure gives the</span>\n<span class=\"sd\">  optimal failure rate for every confidence threshold t &gt; 0.5.</span>\n\n<span class=\"sd\">  Publication: https://openreview.net/forum?id=H1g0piA9tQ</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.session.Session</span>\n<span class=\"sd\">  :param base_attacker: cleverhans.attacks.Attack</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">base_attacker</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Model must be cleverhans.model.Model, got &quot;</span> <span class=\"o\">+</span>\n                      <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">)))</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">MaxConfidence</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">base_attacker</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span> <span class=\"o\">=</span> <span class=\"n\">ProjectedGradientDescent</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span> <span class=\"o\">=</span> <span class=\"n\">base_attacker</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span>\n\n<div class=\"viewcode-block\" id=\"MaxConfidence.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: Keyword arguments for the base attacker</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">_nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"MaxConfidence.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">nb_classes</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">params</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div>\n\n<div class=\"viewcode-block\" id=\"MaxConfidence.attack\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence.attack\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">attack</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">true_y</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Runs the untargeted attack.</span>\n<span class=\"sd\">    :param x: The input</span>\n<span class=\"sd\">    :param true_y: The correct label for `x`. This attack aims to produce misclassification.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">adv_x_cls</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"n\">prob_cls</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">true_y_idx</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">true_y</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"n\">expanded_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">concat</span><span class=\"p\">([</span><span class=\"n\">x</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">target_ys</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">cls</span><span class=\"p\">,</span>\n                                        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">))</span>\n                 <span class=\"k\">for</span> <span class=\"bp\">cls</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)]</span>\n    <span class=\"n\">target_y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">concat</span><span class=\"p\">(</span><span class=\"n\">target_ys</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x_cls</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_class</span><span class=\"p\">(</span><span class=\"n\">expanded_x</span><span class=\"p\">,</span> <span class=\"n\">target_y</span><span class=\"p\">)</span>\n    <span class=\"n\">expanded_all_probs</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">adv_x_cls</span><span class=\"p\">)</span>\n\n    <span class=\"n\">adv_x_list</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"n\">adv_x_cls</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n    <span class=\"n\">all_probs_list</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"n\">expanded_all_probs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"bp\">cls</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">):</span>\n      <span class=\"n\">target_y</span> <span class=\"o\">=</span> <span class=\"n\">target_ys</span><span class=\"p\">[</span><span class=\"bp\">cls</span><span class=\"p\">]</span>\n      <span class=\"n\">all_probs</span> <span class=\"o\">=</span> <span class=\"n\">all_probs_list</span><span class=\"p\">[</span><span class=\"bp\">cls</span><span class=\"p\">]</span>\n      <span class=\"c1\"># We don&#39;t actually care whether we hit the target class.</span>\n      <span class=\"c1\"># We care about the probability of the most likely wrong class</span>\n      <span class=\"n\">cur_prob_cls</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">all_probs</span> <span class=\"o\">-</span> <span class=\"n\">true_y</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n      <span class=\"c1\"># Knock out examples that are correctly classified.</span>\n      <span class=\"c1\"># This is not needed to be optimal for t &gt;= 0.5, but may as well do it</span>\n      <span class=\"c1\"># to get better failure rate at lower thresholds.</span>\n      <span class=\"n\">chosen_cls</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">all_probs</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n      <span class=\"n\">eligible</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">not_equal</span><span class=\"p\">(</span><span class=\"n\">true_y_idx</span><span class=\"p\">,</span> <span class=\"n\">chosen_cls</span><span class=\"p\">))</span>\n      <span class=\"n\">cur_prob_cls</span> <span class=\"o\">=</span> <span class=\"n\">cur_prob_cls</span> <span class=\"o\">*</span> <span class=\"n\">eligible</span>\n      <span class=\"n\">prob_cls</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">cur_prob_cls</span><span class=\"p\">)</span>\n\n    <span class=\"n\">probs</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">concat</span><span class=\"p\">([</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"n\">prob_cls</span><span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Don&#39;t need to censor here because we knocked out the true class above</span>\n    <span class=\"c1\"># probs = probs - true_y</span>\n    <span class=\"n\">most_confident</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">probs</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">fused_mask</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">most_confident</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n    <span class=\"n\">masks</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"n\">fused_mask</span><span class=\"p\">,</span> <span class=\"n\">num_or_size_splits</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">m</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">reshaped_masks</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">mask</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">mask</span> <span class=\"ow\">in</span> <span class=\"n\">masks</span><span class=\"p\">]</span>\n    <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">adv_x</span> <span class=\"o\">*</span> <span class=\"n\">rmask</span> <span class=\"k\">for</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span>\n              <span class=\"n\">rmask</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">adv_x_list</span><span class=\"p\">,</span> <span class=\"n\">reshaped_masks</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">out</span></div>\n\n<div class=\"viewcode-block\" id=\"MaxConfidence.attack_class\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence.attack_class\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">attack_class</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">target_y</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Run the attack on a specific target class.</span>\n<span class=\"sd\">    :param x: tf Tensor. The input example.</span>\n<span class=\"sd\">    :param target_y: tf Tensor. The attacker&#39;s desired target class.</span>\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">      A targeted adversarial example, intended to be classified as the target class.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">adv</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span><span class=\"o\">.</span><span class=\"n\">generate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"n\">target_y</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">params</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">adv</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/momentum_iterative_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.momentum_iterative_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.momentum_iterative_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The MomentumIterativeMethod attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.fast_gradient_method</span> <span class=\"kn\">import</span> <span class=\"n\">optimize_linear</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_mean</span><span class=\"p\">,</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n\n<div class=\"viewcode-block\" id=\"MomentumIterativeMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MomentumIterativeMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">MomentumIterativeMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The Momentum Iterative Method (Dong et al. 2017). This method won</span>\n<span class=\"sd\">  the first places in NIPS 2017 Non-targeted Adversarial Attacks and</span>\n<span class=\"sd\">  Targeted Adversarial Attacks. The original paper used hard labels</span>\n<span class=\"sd\">  for this attack; no label smoothing.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/pdf/1710.06081.pdf</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a MomentumIterativeMethod instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">MomentumIterativeMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                                  <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;eps_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;decay_factor&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;sanity_checks&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"MomentumIterativeMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MomentumIterativeMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: Keyword arguments. See `parse_params` for documentation.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                   <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                           <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                        <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># Initialize loop variables</span>\n    <span class=\"n\">momentum</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros_like</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span>\n\n    <span class=\"c1\"># Fix labels to the first model predictions for loss computation</span>\n    <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">_nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span> <span class=\"o\">/</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">__</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Iterate until number of iterations completed&quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">ax</span><span class=\"p\">,</span> <span class=\"n\">m</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Do a momentum step&quot;&quot;&quot;</span>\n      <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">ax</span><span class=\"p\">)</span>\n      <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">targeted</span><span class=\"p\">:</span>\n        <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">loss</span>\n\n      <span class=\"c1\"># Define gradient of loss wrt input</span>\n      <span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">ax</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Normalize current gradient and add it to the accumulated gradient</span>\n      <span class=\"n\">red_ind</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())))</span>\n      <span class=\"n\">avoid_zero_div</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">1e-12</span><span class=\"p\">,</span> <span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n      <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"n\">grad</span> <span class=\"o\">/</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span>\n          <span class=\"n\">avoid_zero_div</span><span class=\"p\">,</span>\n          <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">),</span> <span class=\"n\">red_ind</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n      <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decay_factor</span> <span class=\"o\">*</span> <span class=\"n\">m</span> <span class=\"o\">+</span> <span class=\"n\">grad</span>\n\n      <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">optimize_linear</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;This attack hasn&#39;t been tested for ord=1.&quot;</span>\n                                  <span class=\"s2\">&quot;It&#39;s not clear that FGM makes a good inner &quot;</span>\n                                  <span class=\"s2\">&quot;loop step for iterative optimization since &quot;</span>\n                                  <span class=\"s2\">&quot;it updates just one coordinate at a time.&quot;</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Update and clip adversarial example in current iteration</span>\n      <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">ax</span> <span class=\"o\">+</span> <span class=\"n\">optimal_perturbation</span>\n      <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">ax</span> <span class=\"o\">-</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">ax</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n      <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">ax</span><span class=\"p\">)</span>\n\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">ax</span><span class=\"p\">,</span> <span class=\"n\">m</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span>\n        <span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">([]),</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">momentum</span><span class=\"p\">),</span> <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"MomentumIterativeMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MomentumIterativeMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"mf\">0.06</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">decay_factor</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param eps_iter: (optional float) step size for each attack iteration</span>\n<span class=\"sd\">    :param nb_iter: (optional int) Number of attack iterations.</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the labels to target. Leave</span>\n<span class=\"sd\">                     y_target=None if y is also set. Labels should be</span>\n<span class=\"sd\">                     one-hot-encoded.</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">                Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">    :param decay_factor: (optional) Decay factor for the momentum term.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">=</span> <span class=\"n\">eps_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decay_factor</span> <span class=\"o\">=</span> <span class=\"n\">decay_factor</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span> <span class=\"o\">=</span> <span class=\"n\">sanity_checks</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must not set both y and y_target&quot;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be either np.inf, 1, or 2.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/noise.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.noise &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.noise</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The Noise attack</span>\n\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n\n\n<div class=\"viewcode-block\" id=\"Noise\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Noise\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">Noise</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A weak attack that just picks a random point in the attacker&#39;s action space.</span>\n<span class=\"sd\">  When combined with an attack bundling function, this can be used to implement</span>\n<span class=\"sd\">  random search.</span>\n\n<span class=\"sd\">  References:</span>\n<span class=\"sd\">  https://arxiv.org/abs/1802.00420 recommends random search to help identify</span>\n<span class=\"sd\">    gradient masking.</span>\n<span class=\"sd\">  https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part</span>\n<span class=\"sd\">    of an attack bundling recipe combining many different optimizers to yield</span>\n<span class=\"sd\">    a stronger optimizer.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span>\n               <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">Noise</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"Noise.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Noise.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">!=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">)</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span>\n                            <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"Noise.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Noise.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">                Possible values: np.inf</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be np.inf&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/projected_gradient_descent.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.projected_gradient_descent &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.projected_gradient_descent</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The ProjectedGradientDescent attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.fast_gradient_method</span> <span class=\"kn\">import</span> <span class=\"n\">FastGradientMethod</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils_tf</span> <span class=\"kn\">import</span> <span class=\"n\">clip_eta</span><span class=\"p\">,</span> <span class=\"n\">random_lp_vector</span>\n\n\n<div class=\"viewcode-block\" id=\"ProjectedGradientDescent\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ProjectedGradientDescent\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">ProjectedGradientDescent</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This class implements either the Basic Iterative Method</span>\n<span class=\"sd\">  (Kurakin et al. 2016) when rand_init is set to 0. or the</span>\n<span class=\"sd\">  Madry et al. (2017) method when rand_minmax is larger than 0.</span>\n<span class=\"sd\">  Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf</span>\n<span class=\"sd\">  Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param default_rand_init: whether to use random initialization by default</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">FGM_CLASS</span> <span class=\"o\">=</span> <span class=\"n\">FastGradientMethod</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span>\n               <span class=\"n\">default_rand_init</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a ProjectedGradientDescent instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">ProjectedGradientDescent</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                                                   <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;eps_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;rand_init&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">,</span>\n                              <span class=\"s1\">&#39;sanity_checks&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;loss_fn&#39;</span><span class=\"p\">]</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">default_rand_init</span> <span class=\"o\">=</span> <span class=\"n\">default_rand_init</span>\n\n<div class=\"viewcode-block\" id=\"ProjectedGradientDescent.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                   <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                           <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                        <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># Initialize loop variables</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init</span><span class=\"p\">:</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">random_lp_vector</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span>\n                             <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init_eps</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n                             <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># Clip eta</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">model_preds</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">model_preds</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">model_preds</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n      <span class=\"k\">del</span> <span class=\"n\">model_preds</span>\n\n    <span class=\"n\">y_kwarg</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"k\">if</span> <span class=\"n\">targeted</span> <span class=\"k\">else</span> <span class=\"s1\">&#39;y&#39;</span>\n\n    <span class=\"n\">fgm_params</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span>\n        <span class=\"n\">y_kwarg</span><span class=\"p\">:</span> <span class=\"n\">y</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;loss_fn&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_fn</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span>\n    <span class=\"p\">}</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;FGM is not a good inner loop step for PGD &quot;</span>\n                                <span class=\"s2\">&quot; when ord=1, because ord=1 FGM changes only &quot;</span>\n                                <span class=\"s2\">&quot; one pixel at a time. Use the SparseL1Descent &quot;</span>\n                                <span class=\"s2\">&quot; attack instead, which allows fine-grained &quot;</span>\n                                <span class=\"s2\">&quot; control over the sparsity of the gradient &quot;</span>\n                                <span class=\"s2\">&quot; updates.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Use getattr() to avoid errors in eager execution attacks</span>\n    <span class=\"n\">FGM</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">FGM_CLASS</span><span class=\"p\">(</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span>\n        <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"s1\">&#39;sess&#39;</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">),</span>\n        <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dtypestr</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Iterate until requested number of iterations is completed&quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Do a projected gradient step&quot;&quot;&quot;</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">FGM</span><span class=\"o\">.</span><span class=\"n\">generate</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">fgm_params</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Clipping perturbation eta to self.ord norm ball</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span> <span class=\"o\">-</span> <span class=\"n\">x</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n\n      <span class=\"c1\"># Redo the clipping.</span>\n      <span class=\"c1\"># FGM already did it, but subtracting and re-adding eta can add some</span>\n      <span class=\"c1\"># small numerical error.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">([]),</span> <span class=\"n\">adv_x</span><span class=\"p\">),</span> <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                             <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Asserts run only on CPU.</span>\n    <span class=\"c1\"># When multi-GPU eval code tries to force all PGD ops onto GPU, this</span>\n    <span class=\"c1\"># can cause an error.</span>\n    <span class=\"n\">common_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span>\n                                                      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">common_dtype</span><span class=\"p\">),</span>\n                                              <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">common_dtype</span><span class=\"p\">)))</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">==</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"c1\"># The 1e-6 is needed to compensate for numerical error.</span>\n      <span class=\"c1\"># Without the 1e-6 this fails when e.g. eps=.2, clip_min=.5,</span>\n      <span class=\"c1\"># clip_max=.7</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n                                                <span class=\"mf\">1e-6</span> <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                               <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n                                                <span class=\"o\">-</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                          <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"ProjectedGradientDescent.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"mf\">0.05</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">loss_fn</span><span class=\"o\">=</span><span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">rand_init</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">rand_init_eps</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param eps_iter: (optional float) step size for each attack iteration</span>\n<span class=\"sd\">    :param nb_iter: (optional int) Number of attack iterations.</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the labels to target. Leave</span>\n<span class=\"sd\">                     y_target=None if y is also set. Labels should be</span>\n<span class=\"sd\">                     one-hot-encoded.</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">                Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">    :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    :param rand_init: (optional) Start the gradient descent from a point chosen</span>\n<span class=\"sd\">                      uniformly at random in the norm ball of radius</span>\n<span class=\"sd\">                      rand_init_eps</span>\n<span class=\"sd\">    :param rand_init_eps: (optional float) size of the norm ball from which</span>\n<span class=\"sd\">                          the initial starting point is chosen. Defaults to eps</span>\n<span class=\"sd\">    :param clip_grad: (optional bool) Ignore gradient components at positions</span>\n<span class=\"sd\">                      where the input is already at the boundary of the domain,</span>\n<span class=\"sd\">                      and the update step will get clipped out.</span>\n<span class=\"sd\">    :param sanity_checks: bool Insert tf asserts checking values</span>\n<span class=\"sd\">        (Some tests need to run with no sanity checks because the</span>\n<span class=\"sd\">         tests intentionally configure the attack strangely)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"k\">if</span> <span class=\"n\">rand_init</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">rand_init</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">default_rand_init</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init</span> <span class=\"o\">=</span> <span class=\"n\">rand_init</span>\n    <span class=\"k\">if</span> <span class=\"n\">rand_init_eps</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">rand_init_eps</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init_eps</span> <span class=\"o\">=</span> <span class=\"n\">rand_init_eps</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">=</span> <span class=\"n\">eps_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_fn</span> <span class=\"o\">=</span> <span class=\"n\">loss_fn</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"o\">=</span> <span class=\"n\">clip_grad</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">):</span>\n      <span class=\"c1\"># If these are both known at compile time, we can check before anything</span>\n      <span class=\"c1\"># is run. If they are tf, we can&#39;t check them yet.</span>\n      <span class=\"k\">assert</span> <span class=\"n\">eps_iter</span> <span class=\"o\">&lt;=</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must not set both y and y_target&quot;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be either np.inf, 1, or 2.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must set clip_min and clip_max if clip_grad is set&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span> <span class=\"o\">=</span> <span class=\"n\">sanity_checks</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/saliency_map_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.saliency_map_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.saliency_map_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The SalienceMapMethod attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">from</span> <span class=\"nn\">six.moves</span> <span class=\"kn\">import</span> <span class=\"n\">xrange</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_max</span><span class=\"p\">,</span> <span class=\"n\">reduce_any</span>\n\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"SaliencyMapMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SaliencyMapMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">SaliencyMapMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The Jacobian-based Saliency Map Method (Papernot et al. 2016).</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/pdf/1511.07528.pdf</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n\n<span class=\"sd\">  :note: When not using symbolic implementation in `generate`, `sess` should</span>\n<span class=\"sd\">         be provided</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a SaliencyMapMethod instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SaliencyMapMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;theta&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;gamma&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;symbolic_impl&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"SaliencyMapMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SaliencyMapMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">symbolic_impl</span><span class=\"p\">:</span>\n      <span class=\"c1\"># Create random targets if y_target not provided</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"kn\">from</span> <span class=\"nn\">random</span> <span class=\"kn\">import</span> <span class=\"n\">randint</span>\n\n        <span class=\"k\">def</span> <span class=\"nf\">random_targets</span><span class=\"p\">(</span><span class=\"n\">gt</span><span class=\"p\">):</span>\n          <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">gt</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">()</span>\n          <span class=\"n\">nb_s</span> <span class=\"o\">=</span> <span class=\"n\">gt</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n          <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">gt</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n\n          <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">nb_s</span><span class=\"p\">):</span>\n            <span class=\"n\">result</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"p\">:]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">roll</span><span class=\"p\">(</span><span class=\"n\">result</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"p\">:],</span>\n                                   <span class=\"n\">randint</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n\n          <span class=\"k\">return</span> <span class=\"n\">result</span>\n\n        <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">random_targets</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">labels</span><span class=\"p\">],</span>\n                                   <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">([</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">])</span>\n\n      <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"n\">jsma_symbolic</span><span class=\"p\">(</span>\n          <span class=\"n\">x</span><span class=\"p\">,</span>\n          <span class=\"n\">model</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span>\n          <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">,</span>\n          <span class=\"n\">theta</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">,</span>\n          <span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span><span class=\"p\">,</span>\n          <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n          <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;The jsma_batch function has been removed.&quot;</span>\n                                <span class=\"s2\">&quot; The symbolic_impl argument to SaliencyMapMethod will be removed&quot;</span>\n                                <span class=\"s2\">&quot; on 2019-07-18 or after. Any code that depends on the non-symbolic&quot;</span>\n                                <span class=\"s2\">&quot; implementation of the JSMA should be revised. Consider using&quot;</span>\n                                <span class=\"s2\">&quot; SaliencyMapMethod.generate_np() instead.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">x_adv</span></div>\n\n<div class=\"viewcode-block\" id=\"SaliencyMapMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SaliencyMapMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">theta</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n                   <span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mf\">0.</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">symbolic_impl</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param theta: (optional float) Perturbation introduced to modified</span>\n<span class=\"sd\">                  components (can be positive or negative)</span>\n<span class=\"sd\">    :param gamma: (optional float) Maximum percentage of perturbed features</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum component value for clipping</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum component value for clipping</span>\n<span class=\"sd\">    :param y_target: (optional) Target tensor if the attack is targeted</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span> <span class=\"o\">=</span> <span class=\"n\">theta</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span> <span class=\"o\">=</span> <span class=\"n\">gamma</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">symbolic_impl</span> <span class=\"o\">=</span> <span class=\"n\">symbolic_impl</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">jsma_batch</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span>\n      <span class=\"s2\">&quot;The jsma_batch function has been removed. Any code that depends on it should be revised.&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">jsma_symbolic</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">theta</span><span class=\"p\">,</span> <span class=\"n\">gamma</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of the JSMA (see https://arxiv.org/abs/1511.07528</span>\n<span class=\"sd\">  for details about the algorithm design choices).</span>\n\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param y_target: the target tensor</span>\n<span class=\"sd\">  :param model: a cleverhans.model.Model object.</span>\n<span class=\"sd\">  :param theta: delta for each feature adjustment</span>\n<span class=\"sd\">  :param gamma: a float between 0 - 1 indicating the maximum distortion</span>\n<span class=\"sd\">      percentage</span>\n<span class=\"sd\">  :param clip_min: minimum value for components of the example returned</span>\n<span class=\"sd\">  :param clip_max: maximum value for components of the example returned</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">y_target</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">)</span>\n  <span class=\"n\">nb_features</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">product</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:])</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"o\">==</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span> <span class=\"ow\">and</span> <span class=\"n\">y_target</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"o\">==</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">:</span>\n    <span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"o\">==</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span> <span class=\"ow\">and</span> <span class=\"n\">y_target</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"o\">==</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float64</span><span class=\"p\">:</span>\n    <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Downcasting labels---this should be harmless unless&quot;</span>\n                  <span class=\"s2\">&quot; they are smoothed&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">)</span>\n\n  <span class=\"n\">max_iters</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">floor</span><span class=\"p\">(</span><span class=\"n\">nb_features</span> <span class=\"o\">*</span> <span class=\"n\">gamma</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n  <span class=\"n\">increase</span> <span class=\"o\">=</span> <span class=\"nb\">bool</span><span class=\"p\">(</span><span class=\"n\">theta</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n\n  <span class=\"n\">tmp</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">((</span><span class=\"n\">nb_features</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">),</span> <span class=\"nb\">int</span><span class=\"p\">)</span>\n  <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">fill_diagonal</span><span class=\"p\">(</span><span class=\"n\">tmp</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n  <span class=\"n\">zero_diagonal</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">constant</span><span class=\"p\">(</span><span class=\"n\">tmp</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Compute our initial search domain. We optimize the initial search domain</span>\n  <span class=\"c1\"># by removing all features that are already at their maximum values (if</span>\n  <span class=\"c1\"># increasing input features---otherwise, at their minimum value).</span>\n  <span class=\"k\">if</span> <span class=\"n\">increase</span><span class=\"p\">:</span>\n    <span class=\"n\">search_domain</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"o\">&lt;</span> <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">),</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">search_domain</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"o\">&gt;</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">),</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n\n  <span class=\"c1\"># Loop variables</span>\n  <span class=\"c1\"># x_in: the tensor that holds the latest adversarial outputs that are in</span>\n  <span class=\"c1\">#       progress.</span>\n  <span class=\"c1\"># y_in: the tensor for target labels</span>\n  <span class=\"c1\"># domain_in: the tensor that holds the latest search domain</span>\n  <span class=\"c1\"># cond_in: the boolean tensor to show if more iteration is needed for</span>\n  <span class=\"c1\">#          generating adversarial samples</span>\n  <span class=\"k\">def</span> <span class=\"nf\">condition</span><span class=\"p\">(</span><span class=\"n\">x_in</span><span class=\"p\">,</span> <span class=\"n\">y_in</span><span class=\"p\">,</span> <span class=\"n\">domain_in</span><span class=\"p\">,</span> <span class=\"n\">i_in</span><span class=\"p\">,</span> <span class=\"n\">cond_in</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Repeat the loop until we have achieved misclassification or</span>\n    <span class=\"c1\"># reaches the maximum iterations</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">logical_and</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i_in</span><span class=\"p\">,</span> <span class=\"n\">max_iters</span><span class=\"p\">),</span> <span class=\"n\">cond_in</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Same loop variables as above</span>\n  <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">x_in</span><span class=\"p\">,</span> <span class=\"n\">y_in</span><span class=\"p\">,</span> <span class=\"n\">domain_in</span><span class=\"p\">,</span> <span class=\"n\">i_in</span><span class=\"p\">,</span> <span class=\"n\">cond_in</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Create graph for model logits and predictions</span>\n    <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x_in</span><span class=\"p\">)</span>\n    <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n    <span class=\"n\">preds_onehot</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"n\">depth</span><span class=\"o\">=</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># create the Jacobian graph</span>\n    <span class=\"n\">list_derivatives</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> <span class=\"n\">class_ind</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"n\">nb_classes</span><span class=\"p\">):</span>\n      <span class=\"n\">derivatives</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">[:,</span> <span class=\"n\">class_ind</span><span class=\"p\">],</span> <span class=\"n\">x_in</span><span class=\"p\">)</span>\n      <span class=\"n\">list_derivatives</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">derivatives</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n    <span class=\"n\">grads</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">(</span><span class=\"n\">list_derivatives</span><span class=\"p\">),</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n\n    <span class=\"c1\"># Compute the Jacobian components</span>\n    <span class=\"c1\"># To help with the computation later, reshape the target_class</span>\n    <span class=\"c1\"># and other_class to [nb_classes, -1, 1].</span>\n    <span class=\"c1\"># The last dimention is added to allow broadcasting later.</span>\n    <span class=\"n\">target_class</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">transpose</span><span class=\"p\">(</span><span class=\"n\">y_in</span><span class=\"p\">,</span> <span class=\"n\">perm</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]),</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">])</span>\n    <span class=\"n\">other_classes</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">not_equal</span><span class=\"p\">(</span><span class=\"n\">target_class</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">grads_target</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">grads</span> <span class=\"o\">*</span> <span class=\"n\">target_class</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">grads_other</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">grads</span> <span class=\"o\">*</span> <span class=\"n\">other_classes</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Remove the already-used input features from the search space</span>\n    <span class=\"c1\"># Subtract 2 times the maximum value from those value so that</span>\n    <span class=\"c1\"># they won&#39;t be picked later</span>\n    <span class=\"n\">increase_coef</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"mi\">4</span> <span class=\"o\">*</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">increase</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mi\">2</span><span class=\"p\">)</span> \\\n        <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">domain_in</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">target_tmp</span> <span class=\"o\">=</span> <span class=\"n\">grads_target</span>\n    <span class=\"n\">target_tmp</span> <span class=\"o\">-=</span> <span class=\"n\">increase_coef</span> \\\n        <span class=\"o\">*</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grads_target</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">target_sum</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">target_tmp</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">])</span> \\\n        <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">target_tmp</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n\n    <span class=\"n\">other_tmp</span> <span class=\"o\">=</span> <span class=\"n\">grads_other</span>\n    <span class=\"n\">other_tmp</span> <span class=\"o\">+=</span> <span class=\"n\">increase_coef</span> \\\n        <span class=\"o\">*</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grads_other</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">other_sum</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">other_tmp</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">])</span> \\\n        <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">other_tmp</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n\n    <span class=\"c1\"># Create a mask to only keep features that match conditions</span>\n    <span class=\"k\">if</span> <span class=\"n\">increase</span><span class=\"p\">:</span>\n      <span class=\"n\">scores_mask</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"n\">target_sum</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"p\">(</span><span class=\"n\">other_sum</span> <span class=\"o\">&lt;</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">scores_mask</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"n\">target_sum</span> <span class=\"o\">&lt;</span> <span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"p\">(</span><span class=\"n\">other_sum</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># Create a 2D numpy array of scores for each pair of candidate features</span>\n    <span class=\"n\">scores</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">scores_mask</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span> \\\n        <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">target_sum</span> <span class=\"o\">*</span> <span class=\"n\">other_sum</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">zero_diagonal</span>\n\n    <span class=\"c1\"># Extract the best two pixels</span>\n    <span class=\"n\">best</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span> <span class=\"o\">*</span> <span class=\"n\">nb_features</span><span class=\"p\">]),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"n\">p1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">mod</span><span class=\"p\">(</span><span class=\"n\">best</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">)</span>\n    <span class=\"n\">p2</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">floordiv</span><span class=\"p\">(</span><span class=\"n\">best</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">)</span>\n    <span class=\"n\">p1_one_hot</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">p1</span><span class=\"p\">,</span> <span class=\"n\">depth</span><span class=\"o\">=</span><span class=\"n\">nb_features</span><span class=\"p\">)</span>\n    <span class=\"n\">p2_one_hot</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">p2</span><span class=\"p\">,</span> <span class=\"n\">depth</span><span class=\"o\">=</span><span class=\"n\">nb_features</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Check if more modification is needed for each sample</span>\n    <span class=\"n\">mod_not_done</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y_in</span> <span class=\"o\">*</span> <span class=\"n\">preds_onehot</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">cond</span> <span class=\"o\">=</span> <span class=\"n\">mod_not_done</span> <span class=\"o\">&amp;</span> <span class=\"p\">(</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">domain_in</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Update the search domain</span>\n    <span class=\"n\">cond_float</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">),</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">])</span>\n    <span class=\"n\">to_mod</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">p1_one_hot</span> <span class=\"o\">+</span> <span class=\"n\">p2_one_hot</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">cond_float</span>\n\n    <span class=\"n\">domain_out</span> <span class=\"o\">=</span> <span class=\"n\">domain_in</span> <span class=\"o\">-</span> <span class=\"n\">to_mod</span>\n\n    <span class=\"c1\"># Apply the modification to the images</span>\n    <span class=\"n\">to_mod_reshape</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">to_mod</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">([</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">x_in</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()))</span>\n    <span class=\"k\">if</span> <span class=\"n\">increase</span><span class=\"p\">:</span>\n      <span class=\"n\">x_out</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">x_in</span> <span class=\"o\">+</span> <span class=\"n\">to_mod_reshape</span> <span class=\"o\">*</span> <span class=\"n\">theta</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">x_out</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">x_in</span> <span class=\"o\">-</span> <span class=\"n\">to_mod_reshape</span> <span class=\"o\">*</span> <span class=\"n\">theta</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Increase the iterator, and check if all misclassifications are done</span>\n    <span class=\"n\">i_out</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">i_in</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">cond_out</span> <span class=\"o\">=</span> <span class=\"n\">reduce_any</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">x_out</span><span class=\"p\">,</span> <span class=\"n\">y_in</span><span class=\"p\">,</span> <span class=\"n\">domain_out</span><span class=\"p\">,</span> <span class=\"n\">i_out</span><span class=\"p\">,</span> <span class=\"n\">cond_out</span>\n\n  <span class=\"c1\"># Run loop to do JSMA</span>\n  <span class=\"n\">x_adv</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span>\n      <span class=\"n\">condition</span><span class=\"p\">,</span>\n      <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">search_domain</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"kc\">True</span><span class=\"p\">],</span>\n      <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">x_adv</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/semantic.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.semantic &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.semantic</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;Semantic adversarial examples</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n\n\n<div class=\"viewcode-block\" id=\"Semantic\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Semantic\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">Semantic</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Semantic adversarial examples</span>\n\n<span class=\"sd\">  https://arxiv.org/abs/1703.06857</span>\n\n<span class=\"sd\">  Note: data must either be centered (so that the negative image can be</span>\n<span class=\"sd\">  made by simple negation) or must be in the interval [-1, 1]</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param center: bool</span>\n<span class=\"sd\">    If True, assumes data has 0 mean so the negative image is just negation.</span>\n<span class=\"sd\">    If False, assumes data is in the interval [0, max_val]</span>\n<span class=\"sd\">  :param max_val: float</span>\n<span class=\"sd\">    Maximum value allowed in the input data</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of data</span>\n<span class=\"sd\">  :param kwargs: passed through to the super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">center</span><span class=\"p\">,</span> <span class=\"n\">max_val</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span>\n               <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">Semantic</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">center</span> <span class=\"o\">=</span> <span class=\"n\">center</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_val</span> <span class=\"o\">=</span> <span class=\"n\">max_val</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dataset_factory&#39;</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"s1\">&#39;center&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">dataset_factory</span><span class=\"o\">.</span><span class=\"n\">kwargs</span><span class=\"p\">:</span>\n        <span class=\"k\">assert</span> <span class=\"n\">center</span> <span class=\"o\">==</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">dataset_factory</span><span class=\"o\">.</span><span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;center&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"Semantic.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Semantic.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">center</span><span class=\"p\">:</span>\n      <span class=\"k\">return</span> <span class=\"o\">-</span><span class=\"n\">x</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_val</span> <span class=\"o\">-</span> <span class=\"n\">x</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/sparse_l1_descent.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.sparse_l1_descent &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.sparse_l1_descent</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The SparseL1Descent attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n<span class=\"kn\">from</span> <span class=\"nn\">distutils.version</span> <span class=\"kn\">import</span> <span class=\"n\">LooseVersion</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils_tf</span> <span class=\"kn\">import</span> <span class=\"n\">clip_eta</span><span class=\"p\">,</span> <span class=\"n\">random_lp_vector</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_max</span><span class=\"p\">,</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> \\\n  <span class=\"n\">softmax_cross_entropy_with_logits</span>\n\n\n<div class=\"viewcode-block\" id=\"SparseL1Descent\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SparseL1Descent\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">SparseL1Descent</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This class implements a variant of Projected Gradient Descent for the l1-norm</span>\n<span class=\"sd\">  (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2</span>\n<span class=\"sd\">  cases covered by the ProjectedGradientDescent class, because the steepest</span>\n<span class=\"sd\">  descent direction for the l1-norm is too sparse (it updates a single</span>\n<span class=\"sd\">  coordinate in the adversarial perturbation in each step). This attack has an</span>\n<span class=\"sd\">  additional parameter that controls the sparsity of the update step. For</span>\n<span class=\"sd\">  moderately sparse update steps, the attack vastly outperforms Projected</span>\n<span class=\"sd\">  Steepest Descent and is competitive with other attacks targeted at the l1-norm</span>\n<span class=\"sd\">  such as the ElasticNetMethod attack (which is much more computationally</span>\n<span class=\"sd\">  expensive).</span>\n<span class=\"sd\">  Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a SparseL1Descent instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SparseL1Descent</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                                          <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;eps_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;grad_sparsity&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;rand_init&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">,</span>\n                              <span class=\"s1\">&#39;sanity_checks&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"SparseL1Descent.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SparseL1Descent.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                   <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                           <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                        <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># Initialize loop variables</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init</span><span class=\"p\">:</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">random_lp_vector</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n                             <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># Clip eta</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">model_preds</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">model_preds</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">model_preds</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n      <span class=\"k\">del</span> <span class=\"n\">model_preds</span>\n\n    <span class=\"n\">y_kwarg</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"k\">if</span> <span class=\"n\">targeted</span> <span class=\"k\">else</span> <span class=\"s1\">&#39;y&#39;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Iterate until requested number of iterations is completed&quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Do a projected gradient step&quot;&quot;&quot;</span>\n\n      <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"n\">y_kwarg</span><span class=\"p\">:</span> <span class=\"n\">y</span><span class=\"p\">})</span>\n      <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">sparse_l1_descent</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span>\n                                <span class=\"n\">logits</span><span class=\"p\">,</span>\n                                <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">,</span>\n                                <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span>\n                                <span class=\"n\">q</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"p\">,</span>\n                                <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span><span class=\"p\">,</span>\n                                <span class=\"n\">targeted</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">),</span>\n                                <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Clipping perturbation eta to the l1-ball</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span> <span class=\"o\">-</span> <span class=\"n\">x</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n\n      <span class=\"c1\"># Redo the clipping.</span>\n      <span class=\"c1\"># Subtracting and re-adding eta can add some small numerical error.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">([]),</span> <span class=\"n\">adv_x</span><span class=\"p\">),</span> <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                             <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Asserts run only on CPU.</span>\n    <span class=\"c1\"># When multi-GPU eval code tries to force all PGD ops onto GPU, this</span>\n    <span class=\"c1\"># can cause an error.</span>\n    <span class=\"n\">common_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span>\n                                                      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">common_dtype</span><span class=\"p\">),</span>\n                                              <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">common_dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"SparseL1Descent.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SparseL1Descent.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">10.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">rand_init</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">grad_sparsity</span><span class=\"o\">=</span><span class=\"mi\">99</span><span class=\"p\">,</span>\n                   <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param eps_iter: (optional float) step size for each attack iteration</span>\n<span class=\"sd\">    :param nb_iter: (optional int) Number of attack iterations.</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the labels to target. Leave</span>\n<span class=\"sd\">                     y_target=None if y is also set. Labels should be</span>\n<span class=\"sd\">                     one-hot-encoded.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    :param clip_grad: (optional bool) Ignore gradient components</span>\n<span class=\"sd\">                      at positions where the input is already at the boundary</span>\n<span class=\"sd\">                      of the domain, and the update step will get clipped out.</span>\n<span class=\"sd\">    :param grad_sparsity (optional) Relative sparsity of the gradient update</span>\n<span class=\"sd\">                         step, in percent. Only gradient values larger</span>\n<span class=\"sd\">                         than this percentile are retained. This parameter can</span>\n<span class=\"sd\">                         be a scalar, or a vector of the same length as the</span>\n<span class=\"sd\">                         input batch dimension.</span>\n<span class=\"sd\">    :param sanity_checks: bool Insert tf asserts checking values</span>\n<span class=\"sd\">        (Some tests need to run with no sanity checks because the</span>\n<span class=\"sd\">         tests intentionally configure the attack strangely)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init</span> <span class=\"o\">=</span> <span class=\"n\">rand_init</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">=</span> <span class=\"n\">eps_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"o\">=</span> <span class=\"n\">clip_grad</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span> <span class=\"o\">=</span> <span class=\"n\">grad_sparsity</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">):</span>\n      <span class=\"c1\"># If these are both known at compile time, we can check before anything</span>\n      <span class=\"c1\"># is run. If they are tf, we can&#39;t check them yet.</span>\n      <span class=\"k\">assert</span> <span class=\"n\">eps_iter</span> <span class=\"o\">&lt;=</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must not set both y and y_target&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must set clip_min and clip_max if clip_grad is set&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># The grad_sparsity argument governs the sparsity of the gradient</span>\n    <span class=\"c1\"># update. It indicates the percentile value above which gradient entries</span>\n    <span class=\"c1\"># are retained. It can be specified as a scalar or as a 1-dimensional</span>\n    <span class=\"c1\"># vector of the same size as the input&#39;s batch dimension.</span>\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">)</span> <span class=\"ow\">or</span> \\\n        <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"mi\">0</span> <span class=\"o\">&lt;</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span> <span class=\"o\">&lt;</span> <span class=\"mi\">100</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;grad_sparsity should be in (0, 100)&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">convert_to_tensor</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;grad_sparsity should either be a scalar or a vector&quot;</span><span class=\"p\">)</span>\n\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span> <span class=\"o\">=</span> <span class=\"n\">sanity_checks</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">sparse_l1_descent</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                      <span class=\"n\">logits</span><span class=\"p\">,</span>\n                      <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                      <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span>\n                      <span class=\"n\">q</span><span class=\"o\">=</span><span class=\"mi\">99</span><span class=\"p\">,</span>\n                      <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                      <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                      <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                      <span class=\"n\">targeted</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                      <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of the Dense L1 Descent Method.</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param logits: output of model.get_logits</span>\n<span class=\"sd\">  :param y: (optional) A placeholder for the true labels. If targeted</span>\n<span class=\"sd\">            is true, then provide the target label. Otherwise, only provide</span>\n<span class=\"sd\">            this parameter if you&#39;d like to use true labels when crafting</span>\n<span class=\"sd\">            adversarial samples. Otherwise, model predictions are used as</span>\n<span class=\"sd\">            labels to avoid the &quot;label leaking&quot; effect (explained in this</span>\n<span class=\"sd\">            paper: https://arxiv.org/abs/1611.01236). Default is None.</span>\n<span class=\"sd\">            Labels should be one-hot-encoded.</span>\n<span class=\"sd\">  :param eps: the epsilon (input variation parameter)</span>\n<span class=\"sd\">  :param q: the percentile above which gradient values are retained. Either a</span>\n<span class=\"sd\">            scalar or a vector of same length as the input batch dimension.</span>\n<span class=\"sd\">  :param clip_min: Minimum float value for adversarial example components</span>\n<span class=\"sd\">  :param clip_max: Maximum float value for adversarial example components</span>\n<span class=\"sd\">  :param clip_grad: (optional bool) Ignore gradient components</span>\n<span class=\"sd\">                    at positions where the input is already at the boundary</span>\n<span class=\"sd\">                    of the domain, and the update step will get clipped out.</span>\n<span class=\"sd\">  :param targeted: Is the attack targeted or untargeted? Untargeted, the</span>\n<span class=\"sd\">                   default, will try to make the label incorrect. Targeted</span>\n<span class=\"sd\">                   will instead try to move in the direction of being more</span>\n<span class=\"sd\">                   like y.</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n  <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n  <span class=\"k\">if</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n  <span class=\"c1\"># Make sure the caller has not passed probs by accident</span>\n  <span class=\"k\">assert</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;Softmax&#39;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Using model predictions as ground truth to avoid label leaking</span>\n    <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n  <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span> <span class=\"o\">/</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Compute loss</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">targeted</span><span class=\"p\">:</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">loss</span>\n\n  <span class=\"c1\"># Define gradient of loss wrt input</span>\n  <span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_grad</span><span class=\"p\">:</span>\n    <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">zero_out_clipped_grads</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n  <span class=\"n\">red_ind</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())))</span>\n  <span class=\"n\">dim</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_prod</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n\n  <span class=\"n\">abs_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">dim</span><span class=\"p\">))</span>\n\n  <span class=\"c1\"># if q is a scalar, broadcast it to a vector of same length as the batch dim</span>\n  <span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">broadcast_to</span><span class=\"p\">(</span><span class=\"n\">q</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">:</span><span class=\"mi\">1</span><span class=\"p\">]),</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">)</span>\n  <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">floor</span><span class=\"p\">(</span><span class=\"n\">q</span> <span class=\"o\">/</span> <span class=\"mi\">100</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">dim</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">)),</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># `tf.sort` is much faster than `tf.contrib.distributions.percentile`.</span>\n  <span class=\"c1\"># For TF &lt;= 1.12, use `tf.nn.top_k` as `tf.sort` is not implemented.</span>\n  <span class=\"k\">if</span> <span class=\"n\">LooseVersion</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">__version__</span><span class=\"p\">)</span> <span class=\"o\">&lt;=</span> <span class=\"n\">LooseVersion</span><span class=\"p\">(</span><span class=\"s1\">&#39;1.12.0&#39;</span><span class=\"p\">):</span>\n    <span class=\"c1\"># `tf.sort` is only available in TF 1.13 onwards</span>\n    <span class=\"n\">sorted_grad</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">top_k</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"o\">=</span><span class=\"n\">dim</span><span class=\"p\">,</span> <span class=\"nb\">sorted</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">sorted_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n  <span class=\"n\">idx</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">((</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">range</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]),</span> <span class=\"n\">k</span><span class=\"p\">),</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"n\">percentiles</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gather_nd</span><span class=\"p\">(</span><span class=\"n\">sorted_grad</span><span class=\"p\">,</span> <span class=\"n\">idx</span><span class=\"p\">)</span>\n  <span class=\"n\">tied_for_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater_equal</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">percentiles</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n  <span class=\"n\">tied_for_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tied_for_max</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">))</span>\n  <span class=\"n\">num_ties</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tied_for_max</span><span class=\"p\">,</span> <span class=\"n\">red_ind</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n  <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">tied_for_max</span> <span class=\"o\">/</span> <span class=\"n\">num_ties</span>\n\n  <span class=\"c1\"># Add perturbation to original example to obtain adversarial example</span>\n  <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">mul</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">optimal_perturbation</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># If clipping is needed, reset all values outside of [clip_min, clip_max]</span>\n  <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"c1\"># We don&#39;t currently support one-sided clipping</span>\n    <span class=\"k\">assert</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n    <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">adv_x</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/spatial_transformation_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.spatial_transformation_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.spatial_transformation_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The SpatialTransformationMethod attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n\n\n<div class=\"viewcode-block\" id=\"SpatialTransformationMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SpatialTransformationMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">SpatialTransformationMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Spatial transformation attack</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a SpatialTransformationMethod instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SpatialTransformationMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>\n        <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;n_samples&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dx_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dx_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;n_dxs&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dy_min&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;dy_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;n_dys&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;angle_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;angle_max&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;n_angles&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;black_border_size&#39;</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"SpatialTransformationMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SpatialTransformationMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks_tf</span> <span class=\"kn\">import</span> <span class=\"n\">spm</span>\n\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">spm</span><span class=\"p\">(</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span>\n        <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">,</span>\n        <span class=\"n\">n_samples</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_samples</span><span class=\"p\">,</span>\n        <span class=\"n\">dx_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_min</span><span class=\"p\">,</span> <span class=\"n\">dx_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_max</span><span class=\"p\">,</span> <span class=\"n\">n_dxs</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_dxs</span><span class=\"p\">,</span>\n        <span class=\"n\">dy_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_min</span><span class=\"p\">,</span> <span class=\"n\">dy_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_max</span><span class=\"p\">,</span> <span class=\"n\">n_dys</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_dys</span><span class=\"p\">,</span>\n        <span class=\"n\">angle_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">angle_min</span><span class=\"p\">,</span> <span class=\"n\">angle_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">angle_max</span><span class=\"p\">,</span>\n        <span class=\"n\">n_angles</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_angles</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">black_border_size</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"SpatialTransformationMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SpatialTransformationMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">n_samples</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">dx_min</span><span class=\"o\">=-</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n                   <span class=\"n\">dx_max</span><span class=\"o\">=</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n                   <span class=\"n\">n_dxs</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span>\n                   <span class=\"n\">dy_min</span><span class=\"o\">=-</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n                   <span class=\"n\">dy_max</span><span class=\"o\">=</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n                   <span class=\"n\">n_dys</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span>\n                   <span class=\"n\">angle_min</span><span class=\"o\">=-</span><span class=\"mi\">30</span><span class=\"p\">,</span>\n                   <span class=\"n\">angle_max</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">,</span>\n                   <span class=\"n\">n_angles</span><span class=\"o\">=</span><span class=\"mi\">6</span><span class=\"p\">,</span>\n                   <span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n<span class=\"sd\">    :param n_samples: (optional) The number of transformations sampled to</span>\n<span class=\"sd\">                      construct the attack. Set it to None to run</span>\n<span class=\"sd\">                      full grid attack.</span>\n<span class=\"sd\">    :param dx_min: (optional float) Minimum translation ratio along x-axis.</span>\n<span class=\"sd\">    :param dx_max: (optional float) Maximum translation ratio along x-axis.</span>\n<span class=\"sd\">    :param n_dxs: (optional int) Number of discretized translation ratios</span>\n<span class=\"sd\">                  along x-axis.</span>\n<span class=\"sd\">    :param dy_min: (optional float) Minimum translation ratio along y-axis.</span>\n<span class=\"sd\">    :param dy_max: (optional float) Maximum translation ratio along y-axis.</span>\n<span class=\"sd\">    :param n_dys: (optional int) Number of discretized translation ratios</span>\n<span class=\"sd\">                  along y-axis.</span>\n<span class=\"sd\">    :param angle_min: (optional float) Largest counter-clockwise rotation</span>\n<span class=\"sd\">                      angle.</span>\n<span class=\"sd\">    :param angle_max: (optional float) Largest clockwise rotation angle.</span>\n<span class=\"sd\">    :param n_angles: (optional int) Number of discretized angles.</span>\n<span class=\"sd\">    :param black_border_size: (optional int) size of the black border in pixels.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_samples</span> <span class=\"o\">=</span> <span class=\"n\">n_samples</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_min</span> <span class=\"o\">=</span> <span class=\"n\">dx_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_max</span> <span class=\"o\">=</span> <span class=\"n\">dx_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_dxs</span> <span class=\"o\">=</span> <span class=\"n\">n_dxs</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_min</span> <span class=\"o\">=</span> <span class=\"n\">dy_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_max</span> <span class=\"o\">=</span> <span class=\"n\">dy_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_dys</span> <span class=\"o\">=</span> <span class=\"n\">n_dys</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">angle_min</span> <span class=\"o\">=</span> <span class=\"n\">angle_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">angle_max</span> <span class=\"o\">=</span> <span class=\"n\">angle_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_angles</span> <span class=\"o\">=</span> <span class=\"n\">n_angles</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">black_border_size</span> <span class=\"o\">=</span> <span class=\"n\">black_border_size</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_min</span> <span class=\"o\">&lt;</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_min</span> <span class=\"o\">&lt;</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"ow\">or</span> \\\n       <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_max</span> <span class=\"o\">&gt;</span> <span class=\"mi\">1</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_max</span> <span class=\"o\">&gt;</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;The value of translation must be bounded &quot;</span>\n                       <span class=\"s2\">&quot;within [-1, 1]&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/spsa.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.spsa &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.spsa</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The SPSA attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">from</span> <span class=\"nn\">six.moves</span> <span class=\"kn\">import</span> <span class=\"n\">xrange</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n<span class=\"c1\"># import tensorflow_addons as tfa</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_mean</span><span class=\"p\">,</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"SPSA\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SPSA\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">SPSA</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666</span>\n<span class=\"sd\">  (Uesato et al. 2018). SPSA is a gradient-free optimization method, which</span>\n<span class=\"sd\">  is useful when the model is non-differentiable, or more generally, the</span>\n<span class=\"sd\">  gradients do not point in useful directions.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">DEFAULT_SPSA_SAMPLES</span> <span class=\"o\">=</span> <span class=\"mi\">128</span>\n  <span class=\"n\">DEFAULT_SPSA_ITERS</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n  <span class=\"n\">DEFAULT_DELTA</span> <span class=\"o\">=</span> <span class=\"mf\">0.01</span>\n  <span class=\"n\">DEFAULT_LEARNING_RATE</span> <span class=\"o\">=</span> <span class=\"mf\">0.01</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SPSA</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;spsa_samples&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;spsa_iters&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;early_stop_loss_threshold&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;is_debug&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;is_targeted&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">]</span>\n\n    <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"SPSA.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SPSA.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n               <span class=\"n\">x</span><span class=\"p\">,</span>\n               <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">is_targeted</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">early_stop_loss_threshold</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"n\">DEFAULT_LEARNING_RATE</span><span class=\"p\">,</span>\n               <span class=\"n\">delta</span><span class=\"o\">=</span><span class=\"n\">DEFAULT_DELTA</span><span class=\"p\">,</span>\n               <span class=\"n\">spsa_samples</span><span class=\"o\">=</span><span class=\"n\">DEFAULT_SPSA_SAMPLES</span><span class=\"p\">,</span>\n               <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">spsa_iters</span><span class=\"o\">=</span><span class=\"n\">DEFAULT_SPSA_ITERS</span><span class=\"p\">,</span>\n               <span class=\"n\">is_debug</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n               <span class=\"n\">epsilon</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">num_steps</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs. Must be a batch of size 1.</span>\n<span class=\"sd\">    :param y: A Tensor or None. The index of the correct label.</span>\n<span class=\"sd\">    :param y_target: A Tensor or None. The index of the target label in a</span>\n<span class=\"sd\">                     targeted attack.</span>\n<span class=\"sd\">    :param eps: The size of the maximum perturbation, measured in the</span>\n<span class=\"sd\">                L-infinity norm.</span>\n<span class=\"sd\">    :param clip_min: If specified, the minimum input value</span>\n<span class=\"sd\">    :param clip_max: If specified, the maximum input value</span>\n<span class=\"sd\">    :param nb_iter: The number of optimization steps.</span>\n<span class=\"sd\">    :param early_stop_loss_threshold: A float or None. If specified, the</span>\n<span class=\"sd\">                                      attack will end as soon as the loss</span>\n<span class=\"sd\">                                      is below `early_stop_loss_threshold`.</span>\n<span class=\"sd\">    :param learning_rate: Learning rate of ADAM optimizer.</span>\n<span class=\"sd\">    :param delta: Perturbation size used for SPSA approximation.</span>\n<span class=\"sd\">    :param spsa_samples: Number of inputs to evaluate at a single time.</span>\n<span class=\"sd\">                       The true batch size (the number of evaluated</span>\n<span class=\"sd\">                       inputs for each update) is `spsa_samples *</span>\n<span class=\"sd\">                       spsa_iters`</span>\n<span class=\"sd\">    :param batch_size: Deprecated param that is an alias for spsa_samples</span>\n<span class=\"sd\">    :param spsa_iters: Number of model evaluations before performing an</span>\n<span class=\"sd\">                       update, where each evaluation is on `spsa_samples`</span>\n<span class=\"sd\">                       different inputs.</span>\n<span class=\"sd\">    :param is_debug: If True, print the adversarial loss after each update.</span>\n<span class=\"sd\">    :param epsilon: Deprecated alias for `eps`</span>\n<span class=\"sd\">    :param num_steps: Deprecated alias for `nb_iter`.</span>\n<span class=\"sd\">    :param is_targeted: Deprecated argument. Ignored.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">epsilon</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">eps</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Should not specify both eps and its deprecated &quot;</span>\n                         <span class=\"s2\">&quot;alias, epsilon&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`epsilon` is deprecated. Switch to `eps`. `epsilon` may &quot;</span>\n                    <span class=\"s2\">&quot;be removed on or after 2019-04-15.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">epsilon</span>\n    <span class=\"k\">del</span> <span class=\"n\">epsilon</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">num_steps</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">nb_iter</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Should not specify both nb_iter and its deprecated &quot;</span>\n                         <span class=\"s2\">&quot;alias, num_steps&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`num_steps` is deprecated. Switch to `nb_iter`. &quot;</span>\n                    <span class=\"s2\">&quot;`num_steps` may be removed on or after 2019-04-15.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">num_steps</span>\n    <span class=\"k\">del</span> <span class=\"n\">num_steps</span>\n    <span class=\"k\">assert</span> <span class=\"n\">nb_iter</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must specify exactly one of y (untargeted attack, &quot;</span>\n                       <span class=\"s2\">&quot;cause the input not to be classified as this true &quot;</span>\n                       <span class=\"s2\">&quot;label) and y_target (targeted attack, cause the &quot;</span>\n                       <span class=\"s2\">&quot;input to be classified as this target label).&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">is_targeted</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`is_targeted` is deprecated. Simply do not specify it.&quot;</span>\n                    <span class=\"s2\">&quot; It may become an error to specify it on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-15.&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"n\">is_targeted</span> <span class=\"o\">==</span> <span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n\n    <span class=\"n\">is_targeted</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">check_batch</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">([</span><span class=\"n\">check_batch</span><span class=\"p\">]):</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"k\">elif</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;For SPSA, input tensor x must have batch_size of 1.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">batch_size</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span>\n          <span class=\"s1\">&#39;The &quot;batch_size&quot; argument to SPSA is deprecated, and will &#39;</span>\n          <span class=\"s1\">&#39;be removed on 2019-03-17. &#39;</span>\n          <span class=\"s1\">&#39;Please use spsa_samples instead.&#39;</span><span class=\"p\">)</span>\n      <span class=\"n\">spsa_samples</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n\n    <span class=\"n\">optimizer</span> <span class=\"o\">=</span> <span class=\"n\">SPSAAdam</span><span class=\"p\">(</span>\n        <span class=\"n\">lr</span><span class=\"o\">=</span><span class=\"n\">learning_rate</span><span class=\"p\">,</span>\n        <span class=\"n\">delta</span><span class=\"o\">=</span><span class=\"n\">delta</span><span class=\"p\">,</span>\n        <span class=\"n\">num_samples</span><span class=\"o\">=</span><span class=\"n\">spsa_samples</span><span class=\"p\">,</span>\n        <span class=\"n\">num_iters</span><span class=\"o\">=</span><span class=\"n\">spsa_iters</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">label</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">      Margin logit loss, with correct sign for targeted vs untargeted loss.</span>\n<span class=\"sd\">      &quot;&quot;&quot;</span>\n      <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"n\">loss_multiplier</span> <span class=\"o\">=</span> <span class=\"mi\">1</span> <span class=\"k\">if</span> <span class=\"n\">is_targeted</span> <span class=\"k\">else</span> <span class=\"o\">-</span><span class=\"mi\">1</span>\n      <span class=\"k\">return</span> <span class=\"n\">loss_multiplier</span> <span class=\"o\">*</span> <span class=\"n\">margin_logit_loss</span><span class=\"p\">(</span>\n          <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">label</span><span class=\"p\">,</span>\n          <span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span> <span class=\"ow\">or</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n\n    <span class=\"n\">y_attack</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span> <span class=\"k\">if</span> <span class=\"n\">is_targeted</span> <span class=\"k\">else</span> <span class=\"n\">y</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">projected_optimization</span><span class=\"p\">(</span>\n        <span class=\"n\">loss_fn</span><span class=\"p\">,</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"n\">y_attack</span><span class=\"p\">,</span>\n        <span class=\"n\">eps</span><span class=\"p\">,</span>\n        <span class=\"n\">num_steps</span><span class=\"o\">=</span><span class=\"n\">nb_iter</span><span class=\"p\">,</span>\n        <span class=\"n\">optimizer</span><span class=\"o\">=</span><span class=\"n\">optimizer</span><span class=\"p\">,</span>\n        <span class=\"n\">early_stop_loss_threshold</span><span class=\"o\">=</span><span class=\"n\">early_stop_loss_threshold</span><span class=\"p\">,</span>\n        <span class=\"n\">is_debug</span><span class=\"o\">=</span><span class=\"n\">is_debug</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"n\">clip_max</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"SPSA.generate_np\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SPSA.generate_np\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate_np</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"s2\">&quot;epsilon&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Using deprecated argument: see `generate`&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"s2\">&quot;eps&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span>\n      <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;eps&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;epsilon&quot;</span><span class=\"p\">]</span>\n      <span class=\"k\">del</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;epsilon&quot;</span><span class=\"p\">]</span>\n    <span class=\"k\">assert</span> <span class=\"s2\">&quot;eps&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span>\n\n    <span class=\"k\">if</span> <span class=\"s2\">&quot;num_steps&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Using deprecated argument: see `generate`&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"s2\">&quot;nb_iter&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span>\n      <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;nb_iter&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;num_steps&quot;</span><span class=\"p\">]</span>\n      <span class=\"k\">del</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;num_steps&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># Call self.generate() sequentially for each image in the batch</span>\n    <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">x_val</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">(</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">)</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">),</span> <span class=\"s1\">&#39;# of images and labels should match&#39;</span>\n    <span class=\"k\">for</span> <span class=\"n\">x_single</span><span class=\"p\">,</span> <span class=\"n\">y_single</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">):</span>\n      <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">x_single</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"n\">adv_img</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SPSA</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">generate_np</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"n\">y_single</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n      <span class=\"n\">x_adv</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">adv_img</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">concatenate</span><span class=\"p\">(</span><span class=\"n\">x_adv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">_project_perturbation</span><span class=\"p\">(</span><span class=\"n\">perturbation</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                          <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Project `perturbation` onto L-infinity ball of radius `epsilon`.</span>\n<span class=\"sd\">  Also project into hypercube such that the resulting adversarial example</span>\n<span class=\"sd\">  is between clip_min and clip_max, if applicable.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;_project_perturbation currently has clipping &quot;</span>\n                              <span class=\"s2\">&quot;hard-coded in.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Ensure inputs are in the correct range</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">([</span>\n      <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                 <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n      <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                    <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))</span>\n  <span class=\"p\">]):</span>\n    <span class=\"n\">clipped_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span>\n        <span class=\"n\">perturbation</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"p\">)</span>\n    <span class=\"n\">new_image</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span>\n        <span class=\"n\">input_image</span> <span class=\"o\">+</span> <span class=\"n\">clipped_perturbation</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">new_image</span> <span class=\"o\">-</span> <span class=\"n\">input_image</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">TensorOptimizer</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Optimizer for Tensors rather than tf.Variables.</span>\n\n<span class=\"sd\">  TensorOptimizers implement optimizers where the values being optimized</span>\n<span class=\"sd\">  are ordinary Tensors, rather than Variables. TF Variables can have strange</span>\n<span class=\"sd\">  behaviors when being assigned multiple times within a single sess.run()</span>\n<span class=\"sd\">  call, particularly in Distributed TF, so this avoids thinking about those</span>\n<span class=\"sd\">  issues. These are helper classes for the `projected_optimization`</span>\n<span class=\"sd\">  method. Apart from not using Variables, they follow an interface very</span>\n<span class=\"sd\">  similar to tf.Optimizer.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_compute_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">loss_fn</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">unused_optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Compute a new value of `x` to minimize `loss_fn`.</span>\n\n<span class=\"sd\">    Args:</span>\n<span class=\"sd\">        loss_fn: a callable that takes `x`, a batch of images, and returns</span>\n<span class=\"sd\">            a batch of loss values. `x` will be optimized to minimize</span>\n<span class=\"sd\">            `loss_fn(x)`.</span>\n<span class=\"sd\">        x: A list of Tensors, the values to be updated. This is analogous</span>\n<span class=\"sd\">            to the `var_list` argument in standard TF Optimizer.</span>\n<span class=\"sd\">        unused_optim_state: A (possibly nested) dict, containing any state</span>\n<span class=\"sd\">            info needed for the optimizer.</span>\n\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">        new_x: A list of Tensors, the same length as `x`, which are updated</span>\n<span class=\"sd\">        new_optim_state: A dict, with the same structure as `optim_state`,</span>\n<span class=\"sd\">            which have been updated.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Assumes `x` is a list,</span>\n    <span class=\"c1\"># and contains a tensor representing a batch of images</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">1</span> <span class=\"ow\">and</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"nb\">list</span><span class=\"p\">),</span> \\\n        <span class=\"s1\">&#39;x should be a list and contain only one image tensor&#39;</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_apply_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Given a gradient, make one optimization step.</span>\n\n<span class=\"sd\">    :param grads: list of tensors, same length as `x`, containing the corresponding gradients</span>\n<span class=\"sd\">    :param x: list of tensors to update</span>\n<span class=\"sd\">    :param optim_state: dict</span>\n\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">      new_x: list of tensors, updated version of `x`</span>\n<span class=\"sd\">      new_optim_state: dict, updated version of `optim_state`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;_apply_gradients should be defined in each subclass&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">minimize</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">loss_fn</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Analogous to tf.Optimizer.minimize</span>\n\n<span class=\"sd\">    :param loss_fn: tf Tensor, representing the loss to minimize</span>\n<span class=\"sd\">    :param x: list of Tensor, analogous to tf.Optimizer&#39;s var_list</span>\n<span class=\"sd\">    :param optim_state: A possibly nested dict, containing any optimizer state.</span>\n\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">      new_x: list of Tensor, updated version of `x`</span>\n<span class=\"sd\">      new_optim_state: dict, updated version of `optim_state`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">grads</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_compute_gradients</span><span class=\"p\">(</span><span class=\"n\">loss_fn</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_apply_gradients</span><span class=\"p\">(</span><span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">init_state</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Returns the initial state of the optimizer.</span>\n\n<span class=\"sd\">    Args:</span>\n<span class=\"sd\">        x: A list of Tensors, which will be optimized.</span>\n\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">        A dictionary, representing the initial state of the optimizer.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;init_state should be defined in each subclass&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">TensorGradientDescent</span><span class=\"p\">(</span><span class=\"n\">TensorOptimizer</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Vanilla Gradient Descent TensorOptimizer.&quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">lr</span><span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_lr</span> <span class=\"o\">=</span> <span class=\"n\">lr</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">init_state</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"p\">{}</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_apply_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">):</span>\n    <span class=\"n\">new_x</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)):</span>\n      <span class=\"n\">new_x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_lr</span> <span class=\"o\">*</span> <span class=\"n\">grads</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"n\">new_x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">TensorAdam</span><span class=\"p\">(</span><span class=\"n\">TensorOptimizer</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;The Adam optimizer defined in https://arxiv.org/abs/1412.6980.&quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">lr</span><span class=\"o\">=</span><span class=\"mf\">0.001</span><span class=\"p\">,</span> <span class=\"n\">beta1</span><span class=\"o\">=</span><span class=\"mf\">0.9</span><span class=\"p\">,</span> <span class=\"n\">beta2</span><span class=\"o\">=</span><span class=\"mf\">0.999</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"o\">=</span><span class=\"mf\">1e-9</span><span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_lr</span> <span class=\"o\">=</span> <span class=\"n\">lr</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta1</span> <span class=\"o\">=</span> <span class=\"n\">beta1</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta2</span> <span class=\"o\">=</span> <span class=\"n\">beta2</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_epsilon</span> <span class=\"o\">=</span> <span class=\"n\">epsilon</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">init_state</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Initialize t, m, and u</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">optim_state</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n    <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;t&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mf\">0.</span>\n    <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;m&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros_like</span><span class=\"p\">(</span><span class=\"n\">v</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">x</span><span class=\"p\">]</span>\n    <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;u&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros_like</span><span class=\"p\">(</span><span class=\"n\">v</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">x</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"n\">optim_state</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_apply_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Refer to parent class documentation.&quot;&quot;&quot;</span>\n    <span class=\"n\">new_x</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">new_optim_state</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;t&quot;</span><span class=\"p\">:</span> <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;t&quot;</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">1.</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;m&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span>\n        <span class=\"s2\">&quot;u&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"p\">}</span>\n    <span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;t&quot;</span><span class=\"p\">]</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)):</span>\n      <span class=\"n\">g</span> <span class=\"o\">=</span> <span class=\"n\">grads</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span>\n      <span class=\"n\">m_old</span> <span class=\"o\">=</span> <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;m&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span>\n      <span class=\"n\">u_old</span> <span class=\"o\">=</span> <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;u&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span>\n      <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;m&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta1</span> <span class=\"o\">*</span> <span class=\"n\">m_old</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"mf\">1.</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta1</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">g</span><span class=\"p\">)</span>\n      <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;u&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta2</span> <span class=\"o\">*</span> <span class=\"n\">u_old</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"mf\">1.</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta2</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">g</span> <span class=\"o\">*</span> <span class=\"n\">g</span><span class=\"p\">)</span>\n      <span class=\"n\">m_hat</span> <span class=\"o\">=</span> <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;m&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"mf\">1.</span> <span class=\"o\">-</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pow</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta1</span><span class=\"p\">,</span> <span class=\"n\">t</span><span class=\"p\">))</span>\n      <span class=\"n\">u_hat</span> <span class=\"o\">=</span> <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;u&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"mf\">1.</span> <span class=\"o\">-</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pow</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta2</span><span class=\"p\">,</span> <span class=\"n\">t</span><span class=\"p\">))</span>\n      <span class=\"n\">new_x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_lr</span> <span class=\"o\">*</span> <span class=\"n\">m_hat</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">u_hat</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_epsilon</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">new_x</span><span class=\"p\">,</span> <span class=\"n\">new_optim_state</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">SPSAAdam</span><span class=\"p\">(</span><span class=\"n\">TensorAdam</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Optimizer for gradient-free attacks in https://arxiv.org/abs/1802.05666.</span>\n\n<span class=\"sd\">  Gradients estimates are computed using Simultaneous Perturbation Stochastic</span>\n<span class=\"sd\">  Approximation (SPSA), combined with the ADAM update rule.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n               <span class=\"n\">lr</span><span class=\"o\">=</span><span class=\"mf\">0.01</span><span class=\"p\">,</span>\n               <span class=\"n\">delta</span><span class=\"o\">=</span><span class=\"mf\">0.01</span><span class=\"p\">,</span>\n               <span class=\"n\">num_samples</span><span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">,</span>\n               <span class=\"n\">num_iters</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n               <span class=\"n\">compare_to_analytic_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SPSAAdam</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">lr</span><span class=\"o\">=</span><span class=\"n\">lr</span><span class=\"p\">)</span>\n    <span class=\"k\">assert</span> <span class=\"n\">num_samples</span> <span class=\"o\">%</span> <span class=\"mi\">2</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"s2\">&quot;number of samples must be even&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_delta</span> <span class=\"o\">=</span> <span class=\"n\">delta</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_samples</span> <span class=\"o\">=</span> <span class=\"n\">num_samples</span> <span class=\"o\">//</span> <span class=\"mi\">2</span>  <span class=\"c1\"># Since we mirror +/- delta later</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_iters</span> <span class=\"o\">=</span> <span class=\"n\">num_iters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_compare_to_analytic_grad</span> <span class=\"o\">=</span> <span class=\"n\">compare_to_analytic_grad</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_get_delta</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">delta</span><span class=\"p\">):</span>\n    <span class=\"n\">x_shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()</span>\n    <span class=\"n\">delta_x</span> <span class=\"o\">=</span> <span class=\"n\">delta</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span>\n            <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_samples</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">x_shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:],</span>\n            <span class=\"n\">minval</span><span class=\"o\">=-</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n            <span class=\"n\">maxval</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n            <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">delta_x</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_compute_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">loss_fn</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">unused_optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Compute gradient estimates using SPSA.&quot;&quot;&quot;</span>\n    <span class=\"c1\"># Assumes `x` is a list, containing a [1, H, W, C] image</span>\n    <span class=\"c1\"># If static batch dimension is None, tf.reshape to batch size 1</span>\n    <span class=\"c1\"># so that static shape can be inferred</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">1</span>\n    <span class=\"n\">static_x_shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"n\">static_x_shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">static_x_shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n    <span class=\"k\">assert</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"mi\">1</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">x_shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">grad_array</span><span class=\"p\">):</span>\n      <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_delta</span>\n      <span class=\"n\">delta_x</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_get_delta</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">delta</span><span class=\"p\">)</span>\n      <span class=\"n\">delta_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">concat</span><span class=\"p\">([</span><span class=\"n\">delta_x</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"n\">delta_x</span><span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"n\">loss_vals</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n          <span class=\"n\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">delta_x</span><span class=\"p\">),</span>\n          <span class=\"p\">[</span><span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_samples</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x_shape</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n      <span class=\"n\">avg_grad</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">loss_vals</span> <span class=\"o\">*</span> <span class=\"n\">delta_x</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"n\">delta</span>\n      <span class=\"n\">avg_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">avg_grad</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"n\">new_grad_array</span> <span class=\"o\">=</span> <span class=\"n\">grad_array</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">avg_grad</span><span class=\"p\">)</span>\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">new_grad_array</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">&lt;</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_iters</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">all_grads</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span>\n        <span class=\"n\">cond</span><span class=\"p\">,</span>\n        <span class=\"n\">body</span><span class=\"p\">,</span>\n        <span class=\"n\">loop_vars</span><span class=\"o\">=</span><span class=\"p\">[</span>\n            <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">TensorArray</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_iters</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n        <span class=\"p\">],</span>\n        <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">avg_grad</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">all_grads</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">(),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">avg_grad</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">margin_logit_loss</span><span class=\"p\">(</span><span class=\"n\">model_logits</span><span class=\"p\">,</span> <span class=\"n\">label</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"n\">num_classes</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Computes difference between logit for `label` and next highest logit.</span>\n\n<span class=\"sd\">  The loss is high when `label` is unlikely (targeted by default).</span>\n<span class=\"sd\">  This follows the same interface as `loss_fn` for TensorOptimizer and</span>\n<span class=\"sd\">  projected_optimization, i.e. it returns a batch of loss values.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">num_classes</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`num_classes` is depreciated. Switch to `nb_classes`.&quot;</span>\n                  <span class=\"s2\">&quot; `num_classes` may be removed on or after 2019-04-23.&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">num_classes</span>\n    <span class=\"k\">del</span> <span class=\"n\">num_classes</span>\n  <span class=\"k\">if</span> <span class=\"s1\">&#39;int&#39;</span> <span class=\"ow\">in</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">label</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">):</span>\n    <span class=\"n\">logit_mask</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">label</span><span class=\"p\">,</span> <span class=\"n\">depth</span><span class=\"o\">=</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">logit_mask</span> <span class=\"o\">=</span> <span class=\"n\">label</span>\n  <span class=\"k\">if</span> <span class=\"s1\">&#39;int&#39;</span> <span class=\"ow\">in</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">logit_mask</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">):</span>\n    <span class=\"n\">logit_mask</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">logit_mask</span><span class=\"p\">)</span>\n  <span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">label_logits</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">logit_mask</span> <span class=\"o\">*</span> <span class=\"n\">model_logits</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"k\">except</span> <span class=\"ne\">TypeError</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Could not take row-wise dot product between &quot;</span>\n                    <span class=\"s2\">&quot;logit mask, of dtype &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">logit_mask</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n                    <span class=\"o\">+</span> <span class=\"s2\">&quot; and model_logits, of dtype &quot;</span>\n                    <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">model_logits</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))</span>\n  <span class=\"n\">logits_with_target_label_neg_inf</span> <span class=\"o\">=</span> <span class=\"n\">model_logits</span> <span class=\"o\">-</span> <span class=\"n\">logit_mask</span> <span class=\"o\">*</span> <span class=\"mi\">99999</span>\n  <span class=\"n\">highest_nonlabel_logits</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span>\n      <span class=\"n\">logits_with_target_label_neg_inf</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">highest_nonlabel_logits</span> <span class=\"o\">-</span> <span class=\"n\">label_logits</span>\n  <span class=\"k\">return</span> <span class=\"n\">loss</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">_apply_black_border</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">border_size</span><span class=\"p\">):</span>\n  <span class=\"n\">orig_height</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n  <span class=\"n\">orig_width</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">resize_images</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">orig_width</span> <span class=\"o\">-</span> <span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">border_size</span><span class=\"p\">,</span>\n                                 <span class=\"n\">orig_height</span> <span class=\"o\">-</span> <span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">border_size</span><span class=\"p\">))</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pad</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">[[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">],</span>\n                    <span class=\"p\">[</span><span class=\"n\">border_size</span><span class=\"p\">,</span> <span class=\"n\">border_size</span><span class=\"p\">],</span>\n                    <span class=\"p\">[</span><span class=\"n\">border_size</span><span class=\"p\">,</span> <span class=\"n\">border_size</span><span class=\"p\">],</span>\n                    <span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]],</span> <span class=\"s1\">&#39;CONSTANT&#39;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">_apply_transformation</span><span class=\"p\">(</span><span class=\"n\">inputs</span><span class=\"p\">):</span>\n  <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">trans</span> <span class=\"o\">=</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n  <span class=\"n\">dx</span><span class=\"p\">,</span> <span class=\"n\">dy</span><span class=\"p\">,</span> <span class=\"n\">angle</span> <span class=\"o\">=</span> <span class=\"n\">trans</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">trans</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">],</span> <span class=\"n\">trans</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n  <span class=\"n\">height</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n  <span class=\"n\">width</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n\n  <span class=\"c1\"># Pad the image to prevent two-step rotation / translation from truncating</span>\n  <span class=\"c1\"># corners</span>\n  <span class=\"n\">max_dist_from_center</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">height</span><span class=\"o\">**</span><span class=\"mi\">2</span><span class=\"o\">+</span><span class=\"n\">width</span><span class=\"o\">**</span><span class=\"mi\">2</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n  <span class=\"n\">min_edge_from_center</span> <span class=\"o\">=</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">min</span><span class=\"p\">([</span><span class=\"n\">height</span><span class=\"p\">,</span> <span class=\"n\">width</span><span class=\"p\">]))</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n  <span class=\"n\">padding</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ceil</span><span class=\"p\">(</span><span class=\"n\">max_dist_from_center</span> <span class=\"o\">-</span>\n                    <span class=\"n\">min_edge_from_center</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">astype</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pad</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">[[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">],</span>\n                 <span class=\"p\">[</span><span class=\"n\">padding</span><span class=\"p\">,</span> <span class=\"n\">padding</span><span class=\"p\">],</span>\n                 <span class=\"p\">[</span><span class=\"n\">padding</span><span class=\"p\">,</span> <span class=\"n\">padding</span><span class=\"p\">],</span>\n                 <span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]],</span>\n             <span class=\"s1\">&#39;CONSTANT&#39;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Apply rotation</span>\n  <span class=\"n\">angle</span> <span class=\"o\">*=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">pi</span> <span class=\"o\">/</span> <span class=\"mi\">180</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tfa</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">rotate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">angle</span><span class=\"p\">,</span> <span class=\"n\">interpolation</span><span class=\"o\">=</span><span class=\"s1\">&#39;BILINEAR&#39;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Apply translation</span>\n  <span class=\"n\">dx_in_px</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">dx</span> <span class=\"o\">*</span> <span class=\"n\">height</span>\n  <span class=\"n\">dy_in_px</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">dy</span> <span class=\"o\">*</span> <span class=\"n\">width</span>\n  <span class=\"n\">translation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">convert_to_tensor</span><span class=\"p\">([</span><span class=\"n\">dx_in_px</span><span class=\"p\">,</span> <span class=\"n\">dy_in_px</span><span class=\"p\">])</span>\n\n  <span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tfa</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">translate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">translation</span><span class=\"p\">,</span> <span class=\"n\">interpolation</span><span class=\"o\">=</span><span class=\"s1\">&#39;BILINEAR&#39;</span><span class=\"p\">)</span>\n  <span class=\"k\">except</span> <span class=\"ne\">AttributeError</span> <span class=\"k\">as</span> <span class=\"n\">e</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;WARNING: SpatialAttack requires tf 1.6 or higher&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">raise</span> <span class=\"n\">e</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tfa</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">translate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">translation</span><span class=\"p\">,</span> <span class=\"n\">interpolation</span><span class=\"o\">=</span><span class=\"s1\">&#39;BILINEAR&#39;</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">resize_image_with_crop_or_pad</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">height</span><span class=\"p\">,</span> <span class=\"n\">width</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">spm</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">n_samples</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dx_min</span><span class=\"o\">=-</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n        <span class=\"n\">dx_max</span><span class=\"o\">=</span><span class=\"mf\">0.1</span><span class=\"p\">,</span> <span class=\"n\">n_dxs</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"n\">dy_min</span><span class=\"o\">=-</span><span class=\"mf\">0.1</span><span class=\"p\">,</span> <span class=\"n\">dy_max</span><span class=\"o\">=</span><span class=\"mf\">0.1</span><span class=\"p\">,</span> <span class=\"n\">n_dys</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">,</span>\n        <span class=\"n\">angle_min</span><span class=\"o\">=-</span><span class=\"mi\">30</span><span class=\"p\">,</span> <span class=\"n\">angle_max</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">,</span> <span class=\"n\">n_angles</span><span class=\"o\">=</span><span class=\"mi\">31</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of the Spatial Transformation Method.</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Using model predictions as ground truth to avoid label leaking</span>\n    <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n    <span class=\"k\">del</span> <span class=\"n\">preds</span>\n  <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span> <span class=\"o\">/</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Define the range of transformations</span>\n  <span class=\"n\">dxs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linspace</span><span class=\"p\">(</span><span class=\"n\">dx_min</span><span class=\"p\">,</span> <span class=\"n\">dx_max</span><span class=\"p\">,</span> <span class=\"n\">n_dxs</span><span class=\"p\">)</span>\n  <span class=\"n\">dys</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linspace</span><span class=\"p\">(</span><span class=\"n\">dy_min</span><span class=\"p\">,</span> <span class=\"n\">dy_max</span><span class=\"p\">,</span> <span class=\"n\">n_dys</span><span class=\"p\">)</span>\n  <span class=\"n\">angles</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linspace</span><span class=\"p\">(</span><span class=\"n\">angle_min</span><span class=\"p\">,</span> <span class=\"n\">angle_max</span><span class=\"p\">,</span> <span class=\"n\">n_angles</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">n_samples</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"kn\">import</span> <span class=\"nn\">itertools</span>\n    <span class=\"n\">transforms</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">itertools</span><span class=\"o\">.</span><span class=\"n\">product</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"p\">[</span><span class=\"n\">dxs</span><span class=\"p\">,</span> <span class=\"n\">dys</span><span class=\"p\">,</span> <span class=\"n\">angles</span><span class=\"p\">]))</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">sampled_dxs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">choice</span><span class=\"p\">(</span><span class=\"n\">dxs</span><span class=\"p\">,</span> <span class=\"n\">n_samples</span><span class=\"p\">)</span>\n    <span class=\"n\">sampled_dys</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">choice</span><span class=\"p\">(</span><span class=\"n\">dys</span><span class=\"p\">,</span> <span class=\"n\">n_samples</span><span class=\"p\">)</span>\n    <span class=\"n\">sampled_angles</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">choice</span><span class=\"p\">(</span><span class=\"n\">angles</span><span class=\"p\">,</span> <span class=\"n\">n_samples</span><span class=\"p\">)</span>\n    <span class=\"n\">transforms</span> <span class=\"o\">=</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">sampled_dxs</span><span class=\"p\">,</span> <span class=\"n\">sampled_dys</span><span class=\"p\">,</span> <span class=\"n\">sampled_angles</span><span class=\"p\">)</span>\n  <span class=\"n\">transformed_ims</span> <span class=\"o\">=</span> <span class=\"n\">parallel_apply_transformations</span><span class=\"p\">(</span>\n      <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">transforms</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_compute_xent</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax_cross_entropy_with_logits_v2</span><span class=\"p\">(</span>\n        <span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">preds</span><span class=\"p\">)</span>\n\n  <span class=\"n\">all_xents</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">map_fn</span><span class=\"p\">(</span>\n      <span class=\"n\">_compute_xent</span><span class=\"p\">,</span>\n      <span class=\"n\">transformed_ims</span><span class=\"p\">,</span>\n      <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>  <span class=\"c1\"># Must be 1 to avoid keras race conditions</span>\n\n  <span class=\"c1\"># Return the adv_x with worst accuracy</span>\n\n  <span class=\"c1\"># all_xents is n_total_samples x batch_size (SB)</span>\n  <span class=\"n\">all_xents</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">(</span><span class=\"n\">all_xents</span><span class=\"p\">)</span>  <span class=\"c1\"># SB</span>\n\n  <span class=\"c1\"># We want the worst case sample, with the largest xent_loss</span>\n  <span class=\"n\">worst_sample_idx</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">all_xents</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>  <span class=\"c1\"># B</span>\n\n  <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n  <span class=\"n\">keys</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">([</span>\n      <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">range</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">),</span>\n      <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">worst_sample_idx</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span>\n  <span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"n\">transformed_ims_bshwc</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">einsum</span><span class=\"p\">(</span><span class=\"s1\">&#39;sbhwc-&gt;bshwc&#39;</span><span class=\"p\">,</span> <span class=\"n\">transformed_ims</span><span class=\"p\">)</span>\n  <span class=\"n\">after_lookup</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gather_nd</span><span class=\"p\">(</span><span class=\"n\">transformed_ims_bshwc</span><span class=\"p\">,</span> <span class=\"n\">keys</span><span class=\"p\">)</span>  <span class=\"c1\"># BHWC</span>\n  <span class=\"k\">return</span> <span class=\"n\">after_lookup</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">parallel_apply_transformations</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">transforms</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Apply image transformations in parallel.</span>\n<span class=\"sd\">  :param transforms: TODO</span>\n<span class=\"sd\">  :param black_border_size: int, size of black border to apply</span>\n<span class=\"sd\">  Returns:</span>\n<span class=\"sd\">    Transformed images</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">transforms</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">convert_to_tensor</span><span class=\"p\">(</span><span class=\"n\">transforms</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">)</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">_apply_black_border</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"p\">)</span>\n\n  <span class=\"n\">num_transforms</span> <span class=\"o\">=</span> <span class=\"n\">transforms</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n  <span class=\"n\">im_shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:]</span>\n\n  <span class=\"c1\"># Pass a copy of x and a transformation to each iteration of the map_fn</span>\n  <span class=\"c1\"># callable</span>\n  <span class=\"n\">tiled_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n      <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">tile</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">num_transforms</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">]),</span>\n      <span class=\"p\">[</span><span class=\"n\">num_transforms</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">im_shape</span><span class=\"p\">)</span>\n  <span class=\"n\">elems</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tiled_x</span><span class=\"p\">,</span> <span class=\"n\">transforms</span><span class=\"p\">]</span>\n  <span class=\"n\">transformed_ims</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">map_fn</span><span class=\"p\">(</span>\n      <span class=\"n\">_apply_transformation</span><span class=\"p\">,</span>\n      <span class=\"n\">elems</span><span class=\"p\">,</span>\n      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span>\n      <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>  <span class=\"c1\"># Must be 1 to avoid keras race conditions</span>\n  <span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">transformed_ims</span>\n\n\n<div class=\"viewcode-block\" id=\"projected_optimization\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.projected_optimization\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">projected_optimization</span><span class=\"p\">(</span><span class=\"n\">loss_fn</span><span class=\"p\">,</span>\n                           <span class=\"n\">input_image</span><span class=\"p\">,</span>\n                           <span class=\"n\">label</span><span class=\"p\">,</span>\n                           <span class=\"n\">epsilon</span><span class=\"p\">,</span>\n                           <span class=\"n\">num_steps</span><span class=\"p\">,</span>\n                           <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                           <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                           <span class=\"n\">optimizer</span><span class=\"o\">=</span><span class=\"n\">TensorAdam</span><span class=\"p\">(),</span>\n                           <span class=\"n\">project_perturbation</span><span class=\"o\">=</span><span class=\"n\">_project_perturbation</span><span class=\"p\">,</span>\n                           <span class=\"n\">early_stop_loss_threshold</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                           <span class=\"n\">is_debug</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Generic projected optimization, generalized to work with approximate</span>\n<span class=\"sd\">  gradients. Used for e.g. the SPSA attack.</span>\n\n<span class=\"sd\">  Args:</span>\n<span class=\"sd\">    :param loss_fn: A callable which takes `input_image` and `label` as</span>\n<span class=\"sd\">                    arguments, and returns a batch of loss values. Same</span>\n<span class=\"sd\">                    interface as TensorOptimizer.</span>\n<span class=\"sd\">    :param input_image: Tensor, a batch of images</span>\n<span class=\"sd\">    :param label: Tensor, a batch of labels</span>\n<span class=\"sd\">    :param epsilon: float, the L-infinity norm of the maximum allowable</span>\n<span class=\"sd\">                    perturbation</span>\n<span class=\"sd\">    :param num_steps: int, the number of steps of gradient descent</span>\n<span class=\"sd\">    :param clip_min: float, minimum pixel value</span>\n<span class=\"sd\">    :param clip_max: float, maximum pixel value</span>\n<span class=\"sd\">    :param optimizer: A `TensorOptimizer` object</span>\n<span class=\"sd\">    :param project_perturbation: A function, which will be used to enforce</span>\n<span class=\"sd\">                                 some constraint. It should have the same</span>\n<span class=\"sd\">                                 signature as `_project_perturbation`.</span>\n<span class=\"sd\">    :param early_stop_loss_threshold: A float or None. If specified, the attack will end if the loss is below</span>\n<span class=\"sd\">       `early_stop_loss_threshold`.</span>\n<span class=\"sd\">        Enabling this option can have several different effects:</span>\n<span class=\"sd\">          - Setting the threshold to 0. guarantees that if a successful attack is found, it is returned.</span>\n<span class=\"sd\">            This increases the attack success rate, because without early stopping the optimizer can accidentally</span>\n<span class=\"sd\">            bounce back to a point where the attack fails.</span>\n<span class=\"sd\">          - Early stopping can make the attack run faster because it may run for fewer steps.</span>\n<span class=\"sd\">          - Early stopping can make the attack run slower because the loss must be calculated at each step.</span>\n<span class=\"sd\">            The loss is not calculated as part of the normal SPSA optimization procedure.</span>\n<span class=\"sd\">            For most reasonable choices of hyperparameters, early stopping makes the attack much faster because</span>\n<span class=\"sd\">            it decreases the number of steps dramatically.</span>\n<span class=\"sd\">    :param is_debug: A bool. If True, print debug info for attack progress.</span>\n\n<span class=\"sd\">  Returns:</span>\n<span class=\"sd\">    adversarial version of `input_image`, with L-infinity difference less than</span>\n<span class=\"sd\">      epsilon, which tries to minimize loss_fn.</span>\n\n<span class=\"sd\">  Note that this function is not intended as an Attack by itself. Rather, it</span>\n<span class=\"sd\">  is designed as a helper function which you can use to write your own attack</span>\n<span class=\"sd\">  methods. The method uses a tf.while_loop to optimize a loss function in</span>\n<span class=\"sd\">  a single sess.run() call.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"n\">num_steps</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n  <span class=\"k\">if</span> <span class=\"n\">is_debug</span><span class=\"p\">:</span>\n    <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/cpu:0&quot;</span><span class=\"p\">):</span>\n      <span class=\"n\">input_image</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Print</span><span class=\"p\">(</span>\n          <span class=\"n\">input_image</span><span class=\"p\">,</span> <span class=\"p\">[],</span>\n          <span class=\"s2\">&quot;Starting PGD attack with epsilon: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">epsilon</span><span class=\"p\">)</span>\n\n  <span class=\"n\">init_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span>\n      <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">),</span>\n      <span class=\"n\">minval</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n      <span class=\"n\">maxval</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n  <span class=\"n\">init_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">project_perturbation</span><span class=\"p\">(</span><span class=\"n\">init_perturbation</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"p\">,</span>\n                                           <span class=\"n\">input_image</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                           <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n  <span class=\"n\">init_optim_state</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">init_state</span><span class=\"p\">([</span><span class=\"n\">init_perturbation</span><span class=\"p\">])</span>\n  <span class=\"n\">nest</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nest</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">loop_body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">perturbation</span><span class=\"p\">,</span> <span class=\"n\">flat_optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Update perturbation to input image.&quot;&quot;&quot;</span>\n    <span class=\"n\">optim_state</span> <span class=\"o\">=</span> <span class=\"n\">nest</span><span class=\"o\">.</span><span class=\"n\">pack_sequence_as</span><span class=\"p\">(</span>\n        <span class=\"n\">structure</span><span class=\"o\">=</span><span class=\"n\">init_optim_state</span><span class=\"p\">,</span> <span class=\"n\">flat_sequence</span><span class=\"o\">=</span><span class=\"n\">flat_optim_state</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">wrapped_loss_fn</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">input_image</span> <span class=\"o\">+</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">label</span><span class=\"p\">)</span>\n\n    <span class=\"n\">new_perturbation_list</span><span class=\"p\">,</span> <span class=\"n\">new_optim_state</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span>\n        <span class=\"n\">wrapped_loss_fn</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">perturbation</span><span class=\"p\">],</span> <span class=\"n\">optim_state</span><span class=\"p\">)</span>\n    <span class=\"n\">projected_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">project_perturbation</span><span class=\"p\">(</span><span class=\"n\">new_perturbation_list</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span>\n                                                  <span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                                  <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                  <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Be careful with this bool. A value of 0. is a valid threshold but evaluates to False, so we must explicitly</span>\n    <span class=\"c1\"># check whether the value is None.</span>\n    <span class=\"n\">early_stop</span> <span class=\"o\">=</span> <span class=\"n\">early_stop_loss_threshold</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n    <span class=\"n\">compute_loss</span> <span class=\"o\">=</span> <span class=\"n\">is_debug</span> <span class=\"ow\">or</span> <span class=\"n\">early_stop</span>\n    <span class=\"c1\"># Don&#39;t waste time building the loss graph if we&#39;re not going to use it</span>\n    <span class=\"k\">if</span> <span class=\"n\">compute_loss</span><span class=\"p\">:</span>\n      <span class=\"c1\"># NOTE: this step is not actually redundant with the optimizer step.</span>\n      <span class=\"c1\"># SPSA calculates the loss at randomly perturbed points but doesn&#39;t calculate the loss at the current point.</span>\n      <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">wrapped_loss_fn</span><span class=\"p\">(</span><span class=\"n\">projected_perturbation</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n      <span class=\"k\">if</span> <span class=\"n\">is_debug</span><span class=\"p\">:</span>\n        <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/cpu:0&quot;</span><span class=\"p\">):</span>\n          <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Print</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">loss</span><span class=\"p\">],</span> <span class=\"s2\">&quot;Total batch loss&quot;</span><span class=\"p\">)</span>\n\n      <span class=\"k\">if</span> <span class=\"n\">early_stop</span><span class=\"p\">:</span>\n        <span class=\"n\">i</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cond</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">early_stop_loss_threshold</span><span class=\"p\">),</span>\n                    <span class=\"k\">lambda</span><span class=\"p\">:</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"n\">num_steps</span><span class=\"p\">),</span> <span class=\"k\">lambda</span><span class=\"p\">:</span> <span class=\"n\">i</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">projected_perturbation</span><span class=\"p\">,</span> <span class=\"n\">nest</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">(</span><span class=\"n\">new_optim_state</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">_</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">num_steps</span><span class=\"p\">)</span>\n\n  <span class=\"n\">flat_init_optim_state</span> <span class=\"o\">=</span> <span class=\"n\">nest</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">(</span><span class=\"n\">init_optim_state</span><span class=\"p\">)</span>\n  <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">final_perturbation</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span>\n      <span class=\"n\">cond</span><span class=\"p\">,</span>\n      <span class=\"n\">loop_body</span><span class=\"p\">,</span>\n      <span class=\"n\">loop_vars</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">constant</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">),</span> <span class=\"n\">init_perturbation</span><span class=\"p\">,</span> <span class=\"n\">flat_init_optim_state</span><span class=\"p\">),</span>\n      <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n      <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n      <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"n\">num_steps</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">project_perturbation</span> <span class=\"ow\">is</span> <span class=\"n\">_project_perturbation</span><span class=\"p\">:</span>\n    <span class=\"c1\"># TODO: this assert looks totally wrong.</span>\n    <span class=\"c1\"># Not bothering to fix it now because it&#39;s only an assert.</span>\n    <span class=\"c1\"># 1) Multiplying by 1.1 gives a huge margin of error. This should probably</span>\n    <span class=\"c1\">#    take the difference and allow a tolerance of 1e-6 or something like</span>\n    <span class=\"c1\">#    that.</span>\n    <span class=\"c1\"># 2) I think it should probably check the *absolute value* of</span>\n    <span class=\"c1\"># final_perturbation</span>\n    <span class=\"n\">perturbation_max</span> <span class=\"o\">=</span> <span class=\"n\">epsilon</span> <span class=\"o\">*</span> <span class=\"mf\">1.1</span>\n    <span class=\"n\">check_diff</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span>\n        <span class=\"n\">final_perturbation</span><span class=\"p\">,</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">perturbation_max</span><span class=\"p\">,</span> <span class=\"n\">final_perturbation</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n        <span class=\"n\">message</span><span class=\"o\">=</span><span class=\"s2\">&quot;final_perturbation must change no pixel by more than &quot;</span>\n                <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">perturbation_max</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"c1\"># TODO: let caller pass in a check_diff function as well as</span>\n    <span class=\"c1\"># project_perturbation</span>\n    <span class=\"n\">check_diff</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">no_op</span><span class=\"p\">()</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;This function only supports clipping for now&quot;</span><span class=\"p\">)</span>\n  <span class=\"n\">check_range</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                    <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                 <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                               <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                       <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))]</span>\n\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">([</span><span class=\"n\">check_diff</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">check_range</span><span class=\"p\">):</span>\n    <span class=\"n\">adversarial_image</span> <span class=\"o\">=</span> <span class=\"n\">input_image</span> <span class=\"o\">+</span> <span class=\"n\">final_perturbation</span>\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">adversarial_image</span><span class=\"p\">)</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/attacks/virtual_adversarial_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.virtual_adversarial_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.virtual_adversarial_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The VirtualAdversarialMethod attack</span>\n\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">CallableModelWrapper</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">wrapper_warning_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"VirtualAdversarialMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">VirtualAdversarialMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This attack was originally proposed by Miyato et al. (2016) and was used</span>\n<span class=\"sd\">  for virtual adversarial training.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1507.00677</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">VirtualAdversarialMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;xi&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;num_iterations&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"VirtualAdversarialMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">vatm</span><span class=\"p\">(</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span>\n        <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span>\n        <span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_iterations</span><span class=\"p\">,</span>\n        <span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">xi</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"VirtualAdversarialMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">2.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"mf\">1e-6</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float )the epsilon (input variation parameter)</span>\n<span class=\"sd\">    :param nb_iter: (optional) the number of iterations</span>\n<span class=\"sd\">      Defaults to 1 if not specified</span>\n<span class=\"sd\">    :param xi: (optional float) the finite difference parameter</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    :param num_iterations: Deprecated alias for `nb_iter`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"k\">if</span> <span class=\"n\">num_iterations</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`num_iterations` is deprecated. Switch to `nb_iter`.&quot;</span>\n                    <span class=\"s2\">&quot; The old name will be removed on or after 2019-04-26.&quot;</span><span class=\"p\">)</span>\n      <span class=\"c1\"># Note: when we remove the deprecated alias, we can put the default</span>\n      <span class=\"c1\"># value of 1 for nb_iter back in the method signature</span>\n      <span class=\"k\">assert</span> <span class=\"n\">nb_iter</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span>\n      <span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">num_iterations</span>\n    <span class=\"k\">del</span> <span class=\"n\">num_iterations</span>\n    <span class=\"k\">if</span> <span class=\"n\">nb_iter</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_iterations</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">xi</span> <span class=\"o\">=</span> <span class=\"n\">xi</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<div class=\"viewcode-block\" id=\"vatm\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.vatm\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">vatm</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span>\n         <span class=\"n\">x</span><span class=\"p\">,</span>\n         <span class=\"n\">logits</span><span class=\"p\">,</span>\n         <span class=\"n\">eps</span><span class=\"p\">,</span>\n         <span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n         <span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"mf\">1e-6</span><span class=\"p\">,</span>\n         <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n         <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n         <span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Tensorflow implementation of the perturbation method used for virtual</span>\n<span class=\"sd\">  adversarial training: https://arxiv.org/abs/1507.00677</span>\n<span class=\"sd\">  :param model: the model which returns the network unnormalized logits</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param logits: the model&#39;s unnormalized output tensor (the input to</span>\n<span class=\"sd\">                 the softmax layer)</span>\n<span class=\"sd\">  :param eps: the epsilon (input variation parameter)</span>\n<span class=\"sd\">  :param num_iterations: the number of iterations</span>\n<span class=\"sd\">  :param xi: the finite difference parameter</span>\n<span class=\"sd\">  :param clip_min: optional parameter that can be used to set a minimum</span>\n<span class=\"sd\">                  value for components of the example returned</span>\n<span class=\"sd\">  :param clip_max: optional parameter that can be used to set a maximum</span>\n<span class=\"sd\">                  value for components of the example returned</span>\n<span class=\"sd\">  :param seed: the seed for random generator</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">name_scope</span><span class=\"p\">(</span><span class=\"n\">scope</span><span class=\"p\">,</span> <span class=\"s2\">&quot;virtual_adversarial_perturbation&quot;</span><span class=\"p\">):</span>\n    <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_normal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">_</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">num_iterations</span><span class=\"p\">):</span>\n      <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"n\">xi</span> <span class=\"o\">*</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">l2_batch_normalize</span><span class=\"p\">(</span><span class=\"n\">d</span><span class=\"p\">)</span>\n      <span class=\"n\">logits_d</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">d</span><span class=\"p\">)</span>\n      <span class=\"n\">kl</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">kl_with_logits</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">logits_d</span><span class=\"p\">)</span>\n      <span class=\"n\">Hd</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">kl</span><span class=\"p\">,</span> <span class=\"n\">d</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n      <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">Hd</span><span class=\"p\">)</span>\n    <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"n\">eps</span> <span class=\"o\">*</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">l2_batch_normalize</span><span class=\"p\">(</span><span class=\"n\">d</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">d</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/compat.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.compat &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../\" src=\"../../_static/documentation_options.js\"></script>\n    <script src=\"../../_static/jquery.js\"></script>\n    <script src=\"../../_static/underscore.js\"></script>\n    <script src=\"../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.compat</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">Wrapper functions for writing code that is compatible with many versions</span>\n<span class=\"sd\">of TensorFlow.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n<span class=\"c1\"># The following 2 imports are not used in this module. They are imported so that users of cleverhans.compat can</span>\n<span class=\"c1\"># get access to device_lib, app, and flags. A pylint bug makes these imports cause errors when using python3+tf1.8.</span>\n<span class=\"c1\"># Doing the sanitized import here once makes it possible to do &quot;from cleverhans.compat import flags&quot; throughout the</span>\n<span class=\"c1\"># library without needing to repeat the pylint boilerplate.</span>\n<span class=\"kn\">from</span> <span class=\"nn\">tensorflow.python.client</span> <span class=\"kn\">import</span> <span class=\"n\">device_lib</span> <span class=\"c1\"># pylint: disable=no-name-in-module,unused-import</span>\n<span class=\"kn\">from</span> <span class=\"nn\">tensorflow.python.platform</span> <span class=\"kn\">import</span> <span class=\"n\">app</span><span class=\"p\">,</span> <span class=\"n\">flags</span> <span class=\"c1\"># pylint: disable=no-name-in-module,unused-import</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">_wrap</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wraps a callable `f` in a function that warns that the function is deprecated.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"nf\">wrapper</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Issues a deprecation warning and passes through the arguments.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; is deprecated. Switch to calling the equivalent function in tensorflow. &quot;</span>\n                  <span class=\"s2\">&quot; This function was originally needed as a compatibility layer for old versions of tensorflow, &quot;</span>\n                  <span class=\"s2\">&quot; but support for those versions has now been dropped.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">f</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">wrapper</span>\n\n<span class=\"n\">reduce_sum</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_max</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_min</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_min</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_mean</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_mean</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_prod</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_prod</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_any</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_any</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">reduce_function</span><span class=\"p\">(</span><span class=\"n\">op_func</span><span class=\"p\">,</span> <span class=\"n\">input_tensor</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">reduction_indices</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This function used to be needed to support tf 1.4 and early, but support for tf 1.4 and earlier is now dropped.</span>\n<span class=\"sd\">  :param op_func: expects the function to handle eg: tf.reduce_sum.</span>\n<span class=\"sd\">  :param input_tensor: The tensor to reduce. Should have numeric type.</span>\n<span class=\"sd\">  :param axis: The dimensions to reduce. If None (the default),</span>\n<span class=\"sd\">          reduces all dimensions. Must be in the range</span>\n<span class=\"sd\">          [-rank(input_tensor), rank(input_tensor)).</span>\n<span class=\"sd\">  :param keepdims: If true, retains reduced dimensions with length 1.</span>\n<span class=\"sd\">  :param name: A name for the operation (optional).</span>\n<span class=\"sd\">  :param reduction_indices: The old (deprecated) name for axis.</span>\n<span class=\"sd\">  :return: outputs same value as op_func.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`reduce_function` is deprecated and may be removed on or after 2019-09-08.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"n\">op_func</span><span class=\"p\">(</span><span class=\"n\">input_tensor</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"n\">axis</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"n\">keepdims</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">reduction_indices</span><span class=\"o\">=</span><span class=\"n\">reduction_indices</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">out</span>\n\n<div class=\"viewcode-block\" id=\"softmax_cross_entropy_with_logits\"><a class=\"viewcode-back\" href=\"../../source/attacks.html#cleverhans.attacks.softmax_cross_entropy_with_logits\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span><span class=\"n\">sentinel</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                                      <span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                                      <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                                      <span class=\"n\">dim</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle</span>\n<span class=\"sd\">  deprecated warning</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"c1\"># Make sure that all arguments were passed as named arguments.</span>\n  <span class=\"k\">if</span> <span class=\"n\">sentinel</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;softmax_cross_entropy_with_logits&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Only call `</span><span class=\"si\">%s</span><span class=\"s2\">` with &quot;</span>\n                     <span class=\"s2\">&quot;named arguments (labels=..., logits=..., ...)&quot;</span>\n                     <span class=\"o\">%</span> <span class=\"n\">name</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">labels</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"n\">logits</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Both labels and logits must be provided.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax_cross_entropy_with_logits_v2</span>\n  <span class=\"k\">except</span> <span class=\"ne\">AttributeError</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">RuntimeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;This version of TensorFlow is no longer supported. See cleverhans/README.md&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"p\">)</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">f</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">dim</span><span class=\"o\">=</span><span class=\"n\">dim</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">loss</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/model.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.model &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../\" src=\"../../_static/documentation_options.js\"></script>\n    <script src=\"../../_static/jquery.js\"></script>\n    <script src=\"../../_static/underscore.js\"></script>\n    <script src=\"../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.model</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The Model class and related functionality.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">from</span> <span class=\"nn\">abc</span> <span class=\"kn\">import</span> <span class=\"n\">ABCMeta</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n\n<div class=\"viewcode-block\" id=\"Model\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">Model</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  An abstract interface for model wrappers that exposes model symbols</span>\n<span class=\"sd\">  needed for making an attack. This abstraction removes the dependency on</span>\n<span class=\"sd\">  any specific neural network package (e.g. Keras) from the core</span>\n<span class=\"sd\">  code of CleverHans. It can also simplify exposing the hidden features of a</span>\n<span class=\"sd\">  model when a specific package does not directly expose them.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">__metaclass__</span> <span class=\"o\">=</span> <span class=\"n\">ABCMeta</span>\n  <span class=\"n\">O_LOGITS</span><span class=\"p\">,</span> <span class=\"n\">O_PROBS</span><span class=\"p\">,</span> <span class=\"n\">O_FEATURES</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;logits probs features&#39;</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">()</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">hparams</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">needs_dummy_fprop</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Constructor.</span>\n<span class=\"sd\">    :param scope: str, the name of model.</span>\n<span class=\"sd\">    :param nb_classes: integer, the number of classes.</span>\n<span class=\"sd\">    :param hparams: dict, hyper-parameters for the model.</span>\n<span class=\"sd\">    :needs_dummy_fprop: bool, if True the model&#39;s parameters are not</span>\n<span class=\"sd\">        created until fprop is called.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">scope</span> <span class=\"o\">=</span> <span class=\"n\">scope</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"vm\">__class__</span><span class=\"o\">.</span><span class=\"vm\">__name__</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">nb_classes</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">hparams</span> <span class=\"o\">=</span> <span class=\"n\">hparams</span> <span class=\"ow\">or</span> <span class=\"p\">{}</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">needs_dummy_fprop</span> <span class=\"o\">=</span> <span class=\"n\">needs_dummy_fprop</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__call__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    For compatibility with functions used as model definitions (taking</span>\n<span class=\"sd\">    an input tensor and returning the tensor giving the output</span>\n<span class=\"sd\">    of the model on that input).</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Model.__call__ is deprecated. &quot;</span>\n                  <span class=\"s2\">&quot;The call is ambiguous as to whether the output should &quot;</span>\n                  <span class=\"s2\">&quot;be logits or probabilities, and getting the wrong one &quot;</span>\n                  <span class=\"s2\">&quot;can cause serious problems. &quot;</span>\n                  <span class=\"s2\">&quot;The output actually is probabilities, which are a very &quot;</span>\n                  <span class=\"s2\">&quot;dangerous thing to use as part of any interface for &quot;</span>\n                  <span class=\"s2\">&quot;cleverhans, because softmax probabilities are prone &quot;</span>\n                  <span class=\"s2\">&quot;to gradient masking.&quot;</span>\n                  <span class=\"s2\">&quot;On or after 2019-04-24, this method will change to raise &quot;</span>\n                  <span class=\"s2\">&quot;an exception explaining why Model.__call__ should not be &quot;</span>\n                  <span class=\"s2\">&quot;used.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"Model.get_logits\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_logits\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param x: A symbolic representation (Tensor) of the network input</span>\n<span class=\"sd\">    :return: A symbolic representation (Tensor) of the output logits</span>\n<span class=\"sd\">    (i.e., the values fed as inputs to the softmax layer).</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">outputs</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span> <span class=\"ow\">in</span> <span class=\"n\">outputs</span><span class=\"p\">:</span>\n      <span class=\"k\">return</span> <span class=\"n\">outputs</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span><span class=\"p\">]</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;must implement `get_logits`&quot;</span>\n                              <span class=\"s2\">&quot; or must define a &quot;</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span> <span class=\"o\">+</span>\n                              <span class=\"s2\">&quot; output in `fprop`&quot;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_predicted_class\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_predicted_class\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_predicted_class</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param x: A symbolic representation (Tensor) of the network input</span>\n<span class=\"sd\">    :return: A symbolic representation (Tensor) of the predicted label</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_probs\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_probs\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_probs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param x: A symbolic representation (Tensor) of the network input</span>\n<span class=\"sd\">    :return: A symbolic representation (Tensor) of the output</span>\n<span class=\"sd\">    probabilities (i.e., the output values produced by the softmax layer).</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_PROBS</span> <span class=\"ow\">in</span> <span class=\"n\">d</span><span class=\"p\">:</span>\n      <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">d</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_PROBS</span><span class=\"p\">]</span>\n      <span class=\"n\">min_prob</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_min</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"n\">max_prob</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">min_prob</span><span class=\"p\">,</span>\n                                               <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">,</span> <span class=\"n\">min_prob</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                 <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">max_prob</span><span class=\"p\">,</span>\n                                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">1.</span><span class=\"p\">,</span> <span class=\"n\">min_prob</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))]</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"k\">return</span> <span class=\"n\">output</span>\n    <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span> <span class=\"ow\">in</span> <span class=\"n\">d</span><span class=\"p\">:</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">d</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span><span class=\"p\">])</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s1\">&#39;Cannot find probs or logits.&#39;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.fprop\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.fprop\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">fprop</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Forward propagation to compute the model outputs.</span>\n<span class=\"sd\">    :param x: A symbolic representation of the network input</span>\n<span class=\"sd\">    :return: A dictionary mapping layer names to the symbolic</span>\n<span class=\"sd\">             representation of their output.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s1\">&#39;`fprop` not implemented.&#39;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_params\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Provides access to the model&#39;s parameters.</span>\n<span class=\"sd\">    :return: A list of all Variables defining the model parameters.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"s1\">&#39;params&#39;</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">params</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Catch eager execution and assert function overload.</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">executing_eagerly</span><span class=\"p\">():</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;For Eager execution - get_params &quot;</span>\n                                  <span class=\"s2\">&quot;must be overridden.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"ne\">AttributeError</span><span class=\"p\">:</span>\n      <span class=\"k\">pass</span>\n\n    <span class=\"c1\"># For graph-based execution</span>\n    <span class=\"n\">scope_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">get_collection</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">GraphKeys</span><span class=\"o\">.</span><span class=\"n\">TRAINABLE_VARIABLES</span><span class=\"p\">,</span>\n                                   <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">scope</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;/&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">make_params</span><span class=\"p\">()</span>\n      <span class=\"n\">scope_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">get_collection</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">GraphKeys</span><span class=\"o\">.</span><span class=\"n\">TRAINABLE_VARIABLES</span><span class=\"p\">,</span>\n                                     <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">scope</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;/&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span>\n\n    <span class=\"c1\"># Make sure no parameters have been added or removed</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"s2\">&quot;num_params&quot;</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_params</span> <span class=\"o\">!=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">):</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Scope: &quot;</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">scope</span><span class=\"p\">)</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Expected &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_params</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; variables&quot;</span><span class=\"p\">)</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Got &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">)))</span>\n        <span class=\"k\">for</span> <span class=\"n\">var</span> <span class=\"ow\">in</span> <span class=\"n\">scope_vars</span><span class=\"p\">:</span>\n          <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"se\">\\t</span><span class=\"s2\">&quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">))</span>\n        <span class=\"k\">assert</span> <span class=\"kc\">False</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_params</span> <span class=\"o\">=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">scope_vars</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.make_params\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.make_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">make_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create all Variables to be returned later by get_params.</span>\n<span class=\"sd\">    By default this is a no-op.</span>\n<span class=\"sd\">    Models that need their fprop to be called for their params to be</span>\n<span class=\"sd\">    created can set `needs_dummy_fprop=True` in the constructor.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">needs_dummy_fprop</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"s2\">&quot;_dummy_input&quot;</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_dummy_input</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">make_input_placeholder</span><span class=\"p\">()</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_dummy_input</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_layer_names\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_layer_names\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_layer_names</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Return the list of exposed layers for this model.&quot;&quot;&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_layer\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_layer\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_layer</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">layer</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Return a layer output.</span>\n<span class=\"sd\">    :param x: tensor, the input to the network.</span>\n<span class=\"sd\">    :param layer: str, the name of the layer to compute.</span>\n<span class=\"sd\">    :param **kwargs: dict, extra optional params to pass to self.fprop.</span>\n<span class=\"sd\">    :return: the content of layer `layer`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)[</span><span class=\"n\">layer</span><span class=\"p\">]</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.make_input_placeholder\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.make_input_placeholder\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">make_input_placeholder</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Create and return a placeholder representing an input to the model.</span>\n\n<span class=\"sd\">    This method should respect context managers (e.g. &quot;with tf.device&quot;)</span>\n<span class=\"sd\">    and should not just return a reference to a single pre-created</span>\n<span class=\"sd\">    placeholder.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; does not implement &quot;</span>\n                              <span class=\"s2\">&quot;make_input_placeholder&quot;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.make_label_placeholder\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.make_label_placeholder\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">make_label_placeholder</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Create and return a placeholder representing class labels.</span>\n\n<span class=\"sd\">    This method should respect context managers (e.g. &quot;with tf.device&quot;)</span>\n<span class=\"sd\">    and should not just return a reference to a single pre-created</span>\n<span class=\"sd\">    placeholder.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; does not implement &quot;</span>\n                              <span class=\"s2\">&quot;make_label_placeholder&quot;</span><span class=\"p\">)</span></div>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__hash__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"nb\">hash</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__eq__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">other</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span> <span class=\"ow\">is</span> <span class=\"n\">other</span></div>\n\n\n<div class=\"viewcode-block\" id=\"CallableModelWrapper\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.CallableModelWrapper\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;A wrapper that turns a callable into a valid Model&quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">callable_fn</span><span class=\"p\">,</span> <span class=\"n\">output_layer</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Wrap a callable function that takes a tensor as input and returns</span>\n<span class=\"sd\">    a tensor as output with the given layer name.</span>\n<span class=\"sd\">    :param callable_fn: The callable function taking a tensor and</span>\n<span class=\"sd\">                        returning a given layer as output.</span>\n<span class=\"sd\">    :param output_layer: A string of the output layer returned by the</span>\n<span class=\"sd\">                         function. (Usually either &quot;probs&quot; or &quot;logits&quot;.)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">()</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_layer</span> <span class=\"o\">=</span> <span class=\"n\">output_layer</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">callable_fn</span> <span class=\"o\">=</span> <span class=\"n\">callable_fn</span>\n\n<div class=\"viewcode-block\" id=\"CallableModelWrapper.fprop\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.CallableModelWrapper.fprop\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">fprop</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">callable_fn</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Do some sanity checking to reduce the chance that probs are used</span>\n    <span class=\"c1\"># as logits accidentally or vice versa</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_layer</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;probs&#39;</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"n\">output</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;Softmax&quot;</span>\n      <span class=\"n\">min_prob</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_min</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"n\">max_prob</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">min_prob</span><span class=\"p\">,</span>\n                                               <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">,</span> <span class=\"n\">min_prob</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                 <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">max_prob</span><span class=\"p\">,</span>\n                                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">1.</span><span class=\"p\">,</span> <span class=\"n\">max_prob</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))]</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n    <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_layer</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"n\">output</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;Softmax&#39;</span>\n\n    <span class=\"k\">return</span> <span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_layer</span><span class=\"p\">:</span> <span class=\"n\">output</span><span class=\"p\">}</span></div></div>\n\n<div class=\"viewcode-block\" id=\"wrapper_warning\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.wrapper_warning\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">wrapper_warning</span><span class=\"p\">():</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Issue a deprecation warning. Used in multiple places that implemented</span>\n<span class=\"sd\">  attacks by automatically wrapping a user-supplied callable with a</span>\n<span class=\"sd\">  CallableModelWrapper with output_layer=&quot;probs&quot;.</span>\n<span class=\"sd\">  Using &quot;probs&quot; as any part of the attack interface is dangerous.</span>\n<span class=\"sd\">  We can&#39;t just change output_layer to logits because:</span>\n<span class=\"sd\">  - that would be a silent interface change. We&#39;d have no way of detecting</span>\n<span class=\"sd\">    code that still means to use probs. Note that we can&#39;t just check whether</span>\n<span class=\"sd\">    the final output op is a softmax---for example, Inception puts a reshape</span>\n<span class=\"sd\">    after the softmax.</span>\n<span class=\"sd\">  - automatically wrapping user-supplied callables with output_layer=&#39;logits&#39;</span>\n<span class=\"sd\">    is even worse, see `wrapper_warning_logits`</span>\n<span class=\"sd\">  Note: this function will be removed at the same time as the code that</span>\n<span class=\"sd\">  calls it.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Passing a callable is deprecated, because using&quot;</span>\n                <span class=\"s2\">&quot; probabilities is dangerous. It has a high risk &quot;</span>\n                <span class=\"s2\">&quot; of causing gradient masking due to loss of precision &quot;</span>\n                <span class=\"s2\">&quot; in the softmax op. Passing a callable rather than a &quot;</span>\n                <span class=\"s2\">&quot; Model subclass will become an error on or after &quot;</span>\n                <span class=\"s2\">&quot; 2019-04-24.&quot;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"wrapper_warning_logits\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.wrapper_warning_logits\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">wrapper_warning_logits</span><span class=\"p\">():</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Issue a deprecation warning. Used in multiple places that implemented</span>\n<span class=\"sd\">  attacks by automatically wrapping a user-supplied callable with a</span>\n<span class=\"sd\">  CallableModelWrapper with output_layer=&quot;logits&quot;.</span>\n<span class=\"sd\">  This is dangerous because it is under-the-hood automagic that the user</span>\n<span class=\"sd\">  may not realize has been invoked for them. If they pass a callable</span>\n<span class=\"sd\">  that actually outputs probs, the probs will be treated as logits,</span>\n<span class=\"sd\">  resulting in an incorrect cross-entropy loss and severe gradient</span>\n<span class=\"sd\">  masking.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Passing a callable is deprecated, because it runs the &quot;</span>\n                <span class=\"s2\">&quot;risk of accidentally using probabilities in the place &quot;</span>\n                <span class=\"s2\">&quot;of logits. Please switch to passing a Model subclass &quot;</span>\n                <span class=\"s2\">&quot;so that you clearly specify which values are the logits. &quot;</span>\n                <span class=\"s2\">&quot;Passing a callable rather than a Model subclass will become &quot;</span>\n                <span class=\"s2\">&quot;an error on or after 2019-04-24.&quot;</span><span class=\"p\">)</span></div>\n\n\n<div class=\"viewcode-block\" id=\"NoSuchLayerError\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.NoSuchLayerError\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">NoSuchLayerError</span><span class=\"p\">(</span><span class=\"ne\">ValueError</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Raised when a layer that does not exist is requested.&quot;&quot;&quot;</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/cleverhans/utils_tf.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.utils_tf &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../\" src=\"../../_static/documentation_options.js\"></script>\n    <script src=\"../../_static/jquery.js\"></script>\n    <script src=\"../../_static/underscore.js\"></script>\n    <script src=\"../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.utils_tf</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;Utility functions for writing TensorFlow code&quot;&quot;&quot;</span>\n<span class=\"kn\">from</span> <span class=\"nn\">__future__</span> <span class=\"kn\">import</span> <span class=\"n\">absolute_import</span>\n<span class=\"kn\">from</span> <span class=\"nn\">__future__</span> <span class=\"kn\">import</span> <span class=\"n\">division</span>\n<span class=\"kn\">from</span> <span class=\"nn\">__future__</span> <span class=\"kn\">import</span> <span class=\"n\">print_function</span>\n<span class=\"kn\">from</span> <span class=\"nn\">__future__</span> <span class=\"kn\">import</span> <span class=\"n\">unicode_literals</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n<span class=\"kn\">import</span> <span class=\"nn\">math</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">import</span> <span class=\"nn\">time</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">six</span>\n<span class=\"kn\">from</span> <span class=\"nn\">six.moves</span> <span class=\"kn\">import</span> <span class=\"n\">xrange</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">device_lib</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_mean</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils</span> <span class=\"kn\">import</span> <span class=\"n\">batch_indices</span><span class=\"p\">,</span> <span class=\"n\">_ArgsWrapper</span><span class=\"p\">,</span> <span class=\"n\">create_logger</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.utils.tf&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">model_loss</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">mean</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Define loss of TF graph</span>\n<span class=\"sd\">  :param y: correct labels</span>\n<span class=\"sd\">  :param model: output of the model</span>\n<span class=\"sd\">  :param mean: boolean indicating whether should return mean of loss</span>\n<span class=\"sd\">               or vector of losses for each input of the batch</span>\n<span class=\"sd\">  :return: return mean of loss if True, otherwise return vector with per</span>\n<span class=\"sd\">           sample loss</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;This function is deprecated and will be removed on or after&quot;</span>\n                <span class=\"s2\">&quot; 2019-04-05. Switch to cleverhans.train.train.&quot;</span><span class=\"p\">)</span>\n  <span class=\"n\">op</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">op</span>\n  <span class=\"k\">if</span> <span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;Softmax&quot;</span><span class=\"p\">:</span>\n    <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">inputs</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"n\">model</span>\n\n  <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">mean</span><span class=\"p\">:</span>\n    <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">out</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">out</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">initialize_uninitialized_global_variables</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Only initializes the variables of a TensorFlow session that were not</span>\n<span class=\"sd\">  already initialized.</span>\n<span class=\"sd\">  :param sess: the TensorFlow session</span>\n<span class=\"sd\">  :return:</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"c1\"># List all global variables</span>\n  <span class=\"n\">global_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">()</span>\n\n  <span class=\"c1\"># Find initialized status for all variables</span>\n  <span class=\"n\">is_var_init</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">is_variable_initialized</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">var</span> <span class=\"ow\">in</span> <span class=\"n\">global_vars</span><span class=\"p\">]</span>\n  <span class=\"n\">is_initialized</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">is_var_init</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># List all variables that were not initialized previously</span>\n  <span class=\"n\">not_initialized_vars</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">var</span> <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">,</span> <span class=\"n\">init</span><span class=\"p\">)</span> <span class=\"ow\">in</span>\n                          <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">global_vars</span><span class=\"p\">,</span> <span class=\"n\">is_initialized</span><span class=\"p\">)</span> <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">init</span><span class=\"p\">]</span>\n\n  <span class=\"c1\"># Initialize all uninitialized variables found, if any</span>\n  <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">not_initialized_vars</span><span class=\"p\">):</span>\n    <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">variables_initializer</span><span class=\"p\">(</span><span class=\"n\">not_initialized_vars</span><span class=\"p\">))</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">train</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">X_train</span><span class=\"p\">,</span> <span class=\"n\">Y_train</span><span class=\"p\">,</span> <span class=\"n\">save</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n          <span class=\"n\">init_all</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"n\">evaluate</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n          <span class=\"n\">rng</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">fprop_args</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">optimizer</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Train a TF graph.</span>\n<span class=\"sd\">  This function is deprecated. Prefer cleverhans.train.train when possible.</span>\n<span class=\"sd\">  cleverhans.train.train supports multiple GPUs but this function is still</span>\n<span class=\"sd\">  needed to support legacy models that do not support calling fprop more</span>\n<span class=\"sd\">  than once.</span>\n\n<span class=\"sd\">  :param sess: TF session to use when training the graph</span>\n<span class=\"sd\">  :param loss: tensor, the model training loss.</span>\n<span class=\"sd\">  :param x: input placeholder</span>\n<span class=\"sd\">  :param y: output placeholder (for labels)</span>\n<span class=\"sd\">  :param X_train: numpy array with training inputs</span>\n<span class=\"sd\">  :param Y_train: numpy array with training outputs</span>\n<span class=\"sd\">  :param save: boolean controlling the save operation</span>\n<span class=\"sd\">  :param init_all: (boolean) If set to true, all TF variables in the session</span>\n<span class=\"sd\">                   are (re)initialized, otherwise only previously</span>\n<span class=\"sd\">                   uninitialized variables are initialized before training.</span>\n<span class=\"sd\">  :param evaluate: function that is run after each training iteration</span>\n<span class=\"sd\">                   (typically to display the test/validation accuracy).</span>\n<span class=\"sd\">  :param feed: An optional dictionary that is appended to the feeding</span>\n<span class=\"sd\">               dictionary before the session runs. Can be used to feed</span>\n<span class=\"sd\">               the learning phase of a Keras model for instance.</span>\n<span class=\"sd\">  :param args: dict or argparse `Namespace` object.</span>\n<span class=\"sd\">               Should contain `nb_epochs`, `learning_rate`,</span>\n<span class=\"sd\">               `batch_size`</span>\n<span class=\"sd\">               If save is True, should also contain &#39;train_dir&#39;</span>\n<span class=\"sd\">               and &#39;filename&#39;</span>\n<span class=\"sd\">  :param rng: Instance of numpy.random.RandomState</span>\n<span class=\"sd\">  :param var_list: Optional list of parameters to train.</span>\n<span class=\"sd\">  :param fprop_args: dict, extra arguments to pass to fprop (loss and model).</span>\n<span class=\"sd\">  :param optimizer: Optimizer to be used for training</span>\n<span class=\"sd\">  :return: True if model trained</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;This function is deprecated and will be removed on or after&quot;</span>\n                <span class=\"s2\">&quot; 2019-04-05. Switch to cleverhans.train.train.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"n\">_ArgsWrapper</span><span class=\"p\">(</span><span class=\"n\">args</span> <span class=\"ow\">or</span> <span class=\"p\">{})</span>\n  <span class=\"n\">fprop_args</span> <span class=\"o\">=</span> <span class=\"n\">fprop_args</span> <span class=\"ow\">or</span> <span class=\"p\">{}</span>\n\n  <span class=\"c1\"># Check that necessary arguments were given (see doc above)</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">nb_epochs</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Number of epochs was not given in args dict&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">optimizer</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"s2\">&quot;Learning rate was not given &quot;</span>\n                                            <span class=\"s2\">&quot;in args dict&quot;</span><span class=\"p\">)</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Batch size was not given in args dict&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">save</span><span class=\"p\">:</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">train_dir</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Directory for save was not given in args dict&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Filename for save was not given in args dict&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">rng</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">rng</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">RandomState</span><span class=\"p\">()</span>\n\n  <span class=\"c1\"># Define optimizer</span>\n  <span class=\"n\">loss_value</span> <span class=\"o\">=</span> <span class=\"n\">loss</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">fprop_args</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">optimizer</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">optimizer</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">AdamOptimizer</span><span class=\"p\">(</span><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">optimizer</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">Optimizer</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;optimizer object must be from a child class of &quot;</span>\n                       <span class=\"s2\">&quot;tf.train.Optimizer&quot;</span><span class=\"p\">)</span>\n  <span class=\"c1\"># Trigger update operations within the default graph (such as batch_norm).</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">get_collection</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">GraphKeys</span><span class=\"o\">.</span><span class=\"n\">UPDATE_OPS</span><span class=\"p\">)):</span>\n    <span class=\"n\">train_step</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span><span class=\"n\">loss_value</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"n\">var_list</span><span class=\"p\">)</span>\n\n  <span class=\"k\">with</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">as_default</span><span class=\"p\">():</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"p\">,</span> <span class=\"s2\">&quot;global_variables_initializer&quot;</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"n\">init_all</span><span class=\"p\">:</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables_initializer</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">()</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">initialize_uninitialized_global_variables</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Update your copy of tensorflow; future versions of &quot;</span>\n                    <span class=\"s2\">&quot;CleverHans may drop support for this version.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">initialize_all_variables</span><span class=\"p\">())</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">epoch</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">nb_epochs</span><span class=\"p\">):</span>\n      <span class=\"c1\"># Compute number of batches</span>\n      <span class=\"n\">nb_batches</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">ceil</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">))</span> <span class=\"o\">/</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">))</span>\n      <span class=\"k\">assert</span> <span class=\"n\">nb_batches</span> <span class=\"o\">*</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Indices to shuffle training set</span>\n      <span class=\"n\">index_shuf</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)))</span>\n      <span class=\"n\">rng</span><span class=\"o\">.</span><span class=\"n\">shuffle</span><span class=\"p\">(</span><span class=\"n\">index_shuf</span><span class=\"p\">)</span>\n\n      <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n      <span class=\"k\">for</span> <span class=\"n\">batch</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">nb_batches</span><span class=\"p\">):</span>\n\n        <span class=\"c1\"># Compute batch start and end indices</span>\n        <span class=\"n\">start</span><span class=\"p\">,</span> <span class=\"n\">end</span> <span class=\"o\">=</span> <span class=\"n\">batch_indices</span><span class=\"p\">(</span>\n            <span class=\"n\">batch</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">),</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Perform one training step</span>\n        <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">X_train</span><span class=\"p\">[</span><span class=\"n\">index_shuf</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]],</span>\n                     <span class=\"n\">y</span><span class=\"p\">:</span> <span class=\"n\">Y_train</span><span class=\"p\">[</span><span class=\"n\">index_shuf</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]]}</span>\n        <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n          <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n        <span class=\"n\">train_step</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"n\">feed_dict</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"n\">end</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)</span>  <span class=\"c1\"># Check that all examples were used</span>\n      <span class=\"n\">cur</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Epoch &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">epoch</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; took &quot;</span> <span class=\"o\">+</span>\n                   <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">cur</span> <span class=\"o\">-</span> <span class=\"n\">prev</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; seconds&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">evaluate</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">evaluate</span><span class=\"p\">()</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">save</span><span class=\"p\">:</span>\n      <span class=\"n\">save_path</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">train_dir</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">)</span>\n      <span class=\"n\">saver</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">Saver</span><span class=\"p\">()</span>\n      <span class=\"n\">saver</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">save_path</span><span class=\"p\">)</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Completed model training and saved at: &quot;</span> <span class=\"o\">+</span>\n                   <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">save_path</span><span class=\"p\">))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Completed model training.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">model_eval</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">X_test</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">Y_test</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Compute the accuracy of a TF model on some data</span>\n<span class=\"sd\">  :param sess: TF session to use</span>\n<span class=\"sd\">  :param x: input placeholder</span>\n<span class=\"sd\">  :param y: output placeholder (for labels)</span>\n<span class=\"sd\">  :param predictions: model output predictions</span>\n<span class=\"sd\">  :param X_test: numpy array with training inputs</span>\n<span class=\"sd\">  :param Y_test: numpy array with training outputs</span>\n<span class=\"sd\">  :param feed: An optional dictionary that is appended to the feeding</span>\n<span class=\"sd\">           dictionary before the session runs. Can be used to feed</span>\n<span class=\"sd\">           the learning phase of a Keras model for instance.</span>\n<span class=\"sd\">  :param args: dict or argparse `Namespace` object.</span>\n<span class=\"sd\">               Should contain `batch_size`</span>\n<span class=\"sd\">  :return: a float with the accuracy value</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">global</span> <span class=\"n\">_model_eval_cache</span>\n  <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"n\">_ArgsWrapper</span><span class=\"p\">(</span><span class=\"n\">args</span> <span class=\"ow\">or</span> <span class=\"p\">{})</span>\n\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Batch size was not given in args dict&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">X_test</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"n\">Y_test</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;X_test argument and Y_test argument &quot;</span>\n                     <span class=\"s2\">&quot;must be supplied.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Define accuracy symbolically</span>\n  <span class=\"n\">key</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">key</span> <span class=\"ow\">in</span> <span class=\"n\">_model_eval_cache</span><span class=\"p\">:</span>\n    <span class=\"n\">correct_preds</span> <span class=\"o\">=</span> <span class=\"n\">_model_eval_cache</span><span class=\"p\">[</span><span class=\"n\">key</span><span class=\"p\">]</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">correct_preds</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n                             <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n    <span class=\"n\">_model_eval_cache</span><span class=\"p\">[</span><span class=\"n\">key</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">correct_preds</span>\n\n  <span class=\"c1\"># Init result var</span>\n  <span class=\"n\">accuracy</span> <span class=\"o\">=</span> <span class=\"mf\">0.0</span>\n\n  <span class=\"k\">with</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">as_default</span><span class=\"p\">():</span>\n    <span class=\"c1\"># Compute number of batches</span>\n    <span class=\"n\">nb_batches</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">ceil</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">))</span> <span class=\"o\">/</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">))</span>\n    <span class=\"k\">assert</span> <span class=\"n\">nb_batches</span> <span class=\"o\">*</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">)</span>\n\n    <span class=\"n\">X_cur</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,)</span> <span class=\"o\">+</span> <span class=\"n\">X_test</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:],</span>\n                     <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">X_test</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">Y_cur</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,)</span> <span class=\"o\">+</span> <span class=\"n\">Y_test</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:],</span>\n                     <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">Y_test</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">batch</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">nb_batches</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"n\">batch</span> <span class=\"o\">%</span> <span class=\"mi\">100</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"ow\">and</span> <span class=\"n\">batch</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n        <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;Batch &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">batch</span><span class=\"p\">))</span>\n\n      <span class=\"c1\"># Must not use the `batch_indices` function here, because it</span>\n      <span class=\"c1\"># repeats some examples.</span>\n      <span class=\"c1\"># It&#39;s acceptable to repeat during training, but not eval.</span>\n      <span class=\"n\">start</span> <span class=\"o\">=</span> <span class=\"n\">batch</span> <span class=\"o\">*</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n      <span class=\"n\">end</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">),</span> <span class=\"n\">start</span> <span class=\"o\">+</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># The last batch may be smaller than all others. This should not</span>\n      <span class=\"c1\"># affect the accuarcy disproportionately.</span>\n      <span class=\"n\">cur_batch_size</span> <span class=\"o\">=</span> <span class=\"n\">end</span> <span class=\"o\">-</span> <span class=\"n\">start</span>\n      <span class=\"n\">X_cur</span><span class=\"p\">[:</span><span class=\"n\">cur_batch_size</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">X_test</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]</span>\n      <span class=\"n\">Y_cur</span><span class=\"p\">[:</span><span class=\"n\">cur_batch_size</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Y_test</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]</span>\n      <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">X_cur</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">:</span> <span class=\"n\">Y_cur</span><span class=\"p\">}</span>\n      <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n      <span class=\"n\">cur_corr_preds</span> <span class=\"o\">=</span> <span class=\"n\">correct_preds</span><span class=\"o\">.</span><span class=\"n\">eval</span><span class=\"p\">(</span><span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"n\">feed_dict</span><span class=\"p\">)</span>\n\n      <span class=\"n\">accuracy</span> <span class=\"o\">+=</span> <span class=\"n\">cur_corr_preds</span><span class=\"p\">[:</span><span class=\"n\">cur_batch_size</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">()</span>\n\n    <span class=\"k\">assert</span> <span class=\"n\">end</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Divide by number of examples to get final value</span>\n    <span class=\"n\">accuracy</span> <span class=\"o\">/=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">accuracy</span>\n\n<span class=\"n\">_model_eval_cache</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">tf_model_load</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">file_path</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"sd\">  :param sess: the session object to restore</span>\n<span class=\"sd\">  :param file_path: path to the restored session, if None is</span>\n<span class=\"sd\">                    taken from FLAGS.train_dir and FLAGS.filename</span>\n<span class=\"sd\">  :return:</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">as_default</span><span class=\"p\">():</span>\n    <span class=\"n\">saver</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">Saver</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"n\">file_path</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">error</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;file_path argument is missing.&#39;</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"n\">error</span><span class=\"p\">)</span>\n    <span class=\"n\">saver</span><span class=\"o\">.</span><span class=\"n\">restore</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">file_path</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">batch_eval</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper around deprecated function.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"c1\"># Inside function to avoid circular import</span>\n  <span class=\"kn\">from</span> <span class=\"nn\">cleverhans.evaluation</span> <span class=\"kn\">import</span> <span class=\"n\">batch_eval</span> <span class=\"k\">as</span> <span class=\"n\">new_batch_eval</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;batch_eval has moved to cleverhans.evaluation. &quot;</span>\n                <span class=\"s2\">&quot;batch_eval will be removed from utils_tf on or after &quot;</span>\n                <span class=\"s2\">&quot;2019-03-09.&quot;</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">new_batch_eval</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">model_argmax</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">samples</span><span class=\"p\">,</span> <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function that computes the current class prediction</span>\n<span class=\"sd\">  :param sess: TF session</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param predictions: the model&#39;s symbolic output</span>\n<span class=\"sd\">  :param samples: numpy array with input samples (dims must match x)</span>\n<span class=\"sd\">  :param feed: An optional dictionary that is appended to the feeding</span>\n<span class=\"sd\">           dictionary before the session runs. Can be used to feed</span>\n<span class=\"sd\">           the learning phase of a Keras model for instance.</span>\n<span class=\"sd\">  :return: the argmax output of predictions, i.e. the current predicted class</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">samples</span><span class=\"p\">}</span>\n  <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n  <span class=\"n\">probabilities</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">samples</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">probabilities</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">probabilities</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">l2_batch_normalize</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"o\">=</span><span class=\"mf\">1e-12</span><span class=\"p\">,</span> <span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to normalize a batch of vectors.</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param epsilon: stabilizes division</span>\n<span class=\"sd\">  :return: the batch of l2 normalized vector</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">name_scope</span><span class=\"p\">(</span><span class=\"n\">scope</span><span class=\"p\">,</span> <span class=\"s2\">&quot;l2_batch_normalize&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">name_scope</span><span class=\"p\">:</span>\n    <span class=\"n\">x_shape</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">contrib</span><span class=\"o\">.</span><span class=\"n\">layers</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">x</span> <span class=\"o\">/=</span> <span class=\"p\">(</span><span class=\"n\">epsilon</span> <span class=\"o\">+</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n    <span class=\"n\">square_sum</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">x_inv_norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">rsqrt</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">epsilon</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">square_sum</span><span class=\"p\">)</span>\n    <span class=\"n\">x_norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">x_inv_norm</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">x_norm</span><span class=\"p\">,</span> <span class=\"n\">x_shape</span><span class=\"p\">,</span> <span class=\"n\">name_scope</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">kl_with_logits</span><span class=\"p\">(</span><span class=\"n\">p_logits</span><span class=\"p\">,</span> <span class=\"n\">q_logits</span><span class=\"p\">,</span> <span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">loss_collection</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">GraphKeys</span><span class=\"o\">.</span><span class=\"n\">REGULARIZATION_LOSSES</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Helper function to compute kl-divergence KL(p || q)</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">name_scope</span><span class=\"p\">(</span><span class=\"n\">scope</span><span class=\"p\">,</span> <span class=\"s2\">&quot;kl_divergence&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">name</span><span class=\"p\">:</span>\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax</span><span class=\"p\">(</span><span class=\"n\">p_logits</span><span class=\"p\">)</span>\n    <span class=\"n\">p_log</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">log_softmax</span><span class=\"p\">(</span><span class=\"n\">p_logits</span><span class=\"p\">)</span>\n    <span class=\"n\">q_log</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">log_softmax</span><span class=\"p\">(</span><span class=\"n\">q_logits</span><span class=\"p\">)</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">p</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">p_log</span> <span class=\"o\">-</span> <span class=\"n\">q_log</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n                       <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">)</span>\n    <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">losses</span><span class=\"o\">.</span><span class=\"n\">add_loss</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">loss_collection</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">loss</span>\n\n\n<div class=\"viewcode-block\" id=\"clip_eta\"><a class=\"viewcode-back\" href=\"../../source/attacks.html#cleverhans.attacks.clip_eta\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to clip the perturbation to epsilon norm ball.</span>\n<span class=\"sd\">  :param eta: A tensor with the current perturbation.</span>\n<span class=\"sd\">  :param ord: Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">              Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">  :param eps: Epsilon, bound of the perturbation.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"c1\"># Clipping perturbation eta to self.ord norm ball</span>\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s1\">&#39;ord must be np.inf, 1, or 2.&#39;</span><span class=\"p\">)</span>\n  <span class=\"n\">reduc_ind</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())))</span>\n  <span class=\"n\">avoid_zero_div</span> <span class=\"o\">=</span> <span class=\"mf\">1e-12</span>\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">:</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Implements a projection algorithm onto the l1-ball from</span>\n    <span class=\"c1\"># (Duchi et al. 2008) that runs in time O(d*log(d)) where d is the</span>\n    <span class=\"c1\"># input dimension.</span>\n    <span class=\"c1\"># Paper link (Duchi et al. 2008): https://dl.acm.org/citation.cfm?id=1390191</span>\n\n    <span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">dim</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_prod</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n    <span class=\"n\">eta_flat</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">dim</span><span class=\"p\">))</span>\n    <span class=\"n\">abs_eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">eta_flat</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;sort&#39;</span> <span class=\"ow\">in</span> <span class=\"nb\">dir</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"p\">):</span>\n      <span class=\"n\">mu</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">abs_eta</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># `tf.sort` is only available in TF 1.13 onwards</span>\n      <span class=\"n\">mu</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">top_k</span><span class=\"p\">(</span><span class=\"n\">abs_eta</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"o\">=</span><span class=\"n\">dim</span><span class=\"p\">,</span> <span class=\"nb\">sorted</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">cumsums</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cumsum</span><span class=\"p\">(</span><span class=\"n\">mu</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">js</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">divide</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">dim</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)),</span> <span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater</span><span class=\"p\">(</span><span class=\"n\">mu</span> <span class=\"o\">-</span> <span class=\"n\">js</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">cumsums</span> <span class=\"o\">-</span> <span class=\"n\">eps</span><span class=\"p\">),</span> <span class=\"mi\">0</span><span class=\"p\">),</span> <span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">rho</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">t</span> <span class=\"o\">*</span> <span class=\"n\">cumsums</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">rho_val</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">t</span> <span class=\"o\">*</span> <span class=\"n\">cumsums</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">theta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">divide</span><span class=\"p\">(</span><span class=\"n\">rho_val</span> <span class=\"o\">-</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">+</span> <span class=\"n\">rho</span><span class=\"p\">,</span> <span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))</span>\n\n    <span class=\"n\">eta_sgn</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">eta_flat</span><span class=\"p\">)</span>\n    <span class=\"n\">eta_proj</span> <span class=\"o\">=</span> <span class=\"n\">eta_sgn</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">abs_eta</span> <span class=\"o\">-</span> <span class=\"n\">theta</span><span class=\"p\">[:,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">newaxis</span><span class=\"p\">],</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">eta_proj</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">eta_proj</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">))</span>\n\n    <span class=\"n\">norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">),</span> <span class=\"n\">reduc_ind</span><span class=\"p\">)</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">where</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater</span><span class=\"p\">(</span><span class=\"n\">norm</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">),</span> <span class=\"n\">eta_proj</span><span class=\"p\">,</span> <span class=\"n\">eta</span><span class=\"p\">)</span>\n\n  <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n    <span class=\"c1\"># avoid_zero_div must go inside sqrt to avoid a divide by zero</span>\n    <span class=\"c1\"># in the gradient through this operation</span>\n    <span class=\"n\">norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">avoid_zero_div</span><span class=\"p\">,</span>\n                              <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">),</span>\n                                         <span class=\"n\">reduc_ind</span><span class=\"p\">,</span>\n                                         <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)))</span>\n    <span class=\"c1\"># We must *clip* to within the norm ball, not *normalize* onto the</span>\n    <span class=\"c1\"># surface of the ball</span>\n    <span class=\"n\">factor</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"mf\">1.</span><span class=\"p\">,</span> <span class=\"n\">div</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">norm</span><span class=\"p\">))</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">eta</span> <span class=\"o\">*</span> <span class=\"n\">factor</span>\n  <span class=\"k\">return</span> <span class=\"n\">eta</span></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">zero_out_clipped_grads</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to erase entries in the gradient where the update would be</span>\n<span class=\"sd\">  clipped.</span>\n<span class=\"sd\">  :param grad: The gradient</span>\n<span class=\"sd\">  :param x: The current input</span>\n<span class=\"sd\">  :param clip_min: Minimum input component value</span>\n<span class=\"sd\">  :param clip_max: Maximum input component value</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">signed_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Find input components that lie at the boundary of the input range, and</span>\n  <span class=\"c1\"># where the gradient points in the wrong direction.</span>\n  <span class=\"n\">clip_low</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">logical_and</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">signed_grad</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n  <span class=\"n\">clip_high</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">logical_and</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                             <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater</span><span class=\"p\">(</span><span class=\"n\">signed_grad</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n  <span class=\"n\">clip</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">logical_or</span><span class=\"p\">(</span><span class=\"n\">clip_low</span><span class=\"p\">,</span> <span class=\"n\">clip_high</span><span class=\"p\">)</span>\n  <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">where</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"p\">,</span> <span class=\"n\">mul</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">),</span> <span class=\"n\">grad</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">grad</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">random_exponential</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">rate</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to sample from the exponential distribution, which is not</span>\n<span class=\"sd\">  included in core TensorFlow.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_gamma</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">alpha</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">beta</span><span class=\"o\">=</span><span class=\"mf\">1.</span> <span class=\"o\">/</span> <span class=\"n\">rate</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">random_laplace</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">loc</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"n\">scale</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to sample from the Laplace distribution, which is not</span>\n<span class=\"sd\">  included in core TensorFlow.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">z1</span> <span class=\"o\">=</span> <span class=\"n\">random_exponential</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">loc</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n  <span class=\"n\">z2</span> <span class=\"o\">=</span> <span class=\"n\">random_exponential</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">scale</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">z1</span> <span class=\"o\">-</span> <span class=\"n\">z2</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">random_lp_vector</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to generate uniformly random vectors from a norm ball of</span>\n<span class=\"sd\">  radius epsilon.</span>\n<span class=\"sd\">  :param shape: Output shape of the random sample. The shape is expected to be</span>\n<span class=\"sd\">                of the form `(n, d1, d2, ..., dn)` where `n` is the number of</span>\n<span class=\"sd\">                i.i.d. samples that will be drawn from a norm ball of dimension</span>\n<span class=\"sd\">                `d1*d1*...*dn`.</span>\n<span class=\"sd\">  :param ord: Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">              Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">  :param eps: Epsilon, radius of the norm ball.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s1\">&#39;ord must be np.inf, 1, or 2.&#39;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">:</span>\n    <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n\n    <span class=\"c1\"># For ord=1 and ord=2, we use the generic technique from</span>\n    <span class=\"c1\"># (Calafiore et al. 1998) to sample uniformly from a norm ball.</span>\n    <span class=\"c1\"># Paper link (Calafiore et al. 1998):</span>\n    <span class=\"c1\"># https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=758215&amp;tag=1</span>\n    <span class=\"c1\"># We first sample from the surface of the norm ball, and then scale by</span>\n    <span class=\"c1\"># a factor `w^(1/d)` where `w~U[0,1]` is a standard uniform random variable</span>\n    <span class=\"c1\"># and `d` is the dimension of the ball. In high dimensions, this is roughly</span>\n    <span class=\"c1\"># equivalent to sampling from the surface of the ball.</span>\n\n    <span class=\"n\">dim</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_prod</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">random_laplace</span><span class=\"p\">((</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">dim</span><span class=\"p\">),</span> <span class=\"n\">loc</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span> <span class=\"n\">scale</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span>\n                         <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n      <span class=\"n\">norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n      <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_normal</span><span class=\"p\">((</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">dim</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n      <span class=\"n\">norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s1\">&#39;ord must be np.inf, 1, or 2.&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"n\">w</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pow</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">uniform</span><span class=\"p\">((</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">),</span>\n               <span class=\"mf\">1.0</span> <span class=\"o\">/</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">dim</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"p\">))</span>\n    <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">eps</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">w</span> <span class=\"o\">*</span> <span class=\"n\">x</span> <span class=\"o\">/</span> <span class=\"n\">norm</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">r</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">model_train</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">X_train</span><span class=\"p\">,</span> <span class=\"n\">Y_train</span><span class=\"p\">,</span> <span class=\"n\">save</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                <span class=\"n\">predictions_adv</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">init_all</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">evaluate</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">rng</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Train a TF graph</span>\n<span class=\"sd\">  :param sess: TF session to use when training the graph</span>\n<span class=\"sd\">  :param x: input placeholder</span>\n<span class=\"sd\">  :param y: output placeholder (for labels)</span>\n<span class=\"sd\">  :param predictions: model output predictions</span>\n<span class=\"sd\">  :param X_train: numpy array with training inputs</span>\n<span class=\"sd\">  :param Y_train: numpy array with training outputs</span>\n<span class=\"sd\">  :param save: boolean controlling the save operation</span>\n<span class=\"sd\">  :param predictions_adv: if set with the adversarial example tensor,</span>\n<span class=\"sd\">                          will run adversarial training</span>\n<span class=\"sd\">  :param init_all: (boolean) If set to true, all TF variables in the session</span>\n<span class=\"sd\">                   are (re)initialized, otherwise only previously</span>\n<span class=\"sd\">                   uninitialized variables are initialized before training.</span>\n<span class=\"sd\">  :param evaluate: function that is run after each training iteration</span>\n<span class=\"sd\">                   (typically to display the test/validation accuracy).</span>\n<span class=\"sd\">  :param feed: An optional dictionary that is appended to the feeding</span>\n<span class=\"sd\">               dictionary before the session runs. Can be used to feed</span>\n<span class=\"sd\">               the learning phase of a Keras model for instance.</span>\n<span class=\"sd\">  :param args: dict or argparse `Namespace` object.</span>\n<span class=\"sd\">               Should contain `nb_epochs`, `learning_rate`,</span>\n<span class=\"sd\">               `batch_size`</span>\n<span class=\"sd\">               If save is True, should also contain &#39;train_dir&#39;</span>\n<span class=\"sd\">               and &#39;filename&#39;</span>\n<span class=\"sd\">  :param rng: Instance of numpy.random.RandomState</span>\n<span class=\"sd\">  :param var_list: Optional list of parameters to train.</span>\n<span class=\"sd\">  :return: True if model trained</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;This function is deprecated and will be removed on or after&quot;</span>\n                <span class=\"s2\">&quot; 2019-04-05. Switch to cleverhans.train.train.&quot;</span><span class=\"p\">)</span>\n  <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"n\">_ArgsWrapper</span><span class=\"p\">(</span><span class=\"n\">args</span> <span class=\"ow\">or</span> <span class=\"p\">{})</span>\n\n  <span class=\"c1\"># Check that necessary arguments were given (see doc above)</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">nb_epochs</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Number of epochs was not given in args dict&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Learning rate was not given in args dict&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Batch size was not given in args dict&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">save</span><span class=\"p\">:</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">train_dir</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Directory for save was not given in args dict&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Filename for save was not given in args dict&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">rng</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">rng</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">RandomState</span><span class=\"p\">()</span>\n\n  <span class=\"c1\"># Define loss</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">model_loss</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">predictions_adv</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">loss</span> <span class=\"o\">+</span> <span class=\"n\">model_loss</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions_adv</span><span class=\"p\">))</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n\n  <span class=\"n\">train_step</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">AdamOptimizer</span><span class=\"p\">(</span><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">)</span>\n  <span class=\"n\">train_step</span> <span class=\"o\">=</span> <span class=\"n\">train_step</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"n\">var_list</span><span class=\"p\">)</span>\n\n  <span class=\"k\">with</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">as_default</span><span class=\"p\">():</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"p\">,</span> <span class=\"s2\">&quot;global_variables_initializer&quot;</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"n\">init_all</span><span class=\"p\">:</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables_initializer</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">()</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">initialize_uninitialized_global_variables</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Update your copy of tensorflow; future versions of &quot;</span>\n                    <span class=\"s2\">&quot;CleverHans may drop support for this version.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">initialize_all_variables</span><span class=\"p\">())</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">epoch</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">nb_epochs</span><span class=\"p\">):</span>\n      <span class=\"c1\"># Compute number of batches</span>\n      <span class=\"n\">nb_batches</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">ceil</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">))</span> <span class=\"o\">/</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">))</span>\n      <span class=\"k\">assert</span> <span class=\"n\">nb_batches</span> <span class=\"o\">*</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Indices to shuffle training set</span>\n      <span class=\"n\">index_shuf</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)))</span>\n      <span class=\"n\">rng</span><span class=\"o\">.</span><span class=\"n\">shuffle</span><span class=\"p\">(</span><span class=\"n\">index_shuf</span><span class=\"p\">)</span>\n\n      <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n      <span class=\"k\">for</span> <span class=\"n\">batch</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">nb_batches</span><span class=\"p\">):</span>\n\n        <span class=\"c1\"># Compute batch start and end indices</span>\n        <span class=\"n\">start</span><span class=\"p\">,</span> <span class=\"n\">end</span> <span class=\"o\">=</span> <span class=\"n\">batch_indices</span><span class=\"p\">(</span>\n            <span class=\"n\">batch</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">),</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Perform one training step</span>\n        <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">X_train</span><span class=\"p\">[</span><span class=\"n\">index_shuf</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]],</span>\n                     <span class=\"n\">y</span><span class=\"p\">:</span> <span class=\"n\">Y_train</span><span class=\"p\">[</span><span class=\"n\">index_shuf</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]]}</span>\n        <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n          <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n        <span class=\"n\">train_step</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"n\">feed_dict</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"n\">end</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)</span>  <span class=\"c1\"># Check that all examples were used</span>\n      <span class=\"n\">cur</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Epoch &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">epoch</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; took &quot;</span> <span class=\"o\">+</span>\n                   <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">cur</span> <span class=\"o\">-</span> <span class=\"n\">prev</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; seconds&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">evaluate</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">evaluate</span><span class=\"p\">()</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">save</span><span class=\"p\">:</span>\n      <span class=\"n\">save_path</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">train_dir</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">)</span>\n      <span class=\"n\">saver</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">Saver</span><span class=\"p\">()</span>\n      <span class=\"n\">saver</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">save_path</span><span class=\"p\">)</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Completed model training and saved at: &quot;</span> <span class=\"o\">+</span>\n                   <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">save_path</span><span class=\"p\">))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Completed model training.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">infer_devices</span><span class=\"p\">(</span><span class=\"n\">devices</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Returns the list of devices that multi-replica code should use.</span>\n<span class=\"sd\">  :param devices: list of string device names, e.g. [&quot;/GPU:0&quot;]</span>\n<span class=\"sd\">      If the user specifies this, `infer_devices` checks that it is</span>\n<span class=\"sd\">      valid, and then uses this user-specified list.</span>\n<span class=\"sd\">      If the user does not specify this, infer_devices uses:</span>\n<span class=\"sd\">          - All available GPUs, if there are any</span>\n<span class=\"sd\">          - CPU otherwise</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">devices</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">devices</span> <span class=\"o\">=</span> <span class=\"n\">get_available_gpus</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">devices</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;No GPUS, running on CPU&quot;</span><span class=\"p\">)</span>\n      <span class=\"c1\"># Set device to empy string, tf will figure out whether to use</span>\n      <span class=\"c1\"># XLA or not, etc., automatically</span>\n      <span class=\"n\">devices</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">]</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">devices</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span>\n    <span class=\"k\">for</span> <span class=\"n\">device</span> <span class=\"ow\">in</span> <span class=\"n\">devices</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">device</span><span class=\"p\">,</span> <span class=\"n\">six</span><span class=\"o\">.</span><span class=\"n\">string_types</span><span class=\"p\">),</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">device</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">devices</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">get_available_gpus</span><span class=\"p\">():</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Returns a list of string names of all available GPUs</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">local_device_protos</span> <span class=\"o\">=</span> <span class=\"n\">device_lib</span><span class=\"o\">.</span><span class=\"n\">list_local_devices</span><span class=\"p\">()</span>\n  <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">local_device_protos</span> <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">device_type</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;GPU&#39;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">silence</span><span class=\"p\">():</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Silences tensorflaw&#39;s default printed messages</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">environ</span><span class=\"p\">[</span><span class=\"s1\">&#39;TF_CPP_MIN_LOG_LEVEL&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;3&#39;</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"p\">,</span> <span class=\"n\">clip_value_min</span><span class=\"p\">,</span> <span class=\"n\">clip_value_max</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A wrapper for clip_by_value that casts the clipping range if needed.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"nf\">cast_clip</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Cast clipping range argument if needed.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float64</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dtype&#39;</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Convert to tf dtype in case this is a numpy dtype</span>\n        <span class=\"n\">clip_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">clip_dtype</span> <span class=\"o\">!=</span> <span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">:</span>\n          <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"p\">,</span> <span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">clip</span>\n\n  <span class=\"n\">clip_value_min</span> <span class=\"o\">=</span> <span class=\"n\">cast_clip</span><span class=\"p\">(</span><span class=\"n\">clip_value_min</span><span class=\"p\">)</span>\n  <span class=\"n\">clip_value_max</span> <span class=\"o\">=</span> <span class=\"n\">cast_clip</span><span class=\"p\">(</span><span class=\"n\">clip_value_max</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"p\">,</span> <span class=\"n\">clip_value_min</span><span class=\"p\">,</span> <span class=\"n\">clip_value_max</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">mul</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A wrapper around tf multiplication that does more automatic casting of</span>\n<span class=\"sd\">  the input.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"nf\">multiply</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Multiplication&quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">a</span> <span class=\"o\">*</span> <span class=\"n\">b</span>\n  <span class=\"k\">return</span> <span class=\"n\">op_with_scalar_cast</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">multiply</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">div</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A wrapper around tf division that does more automatic casting of</span>\n<span class=\"sd\">  the input.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"nf\">divide</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Division&quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">a</span> <span class=\"o\">/</span> <span class=\"n\">b</span>\n  <span class=\"k\">return</span> <span class=\"n\">op_with_scalar_cast</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">divide</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">op_with_scalar_cast</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">f</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Builds the graph to compute f(a, b).</span>\n<span class=\"sd\">  If only one of the two arguments is a scalar and the operation would</span>\n<span class=\"sd\">  cause a type error without casting, casts the scalar to match the</span>\n<span class=\"sd\">  tensor.</span>\n<span class=\"sd\">  :param a: a tf-compatible array or scalar</span>\n<span class=\"sd\">  :param b: a tf-compatible array or scalar</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"k\">return</span> <span class=\"n\">f</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">)</span>\n  <span class=\"k\">except</span> <span class=\"p\">(</span><span class=\"ne\">TypeError</span><span class=\"p\">,</span> <span class=\"ne\">ValueError</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">is_scalar</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Return True if `x` is a scalar&quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"s2\">&quot;get_shape&quot;</span><span class=\"p\">):</span>\n      <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span>\n      <span class=\"k\">return</span> <span class=\"n\">shape</span><span class=\"o\">.</span><span class=\"n\">ndims</span> <span class=\"o\">==</span> <span class=\"mi\">0</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"s2\">&quot;ndim&quot;</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">ndim</span> <span class=\"o\">==</span> <span class=\"mi\">0</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"nb\">int</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n  <span class=\"n\">a_scalar</span> <span class=\"o\">=</span> <span class=\"n\">is_scalar</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span>\n  <span class=\"n\">b_scalar</span> <span class=\"o\">=</span> <span class=\"n\">is_scalar</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">a_scalar</span> <span class=\"ow\">and</span> <span class=\"n\">b_scalar</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Trying to apply &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; with mixed types&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">a_scalar</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"n\">b_scalar</span><span class=\"p\">:</span>\n    <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">b_scalar</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"n\">a_scalar</span><span class=\"p\">:</span>\n    <span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">f</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">assert_less_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper for tf.assert_less_equal</span>\n<span class=\"sd\">  Overrides tf.device so that the assert always goes on CPU.</span>\n<span class=\"sd\">  The unwrapped version raises an exception if used with tf.device(&quot;/GPU:x&quot;).</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/CPU:0&quot;</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper for tf.assert_greater_equal.</span>\n<span class=\"sd\">  Overrides tf.device so that the assert always goes on CPU.</span>\n<span class=\"sd\">  The unwrapped version raises an exception if used with tf.device(&quot;/GPU:x&quot;).</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/CPU:0&quot;</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">assert_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper for tf.assert_equal.</span>\n<span class=\"sd\">  Overrides tf.device so that the assert always goes on CPU.</span>\n<span class=\"sd\">  The unwrapped version raises an exception if used with tf.device(&quot;/GPU:x&quot;).</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/CPU:0&quot;</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assert_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">jacobian_graph</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Create the Jacobian graph to be ran later in a TF session</span>\n<span class=\"sd\">  :param predictions: the model&#39;s symbolic output (linear output,</span>\n<span class=\"sd\">      pre-softmax)</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param nb_classes: the number of classes the model has</span>\n<span class=\"sd\">  :return:</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"c1\"># This function will return a list of TF gradients</span>\n  <span class=\"n\">list_derivatives</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n  <span class=\"c1\"># Define the TF graph elements to compute our derivatives for each class</span>\n  <span class=\"k\">for</span> <span class=\"n\">class_ind</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"n\">nb_classes</span><span class=\"p\">):</span>\n    <span class=\"n\">derivatives</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">[:,</span> <span class=\"n\">class_ind</span><span class=\"p\">],</span> <span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">list_derivatives</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">derivatives</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">list_derivatives</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">jacobian_augmentation</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                          <span class=\"n\">x</span><span class=\"p\">,</span>\n                          <span class=\"n\">X_sub_prev</span><span class=\"p\">,</span>\n                          <span class=\"n\">Y_sub</span><span class=\"p\">,</span>\n                          <span class=\"n\">grads</span><span class=\"p\">,</span>\n                          <span class=\"n\">lmbda</span><span class=\"p\">,</span>\n                          <span class=\"n\">aug_batch_size</span><span class=\"o\">=</span><span class=\"mi\">512</span><span class=\"p\">,</span>\n                          <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Augment an adversary&#39;s substitute training set using the Jacobian</span>\n<span class=\"sd\">  of a substitute model to generate new synthetic inputs.</span>\n<span class=\"sd\">  See https://arxiv.org/abs/1602.02697 for more details.</span>\n<span class=\"sd\">  See cleverhans_tutorials/mnist_blackbox.py for example use case</span>\n<span class=\"sd\">  :param sess: TF session in which the substitute model is defined</span>\n<span class=\"sd\">  :param x: input TF placeholder for the substitute model</span>\n<span class=\"sd\">  :param X_sub_prev: substitute training data available to the adversary</span>\n<span class=\"sd\">                     at the previous iteration</span>\n<span class=\"sd\">  :param Y_sub: substitute training labels available to the adversary</span>\n<span class=\"sd\">                at the previous iteration</span>\n<span class=\"sd\">  :param grads: Jacobian symbolic graph for the substitute</span>\n<span class=\"sd\">                (should be generated using utils_tf.jacobian_graph)</span>\n<span class=\"sd\">  :return: augmented substitute data (will need to be labeled by oracle)</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span> <span class=\"o\">==</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">X_sub_prev</span><span class=\"p\">))</span>\n  <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">grads</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">max</span><span class=\"p\">(</span><span class=\"n\">Y_sub</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n  <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_sub_prev</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">Y_sub</span><span class=\"p\">)</span>\n\n  <span class=\"n\">aug_batch_size</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">aug_batch_size</span><span class=\"p\">,</span> <span class=\"n\">X_sub_prev</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n\n  <span class=\"c1\"># Prepare input_shape (outside loop) for feeding dictionary below</span>\n  <span class=\"n\">input_shape</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n  <span class=\"n\">input_shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n\n  <span class=\"c1\"># Create new numpy array for adversary training data</span>\n  <span class=\"c1\"># with twice as many components on the first dimension.</span>\n  <span class=\"n\">X_sub</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">vstack</span><span class=\"p\">([</span><span class=\"n\">X_sub_prev</span><span class=\"p\">,</span> <span class=\"n\">X_sub_prev</span><span class=\"p\">])</span>\n  <span class=\"n\">num_samples</span> <span class=\"o\">=</span> <span class=\"n\">X_sub_prev</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n\n  <span class=\"c1\"># Creating and processing as batch</span>\n  <span class=\"k\">for</span> <span class=\"n\">p_idxs</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">num_samples</span><span class=\"p\">,</span> <span class=\"n\">aug_batch_size</span><span class=\"p\">):</span>\n    <span class=\"n\">X_batch</span> <span class=\"o\">=</span> <span class=\"n\">X_sub_prev</span><span class=\"p\">[</span><span class=\"n\">p_idxs</span><span class=\"p\">:</span><span class=\"n\">p_idxs</span> <span class=\"o\">+</span> <span class=\"n\">aug_batch_size</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span>\n    <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">X_batch</span><span class=\"p\">}</span>\n    <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Compute sign matrix</span>\n    <span class=\"n\">grad_val</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grads</span><span class=\"p\">)],</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"n\">feed_dict</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># Create new synthetic point in adversary substitute training set</span>\n    <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"n\">indx</span><span class=\"p\">,</span> <span class=\"n\">ind</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">p_idxs</span><span class=\"p\">,</span> <span class=\"n\">p_idxs</span> <span class=\"o\">+</span> <span class=\"n\">X_batch</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]),</span>\n                           <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">X_batch</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])):</span>\n      <span class=\"n\">X_sub</span><span class=\"p\">[</span><span class=\"n\">num_samples</span> <span class=\"o\">+</span> <span class=\"n\">indx</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n          <span class=\"n\">X_batch</span><span class=\"p\">[</span><span class=\"n\">ind</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">lmbda</span> <span class=\"o\">*</span> <span class=\"n\">grad_val</span><span class=\"p\">[</span><span class=\"n\">Y_sub</span><span class=\"p\">[</span><span class=\"n\">indx</span><span class=\"p\">],</span> <span class=\"n\">ind</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">])</span>\n\n  <span class=\"c1\"># Return augmented training data (needs to be labeled afterwards)</span>\n  <span class=\"k\">return</span> <span class=\"n\">X_sub</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_modules/index.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Overview: module code &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>All modules for which code is available</h1>\n<ul><li><a href=\"abc.html\">abc</a></li>\n<li><a href=\"builtins.html\">builtins</a></li>\n<li><a href=\"cleverhans/attacks/attack.html\">cleverhans.attacks.attack</a></li>\n<li><a href=\"cleverhans/attacks/basic_iterative_method.html\">cleverhans.attacks.basic_iterative_method</a></li>\n<li><a href=\"cleverhans/attacks/carlini_wagner_l2.html\">cleverhans.attacks.carlini_wagner_l2</a></li>\n<li><a href=\"cleverhans/attacks/deep_fool.html\">cleverhans.attacks.deep_fool</a></li>\n<li><a href=\"cleverhans/attacks/elastic_net_method.html\">cleverhans.attacks.elastic_net_method</a></li>\n<li><a href=\"cleverhans/attacks/fast_feature_adversaries.html\">cleverhans.attacks.fast_feature_adversaries</a></li>\n<li><a href=\"cleverhans/attacks/fast_gradient_method.html\">cleverhans.attacks.fast_gradient_method</a></li>\n<li><a href=\"cleverhans/attacks/hop_skip_jump_attack.html\">cleverhans.attacks.hop_skip_jump_attack</a></li>\n<li><a href=\"cleverhans/attacks/lbfgs.html\">cleverhans.attacks.lbfgs</a></li>\n<li><a href=\"cleverhans/attacks/madry_et_al.html\">cleverhans.attacks.madry_et_al</a></li>\n<li><a href=\"cleverhans/attacks/max_confidence.html\">cleverhans.attacks.max_confidence</a></li>\n<li><a href=\"cleverhans/attacks/momentum_iterative_method.html\">cleverhans.attacks.momentum_iterative_method</a></li>\n<li><a href=\"cleverhans/attacks/noise.html\">cleverhans.attacks.noise</a></li>\n<li><a href=\"cleverhans/attacks/projected_gradient_descent.html\">cleverhans.attacks.projected_gradient_descent</a></li>\n<li><a href=\"cleverhans/attacks/saliency_map_method.html\">cleverhans.attacks.saliency_map_method</a></li>\n<li><a href=\"cleverhans/attacks/semantic.html\">cleverhans.attacks.semantic</a></li>\n<li><a href=\"cleverhans/attacks/sparse_l1_descent.html\">cleverhans.attacks.sparse_l1_descent</a></li>\n<li><a href=\"cleverhans/attacks/spatial_transformation_method.html\">cleverhans.attacks.spatial_transformation_method</a></li>\n<li><a href=\"cleverhans/attacks/spsa.html\">cleverhans.attacks.spsa</a></li>\n<li><a href=\"cleverhans/attacks/virtual_adversarial_method.html\">cleverhans.attacks.virtual_adversarial_method</a></li>\n<li><a href=\"cleverhans/compat.html\">cleverhans.compat</a></li>\n<li><a href=\"cleverhans/model.html\">cleverhans.model</a></li>\n<li><a href=\"cleverhans/utils_tf.html\">cleverhans.utils_tf</a></li>\n</ul>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_sources/README.md.txt",
    "content": "# Generate documentation\r\n\r\nTo generate the documentation do:\r\n`make github`\r\n\r\nThe documentation files will be copied to the `cleverhans/docs` directory.\r\n\r\n### Preparation\r\n\r\nPlease do:\r\n`pip install sphinx`\r\n\r\nAdd a `.nojekyll` file in the `cleverhans/docs` directory. When GitHub sees\r\na `.nojekyll` file, it serves the root `index.html` file. The `.nojekyll` file\r\nindicates that we are not using Jekyll as our static site generator in this\r\nrepository.\r\n\r\n### Enable GitHub Pages for the GitHub repository\r\n\r\n1. Go to the repository on the GitHub website and make sure you are logged in.\r\n2. Add a /docs directory to the master branch. Otherwise you do not get the\r\n   master branch /docs folder for the Source option in the drop-down list.\r\n3. Click the Settings tab. You first go to the Options section.\r\n4. Scroll down to the GitHub Pages section and choose the drop-down list under\r\n   Source. Note: Your choices will differ based on whether you’re in a User repo\r\n   or an Org repository.\r\n5. To keep source and output HTML separate, choose master branch /docs folder\r\n   for Source.\r\n\r\n### Build Sphinx locally and publish on GitHub Pages\r\n\r\nWe keep the source docsource and output docs separate, but still are able to\r\npublish on GitHub Pages and preview builds locally.\r\n\r\nWe have the following option in the Makefile:\r\n\r\n```\r\n  github:\r\n      @make html\r\n      @cp -a _build/html/. ../docs\r\n```\r\n\r\nThus, we can run `make github` from the `docsource` directory to generate a\r\nlocal preview and move the docs where GitHub wants to serve them from.\r\n\r\n### Hacks\r\n\r\nIf you cannot build the docs for attacks, uncomment\r\n`import tensorflow_addons as tfa` in `cleverhans/attacks/spsa.py`.\r\n\r\nOtherwise:\r\n\r\n```angular2html\r\nWARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised:\r\ncannot import name 'keras_tensor'\r\n```\r\n\r\nIt is convenient to create a virtual environment to install all the specific\r\nlibraries (e.g. virutalen cleverhans).\r\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_sources/index.md.txt",
    "content": ".. CleverHans documentation master file, created by\n   sphinx-quickstart on Wed Sep 20 15:14:07 2017.\n   You can adapt this file completely to your liking, but it should at least\n   contain the root `toctree` directive.\n\n   WARNING: This file has a markdown suffix, but is in fact .rst\n\nCleverHans Documentation\n======================================\n\n\nThis documentation is auto-generated from the docstrings of modules of the current `master` branch of `cleverhans\n<http://github.com/cleverhans-lab/cleverhans/>`_.\n\nTo get started, we recommend reading the `github readme\n<https://github.com/cleverhans-lab/cleverhans#setting-up-cleverhans>`_. Afterwards, you can learn more by looking at the following modules:\n\n\n.. toctree::\n   :maxdepth: 4\n\n   source/attacks\n   <!-- source/devtools -->\n   <!-- source/future -->\n   source/model\n\n\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_sources/source/attacks.md.txt",
    "content": "`attacks` module\n--------------------------\n\n.. automodule:: cleverhans.attacks\n    :members:\n    :imported-members:\n    :undoc-members:\n    :show-inheritance:\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_sources/source/devtools.md.txt",
    "content": "`devtools` module\r\n------------------------\r\n\r\n.. automodule:: cleverhans.devtools\r\n    :members:\r\n    :undoc-members:\r\n    :show-inheritance:\r\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_sources/source/future.md.txt",
    "content": "`future` module\r\n------------------------\r\n\r\n.. automodule:: cleverhans.devtools\r\n    :members:\r\n    :undoc-members:\r\n    :show-inheritance:\r\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_sources/source/model.md.txt",
    "content": "`model` module\n------------------------\n\n.. automodule:: cleverhans.model\n    :members:\n    :undoc-members:\n    :show-inheritance:\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/alabaster.css",
    "content": "@import url(\"basic.css\");\n\n/* -- page layout ----------------------------------------------------------- */\n\nbody {\n    font-family: Georgia, serif;\n    font-size: 17px;\n    background-color: #fff;\n    color: #000;\n    margin: 0;\n    padding: 0;\n}\n\n\ndiv.document {\n    width: 940px;\n    margin: 30px auto 0 auto;\n}\n\ndiv.documentwrapper {\n    float: left;\n    width: 100%;\n}\n\ndiv.bodywrapper {\n    margin: 0 0 0 220px;\n}\n\ndiv.sphinxsidebar {\n    width: 220px;\n    font-size: 14px;\n    line-height: 1.5;\n}\n\nhr {\n    border: 1px solid #B1B4B6;\n}\n\ndiv.body {\n    background-color: #fff;\n    color: #3E4349;\n    padding: 0 30px 0 30px;\n}\n\ndiv.body > .section {\n    text-align: left;\n}\n\ndiv.footer {\n    width: 940px;\n    margin: 20px auto 30px auto;\n    font-size: 14px;\n    color: #888;\n    text-align: right;\n}\n\ndiv.footer a {\n    color: #888;\n}\n\np.caption {\n    font-family: inherit;\n    font-size: inherit;\n}\n\n\ndiv.relations {\n    display: none;\n}\n\n\ndiv.sphinxsidebar a {\n    color: #444;\n    text-decoration: none;\n    border-bottom: 1px dotted #999;\n}\n\ndiv.sphinxsidebar a:hover {\n    border-bottom: 1px solid #999;\n}\n\ndiv.sphinxsidebarwrapper {\n    padding: 18px 10px;\n}\n\ndiv.sphinxsidebarwrapper p.logo {\n    padding: 0;\n    margin: -10px 0 0 0px;\n    text-align: center;\n}\n\ndiv.sphinxsidebarwrapper h1.logo {\n    margin-top: -10px;\n    text-align: center;\n    margin-bottom: 5px;\n    text-align: left;\n}\n\ndiv.sphinxsidebarwrapper h1.logo-name {\n    margin-top: 0px;\n}\n\ndiv.sphinxsidebarwrapper p.blurb {\n    margin-top: 0;\n    font-style: normal;\n}\n\ndiv.sphinxsidebar h3,\ndiv.sphinxsidebar h4 {\n    font-family: Georgia, serif;\n    color: #444;\n    font-size: 24px;\n    font-weight: normal;\n    margin: 0 0 5px 0;\n    padding: 0;\n}\n\ndiv.sphinxsidebar h4 {\n    font-size: 20px;\n}\n\ndiv.sphinxsidebar h3 a {\n    color: #444;\n}\n\ndiv.sphinxsidebar p.logo a,\ndiv.sphinxsidebar h3 a,\ndiv.sphinxsidebar p.logo a:hover,\ndiv.sphinxsidebar h3 a:hover {\n    border: none;\n}\n\ndiv.sphinxsidebar p {\n    color: #555;\n    margin: 10px 0;\n}\n\ndiv.sphinxsidebar ul {\n    margin: 10px 0;\n    padding: 0;\n    color: #000;\n}\n\ndiv.sphinxsidebar ul li.toctree-l1 > a {\n    font-size: 120%;\n}\n\ndiv.sphinxsidebar ul li.toctree-l2 > a {\n    font-size: 110%;\n}\n\ndiv.sphinxsidebar input {\n    border: 1px solid #CCC;\n    font-family: Georgia, serif;\n    font-size: 1em;\n}\n\ndiv.sphinxsidebar hr {\n    border: none;\n    height: 1px;\n    color: #AAA;\n    background: #AAA;\n\n    text-align: left;\n    margin-left: 0;\n    width: 50%;\n}\n\ndiv.sphinxsidebar .badge {\n    border-bottom: none;\n}\n\ndiv.sphinxsidebar .badge:hover {\n    border-bottom: none;\n}\n\n/* To address an issue with donation coming after search */\ndiv.sphinxsidebar h3.donation {\n    margin-top: 10px;\n}\n\n/* -- body styles ----------------------------------------------------------- */\n\na {\n    color: #004B6B;\n    text-decoration: underline;\n}\n\na:hover {\n    color: #6D4100;\n    text-decoration: underline;\n}\n\ndiv.body h1,\ndiv.body h2,\ndiv.body h3,\ndiv.body h4,\ndiv.body h5,\ndiv.body h6 {\n    font-family: Georgia, serif;\n    font-weight: normal;\n    margin: 30px 0px 10px 0px;\n    padding: 0;\n}\n\ndiv.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }\ndiv.body h2 { font-size: 180%; }\ndiv.body h3 { font-size: 150%; }\ndiv.body h4 { font-size: 130%; }\ndiv.body h5 { font-size: 100%; }\ndiv.body h6 { font-size: 100%; }\n\na.headerlink {\n    color: #DDD;\n    padding: 0 4px;\n    text-decoration: none;\n}\n\na.headerlink:hover {\n    color: #444;\n    background: #EAEAEA;\n}\n\ndiv.body p, div.body dd, div.body li {\n    line-height: 1.4em;\n}\n\ndiv.admonition {\n    margin: 20px 0px;\n    padding: 10px 30px;\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.admonition tt.xref, div.admonition code.xref, div.admonition a tt {\n    background-color: #FBFBFB;\n    border-bottom: 1px solid #fafafa;\n}\n\ndiv.admonition p.admonition-title {\n    font-family: Georgia, serif;\n    font-weight: normal;\n    font-size: 24px;\n    margin: 0 0 10px 0;\n    padding: 0;\n    line-height: 1;\n}\n\ndiv.admonition p.last {\n    margin-bottom: 0;\n}\n\ndiv.highlight {\n    background-color: #fff;\n}\n\ndt:target, .highlight {\n    background: #FAF3E8;\n}\n\ndiv.warning {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n}\n\ndiv.danger {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n    -moz-box-shadow: 2px 2px 4px #D52C2C;\n    -webkit-box-shadow: 2px 2px 4px #D52C2C;\n    box-shadow: 2px 2px 4px #D52C2C;\n}\n\ndiv.error {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n    -moz-box-shadow: 2px 2px 4px #D52C2C;\n    -webkit-box-shadow: 2px 2px 4px #D52C2C;\n    box-shadow: 2px 2px 4px #D52C2C;\n}\n\ndiv.caution {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n}\n\ndiv.attention {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n}\n\ndiv.important {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.note {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.tip {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.hint {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.seealso {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.topic {\n    background-color: #EEE;\n}\n\np.admonition-title {\n    display: inline;\n}\n\np.admonition-title:after {\n    content: \":\";\n}\n\npre, tt, code {\n    font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;\n    font-size: 0.9em;\n}\n\n.hll {\n    background-color: #FFC;\n    margin: 0 -12px;\n    padding: 0 12px;\n    display: block;\n}\n\nimg.screenshot {\n}\n\ntt.descname, tt.descclassname, code.descname, code.descclassname {\n    font-size: 0.95em;\n}\n\ntt.descname, code.descname {\n    padding-right: 0.08em;\n}\n\nimg.screenshot {\n    -moz-box-shadow: 2px 2px 4px #EEE;\n    -webkit-box-shadow: 2px 2px 4px #EEE;\n    box-shadow: 2px 2px 4px #EEE;\n}\n\ntable.docutils {\n    border: 1px solid #888;\n    -moz-box-shadow: 2px 2px 4px #EEE;\n    -webkit-box-shadow: 2px 2px 4px #EEE;\n    box-shadow: 2px 2px 4px #EEE;\n}\n\ntable.docutils td, table.docutils th {\n    border: 1px solid #888;\n    padding: 0.25em 0.7em;\n}\n\ntable.field-list, table.footnote {\n    border: none;\n    -moz-box-shadow: none;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n}\n\ntable.footnote {\n    margin: 15px 0;\n    width: 100%;\n    border: 1px solid #EEE;\n    background: #FDFDFD;\n    font-size: 0.9em;\n}\n\ntable.footnote + table.footnote {\n    margin-top: -15px;\n    border-top: none;\n}\n\ntable.field-list th {\n    padding: 0 0.8em 0 0;\n}\n\ntable.field-list td {\n    padding: 0;\n}\n\ntable.field-list p {\n    margin-bottom: 0.8em;\n}\n\n/* Cloned from\n * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68\n */\n.field-name {\n    -moz-hyphens: manual;\n    -ms-hyphens: manual;\n    -webkit-hyphens: manual;\n    hyphens: manual;\n}\n\ntable.footnote td.label {\n    width: .1px;\n    padding: 0.3em 0 0.3em 0.5em;\n}\n\ntable.footnote td {\n    padding: 0.3em 0.5em;\n}\n\ndl {\n    margin: 0;\n    padding: 0;\n}\n\ndl dd {\n    margin-left: 30px;\n}\n\nblockquote {\n    margin: 0 0 0 30px;\n    padding: 0;\n}\n\nul, ol {\n    /* Matches the 30px from the narrow-screen \"li > ul\" selector below */\n    margin: 10px 0 10px 30px;\n    padding: 0;\n}\n\npre {\n    background: #EEE;\n    padding: 7px 30px;\n    margin: 15px 0px;\n    line-height: 1.3em;\n}\n\ndiv.viewcode-block:target {\n    background: #ffd;\n}\n\ndl pre, blockquote pre, li pre {\n    margin-left: 0;\n    padding-left: 30px;\n}\n\ntt, code {\n    background-color: #ecf0f3;\n    color: #222;\n    /* padding: 1px 2px; */\n}\n\ntt.xref, code.xref, a tt {\n    background-color: #FBFBFB;\n    border-bottom: 1px solid #fff;\n}\n\na.reference {\n    text-decoration: none;\n    border-bottom: 1px dotted #004B6B;\n}\n\n/* Don't put an underline on images */\na.image-reference, a.image-reference:hover {\n    border-bottom: none;\n}\n\na.reference:hover {\n    border-bottom: 1px solid #6D4100;\n}\n\na.footnote-reference {\n    text-decoration: none;\n    font-size: 0.7em;\n    vertical-align: top;\n    border-bottom: 1px dotted #004B6B;\n}\n\na.footnote-reference:hover {\n    border-bottom: 1px solid #6D4100;\n}\n\na:hover tt, a:hover code {\n    background: #EEE;\n}\n\n\n@media screen and (max-width: 870px) {\n\n    div.sphinxsidebar {\n    \tdisplay: none;\n    }\n\n    div.document {\n       width: 100%;\n\n    }\n\n    div.documentwrapper {\n    \tmargin-left: 0;\n    \tmargin-top: 0;\n    \tmargin-right: 0;\n    \tmargin-bottom: 0;\n    }\n\n    div.bodywrapper {\n    \tmargin-top: 0;\n    \tmargin-right: 0;\n    \tmargin-bottom: 0;\n    \tmargin-left: 0;\n    }\n\n    ul {\n    \tmargin-left: 0;\n    }\n\n\tli > ul {\n        /* Matches the 30px from the \"ul, ol\" selector above */\n\t\tmargin-left: 30px;\n\t}\n\n    .document {\n    \twidth: auto;\n    }\n\n    .footer {\n    \twidth: auto;\n    }\n\n    .bodywrapper {\n    \tmargin: 0;\n    }\n\n    .footer {\n    \twidth: auto;\n    }\n\n    .github {\n        display: none;\n    }\n\n\n\n}\n\n\n\n@media screen and (max-width: 875px) {\n\n    body {\n        margin: 0;\n        padding: 20px 30px;\n    }\n\n    div.documentwrapper {\n        float: none;\n        background: #fff;\n    }\n\n    div.sphinxsidebar {\n        display: block;\n        float: none;\n        width: 102.5%;\n        margin: 50px -30px -20px -30px;\n        padding: 10px 20px;\n        background: #333;\n        color: #FFF;\n    }\n\n    div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,\n    div.sphinxsidebar h3 a {\n        color: #fff;\n    }\n\n    div.sphinxsidebar a {\n        color: #AAA;\n    }\n\n    div.sphinxsidebar p.logo {\n        display: none;\n    }\n\n    div.document {\n        width: 100%;\n        margin: 0;\n    }\n\n    div.footer {\n        display: none;\n    }\n\n    div.bodywrapper {\n        margin: 0;\n    }\n\n    div.body {\n        min-height: 0;\n        padding: 0;\n    }\n\n    .rtd_doc_footer {\n        display: none;\n    }\n\n    .document {\n        width: auto;\n    }\n\n    .footer {\n        width: auto;\n    }\n\n    .footer {\n        width: auto;\n    }\n\n    .github {\n        display: none;\n    }\n}\n\n\n/* misc. */\n\n.revsys-inline {\n    display: none!important;\n}\n\n/* Make nested-list/multi-paragraph items look better in Releases changelog\n * pages. Without this, docutils' magical list fuckery causes inconsistent\n * formatting between different release sub-lists.\n */\ndiv#changelog > div.section > ul > li > p:only-child {\n    margin-bottom: 0;\n}\n\n/* Hide fugly table cell borders in ..bibliography:: directive output */\ntable.docutils.citation, table.docutils.citation td, table.docutils.citation th {\n  border: none;\n  /* Below needed in some edge cases; if not applied, bottom shadows appear */\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n\n/* relbar */\n\n.related {\n    line-height: 30px;\n    width: 100%;\n    font-size: 0.9rem;\n}\n\n.related.top {\n    border-bottom: 1px solid #EEE;\n    margin-bottom: 20px;\n}\n\n.related.bottom {\n    border-top: 1px solid #EEE;\n}\n\n.related ul {\n    padding: 0;\n    margin: 0;\n    list-style: none;\n}\n\n.related li {\n    display: inline;\n}\n\nnav#rellinks {\n    float: right;\n}\n\nnav#rellinks li+li:before {\n    content: \"|\";\n}\n\nnav#breadcrumbs li+li:before {\n    content: \"\\00BB\";\n}\n\n/* Hide certain items when printing */\n@media print {\n    div.related {\n        display: none;\n    }\n}"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/basic.css",
    "content": "/*\n * basic.css\n * ~~~~~~~~~\n *\n * Sphinx stylesheet -- basic theme.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\n/* -- main layout ----------------------------------------------------------- */\n\ndiv.clearer {\n    clear: both;\n}\n\ndiv.section::after {\n    display: block;\n    content: '';\n    clear: left;\n}\n\n/* -- relbar ---------------------------------------------------------------- */\n\ndiv.related {\n    width: 100%;\n    font-size: 90%;\n}\n\ndiv.related h3 {\n    display: none;\n}\n\ndiv.related ul {\n    margin: 0;\n    padding: 0 0 0 10px;\n    list-style: none;\n}\n\ndiv.related li {\n    display: inline;\n}\n\ndiv.related li.right {\n    float: right;\n    margin-right: 5px;\n}\n\n/* -- sidebar --------------------------------------------------------------- */\n\ndiv.sphinxsidebarwrapper {\n    padding: 10px 5px 0 10px;\n}\n\ndiv.sphinxsidebar {\n    float: left;\n    width: 230px;\n    margin-left: -100%;\n    font-size: 90%;\n    word-wrap: break-word;\n    overflow-wrap : break-word;\n}\n\ndiv.sphinxsidebar ul {\n    list-style: none;\n}\n\ndiv.sphinxsidebar ul ul,\ndiv.sphinxsidebar ul.want-points {\n    margin-left: 20px;\n    list-style: square;\n}\n\ndiv.sphinxsidebar ul ul {\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\ndiv.sphinxsidebar form {\n    margin-top: 10px;\n}\n\ndiv.sphinxsidebar input {\n    border: 1px solid #98dbcc;\n    font-family: sans-serif;\n    font-size: 1em;\n}\n\ndiv.sphinxsidebar #searchbox form.search {\n    overflow: hidden;\n}\n\ndiv.sphinxsidebar #searchbox input[type=\"text\"] {\n    float: left;\n    width: 80%;\n    padding: 0.25em;\n    box-sizing: border-box;\n}\n\ndiv.sphinxsidebar #searchbox input[type=\"submit\"] {\n    float: left;\n    width: 20%;\n    border-left: none;\n    padding: 0.25em;\n    box-sizing: border-box;\n}\n\n\nimg {\n    border: 0;\n    max-width: 100%;\n}\n\n/* -- search page ----------------------------------------------------------- */\n\nul.search {\n    margin: 10px 0 0 20px;\n    padding: 0;\n}\n\nul.search li {\n    padding: 5px 0 5px 20px;\n    background-image: url(file.png);\n    background-repeat: no-repeat;\n    background-position: 0 7px;\n}\n\nul.search li a {\n    font-weight: bold;\n}\n\nul.search li div.context {\n    color: #888;\n    margin: 2px 0 0 30px;\n    text-align: left;\n}\n\nul.keywordmatches li.goodmatch a {\n    font-weight: bold;\n}\n\n/* -- index page ------------------------------------------------------------ */\n\ntable.contentstable {\n    width: 90%;\n    margin-left: auto;\n    margin-right: auto;\n}\n\ntable.contentstable p.biglink {\n    line-height: 150%;\n}\n\na.biglink {\n    font-size: 1.3em;\n}\n\nspan.linkdescr {\n    font-style: italic;\n    padding-top: 5px;\n    font-size: 90%;\n}\n\n/* -- general index --------------------------------------------------------- */\n\ntable.indextable {\n    width: 100%;\n}\n\ntable.indextable td {\n    text-align: left;\n    vertical-align: top;\n}\n\ntable.indextable ul {\n    margin-top: 0;\n    margin-bottom: 0;\n    list-style-type: none;\n}\n\ntable.indextable > tbody > tr > td > ul {\n    padding-left: 0em;\n}\n\ntable.indextable tr.pcap {\n    height: 10px;\n}\n\ntable.indextable tr.cap {\n    margin-top: 10px;\n    background-color: #f2f2f2;\n}\n\nimg.toggler {\n    margin-right: 3px;\n    margin-top: 3px;\n    cursor: pointer;\n}\n\ndiv.modindex-jumpbox {\n    border-top: 1px solid #ddd;\n    border-bottom: 1px solid #ddd;\n    margin: 1em 0 1em 0;\n    padding: 0.4em;\n}\n\ndiv.genindex-jumpbox {\n    border-top: 1px solid #ddd;\n    border-bottom: 1px solid #ddd;\n    margin: 1em 0 1em 0;\n    padding: 0.4em;\n}\n\n/* -- domain module index --------------------------------------------------- */\n\ntable.modindextable td {\n    padding: 2px;\n    border-collapse: collapse;\n}\n\n/* -- general body styles --------------------------------------------------- */\n\ndiv.body {\n    min-width: 450px;\n    max-width: 800px;\n}\n\ndiv.body p, div.body dd, div.body li, div.body blockquote {\n    -moz-hyphens: auto;\n    -ms-hyphens: auto;\n    -webkit-hyphens: auto;\n    hyphens: auto;\n}\n\na.headerlink {\n    visibility: hidden;\n}\n\na.brackets:before,\nspan.brackets > a:before{\n    content: \"[\";\n}\n\na.brackets:after,\nspan.brackets > a:after {\n    content: \"]\";\n}\n\nh1:hover > a.headerlink,\nh2:hover > a.headerlink,\nh3:hover > a.headerlink,\nh4:hover > a.headerlink,\nh5:hover > a.headerlink,\nh6:hover > a.headerlink,\ndt:hover > a.headerlink,\ncaption:hover > a.headerlink,\np.caption:hover > a.headerlink,\ndiv.code-block-caption:hover > a.headerlink {\n    visibility: visible;\n}\n\ndiv.body p.caption {\n    text-align: inherit;\n}\n\ndiv.body td {\n    text-align: left;\n}\n\n.first {\n    margin-top: 0 !important;\n}\n\np.rubric {\n    margin-top: 30px;\n    font-weight: bold;\n}\n\nimg.align-left, .figure.align-left, object.align-left {\n    clear: left;\n    float: left;\n    margin-right: 1em;\n}\n\nimg.align-right, .figure.align-right, object.align-right {\n    clear: right;\n    float: right;\n    margin-left: 1em;\n}\n\nimg.align-center, .figure.align-center, object.align-center {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\nimg.align-default, .figure.align-default {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.align-left {\n    text-align: left;\n}\n\n.align-center {\n    text-align: center;\n}\n\n.align-default {\n    text-align: center;\n}\n\n.align-right {\n    text-align: right;\n}\n\n/* -- sidebars -------------------------------------------------------------- */\n\ndiv.sidebar {\n    margin: 0 0 0.5em 1em;\n    border: 1px solid #ddb;\n    padding: 7px;\n    background-color: #ffe;\n    width: 40%;\n    float: right;\n    clear: right;\n    overflow-x: auto;\n}\n\np.sidebar-title {\n    font-weight: bold;\n}\n\ndiv.admonition, div.topic, blockquote {\n    clear: left;\n}\n\n/* -- topics ---------------------------------------------------------------- */\n\ndiv.topic {\n    border: 1px solid #ccc;\n    padding: 7px;\n    margin: 10px 0 10px 0;\n}\n\np.topic-title {\n    font-size: 1.1em;\n    font-weight: bold;\n    margin-top: 10px;\n}\n\n/* -- admonitions ----------------------------------------------------------- */\n\ndiv.admonition {\n    margin-top: 10px;\n    margin-bottom: 10px;\n    padding: 7px;\n}\n\ndiv.admonition dt {\n    font-weight: bold;\n}\n\np.admonition-title {\n    margin: 0px 10px 5px 0px;\n    font-weight: bold;\n}\n\ndiv.body p.centered {\n    text-align: center;\n    margin-top: 25px;\n}\n\n/* -- content of sidebars/topics/admonitions -------------------------------- */\n\ndiv.sidebar > :last-child,\ndiv.topic > :last-child,\ndiv.admonition > :last-child {\n    margin-bottom: 0;\n}\n\ndiv.sidebar::after,\ndiv.topic::after,\ndiv.admonition::after,\nblockquote::after {\n    display: block;\n    content: '';\n    clear: both;\n}\n\n/* -- tables ---------------------------------------------------------------- */\n\ntable.docutils {\n    margin-top: 10px;\n    margin-bottom: 10px;\n    border: 0;\n    border-collapse: collapse;\n}\n\ntable.align-center {\n    margin-left: auto;\n    margin-right: auto;\n}\n\ntable.align-default {\n    margin-left: auto;\n    margin-right: auto;\n}\n\ntable caption span.caption-number {\n    font-style: italic;\n}\n\ntable caption span.caption-text {\n}\n\ntable.docutils td, table.docutils th {\n    padding: 1px 8px 1px 5px;\n    border-top: 0;\n    border-left: 0;\n    border-right: 0;\n    border-bottom: 1px solid #aaa;\n}\n\ntable.footnote td, table.footnote th {\n    border: 0 !important;\n}\n\nth {\n    text-align: left;\n    padding-right: 5px;\n}\n\ntable.citation {\n    border-left: solid 1px gray;\n    margin-left: 1px;\n}\n\ntable.citation td {\n    border-bottom: none;\n}\n\nth > :first-child,\ntd > :first-child {\n    margin-top: 0px;\n}\n\nth > :last-child,\ntd > :last-child {\n    margin-bottom: 0px;\n}\n\n/* -- figures --------------------------------------------------------------- */\n\ndiv.figure {\n    margin: 0.5em;\n    padding: 0.5em;\n}\n\ndiv.figure p.caption {\n    padding: 0.3em;\n}\n\ndiv.figure p.caption span.caption-number {\n    font-style: italic;\n}\n\ndiv.figure p.caption span.caption-text {\n}\n\n/* -- field list styles ----------------------------------------------------- */\n\ntable.field-list td, table.field-list th {\n    border: 0 !important;\n}\n\n.field-list ul {\n    margin: 0;\n    padding-left: 1em;\n}\n\n.field-list p {\n    margin: 0;\n}\n\n.field-name {\n    -moz-hyphens: manual;\n    -ms-hyphens: manual;\n    -webkit-hyphens: manual;\n    hyphens: manual;\n}\n\n/* -- hlist styles ---------------------------------------------------------- */\n\ntable.hlist {\n    margin: 1em 0;\n}\n\ntable.hlist td {\n    vertical-align: top;\n}\n\n\n/* -- other body styles ----------------------------------------------------- */\n\nol.arabic {\n    list-style: decimal;\n}\n\nol.loweralpha {\n    list-style: lower-alpha;\n}\n\nol.upperalpha {\n    list-style: upper-alpha;\n}\n\nol.lowerroman {\n    list-style: lower-roman;\n}\n\nol.upperroman {\n    list-style: upper-roman;\n}\n\n:not(li) > ol > li:first-child > :first-child,\n:not(li) > ul > li:first-child > :first-child {\n    margin-top: 0px;\n}\n\n:not(li) > ol > li:last-child > :last-child,\n:not(li) > ul > li:last-child > :last-child {\n    margin-bottom: 0px;\n}\n\nol.simple ol p,\nol.simple ul p,\nul.simple ol p,\nul.simple ul p {\n    margin-top: 0;\n}\n\nol.simple > li:not(:first-child) > p,\nul.simple > li:not(:first-child) > p {\n    margin-top: 0;\n}\n\nol.simple p,\nul.simple p {\n    margin-bottom: 0;\n}\n\ndl.footnote > dt,\ndl.citation > dt {\n    float: left;\n    margin-right: 0.5em;\n}\n\ndl.footnote > dd,\ndl.citation > dd {\n    margin-bottom: 0em;\n}\n\ndl.footnote > dd:after,\ndl.citation > dd:after {\n    content: \"\";\n    clear: both;\n}\n\ndl.field-list {\n    display: grid;\n    grid-template-columns: fit-content(30%) auto;\n}\n\ndl.field-list > dt {\n    font-weight: bold;\n    word-break: break-word;\n    padding-left: 0.5em;\n    padding-right: 5px;\n}\n\ndl.field-list > dt:after {\n    content: \":\";\n}\n\ndl.field-list > dd {\n    padding-left: 0.5em;\n    margin-top: 0em;\n    margin-left: 0em;\n    margin-bottom: 0em;\n}\n\ndl {\n    margin-bottom: 15px;\n}\n\ndd > :first-child {\n    margin-top: 0px;\n}\n\ndd ul, dd table {\n    margin-bottom: 10px;\n}\n\ndd {\n    margin-top: 3px;\n    margin-bottom: 10px;\n    margin-left: 30px;\n}\n\ndl > dd:last-child,\ndl > dd:last-child > :last-child {\n    margin-bottom: 0;\n}\n\ndt:target, span.highlighted {\n    background-color: #fbe54e;\n}\n\nrect.highlighted {\n    fill: #fbe54e;\n}\n\ndl.glossary dt {\n    font-weight: bold;\n    font-size: 1.1em;\n}\n\n.optional {\n    font-size: 1.3em;\n}\n\n.sig-paren {\n    font-size: larger;\n}\n\n.versionmodified {\n    font-style: italic;\n}\n\n.system-message {\n    background-color: #fda;\n    padding: 5px;\n    border: 3px solid red;\n}\n\n.footnote:target  {\n    background-color: #ffa;\n}\n\n.line-block {\n    display: block;\n    margin-top: 1em;\n    margin-bottom: 1em;\n}\n\n.line-block .line-block {\n    margin-top: 0;\n    margin-bottom: 0;\n    margin-left: 1.5em;\n}\n\n.guilabel, .menuselection {\n    font-family: sans-serif;\n}\n\n.accelerator {\n    text-decoration: underline;\n}\n\n.classifier {\n    font-style: oblique;\n}\n\n.classifier:before {\n    font-style: normal;\n    margin: 0.5em;\n    content: \":\";\n}\n\nabbr, acronym {\n    border-bottom: dotted 1px;\n    cursor: help;\n}\n\n/* -- code displays --------------------------------------------------------- */\n\npre {\n    overflow: auto;\n    overflow-y: hidden;  /* fixes display issues on Chrome browsers */\n}\n\npre, div[class*=\"highlight-\"] {\n    clear: both;\n}\n\nspan.pre {\n    -moz-hyphens: none;\n    -ms-hyphens: none;\n    -webkit-hyphens: none;\n    hyphens: none;\n}\n\ndiv[class*=\"highlight-\"] {\n    margin: 1em 0;\n}\n\ntd.linenos pre {\n    border: 0;\n    background-color: transparent;\n    color: #aaa;\n}\n\ntable.highlighttable {\n    display: block;\n}\n\ntable.highlighttable tbody {\n    display: block;\n}\n\ntable.highlighttable tr {\n    display: flex;\n}\n\ntable.highlighttable td {\n    margin: 0;\n    padding: 0;\n}\n\ntable.highlighttable td.linenos {\n    padding-right: 0.5em;\n}\n\ntable.highlighttable td.code {\n    flex: 1;\n    overflow: hidden;\n}\n\n.highlight .hll {\n    display: block;\n}\n\ndiv.highlight pre,\ntable.highlighttable pre {\n    margin: 0;\n}\n\ndiv.code-block-caption + div {\n    margin-top: 0;\n}\n\ndiv.code-block-caption {\n    margin-top: 1em;\n    padding: 2px 5px;\n    font-size: small;\n}\n\ndiv.code-block-caption code {\n    background-color: transparent;\n}\n\ntable.highlighttable td.linenos,\nspan.linenos,\ndiv.doctest > div.highlight span.gp {  /* gp: Generic.Prompt */\n    user-select: none;\n}\n\ndiv.code-block-caption span.caption-number {\n    padding: 0.1em 0.3em;\n    font-style: italic;\n}\n\ndiv.code-block-caption span.caption-text {\n}\n\ndiv.literal-block-wrapper {\n    margin: 1em 0;\n}\n\ncode.descname {\n    background-color: transparent;\n    font-weight: bold;\n    font-size: 1.2em;\n}\n\ncode.descclassname {\n    background-color: transparent;\n}\n\ncode.xref, a code {\n    background-color: transparent;\n    font-weight: bold;\n}\n\nh1 code, h2 code, h3 code, h4 code, h5 code, h6 code {\n    background-color: transparent;\n}\n\n.viewcode-link {\n    float: right;\n}\n\n.viewcode-back {\n    float: right;\n    font-family: sans-serif;\n}\n\ndiv.viewcode-block:target {\n    margin: -1px -10px;\n    padding: 0 10px;\n}\n\n/* -- math display ---------------------------------------------------------- */\n\nimg.math {\n    vertical-align: middle;\n}\n\ndiv.body div.math p {\n    text-align: center;\n}\n\nspan.eqno {\n    float: right;\n}\n\nspan.eqno a.headerlink {\n    position: absolute;\n    z-index: 1;\n}\n\ndiv.math:hover a.headerlink {\n    visibility: visible;\n}\n\n/* -- printout stylesheet --------------------------------------------------- */\n\n@media print {\n    div.document,\n    div.documentwrapper,\n    div.bodywrapper {\n        margin: 0 !important;\n        width: 100%;\n    }\n\n    div.sphinxsidebar,\n    div.related,\n    div.footer,\n    #top-link {\n        display: none;\n    }\n}"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/custom.css",
    "content": "/* This file intentionally left blank. */\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/doctools.js",
    "content": "/*\n * doctools.js\n * ~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for all documentation.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\n/**\n * select a different prefix for underscore\n */\n$u = _.noConflict();\n\n/**\n * make the code below compatible with browsers without\n * an installed firebug like debugger\nif (!window.console || !console.firebug) {\n  var names = [\"log\", \"debug\", \"info\", \"warn\", \"error\", \"assert\", \"dir\",\n    \"dirxml\", \"group\", \"groupEnd\", \"time\", \"timeEnd\", \"count\", \"trace\",\n    \"profile\", \"profileEnd\"];\n  window.console = {};\n  for (var i = 0; i < names.length; ++i)\n    window.console[names[i]] = function() {};\n}\n */\n\n/**\n * small helper function to urldecode strings\n */\njQuery.urldecode = function(x) {\n  return decodeURIComponent(x).replace(/\\+/g, ' ');\n};\n\n/**\n * small helper function to urlencode strings\n */\njQuery.urlencode = encodeURIComponent;\n\n/**\n * This function returns the parsed url parameters of the\n * current request. Multiple values per key are supported,\n * it will always return arrays of strings for the value parts.\n */\njQuery.getQueryParameters = function(s) {\n  if (typeof s === 'undefined')\n    s = document.location.search;\n  var parts = s.substr(s.indexOf('?') + 1).split('&');\n  var result = {};\n  for (var i = 0; i < parts.length; i++) {\n    var tmp = parts[i].split('=', 2);\n    var key = jQuery.urldecode(tmp[0]);\n    var value = jQuery.urldecode(tmp[1]);\n    if (key in result)\n      result[key].push(value);\n    else\n      result[key] = [value];\n  }\n  return result;\n};\n\n/**\n * highlight a given string on a jquery object by wrapping it in\n * span elements with the given class name.\n */\njQuery.fn.highlightText = function(text, className) {\n  function highlight(node, addItems) {\n    if (node.nodeType === 3) {\n      var val = node.nodeValue;\n      var pos = val.toLowerCase().indexOf(text);\n      if (pos >= 0 &&\n          !jQuery(node.parentNode).hasClass(className) &&\n          !jQuery(node.parentNode).hasClass(\"nohighlight\")) {\n        var span;\n        var isInSVG = jQuery(node).closest(\"body, svg, foreignObject\").is(\"svg\");\n        if (isInSVG) {\n          span = document.createElementNS(\"http://www.w3.org/2000/svg\", \"tspan\");\n        } else {\n          span = document.createElement(\"span\");\n          span.className = className;\n        }\n        span.appendChild(document.createTextNode(val.substr(pos, text.length)));\n        node.parentNode.insertBefore(span, node.parentNode.insertBefore(\n          document.createTextNode(val.substr(pos + text.length)),\n          node.nextSibling));\n        node.nodeValue = val.substr(0, pos);\n        if (isInSVG) {\n          var rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n          var bbox = node.parentElement.getBBox();\n          rect.x.baseVal.value = bbox.x;\n          rect.y.baseVal.value = bbox.y;\n          rect.width.baseVal.value = bbox.width;\n          rect.height.baseVal.value = bbox.height;\n          rect.setAttribute('class', className);\n          addItems.push({\n              \"parent\": node.parentNode,\n              \"target\": rect});\n        }\n      }\n    }\n    else if (!jQuery(node).is(\"button, select, textarea\")) {\n      jQuery.each(node.childNodes, function() {\n        highlight(this, addItems);\n      });\n    }\n  }\n  var addItems = [];\n  var result = this.each(function() {\n    highlight(this, addItems);\n  });\n  for (var i = 0; i < addItems.length; ++i) {\n    jQuery(addItems[i].parent).before(addItems[i].target);\n  }\n  return result;\n};\n\n/*\n * backward compatibility for jQuery.browser\n * This will be supported until firefox bug is fixed.\n */\nif (!jQuery.browser) {\n  jQuery.uaMatch = function(ua) {\n    ua = ua.toLowerCase();\n\n    var match = /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n      /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n      /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n      /(msie) ([\\w.]+)/.exec(ua) ||\n      ua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua) ||\n      [];\n\n    return {\n      browser: match[ 1 ] || \"\",\n      version: match[ 2 ] || \"0\"\n    };\n  };\n  jQuery.browser = {};\n  jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;\n}\n\n/**\n * Small JavaScript module for the documentation.\n */\nvar Documentation = {\n\n  init : function() {\n    this.fixFirefoxAnchorBug();\n    this.highlightSearchWords();\n    this.initIndexTable();\n    if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {\n      this.initOnKeyListeners();\n    }\n  },\n\n  /**\n   * i18n support\n   */\n  TRANSLATIONS : {},\n  PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },\n  LOCALE : 'unknown',\n\n  // gettext and ngettext don't access this so that the functions\n  // can safely bound to a different name (_ = Documentation.gettext)\n  gettext : function(string) {\n    var translated = Documentation.TRANSLATIONS[string];\n    if (typeof translated === 'undefined')\n      return string;\n    return (typeof translated === 'string') ? translated : translated[0];\n  },\n\n  ngettext : function(singular, plural, n) {\n    var translated = Documentation.TRANSLATIONS[singular];\n    if (typeof translated === 'undefined')\n      return (n == 1) ? singular : plural;\n    return translated[Documentation.PLURALEXPR(n)];\n  },\n\n  addTranslations : function(catalog) {\n    for (var key in catalog.messages)\n      this.TRANSLATIONS[key] = catalog.messages[key];\n    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');\n    this.LOCALE = catalog.locale;\n  },\n\n  /**\n   * add context elements like header anchor links\n   */\n  addContextElements : function() {\n    $('div[id] > :header:first').each(function() {\n      $('<a class=\"headerlink\">\\u00B6</a>').\n      attr('href', '#' + this.id).\n      attr('title', _('Permalink to this headline')).\n      appendTo(this);\n    });\n    $('dt[id]').each(function() {\n      $('<a class=\"headerlink\">\\u00B6</a>').\n      attr('href', '#' + this.id).\n      attr('title', _('Permalink to this definition')).\n      appendTo(this);\n    });\n  },\n\n  /**\n   * workaround a firefox stupidity\n   * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075\n   */\n  fixFirefoxAnchorBug : function() {\n    if (document.location.hash && $.browser.mozilla)\n      window.setTimeout(function() {\n        document.location.href += '';\n      }, 10);\n  },\n\n  /**\n   * highlight the search words provided in the url in the text\n   */\n  highlightSearchWords : function() {\n    var params = $.getQueryParameters();\n    var terms = (params.highlight) ? params.highlight[0].split(/\\s+/) : [];\n    if (terms.length) {\n      var body = $('div.body');\n      if (!body.length) {\n        body = $('body');\n      }\n      window.setTimeout(function() {\n        $.each(terms, function() {\n          body.highlightText(this.toLowerCase(), 'highlighted');\n        });\n      }, 10);\n      $('<p class=\"highlight-link\"><a href=\"javascript:Documentation.' +\n        'hideSearchWords()\">' + _('Hide Search Matches') + '</a></p>')\n          .appendTo($('#searchbox'));\n    }\n  },\n\n  /**\n   * init the domain index toggle buttons\n   */\n  initIndexTable : function() {\n    var togglers = $('img.toggler').click(function() {\n      var src = $(this).attr('src');\n      var idnum = $(this).attr('id').substr(7);\n      $('tr.cg-' + idnum).toggle();\n      if (src.substr(-9) === 'minus.png')\n        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');\n      else\n        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');\n    }).css('display', '');\n    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {\n        togglers.click();\n    }\n  },\n\n  /**\n   * helper function to hide the search marks again\n   */\n  hideSearchWords : function() {\n    $('#searchbox .highlight-link').fadeOut(300);\n    $('span.highlighted').removeClass('highlighted');\n  },\n\n  /**\n   * make the url absolute\n   */\n  makeURL : function(relativeURL) {\n    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;\n  },\n\n  /**\n   * get the current relative url\n   */\n  getCurrentURL : function() {\n    var path = document.location.pathname;\n    var parts = path.split(/\\//);\n    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\\//), function() {\n      if (this === '..')\n        parts.pop();\n    });\n    var url = parts.join('/');\n    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);\n  },\n\n  initOnKeyListeners: function() {\n    $(document).keydown(function(event) {\n      var activeElementType = document.activeElement.tagName;\n      // don't navigate when in search box, textarea, dropdown or button\n      if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'\n          && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey\n          && !event.shiftKey) {\n        switch (event.keyCode) {\n          case 37: // left\n            var prevHref = $('link[rel=\"prev\"]').prop('href');\n            if (prevHref) {\n              window.location.href = prevHref;\n              return false;\n            }\n          case 39: // right\n            var nextHref = $('link[rel=\"next\"]').prop('href');\n            if (nextHref) {\n              window.location.href = nextHref;\n              return false;\n            }\n        }\n      }\n    });\n  }\n};\n\n// quick alias for translations\n_ = Documentation.gettext;\n\n$(document).ready(function() {\n  Documentation.init();\n});\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/documentation_options.js",
    "content": "var DOCUMENTATION_OPTIONS = {\n    URL_ROOT: document.getElementById(\"documentation_options\").getAttribute('data-url_root'),\n    VERSION: '',\n    LANGUAGE: 'None',\n    COLLAPSE_INDEX: false,\n    BUILDER: 'html',\n    FILE_SUFFIX: '.html',\n    LINK_SUFFIX: '.html',\n    HAS_SOURCE: true,\n    SOURCELINK_SUFFIX: '.txt',\n    NAVIGATION_WITH_KEYS: false\n};"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/jquery-3.5.1.js",
    "content": "/*!\n * jQuery JavaScript Library v3.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2020-05-04T22:49Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n      // Support: Chrome <=57, Firefox <=52\n      // In some browsers, typeof returns \"function\" for HTML <object> elements\n      // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n      // We don't want to classify *any* DOM node as a function.\n      return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.5.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( _i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.5\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2020-03-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px\";\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = parseInt( trStyle.height ) > 3;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = (\n\t\t\t\t\tdataPriv.get( cur, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script\n\t\t\tif ( !isSuccess && jQuery.inArray( \"script\", s.dataTypes ) > -1 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tif ( typeof props.top === \"number\" ) {\n\t\t\t\tprops.top += \"px\";\n\t\t\t}\n\t\t\tif ( typeof props.left === \"number\" ) {\n\t\t\t\tprops.left += \"px\";\n\t\t\t}\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t} );\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/jquery.js",
    "content": "/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(C,e){\"use strict\";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement(\"script\");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[o.call(e)]||\"object\":typeof e}var f=\"3.5.1\",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&\"length\"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],\"__proto__\"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:\"jQuery\"+(f+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==o.call(e))&&(!(t=r(e))||\"function\"==typeof(n=v.call(t,\"constructor\")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,\"string\"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),\"function\"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){n[\"[object \"+t+\"]\"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S=\"sizzle\"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",M=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",I=\"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\"+M+\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",W=\"\\\\[\"+M+\"*(\"+I+\")(?:\"+M+\"*([*^$|!~]?=)\"+M+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+I+\"))|)\"+M+\"*\\\\]\",F=\":(\"+I+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+W+\")*)|.*)\\\\)|)\",B=new RegExp(M+\"+\",\"g\"),$=new RegExp(\"^\"+M+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+M+\"+$\",\"g\"),_=new RegExp(\"^\"+M+\"*,\"+M+\"*\"),z=new RegExp(\"^\"+M+\"*([>+~]|\"+M+\")\"+M+\"*\"),U=new RegExp(M+\"|>\"),X=new RegExp(F),V=new RegExp(\"^\"+I+\"$\"),G={ID:new RegExp(\"^#(\"+I+\")\"),CLASS:new RegExp(\"^\\\\.(\"+I+\")\"),TAG:new RegExp(\"^(\"+I+\"|[*])\"),ATTR:new RegExp(\"^\"+W),PSEUDO:new RegExp(\"^\"+F),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+M+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+M+\"*(?:([+-]|)\"+M+\"*(\\\\d+)|))\"+M+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+R+\")$\",\"i\"),needsContext:new RegExp(\"^\"+M+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+M+\"*((?:-\\\\d)?\\\\d*)\"+M+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\\d$/i,K=/^[^{]+\\{\\s*\\[native \\w/,Z=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ee=/[+~]/,te=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+M+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),ne=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,ie=function(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&\"fieldset\"===e.nodeName.toLowerCase()},{dir:\"parentNode\",next:\"legend\"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+\" \"]&&(!v||!v.test(t))&&(1!==p||\"object\"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute(\"id\"))?s=s.replace(re,ie):e.setAttribute(\"id\",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+xe(l[o]);c=l.join(\",\")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return g(t.replace($,\"$1\"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split(\"|\"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return\"input\"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return(\"input\"===t||\"button\"===t)&&e.type===n}}function ge(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||\"HTML\")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",oe,!1):n.attachEvent&&n.attachEvent(\"onunload\",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement(\"div\")),\"undefined\"!=typeof e.querySelectorAll&&!e.querySelectorAll(\":scope fieldset div\").length}),d.attributes=ce(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=\"<a id='\"+S+\"'></a><select id='\"+S+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&v.push(\"[*^$]=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||v.push(\"\\\\[\"+M+\"*(?:value|\"+R+\")\"),e.querySelectorAll(\"[id~=\"+S+\"-]\").length||v.push(\"~=\"),(t=C.createElement(\"input\")).setAttribute(\"name\",\"\"),e.appendChild(t),e.querySelectorAll(\"[name='']\").length||v.push(\"\\\\[\"+M+\"*name\"+M+\"*=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\":checked\").length||v.push(\":checked\"),e.querySelectorAll(\"a#\"+S+\"+*\").length||v.push(\".#.+[+~]\"),e.querySelectorAll(\"\\\\\\f\"),v.push(\"[\\\\r\\\\n\\\\f]\")}),ce(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=C.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&v.push(\"name\"+M+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&v.push(\":enabled\",\":disabled\"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&v.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),v.push(\",.*:\")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,\"*\"),c.call(e,\"[s!='']:x\"),s.push(\"!=\",F)}),v=v.length&&new RegExp(v.join(\"|\")),s=s.length&&new RegExp(s.join(\"|\")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+\" \"]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+\"\").replace(re,ie)},se.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n=\"\",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||\"\").replace(te,ne),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+\" \"];return t||(t=new RegExp(\"(^|\"+M+\")\"+e+\"(\"+M+\"|$)\"))&&m(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?\"!=\"===r:!r||(t+=\"\",\"=\"===r?t===i:\"!=\"===r?t!==i:\"^=\"===r?i&&0===t.indexOf(i):\"*=\"===r?i&&-1<t.indexOf(i):\"$=\"===r?i&&t.slice(-i.length)===i:\"~=\"===r?-1<(\" \"+t.replace(B,\" \")+\" \").indexOf(i):\"|=\"===r&&(t===i||t.slice(0,i.length+1)===i+\"-\"))}},CHILD:function(h,e,t,g,v){var y=\"nth\"!==h.slice(0,3),m=\"last\"!==h.slice(-4),x=\"of-type\"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?\"nextSibling\":\"previousSibling\",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l=\"only\"===h&&!u&&\"nextSibling\"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error(\"unsupported pseudo: \"+e);return a[S]?a(o):1<a.length?(t=[e,e,\"\",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,\"$1\"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||\"\")||se.error(\"unsupported lang: \"+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute(\"xml:lang\")||e.getAttribute(\"lang\"))return(t=t.toLowerCase())===n||0===t.indexOf(n+\"-\")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&\"parentNode\"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||\"*\",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[\" \"],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:\" \"===e[s-2].type?\"*\":\"\"})).replace($,\"$1\"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+\" \"];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($,\" \")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+\" \"];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l=\"0\",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG(\"*\",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l=\"function\"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&\"ID\"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split(\"\").sort(D).join(\"\")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement(\"fieldset\"))}),ce(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||fe(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||fe(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute(\"disabled\")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[\":\"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):\"string\"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if(\"string\"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,\"string\"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,\"string\"==typeof e){if(!(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a=\"string\"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?\"string\"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,\"parentNode\")},parentsUntil:function(e,t,n){return h(e,\"parentNode\",n)},next:function(e){return O(e,\"nextSibling\")},prev:function(e){return O(e,\"previousSibling\")},nextAll:function(e){return h(e,\"nextSibling\")},prevAll:function(e){return h(e,\"previousSibling\")},nextUntil:function(e,t,n){return h(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return h(e,\"previousSibling\",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,\"template\")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return\"Until\"!==r.slice(-5)&&(t=e),t&&\"string\"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\\x20\\t\\r\\n\\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r=\"string\"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:\"\")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&\"string\"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t=\"\",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=\"\"),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[[\"notify\",\"progress\",S.Callbacks(\"memory\"),S.Callbacks(\"memory\"),2],[\"resolve\",\"done\",S.Callbacks(\"once memory\"),S.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",S.Callbacks(\"once memory\"),S.Callbacks(\"once memory\"),1,\"rejected\"]],i=\"pending\",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},\"catch\":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+\"With\"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError(\"Thenable self-resolution\");t=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+\"With\"](this===s?void 0:this,arguments),this},s[t[0]+\"With\"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),\"pending\"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn(\"jQuery.Deferred exception: \"+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener(\"DOMContentLoaded\",B),C.removeEventListener(\"load\",B),S.ready()}S.fn.ready=function(e){return F.then(e)[\"catch\"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,\"complete\"===E.readyState||\"loading\"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener(\"DOMContentLoaded\",B),C.addEventListener(\"load\",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if(\"object\"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,\"ms-\").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if(\"string\"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(K,\"-$&\").toLowerCase(),\"string\"==typeof(n=e.getAttribute(r))){try{n=\"true\"===(i=n)||\"false\"!==i&&(\"null\"===i?null:i===+i+\"\"?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,\"hasDataAttrs\"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf(\"data-\")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,\"hasDataAttrs\",!0)}return i}return\"object\"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks(\"once memory\").add(function(){Y.remove(e,[t+\"queue\",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return\"string\"!=typeof t&&(n=t,t=\"fx\",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),\"fx\"===t&&\"inprogress\"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";while(a--)(n=Y.get(o[a],e+\"queueHooks\"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,te=new RegExp(\"^(?:([+-])=|)(\"+ee+\")([a-z%]*)$\",\"i\"),ne=[\"Top\",\"Right\",\"Bottom\",\"Left\"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return\"none\"===(e=t||e).style.display||\"\"===e.style.display&&ie(e)&&\"none\"===S.css(e,\"display\")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,\"\")},u=s(),l=n&&n[3]||(S.cssNumber[t]?\"\":\"px\"),c=e.nodeType&&(S.cssNumber[t]||\"px\"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?(\"none\"===n&&(l[c]=Y.get(r,\"display\")||null,l[c]||(r.style.display=\"\")),\"\"===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,\"display\"),o.parentNode.removeChild(o),\"none\"===u&&(u=\"block\"),ue[s]=u)))):\"none\"!==n&&(l[c]=\"none\",Y.set(r,\"display\",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i,he=/^$|^module$|\\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement(\"div\")),(fe=E.createElement(\"input\")).setAttribute(\"type\",\"radio\"),fe.setAttribute(\"checked\",\"checked\"),fe.setAttribute(\"name\",\"t\"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML=\"<textarea>x</textarea>\",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=\"<option></option>\",y.option=!!ce.lastChild;var ge={thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};function ve(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],\"globalEval\",!t||Y.get(t[n],\"globalEval\"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,\"<select multiple='multiple'>\",\"</select>\"]);var me=/<|&#?\\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if(\"object\"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement(\"div\")),s=(de.exec(o)||[\"\",\"\"])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=\"\"}else p.push(t.createTextNode(o));f.textContent=\"\",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),\"script\"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||\"\")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==(\"focus\"===t)}function ke(e,t,n,r,i,o){var a,s;if(\"object\"==typeof t){for(s in\"string\"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&(\"string\"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return\"undefined\"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||\"\").match(P)||[\"\"]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||\"\").match(P)||[\"\"]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,\"events\")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+\" \"]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Ae(t,\"click\",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Ae(t,\"click\"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Y.get(t,\"click\")||A(t,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,\"char\":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&\"function\"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\\s*(?:[^=]|=\\s*.checked.)/i,je=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;function qe(e,t){return A(e,\"table\")&&A(11!==t.nodeType?t:t.firstChild,\"tr\")&&S(e).children(\"tbody\")[0]||e}function Le(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function He(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,\"handle events\"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&\"string\"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,\"script\"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,\"script\"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||\"\")&&!Y.access(u,\"globalEval\")&&S.contains(l,u)&&(u.src&&\"module\"!==(u.type||\"\").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute(\"nonce\")},l):b(u.textContent.replace(je,\"\"),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,\"script\")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,\"input\"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:\"input\"!==l&&\"textarea\"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,\"script\")).length&&ye(a,!f&&ve(e,\"script\")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp(\"^(\"+ee+\")(?!px)[a-z%]+$\",\"i\"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join(\"|\"),\"i\");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(\"\"!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+\"\":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText=\"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\",l.style.cssText=\"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n=\"1%\"!==e.top,s=12===t(e.marginLeft),l.style.right=\"60%\",o=36===t(e.right),r=36===t(e.width),l.style.position=\"absolute\",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement(\"div\"),l=E.createElement(\"div\");l.style&&(l.style.backgroundClip=\"content-box\",l.cloneNode(!0).style.backgroundClip=\"\",y.clearCloneStyle=\"content-box\"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement(\"table\"),t=E.createElement(\"tr\"),n=E.createElement(\"div\"),e.style.cssText=\"position:absolute;left:-11111px\",t.style.height=\"1px\",n.style.height=\"9px\",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=[\"Webkit\",\"Moz\",\"ms\"],ze=E.createElement(\"div\").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Qe={letterSpacing:\"0\",fontWeight:\"400\"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function Ke(e,t,n,r,i,o){var a=\"width\"===t?1:0,s=0,u=0;if(n===(r?\"border\":\"content\"))return 0;for(;a<4;a+=2)\"margin\"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?(\"content\"===n&&(u-=S.css(e,\"padding\"+ne[a],!0,i)),\"margin\"!==n&&(u-=S.css(e,\"border\"+ne[a]+\"Width\",!0,i))):(u+=S.css(e,\"padding\"+ne[a],!0,i),\"padding\"!==n?u+=S.css(e,\"border\"+ne[a]+\"Width\",!0,i):s+=S.css(e,\"border\"+ne[a]+\"Width\",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&\"border-box\"===S.css(e,\"boxSizing\",!1,r),o=i,a=Be(e,t,r),s=\"offset\"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a=\"auto\"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,\"tr\")||\"auto\"===a||!parseFloat(a)&&\"inline\"===S.css(e,\"display\",!1,r))&&e.getClientRects().length&&(i=\"border-box\"===S.css(e,\"boxSizing\",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?\"border\":\"content\"),o,r,a)+\"px\"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&\"get\"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];\"string\"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o=\"number\"),null!=n&&n==n&&(\"number\"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?\"\":\"px\")),y.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(l[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&\"get\"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),\"normal\"===i&&t in Qe&&(i=Qe[t]),\"\"===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each([\"height\",\"width\"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&\"absolute\"===i.position,a=(o||n)&&\"border-box\"===S.css(e,\"boxSizing\",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e[\"offset\"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,\"border\",!1,i)-.5)),s&&(r=te.exec(t))&&\"px\"!==(r[3]||\"px\")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,\"marginLeft\"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),S.each({margin:\"\",padding:\"\",border:\"Width\"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r=\"string\"==typeof e?e.split(\" \"):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},\"margin\"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?\"\":\"px\")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,\"\"))&&\"auto\"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i[\"margin\"+(n=ne[r])]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners[\"*\"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&\"expand\"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=[\"*\"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,\"fxshow\");for(r in n.queue||(null==(a=S._queueHooks(e,\"fx\")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,\"fx\").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||\"toggle\"===i,i===(g?\"hide\":\"show\")){if(\"show\"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,\"display\")),\"none\"===(c=S.css(e,\"display\"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,\"display\"),le([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===S.css(e,\"float\")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l=\"none\"===c?\"\":c)),h.display=\"inline-block\")),n.overflow&&(h.overflow=\"hidden\",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?\"hidden\"in v&&(g=v.hidden):v=Y.access(e,\"fxshow\",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,\"fxshow\"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&\"object\"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,\"finish\"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return\"string\"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||\"fx\",[]),this.each(function(){var e=!0,t=null!=i&&i+\"queueHooks\",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||\"fx\"),this.each(function(){var e,t=Y.get(this),n=t[a+\"queue\"],r=t[a+\"queueHooks\"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each([\"toggle\",\"show\",\"hide\"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||\"boolean\"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt(\"show\"),slideUp:lt(\"hide\"),slideToggle:lt(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||\"fx\",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement(\"input\"),it=E.createElement(\"select\").appendChild(E.createElement(\"option\")),rt.type=\"checkbox\",y.checkOn=\"\"!==rt.value,y.optSelected=it.selected,(rt=E.createElement(\"input\")).value=\"t\",rt.type=\"radio\",y.radioValue=\"t\"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return\"undefined\"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):i&&\"get\"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&\"radio\"===t&&A(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(\" \")}function yt(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function mt(e){return Array.isArray(e)?e:\"string\"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,\"tabindex\");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&\" \"+vt(i)+\" \"){a=0;while(o=e[a++])r.indexOf(\" \"+o+\" \")<0&&(r+=o+\" \");i!==(s=vt(r))&&n.setAttribute(\"class\",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&\" \"+vt(i)+\" \"){a=0;while(o=e[a++])while(-1<r.indexOf(\" \"+o+\" \"))r=r.replace(\" \"+o+\" \",\" \");i!==(s=vt(r))&&n.setAttribute(\"class\",s)}return this},toggleClass:function(i,t){var o=typeof i,a=\"string\"===o||Array.isArray(i);return\"boolean\"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&\"boolean\"!==o||((e=yt(this))&&Y.set(this,\"__className__\",e),this.setAttribute&&this.setAttribute(\"class\",e||!1===i?\"\":Y.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;t=\" \"+e+\" \";while(n=this[r++])if(1===n.nodeType&&-1<(\" \"+vt(yt(n))+\" \").indexOf(t))return!0;return!1}});var xt=/\\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t=\"\":\"number\"==typeof t?t+=\"\":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?\"\":e+\"\"})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&\"set\"in r&&void 0!==r.set(this,t,\"value\")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&\"get\"in r&&void 0!==(e=r.get(t,\"value\"))?e:\"string\"==typeof(e=t.value)?e.replace(xt,\"\"):null==e?\"\":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,\"value\");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,\"optgroup\"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each([\"radio\",\"checkbox\"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})}),y.focusin=\"onfocusin\"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,\"type\")?e.type:e,h=v.call(e,\"namespace\")?e.namespace.split(\".\"):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(\".\")&&(d=(h=d.split(\".\")).shift(),h.sort()),u=d.indexOf(\":\")<0&&\"on\"+d,(e=e[S.expando]?e:new S.Event(d,\"object\"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join(\".\"),e.rnamespace=e.namespace?new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,\"events\")||Object.create(null))[e.type]&&Y.get(o,\"handle\"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:\"focusin\",blur:\"focusout\"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\\?/;S.parseXML=function(e){var t;if(!e||\"string\"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,\"text/xml\")}catch(e){t=void 0}return t&&!t.getElementsByTagName(\"parsererror\").length||S.error(\"Invalid XML: \"+e),t};var St=/\\[\\]$/,kt=/\\r?\\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+\"[\"+(\"object\"==typeof t&&null!=t?e:\"\")+\"]\",t,r,i)});else if(r||\"object\"!==w(e))i(n,e);else for(t in e)Dt(n+\"[\"+t+\"]\",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(null==e)return\"\";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join(\"&\")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,\"elements\");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(\":disabled\")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,\"\\r\\n\")}}):{name:t.name,value:n.replace(kt,\"\\r\\n\")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\\/\\//,Rt={},Mt={},It=\"*/\".concat(\"*\"),Wt=E.createElement(\"a\");function Ft(o){return function(e,t){\"string\"!=typeof e&&(t=e,e=\"*\");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])\"+\"===n[0]?(n=n.slice(1)||\"*\",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return\"string\"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s[\"*\"]&&l(\"*\")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:\"GET\",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":It,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){\"object\"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks(\"once memory\"),w=v.statusCode||{},a={},s={},u=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+\" \"]=(n[t[1].toLowerCase()+\" \"]||[]).concat(t[2])}t=n[e.toLowerCase()+\" \"]}return null==t?null:t.join(\", \")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+\"\").replace(Pt,Tt.protocol+\"//\"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||\"*\").toLowerCase().match(P)||[\"\"],null==v.crossDomain){r=E.createElement(\"a\");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+\"//\"+Wt.host!=r.protocol+\"//\"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&\"string\"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger(\"ajaxStart\"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,\"\"),v.hasContent?v.data&&v.processData&&0===(v.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(v.data=v.data.replace(jt,\"+\")):(o=v.url.slice(f.length),v.data&&(v.processData||\"string\"==typeof v.data)&&(f+=(Et.test(f)?\"&\":\"?\")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,\"$1\"),o=(Et.test(f)?\"&\":\"?\")+\"_=\"+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader(\"If-Modified-Since\",S.lastModified[f]),S.etag[f]&&T.setRequestHeader(\"If-None-Match\",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader(\"Content-Type\",v.contentType),T.setRequestHeader(\"Accept\",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+(\"*\"!==v.dataTypes[0]?\", \"+It+\"; q=0.01\":\"\"):v.accepts[\"*\"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u=\"abort\",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger(\"ajaxSend\",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort(\"timeout\")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,\"No Transport\");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||\"\",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray(\"script\",v.dataTypes)&&(v.converters[\"text script\"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(!(a=l[u+\" \"+o]||l[\"* \"+o]))for(i in l)if((s=i.split(\" \"))[1]===o&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader(\"Last-Modified\"))&&(S.lastModified[f]=u),(u=T.getResponseHeader(\"etag\"))&&(S.etag[f]=u)),204===e||\"HEAD\"===v.type?l=\"nocontent\":304===e?l=\"notmodified\":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l=\"error\",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+\"\",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?\"ajaxSuccess\":\"ajaxError\",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger(\"ajaxComplete\",[T,v]),--S.active||S.event.trigger(\"ajaxStop\")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,\"json\")},getScript:function(e,t){return S.get(e,void 0,t,\"script\")}}),S.each([\"get\",\"post\"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)\"content-type\"===t.toLowerCase()&&(e.contentType=e.headers[t]||\"\")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,converters:{\"text script\":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&\"withCredentials\"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e[\"X-Requested-With\"]||(e[\"X-Requested-With\"]=\"XMLHttpRequest\"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,\"abort\"===e?r.abort():\"error\"===e?\"number\"!=typeof r.status?t(0,\"error\"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,\"text\"!==(r.responseType||\"text\")||\"string\"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o(\"error\"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o(\"abort\");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),S.ajaxTransport(\"script\",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S(\"<script>\").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on(\"load error\",i=function(e){r.remove(),i=null,e&&t(\"error\"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\\?(?=&|$)|\\?\\?/;S.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Xt.pop()||S.expando+\"_\"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter(\"json jsonp\",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?\"url\":\"string\"==typeof e.data&&0===(e.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Vt.test(e.data)&&\"data\");if(a||\"jsonp\"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,\"$1\"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?\"&\":\"?\")+e.jsonp+\"=\"+r),e.converters[\"script json\"]=function(){return o||S.error(r+\" was not called\"),o[0]},e.dataTypes[0]=\"json\",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),\"script\"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument(\"\").body).innerHTML=\"<form></form><form></form>\",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return\"string\"!=typeof e?[]:(\"boolean\"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(i=\"POST\"),0<a.length&&S.ajax({url:e,type:i||\"GET\",dataType:\"html\",data:t}).done(function(e){o=arguments,a.html(r?S(\"<div>\").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,\"position\"),c=S(e),f={};\"static\"===l&&(e.style.position=\"relative\"),s=c.offset(),o=S.css(e,\"top\"),u=S.css(e,\"left\"),(\"absolute\"===l||\"fixed\"===l)&&-1<(o+u).indexOf(\"auto\")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),\"using\"in t?t.using.call(e,f):(\"number\"==typeof f.top&&(f.top+=\"px\"),\"number\"==typeof f.left&&(f.left+=\"px\"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===S.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===S.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,\"borderTopWidth\",!0),i.left+=S.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-S.css(r,\"marginTop\",!0),left:t.left-i.left-S.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===S.css(e,\"position\"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,i){var o=\"pageYOffset\"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each([\"top\",\"left\"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+\"px\":t})}),S.each({Height:\"height\",Width:\"width\"},function(a,s){S.each({padding:\"inner\"+a,content:s,\"\":\"outer\"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||\"boolean\"!=typeof e),i=r||(!0===e||!0===t?\"margin\":\"border\");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf(\"outer\")?e[\"inner\"+a]:e.document.documentElement[\"client\"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body[\"scroll\"+a],r[\"scroll\"+a],e.body[\"offset\"+a],r[\"offset\"+a],r[\"client\"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?\"\":(e+\"\").replace(Gt,\"\")},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},\"undefined\"==typeof e&&(C.jQuery=C.$=S),S});\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/language_data.js",
    "content": "/*\n * language_data.js\n * ~~~~~~~~~~~~~~~~\n *\n * This script contains the language-specific data used by searchtools.js,\n * namely the list of stopwords, stemmer, scorer and splitter.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\nvar stopwords = [\"a\",\"and\",\"are\",\"as\",\"at\",\"be\",\"but\",\"by\",\"for\",\"if\",\"in\",\"into\",\"is\",\"it\",\"near\",\"no\",\"not\",\"of\",\"on\",\"or\",\"such\",\"that\",\"the\",\"their\",\"then\",\"there\",\"these\",\"they\",\"this\",\"to\",\"was\",\"will\",\"with\"];\n\n\n/* Non-minified version JS is _stemmer.js if file is provided */ \n/**\n * Porter Stemmer\n */\nvar Stemmer = function() {\n\n  var step2list = {\n    ational: 'ate',\n    tional: 'tion',\n    enci: 'ence',\n    anci: 'ance',\n    izer: 'ize',\n    bli: 'ble',\n    alli: 'al',\n    entli: 'ent',\n    eli: 'e',\n    ousli: 'ous',\n    ization: 'ize',\n    ation: 'ate',\n    ator: 'ate',\n    alism: 'al',\n    iveness: 'ive',\n    fulness: 'ful',\n    ousness: 'ous',\n    aliti: 'al',\n    iviti: 'ive',\n    biliti: 'ble',\n    logi: 'log'\n  };\n\n  var step3list = {\n    icate: 'ic',\n    ative: '',\n    alize: 'al',\n    iciti: 'ic',\n    ical: 'ic',\n    ful: '',\n    ness: ''\n  };\n\n  var c = \"[^aeiou]\";          // consonant\n  var v = \"[aeiouy]\";          // vowel\n  var C = c + \"[^aeiouy]*\";    // consonant sequence\n  var V = v + \"[aeiou]*\";      // vowel sequence\n\n  var mgr0 = \"^(\" + C + \")?\" + V + C;                      // [C]VC... is m>0\n  var meq1 = \"^(\" + C + \")?\" + V + C + \"(\" + V + \")?$\";    // [C]VC[V] is m=1\n  var mgr1 = \"^(\" + C + \")?\" + V + C + V + C;              // [C]VCVC... is m>1\n  var s_v   = \"^(\" + C + \")?\" + v;                         // vowel in stem\n\n  this.stemWord = function (w) {\n    var stem;\n    var suffix;\n    var firstch;\n    var origword = w;\n\n    if (w.length < 3)\n      return w;\n\n    var re;\n    var re2;\n    var re3;\n    var re4;\n\n    firstch = w.substr(0,1);\n    if (firstch == \"y\")\n      w = firstch.toUpperCase() + w.substr(1);\n\n    // Step 1a\n    re = /^(.+?)(ss|i)es$/;\n    re2 = /^(.+?)([^s])s$/;\n\n    if (re.test(w))\n      w = w.replace(re,\"$1$2\");\n    else if (re2.test(w))\n      w = w.replace(re2,\"$1$2\");\n\n    // Step 1b\n    re = /^(.+?)eed$/;\n    re2 = /^(.+?)(ed|ing)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      re = new RegExp(mgr0);\n      if (re.test(fp[1])) {\n        re = /.$/;\n        w = w.replace(re,\"\");\n      }\n    }\n    else if (re2.test(w)) {\n      var fp = re2.exec(w);\n      stem = fp[1];\n      re2 = new RegExp(s_v);\n      if (re2.test(stem)) {\n        w = stem;\n        re2 = /(at|bl|iz)$/;\n        re3 = new RegExp(\"([^aeiouylsz])\\\\1$\");\n        re4 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n        if (re2.test(w))\n          w = w + \"e\";\n        else if (re3.test(w)) {\n          re = /.$/;\n          w = w.replace(re,\"\");\n        }\n        else if (re4.test(w))\n          w = w + \"e\";\n      }\n    }\n\n    // Step 1c\n    re = /^(.+?)y$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      re = new RegExp(s_v);\n      if (re.test(stem))\n        w = stem + \"i\";\n    }\n\n    // Step 2\n    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      suffix = fp[2];\n      re = new RegExp(mgr0);\n      if (re.test(stem))\n        w = stem + step2list[suffix];\n    }\n\n    // Step 3\n    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      suffix = fp[2];\n      re = new RegExp(mgr0);\n      if (re.test(stem))\n        w = stem + step3list[suffix];\n    }\n\n    // Step 4\n    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n    re2 = /^(.+?)(s|t)(ion)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      re = new RegExp(mgr1);\n      if (re.test(stem))\n        w = stem;\n    }\n    else if (re2.test(w)) {\n      var fp = re2.exec(w);\n      stem = fp[1] + fp[2];\n      re2 = new RegExp(mgr1);\n      if (re2.test(stem))\n        w = stem;\n    }\n\n    // Step 5\n    re = /^(.+?)e$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      re = new RegExp(mgr1);\n      re2 = new RegExp(meq1);\n      re3 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))\n        w = stem;\n    }\n    re = /ll$/;\n    re2 = new RegExp(mgr1);\n    if (re.test(w) && re2.test(w)) {\n      re = /.$/;\n      w = w.replace(re,\"\");\n    }\n\n    // and turn initial Y back to y\n    if (firstch == \"y\")\n      w = firstch.toLowerCase() + w.substr(1);\n    return w;\n  }\n}\n\n\n\n\n\nvar splitChars = (function() {\n    var result = {};\n    var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,\n         1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,\n         2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,\n         2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,\n         3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,\n         3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,\n         4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,\n         8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,\n         11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,\n         43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];\n    var i, j, start, end;\n    for (i = 0; i < singles.length; i++) {\n        result[singles[i]] = true;\n    }\n    var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],\n         [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],\n         [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],\n         [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],\n         [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],\n         [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],\n         [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],\n         [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],\n         [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],\n         [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],\n         [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],\n         [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],\n         [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],\n         [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],\n         [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],\n         [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],\n         [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],\n         [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],\n         [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],\n         [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],\n         [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],\n         [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],\n         [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],\n         [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],\n         [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],\n         [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],\n         [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],\n         [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],\n         [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],\n         [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],\n         [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],\n         [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],\n         [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],\n         [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],\n         [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],\n         [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],\n         [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],\n         [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],\n         [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],\n         [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],\n         [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],\n         [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],\n         [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],\n         [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],\n         [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],\n         [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],\n         [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],\n         [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],\n         [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];\n    for (i = 0; i < ranges.length; i++) {\n        start = ranges[i][0];\n        end = ranges[i][1];\n        for (j = start; j <= end; j++) {\n            result[j] = true;\n        }\n    }\n    return result;\n})();\n\nfunction splitQuery(query) {\n    var result = [];\n    var start = -1;\n    for (var i = 0; i < query.length; i++) {\n        if (splitChars[query.charCodeAt(i)]) {\n            if (start !== -1) {\n                result.push(query.slice(start, i));\n                start = -1;\n            }\n        } else if (start === -1) {\n            start = i;\n        }\n    }\n    if (start !== -1) {\n        result.push(query.slice(start));\n    }\n    return result;\n}\n\n\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/pygments.css",
    "content": "pre { line-height: 125%; }\ntd.linenos pre { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; }\nspan.linenos { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; }\ntd.linenos pre.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\nspan.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n.highlight .hll { background-color: #ffffcc }\n.highlight { background: #eeffcc; }\n.highlight .c { color: #408090; font-style: italic } /* Comment */\n.highlight .err { border: 1px solid #FF0000 } /* Error */\n.highlight .k { color: #007020; font-weight: bold } /* Keyword */\n.highlight .o { color: #666666 } /* Operator */\n.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */\n.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */\n.highlight .cp { color: #007020 } /* Comment.Preproc */\n.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */\n.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */\n.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */\n.highlight .gd { color: #A00000 } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #FF0000 } /* Generic.Error */\n.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.highlight .gi { color: #00A000 } /* Generic.Inserted */\n.highlight .go { color: #333333 } /* Generic.Output */\n.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.highlight .gt { color: #0044DD } /* Generic.Traceback */\n.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */\n.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */\n.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */\n.highlight .kp { color: #007020 } /* Keyword.Pseudo */\n.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */\n.highlight .kt { color: #902000 } /* Keyword.Type */\n.highlight .m { color: #208050 } /* Literal.Number */\n.highlight .s { color: #4070a0 } /* Literal.String */\n.highlight .na { color: #4070a0 } /* Name.Attribute */\n.highlight .nb { color: #007020 } /* Name.Builtin */\n.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */\n.highlight .no { color: #60add5 } /* Name.Constant */\n.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */\n.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */\n.highlight .ne { color: #007020 } /* Name.Exception */\n.highlight .nf { color: #06287e } /* Name.Function */\n.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */\n.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */\n.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */\n.highlight .nv { color: #bb60d5 } /* Name.Variable */\n.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */\n.highlight .w { color: #bbbbbb } /* Text.Whitespace */\n.highlight .mb { color: #208050 } /* Literal.Number.Bin */\n.highlight .mf { color: #208050 } /* Literal.Number.Float */\n.highlight .mh { color: #208050 } /* Literal.Number.Hex */\n.highlight .mi { color: #208050 } /* Literal.Number.Integer */\n.highlight .mo { color: #208050 } /* Literal.Number.Oct */\n.highlight .sa { color: #4070a0 } /* Literal.String.Affix */\n.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */\n.highlight .sc { color: #4070a0 } /* Literal.String.Char */\n.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */\n.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */\n.highlight .s2 { color: #4070a0 } /* Literal.String.Double */\n.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */\n.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */\n.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */\n.highlight .sx { color: #c65d09 } /* Literal.String.Other */\n.highlight .sr { color: #235388 } /* Literal.String.Regex */\n.highlight .s1 { color: #4070a0 } /* Literal.String.Single */\n.highlight .ss { color: #517918 } /* Literal.String.Symbol */\n.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #06287e } /* Name.Function.Magic */\n.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */\n.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */\n.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */\n.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */\n.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/searchtools.js",
    "content": "/*\n * searchtools.js\n * ~~~~~~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for the full-text search.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\nif (!Scorer) {\n  /**\n   * Simple result scoring code.\n   */\n  var Scorer = {\n    // Implement the following function to further tweak the score for each result\n    // The function takes a result array [filename, title, anchor, descr, score]\n    // and returns the new score.\n    /*\n    score: function(result) {\n      return result[4];\n    },\n    */\n\n    // query matches the full name of an object\n    objNameMatch: 11,\n    // or matches in the last dotted part of the object name\n    objPartialMatch: 6,\n    // Additive scores depending on the priority of the object\n    objPrio: {0:  15,   // used to be importantResults\n              1:  5,   // used to be objectResults\n              2: -5},  // used to be unimportantResults\n    //  Used when the priority is not in the mapping.\n    objPrioDefault: 0,\n\n    // query found in title\n    title: 15,\n    partialTitle: 7,\n    // query found in terms\n    term: 5,\n    partialTerm: 2\n  };\n}\n\nif (!splitQuery) {\n  function splitQuery(query) {\n    return query.split(/\\s+/);\n  }\n}\n\n/**\n * Search Module\n */\nvar Search = {\n\n  _index : null,\n  _queued_query : null,\n  _pulse_status : -1,\n\n  htmlToText : function(htmlString) {\n      var virtualDocument = document.implementation.createHTMLDocument('virtual');\n      var htmlElement = $(htmlString, virtualDocument);\n      htmlElement.find('.headerlink').remove();\n      docContent = htmlElement.find('[role=main]')[0];\n      if(docContent === undefined) {\n          console.warn(\"Content block not found. Sphinx search tries to obtain it \" +\n                       \"via '[role=main]'. Could you check your theme or template.\");\n          return \"\";\n      }\n      return docContent.textContent || docContent.innerText;\n  },\n\n  init : function() {\n      var params = $.getQueryParameters();\n      if (params.q) {\n          var query = params.q[0];\n          $('input[name=\"q\"]')[0].value = query;\n          this.performSearch(query);\n      }\n  },\n\n  loadIndex : function(url) {\n    $.ajax({type: \"GET\", url: url, data: null,\n            dataType: \"script\", cache: true,\n            complete: function(jqxhr, textstatus) {\n              if (textstatus != \"success\") {\n                document.getElementById(\"searchindexloader\").src = url;\n              }\n            }});\n  },\n\n  setIndex : function(index) {\n    var q;\n    this._index = index;\n    if ((q = this._queued_query) !== null) {\n      this._queued_query = null;\n      Search.query(q);\n    }\n  },\n\n  hasIndex : function() {\n      return this._index !== null;\n  },\n\n  deferQuery : function(query) {\n      this._queued_query = query;\n  },\n\n  stopPulse : function() {\n      this._pulse_status = 0;\n  },\n\n  startPulse : function() {\n    if (this._pulse_status >= 0)\n        return;\n    function pulse() {\n      var i;\n      Search._pulse_status = (Search._pulse_status + 1) % 4;\n      var dotString = '';\n      for (i = 0; i < Search._pulse_status; i++)\n        dotString += '.';\n      Search.dots.text(dotString);\n      if (Search._pulse_status > -1)\n        window.setTimeout(pulse, 500);\n    }\n    pulse();\n  },\n\n  /**\n   * perform a search for something (or wait until index is loaded)\n   */\n  performSearch : function(query) {\n    // create the required interface elements\n    this.out = $('#search-results');\n    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);\n    this.dots = $('<span></span>').appendTo(this.title);\n    this.status = $('<p class=\"search-summary\">&nbsp;</p>').appendTo(this.out);\n    this.output = $('<ul class=\"search\"/>').appendTo(this.out);\n\n    $('#search-progress').text(_('Preparing search...'));\n    this.startPulse();\n\n    // index already loaded, the browser was quick!\n    if (this.hasIndex())\n      this.query(query);\n    else\n      this.deferQuery(query);\n  },\n\n  /**\n   * execute search (requires search index to be loaded)\n   */\n  query : function(query) {\n    var i;\n\n    // stem the searchterms and add them to the correct list\n    var stemmer = new Stemmer();\n    var searchterms = [];\n    var excluded = [];\n    var hlterms = [];\n    var tmp = splitQuery(query);\n    var objectterms = [];\n    for (i = 0; i < tmp.length; i++) {\n      if (tmp[i] !== \"\") {\n          objectterms.push(tmp[i].toLowerCase());\n      }\n\n      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === \"\") {\n        // skip this \"word\"\n        continue;\n      }\n      // stem the word\n      var word = stemmer.stemWord(tmp[i].toLowerCase());\n      // prevent stemmer from cutting word smaller than two chars\n      if(word.length < 3 && tmp[i].length >= 3) {\n        word = tmp[i];\n      }\n      var toAppend;\n      // select the correct list\n      if (word[0] == '-') {\n        toAppend = excluded;\n        word = word.substr(1);\n      }\n      else {\n        toAppend = searchterms;\n        hlterms.push(tmp[i].toLowerCase());\n      }\n      // only add if not already in the list\n      if (!$u.contains(toAppend, word))\n        toAppend.push(word);\n    }\n    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(\" \"));\n\n    // console.debug('SEARCH: searching for:');\n    // console.info('required: ', searchterms);\n    // console.info('excluded: ', excluded);\n\n    // prepare search\n    var terms = this._index.terms;\n    var titleterms = this._index.titleterms;\n\n    // array of [filename, title, anchor, descr, score]\n    var results = [];\n    $('#search-progress').empty();\n\n    // lookup as object\n    for (i = 0; i < objectterms.length; i++) {\n      var others = [].concat(objectterms.slice(0, i),\n                             objectterms.slice(i+1, objectterms.length));\n      results = results.concat(this.performObjectSearch(objectterms[i], others));\n    }\n\n    // lookup as search terms in fulltext\n    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));\n\n    // let the scorer override scores with a custom scoring function\n    if (Scorer.score) {\n      for (i = 0; i < results.length; i++)\n        results[i][4] = Scorer.score(results[i]);\n    }\n\n    // now sort the results by score (in opposite order of appearance, since the\n    // display function below uses pop() to retrieve items) and then\n    // alphabetically\n    results.sort(function(a, b) {\n      var left = a[4];\n      var right = b[4];\n      if (left > right) {\n        return 1;\n      } else if (left < right) {\n        return -1;\n      } else {\n        // same score: sort alphabetically\n        left = a[1].toLowerCase();\n        right = b[1].toLowerCase();\n        return (left > right) ? -1 : ((left < right) ? 1 : 0);\n      }\n    });\n\n    // for debugging\n    //Search.lastresults = results.slice();  // a copy\n    //console.info('search results:', Search.lastresults);\n\n    // print the results\n    var resultCount = results.length;\n    function displayNextItem() {\n      // results left, load the summary and display it\n      if (results.length) {\n        var item = results.pop();\n        var listItem = $('<li style=\"display:none\"></li>');\n        var requestUrl = \"\";\n        var linkUrl = \"\";\n        if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {\n          // dirhtml builder\n          var dirname = item[0] + '/';\n          if (dirname.match(/\\/index\\/$/)) {\n            dirname = dirname.substring(0, dirname.length-6);\n          } else if (dirname == 'index/') {\n            dirname = '';\n          }\n          requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;\n          linkUrl = requestUrl;\n\n        } else {\n          // normal html builders\n          requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;\n          linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;\n        }\n        listItem.append($('<a/>').attr('href',\n            linkUrl +\n            highlightstring + item[2]).html(item[1]));\n        if (item[3]) {\n          listItem.append($('<span> (' + item[3] + ')</span>'));\n          Search.output.append(listItem);\n          listItem.slideDown(5, function() {\n            displayNextItem();\n          });\n        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {\n          $.ajax({url: requestUrl,\n                  dataType: \"text\",\n                  complete: function(jqxhr, textstatus) {\n                    var data = jqxhr.responseText;\n                    if (data !== '' && data !== undefined) {\n                      listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));\n                    }\n                    Search.output.append(listItem);\n                    listItem.slideDown(5, function() {\n                      displayNextItem();\n                    });\n                  }});\n        } else {\n          // no source available, just display title\n          Search.output.append(listItem);\n          listItem.slideDown(5, function() {\n            displayNextItem();\n          });\n        }\n      }\n      // search finished, update title and status message\n      else {\n        Search.stopPulse();\n        Search.title.text(_('Search Results'));\n        if (!resultCount)\n          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\\'ve selected enough categories.'));\n        else\n            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));\n        Search.status.fadeIn(500);\n      }\n    }\n    displayNextItem();\n  },\n\n  /**\n   * search for object names\n   */\n  performObjectSearch : function(object, otherterms) {\n    var filenames = this._index.filenames;\n    var docnames = this._index.docnames;\n    var objects = this._index.objects;\n    var objnames = this._index.objnames;\n    var titles = this._index.titles;\n\n    var i;\n    var results = [];\n\n    for (var prefix in objects) {\n      for (var name in objects[prefix]) {\n        var fullname = (prefix ? prefix + '.' : '') + name;\n        var fullnameLower = fullname.toLowerCase()\n        if (fullnameLower.indexOf(object) > -1) {\n          var score = 0;\n          var parts = fullnameLower.split('.');\n          // check for different match types: exact matches of full name or\n          // \"last name\" (i.e. last dotted part)\n          if (fullnameLower == object || parts[parts.length - 1] == object) {\n            score += Scorer.objNameMatch;\n          // matches in last name\n          } else if (parts[parts.length - 1].indexOf(object) > -1) {\n            score += Scorer.objPartialMatch;\n          }\n          var match = objects[prefix][name];\n          var objname = objnames[match[1]][2];\n          var title = titles[match[0]];\n          // If more than one term searched for, we require other words to be\n          // found in the name/title/description\n          if (otherterms.length > 0) {\n            var haystack = (prefix + ' ' + name + ' ' +\n                            objname + ' ' + title).toLowerCase();\n            var allfound = true;\n            for (i = 0; i < otherterms.length; i++) {\n              if (haystack.indexOf(otherterms[i]) == -1) {\n                allfound = false;\n                break;\n              }\n            }\n            if (!allfound) {\n              continue;\n            }\n          }\n          var descr = objname + _(', in ') + title;\n\n          var anchor = match[3];\n          if (anchor === '')\n            anchor = fullname;\n          else if (anchor == '-')\n            anchor = objnames[match[1]][1] + '-' + fullname;\n          // add custom score for some objects according to scorer\n          if (Scorer.objPrio.hasOwnProperty(match[2])) {\n            score += Scorer.objPrio[match[2]];\n          } else {\n            score += Scorer.objPrioDefault;\n          }\n          results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);\n        }\n      }\n    }\n\n    return results;\n  },\n\n  /**\n   * search for full-text terms in the index\n   */\n  performTermsSearch : function(searchterms, excluded, terms, titleterms) {\n    var docnames = this._index.docnames;\n    var filenames = this._index.filenames;\n    var titles = this._index.titles;\n\n    var i, j, file;\n    var fileMap = {};\n    var scoreMap = {};\n    var results = [];\n\n    // perform the search on the required terms\n    for (i = 0; i < searchterms.length; i++) {\n      var word = searchterms[i];\n      var files = [];\n      var _o = [\n        {files: terms[word], score: Scorer.term},\n        {files: titleterms[word], score: Scorer.title}\n      ];\n      // add support for partial matches\n      if (word.length > 2) {\n        for (var w in terms) {\n          if (w.match(word) && !terms[word]) {\n            _o.push({files: terms[w], score: Scorer.partialTerm})\n          }\n        }\n        for (var w in titleterms) {\n          if (w.match(word) && !titleterms[word]) {\n              _o.push({files: titleterms[w], score: Scorer.partialTitle})\n          }\n        }\n      }\n\n      // no match but word was a required one\n      if ($u.every(_o, function(o){return o.files === undefined;})) {\n        break;\n      }\n      // found search word in contents\n      $u.each(_o, function(o) {\n        var _files = o.files;\n        if (_files === undefined)\n          return\n\n        if (_files.length === undefined)\n          _files = [_files];\n        files = files.concat(_files);\n\n        // set score for the word in each file to Scorer.term\n        for (j = 0; j < _files.length; j++) {\n          file = _files[j];\n          if (!(file in scoreMap))\n            scoreMap[file] = {};\n          scoreMap[file][word] = o.score;\n        }\n      });\n\n      // create the mapping\n      for (j = 0; j < files.length; j++) {\n        file = files[j];\n        if (file in fileMap && fileMap[file].indexOf(word) === -1)\n          fileMap[file].push(word);\n        else\n          fileMap[file] = [word];\n      }\n    }\n\n    // now check if the files don't contain excluded terms\n    for (file in fileMap) {\n      var valid = true;\n\n      // check if all requirements are matched\n      var filteredTermCount = // as search terms with length < 3 are discarded: ignore\n        searchterms.filter(function(term){return term.length > 2}).length\n      if (\n        fileMap[file].length != searchterms.length &&\n        fileMap[file].length != filteredTermCount\n      ) continue;\n\n      // ensure that none of the excluded terms is in the search result\n      for (i = 0; i < excluded.length; i++) {\n        if (terms[excluded[i]] == file ||\n            titleterms[excluded[i]] == file ||\n            $u.contains(terms[excluded[i]] || [], file) ||\n            $u.contains(titleterms[excluded[i]] || [], file)) {\n          valid = false;\n          break;\n        }\n      }\n\n      // if we have still a valid result we can add it to the result list\n      if (valid) {\n        // select one (max) score for the file.\n        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...\n        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));\n        results.push([docnames[file], titles[file], '', null, score, filenames[file]]);\n      }\n    }\n    return results;\n  },\n\n  /**\n   * helper function to return a node containing the\n   * search summary for a given text. keywords is a list\n   * of stemmed words, hlwords is the list of normal, unstemmed\n   * words. the first one is used to find the occurrence, the\n   * latter for highlighting it.\n   */\n  makeSearchSummary : function(htmlText, keywords, hlwords) {\n    var text = Search.htmlToText(htmlText);\n    var textLower = text.toLowerCase();\n    var start = 0;\n    $.each(keywords, function() {\n      var i = textLower.indexOf(this.toLowerCase());\n      if (i > -1)\n        start = i;\n    });\n    start = Math.max(start - 120, 0);\n    var excerpt = ((start > 0) ? '...' : '') +\n      $.trim(text.substr(start, 240)) +\n      ((start + 240 - text.length) ? '...' : '');\n    var rv = $('<div class=\"context\"></div>').text(excerpt);\n    $.each(hlwords, function() {\n      rv = rv.highlightText(this, 'highlighted');\n    });\n    return rv;\n  }\n};\n\n$(document).ready(function() {\n  Search.init();\n});\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/underscore-1.3.1.js",
    "content": "//     Underscore.js 1.3.1\n//     (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.\n//     Underscore is freely distributable under the MIT license.\n//     Portions of Underscore are inspired or borrowed from Prototype,\n//     Oliver Steele's Functional, and John Resig's Micro-Templating.\n//     For all details and documentation:\n//     http://documentcloud.github.com/underscore\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `global` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Establish the object that gets returned to break out of a loop iteration.\n  var breaker = {};\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var slice            = ArrayProto.slice,\n      unshift          = ArrayProto.unshift,\n      toString         = ObjProto.toString,\n      hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeForEach      = ArrayProto.forEach,\n    nativeMap          = ArrayProto.map,\n    nativeReduce       = ArrayProto.reduce,\n    nativeReduceRight  = ArrayProto.reduceRight,\n    nativeFilter       = ArrayProto.filter,\n    nativeEvery        = ArrayProto.every,\n    nativeSome         = ArrayProto.some,\n    nativeIndexOf      = ArrayProto.indexOf,\n    nativeLastIndexOf  = ArrayProto.lastIndexOf,\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind;\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) { return new wrapper(obj); };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object via a string identifier,\n  // for Closure Compiler \"advanced\" mode.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root['_'] = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.3.1';\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles objects with the built-in `forEach`, arrays, and raw objects.\n  // Delegates to **ECMAScript 5**'s native `forEach` if available.\n  var each = _.each = _.forEach = function(obj, iterator, context) {\n    if (obj == null) return;\n    if (nativeForEach && obj.forEach === nativeForEach) {\n      obj.forEach(iterator, context);\n    } else if (obj.length === +obj.length) {\n      for (var i = 0, l = obj.length; i < l; i++) {\n        if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;\n      }\n    } else {\n      for (var key in obj) {\n        if (_.has(obj, key)) {\n          if (iterator.call(context, obj[key], key, obj) === breaker) return;\n        }\n      }\n    }\n  };\n\n  // Return the results of applying the iterator to each element.\n  // Delegates to **ECMAScript 5**'s native `map` if available.\n  _.map = _.collect = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n    each(obj, function(value, index, list) {\n      results[results.length] = iterator.call(context, value, index, list);\n    });\n    if (obj.length === +obj.length) results.length = obj.length;\n    return results;\n  };\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.\n  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduce && obj.reduce === nativeReduce) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n    }\n    each(obj, function(value, index, list) {\n      if (!initial) {\n        memo = value;\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, value, index, list);\n      }\n    });\n    if (!initial) throw new TypeError('Reduce of empty array with no initial value');\n    return memo;\n  };\n\n  // The right-associative version of reduce, also known as `foldr`.\n  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\n  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n    }\n    var reversed = _.toArray(obj).reverse();\n    if (context && !initial) iterator = _.bind(iterator, context);\n    return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);\n  };\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, iterator, context) {\n    var result;\n    any(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) {\n        result = value;\n        return true;\n      }\n    });\n    return result;\n  };\n\n  // Return all the elements that pass a truth test.\n  // Delegates to **ECMAScript 5**'s native `filter` if available.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n    each(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    each(obj, function(value, index, list) {\n      if (!iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Delegates to **ECMAScript 5**'s native `every` if available.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, iterator, context) {\n    var result = true;\n    if (obj == null) return result;\n    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\n    each(obj, function(value, index, list) {\n      if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n    });\n    return result;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Delegates to **ECMAScript 5**'s native `some` if available.\n  // Aliased as `any`.\n  var any = _.some = _.any = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = false;\n    if (obj == null) return result;\n    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n    each(obj, function(value, index, list) {\n      if (result || (result = iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if a given value is included in the array or object using `===`.\n  // Aliased as `contains`.\n  _.include = _.contains = function(obj, target) {\n    var found = false;\n    if (obj == null) return found;\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n    found = any(obj, function(value) {\n      return value === target;\n    });\n    return found;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    return _.map(obj, function(value) {\n      return (_.isFunction(method) ? method || value : value[method]).apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, function(value){ return value[key]; });\n  };\n\n  // Return the maximum element or (element-based computation).\n  _.max = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);\n    if (!iterator && _.isEmpty(obj)) return -Infinity;\n    var result = {computed : -Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed >= result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);\n    if (!iterator && _.isEmpty(obj)) return Infinity;\n    var result = {computed : Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed < result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Shuffle an array.\n  _.shuffle = function(obj) {\n    var shuffled = [], rand;\n    each(obj, function(value, index, list) {\n      if (index == 0) {\n        shuffled[0] = value;\n      } else {\n        rand = Math.floor(Math.random() * (index + 1));\n        shuffled[index] = shuffled[rand];\n        shuffled[rand] = value;\n      }\n    });\n    return shuffled;\n  };\n\n  // Sort the object's values by a criterion produced by an iterator.\n  _.sortBy = function(obj, iterator, context) {\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value : value,\n        criteria : iterator.call(context, value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria, b = right.criteria;\n      return a < b ? -1 : a > b ? 1 : 0;\n    }), 'value');\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = function(obj, val) {\n    var result = {};\n    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };\n    each(obj, function(value, index) {\n      var key = iterator(value, index);\n      (result[key] || (result[key] = [])).push(value);\n    });\n    return result;\n  };\n\n  // Use a comparator function to figure out at what index an object should\n  // be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iterator) {\n    iterator || (iterator = _.identity);\n    var low = 0, high = array.length;\n    while (low < high) {\n      var mid = (low + high) >> 1;\n      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;\n    }\n    return low;\n  };\n\n  // Safely convert anything iterable into a real, live array.\n  _.toArray = function(iterable) {\n    if (!iterable)                return [];\n    if (iterable.toArray)         return iterable.toArray();\n    if (_.isArray(iterable))      return slice.call(iterable);\n    if (_.isArguments(iterable))  return slice.call(iterable);\n    return _.values(iterable);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    return _.toArray(obj).length;\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head`. The **guard** check allows it to work\n  // with `_.map`.\n  _.first = _.head = function(array, n, guard) {\n    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];\n  };\n\n  // Returns everything but the last entry of the array. Especcialy useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N. The **guard** check allows it to work with\n  // `_.map`.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  _.last = function(array, n, guard) {\n    if ((n != null) && !guard) {\n      return slice.call(array, Math.max(array.length - n, 0));\n    } else {\n      return array[array.length - 1];\n    }\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail`.\n  // Especially useful on the arguments object. Passing an **index** will return\n  // the rest of the values in the array from that index onward. The **guard**\n  // check allows it to work with `_.map`.\n  _.rest = _.tail = function(array, index, guard) {\n    return slice.call(array, (index == null) || guard ? 1 : index);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, function(value){ return !!value; });\n  };\n\n  // Return a completely flattened version of an array.\n  _.flatten = function(array, shallow) {\n    return _.reduce(array, function(memo, value) {\n      if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));\n      memo[memo.length] = value;\n      return memo;\n    }, []);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iterator) {\n    var initial = iterator ? _.map(array, iterator) : array;\n    var result = [];\n    _.reduce(initial, function(memo, el, i) {\n      if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {\n        memo[memo.length] = el;\n        result[result.length] = array[i];\n      }\n      return memo;\n    }, []);\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(_.flatten(arguments, true));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays. (Aliased as \"intersect\" for back-compat.)\n  _.intersection = _.intersect = function(array) {\n    var rest = slice.call(arguments, 1);\n    return _.filter(_.uniq(array), function(item) {\n      return _.every(rest, function(other) {\n        return _.indexOf(other, item) >= 0;\n      });\n    });\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = _.flatten(slice.call(arguments, 1));\n    return _.filter(array, function(value){ return !_.include(rest, value); });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    var args = slice.call(arguments);\n    var length = _.max(_.pluck(args, 'length'));\n    var results = new Array(length);\n    for (var i = 0; i < length; i++) results[i] = _.pluck(args, \"\" + i);\n    return results;\n  };\n\n  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\n  // we need this function. Return the position of the first occurrence of an\n  // item in an array, or -1 if the item is not included in the array.\n  // Delegates to **ECMAScript 5**'s native `indexOf` if available.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = function(array, item, isSorted) {\n    if (array == null) return -1;\n    var i, l;\n    if (isSorted) {\n      i = _.sortedIndex(array, item);\n      return array[i] === item ? i : -1;\n    }\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);\n    for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;\n    return -1;\n  };\n\n  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\n  _.lastIndexOf = function(array, item) {\n    if (array == null) return -1;\n    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);\n    var i = array.length;\n    while (i--) if (i in array && array[i] === item) return i;\n    return -1;\n  };\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (arguments.length <= 1) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = arguments[2] || 1;\n\n    var len = Math.max(Math.ceil((stop - start) / step), 0);\n    var idx = 0;\n    var range = new Array(len);\n\n    while(idx < len) {\n      range[idx++] = start;\n      start += step;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Reusable constructor function for prototype setting.\n  var ctor = function(){};\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Binding with arguments is also known as `curry`.\n  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.\n  // We check for `func.bind` first, to fail fast when `func` is undefined.\n  _.bind = function bind(func, context) {\n    var bound, args;\n    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError;\n    args = slice.call(arguments, 2);\n    return bound = function() {\n      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));\n      ctor.prototype = func.prototype;\n      var self = new ctor;\n      var result = func.apply(self, args.concat(slice.call(arguments)));\n      if (Object(result) === result) return result;\n      return self;\n    };\n  };\n\n  // Bind all of an object's methods to that object. Useful for ensuring that\n  // all callbacks defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var funcs = slice.call(arguments, 1);\n    if (funcs.length == 0) funcs = _.functions(obj);\n    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memo = {};\n    hasher || (hasher = _.identity);\n    return function() {\n      var key = hasher.apply(this, arguments);\n      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n    };\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){ return func.apply(func, args); }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = function(func) {\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n  };\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time.\n  _.throttle = function(func, wait) {\n    var context, args, timeout, throttling, more;\n    var whenDone = _.debounce(function(){ more = throttling = false; }, wait);\n    return function() {\n      context = this; args = arguments;\n      var later = function() {\n        timeout = null;\n        if (more) func.apply(context, args);\n        whenDone();\n      };\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (throttling) {\n        more = true;\n      } else {\n        func.apply(context, args);\n      }\n      whenDone();\n      throttling = true;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds.\n  _.debounce = function(func, wait) {\n    var timeout;\n    return function() {\n      var context = this, args = arguments;\n      var later = function() {\n        timeout = null;\n        func.apply(context, args);\n      };\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = function(func) {\n    var ran = false, memo;\n    return function() {\n      if (ran) return memo;\n      ran = true;\n      return memo = func.apply(this, arguments);\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return function() {\n      var args = [func].concat(slice.call(arguments, 0));\n      return wrapper.apply(this, args);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var funcs = arguments;\n    return function() {\n      var args = arguments;\n      for (var i = funcs.length - 1; i >= 0; i--) {\n        args = [funcs[i].apply(this, args)];\n      }\n      return args[0];\n    };\n  };\n\n  // Returns a function that will only be executed after being called N times.\n  _.after = function(times, func) {\n    if (times <= 0) return func();\n    return function() {\n      if (--times < 1) { return func.apply(this, arguments); }\n    };\n  };\n\n  // Object Functions\n  // ----------------\n\n  // Retrieve the names of an object's properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = nativeKeys || function(obj) {\n    if (obj !== Object(obj)) throw new TypeError('Invalid object');\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    return _.map(obj, _.identity);\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    });\n    return obj;\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      for (var prop in source) {\n        if (obj[prop] == null) obj[prop] = source[prop];\n      }\n    });\n    return obj;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Internal recursive comparison function.\n  function eq(a, b, stack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.\n    if (a === b) return a !== 0 || 1 / a == 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a._chain) a = a._wrapped;\n    if (b._chain) b = b._wrapped;\n    // Invoke a custom `isEqual` method if one is provided.\n    if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);\n    if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className != toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, dates, and booleans are compared by value.\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return a == String(b);\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\n        // other numeric values.\n        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a == +b;\n      // RegExps are compared by their source patterns and flags.\n      case '[object RegExp]':\n        return a.source == b.source &&\n               a.global == b.global &&\n               a.multiline == b.multiline &&\n               a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != 'object' || typeof b != 'object') return false;\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n    var length = stack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (stack[length] == a) return true;\n    }\n    // Add the first object to the stack of traversed objects.\n    stack.push(a);\n    var size = 0, result = true;\n    // Recursively compare objects and arrays.\n    if (className == '[object Array]') {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      size = a.length;\n      result = size == b.length;\n      if (result) {\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (size--) {\n          // Ensure commutative equality for sparse arrays.\n          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;\n        }\n      }\n    } else {\n      // Objects with different constructors are not equivalent.\n      if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;\n      // Deep compare objects.\n      for (var key in a) {\n        if (_.has(a, key)) {\n          // Count the expected number of properties.\n          size++;\n          // Deep compare each member.\n          if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;\n        }\n      }\n      // Ensure that both objects contain the same number of properties.\n      if (result) {\n        for (key in b) {\n          if (_.has(b, key) && !(size--)) break;\n        }\n        result = !size;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    stack.pop();\n    return result;\n  }\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b, []);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n    for (var key in obj) if (_.has(obj, key)) return false;\n    return true;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType == 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) == '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    return obj === Object(obj);\n  };\n\n  // Is a given variable an arguments object?\n  _.isArguments = function(obj) {\n    return toString.call(obj) == '[object Arguments]';\n  };\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return !!(obj && _.has(obj, 'callee'));\n    };\n  }\n\n  // Is a given value a function?\n  _.isFunction = function(obj) {\n    return toString.call(obj) == '[object Function]';\n  };\n\n  // Is a given value a string?\n  _.isString = function(obj) {\n    return toString.call(obj) == '[object String]';\n  };\n\n  // Is a given value a number?\n  _.isNumber = function(obj) {\n    return toString.call(obj) == '[object Number]';\n  };\n\n  // Is the given value `NaN`?\n  _.isNaN = function(obj) {\n    // `NaN` is the only value for which `===` is not reflexive.\n    return obj !== obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n  };\n\n  // Is a given value a date?\n  _.isDate = function(obj) {\n    return toString.call(obj) == '[object Date]';\n  };\n\n  // Is the given value a regular expression?\n  _.isRegExp = function(obj) {\n    return toString.call(obj) == '[object RegExp]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Has own property?\n  _.has = function(obj, key) {\n    return hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iterators.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Run a function **n** times.\n  _.times = function (n, iterator, context) {\n    for (var i = 0; i < n; i++) iterator.call(context, i);\n  };\n\n  // Escape a string for HTML interpolation.\n  _.escape = function(string) {\n    return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\\//g,'&#x2F;');\n  };\n\n  // Add your own custom functions to the Underscore object, ensuring that\n  // they're correctly added to the OOP wrapper as well.\n  _.mixin = function(obj) {\n    each(_.functions(obj), function(name){\n      addToWrapper(name, _[name] = obj[name]);\n    });\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = idCounter++;\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /.^/;\n\n  // Within an interpolation, evaluation, or escaping, remove HTML escaping\n  // that had been previously added.\n  var unescape = function(code) {\n    return code.replace(/\\\\\\\\/g, '\\\\').replace(/\\\\'/g, \"'\");\n  };\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  _.template = function(str, data) {\n    var c  = _.templateSettings;\n    var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +\n      'with(obj||{}){__p.push(\\'' +\n      str.replace(/\\\\/g, '\\\\\\\\')\n         .replace(/'/g, \"\\\\'\")\n         .replace(c.escape || noMatch, function(match, code) {\n           return \"',_.escape(\" + unescape(code) + \"),'\";\n         })\n         .replace(c.interpolate || noMatch, function(match, code) {\n           return \"',\" + unescape(code) + \",'\";\n         })\n         .replace(c.evaluate || noMatch, function(match, code) {\n           return \"');\" + unescape(code).replace(/[\\r\\n\\t]/g, ' ') + \";__p.push('\";\n         })\n         .replace(/\\r/g, '\\\\r')\n         .replace(/\\n/g, '\\\\n')\n         .replace(/\\t/g, '\\\\t')\n         + \"');}return __p.join('');\";\n    var func = new Function('obj', '_', tmpl);\n    if (data) return func(data, _);\n    return function(data) {\n      return func.call(this, data, _);\n    };\n  };\n\n  // Add a \"chain\" function, which will delegate to the wrapper.\n  _.chain = function(obj) {\n    return _(obj).chain();\n  };\n\n  // The OOP Wrapper\n  // ---------------\n\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n  var wrapper = function(obj) { this._wrapped = obj; };\n\n  // Expose `wrapper.prototype` as `_.prototype`\n  _.prototype = wrapper.prototype;\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(obj, chain) {\n    return chain ? _(obj).chain() : obj;\n  };\n\n  // A method to easily add functions to the OOP wrapper.\n  var addToWrapper = function(name, func) {\n    wrapper.prototype[name] = function() {\n      var args = slice.call(arguments);\n      unshift.call(args, this._wrapped);\n      return result(func.apply(_, args), this._chain);\n    };\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    wrapper.prototype[name] = function() {\n      var wrapped = this._wrapped;\n      method.apply(wrapped, arguments);\n      var length = wrapped.length;\n      if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];\n      return result(wrapped, this._chain);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    wrapper.prototype[name] = function() {\n      return result(method.apply(this._wrapped, arguments), this._chain);\n    };\n  });\n\n  // Start chaining a wrapped Underscore object.\n  wrapper.prototype.chain = function() {\n    this._chain = true;\n    return this;\n  };\n\n  // Extracts the result from a wrapped and chained object.\n  wrapper.prototype.value = function() {\n    return this._wrapped;\n  };\n\n}).call(this);\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/_static/underscore.js",
    "content": "// Underscore.js 1.3.1\n// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.\n// Underscore is freely distributable under the MIT license.\n// Portions of Underscore are inspired or borrowed from Prototype,\n// Oliver Steele's Functional, and John Resig's Micro-Templating.\n// For all details and documentation:\n// http://documentcloud.github.com/underscore\n(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case \"[object String]\":return a==String(c);case \"[object Number]\":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case \"[object Date]\":case \"[object Boolean]\":return+a==+c;case \"[object RegExp]\":return a.source==\nc.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!=\"object\"||typeof c!=\"object\")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e==\"[object Array]\"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if(\"constructor\"in a!=\"constructor\"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,\nh)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!==\"undefined\"){if(typeof module!==\"undefined\"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION=\"1.3.1\";var j=b.each=\nb.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==\nnull&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError(\"Reduce of empty array with no initial value\");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=\nfunction(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=\ne&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=\nfunction(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});\nreturn e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),\"value\")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,\nc,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=\nb.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);\nreturn e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,\"length\")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,\"\"+e);return d};b.indexOf=function(a,c,\nd){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};\nvar F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,\nc){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:\na.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};\nb.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError(\"Invalid object\");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,\n1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)==\"[object Array]\"};b.isObject=function(a){return a===Object(a)};\nb.isArguments=function(a){return l.call(a)==\"[object Arguments]\"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,\"callee\"))};b.isFunction=function(a){return l.call(a)==\"[object Function]\"};b.isString=function(a){return l.call(a)==\"[object String]\"};b.isNumber=function(a){return l.call(a)==\"[object Number]\"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)==\"[object Boolean]\"};b.isDate=function(a){return l.call(a)==\"[object Date]\"};\nb.isRegExp=function(a){return l.call(a)==\"[object RegExp]\"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(\"\"+a).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#x27;\").replace(/\\//g,\"&#x2F;\")};b.mixin=function(a){j(b.functions(a),\nfunction(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\\s\\S]+?)%>/g,interpolate:/<%=([\\s\\S]+?)%>/g,escape:/<%-([\\s\\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\\\\\/g,\"\\\\\").replace(/\\\\'/g,\"'\")};b.template=function(a,c){var d=b.templateSettings,d=\"var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('\"+a.replace(/\\\\/g,\"\\\\\\\\\").replace(/'/g,\"\\\\'\").replace(d.escape||t,function(a,b){return\"',_.escape(\"+\nu(b)+\"),'\"}).replace(d.interpolate||t,function(a,b){return\"',\"+u(b)+\",'\"}).replace(d.evaluate||t,function(a,b){return\"');\"+u(b).replace(/[\\r\\n\\t]/g,\" \")+\";__p.push('\"}).replace(/\\r/g,\"\\\\r\").replace(/\\n/g,\"\\\\n\").replace(/\\t/g,\"\\\\t\")+\"');}return __p.join('');\",e=new Function(\"obj\",\"_\",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=\nfunction(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j(\"pop,push,reverse,shift,sort,splice,unshift\".split(\",\"),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a==\"shift\"||a==\"splice\")&&e===0&&delete d[0];return v(d,this._chain)}});j([\"concat\",\"join\",\"slice\"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=\ntrue;return this};m.prototype.value=function(){return this._wrapped}}).call(this);\n"
  },
  {
    "path": "cleverhans_v3.1.0/docs/genindex.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Index &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"#\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n\n<h1 id=\"index\">Index</h1>\n\n<div class=\"genindex-jumpbox\">\n <a href=\"#A\"><strong>A</strong></a>\n | <a href=\"#B\"><strong>B</strong></a>\n | <a href=\"#C\"><strong>C</strong></a>\n | <a href=\"#D\"><strong>D</strong></a>\n | <a href=\"#E\"><strong>E</strong></a>\n | <a href=\"#F\"><strong>F</strong></a>\n | <a href=\"#G\"><strong>G</strong></a>\n | <a href=\"#H\"><strong>H</strong></a>\n | <a href=\"#L\"><strong>L</strong></a>\n | <a href=\"#M\"><strong>M</strong></a>\n | <a href=\"#N\"><strong>N</strong></a>\n | <a href=\"#O\"><strong>O</strong></a>\n | <a href=\"#P\"><strong>P</strong></a>\n | <a href=\"#R\"><strong>R</strong></a>\n | <a href=\"#S\"><strong>S</strong></a>\n | <a href=\"#V\"><strong>V</strong></a>\n | <a href=\"#W\"><strong>W</strong></a>\n | <a href=\"#X\"><strong>X</strong></a>\n \n</div>\n<h2 id=\"A\">A</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ABCMeta\">ABCMeta (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack\">Attack (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence.attack\">attack() (cleverhans.attacks.MaxConfidence method)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence.attack_class\">attack_class() (cleverhans.attacks.MaxConfidence method)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.attack_single_step\">attack_single_step() (cleverhans.attacks.FastFeatureAdversaries method)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"B\">B</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.BasicIterativeMethod\">BasicIterativeMethod (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.BoundaryAttackPlusPlus\">BoundaryAttackPlusPlus() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"C\">C</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.CallableModelWrapper\">CallableModelWrapper (class in cleverhans.attacks)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.CallableModelWrapper\">(class in cleverhans.model)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.CarliniWagnerL2\">CarliniWagnerL2 (class in cleverhans.attacks)</a>\n</li>\n      <li>\n    cleverhans.attacks\n\n      <ul>\n        <li><a href=\"source/attacks.html#module-cleverhans.attacks\">module</a>\n</li>\n      </ul></li>\n      <li>\n    cleverhans.devtools\n\n      <ul>\n        <li><a href=\"source/devtools.html#module-cleverhans.devtools\">module</a>, <a href=\"source/future.html#module-cleverhans.devtools\">[1]</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li>\n    cleverhans.model\n\n      <ul>\n        <li><a href=\"source/model.html#module-cleverhans.model\">module</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.clip_eta\">clip_eta() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.construct_graph\">construct_graph() (cleverhans.attacks.Attack method)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.construct_variables\">construct_variables() (cleverhans.attacks.Attack method)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"D\">D</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.DeepFool\">DeepFool (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.DEFAULT_DELTA\">DEFAULT_DELTA (cleverhans.attacks.SPSA attribute)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.DEFAULT_LEARNING_RATE\">DEFAULT_LEARNING_RATE (cleverhans.attacks.SPSA attribute)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.DEFAULT_SPSA_ITERS\">DEFAULT_SPSA_ITERS (cleverhans.attacks.SPSA attribute)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.DEFAULT_SPSA_SAMPLES\">DEFAULT_SPSA_SAMPLES (cleverhans.attacks.SPSA attribute)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"E\">E</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ElasticNetMethod\">ElasticNetMethod (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"F\">F</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.FastFeatureAdversaries\">FastFeatureAdversaries (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.FastGradientMethod\">FastGradientMethod (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.fgm\">fgm() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.FGM_CLASS\">FGM_CLASS (cleverhans.attacks.ProjectedGradientDescent attribute)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.CallableModelWrapper.fprop\">fprop() (cleverhans.attacks.CallableModelWrapper method)</a>\n\n      <ul>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.Model.fprop\">(cleverhans.attacks.Model method)</a>\n</li>\n        <li><a href=\"source/model.html#cleverhans.model.CallableModelWrapper.fprop\">(cleverhans.model.CallableModelWrapper method)</a>\n</li>\n        <li><a href=\"source/model.html#cleverhans.model.Model.fprop\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"G\">G</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.generate\">generate() (cleverhans.attacks.Attack method)</a>\n\n      <ul>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.CarliniWagnerL2.generate\">(cleverhans.attacks.CarliniWagnerL2 method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.DeepFool.generate\">(cleverhans.attacks.DeepFool method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.ElasticNetMethod.generate\">(cleverhans.attacks.ElasticNetMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.generate\">(cleverhans.attacks.FastFeatureAdversaries method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.FastGradientMethod.generate\">(cleverhans.attacks.FastGradientMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.generate\">(cleverhans.attacks.HopSkipJumpAttack method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.LBFGS.generate\">(cleverhans.attacks.LBFGS method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence.generate\">(cleverhans.attacks.MaxConfidence method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.MomentumIterativeMethod.generate\">(cleverhans.attacks.MomentumIterativeMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.Noise.generate\">(cleverhans.attacks.Noise method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.generate\">(cleverhans.attacks.ProjectedGradientDescent method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SaliencyMapMethod.generate\">(cleverhans.attacks.SaliencyMapMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.Semantic.generate\">(cleverhans.attacks.Semantic method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SparseL1Descent.generate\">(cleverhans.attacks.SparseL1Descent method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SpatialTransformationMethod.generate\">(cleverhans.attacks.SpatialTransformationMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.generate\">(cleverhans.attacks.SPSA method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod.generate\">(cleverhans.attacks.VirtualAdversarialMethod method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.generate_np\">generate_np() (cleverhans.attacks.Attack method)</a>\n\n      <ul>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.generate_np\">(cleverhans.attacks.HopSkipJumpAttack method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.generate_np\">(cleverhans.attacks.SPSA method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_layer\">get_layer() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_layer\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_layer_names\">get_layer_names() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_layer_names\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_logits\">get_logits() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_logits\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.get_or_guess_labels\">get_or_guess_labels() (cleverhans.attacks.Attack method)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_params\">get_params() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_params\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_predicted_class\">get_predicted_class() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_predicted_class\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_probs\">get_probs() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_probs\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"H\">H</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.HopSkipJumpAttack\">HopSkipJumpAttack (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"L\">L</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.LBFGS\">LBFGS (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"M\">M</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MadryEtAl\">MadryEtAl (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.make_input_placeholder\">make_input_placeholder() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.make_input_placeholder\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.make_label_placeholder\">make_label_placeholder() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.make_label_placeholder\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.make_params\">make_params() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.make_params\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence\">MaxConfidence (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model\">Model (class in cleverhans.attacks)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model\">(class in cleverhans.model)</a>\n</li>\n      </ul></li>\n      <li>\n    module\n\n      <ul>\n        <li><a href=\"source/attacks.html#module-cleverhans.attacks\">cleverhans.attacks</a>\n</li>\n        <li><a href=\"source/devtools.html#module-cleverhans.devtools\">cleverhans.devtools</a>, <a href=\"source/future.html#module-cleverhans.devtools\">[1]</a>\n</li>\n        <li><a href=\"source/model.html#module-cleverhans.model\">cleverhans.model</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MomentumIterativeMethod\">MomentumIterativeMethod (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"N\">N</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Noise\">Noise (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/model.html#cleverhans.model.NoSuchLayerError\">NoSuchLayerError</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"O\">O</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.O_FEATURES\">O_FEATURES (cleverhans.attacks.Model attribute)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.O_FEATURES\">(cleverhans.model.Model attribute)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.O_LOGITS\">O_LOGITS (cleverhans.attacks.Model attribute)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.O_LOGITS\">(cleverhans.model.Model attribute)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.O_PROBS\">O_PROBS (cleverhans.attacks.Model attribute)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.O_PROBS\">(cleverhans.model.Model attribute)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.optimize_linear\">optimize_linear() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"P\">P</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.parse_params\">parse_params() (cleverhans.attacks.Attack method)</a>\n\n      <ul>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.CarliniWagnerL2.parse_params\">(cleverhans.attacks.CarliniWagnerL2 method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.DeepFool.parse_params\">(cleverhans.attacks.DeepFool method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.ElasticNetMethod.parse_params\">(cleverhans.attacks.ElasticNetMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.parse_params\">(cleverhans.attacks.FastFeatureAdversaries method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.FastGradientMethod.parse_params\">(cleverhans.attacks.FastGradientMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.parse_params\">(cleverhans.attacks.HopSkipJumpAttack method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.LBFGS.parse_params\">(cleverhans.attacks.LBFGS method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence.parse_params\">(cleverhans.attacks.MaxConfidence method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.MomentumIterativeMethod.parse_params\">(cleverhans.attacks.MomentumIterativeMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.Noise.parse_params\">(cleverhans.attacks.Noise method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.parse_params\">(cleverhans.attacks.ProjectedGradientDescent method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SaliencyMapMethod.parse_params\">(cleverhans.attacks.SaliencyMapMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SparseL1Descent.parse_params\">(cleverhans.attacks.SparseL1Descent method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SpatialTransformationMethod.parse_params\">(cleverhans.attacks.SpatialTransformationMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod.parse_params\">(cleverhans.attacks.VirtualAdversarialMethod method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.projected_optimization\">projected_optimization() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ProjectedGradientDescent\">ProjectedGradientDescent (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"R\">R</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.reduce_max\">reduce_max() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.reduce_mean\">reduce_mean() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.reduce_sum\">reduce_sum() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ABCMeta.register\">register() (cleverhans.attacks.ABCMeta method)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"S\">S</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SaliencyMapMethod\">SaliencyMapMethod (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Semantic\">Semantic (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.softmax_cross_entropy_with_logits\">softmax_cross_entropy_with_logits() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SparseL1Descent\">SparseL1Descent (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SpatialTransformationMethod\">SpatialTransformationMethod (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA\">SPSA (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"V\">V</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.vatm\">vatm() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod\">VirtualAdversarialMethod (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"W\">W</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.wrapper_warning\">wrapper_warning() (in module cleverhans.attacks)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.wrapper_warning\">(in module cleverhans.model)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.wrapper_warning_logits\">wrapper_warning_logits() (in module cleverhans.attacks)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.wrapper_warning_logits\">(in module cleverhans.model)</a>\n</li>\n      </ul></li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"X\">X</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.xrange\">xrange (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/index.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>CleverHans Documentation &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" />\n    <link rel=\"next\" title=\"attacks module\" href=\"source/attacks.html\" />\n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"cleverhans-documentation\">\n<h1>CleverHans Documentation<a class=\"headerlink\" href=\"#cleverhans-documentation\" title=\"Permalink to this headline\">¶</a></h1>\n<p>This documentation is auto-generated from the docstrings of modules of the current <cite>master</cite> branch of <a class=\"reference external\" href=\"http://github.com/cleverhans-lab/cleverhans/\">cleverhans</a>.</p>\n<p>To get started, we recommend reading the <a class=\"reference external\" href=\"https://github.com/cleverhans-lab/cleverhans#setting-up-cleverhans\">github readme</a>. Afterwards, you can learn more by looking at the following modules:</p>\n<div class=\"toctree-wrapper compound\">\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n</div>\n</div>\n<div class=\"section\" id=\"indices-and-tables\">\n<h1>Indices and tables<a class=\"headerlink\" href=\"#indices-and-tables\" title=\"Permalink to this headline\">¶</a></h1>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"genindex.html\"><span class=\"std std-ref\">Index</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"py-modindex.html\"><span class=\"std std-ref\">Module Index</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"search.html\"><span class=\"std std-ref\">Search Page</span></a></p></li>\n</ul>\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"#\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"#\">Documentation overview</a><ul>\n      <li>Next: <a href=\"source/attacks.html\" title=\"next chapter\"><cite>attacks</cite> module</a></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/py-modindex.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Python Module Index &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" />\n\n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n\n   <h1>Python Module Index</h1>\n\n   <div class=\"modindex-jumpbox\">\n   <a href=\"#cap-c\"><strong>c</strong></a>\n   </div>\n\n   <table class=\"indextable modindextable\">\n     <tr class=\"pcap\"><td></td><td>&#160;</td><td></td></tr>\n     <tr class=\"cap\" id=\"cap-c\"><td></td><td>\n       <strong>c</strong></td><td></td></tr>\n     <tr>\n       <td><img src=\"_static/minus.png\" class=\"toggler\"\n              id=\"toggle-1\" style=\"display: none\" alt=\"-\" /></td>\n       <td>\n       <code class=\"xref\">cleverhans</code></td><td>\n       <em></em></td></tr>\n     <tr class=\"cg-1\">\n       <td></td>\n       <td>&#160;&#160;&#160;\n       <a href=\"source/attacks.html#module-cleverhans.attacks\"><code class=\"xref\">cleverhans.attacks</code></a></td><td>\n       <em></em></td></tr>\n     <tr class=\"cg-1\">\n       <td></td>\n       <td>&#160;&#160;&#160;\n       <a href=\"source/future.html#module-cleverhans.devtools\"><code class=\"xref\">cleverhans.devtools</code></a></td><td>\n       <em></em></td></tr>\n     <tr class=\"cg-1\">\n       <td></td>\n       <td>&#160;&#160;&#160;\n       <a href=\"source/model.html#module-cleverhans.model\"><code class=\"xref\">cleverhans.model</code></a></td><td>\n       <em></em></td></tr>\n   </table>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/search.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Search &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    \n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/searchtools.js\"></script>\n    <script src=\"_static/language_data.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"#\" />\n  <script src=\"searchindex.js\" defer></script>\n  \n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1 id=\"search-documentation\">Search</h1>\n  <div id=\"fallback\" class=\"admonition warning\">\n  <script>$('#fallback').hide();</script>\n  <p>\n    Please activate JavaScript to enable the search\n    functionality.\n  </p>\n  </div>\n  <p>\n    Searching for multiple words only shows matches that contain\n    all words.\n  </p>\n  <form action=\"\" method=\"get\">\n    <input type=\"text\" name=\"q\" aria-labelledby=\"search-documentation\" value=\"\" />\n    <input type=\"submit\" value=\"search\" />\n    <span id=\"search-progress\" style=\"padding-left: 10px\"></span>\n  </form>\n  \n  <div id=\"search-results\">\n  \n  </div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/searchindex.js",
    "content": "Search.setIndex({docnames:[\"README\",\"index\",\"source/attacks\",\"source/devtools\",\"source/future\",\"source/model\"],envversion:{\"sphinx.domains.c\":2,\"sphinx.domains.changeset\":1,\"sphinx.domains.citation\":1,\"sphinx.domains.cpp\":3,\"sphinx.domains.index\":1,\"sphinx.domains.javascript\":2,\"sphinx.domains.math\":2,\"sphinx.domains.python\":2,\"sphinx.domains.rst\":2,\"sphinx.domains.std\":1,\"sphinx.ext.viewcode\":1,sphinx:56},filenames:[\"README.md\",\"index.md\",\"source/attacks.md\",\"source/devtools.md\",\"source/future.md\",\"source/model.md\"],objects:{\"cleverhans.attacks\":{ABCMeta:[2,1,1,\"\"],Attack:[2,1,1,\"\"],BasicIterativeMethod:[2,1,1,\"\"],BoundaryAttackPlusPlus:[2,3,1,\"\"],CallableModelWrapper:[2,1,1,\"\"],CarliniWagnerL2:[2,1,1,\"\"],DeepFool:[2,1,1,\"\"],ElasticNetMethod:[2,1,1,\"\"],FastFeatureAdversaries:[2,1,1,\"\"],FastGradientMethod:[2,1,1,\"\"],HopSkipJumpAttack:[2,1,1,\"\"],LBFGS:[2,1,1,\"\"],MadryEtAl:[2,1,1,\"\"],MaxConfidence:[2,1,1,\"\"],Model:[2,1,1,\"\"],MomentumIterativeMethod:[2,1,1,\"\"],Noise:[2,1,1,\"\"],ProjectedGradientDescent:[2,1,1,\"\"],SPSA:[2,1,1,\"\"],SaliencyMapMethod:[2,1,1,\"\"],Semantic:[2,1,1,\"\"],SparseL1Descent:[2,1,1,\"\"],SpatialTransformationMethod:[2,1,1,\"\"],VirtualAdversarialMethod:[2,1,1,\"\"],clip_eta:[2,3,1,\"\"],fgm:[2,3,1,\"\"],optimize_linear:[2,3,1,\"\"],projected_optimization:[2,3,1,\"\"],reduce_max:[2,3,1,\"\"],reduce_mean:[2,3,1,\"\"],reduce_sum:[2,3,1,\"\"],softmax_cross_entropy_with_logits:[2,3,1,\"\"],vatm:[2,3,1,\"\"],wrapper_warning:[2,3,1,\"\"],wrapper_warning_logits:[2,3,1,\"\"],xrange:[2,4,1,\"\"]},\"cleverhans.attacks.ABCMeta\":{register:[2,2,1,\"\"]},\"cleverhans.attacks.Attack\":{construct_graph:[2,2,1,\"\"],construct_variables:[2,2,1,\"\"],generate:[2,2,1,\"\"],generate_np:[2,2,1,\"\"],get_or_guess_labels:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.CallableModelWrapper\":{fprop:[2,2,1,\"\"]},\"cleverhans.attacks.CarliniWagnerL2\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.DeepFool\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.ElasticNetMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.FastFeatureAdversaries\":{attack_single_step:[2,2,1,\"\"],generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.FastGradientMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.HopSkipJumpAttack\":{generate:[2,2,1,\"\"],generate_np:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.LBFGS\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.MaxConfidence\":{attack:[2,2,1,\"\"],attack_class:[2,2,1,\"\"],generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.Model\":{O_FEATURES:[2,4,1,\"\"],O_LOGITS:[2,4,1,\"\"],O_PROBS:[2,4,1,\"\"],fprop:[2,2,1,\"\"],get_layer:[2,2,1,\"\"],get_layer_names:[2,2,1,\"\"],get_logits:[2,2,1,\"\"],get_params:[2,2,1,\"\"],get_predicted_class:[2,2,1,\"\"],get_probs:[2,2,1,\"\"],make_input_placeholder:[2,2,1,\"\"],make_label_placeholder:[2,2,1,\"\"],make_params:[2,2,1,\"\"]},\"cleverhans.attacks.MomentumIterativeMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.Noise\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.ProjectedGradientDescent\":{FGM_CLASS:[2,4,1,\"\"],generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.SPSA\":{DEFAULT_DELTA:[2,4,1,\"\"],DEFAULT_LEARNING_RATE:[2,4,1,\"\"],DEFAULT_SPSA_ITERS:[2,4,1,\"\"],DEFAULT_SPSA_SAMPLES:[2,4,1,\"\"],generate:[2,2,1,\"\"],generate_np:[2,2,1,\"\"]},\"cleverhans.attacks.SaliencyMapMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.Semantic\":{generate:[2,2,1,\"\"]},\"cleverhans.attacks.SparseL1Descent\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.SpatialTransformationMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.VirtualAdversarialMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.model\":{CallableModelWrapper:[5,1,1,\"\"],Model:[5,1,1,\"\"],NoSuchLayerError:[5,5,1,\"\"],wrapper_warning:[5,3,1,\"\"],wrapper_warning_logits:[5,3,1,\"\"]},\"cleverhans.model.CallableModelWrapper\":{fprop:[5,2,1,\"\"]},\"cleverhans.model.Model\":{O_FEATURES:[5,4,1,\"\"],O_LOGITS:[5,4,1,\"\"],O_PROBS:[5,4,1,\"\"],fprop:[5,2,1,\"\"],get_layer:[5,2,1,\"\"],get_layer_names:[5,2,1,\"\"],get_logits:[5,2,1,\"\"],get_params:[5,2,1,\"\"],get_predicted_class:[5,2,1,\"\"],get_probs:[5,2,1,\"\"],make_input_placeholder:[5,2,1,\"\"],make_label_placeholder:[5,2,1,\"\"],make_params:[5,2,1,\"\"]},cleverhans:{attacks:[2,0,0,\"-\"],devtools:[4,0,0,\"-\"],model:[5,0,0,\"-\"]}},objnames:{\"0\":[\"py\",\"module\",\"Python module\"],\"1\":[\"py\",\"class\",\"Python class\"],\"2\":[\"py\",\"method\",\"Python method\"],\"3\":[\"py\",\"function\",\"Python function\"],\"4\":[\"py\",\"attribute\",\"Python attribute\"],\"5\":[\"py\",\"exception\",\"Python exception\"]},objtypes:{\"0\":\"py:module\",\"1\":\"py:class\",\"2\":\"py:method\",\"3\":\"py:function\",\"4\":\"py:attribute\",\"5\":\"py:exception\"},terms:{\"001\":2,\"00420\":2,\"005\":2,\"00677\":2,\"01236\":2,\"02144\":2,\"02533\":2,\"04114\":2,\"04599\":2,\"04644\":2,\"05122\":2,\"05666\":2,\"06081\":2,\"06083\":2,\"06857\":2,\"07528\":2,\"100\":2,\"1000\":2,\"10000\":2,\"128\":2,\"13000\":2,\"1312\":2,\"1412\":2,\"1507\":2,\"1511\":2,\"1607\":2,\"1608\":2,\"1611\":2,\"1703\":2,\"1706\":2,\"1709\":2,\"1710\":2,\"1802\":2,\"1904\":2,\"2014\":2,\"2016\":2,\"2017\":2,\"2018\":2,\"2019\":2,\"6199\":2,\"6572\":2,\"abstract\":[2,5],\"boolean\":2,\"case\":2,\"class\":[2,5],\"default\":[2,5],\"final\":[2,5],\"float\":2,\"function\":[2,5],\"import\":[0,2],\"int\":2,\"new\":2,\"public\":2,\"return\":[2,5],\"static\":0,\"super\":2,\"true\":[2,5],\"try\":2,For:2,The:[0,2,5],Use:2,Used:[2,5],Using:[2,5],_build:0,_project_perturb:2,abc:2,abcmeta:2,abl:0,abort:2,abort_earli:2,abs:2,acceler:2,access:[2,5],accident:2,accord:2,act:2,action:2,actual:[2,5],adam:2,add:0,addit:2,adversari:2,after:[2,5],afterward:1,against:2,aim:2,algorithm:2,alia:2,all:[0,2,5],allow:2,alon:2,along:2,alreadi:2,also:[2,5],angl:2,angle_max:2,angle_min:2,angular2html:0,ani:[2,5],appli:2,approach:2,approxim:2,arg:2,arg_typ:2,argmax_:2,argument:2,around:2,arrai:2,arxiv:2,assert:2,assign:2,assum:2,attack:[0,1,5],attack_class:2,attack_single_step:2,attain:2,attribut:2,auto:1,autodoc:0,automag:[2,5],automat:[2,5],avoid:2,axi:2,back:2,ball:2,base:[0,2,5],base_attack:2,basic:2,basiciterativemethod:2,batch:2,batch_siz:2,becaus:[2,5],been:[2,5],befor:2,being:2,below:2,beta:2,better:2,between:2,binari:2,binary_search_step:2,black:2,black_border_s:2,boneh:2,bool:2,border:2,bounc:2,bound:2,boundari:2,boundaryattackplusplu:2,box:2,branch:[0,1],build:0,built:2,bundl:2,cach:2,calcul:2,call:[2,5],callabl:[2,5],callable_fn:[2,5],callablemodelwrapp:[2,5],can:[0,1,2,5],cannot:0,carlini:2,carliniwagnerl2:2,center:2,chang:[2,5],check:[2,5],chen:2,child:2,choic:[0,2],choos:[0,2],chosen:2,classif:2,classifi:2,cleverhan:[0,2,5],click:0,clip:2,clip_eta:2,clip_grad:2,clip_max:2,clip_min:2,clockwis:2,code:[2,5],combin:2,come:2,compar:2,competit:2,complement:2,compon:2,compos:2,comput:[2,5],computation:2,concept:2,concret:2,confid:2,configur:2,consid:2,consist:2,constant:2,constraint:2,construct:2,construct_graph:2,construct_vari:2,constructor:[2,5],contain:2,content:[2,5],context:[2,5],control:2,conveni:0,converg:2,convolut:2,coordin:2,copi:0,core:[2,5],correct:2,cost:2,counter:2,cover:2,craft:2,creat:[0,2,5],criterion:2,cross:[2,5],current:[1,2],danger:[2,5],data:2,debug:2,decai:2,decay_factor:2,decis:2,decision_rul:2,decor:2,decreas:2,deepfool:2,default_delta:2,default_learning_r:2,default_rand_init:2,default_spsa_it:2,default_spsa_sampl:2,defens:2,defin:[2,5],delta:2,depend:[2,5],deprec:[2,5],descend:2,descent:2,describ:2,design:2,desir:2,detail:2,detect:[2,5],devic:[2,5],dict:[2,5],dictionari:[2,5],differ:[0,2],differenti:2,dim:2,dimens:2,direct:2,directli:[2,5],directori:0,discret:2,distanc:2,distort:2,doc:0,docsourc:0,docstr:1,document:[0,2],doe:[2,5],domain:2,done:2,dong:2,dot:2,down:0,dramat:2,drop:0,dtype:2,dtypestr:2,dure:2,dx_max:2,dx_min:2,dy_max:2,dy_min:2,each:2,earli:2,early_stop_loss_threshold:2,effect:2,effici:2,either:2,elast:2,elasticnetmethod:2,element:2,enabl:[0,2],encod:2,end:2,enforc:2,entropi:[2,5],environ:0,eps:2,eps_it:2,epsilon:2,estim:2,eta:2,evalu:2,even:[2,5],everi:2,exampl:[2,5],except:[0,5],exist:5,expens:2,explain:2,expos:[2,5],express:2,extend:2,extra:[2,5],factor:2,fail:[0,2],failur:2,fals:[2,5],fast:2,fast_gradient_method:2,faster:2,fastfeatureadversari:2,fastgradientmethod:2,featur:[2,5],fed:[2,5],feedabl:2,few:2,fewer:2,fgm:2,fgm_class:2,file:0,find:2,finit:2,first:[0,2],fix:2,float32:2,folder:0,follow:[0,1,2],forum:2,forward:[2,5],found:2,fprop:[2,5],free:2,from:[0,1,2,5],full:2,g_feat:2,gamma:2,gener:[0,1,2],generate_np:2,geometr:2,geometric_progress:2,get:[0,1,2],get_lay:[2,5],get_layer_nam:[2,5],get_logit:[2,5],get_or_guess_label:2,get_param:[2,5],get_predicted_class:[2,5],get_prob:[2,5],github:[0,1],give:2,given:2,good:2,goodfellow:2,grad:2,grad_spars:2,gradient:[2,5],graph:2,greatli:2,grid:2,grid_search:2,guarante:2,guid:2,h1g0pia9tq:2,hack:0,half:2,handl:2,hard:2,has:[2,5],hash_kei:2,have:[0,2,5],help:2,helper:2,here:2,hidden:[2,5],high:2,higher:2,hold:2,hood:[2,5],hopskipjumpattack:2,hot:2,how:2,hparam:[2,5],html:0,http:2,hurt:2,hyperparamet:2,idea:2,identifi:2,ignor:2,imag:2,image_target:2,imagenet:2,implement:[2,5],importantli:2,improv:2,incept:[2,5],includ:2,incorrect:[2,5],increas:2,index:[0,1,2],indic:0,inf:2,infer:2,infin:2,info:2,initi:2,initial_const:2,initial_num_ev:2,input:[2,5],input_imag:2,insert:2,instal:0,instead:2,intend:2,intention:2,interfac:[2,5],intern:2,interv:2,introduc:2,invok:[2,5],is_debug:2,is_target:2,issu:[2,5],issubclass:2,iter:2,itself:2,jacobian:2,jekyl:0,jordan:2,just:[2,5],keep:[0,2],kei:2,kera:[2,5],keras_tensor:0,keyword:2,known:2,kurakin:2,kwarg:[2,5],label:[2,5],larg:2,larger:2,largest:2,later:[2,5],layer:[2,5],lbfg:2,leak:2,learn:[1,2],learning_r:2,least:2,leav:2,length:2,less:2,level:2,librari:0,like:2,linear:2,linf:2,link:2,list:[0,2,5],local:[0,2],log:0,logit:[2,5],look:1,loop:2,loss:[2,5],loss_fn:2,lower:2,made:2,madri:2,madryet:2,mai:[2,5],make:[0,2,5],make_input_placehold:[2,5],make_label_placehold:[2,5],make_param:[2,5],makefil:0,manag:[2,5],mani:2,map:[2,5],mask:[2,5],master:[0,1],max_it:2,max_iter:2,max_num_ev:2,max_val:2,maxconfid:2,maximum:2,mean:[2,5],measur:2,memori:2,metaclass:2,method:[2,5],mimic:2,minim:2,minimum:2,misclassif:2,mix:2,miyato:2,model:[1,2],moder:2,modifi:2,modul:[0,1],momentum:2,momentumiterativemethod:2,more:[1,2],most:2,move:[0,2],mro:2,much:2,multipl:[2,5],must:2,n_angl:2,n_dx:2,n_dy:2,n_sampl:2,name:[0,2,5],namespac:2,nb_candid:2,nb_class:[2,5],nb_iter:2,need:[2,5],needs_dummy_fprop:[2,5],neg:2,negat:2,neither:2,net:2,network:[2,5],neural:[2,5],nip:2,nois:2,nojekyl:0,non:2,none:[2,5],nor:2,norm:2,normal:2,nosuchlayererror:5,note:[0,2,5],num_iter:2,num_step:2,number:2,numer:2,numpi:2,o_featur:[2,5],o_logit:[2,5],o_prob:[2,5],object:[2,5],off:2,often:2,one:2,onli:2,openreview:2,oper:2,optim:2,optimal_perturb:2,optimize_linear:2,option:[0,2,5],ord:2,order:2,org:[0,2],orient:2,origin:2,other:2,otherwis:[0,2],our:[0,2],out:2,outperform:2,output:[0,2,5],output_lay:[2,5],over:2,overriden:2,overshoot:2,own:2,packag:[2,5],page:[0,1],paper:2,papernot:2,param:[2,5],paramet:[2,5],pars:2,parse_param:2,part:[2,5],particularli:2,pass:[2,5],pdf:2,percent:2,percentag:2,percentil:2,perform:2,perturb:2,pick:2,pip:0,pixel:2,place:[2,5],placehold:[2,5],pleas:0,point:2,posit:2,possibl:2,pre:[2,5],predict:[2,5],prepar:0,prevent:2,preview:0,previou:2,print:2,prob:[2,5],probabl:[2,5],procedur:2,process:2,produc:[2,5],progress:2,project:2,project_perturb:2,projected_gradient_desc:2,projected_optim:2,projectedgradientdesc:2,propag:[2,5],properti:2,propos:2,provid:[2,5],publish:0,purturb:2,put:[2,5],py_func:2,queri:2,radiu:2,rais:[0,5],rand_init:2,rand_init_ep:2,rand_minmax:2,random:2,rang:2,rate:2,rather:2,ratio:2,reach:2,read:[1,2],readm:1,realiz:[2,5],reason:2,recip:2,recommend:[1,2],reduce_max:2,reduce_mean:2,reduce_sum:2,refer:[2,5],region:2,regist:2,reject:2,rel:2,relat:5,remov:[2,5],repo:0,repositori:0,repres:[2,5],represent:[2,5],request:5,requir:2,reshap:[2,5],resolut:2,respect:[2,5],result:[2,5],retain:2,robust:2,root:0,rotat:2,run:[0,2],runtim:2,sabour:2,salienc:2,saliencymapmethod:2,same:[2,5],sampl:2,saniti:2,sanity_check:2,save:2,scalar:2,scale:2,scope:[2,5],scroll:0,search:[1,2],section:0,see:[0,2,5],seed:2,select:2,self:[2,5],semant:2,sentinel:2,separ:0,serv:0,sess:2,session:2,set:[0,2,5],sever:[2,5],shape:2,should:[2,5],show:2,side:2,sign:2,signatur:2,silent:[2,5],similar:2,simpl:2,simplifi:[2,5],simultan:2,singl:[2,5],site:0,size:2,slower:2,smaller:2,smooth:2,softmax:[2,5],softmax_cross_entropy_with_logit:2,softmax_cross_entropy_with_logits_v2:2,solv:2,some:2,soon:2,sourc:[0,2,5],space:2,spars:2,sparsel1desc:2,sparsiti:2,spatial:2,spatialtransformationmethod:2,special:2,specif:[0,2,5],specifi:2,speed:2,sphinx:0,spsa:[0,2],spsa_it:2,spsa_sampl:2,sqrt:2,start:[1,2],steepest:2,step:2,stepsiz:2,stepsize_search:2,still:[0,2,5],stop:2,store:2,str:[2,5],strang:2,stronger:2,strongli:2,structur:2,stuck:2,sub:2,subclass:2,success:2,suppli:[2,5],sure:0,symbol:[2,5],symbolic_impl:2,tab:0,take:2,target:2,target_i:2,tensor:[2,5],tensoradam:2,tensorflow:2,tensorflow_addon:0,tensoroptim:2,term:2,termin:2,test:2,tfa:0,than:2,thei:[2,5],them:[0,2,5],therefor:2,theta:2,thi:[0,1,2,5],those:2,three:2,threshold:2,through:2,thu:[0,2],time:[2,5],too:2,total:2,trade:2,tradeoff:2,train:2,tramer:2,transfer:2,transform:2,translat:2,treat:[2,5],tri:2,tricki:2,true_i:2,tune:2,turn:[2,5],type:2,typic:2,uesato:2,unabl:2,uncom:0,under:[0,2,5],underli:2,uniformli:2,uniqu:2,unit:2,univers:2,unless:2,unnorm:2,unrel:2,untarget:2,until:2,updat:2,usag:2,use:[2,5],used:2,useful:2,user:[0,2,5],uses:2,using:[0,2],valid:[2,5],valu:[2,5],valueerror:5,vanish:2,variabl:[2,5],variant:2,variat:2,vastli:2,vatm:2,vector:2,verbos:2,version:2,via:2,virtual:[0,2],virtualadversarialmethod:2,virutalen:0,wagner:2,wai:[2,5],wainwright:2,want:0,warn:[0,2,5],weak:2,websit:0,were:2,when:[0,2,5],where:[0,2],whether:[0,2,5],which:2,while_loop:2,white:2,without:2,won:2,work:2,wors:[2,5],would:[2,5],wrap:[2,5],wrapper:[2,5],wrapper_warn:[2,5],wrapper_warning_logit:[2,5],write:2,x_t:2,x_val:2,xrang:2,y_target:2,yield:2,you:[0,1,2],your:[0,2]},titles:[\"&lt;no title&gt;\",\"CleverHans Documentation\",\"<cite>attacks</cite> module\",\"<cite>devtools</cite> module\",\"<cite>future</cite> module\",\"<cite>model</cite> module\"],titleterms:{attack:2,cleverhan:1,devtool:3,document:1,futur:4,indic:1,model:5,modul:[2,3,4,5],tabl:1}})"
  },
  {
    "path": "cleverhans_v3.1.0/docs/source/attacks.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>attacks module &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n    <link rel=\"next\" title=\"model module\" href=\"model.html\" />\n    <link rel=\"prev\" title=\"CleverHans Documentation\" href=\"../index.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"module-cleverhans.attacks\">\n<span id=\"attacks-module\"></span><h1><cite>attacks</cite> module<a class=\"headerlink\" href=\"#module-cleverhans.attacks\" title=\"Permalink to this headline\">¶</a></h1>\n<p>The Attack class, providing a universal abstract interface describing attacks, and many implementations of it.</p>\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.ABCMeta\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">ABCMeta</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">name</span></em>, <em class=\"sig-param\"><span class=\"n\">bases</span></em>, <em class=\"sig-param\"><span class=\"n\">namespace</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/abc.html#ABCMeta\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ABCMeta\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">type</span></code></p>\n<p>Metaclass for defining Abstract Base Classes (ABCs).</p>\n<p>Use this metaclass to create an ABC.  An ABC can be subclassed\ndirectly, and then acts as a mix-in class.  You can also register\nunrelated concrete classes (even built-in classes) and unrelated\nABCs as ‘virtual subclasses’ – these and their descendants will\nbe considered subclasses of the registering ABC by the built-in\nissubclass() function, but the registering ABC won’t show up in\ntheir MRO (Method Resolution Order) nor will method\nimplementations defined by the registering ABC be callable (not\neven via super()).</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ABCMeta.register\">\n<code class=\"sig-name descname\">register</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">subclass</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/abc.html#ABCMeta.register\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ABCMeta.register\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Register a virtual subclass of an ABC.</p>\n<p>Returns the subclass, to allow usage as a class decorator.</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.Attack\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">Attack</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">object</span></code></p>\n<p>Abstract base class for all attack classes.</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.construct_graph\">\n<code class=\"sig-name descname\">construct_graph</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">fixed</span></em>, <em class=\"sig-param\"><span class=\"n\">feedable</span></em>, <em class=\"sig-param\"><span class=\"n\">x_val</span></em>, <em class=\"sig-param\"><span class=\"n\">hash_key</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.construct_graph\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.construct_graph\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Construct the graph required to run the attack through generate_np.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>fixed</strong> – Structural elements that require defining a new graph.</p></li>\n<li><p><strong>feedable</strong> – Arguments that can be fed to the same graph when\nthey take different values.</p></li>\n<li><p><strong>x_val</strong> – symbolic adversarial example</p></li>\n<li><p><strong>hash_key</strong> – the key used to store this graph in our cache</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.construct_variables\">\n<code class=\"sig-name descname\">construct_variables</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.construct_variables\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.construct_variables\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Construct the inputs to the attack graph to be used by generate_np.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>kwargs</strong> – Keyword arguments to generate_np.</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>Structural arguments\nFeedable arguments\nOutput of <cite>arg_type</cite> describing feedable arguments\nA unique key</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate the attack’s symbolic graph for adversarial examples. This\nmethod should be overriden in any child class that implements an\nattack that is expressable symbolically. Otherwise, it will wrap the\nnumerical implementation as a symbolic operator.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>**kwargs</strong> – <p>optional parameters used by child classes.\nEach child class defines additional parameters as needed.\nChild classes that use the following concepts should use the following\nnames:</p>\n<blockquote>\n<div><p>clip_min: minimum feature value\nclip_max: maximum feature value\neps: size of norm constraint on adversarial perturbation\nord: order of norm constraint\nnb_iter: number of iterations\neps_iter: size of norm constraint on iteration\ny_target: if specified, the attack is targeted.\ny: Do not specify if y_target is specified.</p>\n<blockquote>\n<div><p>If specified, the attack is untargeted, aims to make the output\nclass not be y.\nIf neither y_target nor y is specified, y is inferred by having\nthe model classify the input.</p>\n</div></blockquote>\n</div></blockquote>\n<p>For other concepts, it’s generally a good idea to read other classes\nand check for name consistency.</p>\n</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation of the adversarial examples.</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.generate_np\">\n<code class=\"sig-name descname\">generate_np</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x_val</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.generate_np\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.generate_np\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate adversarial examples and return them as a NumPy array.\nSub-classes <em>should not</em> implement this method unless they must\nperform special handling of arguments.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x_val</strong> – A NumPy array with the original inputs.</p></li>\n<li><p><strong>**kwargs</strong> – <p>optional parameters used by child classes.</p>\n</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A NumPy array holding the adversarial examples.</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.get_or_guess_labels\">\n<code class=\"sig-name descname\">get_or_guess_labels</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.get_or_guess_labels\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.get_or_guess_labels\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Get the label to use in generating an adversarial example for x.\nThe kwargs are fed directly from the kwargs of the attack.\nIf ‘y’ is in kwargs, then assume it’s an untargeted attack and\nuse that as the label.\nIf ‘y_target’ is in kwargs and is not none, then assume it’s a\ntargeted attack and use that as the label.\nOtherwise, use the model’s prediction as the label and perform an\nuntargeted attack.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">params</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>params</strong> – a dictionary of attack-specific parameters</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>True when parsing was successful</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.BasicIterativeMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">BasicIterativeMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/basic_iterative_method.html#BasicIterativeMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.BasicIterativeMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.projected_gradient_descent.ProjectedGradientDescent</span></code></p>\n<p>The BasicIterativeMethod attack.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.BoundaryAttackPlusPlus\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">BoundaryAttackPlusPlus</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#BoundaryAttackPlusPlus\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.BoundaryAttackPlusPlus\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>A previous name used for HopSkipJumpAttack.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.CallableModelWrapper\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">CallableModelWrapper</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">callable_fn</span></em>, <em class=\"sig-param\"><span class=\"n\">output_layer</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#CallableModelWrapper\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CallableModelWrapper\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <a class=\"reference internal\" href=\"model.html#cleverhans.model.Model\" title=\"cleverhans.model.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.model.Model</span></code></a></p>\n<p>A wrapper that turns a callable into a valid Model</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.CallableModelWrapper.fprop\">\n<code class=\"sig-name descname\">fprop</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#CallableModelWrapper.fprop\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CallableModelWrapper.fprop\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Forward propagation to compute the model outputs.\n:param x: A symbolic representation of the network input\n:return: A dictionary mapping layer names to the symbolic</p>\n<blockquote>\n<div><p>representation of their output.</p>\n</div></blockquote>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.CarliniWagnerL2\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">CarliniWagnerL2</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/carlini_wagner_l2.html#CarliniWagnerL2\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CarliniWagnerL2\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This attack was originally proposed by Carlini and Wagner. It is an\niterative attack that finds adversarial examples on many defenses that\nare robust to other attacks.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1608.04644\">https://arxiv.org/abs/1608.04644</a></p>\n<p>At a high level, this attack is an iterative attack using Adam and\na specially-chosen loss function to find adversarial examples with\nlower distortion than other attacks. This comes at the cost of speed,\nas this attack is often much slower than others.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.CarliniWagnerL2.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/carlini_wagner_l2.html#CarliniWagnerL2.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CarliniWagnerL2.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a tensor that constructs adversarial examples for the given\ninput. Generate uses tf.py_func in order to operate over tensors.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – A tensor with the inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.CarliniWagnerL2.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">confidence</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"default_value\">0.005</span></em>, <em class=\"sig-param\"><span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"default_value\">5</span></em>, <em class=\"sig-param\"><span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"default_value\">1000</span></em>, <em class=\"sig-param\"><span class=\"n\">abort_early</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/carlini_wagner_l2.html#CarliniWagnerL2.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CarliniWagnerL2.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>y</strong> – (optional) A tensor with the true labels for an untargeted\nattack. If None (and y_target is None) then use the\noriginal labels the classifier assigns.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the target labels for a\ntargeted attack.</p></li>\n<li><p><strong>confidence</strong> – Confidence of adversarial examples: higher produces\nexamples with larger l2 distortion, but more\nstrongly classified as adversarial.</p></li>\n<li><p><strong>batch_size</strong> – Number of attacks to run simultaneously.</p></li>\n<li><p><strong>learning_rate</strong> – The learning rate for the attack algorithm.\nSmaller values produce better results but are\nslower to converge.</p></li>\n<li><p><strong>binary_search_steps</strong> – The number of times we perform binary\nsearch to find the optimal tradeoff-\nconstant between norm of the purturbation\nand confidence of the classification.</p></li>\n<li><p><strong>max_iterations</strong> – The maximum number of iterations. Setting this\nto a larger value will produce lower distortion\nresults. Using only a few iterations requires\na larger learning rate, and will produce larger\ndistortion results.</p></li>\n<li><p><strong>abort_early</strong> – If true, allows early aborts if gradient descent\nis unable to make progress (i.e., gets stuck in\na local minimum).</p></li>\n<li><p><strong>initial_const</strong> – The initial tradeoff-constant to use to tune the\nrelative importance of size of the perturbation\nand confidence of classification.\nIf binary_search_steps is large, the initial\nconstant is not important. A smaller value of\nthis constant gives lower distortion results.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.DeepFool\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">DeepFool</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/deep_fool.html#DeepFool\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.DeepFool\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>DeepFool is an untargeted &amp; iterative attack which is based on an\niterative linearization of the classifier. The implementation here\nis w.r.t. the L2 norm.\nPaper link: “<a class=\"reference external\" href=\"https://arxiv.org/pdf/1511.04599.pdf\">https://arxiv.org/pdf/1511.04599.pdf</a>”</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.DeepFool.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/deep_fool.html#DeepFool.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.DeepFool.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.DeepFool.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">nb_candidate</span><span class=\"o\">=</span><span class=\"default_value\">10</span></em>, <em class=\"sig-param\"><span class=\"n\">overshoot</span><span class=\"o\">=</span><span class=\"default_value\">0.02</span></em>, <em class=\"sig-param\"><span class=\"n\">max_iter</span><span class=\"o\">=</span><span class=\"default_value\">50</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0.0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/deep_fool.html#DeepFool.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.DeepFool.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>nb_candidate</strong> – The number of classes to test against, i.e.,\ndeepfool only consider nb_candidate classes when\nattacking(thus accelerate speed). The nb_candidate\nclasses are chosen according to the prediction\nconfidence during implementation.</p></li>\n<li><p><strong>overshoot</strong> – A termination criterion to prevent vanishing updates</p></li>\n<li><p><strong>max_iter</strong> – Maximum number of iteration for deepfool</p></li>\n<li><p><strong>clip_min</strong> – Minimum component value for clipping</p></li>\n<li><p><strong>clip_max</strong> – Maximum component value for clipping</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.ElasticNetMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">ElasticNetMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/elastic_net_method.html#ElasticNetMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ElasticNetMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This attack features L1-oriented adversarial examples and includes\nthe C&amp;W L2 attack as a special case (when beta is set to 0).\nAdversarial examples attain similar performance to those\ngenerated by the C&amp;W L2 attack in the white-box case,\nand more importantly, have improved transferability properties\nand complement adversarial training.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1709.04114\">https://arxiv.org/abs/1709.04114</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ElasticNetMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/elastic_net_method.html#ElasticNetMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ElasticNetMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a tensor that constructs adversarial examples for the given\ninput. Generate uses tf.py_func in order to operate over tensors.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – (required) A tensor with the inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ElasticNetMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">beta</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">decision_rule</span><span class=\"o\">=</span><span class=\"default_value\">'EN'</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">confidence</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"default_value\">9</span></em>, <em class=\"sig-param\"><span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"default_value\">1000</span></em>, <em class=\"sig-param\"><span class=\"n\">abort_early</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\"><span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"default_value\">0.001</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/elastic_net_method.html#ElasticNetMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ElasticNetMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>y</strong> – (optional) A tensor with the true labels for an untargeted\nattack. If None (and y_target is None) then use the\noriginal labels the classifier assigns.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the target labels for a\ntargeted attack.</p></li>\n<li><p><strong>beta</strong> – Trades off L2 distortion with L1 distortion: higher\nproduces examples with lower L1 distortion, at the\ncost of higher L2 (and typically Linf) distortion</p></li>\n<li><p><strong>decision_rule</strong> – EN or L1. Select final adversarial example from\nall successful examples based on the least\nelastic-net or L1 distortion criterion.</p></li>\n<li><p><strong>confidence</strong> – Confidence of adversarial examples: higher produces\nexamples with larger l2 distortion, but more\nstrongly classified as adversarial.</p></li>\n<li><p><strong>batch_size</strong> – Number of attacks to run simultaneously.</p></li>\n<li><p><strong>learning_rate</strong> – The learning rate for the attack algorithm.\nSmaller values produce better results but are\nslower to converge.</p></li>\n<li><p><strong>binary_search_steps</strong> – The number of times we perform binary\nsearch to find the optimal tradeoff-\nconstant between norm of the perturbation\nand confidence of the classification. Set\n‘initial_const’ to a large value and fix\nthis param to 1 for speed.</p></li>\n<li><p><strong>max_iterations</strong> – The maximum number of iterations. Setting this\nto a larger value will produce lower distortion\nresults. Using only a few iterations requires\na larger learning rate, and will produce larger\ndistortion results.</p></li>\n<li><p><strong>abort_early</strong> – If true, allows early abort when the total\nloss starts to increase (greatly speeds up attack,\nbut hurts performance, particularly on ImageNet)</p></li>\n<li><p><strong>initial_const</strong> – The initial tradeoff-constant to use to tune the\nrelative importance of size of the perturbation\nand confidence of classification.\nIf binary_search_steps is large, the initial\nconstant is not important. A smaller value of\nthis constant gives lower distortion results.\nFor computational efficiency, fix\nbinary_search_steps to 1 and set this param\nto a large value.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.FastFeatureAdversaries\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">FastFeatureAdversaries</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_feature_adversaries.html#FastFeatureAdversaries\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastFeatureAdversaries\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This is a fast implementation of “Feature Adversaries”, an attack\nagainst a target internal representation of a model.\n“Feature adversaries” were originally introduced in (Sabour et al. 2016),\nwhere the optimization was done using LBFGS.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1511.05122\">https://arxiv.org/abs/1511.05122</a></p>\n<p>This implementation is similar to “Basic Iterative Method”\n(Kurakin et al. 2016) but applied to the internal representations.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastFeatureAdversaries.attack_single_step\">\n<code class=\"sig-name descname\">attack_single_step</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">eta</span></em>, <em class=\"sig-param\"><span class=\"n\">g_feat</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_feature_adversaries.html#FastFeatureAdversaries.attack_single_step\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastFeatureAdversaries.attack_single_step\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>TensorFlow implementation of the Fast Feature Gradient. This is a\nsingle step attack similar to Fast Gradient Method that attacks an\ninternal representation.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – the input placeholder</p></li>\n<li><p><strong>eta</strong> – A tensor the same shape as x that holds the perturbation.</p></li>\n<li><p><strong>g_feat</strong> – model’s internal tensor for guide</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>a tensor for the adversarial example</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastFeatureAdversaries.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">g</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_feature_adversaries.html#FastFeatureAdversaries.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastFeatureAdversaries.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>g</strong> – The target value of the symbolic representation</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastFeatureAdversaries.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">layer</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">0.3</span></em>, <em class=\"sig-param\"><span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"default_value\">0.05</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">10</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span><span class=\"o\">=</span><span class=\"default_value\">inf</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_feature_adversaries.html#FastFeatureAdversaries.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastFeatureAdversaries.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>layer</strong> – (required str) name of the layer to target.</p></li>\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>eps_iter</strong> – (optional float) step size for each attack iteration</p></li>\n<li><p><strong>nb_iter</strong> – (optional int) Number of attack iterations.</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics Numpy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.FastGradientMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">FastGradientMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#FastGradientMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastGradientMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This attack was originally implemented by Goodfellow et al. (2014) with the\ninfinity norm (and is known as the “Fast Gradient Sign Method”). This\nimplementation extends the attack to other norms, and is therefore called\nthe Fast Gradient Method.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1412.6572\">https://arxiv.org/abs/1412.6572</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastGradientMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#FastGradientMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastGradientMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Returns the graph for Fast Gradient Method adversarial examples.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastGradientMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\">eps=0.3</em>, <em class=\"sig-param\">ord=inf</em>, <em class=\"sig-param\">loss_fn=&lt;function softmax_cross_entropy_with_logits&gt;</em>, <em class=\"sig-param\">y=None</em>, <em class=\"sig-param\">y_target=None</em>, <em class=\"sig-param\">clip_min=None</em>, <em class=\"sig-param\">clip_max=None</em>, <em class=\"sig-param\">clip_grad=False</em>, <em class=\"sig-param\">sanity_checks=True</em>, <em class=\"sig-param\">**kwargs</em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#FastGradientMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastGradientMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) attack step size (input variation)</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics NumPy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>loss_fn</strong> – Loss function that takes (labels, logits) as arguments and returns loss</p></li>\n<li><p><strong>y</strong> – (optional) A tensor with the true labels. Only provide\nthis parameter if you’d like to use true labels when crafting\nadversarial samples. Otherwise, model predictions are used as\nlabels to avoid the “label leaking” effect (explained in this\npaper: <a class=\"reference external\" href=\"https://arxiv.org/abs/1611.01236\">https://arxiv.org/abs/1611.01236</a>). Default is None.\nLabels should be one-hot-encoded.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the labels to target. Leave\ny_target=None if y is also set. Labels should be\none-hot-encoded.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n<li><p><strong>clip_grad</strong> – (optional bool) Ignore gradient components\nat positions where the input is already at the boundary\nof the domain, and the update step will get clipped out.</p></li>\n<li><p><strong>sanity_checks</strong> – bool, if True, include asserts\n(Turn them off to use less runtime / memory or for unit tests that\nintentionally pass strange input)</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.HopSkipJumpAttack\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">HopSkipJumpAttack</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#HopSkipJumpAttack\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.HopSkipJumpAttack\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright.\nIt is a decision-based attack that requires access to output\nlabels of a model alone.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1904.02144\">https://arxiv.org/abs/1904.02144</a>\nAt a high level, this attack is an iterative attack composed of three\nsteps: Binary search to approach the boundary; gradient estimation;\nstepsize search. HopSkipJumpAttack requires fewer model queries than\nBoundary Attack which was based on rejective sampling.\n:param model: cleverhans.model.Model\n:param sess: tf.Session\n:param dtypestr: dtype of the data\n:param kwargs: passed through to super constructor.\nsee parse_params for details.</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.HopSkipJumpAttack.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#HopSkipJumpAttack.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.HopSkipJumpAttack.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a tensor that constructs adversarial examples for the given\ninput. Generate uses tf.py_func in order to operate over tensors.\n:param x: A tensor with the inputs.\n:param kwargs: See <cite>parse_params</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.HopSkipJumpAttack.generate_np\">\n<code class=\"sig-name descname\">generate_np</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#HopSkipJumpAttack.generate_np\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.HopSkipJumpAttack.generate_np\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate adversarial images in a for loop.\n:param y: An array of shape (n, nb_classes) for true labels.\n:param y_target:  An array of shape (n, nb_classes) for target labels.\nRequired for targeted attack.\n:param image_target: An array of shape (n, <a href=\"#id5\"><span class=\"problematic\" id=\"id6\">**</span></a>image shape) for initial\ntarget images. Required for targeted attack.</p>\n<p>See parse_params for other kwargs.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.HopSkipJumpAttack.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">image_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">initial_num_evals</span><span class=\"o\">=</span><span class=\"default_value\">100</span></em>, <em class=\"sig-param\"><span class=\"n\">max_num_evals</span><span class=\"o\">=</span><span class=\"default_value\">10000</span></em>, <em class=\"sig-param\"><span class=\"n\">stepsize_search</span><span class=\"o\">=</span><span class=\"default_value\">'geometric_progression'</span></em>, <em class=\"sig-param\"><span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"default_value\">64</span></em>, <em class=\"sig-param\"><span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">constraint</span><span class=\"o\">=</span><span class=\"default_value\">'l2'</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">128</span></em>, <em class=\"sig-param\"><span class=\"n\">verbose</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#HopSkipJumpAttack.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.HopSkipJumpAttack.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>y</strong> – A tensor of shape (1, nb_classes) for true labels.</p></li>\n<li><p><strong>y_target</strong> – A tensor of shape (1, nb_classes) for target labels.</p></li>\n</ul>\n</dd>\n</dl>\n<p>Required for targeted attack.\n:param image_target: A tensor of shape (1, <a href=\"#id7\"><span class=\"problematic\" id=\"id8\">**</span></a>image shape) for initial\ntarget images. Required for targeted attack.\n:param initial_num_evals: initial number of evaluations for</p>\n<blockquote>\n<div><p>gradient estimation.</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>max_num_evals</strong> – maximum number of evaluations for gradient estimation.</p></li>\n<li><p><strong>stepsize_search</strong> – <p>How to search for stepsize; choices are\n‘geometric_progression’, ‘grid_search’.\n‘geometric progression’ initializes the stepsize</p>\n<blockquote>\n<div><p>by ||x_t - x||_p / sqrt(iteration), and keep\ndecreasing by half until reaching the target\nside of the boundary. ‘grid_search’ chooses the\noptimal epsilon over a grid, in the scale of\n||x_t - x||_p.</p>\n</div></blockquote>\n</p></li>\n<li><p><strong>num_iterations</strong> – The number of iterations.</p></li>\n<li><p><strong>gamma</strong> – The binary search threshold theta is gamma / d^{3/2} for\nl2 attack and gamma / d^2 for linf attack.</p></li>\n<li><p><strong>constraint</strong> – The distance to optimize; choices are ‘l2’, ‘linf’.</p></li>\n<li><p><strong>batch_size</strong> – batch_size for model prediction.</p></li>\n<li><p><strong>verbose</strong> – (boolean) Whether distance at each step is printed.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.LBFGS\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">LBFGS</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/lbfgs.html#LBFGS\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.LBFGS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>LBFGS is the first adversarial attack for convolutional neural networks,\nand is a target &amp; iterative attack.\nPaper link: “<a class=\"reference external\" href=\"https://arxiv.org/pdf/1312.6199.pdf\">https://arxiv.org/pdf/1312.6199.pdf</a>”\n:param model: cleverhans.model.Model\n:param sess: tf.Session\n:param dtypestr: dtype of the data\n:param kwargs: passed through to super constructor</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.LBFGS.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/lbfgs.html#LBFGS.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.LBFGS.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a tensor that constructs adversarial examples for the given\ninput. Generate uses tf.py_func in order to operate over tensors.\n:param x: (required) A tensor with the inputs.\n:param kwargs: See <cite>parse_params</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.LBFGS.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"default_value\">5</span></em>, <em class=\"sig-param\"><span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"default_value\">1000</span></em>, <em class=\"sig-param\"><span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/lbfgs.html#LBFGS.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.LBFGS.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>y_target</strong> – (optional) A tensor with the one-hot target labels.</p></li>\n<li><p><strong>batch_size</strong> – The number of inputs to include in a batch and\nprocess simultaneously.</p></li>\n<li><p><strong>binary_search_steps</strong> – The number of times we perform binary\nsearch to find the optimal tradeoff-\nconstant between norm of the purturbation\nand cross-entropy loss of classification.</p></li>\n<li><p><strong>max_iterations</strong> – The maximum number of iterations.</p></li>\n<li><p><strong>initial_const</strong> – The initial tradeoff-constant to use to tune the\nrelative importance of size of the perturbation\nand cross-entropy loss of the classification.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.MadryEtAl\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">MadryEtAl</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/madry_et_al.html#MadryEtAl\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MadryEtAl\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.projected_gradient_descent.ProjectedGradientDescent</span></code></p>\n<p>The attack from Madry et al 2017</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.MaxConfidence\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">MaxConfidence</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">base_attacker</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>The MaxConfidence attack.</p>\n<p>An attack designed for use against models that use confidence thresholding\nas a defense.\nIf the underlying optimizer is optimal, this attack procedure gives the\noptimal failure rate for every confidence threshold t &gt; 0.5.</p>\n<p>Publication: <a class=\"reference external\" href=\"https://openreview.net/forum?id=H1g0piA9tQ\">https://openreview.net/forum?id=H1g0piA9tQ</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.session.Session</p></li>\n<li><p><strong>base_attacker</strong> – cleverhans.attacks.Attack</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MaxConfidence.attack\">\n<code class=\"sig-name descname\">attack</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">true_y</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence.attack\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence.attack\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Runs the untargeted attack.\n:param x: The input\n:param true_y: The correct label for <cite>x</cite>. This attack aims to produce misclassification.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MaxConfidence.attack_class\">\n<code class=\"sig-name descname\">attack_class</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">target_y</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence.attack_class\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence.attack_class\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Run the attack on a specific target class.\n:param x: tf Tensor. The input example.\n:param target_y: tf Tensor. The attacker’s desired target class.\nReturns:</p>\n<blockquote>\n<div><p>A targeted adversarial example, intended to be classified as the target class.</p>\n</div></blockquote>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MaxConfidence.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – Keyword arguments for the base attacker</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MaxConfidence.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"default_value\">10</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>params</strong> – a dictionary of attack-specific parameters</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>True when parsing was successful</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.Model\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">Model</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">hparams</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">needs_dummy_fprop</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">object</span></code></p>\n<p>An abstract interface for model wrappers that exposes model symbols\nneeded for making an attack. This abstraction removes the dependency on\nany specific neural network package (e.g. Keras) from the core\ncode of CleverHans. It can also simplify exposing the hidden features of a\nmodel when a specific package does not directly expose them.</p>\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.Model.O_FEATURES\">\n<code class=\"sig-name descname\">O_FEATURES</code><em class=\"property\"> = 'features'</em><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.O_FEATURES\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.Model.O_LOGITS\">\n<code class=\"sig-name descname\">O_LOGITS</code><em class=\"property\"> = 'logits'</em><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.O_LOGITS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.Model.O_PROBS\">\n<code class=\"sig-name descname\">O_PROBS</code><em class=\"property\"> = 'probs'</em><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.O_PROBS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.fprop\">\n<code class=\"sig-name descname\">fprop</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.fprop\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.fprop\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Forward propagation to compute the model outputs.\n:param x: A symbolic representation of the network input\n:return: A dictionary mapping layer names to the symbolic</p>\n<blockquote>\n<div><p>representation of their output.</p>\n</div></blockquote>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_layer\">\n<code class=\"sig-name descname\">get_layer</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">layer</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_layer\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_layer\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a layer output.\n:param x: tensor, the input to the network.\n:param layer: str, the name of the layer to compute.\n:param <a href=\"#id9\"><span class=\"problematic\" id=\"id10\">**</span></a>kwargs: dict, extra optional params to pass to self.fprop.\n:return: the content of layer <cite>layer</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_layer_names\">\n<code class=\"sig-name descname\">get_layer_names</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_layer_names\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_layer_names\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return the list of exposed layers for this model.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_logits\">\n<code class=\"sig-name descname\">get_logits</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the output logits</p>\n</dd>\n</dl>\n<p>(i.e., the values fed as inputs to the softmax layer).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_params\">\n<code class=\"sig-name descname\">get_params</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Provides access to the model’s parameters.\n:return: A list of all Variables defining the model parameters.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_predicted_class\">\n<code class=\"sig-name descname\">get_predicted_class</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_predicted_class\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_predicted_class\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the predicted label</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_probs\">\n<code class=\"sig-name descname\">get_probs</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_probs\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_probs\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the output</p>\n</dd>\n</dl>\n<p>probabilities (i.e., the output values produced by the softmax layer).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.make_input_placeholder\">\n<code class=\"sig-name descname\">make_input_placeholder</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_input_placeholder\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.make_input_placeholder\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create and return a placeholder representing an input to the model.</p>\n<p>This method should respect context managers (e.g. “with tf.device”)\nand should not just return a reference to a single pre-created\nplaceholder.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.make_label_placeholder\">\n<code class=\"sig-name descname\">make_label_placeholder</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_label_placeholder\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.make_label_placeholder\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create and return a placeholder representing class labels.</p>\n<p>This method should respect context managers (e.g. “with tf.device”)\nand should not just return a reference to a single pre-created\nplaceholder.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.make_params\">\n<code class=\"sig-name descname\">make_params</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.make_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create all Variables to be returned later by get_params.\nBy default this is a no-op.\nModels that need their fprop to be called for their params to be\ncreated can set <cite>needs_dummy_fprop=True</cite> in the constructor.</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.MomentumIterativeMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">MomentumIterativeMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/momentum_iterative_method.html#MomentumIterativeMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MomentumIterativeMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>The Momentum Iterative Method (Dong et al. 2017). This method won\nthe first places in NIPS 2017 Non-targeted Adversarial Attacks and\nTargeted Adversarial Attacks. The original paper used hard labels\nfor this attack; no label smoothing.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/pdf/1710.06081.pdf\">https://arxiv.org/pdf/1710.06081.pdf</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MomentumIterativeMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/momentum_iterative_method.html#MomentumIterativeMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MomentumIterativeMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – Keyword arguments. See <cite>parse_params</cite> for documentation.</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MomentumIterativeMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">0.3</span></em>, <em class=\"sig-param\"><span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"default_value\">0.06</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">10</span></em>, <em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span><span class=\"o\">=</span><span class=\"default_value\">inf</span></em>, <em class=\"sig-param\"><span class=\"n\">decay_factor</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/momentum_iterative_method.html#MomentumIterativeMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MomentumIterativeMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>eps_iter</strong> – (optional float) step size for each attack iteration</p></li>\n<li><p><strong>nb_iter</strong> – (optional int) Number of attack iterations.</p></li>\n<li><p><strong>y</strong> – (optional) A tensor with the true labels.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the labels to target. Leave\ny_target=None if y is also set. Labels should be\none-hot-encoded.</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics Numpy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>decay_factor</strong> – (optional) Decay factor for the momentum term.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.Noise\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">Noise</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/noise.html#Noise\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Noise\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>A weak attack that just picks a random point in the attacker’s action space.\nWhen combined with an attack bundling function, this can be used to implement\nrandom search.</p>\n<p>References:\n<a class=\"reference external\" href=\"https://arxiv.org/abs/1802.00420\">https://arxiv.org/abs/1802.00420</a> recommends random search to help identify</p>\n<blockquote>\n<div><p>gradient masking.</p>\n</div></blockquote>\n<dl class=\"simple\">\n<dt><a class=\"reference external\" href=\"https://openreview.net/forum?id=H1g0piA9tQ\">https://openreview.net/forum?id=H1g0piA9tQ</a> recommends using noise as part</dt><dd><p>of an attack bundling recipe combining many different optimizers to yield\na stronger optimizer.</p>\n</dd>\n</dl>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Noise.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/noise.html#Noise.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Noise.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Noise.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">0.3</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span><span class=\"o\">=</span><span class=\"default_value\">inf</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/noise.html#Noise.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Noise.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics Numpy).\nPossible values: np.inf</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.ProjectedGradientDescent\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">ProjectedGradientDescent</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"n\">default_rand_init</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/projected_gradient_descent.html#ProjectedGradientDescent\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ProjectedGradientDescent\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This class implements either the Basic Iterative Method\n(Kurakin et al. 2016) when rand_init is set to 0. or the\nMadry et al. (2017) method when rand_minmax is larger than 0.\nPaper link (Kurakin et al. 2016): <a class=\"reference external\" href=\"https://arxiv.org/pdf/1607.02533.pdf\">https://arxiv.org/pdf/1607.02533.pdf</a>\nPaper link (Madry et al. 2017): <a class=\"reference external\" href=\"https://arxiv.org/pdf/1706.06083.pdf\">https://arxiv.org/pdf/1706.06083.pdf</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>default_rand_init</strong> – whether to use random initialization by default</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.ProjectedGradientDescent.FGM_CLASS\">\n<code class=\"sig-name descname\">FGM_CLASS</code><a class=\"headerlink\" href=\"#cleverhans.attacks.ProjectedGradientDescent.FGM_CLASS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>alias of <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.fast_gradient_method.FastGradientMethod</span></code></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ProjectedGradientDescent.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/projected_gradient_descent.html#ProjectedGradientDescent.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ProjectedGradientDescent.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ProjectedGradientDescent.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\">eps=0.3</em>, <em class=\"sig-param\">eps_iter=0.05</em>, <em class=\"sig-param\">nb_iter=10</em>, <em class=\"sig-param\">y=None</em>, <em class=\"sig-param\">ord=inf</em>, <em class=\"sig-param\">loss_fn=&lt;function softmax_cross_entropy_with_logits&gt;</em>, <em class=\"sig-param\">clip_min=None</em>, <em class=\"sig-param\">clip_max=None</em>, <em class=\"sig-param\">y_target=None</em>, <em class=\"sig-param\">rand_init=None</em>, <em class=\"sig-param\">rand_init_eps=None</em>, <em class=\"sig-param\">clip_grad=False</em>, <em class=\"sig-param\">sanity_checks=True</em>, <em class=\"sig-param\">**kwargs</em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/projected_gradient_descent.html#ProjectedGradientDescent.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ProjectedGradientDescent.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>eps_iter</strong> – (optional float) step size for each attack iteration</p></li>\n<li><p><strong>nb_iter</strong> – (optional int) Number of attack iterations.</p></li>\n<li><p><strong>y</strong> – (optional) A tensor with the true labels.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the labels to target. Leave\ny_target=None if y is also set. Labels should be\none-hot-encoded.</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics Numpy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>loss_fn</strong> – Loss function that takes (labels, logits) as arguments and returns loss</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n<li><p><strong>rand_init</strong> – (optional) Start the gradient descent from a point chosen\nuniformly at random in the norm ball of radius\nrand_init_eps</p></li>\n<li><p><strong>rand_init_eps</strong> – (optional float) size of the norm ball from which\nthe initial starting point is chosen. Defaults to eps</p></li>\n<li><p><strong>clip_grad</strong> – (optional bool) Ignore gradient components at positions\nwhere the input is already at the boundary of the domain,\nand the update step will get clipped out.</p></li>\n<li><p><strong>sanity_checks</strong> – <p>bool Insert tf asserts checking values\n(Some tests need to run with no sanity checks because the</p>\n<blockquote>\n<div><p>tests intentionally configure the attack strangely)</p>\n</div></blockquote>\n</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.SPSA\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">SPSA</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spsa.html#SPSA\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This implements the SPSA adversary, as in <a class=\"reference external\" href=\"https://arxiv.org/abs/1802.05666\">https://arxiv.org/abs/1802.05666</a>\n(Uesato et al. 2018). SPSA is a gradient-free optimization method, which\nis useful when the model is non-differentiable, or more generally, the\ngradients do not point in useful directions.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.SPSA.DEFAULT_DELTA\">\n<code class=\"sig-name descname\">DEFAULT_DELTA</code><em class=\"property\"> = 0.01</em><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.DEFAULT_DELTA\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.SPSA.DEFAULT_LEARNING_RATE\">\n<code class=\"sig-name descname\">DEFAULT_LEARNING_RATE</code><em class=\"property\"> = 0.01</em><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.DEFAULT_LEARNING_RATE\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.SPSA.DEFAULT_SPSA_ITERS\">\n<code class=\"sig-name descname\">DEFAULT_SPSA_ITERS</code><em class=\"property\"> = 1</em><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.DEFAULT_SPSA_ITERS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.SPSA.DEFAULT_SPSA_SAMPLES\">\n<code class=\"sig-name descname\">DEFAULT_SPSA_SAMPLES</code><em class=\"property\"> = 128</em><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.DEFAULT_SPSA_SAMPLES\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SPSA.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">is_targeted</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">early_stop_loss_threshold</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">delta</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">spsa_samples</span><span class=\"o\">=</span><span class=\"default_value\">128</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">spsa_iters</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">is_debug</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\"><span class=\"n\">epsilon</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">num_steps</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spsa.html#SPSA.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs. Must be a batch of size 1.</p></li>\n<li><p><strong>y</strong> – A Tensor or None. The index of the correct label.</p></li>\n<li><p><strong>y_target</strong> – A Tensor or None. The index of the target label in a\ntargeted attack.</p></li>\n<li><p><strong>eps</strong> – The size of the maximum perturbation, measured in the\nL-infinity norm.</p></li>\n<li><p><strong>clip_min</strong> – If specified, the minimum input value</p></li>\n<li><p><strong>clip_max</strong> – If specified, the maximum input value</p></li>\n<li><p><strong>nb_iter</strong> – The number of optimization steps.</p></li>\n<li><p><strong>early_stop_loss_threshold</strong> – A float or None. If specified, the\nattack will end as soon as the loss\nis below <cite>early_stop_loss_threshold</cite>.</p></li>\n<li><p><strong>learning_rate</strong> – Learning rate of ADAM optimizer.</p></li>\n<li><p><strong>delta</strong> – Perturbation size used for SPSA approximation.</p></li>\n<li><p><strong>spsa_samples</strong> – Number of inputs to evaluate at a single time.\nThe true batch size (the number of evaluated\ninputs for each update) is <cite>spsa_samples *\nspsa_iters</cite></p></li>\n<li><p><strong>batch_size</strong> – Deprecated param that is an alias for spsa_samples</p></li>\n<li><p><strong>spsa_iters</strong> – Number of model evaluations before performing an\nupdate, where each evaluation is on <cite>spsa_samples</cite>\ndifferent inputs.</p></li>\n<li><p><strong>is_debug</strong> – If True, print the adversarial loss after each update.</p></li>\n<li><p><strong>epsilon</strong> – Deprecated alias for <cite>eps</cite></p></li>\n<li><p><strong>num_steps</strong> – Deprecated alias for <cite>nb_iter</cite>.</p></li>\n<li><p><strong>is_targeted</strong> – Deprecated argument. Ignored.</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SPSA.generate_np\">\n<code class=\"sig-name descname\">generate_np</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x_val</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spsa.html#SPSA.generate_np\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.generate_np\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate adversarial examples and return them as a NumPy array.\nSub-classes <em>should not</em> implement this method unless they must\nperform special handling of arguments.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x_val</strong> – A NumPy array with the original inputs.</p></li>\n<li><p><strong>**kwargs</strong> – <p>optional parameters used by child classes.</p>\n</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A NumPy array holding the adversarial examples.</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.SaliencyMapMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">SaliencyMapMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/saliency_map_method.html#SaliencyMapMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SaliencyMapMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>The Jacobian-based Saliency Map Method (Papernot et al. 2016).\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/pdf/1511.07528.pdf\">https://arxiv.org/pdf/1511.07528.pdf</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Note</dt>\n<dd class=\"field-even\"><p>When not using symbolic implementation in <cite>generate</cite>, <cite>sess</cite> should\nbe provided</p>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SaliencyMapMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/saliency_map_method.html#SaliencyMapMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SaliencyMapMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SaliencyMapMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">theta</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0.0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">symbolic_impl</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/saliency_map_method.html#SaliencyMapMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SaliencyMapMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>theta</strong> – (optional float) Perturbation introduced to modified\ncomponents (can be positive or negative)</p></li>\n<li><p><strong>gamma</strong> – (optional float) Maximum percentage of perturbed features</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum component value for clipping</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum component value for clipping</p></li>\n<li><p><strong>y_target</strong> – (optional) Target tensor if the attack is targeted</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.Semantic\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">Semantic</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">center</span></em>, <em class=\"sig-param\"><span class=\"n\">max_val</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/semantic.html#Semantic\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Semantic\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>Semantic adversarial examples</p>\n<p><a class=\"reference external\" href=\"https://arxiv.org/abs/1703.06857\">https://arxiv.org/abs/1703.06857</a></p>\n<p>Note: data must either be centered (so that the negative image can be\nmade by simple negation) or must be in the interval [-1, 1]</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>center</strong> – bool\nIf True, assumes data has 0 mean so the negative image is just negation.\nIf False, assumes data is in the interval [0, max_val]</p></li>\n<li><p><strong>max_val</strong> – float\nMaximum value allowed in the input data</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of data</p></li>\n<li><p><strong>kwargs</strong> – passed through to the super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Semantic.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/semantic.html#Semantic.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Semantic.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate the attack’s symbolic graph for adversarial examples. This\nmethod should be overriden in any child class that implements an\nattack that is expressable symbolically. Otherwise, it will wrap the\nnumerical implementation as a symbolic operator.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>**kwargs</strong> – <p>optional parameters used by child classes.\nEach child class defines additional parameters as needed.\nChild classes that use the following concepts should use the following\nnames:</p>\n<blockquote>\n<div><p>clip_min: minimum feature value\nclip_max: maximum feature value\neps: size of norm constraint on adversarial perturbation\nord: order of norm constraint\nnb_iter: number of iterations\neps_iter: size of norm constraint on iteration\ny_target: if specified, the attack is targeted.\ny: Do not specify if y_target is specified.</p>\n<blockquote>\n<div><p>If specified, the attack is untargeted, aims to make the output\nclass not be y.\nIf neither y_target nor y is specified, y is inferred by having\nthe model classify the input.</p>\n</div></blockquote>\n</div></blockquote>\n<p>For other concepts, it’s generally a good idea to read other classes\nand check for name consistency.</p>\n</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation of the adversarial examples.</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.SparseL1Descent\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">SparseL1Descent</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/sparse_l1_descent.html#SparseL1Descent\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SparseL1Descent\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This class implements a variant of Projected Gradient Descent for the l1-norm\n(Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2\ncases covered by the ProjectedGradientDescent class, because the steepest\ndescent direction for the l1-norm is too sparse (it updates a single\ncoordinate in the adversarial perturbation in each step). This attack has an\nadditional parameter that controls the sparsity of the update step. For\nmoderately sparse update steps, the attack vastly outperforms Projected\nSteepest Descent and is competitive with other attacks targeted at the l1-norm\nsuch as the ElasticNetMethod attack (which is much more computationally\nexpensive).\nPaper link (Tramer and Boneh 2019): <a class=\"reference external\" href=\"https://arxiv.org/pdf/1904.13000.pdf\">https://arxiv.org/pdf/1904.13000.pdf</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SparseL1Descent.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/sparse_l1_descent.html#SparseL1Descent.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SparseL1Descent.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SparseL1Descent.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">10.0</span></em>, <em class=\"sig-param\"><span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">20</span></em>, <em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">rand_init</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\"><span class=\"n\">grad_sparsity</span><span class=\"o\">=</span><span class=\"default_value\">99</span></em>, <em class=\"sig-param\"><span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/sparse_l1_descent.html#SparseL1Descent.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SparseL1Descent.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>eps_iter</strong> – (optional float) step size for each attack iteration</p></li>\n<li><p><strong>nb_iter</strong> – (optional int) Number of attack iterations.</p></li>\n<li><p><strong>y</strong> – (optional) A tensor with the true labels.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the labels to target. Leave\ny_target=None if y is also set. Labels should be\none-hot-encoded.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n<li><p><strong>clip_grad</strong> – (optional bool) Ignore gradient components\nat positions where the input is already at the boundary\nof the domain, and the update step will get clipped out.</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"simple\">\n<dt>:param grad_sparsity (optional) Relative sparsity of the gradient update</dt><dd><p>step, in percent. Only gradient values larger\nthan this percentile are retained. This parameter can\nbe a scalar, or a vector of the same length as the\ninput batch dimension.</p>\n</dd>\n</dl>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>sanity_checks</strong> – <p>bool Insert tf asserts checking values\n(Some tests need to run with no sanity checks because the</p>\n<blockquote>\n<div><p>tests intentionally configure the attack strangely)</p>\n</div></blockquote>\n</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.SpatialTransformationMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">SpatialTransformationMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spatial_transformation_method.html#SpatialTransformationMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SpatialTransformationMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>Spatial transformation attack</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SpatialTransformationMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spatial_transformation_method.html#SpatialTransformationMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SpatialTransformationMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.\n:param x: The model’s symbolic inputs.\n:param kwargs: See <cite>parse_params</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SpatialTransformationMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">n_samples</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dx_min</span><span class=\"o\">=</span><span class=\"default_value\">- 0.1</span></em>, <em class=\"sig-param\"><span class=\"n\">dx_max</span><span class=\"o\">=</span><span class=\"default_value\">0.1</span></em>, <em class=\"sig-param\"><span class=\"n\">n_dxs</span><span class=\"o\">=</span><span class=\"default_value\">2</span></em>, <em class=\"sig-param\"><span class=\"n\">dy_min</span><span class=\"o\">=</span><span class=\"default_value\">- 0.1</span></em>, <em class=\"sig-param\"><span class=\"n\">dy_max</span><span class=\"o\">=</span><span class=\"default_value\">0.1</span></em>, <em class=\"sig-param\"><span class=\"n\">n_dys</span><span class=\"o\">=</span><span class=\"default_value\">2</span></em>, <em class=\"sig-param\"><span class=\"n\">angle_min</span><span class=\"o\">=</span><span class=\"default_value\">- 30</span></em>, <em class=\"sig-param\"><span class=\"n\">angle_max</span><span class=\"o\">=</span><span class=\"default_value\">30</span></em>, <em class=\"sig-param\"><span class=\"n\">n_angles</span><span class=\"o\">=</span><span class=\"default_value\">6</span></em>, <em class=\"sig-param\"><span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spatial_transformation_method.html#SpatialTransformationMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SpatialTransformationMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.\n:param n_samples: (optional) The number of transformations sampled to</p>\n<blockquote>\n<div><p>construct the attack. Set it to None to run\nfull grid attack.</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>dx_min</strong> – (optional float) Minimum translation ratio along x-axis.</p></li>\n<li><p><strong>dx_max</strong> – (optional float) Maximum translation ratio along x-axis.</p></li>\n<li><p><strong>n_dxs</strong> – (optional int) Number of discretized translation ratios\nalong x-axis.</p></li>\n<li><p><strong>dy_min</strong> – (optional float) Minimum translation ratio along y-axis.</p></li>\n<li><p><strong>dy_max</strong> – (optional float) Maximum translation ratio along y-axis.</p></li>\n<li><p><strong>n_dys</strong> – (optional int) Number of discretized translation ratios\nalong y-axis.</p></li>\n<li><p><strong>angle_min</strong> – (optional float) Largest counter-clockwise rotation\nangle.</p></li>\n<li><p><strong>angle_max</strong> – (optional float) Largest clockwise rotation angle.</p></li>\n<li><p><strong>n_angles</strong> – (optional int) Number of discretized angles.</p></li>\n<li><p><strong>black_border_size</strong> – (optional int) size of the black border in pixels.</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.VirtualAdversarialMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">VirtualAdversarialMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/virtual_adversarial_method.html#VirtualAdversarialMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.VirtualAdversarialMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This attack was originally proposed by Miyato et al. (2016) and was used\nfor virtual adversarial training.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1507.00677\">https://arxiv.org/abs/1507.00677</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.VirtualAdversarialMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/virtual_adversarial_method.html#VirtualAdversarialMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.VirtualAdversarialMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.VirtualAdversarialMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">2.0</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"default_value\">1e-06</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/virtual_adversarial_method.html#VirtualAdversarialMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.VirtualAdversarialMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float )the epsilon (input variation parameter)</p></li>\n<li><p><strong>nb_iter</strong> – (optional) the number of iterations\nDefaults to 1 if not specified</p></li>\n<li><p><strong>xi</strong> – (optional float) the finite difference parameter</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n<li><p><strong>num_iterations</strong> – Deprecated alias for <cite>nb_iter</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.clip_eta\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">clip_eta</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eta</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/utils_tf.html#clip_eta\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.clip_eta\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Helper function to clip the perturbation to epsilon norm ball.\n:param eta: A tensor with the current perturbation.\n:param ord: Order of the norm (mimics Numpy).</p>\n<blockquote>\n<div><p>Possible values: np.inf, 1 or 2.</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>eps</strong> – Epsilon, bound of the perturbation.</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.fgm\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">fgm</code><span class=\"sig-paren\">(</span><em class=\"sig-param\">x</em>, <em class=\"sig-param\">logits</em>, <em class=\"sig-param\">y=None</em>, <em class=\"sig-param\">eps=0.3</em>, <em class=\"sig-param\">ord=inf</em>, <em class=\"sig-param\">loss_fn=&lt;function softmax_cross_entropy_with_logits&gt;</em>, <em class=\"sig-param\">clip_min=None</em>, <em class=\"sig-param\">clip_max=None</em>, <em class=\"sig-param\">clip_grad=False</em>, <em class=\"sig-param\">targeted=False</em>, <em class=\"sig-param\">sanity_checks=True</em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#fgm\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.fgm\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>TensorFlow implementation of the Fast Gradient Method.\n:param x: the input placeholder\n:param logits: output of model.get_logits\n:param y: (optional) A placeholder for the true labels. If targeted</p>\n<blockquote>\n<div><p>is true, then provide the target label. Otherwise, only provide\nthis parameter if you’d like to use true labels when crafting\nadversarial samples. Otherwise, model predictions are used as\nlabels to avoid the “label leaking” effect (explained in this\npaper: <a class=\"reference external\" href=\"https://arxiv.org/abs/1611.01236\">https://arxiv.org/abs/1611.01236</a>). Default is None.\nLabels should be one-hot-encoded.</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – the epsilon (input variation parameter)</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics NumPy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>loss_fn</strong> – Loss function that takes (labels, logits) as arguments and returns loss</p></li>\n<li><p><strong>clip_min</strong> – Minimum float value for adversarial example components</p></li>\n<li><p><strong>clip_max</strong> – Maximum float value for adversarial example components</p></li>\n<li><p><strong>clip_grad</strong> – (optional bool) Ignore gradient components\nat positions where the input is already at the boundary\nof the domain, and the update step will get clipped out.</p></li>\n<li><p><strong>targeted</strong> – Is the attack targeted or untargeted? Untargeted, the\ndefault, will try to make the label incorrect. Targeted\nwill instead try to move in the direction of being more\nlike y.</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>a tensor for the adversarial example</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.optimize_linear\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">optimize_linear</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">grad</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span><span class=\"o\">=</span><span class=\"default_value\">inf</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#optimize_linear\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.optimize_linear\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Solves for the optimal input to a linear function under a norm constraint.</p>\n<p>Optimal_perturbation = argmax_{eta, ||eta||_{ord} &lt; eps} dot(eta, grad)</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>grad</strong> – tf tensor containing a batch of gradients</p></li>\n<li><p><strong>eps</strong> – float scalar specifying size of constraint region</p></li>\n<li><p><strong>ord</strong> – int specifying order of norm</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>tf tensor containing optimal perturbation</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.projected_optimization\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">projected_optimization</code><span class=\"sig-paren\">(</span><em class=\"sig-param\">loss_fn</em>, <em class=\"sig-param\">input_image</em>, <em class=\"sig-param\">label</em>, <em class=\"sig-param\">epsilon</em>, <em class=\"sig-param\">num_steps</em>, <em class=\"sig-param\">clip_min=None</em>, <em class=\"sig-param\">clip_max=None</em>, <em class=\"sig-param\">optimizer=&lt;cleverhans.attacks.spsa.TensorAdam object&gt;</em>, <em class=\"sig-param\">project_perturbation=&lt;function _project_perturbation&gt;</em>, <em class=\"sig-param\">early_stop_loss_threshold=None</em>, <em class=\"sig-param\">is_debug=False</em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spsa.html#projected_optimization\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.projected_optimization\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generic projected optimization, generalized to work with approximate\ngradients. Used for e.g. the SPSA attack.</p>\n<dl>\n<dt>Args:</dt><dd><dl class=\"field-list\">\n<dt class=\"field-odd\">param loss_fn</dt>\n<dd class=\"field-odd\"><p>A callable which takes <cite>input_image</cite> and <cite>label</cite> as\narguments, and returns a batch of loss values. Same\ninterface as TensorOptimizer.</p>\n</dd>\n<dt class=\"field-even\">param input_image</dt>\n<dd class=\"field-even\"><p>Tensor, a batch of images</p>\n</dd>\n<dt class=\"field-odd\">param label</dt>\n<dd class=\"field-odd\"><p>Tensor, a batch of labels</p>\n</dd>\n<dt class=\"field-even\">param epsilon</dt>\n<dd class=\"field-even\"><p>float, the L-infinity norm of the maximum allowable\nperturbation</p>\n</dd>\n<dt class=\"field-odd\">param num_steps</dt>\n<dd class=\"field-odd\"><p>int, the number of steps of gradient descent</p>\n</dd>\n<dt class=\"field-even\">param clip_min</dt>\n<dd class=\"field-even\"><p>float, minimum pixel value</p>\n</dd>\n<dt class=\"field-odd\">param clip_max</dt>\n<dd class=\"field-odd\"><p>float, maximum pixel value</p>\n</dd>\n<dt class=\"field-even\">param optimizer</dt>\n<dd class=\"field-even\"><p>A <cite>TensorOptimizer</cite> object</p>\n</dd>\n<dt class=\"field-odd\">param project_perturbation</dt>\n<dd class=\"field-odd\"><p>A function, which will be used to enforce\nsome constraint. It should have the same\nsignature as <cite>_project_perturbation</cite>.</p>\n</dd>\n<dt class=\"field-even\">param early_stop_loss_threshold</dt>\n<dd class=\"field-even\"><p>A float or None. If specified, the attack will end if the loss is below\n<cite>early_stop_loss_threshold</cite>.</p>\n<blockquote>\n<div><dl class=\"simple\">\n<dt>Enabling this option can have several different effects:</dt><dd><ul class=\"simple\">\n<li><p>Setting the threshold to 0. guarantees that if a successful attack is found, it is returned.\nThis increases the attack success rate, because without early stopping the optimizer can accidentally\nbounce back to a point where the attack fails.</p></li>\n<li><p>Early stopping can make the attack run faster because it may run for fewer steps.</p></li>\n<li><p>Early stopping can make the attack run slower because the loss must be calculated at each step.\nThe loss is not calculated as part of the normal SPSA optimization procedure.\nFor most reasonable choices of hyperparameters, early stopping makes the attack much faster because\nit decreases the number of steps dramatically.</p></li>\n</ul>\n</dd>\n</dl>\n</div></blockquote>\n</dd>\n<dt class=\"field-odd\">param is_debug</dt>\n<dd class=\"field-odd\"><p>A bool. If True, print debug info for attack progress.</p>\n</dd>\n</dl>\n</dd>\n<dt>Returns:</dt><dd><dl class=\"simple\">\n<dt>adversarial version of <cite>input_image</cite>, with L-infinity difference less than</dt><dd><p>epsilon, which tries to minimize loss_fn.</p>\n</dd>\n</dl>\n</dd>\n</dl>\n<p>Note that this function is not intended as an Attack by itself. Rather, it\nis designed as a helper function which you can use to write your own attack\nmethods. The method uses a tf.while_loop to optimize a loss function in\na single sess.run() call.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.reduce_max\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">reduce_max</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span><span class=\"n\">args</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"headerlink\" href=\"#cleverhans.attacks.reduce_max\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issues a deprecation warning and passes through the arguments.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.reduce_mean\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">reduce_mean</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span><span class=\"n\">args</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"headerlink\" href=\"#cleverhans.attacks.reduce_mean\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issues a deprecation warning and passes through the arguments.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.reduce_sum\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">reduce_sum</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span><span class=\"n\">args</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"headerlink\" href=\"#cleverhans.attacks.reduce_sum\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issues a deprecation warning and passes through the arguments.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.softmax_cross_entropy_with_logits\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">softmax_cross_entropy_with_logits</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">sentinel</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dim</span><span class=\"o\">=</span><span class=\"default_value\">- 1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/compat.html#softmax_cross_entropy_with_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.softmax_cross_entropy_with_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle\ndeprecated warning</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.vatm\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">vatm</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">logits</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span></em>, <em class=\"sig-param\"><span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"default_value\">1e-06</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/virtual_adversarial_method.html#vatm\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.vatm\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Tensorflow implementation of the perturbation method used for virtual\nadversarial training: <a class=\"reference external\" href=\"https://arxiv.org/abs/1507.00677\">https://arxiv.org/abs/1507.00677</a>\n:param model: the model which returns the network unnormalized logits\n:param x: the input placeholder\n:param logits: the model’s unnormalized output tensor (the input to</p>\n<blockquote>\n<div><p>the softmax layer)</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – the epsilon (input variation parameter)</p></li>\n<li><p><strong>num_iterations</strong> – the number of iterations</p></li>\n<li><p><strong>xi</strong> – the finite difference parameter</p></li>\n<li><p><strong>clip_min</strong> – optional parameter that can be used to set a minimum\nvalue for components of the example returned</p></li>\n<li><p><strong>clip_max</strong> – optional parameter that can be used to set a maximum\nvalue for components of the example returned</p></li>\n<li><p><strong>seed</strong> – the seed for random generator</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>a tensor for the adversarial example</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.wrapper_warning\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">wrapper_warning</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#wrapper_warning\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.wrapper_warning\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issue a deprecation warning. Used in multiple places that implemented\nattacks by automatically wrapping a user-supplied callable with a\nCallableModelWrapper with output_layer=”probs”.\nUsing “probs” as any part of the attack interface is dangerous.\nWe can’t just change output_layer to logits because:\n- that would be a silent interface change. We’d have no way of detecting</p>\n<blockquote>\n<div><p>code that still means to use probs. Note that we can’t just check whether\nthe final output op is a softmax—for example, Inception puts a reshape\nafter the softmax.</p>\n</div></blockquote>\n<ul class=\"simple\">\n<li><p>automatically wrapping user-supplied callables with output_layer=’logits’\nis even worse, see <cite>wrapper_warning_logits</cite></p></li>\n</ul>\n<p>Note: this function will be removed at the same time as the code that\ncalls it.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.wrapper_warning_logits\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">wrapper_warning_logits</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#wrapper_warning_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.wrapper_warning_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issue a deprecation warning. Used in multiple places that implemented\nattacks by automatically wrapping a user-supplied callable with a\nCallableModelWrapper with output_layer=”logits”.\nThis is dangerous because it is under-the-hood automagic that the user\nmay not realize has been invoked for them. If they pass a callable\nthat actually outputs probs, the probs will be treated as logits,\nresulting in an incorrect cross-entropy loss and severe gradient\nmasking.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.xrange\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">xrange</code><a class=\"headerlink\" href=\"#cleverhans.attacks.xrange\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>alias of <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">range</span></code></p>\n</dd></dl>\n\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul class=\"current\">\n<li class=\"toctree-l1 current\"><a class=\"current reference internal\" href=\"#\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n      <li>Previous: <a href=\"../index.html\" title=\"previous chapter\">CleverHans Documentation</a></li>\n      <li>Next: <a href=\"model.html\" title=\"next chapter\"><cite>model</cite> module</a></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/source/devtools.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>devtools module &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"module-cleverhans.devtools\">\n<span id=\"devtools-module\"></span><h1><cite>devtools</cite> module<a class=\"headerlink\" href=\"#module-cleverhans.devtools\" title=\"Permalink to this headline\">¶</a></h1>\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/source/future.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>future module &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"module-cleverhans.devtools\">\n<span id=\"future-module\"></span><h1><cite>future</cite> module<a class=\"headerlink\" href=\"#module-cleverhans.devtools\" title=\"Permalink to this headline\">¶</a></h1>\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docs/source/model.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>model module &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n    <link rel=\"prev\" title=\"attacks module\" href=\"attacks.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"module-cleverhans.model\">\n<span id=\"model-module\"></span><h1><cite>model</cite> module<a class=\"headerlink\" href=\"#module-cleverhans.model\" title=\"Permalink to this headline\">¶</a></h1>\n<p>The Model class and related functionality.</p>\n<dl class=\"py class\">\n<dt id=\"cleverhans.model.CallableModelWrapper\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">CallableModelWrapper</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">callable_fn</span></em>, <em class=\"sig-param\"><span class=\"n\">output_layer</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#CallableModelWrapper\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.CallableModelWrapper\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <a class=\"reference internal\" href=\"#cleverhans.model.Model\" title=\"cleverhans.model.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.model.Model</span></code></a></p>\n<p>A wrapper that turns a callable into a valid Model</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.CallableModelWrapper.fprop\">\n<code class=\"sig-name descname\">fprop</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#CallableModelWrapper.fprop\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.CallableModelWrapper.fprop\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Forward propagation to compute the model outputs.\n:param x: A symbolic representation of the network input\n:return: A dictionary mapping layer names to the symbolic</p>\n<blockquote>\n<div><p>representation of their output.</p>\n</div></blockquote>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.model.Model\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">Model</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">hparams</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">needs_dummy_fprop</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">object</span></code></p>\n<p>An abstract interface for model wrappers that exposes model symbols\nneeded for making an attack. This abstraction removes the dependency on\nany specific neural network package (e.g. Keras) from the core\ncode of CleverHans. It can also simplify exposing the hidden features of a\nmodel when a specific package does not directly expose them.</p>\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.model.Model.O_FEATURES\">\n<code class=\"sig-name descname\">O_FEATURES</code><em class=\"property\"> = 'features'</em><a class=\"headerlink\" href=\"#cleverhans.model.Model.O_FEATURES\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.model.Model.O_LOGITS\">\n<code class=\"sig-name descname\">O_LOGITS</code><em class=\"property\"> = 'logits'</em><a class=\"headerlink\" href=\"#cleverhans.model.Model.O_LOGITS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.model.Model.O_PROBS\">\n<code class=\"sig-name descname\">O_PROBS</code><em class=\"property\"> = 'probs'</em><a class=\"headerlink\" href=\"#cleverhans.model.Model.O_PROBS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.fprop\">\n<code class=\"sig-name descname\">fprop</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.fprop\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.fprop\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Forward propagation to compute the model outputs.\n:param x: A symbolic representation of the network input\n:return: A dictionary mapping layer names to the symbolic</p>\n<blockquote>\n<div><p>representation of their output.</p>\n</div></blockquote>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_layer\">\n<code class=\"sig-name descname\">get_layer</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">layer</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_layer\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_layer\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a layer output.\n:param x: tensor, the input to the network.\n:param layer: str, the name of the layer to compute.\n:param <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">**</span></a>kwargs: dict, extra optional params to pass to self.fprop.\n:return: the content of layer <cite>layer</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_layer_names\">\n<code class=\"sig-name descname\">get_layer_names</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_layer_names\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_layer_names\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return the list of exposed layers for this model.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_logits\">\n<code class=\"sig-name descname\">get_logits</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the output logits</p>\n</dd>\n</dl>\n<p>(i.e., the values fed as inputs to the softmax layer).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_params\">\n<code class=\"sig-name descname\">get_params</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Provides access to the model’s parameters.\n:return: A list of all Variables defining the model parameters.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_predicted_class\">\n<code class=\"sig-name descname\">get_predicted_class</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_predicted_class\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_predicted_class\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the predicted label</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_probs\">\n<code class=\"sig-name descname\">get_probs</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_probs\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_probs\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the output</p>\n</dd>\n</dl>\n<p>probabilities (i.e., the output values produced by the softmax layer).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.make_input_placeholder\">\n<code class=\"sig-name descname\">make_input_placeholder</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_input_placeholder\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.make_input_placeholder\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create and return a placeholder representing an input to the model.</p>\n<p>This method should respect context managers (e.g. “with tf.device”)\nand should not just return a reference to a single pre-created\nplaceholder.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.make_label_placeholder\">\n<code class=\"sig-name descname\">make_label_placeholder</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_label_placeholder\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.make_label_placeholder\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create and return a placeholder representing class labels.</p>\n<p>This method should respect context managers (e.g. “with tf.device”)\nand should not just return a reference to a single pre-created\nplaceholder.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.make_params\">\n<code class=\"sig-name descname\">make_params</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.make_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create all Variables to be returned later by get_params.\nBy default this is a no-op.\nModels that need their fprop to be called for their params to be\ncreated can set <cite>needs_dummy_fprop=True</cite> in the constructor.</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py exception\">\n<dt id=\"cleverhans.model.NoSuchLayerError\">\n<em class=\"property\">exception </em><code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">NoSuchLayerError</code><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#NoSuchLayerError\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.NoSuchLayerError\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ValueError</span></code></p>\n<p>Raised when a layer that does not exist is requested.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.model.wrapper_warning\">\n<code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">wrapper_warning</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#wrapper_warning\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.wrapper_warning\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issue a deprecation warning. Used in multiple places that implemented\nattacks by automatically wrapping a user-supplied callable with a\nCallableModelWrapper with output_layer=”probs”.\nUsing “probs” as any part of the attack interface is dangerous.\nWe can’t just change output_layer to logits because:\n- that would be a silent interface change. We’d have no way of detecting</p>\n<blockquote>\n<div><p>code that still means to use probs. Note that we can’t just check whether\nthe final output op is a softmax—for example, Inception puts a reshape\nafter the softmax.</p>\n</div></blockquote>\n<ul class=\"simple\">\n<li><p>automatically wrapping user-supplied callables with output_layer=’logits’\nis even worse, see <cite>wrapper_warning_logits</cite></p></li>\n</ul>\n<p>Note: this function will be removed at the same time as the code that\ncalls it.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.model.wrapper_warning_logits\">\n<code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">wrapper_warning_logits</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#wrapper_warning_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.wrapper_warning_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issue a deprecation warning. Used in multiple places that implemented\nattacks by automatically wrapping a user-supplied callable with a\nCallableModelWrapper with output_layer=”logits”.\nThis is dangerous because it is under-the-hood automagic that the user\nmay not realize has been invoked for them. If they pass a callable\nthat actually outputs probs, the probs will be treated as logits,\nresulting in an incorrect cross-entropy loss and severe gradient\nmasking.</p>\n</dd></dl>\n\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul class=\"current\">\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1 current\"><a class=\"current reference internal\" href=\"#\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n      <li>Previous: <a href=\"attacks.html\" title=\"previous chapter\"><cite>attacks</cite> module</a></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = python -msphinx\nSPHINXPROJ    = CleverHans\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\nfull-api:\n\tsphinx-apidoc --suffix .md -o source ..\n\n\n.PHONY: help Makefile\n\n# To keep the source and output separate, but still be able to both publish\n# on GitHub Pages and preview builds locally.\ngithub:\n\t@make html\n\t@cp -a _build/html/. ../docs\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/README.md",
    "content": "# Generate documentation\r\n\r\nTo generate the documentation do:\r\n`make github`\r\n\r\nThe documentation files will be copied to the `cleverhans/docs` directory.\r\n\r\n### Preparation\r\n\r\nPlease do:\r\n`pip install sphinx`\r\n\r\nAdd a `.nojekyll` file in the `cleverhans/docs` directory. When GitHub sees\r\na `.nojekyll` file, it serves the root `index.html` file. The `.nojekyll` file\r\nindicates that we are not using Jekyll as our static site generator in this\r\nrepository.\r\n\r\n### Enable GitHub Pages for the GitHub repository\r\n\r\n1. Go to the repository on the GitHub website and make sure you are logged in.\r\n2. Add a /docs directory to the master branch. Otherwise you do not get the\r\n   master branch /docs folder for the Source option in the drop-down list.\r\n3. Click the Settings tab. You first go to the Options section.\r\n4. Scroll down to the GitHub Pages section and choose the drop-down list under\r\n   Source. Note: Your choices will differ based on whether you’re in a User repo\r\n   or an Org repository.\r\n5. To keep source and output HTML separate, choose master branch /docs folder\r\n   for Source.\r\n\r\n### Build Sphinx locally and publish on GitHub Pages\r\n\r\nWe keep the source docsource and output docs separate, but still are able to\r\npublish on GitHub Pages and preview builds locally.\r\n\r\nWe have the following option in the Makefile:\r\n\r\n```\r\n  github:\r\n      @make html\r\n      @cp -a _build/html/. ../docs\r\n```\r\n\r\nThus, we can run `make github` from the `docsource` directory to generate a\r\nlocal preview and move the docs where GitHub wants to serve them from.\r\n\r\n### Hacks\r\n\r\nIf you cannot build the docs for attacks, uncomment\r\n`import tensorflow_addons as tfa` in `cleverhans/attacks/spsa.py`.\r\n\r\nOtherwise:\r\n\r\n```angular2html\r\nWARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised:\r\ncannot import name 'keras_tensor'\r\n```\r\n\r\nIt is convenient to create a virtual environment to install all the specific\r\nlibraries (e.g. virutalen cleverhans).\r\n"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/_templates/layout.html",
    "content": "{% extends '!layout.html' %}\n\n{% block footer %}\n\n{% endblock %}"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/conf.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n#\n# CleverHans documentation build configuration file, created by\n# sphinx-quickstart on Wed Sep 20 15:14:07 2017.\n#\n# This file is execfile()d with the current directory set to its\n# containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, as shown here.\n#\nimport os\nimport sys\n\nsys.path.insert(0, os.path.abspath(\"..\"))\n\n# -- General configuration ------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    \"sphinx.ext.autodoc\",\n    \"sphinx.ext.mathjax\",\n    \"sphinx.ext.viewcode\",\n    \"sphinx.ext.githubpages\",\n]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n#\n# source_suffix = ['.rst', '.md']\nsource_suffix = \".md\"\n\n# The master toctree document.\nmaster_doc = \"index\"\n\n# General information about the project.\nproject = \"CleverHans\"\n\nauthor = \"Ian Goodfellow, Nicolas Papernot, Ryan Sheatsley\"\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\n# version = '2.0.0'\n# The full version, including alpha/beta/rc tags.\n# release = '2.0.0'\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = None\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This patterns also effect to html_static_path and html_extra_path\nexclude_patterns = [\"_build\", \"Thumbs.db\", \".DS_Store\"]\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = \"sphinx\"\n\n# If true, `todo` and `todoList` produce output, else they produce nothing.\ntodo_include_todos = False\n\n# -- Options for HTML output ----------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = \"alabaster\"\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#\n# html_theme_options = {}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = [\"_static\"]\n\n# Custom sidebar templates must be a dictionary that maps document names\n# to template names.\n#\n# This is required for the alabaster theme\n# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars\nhtml_sidebars = {\n    \"**\": [\n        \"about.html\",\n        \"navigation.html\",\n        \"relations.html\",  # needs 'show_related': True theme option to display\n        \"searchbox.html\",\n        \"donate.html\",\n    ]\n}\n\n# -- Options for HTMLHelp output ------------------------------------------\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = \"CleverHansdoc\"\n\n# -- Options for LaTeX output ---------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    #\n    # 'papersize': 'letterpaper',\n    # The font size ('10pt', '11pt' or '12pt').\n    #\n    # 'pointsize': '10pt',\n    # Additional stuff for the LaTeX preamble.\n    #\n    # 'preamble': '',\n    # Latex figure (float) alignment\n    #\n    # 'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (\n        master_doc,\n        \"CleverHans.tex\",\n        \"CleverHans Documentation\",\n        \"Ian Goodfellow, Nicolas Papernot, Ryan Sheatsley\",\n        \"manual\",\n    ),\n]\n\n# -- Options for manual page output ---------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [(master_doc, \"cleverhans\", \"CleverHans Documentation\", [author], 1)]\n\n# -- Options for Texinfo output -------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (\n        master_doc,\n        \"CleverHans\",\n        \"CleverHans Documentation\",\n        author,\n        \"CleverHans\",\n        \"One line description of project.\",\n        \"Miscellaneous\",\n    ),\n]\n"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/docs_requirements.txt",
    "content": "tensorflow"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/index.md",
    "content": ".. CleverHans documentation master file, created by\n   sphinx-quickstart on Wed Sep 20 15:14:07 2017.\n   You can adapt this file completely to your liking, but it should at least\n   contain the root `toctree` directive.\n\n   WARNING: This file has a markdown suffix, but is in fact .rst\n\nCleverHans Documentation\n======================================\n\n\nThis documentation is auto-generated from the docstrings of modules of the current `master` branch of `cleverhans\n<http://github.com/cleverhans-lab/cleverhans/>`_.\n\nTo get started, we recommend reading the `github readme\n<https://github.com/cleverhans-lab/cleverhans#setting-up-cleverhans>`_. Afterwards, you can learn more by looking at the following modules:\n\n\n.. toctree::\n   :maxdepth: 4\n\n   source/attacks\n   <!-- source/devtools -->\n   <!-- source/future -->\n   source/model\n\n\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n\n"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/source/attacks.md",
    "content": "`attacks` module\n--------------------------\n\n.. automodule:: cleverhans.attacks\n    :members:\n    :imported-members:\n    :undoc-members:\n    :show-inheritance:\n"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/source/devtools.md",
    "content": "`devtools` module\r\n------------------------\r\n\r\n.. automodule:: cleverhans.devtools\r\n    :members:\r\n    :undoc-members:\r\n    :show-inheritance:\r\n"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/source/future.md",
    "content": "`future` module\r\n------------------------\r\n\r\n.. automodule:: cleverhans.devtools\r\n    :members:\r\n    :undoc-members:\r\n    :show-inheritance:\r\n"
  },
  {
    "path": "cleverhans_v3.1.0/docsource/source/model.md",
    "content": "`model` module\n------------------------\n\n.. automodule:: cleverhans.model\n    :members:\n    :undoc-members:\n    :show-inheritance:\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/README.md",
    "content": "# Examples\n\n* **CIFAR10 with FGSM using the TensorFlow backend** ([code](ex_cifar10_tf.py)): this tutorial covers how to train a CIFAR10 model using TensorFlow,\ncraft adversarial examples using the [fast gradient sign method](https://arxiv.org/abs/1412.6572), \nand make the model more robust to adversarial\nexamples using adversarial training.\n* **Adversarial faces using FGSM against Facenet library** ([code](facenet_adversarial_faces)): this example covers how to create adversarial faces using the [fast gradient sign method](https://arxiv.org/abs/1412.6572) over the Facenet library.\n\n# Additional dependencies\n\nBesides the standard CleverHans dependencies, these examples also require\n`wget`.\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/RL-attack/README.md",
    "content": "# Crafting Adversarial Example Attacks on Policy Learners \nExamples of test-time and training-time FGSM attacks on Deep Q-Networks (DQNs). These examples are based on RLAttack ( https://github.com/behzadanksu/rl-attack/ ), a framework that provides an interface between Cleverhans and [@openai/baselines](https://github.com/openai/baselines) for experimental analysis of adversarial example attacks on policy learning in Deep RL. Attack models and methodologies are detailed in our paper \"Whatever Does Not Kill Deep Reinforcement Learning, Makes It Stronger\" (Behzadan & Munir, 2017 - https://arxiv.org/abs/1712.09344 ). \n\n### Dependencies\n- Python 3\n- cleverhans v2.0.0\n- RLAttack v1.0.0\n\n```\ngit clone https://github.com/behzadanksu/rl-attack.git\ncd rl-attack\npip install -e .\n```\n\n### Examples\nTwo example scripts are included. \n\n- enjoy-adv.py : a sample implementation of test-time FGSM attack on pre-trained DQN Atari agents.\n- train.py: a sample implementation of training-time FGSM attack on DQN Atari agents.\n\nSome example executions on the Breakout game environment are: \n\n- Test-time, No attack, testing a DQN model of Breakout trained without parameter noise:\n\n```\n$> python3 enjoy-adv.py --env Breakout --model-dir ./data/Breakout/model-173000 --video ./Breakout.mp4\n```\n\n- Test-time, No attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation):\n```\n$> python3 enjoy-adv.py --env Breakout --noisy --model-dir ./data/Breakout/model-173000 --video ./Breakout.mp4\n```\n\n- Test-time, Whitebox FGSM attack, testing a DQN model of Breakout trained without parameter noise:\n```\n$> python3 enjoy-adv.py --env Breakout --model-dir ./data/Breakout/model-173000 --attack fgsm --video ./Breakout.mp4\n```\n\n- Test-time, Whitebox FGSM attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation):\n```\n$> python3 enjoy-adv.py --env Breakout --noisy --model-dir ./data/Breakout/model-173000 --attack fgsm --video ./Breakout.mp4\n```\n\n- Test-time, Blackbox FGSM attack, testing a DQN model of Breakout trained without parameter noise:\n```\n$> python3 enjoy-adv.py --env Breakout --model-dir ./data/Breakout/model-173000 --attack fgsm --blackbox --model-dir2 ./data/Breakout/model-173000-2 --video ./Breakout.mp4\n```\n\n- Test-time, Blackbox FGSM attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation), replica model trained without parameter noise:\n```\n$> python3 enjoy-adv.py --env Breakout --noisy --model-dir ./data/Breakout/model-173000 --attack fgsm --blackbox --model-dir2 ./data/Breakout/model-173000-2 --video ./Breakout.mp4\n```\n\n- Test-time, Blackbox FGSM attack, testing a DQN model of Breakout trained with parameter noise (NoisyNet implementation), replica model trained with parameter noise:\n```\n$> python3 enjoy-adv.py --env Breakout --noisy --model-dir ./data/Breakout/model-173000 --attack fgsm --blackbox --model-dir2 ./data/Breakout/model-173000-2 --noisy2 --video ./Breakout.mp4\n```\n\n- Training-time, Whitebox attack, no parameter noise, injecting adversarial example with 20% probability:\n\n```\n$> python3 train.py --env Breakout --save-dir ./data/Breakout/ --attack fgsm --num-steps 200000000 --attack-prob 0.2 \n```\n\n- Training-time, Whitebox attack, NoisyNet parameter noise, injecting adversarial example with 100% probability:\n\n```\n$> python3 train.py --env Breakout --noisy --save-dir ./data/Breakout/ --attack fgsm --num-steps 200000000 --attack-prob 1.0\n```\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/RL-attack/enjoy-adv.py",
    "content": "\"\"\" DQN - Test-time attacks\n\n============ Sample usage ============\nNo attack, testing a DQN model of Breakout trained without parameter noise:\n$> python3 enjoy-adv.py --env Breakout --model-dir \\\n           ./data/Breakout/model-100 --video ./Breakout.mp4\n\nNo attack, testing a DQN model of Breakout trained with parameter noise\n(NoisyNet implementation):\n$> python3 enjoy-adv.py --env Breakout --noisy \\\n           --model-dir ./data/Breakout/model-173000 --video ./Breakout.mp4\n\nWhitebox FGSM attack, testing a DQN model of Breakout\ntrained without parameter noise:\n$> python3 enjoy-adv.py --env Breakout --model-dir \\\n        ./data/Breakout/model-173000 --attack fgsm --video ./Breakout.mp4\n\nWhitebox FGSM attack, testing a DQN model of Breakout\ntrained with parameter noise (NoisyNet implementation):\n$> python3 enjoy-adv.py --env Breakout --noisy --model-dir \\\n        ./data/Breakout/model-173000 --attack fgsm --video ./Breakout.mp4\n\nBlackbox FGSM attack, testing a DQN model of Breakout\ntrained without parameter noise:\n$> python3 enjoy-adv.py --env Breakout --model-dir \\\n    ./data/Breakout/model-173000 --attack fgsm --blackbox \\\n    --model-dir2 ./data/Breakout/model-173000-2 --video ./Breakout.mp4\n\nBlackbox FGSM attack, testing a DQN model of Breakout\ntrained with parameter noise (NoisyNet implementation),\nreplica model trained without parameter noise:\n$> python3 enjoy-adv.py --env Breakout --noisy \\\n    --model-dir ./data/Breakout/model-173000 --attack fgsm --blackbox \\\n    --model-dir2 ./data/Breakout/model2-173000-2 --video ./Breakout.mp4\n\nBlackbox FGSM attack, testing a DQN model of Breakout\ntrained with parameter noise (NoisyNet implementation),\nreplica model trained with parameter noise:\n$> python3 enjoy-adv.py --env Breakout --noisy --model-dir \\\n    ./data/Breakout/model-173000 --attack fgsm --blackbox \\\n    --model-dir2 ./data/Breakout/model2-173000 --noisy2 --video ./Breakout.mp4\n\n\"\"\"\n\nimport argparse\nimport gym\nimport os\nimport numpy as np\n\nfrom gym.monitoring import VideoRecorder\n\nimport rlattack.common.tf_util as U\n\nfrom rlattack import deepq\nfrom rlattack.common.misc_util import (\n    boolean_flag,\n    SimpleMonitor,\n)\nfrom rlattack.common.atari_wrappers_deprecated import wrap_dqn\n\n\n# V: imports#\nimport tensorflow as tf\nimport cv2\nfrom collections import deque\nfrom model import model, dueling_model\nfrom statistics import statistics\n\n\nclass DQNModel:\n    \"\"\"\n    Creating Q-graph, FGSM graph\n    Supports loading multiple graphs - needed for blackbox attacks\n    \"\"\"\n\n    def __init__(self, env, dueling, noisy, fname):\n        self.g = tf.Graph()\n        self.noisy = noisy\n        self.dueling = dueling\n        self.env = env\n        with self.g.as_default():\n            self.act = deepq.build_act_enjoy(\n                make_obs_ph=lambda name: U.Uint8Input(\n                    env.observation_space.shape, name=name\n                ),\n                q_func=dueling_model if dueling else model,\n                num_actions=env.action_space.n,\n                noisy=noisy,\n            )\n            self.saver = tf.train.Saver()\n        self.sess = tf.Session(graph=self.g)\n\n        if fname is not None:\n            print(\"Loading Model...\")\n            self.saver.restore(self.sess, fname)\n\n    def get_act(self):\n        return self.act\n\n    def get_session(self):\n        return self.sess\n\n    def craft_adv(self):\n        with self.sess.as_default():\n            with self.g.as_default():\n                craft_adv_obs = deepq.build_adv(\n                    make_obs_tf=lambda name: U.Uint8Input(\n                        self.env.observation_space.shape, name=name\n                    ),\n                    q_func=dueling_model if self.dueling else model,\n                    num_actions=self.env.action_space.n,\n                    epsilon=1.0 / 255.0,\n                    noisy=self.noisy,\n                )\n        return craft_adv_obs\n\n\ndef parse_args():\n    parser = argparse.ArgumentParser(\"Run an already learned DQN model.\")\n    # Environment\n    parser.add_argument(\"--env\", type=str, required=True, help=\"name of the game\")\n    parser.add_argument(\n        \"--model-dir\", type=str, default=None, help=\"load model from this directory. \"\n    )\n    parser.add_argument(\n        \"--video\",\n        type=str,\n        default=None,\n        help=\"Path to mp4 file where the \\\n                        video of first episode will be recorded.\",\n    )\n    boolean_flag(\n        parser,\n        \"stochastic\",\n        default=True,\n        help=\"whether or not to use stochastic \\\n                 actions according to models eps value\",\n    )\n    boolean_flag(\n        parser, \"dueling\", default=False, help=\"whether or not to use dueling model\"\n    )\n    # V: Attack Arguments#\n    parser.add_argument(\n        \"--model-dir2\",\n        type=str,\n        default=None,\n        help=\"load adversarial model from \\\n                        this directory (blackbox attacks). \",\n    )\n    parser.add_argument(\n        \"--attack\", type=str, default=None, help=\"Method to attack the model.\"\n    )\n    boolean_flag(parser, \"noisy\", default=False, help=\"whether or not to NoisyNetwork\")\n    boolean_flag(parser, \"noisy2\", default=False, help=\"whether or not to NoisyNetwork\")\n    boolean_flag(\n        parser, \"blackbox\", default=False, help=\"whether or not to NoisyNetwork\"\n    )\n\n    return parser.parse_args()\n\n\ndef make_env(game_name):\n    env = gym.make(game_name + \"NoFrameskip-v4\")\n    env = SimpleMonitor(env)\n    env = wrap_dqn(env)\n    return env\n\n\ndef play(\n    env,\n    act,\n    craft_adv_obs,\n    craft_adv_obs2,\n    stochastic,\n    video_path,\n    attack,\n    m_target,\n    m_adv,\n):\n    num_episodes = 0\n    num_moves = 0\n    num_transfer = 0\n\n    video_recorder = None\n    video_recorder = VideoRecorder(env, video_path, enabled=video_path is not None)\n    obs = env.reset()\n    while True:\n        env.unwrapped.render()\n        video_recorder.capture_frame()\n\n        # V: Attack #\n        if attack is not None:\n            # Craft adv. examples\n            with m_adv.get_session().as_default():\n                adv_obs = craft_adv_obs(np.array(obs)[None], stochastic_adv=stochastic)[\n                    0\n                ]\n            with m_target.get_session().as_default():\n                action = act(np.array(adv_obs)[None], stochastic=stochastic)[0]\n                action2 = act(np.array(obs)[None], stochastic=stochastic)[0]\n                num_moves += 1\n                if action != action2:\n                    num_transfer += 1\n        else:\n            # Normal\n            action = act(np.array(obs)[None], stochastic=stochastic)[0]\n\n        obs, rew, done, info = env.step(action)\n        if done:\n            obs = env.reset()\n\n        if len(info[\"rewards\"]) > num_episodes:\n            if len(info[\"rewards\"]) == 1 and video_recorder.enabled:\n                # save video of first episode\n                print(\"Saved video.\")\n                video_recorder.close()\n                video_recorder.enabled = False\n            print(\"Reward: \" + str(info[\"rewards\"][-1]))\n            num_episodes = len(info[\"rewards\"])\n            print(\"Episode: \" + str(num_episodes))\n            success = float(num_transfer / num_moves) * 100.0\n            print(\"Percentage of successful attacks: \" + str(success))\n            num_moves = 0\n            num_transfer = 0\n\n\nif __name__ == \"__main__\":\n    args = parse_args()\n    env = make_env(args.env)\n    g1 = tf.Graph()\n    g2 = tf.Graph()\n    with g1.as_default():\n        m1 = DQNModel(\n            env, args.dueling, args.noisy, os.path.join(args.model_dir, \"saved\")\n        )\n    if args.blackbox:\n        with g2.as_default():\n            m2 = DQNModel(\n                env, args.dueling, args.noisy2, os.path.join(args.model_dir2, \"saved\")\n            )\n            with m2.get_session().as_default():\n                craft_adv_obs = m2.craft_adv()\n            with m1.get_session().as_default():\n                craft_adv_obs2 = m1.craft_adv()\n                play(\n                    env,\n                    m1.get_act(),\n                    craft_adv_obs,\n                    craft_adv_obs2,\n                    args.stochastic,\n                    args.video,\n                    args.attack,\n                    m1,\n                    m2,\n                )\n    else:\n        with m1.get_session().as_default():\n            craft_adv_obs = m1.craft_adv()\n            play(\n                env,\n                m1.get_act(),\n                craft_adv_obs,\n                None,\n                args.stochastic,\n                args.video,\n                args.attack,\n                m1,\n                m1,\n            )\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/RL-attack/model.py",
    "content": "import tensorflow as tf\nimport tensorflow.contrib.layers as layers\nfrom rlattack.common.tf_util import noisy_dense\n\n\ndef model(img_in, num_actions, scope, noisy=False, reuse=False, concat_softmax=False):\n    with tf.variable_scope(scope, reuse=reuse):\n        out = img_in\n        with tf.variable_scope(\"convnet\"):\n            # original architecture\n            out = layers.convolution2d(\n                out, num_outputs=32, kernel_size=8, stride=4, activation_fn=tf.nn.relu\n            )\n            out = layers.convolution2d(\n                out, num_outputs=64, kernel_size=4, stride=2, activation_fn=tf.nn.relu\n            )\n            out = layers.convolution2d(\n                out, num_outputs=64, kernel_size=3, stride=1, activation_fn=tf.nn.relu\n            )\n        out = layers.flatten(out)\n\n        with tf.variable_scope(\"action_value\"):\n            if noisy:\n                # Apply noisy network on fully connected layers\n                # ref: https://arxiv.org/abs/1706.10295\n                out = noisy_dense(\n                    out, name=\"noisy_fc1\", size=512, activation_fn=tf.nn.relu\n                )\n                out = noisy_dense(out, name=\"noisy_fc2\", size=num_actions)\n            else:\n                out = layers.fully_connected(\n                    out, num_outputs=512, activation_fn=tf.nn.relu\n                )\n                out = layers.fully_connected(\n                    out, num_outputs=num_actions, activation_fn=None\n                )\n            # V: Softmax - inspired by deep-rl-attack #\n            if concat_softmax:\n                out = tf.nn.softmax(out)\n        return out\n\n\ndef dueling_model(\n    img_in, num_actions, scope, noisy=False, reuse=False, concat_softmax=False\n):\n    \"\"\"As described in https://arxiv.org/abs/1511.06581\"\"\"\n    with tf.variable_scope(scope, reuse=reuse):\n        out = img_in\n        with tf.variable_scope(\"convnet\"):\n            # original architecture\n            out = layers.convolution2d(\n                out, num_outputs=32, kernel_size=8, stride=4, activation_fn=tf.nn.relu\n            )\n            out = layers.convolution2d(\n                out, num_outputs=64, kernel_size=4, stride=2, activation_fn=tf.nn.relu\n            )\n            out = layers.convolution2d(\n                out, num_outputs=64, kernel_size=3, stride=1, activation_fn=tf.nn.relu\n            )\n        out = layers.flatten(out)\n\n        with tf.variable_scope(\"state_value\"):\n            if noisy:\n                # Apply noisy network on fully connected layers\n                # ref: https://arxiv.org/abs/1706.10295\n                state_hidden = noisy_dense(\n                    out, name=\"noisy_fc1\", size=512, activation_fn=tf.nn.relu\n                )\n                state_score = noisy_dense(state_hidden, name=\"noisy_fc2\", size=1)\n            else:\n                state_hidden = layers.fully_connected(\n                    out, num_outputs=512, activation_fn=tf.nn.relu\n                )\n                state_score = layers.fully_connected(\n                    state_hidden, num_outputs=1, activation_fn=None\n                )\n        with tf.variable_scope(\"action_value\"):\n            if noisy:\n                # Apply noisy network on fully connected layers\n                # ref: https://arxiv.org/abs/1706.10295\n                actions_hidden = noisy_dense(\n                    out, name=\"noisy_fc1\", size=512, activation_fn=tf.nn.relu\n                )\n                action_scores = noisy_dense(\n                    actions_hidden, name=\"noisy_fc2\", size=num_actions\n                )\n            else:\n                actions_hidden = layers.fully_connected(\n                    out, num_outputs=512, activation_fn=tf.nn.relu\n                )\n                action_scores = layers.fully_connected(\n                    actions_hidden, num_outputs=num_actions, activation_fn=None\n                )\n            action_scores_mean = tf.reduce_mean(action_scores, 1)\n            action_scores = action_scores - tf.expand_dims(action_scores_mean, 1)\n\n        return state_score + action_scores\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/RL-attack/train.py",
    "content": "import argparse\nimport gym\nimport numpy as np\nimport os\nimport tensorflow as tf\nimport tempfile\nimport time\nimport json\nimport random\n\nimport rlattack.common.tf_util as U\n\nfrom rlattack import logger\nfrom rlattack import deepq\nfrom rlattack.deepq.replay_buffer import ReplayBuffer, PrioritizedReplayBuffer\nfrom rlattack.common.misc_util import (\n    boolean_flag,\n    pickle_load,\n    pretty_eta,\n    relatively_safe_pickle_dump,\n    set_global_seeds,\n    RunningAvg,\n    SimpleMonitor,\n)\nfrom rlattack.common.schedules import LinearSchedule, PiecewiseSchedule\n\n# when updating this to non-deprecated ones, it is important to\n# copy over LazyFrames\nfrom rlattack.common.atari_wrappers_deprecated import wrap_dqn\nfrom rlattack.common.azure_utils import Container\nfrom model import model, dueling_model\nfrom statistics import statistics\n\n\ndef parse_args():\n    parser = argparse.ArgumentParser(\"DQN experiments for Atari games\")\n    # Environment\n    parser.add_argument(\"--env\", type=str, default=\"Pong\", help=\"name of the game\")\n    parser.add_argument(\"--seed\", type=int, default=42, help=\"which seed to use\")\n    # Core DQN parameters\n    parser.add_argument(\n        \"--replay-buffer-size\", type=int, default=int(1e6), help=\"replay buffer size\"\n    )\n    parser.add_argument(\n        \"--lr\", type=float, default=1e-4, help=\"learning rate for Adam optimizer\"\n    )\n    parser.add_argument(\n        \"--num-steps\",\n        type=int,\n        default=int(2e8),\n        help=\"total number of steps to \\\n                        run the environment for\",\n    )\n    parser.add_argument(\n        \"--batch-size\",\n        type=int,\n        default=32,\n        help=\"number of transitions to optimize \\\n                        at the same time\",\n    )\n    parser.add_argument(\n        \"--learning-freq\",\n        type=int,\n        default=4,\n        help=\"number of iterations between \\\n                        every optimization step\",\n    )\n    parser.add_argument(\n        \"--target-update-freq\",\n        type=int,\n        default=40000,\n        help=\"number of iterations between \\\n                        every target network update\",\n    )\n    # Bells and whistles\n    boolean_flag(parser, \"noisy\", default=False, help=\"whether or not to NoisyNetwork\")\n    boolean_flag(\n        parser, \"double-q\", default=True, help=\"whether or not to use double q learning\"\n    )\n    boolean_flag(\n        parser, \"dueling\", default=False, help=\"whether or not to use dueling model\"\n    )\n    boolean_flag(\n        parser,\n        \"prioritized\",\n        default=False,\n        help=\"whether or not to use prioritized replay buffer\",\n    )\n    parser.add_argument(\n        \"--prioritized-alpha\",\n        type=float,\n        default=0.6,\n        help=\"alpha parameter for prioritized replay buffer\",\n    )\n    parser.add_argument(\n        \"--prioritized-beta0\",\n        type=float,\n        default=0.4,\n        help=\"initial value of beta \\\n                        parameters for prioritized replay\",\n    )\n    parser.add_argument(\n        \"--prioritized-eps\",\n        type=float,\n        default=1e-6,\n        help=\"eps parameter for prioritized replay buffer\",\n    )\n    # Checkpointing\n    parser.add_argument(\n        \"--save-dir\",\n        type=str,\n        default=None,\n        required=True,\n        help=\"directory in which \\\n                        training state and model should be saved.\",\n    )\n    parser.add_argument(\n        \"--save-azure-container\",\n        type=str,\n        default=None,\n        help=\"It present data will saved/loaded from Azure. \\\n                        Should be in format ACCOUNT_NAME:ACCOUNT_KEY:\\\n                        CONTAINER\",\n    )\n    parser.add_argument(\n        \"--save-freq\",\n        type=int,\n        default=1e6,\n        help=\"save model once every time this many \\\n                        iterations are completed\",\n    )\n    boolean_flag(\n        parser,\n        \"load-on-start\",\n        default=True,\n        help=\"if true and model was previously saved then training \\\n                 will be resumed\",\n    )\n\n    # V: Attack Arguments #\n    parser.add_argument(\n        \"--attack\", type=str, default=None, help=\"Method to attack the model.\"\n    )\n    parser.add_argument(\n        \"--attack-init\", type=int, default=0, help=\"Iteration no. to begin attacks\"\n    )\n    parser.add_argument(\n        \"--attack-prob\",\n        type=float,\n        default=0.0,\n        help=\"Probability of attack at each step, \\\n                        float in range 0 - 1.0\",\n    )\n    return parser.parse_args()\n\n\ndef make_env(game_name):\n    env = gym.make(game_name + \"NoFrameskip-v4\")\n    monitored_env = SimpleMonitor(env)\n    env = wrap_dqn(monitored_env)\n    return env, monitored_env\n\n\ndef maybe_save_model(savedir, container, state):\n    if savedir is None:\n        return\n    start_time = time.time()\n    model_dir = \"model-{}\".format(state[\"num_iters\"])\n    U.save_state(os.path.join(savedir, model_dir, \"saved\"))\n    if container is not None:\n        container.put(os.path.join(savedir, model_dir), model_dir)\n    relatively_safe_pickle_dump(\n        state, os.path.join(savedir, \"training_state.pkl.zip\"), compression=True\n    )\n    if container is not None:\n        container.put(\n            os.path.join(savedir, \"training_state.pkl.zip\"), \"training_state.pkl.zip\"\n        )\n    relatively_safe_pickle_dump(\n        state[\"monitor_state\"], os.path.join(savedir, \"monitor_state.pkl\")\n    )\n    if container is not None:\n        container.put(os.path.join(savedir, \"monitor_state.pkl\"), \"monitor_state.pkl\")\n    logger.log(\"Saved model in {} seconds\\n\".format(time.time() - start_time))\n\n\ndef maybe_load_model(savedir, container):\n    \"\"\"Load model if present at the specified path.\"\"\"\n    if savedir is None:\n        return\n\n    state_path = os.path.join(os.path.join(savedir, \"training_state.pkl.zip\"))\n    if container is not None:\n        logger.log(\"Attempting to download model from Azure\")\n        found_model = container.get(savedir, \"training_state.pkl.zip\")\n    else:\n        found_model = os.path.exists(state_path)\n    if found_model:\n        state = pickle_load(state_path, compression=True)\n        model_dir = \"model-{}\".format(state[\"num_iters\"])\n        if container is not None:\n            container.get(savedir, model_dir)\n        U.load_state(os.path.join(savedir, model_dir, \"saved\"))\n        logger.log(\n            \"Loaded models checkpoint at {} iterations\".format(state[\"num_iters\"])\n        )\n        return state\n\n\nif __name__ == \"__main__\":\n    args = parse_args()\n    # Parse savedir and azure container.\n    savedir = args.save_dir\n    if args.save_azure_container is not None:\n        account_name, account_key, container_name = args.save_azure_container.split(\":\")\n        container = Container(\n            account_name=account_name,\n            account_key=account_key,\n            container_name=container_name,\n            maybe_create=True,\n        )\n        if savedir is None:\n            # Careful! This will not get cleaned up.\n            savedir = tempfile.TemporaryDirectory().name\n    else:\n        container = None\n    # Create and seed the env.\n    env, monitored_env = make_env(args.env)\n    if args.seed > 0:\n        set_global_seeds(args.seed)\n        env.unwrapped.seed(args.seed)\n\n    # V: Save arguments, configure log dump path to savedir #\n    if savedir:\n        with open(os.path.join(savedir, \"args.json\"), \"w\") as f:\n            json.dump(vars(args), f)\n        logger.configure(dir=savedir)  # log to savedir\n\n    with U.make_session(4) as sess:\n        # Create training graph and replay buffer\n        act, train, update_target, debug, craft_adv = deepq.build_train(\n            make_obs_ph=lambda name: U.Uint8Input(\n                env.observation_space.shape, name=name\n            ),\n            q_func=dueling_model if args.dueling else model,\n            num_actions=env.action_space.n,\n            optimizer=tf.train.AdamOptimizer(learning_rate=args.lr, epsilon=1e-4),\n            gamma=0.99,\n            grad_norm_clipping=10,\n            double_q=args.double_q,\n            noisy=args.noisy,\n            attack=args.attack,\n        )\n        approximate_num_iters = args.num_steps / 4\n        exploration = PiecewiseSchedule(\n            [\n                (0, 1.0),\n                (approximate_num_iters / 50, 0.1),\n                (approximate_num_iters / 5, 0.01),\n            ],\n            outside_value=0.01,\n        )\n\n        if args.prioritized:\n            replay_buffer = PrioritizedReplayBuffer(\n                args.replay_buffer_size, args.prioritized_alpha\n            )\n            beta_schedule = LinearSchedule(\n                approximate_num_iters, initial_p=args.prioritized_beta0, final_p=1.0\n            )\n        else:\n            replay_buffer = ReplayBuffer(args.replay_buffer_size)\n\n        U.initialize()\n        update_target()\n        num_iters = 0\n\n        # Load the model\n        state = maybe_load_model(savedir, container)\n        if state is not None:\n            num_iters, replay_buffer = (\n                state[\"num_iters\"],\n                state[\"replay_buffer\"],\n            )\n            monitored_env.set_state(state[\"monitor_state\"])\n\n        start_time, start_steps = None, None\n        steps_per_iter = RunningAvg(0.999)\n        iteration_time_est = RunningAvg(0.999)\n        obs = env.reset()\n        # Record the mean of the \\sigma\n        sigma_name_list = []\n        sigma_list = []\n        for param in tf.trainable_variables():\n            # only record the \\sigma in the action network\n            if \"sigma\" in param.name and \"deepq/q_func/action_value\" in param.name:\n                summary_name = (\n                    param.name.replace(\"deepq/q_func/action_value/\", \"\")\n                    .replace(\"/\", \".\")\n                    .split(\":\")[0]\n                )\n                sigma_name_list.append(summary_name)\n                sigma_list.append(tf.reduce_mean(tf.abs(param)))\n        f_mean_sigma = U.function(inputs=[], outputs=sigma_list)\n        # Statistics\n        writer = tf.summary.FileWriter(savedir, sess.graph)\n        im_stats = statistics(\n            scalar_keys=[\"action\", \"im_reward\", \"td_errors\", \"huber_loss\"]\n            + sigma_name_list\n        )\n        ep_stats = statistics(scalar_keys=[\"ep_reward\", \"ep_length\"])\n        # Main trianing loop\n        ep_length = 0\n        while True:\n            num_iters += 1\n            ep_length += 1\n\n            # V: Perturb observation if we are past the init stage\n            # and at a designated attack step\n            # if craft_adv != None and (num_iters >= args.attack_init)\n            # and ((num_iters - args.attack_init) % args.attack_freq == 0) :\n            if (\n                craft_adv is not None\n                and (num_iters >= args.attack_init)\n                and (random.random() <= args.attack_prob)\n            ):\n                obs = craft_adv(np.array(obs)[None])[0]\n\n            # Take action and store transition in the replay buffer.\n            if args.noisy:\n                # greedily choose\n                action = act(np.array(obs)[None], stochastic=False)[0]\n            else:\n                # epsilon greedy\n                action = act(\n                    np.array(obs)[None], update_eps=exploration.value(num_iters)\n                )[0]\n            new_obs, rew, done, info = env.step(action)\n            replay_buffer.add(obs, action, rew, new_obs, float(done))\n            obs = new_obs\n            if done:\n                obs = env.reset()\n\n            if (\n                num_iters > max(5 * args.batch_size, args.replay_buffer_size // 20)\n                and num_iters % args.learning_freq == 0\n            ):\n                # Sample a bunch of transitions from replay buffer\n                if args.prioritized:\n                    experience = replay_buffer.sample(\n                        args.batch_size, beta=beta_schedule.value(num_iters)\n                    )\n                    (\n                        obses_t,\n                        actions,\n                        rewards,\n                        obses_tp1,\n                        dones,\n                        weights,\n                        batch_idxes,\n                    ) = experience\n                else:\n                    obses_t, actions, rewards, obses_tp1, dones = replay_buffer.sample(\n                        args.batch_size\n                    )\n                    weights = np.ones_like(rewards)\n                # Minimize the error in Bellman's and compute TD-error\n                td_errors, huber_loss = train(\n                    obses_t, actions, rewards, obses_tp1, dones, weights\n                )\n                # Update the priorities in the replay buffer\n                if args.prioritized:\n                    new_priorities = np.abs(td_errors) + args.prioritized_eps\n                    replay_buffer.update_priorities(batch_idxes, new_priorities)\n                # Write summary\n                mean_sigma = f_mean_sigma()\n                im_stats.add_all_summary(\n                    writer,\n                    [action, rew, np.mean(td_errors), np.mean(huber_loss)] + mean_sigma,\n                    num_iters,\n                )\n\n            # Update target network.\n            if num_iters % args.target_update_freq == 0:\n                update_target()\n\n            if start_time is not None:\n                steps_per_iter.update(info[\"steps\"] - start_steps)\n                iteration_time_est.update(time.time() - start_time)\n            start_time, start_steps = time.time(), info[\"steps\"]\n\n            # Save the model and training state.\n            if num_iters > 0 and (\n                num_iters % args.save_freq == 0 or info[\"steps\"] > args.num_steps\n            ):\n                maybe_save_model(\n                    savedir,\n                    container,\n                    {\n                        \"replay_buffer\": replay_buffer,\n                        \"num_iters\": num_iters,\n                        \"monitor_state\": monitored_env.get_state(),\n                    },\n                )\n\n            if info[\"steps\"] > args.num_steps:\n                break\n\n            if done:\n                steps_left = args.num_steps - info[\"steps\"]\n                completion = np.round(info[\"steps\"] / args.num_steps, 1)\n                mean_ep_reward = np.mean(info[\"rewards\"][-100:])\n                logger.record_tabular(\"% completion\", completion)\n                logger.record_tabular(\"steps\", info[\"steps\"])\n                logger.record_tabular(\"iters\", num_iters)\n                logger.record_tabular(\"episodes\", len(info[\"rewards\"]))\n                logger.record_tabular(\n                    \"reward (100 epi mean)\", np.mean(info[\"rewards\"][-100:])\n                )\n                if not args.noisy:\n                    logger.record_tabular(\"exploration\", exploration.value(num_iters))\n                if args.prioritized:\n                    logger.record_tabular(\"max priority\", replay_buffer._max_priority)\n                fps_estimate = (\n                    float(steps_per_iter) / (float(iteration_time_est) + 1e-6)\n                    if steps_per_iter._value is not None\n                    else \"calculating:\"\n                )\n                logger.dump_tabular()\n                logger.log()\n                logger.log(\"ETA: \" + pretty_eta(int(steps_left / fps_estimate)))\n                logger.log()\n                # add summary for one episode\n                ep_stats.add_all_summary(writer, [mean_ep_reward, ep_length], num_iters)\n                ep_length = 0\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/LibriSpeech/LICENSE.TXT",
    "content": "LibriSpeech (c) 2014 by Vassil Panayotov\n\nLibriSpeech ASR corpus is licensed under a\nCreative Commons Attribution 4.0 International License.\n\nSee <http://creativecommons.org/licenses/by/4.0/>.\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/README.md",
    "content": "# Imperceptible, Robust and Targeted Adversarial Examples for Automatic Speech Recognition\n\nThis is a Tensorflow implementation for the ICML 2019 paper [\"Imperceptible, Robust and Targeted Adversarial Examples for Automatic Speech Recognition\"](http://proceedings.mlr.press/v97/qin19a.html). The details of all the models implemented here can be found in the [paper](http://proceedings.mlr.press/v97/qin19a.html).\n\n## Dependencies\n*   Python 2.7\n*   a TensorFlow [installation](https://www.tensorflow.org/install/) (Tensorflow 1.13 is supported for this version of Lingvo system),\n*   a `C++` compiler (only g++ 4.8 is officially supported),\n*   the bazel build system,\n*   librosa (```pip install librosa```),\n*   Cython (```pip install Cython```),\n*   pyroomacoustics (```pip install pyroomacoustics```).\n\n## Data \nHere we provide 10 audios from LibriSpeech test-clean dataset as an example to show how to run the codes. Please refer to [Lingvo](https://github.com/tensorflow/lingvo/tree/master/lingvo/tasks/asr/tools) or [Librispeech website](http://www.openslr.org/resources/12/) to download the whole test set.\n\nIn the file ```read_data.txt```, the directory of the 10 audios, the corresponding original transcription and the targeted transcription are provided in the format of [dir, original transcription, targeted transcription]. The full list of 1000 audio examples used in our experiments is provided in ```./util/read_data_ful.txt```.\n\nYou can run the script ```sh util/convert_name_format.sh``` to convert the audios in the LibriSpeech from the format ```.flac```  to ```.wav```. You need to first change the directory of the downloaded LibriSpeech dataset in the script ```./util/convert_name_format.sh```.\n\n## Pretrained model\nThe pretrained model can be downloaded [here](http://cseweb.ucsd.edu/~yaq007/ckpt-00908156.data-00000-of-00001). You need to place the downloaded pretrained model into the directory ```./model/```.\n\n## Lingvo ASR system\n\nThe automatic speech recognition (ASR) system used in this paper is [Lingvo system](https://github.com/tensorflow/lingvo). To run our codes, you need to first download the forked version [here](https://github.com/yaq007/lingvo) and make sure that you are in the \"icml\" branch.\n\n```bash\ngit clone https://github.com/yaq007/lingvo.git\ncd lingvo\ngit checkout icml\n```\nThen you need to compile the lingvo system. The easiest way to build [Lingvo system](https://github.com/tensorflow/lingvo) is to use the [docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/). Here we place the folder ```lingvo/``` and ```lingvo_compiled/``` under the root directory ```~/```. If you change their locations, you need to make corresponding changes in the following commands.\n\n\n```bash\ncd ..\nmkdir lingvo_compiled\n\nexport LINGVO_DEVICE=\"gpu\"\nsudo docker build --no-cache --tag tensorflow:lingvo $(test \"$LINGVO_DEVICE\" = \"gpu\" && echo \"--build-arg base_image=nvidia/cuda:10.0-cudnn7-runtime-ubuntu16.04\") - < lingvo/docker/dev.dockerfile\n\nexport LINGVO_DIR=$HOME/lingvo\nsudo docker run --rm $(test \"$LINGVO_DEVICE\" = \"gpu\" && echo \"--runtime=nvidia\") -it -v ${LINGVO_DIR}:/tmp/lingvo -v ~/lingvo_compiled:/tmp/lingvo_compiled -v ${HOME}/.gitconfig:/home/${USER}/.gitconfig:ro -p 6006:6006 -p 8888:8888 --name lingvo tensorflow:lingvo bash\n\n# In docker\nbazel build -c opt --config=cuda //lingvo:trainer\ncp -rfL bazel-bin/lingvo/trainer.runfiles/__main__/lingvo /tmp/lingvo_compiled\n\n# Outside of docker\nsudo chown -R $USER ~/lingvo_compiled\nexport PYTHONPATH=$PYTHONPATH:~/lingvo_compiled\n```\nThe folder ```lingvo/``` in the directory ```lingvo_compiled/``` needs to be placed in the directory ```./adversarial_asr/```. Then this directory becomes ```./adversarial_asr/lingvo/```.\n\n## Imperceptible Adversarial Examples\n\nCurrently, all the python scripts are tested on one GPU. You can use ```CUDA_VISIBLE_DEVICES=GPU_INDEX``` to choose which gpu to run the python scripts.\n\nTo generate imperceptible adversarial examples, run\n\n```bash\npython generate_imperceptible_adv.py\n```\n\nThe adversarial examples saved with the name ended with \"stage1\" is the adversarial examples in [Carlini's work](https://arxiv.org/abs/1801.01944). Adversarial examples ended with the name \"stage2\" is our imperceptible adversarial examples using frequency masking threshold.\n\nTo test the accuracy of our imperceptible adversarial examples, simply run:\n\n```bash\npython test_imperceptible_adv.py --stage=stage2 --adv=True\n```\nYou can set ```--stage=stage1``` to test the accuracy of Carlini's adversarial examples. If you set ```--adv=False```, then you can test the performance for clean examples with its corresponding original transcriptions.\n\n## Robust Adversarial Examples\nTo generate robust adversarial examples that are simulated playing over-the-air in the simulated random rooms, we need to first generate the simulated room reverberations.\n```bash\npython room_simulator.py\n```\nThen you can run the following command to generate robust adversarial examples.\n```\npython generate_robust_adv.py --initial_bound=2000 --num_iter_stage1=2000\n```\nIn the paper, we test the last 100 audios in the ```./util/read_data_full.txt``` and we set the parameter ```initial bound``` and ```num_iter_stage1``` as ```2000``` in our experiments.\n\nEmpirically, for longer audios, you might need to increase the ```initial bound``` of perturbation to generate robust adversarial examples that can successfully attack the simulated rooms. Correspndingly, you also need to increase ```num_iter_stage1``` to allow the adversarial generation to converge. You can tune the training parameters in ```generate_robust_adv.py``` to play with your data.\n\nTo test the performance of robust adversarial examples, simply run \n```\npython test_robust_adv.py --stage=stage2 --adv=True\n```\nIf you want to test the performance of clean examples played in the simulated rooms, you can set ```--adv=False```.\n\n## Citation\nIf you find the code or the models implemented here are useful, please cite this paper:\n\n```\n@InProceedings{pmlr-v97-qin19a,\n  title = \t {Imperceptible, Robust, and Targeted Adversarial Examples for Automatic Speech Recognition},\n  author = \t {Qin, Yao and Carlini, Nicholas and Cottrell, Garrison and Goodfellow, Ian and Raffel, Colin},\n  booktitle = \t {Proceedings of the 36th International Conference on Machine Learning},\n  pages = \t {5231--5240},\n  year = \t {2019},\n  volume = \t {97},\n  series = \t {Proceedings of Machine Learning Research},\n  publisher = \t {PMLR},\n}\n```\n\n## Acknowledgement\nThis code is based on Lingvo ASR system. Thanks to the contributors of the Lingvo.\n\n```\n@article{shen2019lingvo,\n  title={Lingvo: a modular and scalable framework for sequence-to-sequence modeling},\n  author={Shen, Jonathan and Nguyen, Patrick and Wu, Yonghui and Chen, Zhifeng and Chen, Mia X and Jia, Ye and Kannan, Anjuli and Sainath, Tara and Cao, Yuan and Chiu, Chung-Cheng and others},\n  journal={arXiv preprint arXiv:1902.08295},\n  year={2019}\n}\n```\n\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/generate_imperceptible_adv.py",
    "content": "import tensorflow as tf\nfrom lingvo import model_imports\nfrom lingvo import model_registry\nimport numpy as np\nimport scipy.io.wavfile as wav\nimport generate_masking_threshold as generate_mask\nfrom tool import Transform, create_features, create_inputs\nimport time\nfrom lingvo.core import cluster_factory\nfrom absl import flags\nfrom absl import app\n\n# data directory\nflags.DEFINE_string(\"root_dir\", \"./\", \"location of Librispeech\")\nflags.DEFINE_string(\n    \"input\", \"read_data.txt\", \"Input audio .wav file(s), at 16KHz (separated by spaces)\"\n)\n\n# data processing\nflags.DEFINE_integer(\"window_size\", \"2048\", \"window size in spectrum analysis\")\nflags.DEFINE_integer(\n    \"max_length_dataset\",\n    \"223200\",\n    \"the length of the longest audio in the whole dataset\",\n)\nflags.DEFINE_float(\n    \"initial_bound\", \"2000\", \"initial l infinity norm for adversarial perturbation\"\n)\n\n# training parameters\nflags.DEFINE_string(\"checkpoint\", \"./model/ckpt-00908156\", \"location of checkpoint\")\nflags.DEFINE_integer(\"batch_size\", \"5\", \"batch size\")\nflags.DEFINE_float(\"lr_stage1\", \"100\", \"learning_rate for stage 1\")\nflags.DEFINE_float(\"lr_stage2\", \"1\", \"learning_rate for stage 2\")\nflags.DEFINE_integer(\"num_iter_stage1\", \"1000\", \"number of iterations in stage 1\")\nflags.DEFINE_integer(\"num_iter_stage2\", \"4000\", \"number of iterations in stage 2\")\nflags.DEFINE_integer(\"num_gpu\", \"0\", \"which gpu to run\")\n\nFLAGS = flags.FLAGS\n\n\ndef ReadFromWav(data, batch_size):\n    \"\"\"\n    Returns:\n        audios_np: a numpy array of size (batch_size, max_length) in float\n        trans: a numpy array includes the targeted transcriptions (batch_size, )\n        th_batch: a numpy array of the masking threshold, each of size (?, 1025)\n        psd_max_batch: a numpy array of the psd_max of the original audio (batch_size)\n        max_length: the max length of the batch of audios\n        sample_rate_np: a numpy array\n        masks: a numpy array of size (batch_size, max_length)\n        masks_freq: a numpy array of size (batch_size, max_length_freq, 80)\n        lengths: a list of the length of original audios\n    \"\"\"\n    audios = []\n    lengths = []\n    th_batch = []\n    psd_max_batch = []\n\n    # read the .wav file\n    for i in range(batch_size):\n        sample_rate_np, audio_temp = wav.read(FLAGS.root_dir + str(data[0, i]))\n        # read the wav form range from [-32767, 32768] or [-1, 1]\n        if max(audio_temp) < 1:\n            audio_np = audio_temp * 32768\n        else:\n            audio_np = audio_temp\n\n        length = len(audio_np)\n\n        audios.append(audio_np)\n        lengths.append(length)\n\n    max_length = max(lengths)\n\n    # pad the input audio\n    audios_np = np.zeros([batch_size, max_length])\n    masks = np.zeros([batch_size, max_length])\n    lengths_freq = (np.array(lengths) // 2 + 1) // 240 * 3\n    max_length_freq = max(lengths_freq)\n    masks_freq = np.zeros([batch_size, max_length_freq, 80])\n    for i in range(batch_size):\n        audio_float = audios[i].astype(float)\n        audios_np[i, : lengths[i]] = audio_float\n        masks[i, : lengths[i]] = 1\n        masks_freq[i, : lengths_freq[i], :] = 1\n\n        # compute the masking threshold\n        th, psd_max = generate_mask.generate_th(\n            audios_np[i], sample_rate_np, FLAGS.window_size\n        )\n        th_batch.append(th)\n        psd_max_batch.append(psd_max)\n\n    th_batch = np.array(th_batch)\n    psd_max_batch = np.array(psd_max_batch)\n\n    # read the transcription\n    trans = data[2, :]\n\n    return (\n        audios_np,\n        trans,\n        th_batch,\n        psd_max_batch,\n        max_length,\n        sample_rate_np,\n        masks,\n        masks_freq,\n        lengths,\n    )\n\n\nclass Attack:\n    def __init__(\n        self,\n        sess,\n        batch_size=1,\n        lr_stage1=100,\n        lr_stage2=0.1,\n        num_iter_stage1=1000,\n        num_iter_stage2=4000,\n        th=None,\n        psd_max_ori=None,\n    ):\n\n        self.sess = sess\n        self.num_iter_stage1 = num_iter_stage1\n        self.num_iter_stage2 = num_iter_stage2\n        self.batch_size = batch_size\n        self.lr_stage1 = lr_stage1\n\n        tf.set_random_seed(1234)\n        params = model_registry.GetParams(\"asr.librispeech.Librispeech960Wpm\", \"Test\")\n        params.random_seed = 1234\n        params.is_eval = True\n        params.cluster.worker.gpus_per_replica = 1\n        cluster = cluster_factory.Cluster(params.cluster)\n        with cluster, tf.device(cluster.GetPlacer()):\n            model = params.cls(params)\n            self.delta_large = tf.Variable(\n                np.zeros((batch_size, FLAGS.max_length_dataset), dtype=np.float32),\n                name=\"qq_delta\",\n            )\n\n            # placeholders\n            self.input_tf = tf.placeholder(\n                tf.float32, shape=[batch_size, None], name=\"qq_input\"\n            )\n            self.tgt_tf = tf.placeholder(tf.string)\n            self.sample_rate_tf = tf.placeholder(tf.int32, name=\"qq_sample_rate\")\n            self.th = tf.placeholder(\n                tf.float32, shape=[batch_size, None, None], name=\"qq_th\"\n            )\n            self.psd_max_ori = tf.placeholder(\n                tf.float32, shape=[batch_size], name=\"qq_psd\"\n            )\n            self.mask = tf.placeholder(\n                dtype=np.float32, shape=[batch_size, None], name=\"qq_mask\"\n            )\n            self.mask_freq = tf.placeholder(\n                dtype=np.float32, shape=[batch_size, None, 80]\n            )\n            self.noise = tf.placeholder(\n                np.float32, shape=[batch_size, None], name=\"qq_noise\"\n            )\n            self.maxlen = tf.placeholder(np.int32)\n            self.lr_stage2 = tf.placeholder(np.float32)\n\n            # variable\n            self.rescale = tf.Variable(\n                np.ones((batch_size, 1), dtype=np.float32), name=\"qq_rescale\"\n            )\n            self.alpha = tf.Variable(\n                np.ones((batch_size), dtype=np.float32) * 0.05, name=\"qq_alpha\"\n            )\n\n            # extract the delta\n            self.delta = tf.slice(\n                tf.identity(self.delta_large), [0, 0], [batch_size, self.maxlen]\n            )\n            self.apply_delta = (\n                tf.clip_by_value(self.delta, -FLAGS.initial_bound, FLAGS.initial_bound)\n                * self.rescale\n            )\n            self.new_input = self.apply_delta * self.mask + self.input_tf\n            self.pass_in = tf.clip_by_value(\n                self.new_input + self.noise, -(2 ** 15), 2 ** 15 - 1\n            )\n\n            # generate the inputs that are needed for the lingvo model\n            self.features = create_features(\n                self.pass_in, self.sample_rate_tf, self.mask_freq\n            )\n            self.inputs = create_inputs(\n                model, self.features, self.tgt_tf, self.batch_size, self.mask_freq\n            )\n\n            task = model.GetTask()\n            metrics = task.FPropDefaultTheta(self.inputs)\n            # self.celoss with the shape (batch_size)\n            self.celoss = tf.get_collection(\"per_loss\")[0]\n            self.decoded = task.Decode(self.inputs)\n\n        # compute the loss for masking threshold\n        self.loss_th_list = []\n        self.transform = Transform(FLAGS.window_size)\n        for i in range(self.batch_size):\n            logits_delta = self.transform(\n                (self.apply_delta[i, :]), (self.psd_max_ori)[i]\n            )\n            loss_th = tf.reduce_mean(tf.nn.relu(logits_delta - (self.th)[i]))\n            loss_th = tf.expand_dims(loss_th, dim=0)\n            self.loss_th_list.append(loss_th)\n        self.loss_th = tf.concat(self.loss_th_list, axis=0)\n\n        self.optimizer1 = tf.train.AdamOptimizer(self.lr_stage1)\n        self.optimizer2 = tf.train.AdamOptimizer(self.lr_stage2)\n\n        grad1, var1 = self.optimizer1.compute_gradients(\n            self.celoss, [self.delta_large]\n        )[0]\n        grad21, var21 = self.optimizer2.compute_gradients(\n            self.celoss, [self.delta_large]\n        )[0]\n        grad22, var22 = self.optimizer2.compute_gradients(\n            self.alpha * self.loss_th, [self.delta_large]\n        )[0]\n\n        self.train1 = self.optimizer1.apply_gradients([(tf.sign(grad1), var1)])\n        self.train21 = self.optimizer2.apply_gradients([(grad21, var21)])\n        self.train22 = self.optimizer2.apply_gradients([(grad22, var22)])\n        self.train2 = tf.group(self.train21, self.train22)\n\n    def attack_stage1(\n        self,\n        audios,\n        trans,\n        th_batch,\n        psd_max_batch,\n        maxlen,\n        sample_rate,\n        masks,\n        masks_freq,\n        num_loop,\n        data,\n        lr_stage2,\n    ):\n        sess = self.sess\n        # initialize and load the pretrained model\n        sess.run(tf.initializers.global_variables())\n        saver = tf.train.Saver(\n            [x for x in tf.global_variables() if x.name.startswith(\"librispeech\")]\n        )\n        saver.restore(sess, FLAGS.checkpoint)\n\n        # reassign the variables\n        sess.run(\n            tf.assign(self.rescale, np.ones((self.batch_size, 1), dtype=np.float32))\n        )\n        sess.run(\n            tf.assign(\n                self.delta_large,\n                np.zeros((self.batch_size, FLAGS.max_length_dataset), dtype=np.float32),\n            )\n        )\n\n        # noise = np.random.normal(scale=2, size=audios.shape)\n        noise = np.zeros(audios.shape)\n        feed_dict = {\n            self.input_tf: audios,\n            self.tgt_tf: trans,\n            self.sample_rate_tf: sample_rate,\n            self.th: th_batch,\n            self.psd_max_ori: psd_max_batch,\n            self.mask: masks,\n            self.mask_freq: masks_freq,\n            self.noise: noise,\n            self.maxlen: maxlen,\n            self.lr_stage2: lr_stage2,\n        }\n        losses, predictions = sess.run((self.celoss, self.decoded), feed_dict)\n\n        # show the initial predictions\n        for i in range(self.batch_size):\n            print(\n                \"example: {}, loss: {}\".format(\n                    num_loop * self.batch_size + i, losses[i]\n                )\n            )\n            print(\"pred:{}\".format(predictions[\"topk_decoded\"][i, 0]))\n            print(\"targ:{}\".format(trans[i].lower()))\n            print(\"true: {}\".format(data[1, i].lower()))\n\n        # We'll make a bunch of iterations of gradient descent here\n        now = time.time()\n        MAX = self.num_iter_stage1\n        loss_th = [np.inf] * self.batch_size\n        final_deltas = [None] * self.batch_size\n        clock = 0\n\n        for i in range(MAX):\n            now = time.time()\n\n            # Actually do the optimization\n            sess.run(self.train1, feed_dict)\n            if i % 10 == 0:\n                d, cl, predictions, new_input = sess.run(\n                    (self.delta, self.celoss, self.decoded, self.new_input), feed_dict\n                )\n\n            for ii in range(self.batch_size):\n                # print out the prediction each 100 iterations\n                if i % 1000 == 0:\n                    print(\"pred:{}\".format(predictions[\"topk_decoded\"][ii, 0]))\n                    # print(\"rescale: {}\".format(sess.run(self.rescale[ii])))\n                if i % 10 == 0:\n                    if i % 100 == 0:\n                        print(\"example: {}\".format(num_loop * self.batch_size + ii))\n                        print(\"iteration: {}. loss {}\".format(i, cl[ii]))\n\n                    if predictions[\"topk_decoded\"][ii, 0] == trans[ii].lower():\n                        print(\n                            \"-------------------------------True--------------------------\"\n                        )\n\n                        # update rescale\n                        rescale = sess.run(self.rescale)\n                        if rescale[ii] * FLAGS.initial_bound > np.max(np.abs(d[ii])):\n                            rescale[ii] = np.max(np.abs(d[ii])) / FLAGS.initial_bound\n                        rescale[ii] *= 0.8\n\n                        # save the best adversarial example\n                        final_deltas[ii] = new_input[ii]\n\n                        print(\n                            \"Iteration i=%d, worked ii=%d celoss=%f bound=%f\"\n                            % (i, ii, cl[ii], FLAGS.initial_bound * rescale[ii])\n                        )\n                        sess.run(tf.assign(self.rescale, rescale))\n\n                # in case no final_delta return\n                if i == MAX - 1 and final_deltas[ii] is None:\n                    final_deltas[ii] = new_input[ii]\n\n            if i % 10 == 0:\n                print(\"ten iterations take around {} \".format(clock))\n                clock = 0\n\n            clock += time.time() - now\n\n        return final_deltas\n\n    def attack_stage2(\n        self,\n        audios,\n        trans,\n        adv,\n        th_batch,\n        psd_max_batch,\n        maxlen,\n        sample_rate,\n        masks,\n        masks_freq,\n        num_loop,\n        data,\n        lr_stage2,\n    ):\n        sess = self.sess\n        # initialize and load the pretrained model\n        sess.run(tf.initializers.global_variables())\n        saver = tf.train.Saver(\n            [x for x in tf.global_variables() if x.name.startswith(\"librispeech\")]\n        )\n        saver.restore(sess, FLAGS.checkpoint)\n\n        sess.run(\n            tf.assign(self.rescale, np.ones((self.batch_size, 1), dtype=np.float32))\n        )\n        sess.run(\n            tf.assign(self.alpha, np.ones((self.batch_size), dtype=np.float32) * 0.05)\n        )\n\n        # reassign the variables\n        sess.run(tf.assign(self.delta_large, adv))\n\n        # noise = np.random.normal(scale=2, size=audios.shape)\n        noise = np.zeros(audios.shape)\n        feed_dict = {\n            self.input_tf: audios,\n            self.tgt_tf: trans,\n            self.sample_rate_tf: sample_rate,\n            self.th: th_batch,\n            self.psd_max_ori: psd_max_batch,\n            self.mask: masks,\n            self.mask_freq: masks_freq,\n            self.noise: noise,\n            self.maxlen: maxlen,\n            self.lr_stage2: lr_stage2,\n        }\n        losses, predictions = sess.run((self.celoss, self.decoded), feed_dict)\n\n        # show the initial predictions\n        for i in range(self.batch_size):\n            print(\n                \"example: {}, loss: {}\".format(\n                    num_loop * self.batch_size + i, losses[i]\n                )\n            )\n            print(\"pred:{}\".format(predictions[\"topk_decoded\"][i, 0]))\n            print(\"targ:{}\".format(trans[i].lower()))\n            print(\"true: {}\".format(data[1, i].lower()))\n\n        # We'll make a bunch of iterations of gradient descent here\n        now = time.time()\n        MAX = self.num_iter_stage2\n        loss_th = [np.inf] * self.batch_size\n        final_deltas = [None] * self.batch_size\n        final_alpha = [None] * self.batch_size\n        # final_th = [None] * self.batch_size\n        clock = 0\n        min_th = 0.0005\n        for i in range(MAX):\n            now = time.time()\n            if i == 3000:\n                # min_th = -np.inf\n                lr_stage2 = 0.1\n                feed_dict = {\n                    self.input_tf: audios,\n                    self.tgt_tf: trans,\n                    self.sample_rate_tf: sample_rate,\n                    self.th: th_batch,\n                    self.psd_max_ori: psd_max_batch,\n                    self.mask: masks,\n                    self.mask_freq: masks_freq,\n                    self.noise: noise,\n                    self.maxlen: maxlen,\n                    self.lr_stage2: lr_stage2,\n                }\n\n            # Actually do the optimization\n            sess.run(self.train2, feed_dict)\n\n            if i % 10 == 0:\n                d, cl, l, predictions, new_input = sess.run(\n                    (\n                        self.delta,\n                        self.celoss,\n                        self.loss_th,\n                        self.decoded,\n                        self.new_input,\n                    ),\n                    feed_dict,\n                )\n\n            for ii in range(self.batch_size):\n                # print out the prediction each 100 iterations\n                if i % 1000 == 0:\n                    print(\"pred:{}\".format(predictions[\"topk_decoded\"][ii, 0]))\n                    # print(\"rescale: {}\".format(sess.run(self.rescale[ii])))\n                if i % 10 == 0:\n                    # print(\"example: {}\".format(num_loop * self.batch_size + ii))\n\n                    alpha = sess.run(self.alpha)\n                    if i % 100 == 0:\n                        print(\"example: {}\".format(num_loop * self.batch_size + ii))\n                        print(\n                            \"iteration: %d, alpha: %f, loss_ce: %f, loss_th: %f\"\n                            % (i, alpha[ii], cl[ii], l[ii])\n                        )\n\n                    # if the network makes the targeted prediction\n                    if predictions[\"topk_decoded\"][ii, 0] == trans[ii].lower():\n                        if l[ii] < loss_th[ii]:\n                            final_deltas[ii] = new_input[ii]\n                            loss_th[ii] = l[ii]\n                            final_alpha[ii] = alpha[ii]\n                            print(\n                                \"-------------------------------------Succeed---------------------------------\"\n                            )\n                            print(\n                                \"save the best example=%d at iteration= %d, alpha = %f\"\n                                % (ii, i, alpha[ii])\n                            )\n\n                        # increase the alpha each 20 iterations\n                        if i % 20 == 0:\n                            alpha[ii] *= 1.2\n                            sess.run(tf.assign(self.alpha, alpha))\n\n                    # if the network fails to make the targeted prediction, reduce alpha each 50 iterations\n                    if (\n                        i % 50 == 0\n                        and predictions[\"topk_decoded\"][ii, 0] != trans[ii].lower()\n                    ):\n                        alpha[ii] *= 0.8\n                        alpha[ii] = max(alpha[ii], min_th)\n                        sess.run(tf.assign(self.alpha, alpha))\n\n                # in case no final_delta return\n                if i == MAX - 1 and final_deltas[ii] is None:\n                    final_deltas[ii] = new_input[ii]\n            if i % 500 == 0:\n                print(\"alpha is {}, loss_th is {}\".format(final_alpha, loss_th))\n            if i % 10 == 0:\n                print(\"ten iterations take around {} \".format(clock))\n                clock = 0\n\n            clock += time.time() - now\n\n        return final_deltas, loss_th, final_alpha\n\n\ndef main(argv):\n    data = np.loadtxt(FLAGS.input, dtype=str, delimiter=\",\")\n    data = data[:, FLAGS.num_gpu * 10 : (FLAGS.num_gpu + 1) * 10]\n    num = len(data[0])\n    batch_size = FLAGS.batch_size\n    num_loops = num / batch_size\n    assert num % batch_size == 0\n\n    with tf.device(\"/gpu:0\"):\n        tfconf = tf.ConfigProto(allow_soft_placement=True)\n        with tf.Session(config=tfconf) as sess:\n            # set up the attack class\n            attack = Attack(\n                sess,\n                batch_size=batch_size,\n                lr_stage1=FLAGS.lr_stage1,\n                lr_stage2=FLAGS.lr_stage2,\n                num_iter_stage1=FLAGS.num_iter_stage1,\n                num_iter_stage2=FLAGS.num_iter_stage2,\n            )\n\n            for l in range(num_loops):\n                data_sub = data[:, l * batch_size : (l + 1) * batch_size]\n\n                # stage 1\n                # all the output are numpy arrays\n                (\n                    audios,\n                    trans,\n                    th_batch,\n                    psd_max_batch,\n                    maxlen,\n                    sample_rate,\n                    masks,\n                    masks_freq,\n                    lengths,\n                ) = ReadFromWav(data_sub, batch_size)\n                adv_example = attack.attack_stage1(\n                    audios,\n                    trans,\n                    th_batch,\n                    psd_max_batch,\n                    maxlen,\n                    sample_rate,\n                    masks,\n                    masks_freq,\n                    l,\n                    data_sub,\n                    FLAGS.lr_stage2,\n                )\n\n                # save the adversarial examples in stage 1\n                for i in range(batch_size):\n                    print(\n                        \"Final distortion for stage 1\",\n                        np.max(\n                            np.abs(\n                                adv_example[i][: lengths[i]] - audios[i, : lengths[i]]\n                            )\n                        ),\n                    )\n                    name, _ = data_sub[0, i].split(\".\")\n                    saved_name = FLAGS.root_dir + str(name) + \"_stage1.wav\"\n                    adv_example_float = adv_example[i] / 32768.0\n                    wav.write(\n                        saved_name, 16000, np.array(adv_example_float[: lengths[i]])\n                    )\n                    print(saved_name)\n\n                # stage 2\n                # read the adversarial examples saved in stage 1\n                adv = np.zeros([batch_size, FLAGS.max_length_dataset])\n                adv[:, :maxlen] = adv_example - audios\n\n                adv_example, loss_th, final_alpha = attack.attack_stage2(\n                    audios,\n                    trans,\n                    adv,\n                    th_batch,\n                    psd_max_batch,\n                    maxlen,\n                    sample_rate,\n                    masks,\n                    masks_freq,\n                    l,\n                    data_sub,\n                    FLAGS.lr_stage2,\n                )\n\n                # save the adversarial examples in stage 2\n                for i in range(batch_size):\n                    print(\"example: {}\".format(i))\n                    print(\n                        \"Final distortion for stage 2: {}, final alpha is {}, final loss_th is {}\".format(\n                            np.max(\n                                np.abs(\n                                    adv_example[i][: lengths[i]]\n                                    - audios[i, : lengths[i]]\n                                )\n                            ),\n                            final_alpha[i],\n                            loss_th[i],\n                        )\n                    )\n\n                    name, _ = data_sub[0, i].split(\".\")\n                    saved_name = FLAGS.root_dir + str(name) + \"_stage2.wav\"\n                    adv_example[i] = adv_example[i] / 32768.0\n                    wav.write(saved_name, 16000, np.array(adv_example[i][: lengths[i]]))\n                    print(saved_name)\n\n\nif __name__ == \"__main__\":\n    app.run(main)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/generate_masking_threshold.py",
    "content": "import scipy.io.wavfile as wav\nimport numpy as np\nfrom scipy.fftpack import fft\nfrom scipy.fftpack import ifft\nfrom scipy import signal\nimport scipy\nimport librosa\n\n\ndef compute_PSD_matrix(audio, window_size):\n    \"\"\"\n    First, perform STFT.\n    Then, compute the PSD.\n    Last, normalize PSD.\n    \"\"\"\n\n    win = np.sqrt(8.0 / 3.0) * librosa.core.stft(audio, center=False)\n    z = abs(win / window_size)\n    psd_max = np.max(z * z)\n    psd = 10 * np.log10(z * z + 0.0000000000000000001)\n    PSD = 96 - np.max(psd) + psd\n    return PSD, psd_max\n\n\ndef Bark(f):\n    \"\"\"returns the bark-scale value for input frequency f (in Hz)\"\"\"\n    return 13 * np.arctan(0.00076 * f) + 3.5 * np.arctan(pow(f / 7500.0, 2))\n\n\ndef quiet(f):\n    \"\"\"returns threshold in quiet measured in SPL at frequency f with an offset 12(in Hz)\"\"\"\n    thresh = (\n        3.64 * pow(f * 0.001, -0.8)\n        - 6.5 * np.exp(-0.6 * pow(0.001 * f - 3.3, 2))\n        + 0.001 * pow(0.001 * f, 4)\n        - 12\n    )\n    return thresh\n\n\ndef two_slops(bark_psd, delta_TM, bark_maskee):\n    \"\"\"\n    returns the masking threshold for each masker using two slopes as the spread function\n    \"\"\"\n    Ts = []\n    for tone_mask in range(bark_psd.shape[0]):\n        bark_masker = bark_psd[tone_mask, 0]\n        dz = bark_maskee - bark_masker\n        zero_index = np.argmax(dz > 0)\n        sf = np.zeros(len(dz))\n        sf[:zero_index] = 27 * dz[:zero_index]\n        sf[zero_index:] = (-27 + 0.37 * max(bark_psd[tone_mask, 1] - 40, 0)) * dz[\n            zero_index:\n        ]\n        T = bark_psd[tone_mask, 1] + delta_TM[tone_mask] + sf\n        Ts.append(T)\n    return Ts\n\n\ndef compute_th(PSD, barks, ATH, freqs):\n    \"\"\"returns the global masking threshold\"\"\"\n    # Identification of tonal maskers\n    # find the index of maskers that are the local maxima\n    length = len(PSD)\n    masker_index = signal.argrelextrema(PSD, np.greater)[0]\n\n    # delete the boundary of maskers for smoothing\n    if 0 in masker_index:\n        masker_index = np.delete(0)\n    if length - 1 in masker_index:\n        masker_index = np.delete(length - 1)\n    num_local_max = len(masker_index)\n\n    # treat all the maskers as tonal (conservative way)\n    # smooth the PSD\n    p_k = pow(10, PSD[masker_index] / 10.0)\n    p_k_prev = pow(10, PSD[masker_index - 1] / 10.0)\n    p_k_post = pow(10, PSD[masker_index + 1] / 10.0)\n    P_TM = 10 * np.log10(p_k_prev + p_k + p_k_post)\n\n    # bark_psd: the first column bark, the second column: P_TM, the third column: the index of points\n    _BARK = 0\n    _PSD = 1\n    _INDEX = 2\n    bark_psd = np.zeros([num_local_max, 3])\n    bark_psd[:, _BARK] = barks[masker_index]\n    bark_psd[:, _PSD] = P_TM\n    bark_psd[:, _INDEX] = masker_index\n\n    # delete the masker that doesn't have the highest PSD within 0.5 Bark around its frequency\n    for i in range(num_local_max):\n        next = i + 1\n        if next >= bark_psd.shape[0]:\n            break\n\n        while bark_psd[next, _BARK] - bark_psd[i, _BARK] < 0.5:\n            # masker must be higher than quiet threshold\n            if quiet(freqs[int(bark_psd[i, _INDEX])]) > bark_psd[i, _PSD]:\n                bark_psd = np.delete(bark_psd, (i), axis=0)\n            if next == bark_psd.shape[0]:\n                break\n\n            if bark_psd[i, _PSD] < bark_psd[next, _PSD]:\n                bark_psd = np.delete(bark_psd, (i), axis=0)\n            else:\n                bark_psd = np.delete(bark_psd, (next), axis=0)\n            if next == bark_psd.shape[0]:\n                break\n\n    # compute the individual masking threshold\n    delta_TM = 1 * (-6.025 - 0.275 * bark_psd[:, 0])\n    Ts = two_slops(bark_psd, delta_TM, barks)\n    Ts = np.array(Ts)\n\n    # compute the global masking threshold\n    theta_x = np.sum(pow(10, Ts / 10.0), axis=0) + pow(10, ATH / 10.0)\n\n    return theta_x\n\n\ndef generate_th(audio, fs, window_size=2048):\n    \"\"\"\n    returns the masking threshold theta_xs and the max psd of the audio\n    \"\"\"\n    PSD, psd_max = compute_PSD_matrix(audio, window_size)\n    freqs = librosa.core.fft_frequencies(fs, window_size)\n    barks = Bark(freqs)\n\n    # compute the quiet threshold\n    ATH = np.zeros(len(barks)) - np.inf\n    bark_ind = np.argmax(barks > 1)\n    ATH[bark_ind:] = quiet(freqs[bark_ind:])\n\n    # compute the global masking threshold theta_xs\n    theta_xs = []\n    # compute the global masking threshold in each window\n    for i in range(PSD.shape[1]):\n        theta_xs.append(compute_th(PSD[:, i], barks, ATH, freqs))\n    theta_xs = np.array(theta_xs)\n    return theta_xs, psd_max\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/generate_robust_adv.py",
    "content": "import tensorflow as tf\nfrom lingvo import model_imports\nfrom lingvo import model_registry\nimport numpy as np\nimport scipy.io.wavfile as wav\nimport generate_masking_threshold as generate_mask\nfrom tool import create_features, create_inputs, create_speech_rir\nimport time\nfrom lingvo.core import cluster_factory\nfrom absl import flags\nfrom absl import app\nimport random\n\n# data directory\nflags.DEFINE_string(\"root_dir\", \"./\", \"location of Librispeech\")\nflags.DEFINE_string(\n    \"input\",\n    \"read_data.txt\",\n    \"the text file saved the dir of audios and the corresponding original and targeted transcriptions\",\n)\nflags.DEFINE_string(\n    \"rir_dir\",\n    \"LibriSpeech/test-clean/3575/170457/3575-170457-0013\",\n    \"directory of generated room reverberations\",\n)\n\n# data processing\nflags.DEFINE_integer(\n    \"max_length_dataset\",\n    \"223200\",\n    \"the length of the longest audio in the whole dataset\",\n)\nflags.DEFINE_float(\n    \"initial_bound\", \"2000.\", \"initial l infinity norm for adversarial perturbation\"\n)\nflags.DEFINE_integer(\n    \"num_rir\", \"1000\", \"number of room reverberations used in training\"\n)\nflags.DEFINE_integer(\n    \"num_counter\", \"2\", \"the initial number of required successful rooms\"\n)\nflags.DEFINE_integer(\"num_rooms\", \"10\", \"the initial number of rooms to test\")\nflags.DEFINE_integer(\n    \"max_delta\", \"300\", \"the max delta added to the max l infinity norm\"\n)\n\n# training parameters\nflags.DEFINE_string(\"checkpoint\", \"./model/ckpt-00908156\", \"location of checkpoint\")\nflags.DEFINE_integer(\"batch_size\", \"5\", \"batch size\")\nflags.DEFINE_float(\"lr_stage1\", \"50\", \"learning_rate for stage 1\")\nflags.DEFINE_float(\"lr_stage2\", \"5\", \"learning_rate for stage 2\")\nflags.DEFINE_integer(\"num_iter_stage1\", \"2000\", \"number of iterations in stage 1\")\nflags.DEFINE_integer(\"num_iter_stage2\", \"4000\", \"number of iterations in stage 2\")\nflags.DEFINE_integer(\"num_gpu\", \"0\", \"which gpu to run\")\n\n\nFLAGS = flags.FLAGS\n\n\ndef ReadFromWav(data, batch_size):\n    \"\"\"\n    Returns:\n        audios_np: a numpy array of size (batch_size, max_length) in float\n        trans: a numpy array includes the targeted transcriptions (batch_size, )\n        max_length: the max length of the batch of audios\n        sample_rate_np: a numpy array\n        masks: a numpy array of size (batch_size, max_length)\n        masks_freq: a numpy array of size (batch_size, max_length_freq, 80)\n        lengths: a list of the length of original audios\n    \"\"\"\n    audios = []\n    lengths = []\n\n    # read the .wav file\n    for i in range(batch_size):\n        sample_rate_np, audio_temp = wav.read(FLAGS.root_dir + str(data[0, i]))\n        # read the wav form range from [-32767, 32768] or [-1, 1]\n        if max(audio_temp) < 1:\n            audio_np = audio_temp * 32768\n        else:\n            audio_np = audio_temp\n\n        length = len(audio_np)\n\n        audios.append(audio_np)\n        lengths.append(length)\n\n    max_length = max(lengths)\n\n    # pad the input audio\n    audios_np = np.zeros([batch_size, max_length])\n    masks = np.zeros([batch_size, max_length])\n    lengths_freq = (np.array(lengths) // 2 + 1) // 240 * 3\n    max_length_freq = max(lengths_freq)\n    masks_freq = np.zeros([batch_size, max_length_freq, 80])\n    for i in range(batch_size):\n        audio_float = audios[i].astype(float)\n        audios_np[i, : lengths[i]] = audio_float\n        masks[i, : lengths[i]] = 1\n        masks_freq[i, : lengths_freq[i], :] = 1\n\n    # read the transcription\n    trans = data[2, :]\n    lengths = np.array(lengths).astype(np.int32)\n\n    return audios_np, trans, max_length, sample_rate_np, masks, masks_freq, lengths\n\n\ndef Readrir():\n    \"\"\"\n    Return:\n        rir: a numpy array of the room reverberation\n\n    \"\"\"\n    index = random.randint(1, FLAGS.num_rir)\n    _, rir = wav.read(FLAGS.root_dir + FLAGS.rir_dir + \"_rir_\" + str(index) + \".wav\")\n    return rir\n\n\nclass Attack:\n    def __init__(\n        self,\n        sess,\n        batch_size=1,\n        lr_stage1=100,\n        lr_stage2=0.1,\n        num_iter_stage1=1000,\n        num_iter_stage2=4000,\n        th=None,\n        psd_max_ori=None,\n    ):\n\n        self.sess = sess\n        self.num_iter_stage1 = num_iter_stage1\n        self.num_iter_stage2 = num_iter_stage2\n        self.batch_size = batch_size\n        self.lr_stage1 = lr_stage1\n        self.lr_stage2 = lr_stage2\n\n        tf.set_random_seed(1234)\n        params = model_registry.GetParams(\"asr.librispeech.Librispeech960Wpm\", \"Test\")\n        params.random_seed = 1234\n        params.is_eval = True\n        params.cluster.worker.gpus_per_replica = 1\n        cluster = cluster_factory.Cluster(params.cluster)\n        with cluster, tf.device(cluster.GetPlacer()):\n            model = params.cls(params)\n            self.delta_large = tf.Variable(\n                np.zeros((batch_size, FLAGS.max_length_dataset), dtype=np.float32),\n                name=\"qq_delta\",\n            )\n\n            # placeholders\n            self.input_tf = tf.placeholder(\n                tf.float32, shape=[batch_size, None], name=\"qq_input\"\n            )\n            self.tgt_tf = tf.placeholder(tf.string)\n            self.rir = tf.placeholder(tf.float32)\n\n            self.sample_rate_tf = tf.placeholder(tf.int32, name=\"qq_sample_rate\")\n            self.mask = tf.placeholder(\n                dtype=np.float32, shape=[batch_size, None], name=\"qq_mask\"\n            )\n            self.mask_freq = tf.placeholder(\n                dtype=np.float32, shape=[batch_size, None, 80]\n            )\n            self.noise = tf.placeholder(\n                np.float32, shape=[batch_size, None], name=\"qq_noise\"\n            )\n            self.maxlen = tf.placeholder(np.int32)\n            self.lr = tf.placeholder(np.float32)\n            self.lengths = tf.placeholder(\n                np.int32,\n                shape=[\n                    batch_size,\n                ],\n            )\n\n            # variable\n            self.rescale = tf.Variable(\n                np.ones((batch_size, 1), dtype=np.float32) * FLAGS.initial_bound,\n                name=\"qq_rescale\",\n            )\n\n            # extract the delta\n            self.delta = tf.slice(\n                tf.identity(self.delta_large), [0, 0], [batch_size, self.maxlen]\n            )\n            self.apply_delta = tf.clip_by_value(self.delta, -self.rescale, self.rescale)\n            self.before_rir = tf.clip_by_value(\n                self.apply_delta * self.mask + self.input_tf, -(2 ** 15), 2 ** 15 - 1\n            )\n            self.new_input = (\n                create_speech_rir(\n                    self.before_rir,\n                    self.rir,\n                    self.lengths,\n                    self.maxlen,\n                    self.batch_size,\n                )\n                * self.mask\n            )\n            self.pass_in = tf.clip_by_value(\n                self.new_input + self.noise, -(2 ** 15), 2 ** 15 - 1\n            )\n\n            # generate the inputs that are needed for the lingvo model\n            self.features = create_features(\n                self.pass_in, self.sample_rate_tf, self.mask_freq\n            )\n            self.inputs = create_inputs(\n                model, self.features, self.tgt_tf, self.batch_size, self.mask_freq\n            )\n\n            task = model.GetTask()\n            metrics = task.FPropDefaultTheta(self.inputs)\n\n            # self.celoss with the shape (batch_size)\n            self.celoss = tf.get_collection(\"per_loss\")[0]\n            self.decoded = task.Decode(self.inputs)\n\n        self.optimizer1 = tf.train.AdamOptimizer(self.lr)\n        grad1, var1 = self.optimizer1.compute_gradients(\n            self.celoss, [self.delta_large]\n        )[0]\n        self.train1 = self.optimizer1.apply_gradients([(tf.sign(grad1), var1)])\n\n    def attack_stage1(\n        self,\n        audios,\n        trans,\n        maxlen,\n        sample_rate,\n        masks,\n        masks_freq,\n        num_loop,\n        data,\n        lengths,\n    ):\n        \"\"\"\n        The first stage saves the adversarial examples that can successfully attack one room\n        \"\"\"\n\n        sess = self.sess\n        # initialize and load the pretrained model\n        sess.run(tf.initializers.global_variables())\n        saver = tf.train.Saver(\n            [x for x in tf.global_variables() if x.name.startswith(\"librispeech\")]\n        )\n        saver.restore(sess, FLAGS.checkpoint)\n\n        # reassign the variables\n        sess.run(\n            tf.assign(\n                self.rescale,\n                np.ones((self.batch_size, 1), dtype=np.float32) * FLAGS.initial_bound,\n            )\n        )\n        sess.run(\n            tf.assign(\n                self.delta_large,\n                np.zeros((self.batch_size, FLAGS.max_length_dataset), dtype=np.float32),\n            )\n        )\n\n        noise = np.zeros(audios.shape)\n        rir = Readrir()\n        feed_dict = {\n            self.input_tf: audios,\n            self.tgt_tf: trans,\n            self.sample_rate_tf: sample_rate,\n            self.mask: masks,\n            self.mask_freq: masks_freq,\n            self.noise: noise,\n            self.maxlen: maxlen,\n            self.lengths: lengths,\n            self.rir: rir,\n            self.lr: self.lr_stage1,\n        }\n        losses, predictions = sess.run((self.celoss, self.decoded), feed_dict)\n\n        # show the initial predictions\n        for i in range(self.batch_size):\n            print(\n                \"example: {}, loss: {}\".format(\n                    num_loop * self.batch_size + i, losses[i]\n                )\n            )\n            print(\"pred:{}\".format(predictions[\"topk_decoded\"][i, 0]))\n            print(\"targ:{}\".format(trans[i].lower()))\n            print(\"true: {}\".format(data[1, i].lower()))\n\n        # We'll make a bunch of iterations of gradient descent here\n        now = time.time()\n        MAX = self.num_iter_stage1\n        loss_th = [np.inf] * self.batch_size\n        final_adv = [None] * self.batch_size\n        final_perturb = [None] * self.batch_size\n        clock = 0\n\n        for i in range(1, MAX + 1):\n            now = time.time()\n\n            rir = Readrir()\n            feed_dict = {\n                self.input_tf: audios,\n                self.tgt_tf: trans,\n                self.sample_rate_tf: sample_rate,\n                self.mask: masks,\n                self.mask_freq: masks_freq,\n                self.noise: noise,\n                self.maxlen: maxlen,\n                self.lengths: lengths,\n                self.rir: rir,\n                self.lr: self.lr_stage1,\n            }\n            losses, predictions = sess.run((self.celoss, self.decoded), feed_dict)\n\n            # Actually do the optimization\n            sess.run(self.train1, feed_dict)\n            if i % 10 == 0:\n                d, apply_delta, cl, predictions, new_input = sess.run(\n                    (\n                        self.delta,\n                        self.apply_delta,\n                        self.celoss,\n                        self.decoded,\n                        self.new_input,\n                    ),\n                    feed_dict,\n                )\n\n            for ii in range(self.batch_size):\n                if i % 100 == 0:\n                    print(\"example: {}\".format(num_loop * self.batch_size + ii))\n                    print(\"iteration: {}. loss {}\".format(i, cl[ii]))\n                    print(\"pred:{}\".format(predictions[\"topk_decoded\"][ii, 0]))\n                    print(\"targ:{}\".format(trans[ii].lower()))\n\n                if i % 10 == 0:\n                    if predictions[\"topk_decoded\"][ii, 0] == trans[ii].lower():\n                        print(\n                            \"-------------------------------True--------------------------\"\n                        )\n                        rescale = sess.run(self.rescale)\n                        # update rescale\n                        if i % 10 == 0:\n                            if rescale[ii] > np.max(np.abs(d[ii])):\n                                rescale[ii] = np.max(np.abs(d[ii]))\n                            rescale[ii] *= 0.8\n                            print(\n                                \"Iteration i=%d, worked ii=%d celoss=%f bound=%f\"\n                                % (i, ii, cl[ii], rescale[ii])\n                            )\n                            sess.run(tf.assign(self.rescale, rescale))\n\n                        # save the best adversarial example\n                        final_adv[ii] = new_input[ii]\n                        final_perturb[ii] = apply_delta[ii]\n                        print(\n                            \"Stage 1: save the example at iteration i=%d example ii=%d celoss=%f bound=%f\"\n                            % (i, ii, cl[ii], rescale[ii])\n                        )\n\n                # in case no final_delta return\n                if i == MAX - 1 and final_adv[ii] is None:\n                    final_adv[ii] = new_input[ii]\n                    final_perturb[ii] = apply_delta[ii]\n\n            if i % 10 == 0:\n                print(\"ten iterations take around {} \".format(clock))\n                clock = 0\n\n            clock += time.time() - now\n\n        return final_adv, final_perturb\n\n    def attack_stage2(\n        self,\n        audios,\n        trans,\n        adv,\n        rescales,\n        maxlen,\n        sample_rate,\n        masks,\n        masks_freq,\n        num_loop,\n        data,\n        lengths,\n    ):\n        sess = self.sess\n        # initialize and load the pretrained model\n        sess.run(tf.initializers.global_variables())\n        saver = tf.train.Saver(\n            [x for x in tf.global_variables() if x.name.startswith(\"librispeech\")]\n        )\n        saver.restore(sess, FLAGS.checkpoint)\n\n        # reassign the variables\n        sess.run(tf.assign(self.delta_large, adv))\n        sess.run(tf.assign(self.rescale, rescales))\n\n        noise = np.zeros(audios.shape)\n        rir = Readrir()\n        feed_dict = {\n            self.input_tf: audios,\n            self.tgt_tf: trans,\n            self.sample_rate_tf: sample_rate,\n            self.mask: masks,\n            self.mask_freq: masks_freq,\n            self.noise: noise,\n            self.maxlen: maxlen,\n            self.lengths: lengths,\n            self.rir: rir,\n            self.lr: self.lr_stage2,\n        }\n        losses, predictions = sess.run((self.celoss, self.decoded), feed_dict)\n\n        # show the initial predictions\n        for i in range(self.batch_size):\n            print(\n                \"example: {}, loss: {}\".format(\n                    num_loop * self.batch_size + i, losses[i]\n                )\n            )\n            print(\"pred:{}\".format(predictions[\"topk_decoded\"][i, 0]))\n            print(\"targ:{}\".format(trans[i].lower()))\n            print(\"true: {}\".format(data[1, i].lower()))\n\n        # We'll make a bunch of iterations of gradient descent here\n        now = time.time()\n        MAX = self.num_iter_stage2\n        loss_th = [np.inf] * self.batch_size\n        final_adv = [None] * self.batch_size\n        final_perturb = [None] * self.batch_size\n        num_counters = [FLAGS.num_counter] * self.batch_size\n        num_rooms = [FLAGS.num_rooms] * self.batch_size\n        clock = 0\n\n        for i in range(1, MAX + 1):\n            now = time.time()\n\n            rir = Readrir()\n            feed_dict = {\n                self.input_tf: audios,\n                self.tgt_tf: trans,\n                self.sample_rate_tf: sample_rate,\n                self.mask: masks,\n                self.mask_freq: masks_freq,\n                self.noise: noise,\n                self.maxlen: maxlen,\n                self.lengths: lengths,\n                self.rir: rir,\n                self.lr: self.lr_stage2,\n            }\n            losses, predictions = sess.run((self.celoss, self.decoded), feed_dict)\n\n            # Actually do the optimization\n            sess.run(self.train1, feed_dict)\n            if i % 10 == 0:\n                d, apply_delta, cl, predictions, new_input = sess.run(\n                    (\n                        self.delta,\n                        self.apply_delta,\n                        self.celoss,\n                        self.decoded,\n                        self.new_input,\n                    ),\n                    feed_dict,\n                )\n\n            for ii in range(self.batch_size):\n                if i % 100 == 0:\n                    print(\"example: {}\".format(num_loop * self.batch_size + ii))\n                    print(\"iteration: {}. loss {}\".format(i, cl[ii]))\n                    print(\"pred:{}\".format(predictions[\"topk_decoded\"][ii, 0]))\n                    print(\"targ:{}\".format(trans[ii].lower()))\n\n                sum_counter = 0\n                if i % 10 == 0:\n                    for counter in range(num_rooms[ii]):\n                        if predictions[\"topk_decoded\"][ii, 0] == trans[ii].lower():\n                            sum_counter += 1\n                            print(\"succeed %d times for example %d\" % (sum_counter, ii))\n                            rir = Readrir()\n                            feed_dict = {\n                                self.input_tf: audios,\n                                self.tgt_tf: trans,\n                                self.sample_rate_tf: sample_rate,\n                                self.mask: masks,\n                                self.mask_freq: masks_freq,\n                                self.noise: noise,\n                                self.maxlen: maxlen,\n                                self.lengths: lengths,\n                                self.rir: rir,\n                                self.lr: self.lr_stage2,\n                            }\n                            predictions = sess.run(self.decoded, feed_dict)\n\n                        if sum_counter == num_counters[ii]:\n                            print(\n                                \"-------------------------------True--------------------------\"\n                            )\n                            print(\n                                \" The num_counter is %d for example %d\"\n                                % (num_counters[ii], ii)\n                            )\n                            num_counters[ii] += 1\n                            if num_counters[ii] > num_rooms[ii]:\n                                num_rooms[ii] += 1\n                            # save the best adversarial example\n                            final_adv[ii] = new_input[ii]\n                            final_perturb[ii] = apply_delta[ii]\n                            print(\n                                \"Stage 2: save the example at iteration i=%d example ii=%d celoss=%f\"\n                                % (i, ii, cl[ii])\n                            )\n\n                # in case no final_delta return\n                if i == MAX - 1 and final_adv[ii] is None:\n                    final_adv[ii] = new_input[ii]\n                    final_perturb[ii] = apply_delta[ii]\n\n            if i % 10 == 0:\n                print(\"ten iterations take around {} \".format(clock))\n                clock = 0\n            clock += time.time() - now\n\n        return final_adv, final_perturb\n\n\ndef main(argv):\n    data = np.loadtxt(FLAGS.input, dtype=str, delimiter=\",\")\n    data = data[:, FLAGS.num_gpu * 10 : (FLAGS.num_gpu + 1) * 10]\n    num = len(data[0])\n    batch_size = FLAGS.batch_size\n    num_loops = num / batch_size\n    assert num % batch_size == 0\n\n    with tf.device(\"/gpu:0\"):\n        tfconf = tf.ConfigProto(allow_soft_placement=True)\n        with tf.Session(config=tfconf) as sess:\n            # set up the attack class\n            attack = Attack(\n                sess,\n                batch_size=batch_size,\n                lr_stage1=FLAGS.lr_stage1,\n                lr_stage2=FLAGS.lr_stage2,\n                num_iter_stage1=FLAGS.num_iter_stage1,\n                num_iter_stage2=FLAGS.num_iter_stage2,\n            )\n\n            for l in range(num_loops):\n                data_sub = data[:, l * batch_size : (l + 1) * batch_size]\n\n                # stage 1\n                # all the output are numpy arrays\n                (\n                    audios,\n                    trans,\n                    maxlen,\n                    sample_rate,\n                    masks,\n                    masks_freq,\n                    lengths,\n                ) = ReadFromWav(data_sub, batch_size)\n                adv_example, perturb = attack.attack_stage1(\n                    audios,\n                    trans,\n                    maxlen,\n                    sample_rate,\n                    masks,\n                    masks_freq,\n                    l,\n                    data_sub,\n                    lengths,\n                )\n\n                # save the adversarial examples in stage 1 that can only successfully attack one simulated room\n                for i in range(batch_size):\n                    print(\n                        \"Final distortion for stage 1\",\n                        np.max(\n                            np.abs(\n                                adv_example[i][: lengths[i]] - audios[i, : lengths[i]]\n                            )\n                        ),\n                    )\n                    name, _ = data_sub[0, i].split(\".\")\n                    saved_name = (\n                        FLAGS.root_dir + str(name) + \"_robust_speechrir_stage1.wav\"\n                    )\n                    adv_example_float = adv_example[i] / 32768.0\n                    wav.write(\n                        saved_name,\n                        16000,\n                        np.array(\n                            np.clip(\n                                adv_example_float[: lengths[i]], -(2 ** 15), 2 ** 15 - 1\n                            )\n                        ),\n                    )\n\n                    saved_name = (\n                        FLAGS.root_dir + str(name) + \"_robust_perturb_stage1.wav\"\n                    )\n                    perturb_float = perturb[i] / 32768.0\n                    wav.write(\n                        saved_name,\n                        16000,\n                        np.array(\n                            np.clip(\n                                perturb_float[: lengths[i]], -(2 ** 15), 2 ** 15 - 1\n                            )\n                        ),\n                    )\n                    print(saved_name)\n\n                # stage 2\n                # read the adversarial examples saved in stage 1\n                adv = np.zeros([batch_size, FLAGS.max_length_dataset])\n                adv[:, :maxlen] = adv_example - audios\n                rescales = np.max(np.abs(adv), axis=1) + FLAGS.max_delta\n                rescales = np.expand_dims(rescales, axis=1)\n\n                (\n                    audios,\n                    trans,\n                    maxlen,\n                    sample_rate,\n                    masks,\n                    masks_freq,\n                    lengths,\n                ) = ReadFromWav(data_sub, batch_size)\n                adv_example, perturb = attack.attack_stage2(\n                    audios,\n                    trans,\n                    adv,\n                    rescales,\n                    maxlen,\n                    sample_rate,\n                    masks,\n                    masks_freq,\n                    l,\n                    data_sub,\n                    lengths,\n                )\n\n                # save the adversarial examples in stage 2 that can successfully attack a set of simulated rooms\n                for i in range(batch_size):\n                    print(\n                        \"Final distortion for stage 2\",\n                        np.max(\n                            np.abs(\n                                adv_example[i][: lengths[i]] - audios[i, : lengths[i]]\n                            )\n                        ),\n                    )\n                    name, _ = data_sub[0, i].split(\".\")\n                    saved_name = (\n                        FLAGS.root_dir + str(name) + \"_robust_speechrir_stage2.wav\"\n                    )\n                    adv_example_float = adv_example[i] / 32768.0\n                    wav.write(\n                        saved_name,\n                        16000,\n                        np.array(\n                            np.clip(\n                                adv_example_float[: lengths[i]], -(2 ** 15), 2 ** 15 - 1\n                            )\n                        ),\n                    )\n\n                    saved_name = (\n                        FLAGS.root_dir + str(name) + \"_robust_perturb_stage2.wav\"\n                    )\n                    perturb_float = perturb[i] / 32768.0\n                    wav.write(\n                        saved_name,\n                        16000,\n                        np.array(\n                            np.clip(\n                                perturb_float[: lengths[i]], -(2 ** 15), 2 ** 15 - 1\n                            )\n                        ),\n                    )\n                    print(saved_name)\n\n\nif __name__ == \"__main__\":\n    app.run(main)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/model/checkpoint",
    "content": "model_checkpoint_path: \"/tmp/librispeech/log/train/ckpt-00908156\"\nall_model_checkpoint_paths: \"/tmp/librispeech/log/train/ckpt-00000000\"\nall_model_checkpoint_paths: \"/tmp/librispeech/log/train/ckpt-00000005\"\nall_model_checkpoint_paths: \"/tmp/librispeech/log/train/ckpt-00000011\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/read_data.txt",
    "content": "LibriSpeech/test-clean/3575/170457/3575-170457-0013.wav,LibriSpeech/test-clean/2961/960/2961-960-0020.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0029.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0015.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0017.wav,LibriSpeech/test-clean/8224/274381/8224-274381-0007.wav,LibriSpeech/test-clean/61/70968/61-70968-0049.wav,LibriSpeech/test-clean/61/70968/61-70968-0011.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0007.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0006.wav\nTHE MORE SHE IS ENGAGED IN HER PROPER DUTIES THE LESS LEISURE WILL SHE HAVE FOR IT EVEN AS AN ACCOMPLISHMENT AND A RECREATION,AND HENCE WE FIND THE SAME SORT OF CLUMSINESS IN THE TIMAEUS OF PLATO WHICH CHARACTERIZES THE PHILOSOPHICAL POEM OF LUCRETIUS,ALTHOUGH THE BRETHREN WITH ME ARE NOT APOSTLES LIKE MYSELF YET THEY ARE ALL OF ONE MIND WITH ME THINK WRITE AND TEACH AS I DO,HE OBTAINED THE DESIRED SPEED AND LOAD WITH A FRICTION BRAKE ALSO REGULATOR OF SPEED BUT WAITED FOR AN INDICATOR TO VERIFY IT,THERE MAY BE A SPECIFIC FEELING WHICH COULD BE CALLED THE FEELING OF PASTNESS ESPECIALLY WHERE IMMEDIATE MEMORY IS CONCERNED,BY QUICK MARCHES THROUGH THESE INACCESSIBLE MOUNTAINS THAT GENERAL FREED HIMSELF FROM THE SUPERIOR FORCES OF THE COVENANTERS,HAVE YOUR WILL CHILD IF THE BOY ALSO WILLS IT MONTFICHET ANSWERED FEELING TOO ILL TO OPPOSE ANYTHING VERY STRONGLY JUST THEN,HE GAVE WAY TO THE OTHERS VERY READILY AND RETREATED UNPERCEIVED BY THE SQUIRE AND MISTRESS FITZOOTH TO THE REAR OF THE TENT,A LITTLE CRACKED THAT IN THE POPULAR PHRASE WAS MY IMPRESSION OF THE STRANGER WHO NOW MADE HIS APPEARANCE IN THE SUPPER ROOM,THE LOG AND THE COMPASS THEREFORE WERE ABLE TO BE CALLED UPON TO DO THE WORK OF THE SEXTANT WHICH HAD BECOME UTTERLY USELESS\nOLD WILL IS A FINE FELLOW BUT POOR AND HELPLESS SINCE MISSUS ROGERS HAD HER ACCIDENT,THE WOOD FLAMED UP SPLENDIDLY UNDER THE LARGE BREWING COPPER AND IT SIGHED SO DEEPLY,I WOULD FAIN KNOW IF I AM DESTINED FOR SO GLORIOUS A CAREER CRIED THE TREE REJOICING,WE WILL GO OUT TOGETHER TO THE BOWER THERE IS A WAY DOWN TO THE COURT FROM MY WINDOW,FINALLY THE ONE PARTY WENT OFF EXULTING AND THE OTHER WAS LEFT IN DESOLATION AND WOE,SHE BLUSHED AND SMILED AND FUMBLED HIS CARD IN HER CONFUSION BEFORE SHE RAN UPSTAIRS,THE MODERN ORGANIZATION OF INDUSTRY WORKS IN THE SAME DIRECTION ALSO BY ANOTHER LINE,ISN'T HE SPLENDID CRIED JASPER IN INTENSE PRIDE SWELLING UP FATHER KNEW HOW TO DO IT,HER REGARD SHIFTED TO THE GREEN STALKS AND LEAVES AGAIN AND SHE STARTED TO MOVE AWAY,WHEN WE WERE OUT IN THE DARKNESS OF THE QUADRANGLE WE AGAIN LOOKED UP AT THE WINDOWS\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/room_simulator.py",
    "content": "import numpy as np\nimport matplotlib.pyplot as plt\nfrom scipy.io import wavfile\nfrom scipy.signal import fftconvolve\nimport pyroomacoustics as pra\nimport random\nimport pickle\n\n\ndef clip(signal, high, low):\n    \"\"\"\n    Clip a signal from above at high and from below at low.\n    \"\"\"\n    s = signal.copy()\n\n    s[np.where(s > high)] = high\n    s[np.where(s < low)] = low\n\n    return s\n\n\ndef normalize(signal, bits=None):\n    \"\"\"\n    normalize to be in a given range.\n    \"\"\"\n\n    s = signal.copy()\n    s /= np.abs(s).max()\n\n    # if one wants to scale for bits allocated\n    if bits is not None:\n        s *= 2 ** (bits - 1) - 1\n        s = clip(s, 2 ** (bits - 1) - 1, -(2 ** (bits - 1)))\n\n    return s\n\n\n# name of the rir\ndata = np.loadtxt(\"./read_data.txt\", dtype=str, delimiter=\",\")\nname = data[0, 0]\nname_sub, _ = name.split(\".\")\n\n# read one audio\nfs, signal = wavfile.read(name)\n\ntemp = 0\nroom_settings = []\n# set the number of room reverberations that you want to create\nnum_rooms = 1500\n\nfor i in range(num_rooms):\n    print(\"Saved room reverberation: \" + str(i))\n    width = random.randint(3, 5)\n    length = random.randint(4, 6)\n    height = random.randint(2, 4)\n\n    room_dim = [width, length, height]\n    x_source = random.randint(0, width * 10) / 10.0\n    y_source = random.randint(0, length * 10) / 10.0\n    z_source = random.randint(0, height * 10) / 10.0\n\n    x_mic = random.randint(0, width * 10) / 10.0\n    y_mic = random.randint(0, length * 10) / 10.0\n    z_mic = random.randint(0, height * 10) / 10.0\n\n    source = [x_source, y_source, z_source]\n    microphone = np.array([[x_mic], [y_mic], [z_mic]])\n\n    room_setting = [\n        width,\n        length,\n        height,\n        x_source,\n        y_source,\n        z_source,\n        x_mic,\n        y_mic,\n        z_mic,\n    ]\n\n    if room_setting not in room_settings:\n        temp += 1\n\n        room_settings.append(room_setting)\n        max_order = 100\n\n        # set max_order to a low value for a quick (but less accurate) RIR\n        room = pra.ShoeBox(room_dim, fs=fs, max_order=max_order, absorption=0.2)\n\n        # add source and set the signal to WAV file content\n        room.add_source(source, signal=signal)\n\n        # add two-microphone array\n        room.add_microphone_array(pra.MicrophoneArray(microphone, room.fs))\n\n        # compute image sources\n        room.image_source_model(use_libroom=True)\n\n        room.compute_rir()\n        rir = room.rir[0][0]\n\n        # save the room reverberations\n        wavfile.write(name_sub + \"_rir_\" + str(temp) + \".wav\", 16000, rir)\n\nwith open(\"room_setting.data\", \"wb\") as f:\n    pickle.dump(room_settings, f)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/test_imperceptible_adv.py",
    "content": "import tensorflow as tf\nfrom lingvo import model_imports\nfrom lingvo import model_registry\nimport numpy as np\nimport scipy.io.wavfile as wav\nimport generate_masking_threshold as generate_mask\nfrom tool import create_features, create_inputs\nimport time\nfrom lingvo.core import cluster_factory\nfrom absl import flags\nfrom absl import app\n\nflags.DEFINE_string(\n    \"input\",\n    \"read_data.txt\",\n    \"the text file saved the dir of audios and the corresponding original and targeted transcriptions\",\n)\nflags.DEFINE_integer(\"batch_size\", \"5\", \"batch_size to do the testing\")\nflags.DEFINE_string(\"checkpoint\", \"./model/ckpt-00908156\", \"location of checkpoint\")\nflags.DEFINE_string(\"stage\", \"stage2\", \"which stage to test\")\nflags.DEFINE_boolean(\"adv\", \"True\", \"to test adversarial examples or clean examples\")\n\nFLAGS = flags.FLAGS\n\n\ndef Read_input(data, batch_size):\n    \"\"\"\n    Returns:\n        audios_np: a numpy array of size (batch_size, max_length) in float\n        sample_rate: a numpy array\n        trans: an array includes the targeted transcriptions (batch_size,)\n        masks_freq: a numpy array to mask out the padding features in frequency domain\n    \"\"\"\n    audios = []\n    lengths = []\n\n    for i in range(batch_size):\n        name, _ = data[0, i].split(\".\")\n        if FLAGS.adv:\n            sample_rate_np, audio_temp = wav.read(\n                \"./\" + str(name) + \"_\" + FLAGS.stage + \".wav\"\n            )\n        else:\n            sample_rate_np, audio_temp = wav.read(\"./\" + str(name) + \".wav\")\n\n        # read the wav form range from [-32767, 32768] or [-1, 1]\n        if max(audio_temp) < 1:\n            audio_np = audio_temp * 32768\n\n        else:\n            audio_np = audio_temp\n        length = len(audio_np)\n\n        audios.append(audio_np)\n        lengths.append(length)\n\n    max_length = max(lengths)\n    lengths_freq = (np.array(lengths) // 2 + 1) // 240 * 3\n    max_length_freq = max(lengths_freq)\n    masks_freq = np.zeros([batch_size, max_length_freq, 80])\n\n    # combine the audios into one array\n    audios_np = np.zeros([batch_size, max_length])\n\n    for i in range(batch_size):\n        audios_np[i, : lengths[i]] = audios[i]\n        masks_freq[i, : lengths_freq[i], :] = 1\n\n    audios_np = audios_np.astype(float)\n    if FLAGS.adv:\n        trans = data[2, :]\n    else:\n        trans = data[1, :]\n\n    return audios_np, sample_rate_np, trans, masks_freq\n\n\ndef main(argv):\n    data = np.loadtxt(FLAGS.input, dtype=str, delimiter=\",\")\n    # calculate the number of loops to run the test\n    num = len(data[0])\n    batch_size = FLAGS.batch_size\n    num_loops = num / batch_size\n    assert num % batch_size == 0\n\n    with tf.device(\"/gpu:0\"):\n        tf.set_random_seed(1234)\n        tfconf = tf.ConfigProto(allow_soft_placement=True)\n        with tf.Session(config=tfconf) as sess:\n            params = model_registry.GetParams(\n                \"asr.librispeech.Librispeech960Wpm\", \"Test\"\n            )\n            params.cluster.worker.gpus_per_replica = 1\n            cluster = cluster_factory.Cluster(params.cluster)\n            with cluster, tf.device(cluster.GetPlacer()):\n                params.vn.global_vn = False\n                params.random_seed = 1234\n                params.is_eval = True\n                model = params.cls(params)\n                task = model.GetTask()\n                saver = tf.train.Saver()\n                saver.restore(sess, FLAGS.checkpoint)\n\n                # define the placeholders\n                input_tf = tf.placeholder(tf.float32, shape=[batch_size, None])\n                tgt_tf = tf.placeholder(tf.string)\n                sample_rate_tf = tf.placeholder(tf.int32)\n                mask_tf = tf.placeholder(tf.float32, shape=[batch_size, None, 80])\n\n                # generate the features and inputs\n                features = create_features(input_tf, sample_rate_tf, mask_tf)\n                shape = tf.shape(features)\n                inputs = create_inputs(model, features, tgt_tf, batch_size, mask_tf)\n\n                # loss\n                metrics = task.FPropDefaultTheta(inputs)\n                loss = tf.get_collection(\"per_loss\")[0]\n\n                # prediction\n                decoded_outputs = task.Decode(inputs)\n                dec_metrics_dict = task.CreateDecoderMetrics()\n\n                correct = 0\n                for l in range(num_loops):\n                    data_sub = data[:, l * batch_size : (l + 1) * batch_size]\n                    audios_np, sample_rate, tgt_np, mask_freq = Read_input(\n                        data_sub, batch_size\n                    )\n                    feed_dict = {\n                        input_tf: audios_np,\n                        sample_rate_tf: sample_rate,\n                        tgt_tf: tgt_np,\n                        mask_tf: mask_freq,\n                    }\n\n                    losses = sess.run(loss, feed_dict)\n                    predictions = sess.run(decoded_outputs, feed_dict)\n\n                    task.PostProcessDecodeOut(predictions, dec_metrics_dict)\n                    wer_value = dec_metrics_dict[\"wer\"].value * 100.0\n\n                    for i in range(batch_size):\n                        print(\"pred:{}\".format(predictions[\"topk_decoded\"][i, 0]))\n                        print(\"targ:{}\".format(tgt_np[i].lower()))\n                        print(\"true: {}\".format(data_sub[1, i].lower()))\n\n                        if predictions[\"topk_decoded\"][i, 0] == tgt_np[i].lower():\n                            correct += 1\n                            print(\"------------------------------\")\n                            print(\"example {} succeeds\".format(i))\n\n                    print(\"Now, the WER is: {0:.2f}%\".format(wer_value))\n                print(\"num of examples succeed: {}\".format(correct))\n                print(\"success rate: {}%\".format(correct / float(num) * 100))\n\n\nif __name__ == \"__main__\":\n    app.run(main)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/test_robust_adv.py",
    "content": "import tensorflow as tf\nfrom lingvo import model_imports\nfrom lingvo import model_registry\nimport numpy as np\nimport scipy.io.wavfile as wav\nimport generate_masking_threshold as generate_mask\nfrom tool import create_features, create_inputs, create_speech_rir\nimport time\nfrom lingvo.core import cluster_factory\nfrom absl import flags\nfrom absl import app\n\nflags.DEFINE_string(\"root_dir\", \"./\", \"location of Librispeech\")\nflags.DEFINE_string(\n    \"input\",\n    \"read_data.txt\",\n    \"the text file saved the dir of audios and the corresponding original and targeted transcriptions\",\n)\nflags.DEFINE_string(\n    \"rir_dir\",\n    \"LibriSpeech/test-clean/3575/170457/3575-170457-0013\",\n    \"directory of generated room reverberations\",\n)\nflags.DEFINE_string(\"checkpoint\", \"./model/ckpt-00908156\", \"location of checkpoint\")\n\nflags.DEFINE_integer(\"batch_size\", \"5\", \"batch_size to do the testing\")\nflags.DEFINE_string(\"stage\", \"stage2\", \"which step to test\")\nflags.DEFINE_boolean(\"adv\", \"True\", \"to test adversarial examples or clean examples\")\nflags.DEFINE_integer(\"num_test_rooms\", \"100\", \"batch_size to do the testing\")\nflags.DEFINE_integer(\"num_train_rooms\", \"1000\", \"batch_size to do the testing\")\n\nFLAGS = flags.FLAGS\n\n\ndef Read_input(data, batch_size):\n    \"\"\"\n    Returns:\n        audios_np: a numpy array of size (batch_size, max_length) in float\n        sample_rate: a numpy array\n        trans: an array includes the targeted transcriptions (batch_size,)\n    \"\"\"\n    audios = []\n    lengths = []\n\n    for i in range(batch_size):\n        name, _ = data[0, i].split(\".\")\n\n        if FLAGS.adv:\n            sample_rate_np, delta = wav.read(\n                \"./\" + str(name) + \"_robust_perturb_\" + FLAGS.stage + \".wav\"\n            )\n            _, audio_orig = wav.read(\"./\" + str(name) + \".wav\")\n            if max(delta) < 1:\n                delta = delta * 32768\n            audio_np = audio_orig + delta\n        else:\n            sample_rate_np, audio_np = wav.read(\"./\" + str(name) + \".wav\")\n\n        length = len(audio_np)\n\n        audios.append(audio_np)\n        lengths.append(length)\n\n    max_length = max(lengths)\n    masks = np.zeros([batch_size, max_length])\n    lengths_freq = (np.array(lengths) // 2 + 1) // 240 * 3\n    max_length_freq = max(lengths_freq)\n    masks_freq = np.zeros([batch_size, max_length_freq, 80])\n\n    # combine the audios into one array\n    audios_np = np.zeros([batch_size, max_length])\n\n    for i in range(batch_size):\n        audios_np[i, : lengths[i]] = audios[i]\n        masks[i, : lengths[i]] = 1\n        masks_freq[i, : lengths_freq[i], :] = 1\n\n    audios_np = audios_np.astype(float)\n\n    if FLAGS.adv:\n        trans = data[2, :]\n    else:\n        trans = data[1, :]\n\n    lengths = np.array(lengths).astype(np.int32)\n\n    return audios_np, sample_rate_np, trans, masks_freq, lengths, max_length, masks\n\n\ndef Readrir(num_room):\n    \"\"\"\n    Return:\n        rir: a numpy array of the room reverberation\n        (make sure the test rooms are different from training rooms)\n\n    \"\"\"\n    index = num_room + FLAGS.num_train_rooms + 1\n    _, rir = wav.read(FLAGS.root_dir + FLAGS.rir_dir + \"_rir_\" + str(index) + \".wav\")\n    return rir\n\n\ndef main(argv):\n    data = np.loadtxt(FLAGS.input, dtype=str, delimiter=\",\")\n    # calculate the number of loops to run the test\n    num = len(data[0])\n    batch_size = FLAGS.batch_size\n    num_loops = num / batch_size\n    assert num % batch_size == 0\n\n    with tf.device(\"/gpu:0\"):\n        tf.set_random_seed(1234)\n        tfconf = tf.ConfigProto(allow_soft_placement=True)\n        with tf.Session(config=tfconf) as sess:\n            params = model_registry.GetParams(\n                \"asr.librispeech.Librispeech960Wpm\", \"Test\"\n            )\n            params.cluster.worker.gpus_per_replica = 1\n            cluster = cluster_factory.Cluster(params.cluster)\n            with cluster, tf.device(cluster.GetPlacer()):\n                params.vn.global_vn = False\n                params.random_seed = 1234\n                params.is_eval = True\n                model = params.cls(params)\n                task = model.GetTask()\n                saver = tf.train.Saver()\n                saver.restore(sess, FLAGS.checkpoint)\n\n                # define the placeholders\n                input_tf = tf.placeholder(tf.float32, shape=[batch_size, None])\n                tgt_tf = tf.placeholder(tf.string)\n                sample_rate_tf = tf.placeholder(tf.int32)\n                mask_tf = tf.placeholder(tf.float32, shape=[batch_size, None, 80])\n                rir_tf = tf.placeholder(tf.float32)\n                lengths = tf.placeholder(\n                    np.int32,\n                    shape=[\n                        batch_size,\n                    ],\n                )\n                maxlen = tf.placeholder(np.int32)\n                mask = tf.placeholder(dtype=np.float32, shape=[batch_size, None])\n\n                # generate the features and inputs\n                new_input = (\n                    create_speech_rir(input_tf, rir_tf, lengths, maxlen, batch_size)\n                    * mask\n                )\n                features = create_features(new_input, sample_rate_tf, mask_tf)\n                shape = tf.shape(features)\n                inputs = create_inputs(model, features, tgt_tf, batch_size, mask_tf)\n\n                # loss\n                metrics = task.FPropDefaultTheta(inputs)\n                loss = tf.get_collection(\"per_loss\")[0]\n\n                # prediction\n                decoded_outputs = task.Decode(inputs)\n                dec_metrics_dict = task.CreateDecoderMetrics()\n\n                success_rates = []\n                for num_room in range(FLAGS.num_test_rooms):\n                    correct = 0\n                    rir = Readrir(num_room)\n\n                    for l in range(num_loops):\n                        data_sub = data[:, l * batch_size : (l + 1) * batch_size]\n                        (\n                            audios_np,\n                            sample_rate,\n                            tgt_np,\n                            mask_freq,\n                            lengths_np,\n                            max_len,\n                            masks,\n                        ) = Read_input(data_sub, batch_size)\n\n                        feed_dict = {\n                            input_tf: audios_np,\n                            sample_rate_tf: sample_rate,\n                            tgt_tf: tgt_np,\n                            mask_tf: mask_freq,\n                            rir_tf: rir,\n                            lengths: lengths_np,\n                            maxlen: max_len,\n                            mask: masks,\n                        }\n\n                        losses = sess.run(loss, feed_dict)\n                        predictions = sess.run(decoded_outputs, feed_dict)\n\n                        task.PostProcessDecodeOut(predictions, dec_metrics_dict)\n                        wer_value = dec_metrics_dict[\"wer\"].value * 100.0\n\n                        for i in range(batch_size):\n                            print(\n                                \"example: {}, loss_ce: {}\".format(\n                                    l * batch_size + i, losses[i]\n                                )\n                            )\n                            print(\"pred:{}\".format(predictions[\"topk_decoded\"][i, 0]))\n                            print(\"targ:{}\".format(tgt_np[i].lower()))\n                            print(\"true: {}\".format(data_sub[1, i].lower()))\n\n                            if predictions[\"topk_decoded\"][i, 0] == tgt_np[i].lower():\n                                correct += 1\n\n                        print(\"--------------------------------\")\n                        print(\"Now, the WER is: {0:.2f}%\".format(wer_value))\n\n                    print(\n                        \"num of examples succeed for room {}: {}\".format(\n                            num_room, correct\n                        )\n                    )\n                    success_rate = correct / float(num) * 100\n                    print(\n                        \"success rate for room {}: {}%\".format(num_room, success_rate)\n                    )\n\n                    success_rates.append(success_rate)\n                success_ave = float(sum(success_rates)) / len(success_rates)\n                print(\"success rate overall: {}%\".format(success_ave))\n\n\nif __name__ == \"__main__\":\n    app.run(main)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/tool.py",
    "content": "from tensorflow.python import pywrap_tensorflow\nimport numpy as np\nimport tensorflow as tf\nfrom lingvo.core import asr_frontend\nfrom lingvo.core import py_utils\n\n\ndef _MakeLogMel(audio, sample_rate):\n    audio = tf.expand_dims(audio, axis=0)\n    static_sample_rate = 16000\n    mel_frontend = _CreateAsrFrontend()\n    with tf.control_dependencies([tf.assert_equal(sample_rate, static_sample_rate)]):\n        log_mel, _ = mel_frontend.FPropDefaultTheta(audio)\n    return log_mel\n\n\ndef _CreateAsrFrontend():\n    p = asr_frontend.MelFrontend.Params()\n    p.sample_rate = 16000.0\n    p.frame_size_ms = 25.0\n    p.frame_step_ms = 10.0\n    p.num_bins = 80\n    p.lower_edge_hertz = 125.0\n    p.upper_edge_hertz = 7600.0\n    p.preemph = 0.97\n    p.noise_scale = 0.0\n    p.pad_end = False\n    # Stack 3 frames and sub-sample by a factor of 3.\n    p.left_context = 2\n    p.output_stride = 3\n    return p.cls(p)\n\n\ndef create_features(input_tf, sample_rate_tf, mask_freq):\n    \"\"\"\n    Return:\n        A tensor of features with size (batch_size, max_time_steps, 80)\n    \"\"\"\n\n    features_list = []\n    # unstact the features with placeholder\n    input_unpack = tf.unstack(input_tf, axis=0)\n    for i in range(len(input_unpack)):\n        features = _MakeLogMel(input_unpack[i], sample_rate_tf)\n        features = tf.reshape(features, shape=[-1, 80])\n        features = tf.expand_dims(features, dim=0)\n        features_list.append(features)\n    features_tf = tf.concat(features_list, axis=0)\n    features_tf = features_tf * mask_freq\n    return features_tf\n\n\ndef create_inputs(model, features, tgt, batch_size, mask_freq):\n    tgt_ids, tgt_labels, tgt_paddings = model.GetTask().input_generator.StringsToIds(\n        tgt\n    )\n\n    # we expect src_inputs to be of shape [batch_size, num_frames, feature_dim, channels]\n    src_paddings = tf.zeros(\n        [tf.shape(features)[0], tf.shape(features)[1]], dtype=tf.float32\n    )\n    src_paddings = 1.0 - mask_freq[:, :, 0]\n    src_frames = tf.expand_dims(features, dim=-1)\n\n    inputs = py_utils.NestedMap()\n    inputs.tgt = py_utils.NestedMap(\n        ids=tgt_ids,\n        labels=tgt_labels,\n        paddings=tgt_paddings,\n        weights=1.0 - tgt_paddings,\n    )\n    inputs.src = py_utils.NestedMap(src_inputs=src_frames, paddings=src_paddings)\n    inputs.sample_ids = tf.zeros([batch_size])\n    return inputs\n\n\ndef create_speech_rir(audios, rir, lengths_audios, max_len, batch_size):\n    \"\"\"\n    Returns:\n        A tensor of speech with reverberations (Convolve the audio with the rir)\n    \"\"\"\n    speech_rir = []\n\n    for i in range(batch_size):\n        s1 = lengths_audios[i]\n        s2 = tf.convert_to_tensor(tf.shape(rir))\n        shape = s1 + s2 - 1\n\n        # Compute convolution in fourier space\n        sp1 = tf.spectral.rfft(rir, shape)\n        sp2 = tf.spectral.rfft(\n            tf.slice(\n                tf.reshape(\n                    audios[i],\n                    [\n                        -1,\n                    ],\n                ),\n                [0],\n                [lengths_audios[i]],\n            ),\n            shape,\n        )\n        ret = tf.spectral.irfft(sp1 * sp2, shape)\n\n        # normalization\n        ret /= tf.reduce_max(tf.abs(ret))\n        ret *= 2 ** (16 - 1) - 1\n        ret = tf.clip_by_value(ret, -(2 ** (16 - 1)), 2 ** (16 - 1) - 1)\n        ret = tf.pad(ret, tf.constant([[0, 100000]]))\n        ret = ret[:max_len]\n\n        speech_rir.append(tf.expand_dims(ret, axis=0))\n    speech_rirs = tf.concat(speech_rir, axis=0)\n    return speech_rirs\n\n\nclass Transform(object):\n    \"\"\"\n    Return: PSD\n    \"\"\"\n\n    def __init__(self, window_size):\n        self.scale = 8.0 / 3.0\n        self.frame_length = int(window_size)\n        self.frame_step = int(window_size // 4)\n        self.window_size = window_size\n\n    def __call__(self, x, psd_max_ori):\n        win = tf.contrib.signal.stft(x, self.frame_length, self.frame_step)\n        z = self.scale * tf.abs(win / self.window_size)\n        psd = tf.square(z)\n        PSD = tf.pow(10.0, 9.6) / tf.reshape(psd_max_ori, [-1, 1, 1]) * psd\n        return PSD\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/util/convert_name_format.sh",
    "content": "#!/bin/bash\nfor entry in \"$HOME/tf/librispeech/raw/LibriSpeech/test-clean\"/*\ndo \n  for i in \"$entry\"/*\n  do     \n    for j in \"$i\"/*.flac\n    do \n      flac -d $j \n    done\n  done\ndone\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_asr/util/read_data_full.txt",
    "content": "LibriSpeech/test-clean/3575/170457/3575-170457-0013.wav,LibriSpeech/test-clean/2961/960/2961-960-0020.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0029.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0015.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0017.wav,LibriSpeech/test-clean/8224/274381/8224-274381-0007.wav,LibriSpeech/test-clean/61/70968/61-70968-0049.wav,LibriSpeech/test-clean/61/70968/61-70968-0011.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0007.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0006.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0005.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0043.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0019.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0009.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0023.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0019.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0033.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0002.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0021.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0011.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0018.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0008.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0020.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0008.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0026.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0011.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0019.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0003.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0006.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0014.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0008.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0000.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0006.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0025.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0036.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0017.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0018.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0006.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0021.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0040.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0067.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0029.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0007.wav,LibriSpeech/test-clean/121/127105/121-127105-0026.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0010.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0014.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0001.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0016.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0023.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0024.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0004.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0027.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0000.wav,LibriSpeech/test-clean/4077/13754/4077-13754-0009.wav,LibriSpeech/test-clean/2961/961/2961-961-0014.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0025.wav,LibriSpeech/test-clean/908/31957/908-31957-0008.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0015.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0014.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0018.wav,LibriSpeech/test-clean/61/70970/61-70970-0000.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0004.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0001.wav,LibriSpeech/test-clean/1221/135766/1221-135766-0007.wav,LibriSpeech/test-clean/908/157963/908-157963-0021.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0053.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0034.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0011.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0013.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0002.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0004.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0002.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0040.wav,LibriSpeech/test-clean/237/126133/237-126133-0023.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0001.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0042.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0049.wav,LibriSpeech/test-clean/2961/961/2961-961-0001.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0010.wav,LibriSpeech/test-clean/237/126133/237-126133-0003.wav,LibriSpeech/test-clean/908/157963/908-157963-0012.wav,LibriSpeech/test-clean/908/157963/908-157963-0006.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0015.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0020.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0006.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0009.wav,LibriSpeech/test-clean/672/122797/672-122797-0055.wav,LibriSpeech/test-clean/672/122797/672-122797-0006.wav,LibriSpeech/test-clean/61/70970/61-70970-0036.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0014.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0011.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0029.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0033.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0032.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0054.wav,LibriSpeech/test-clean/2961/961/2961-961-0007.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0013.wav,LibriSpeech/test-clean/908/157963/908-157963-0023.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0025.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0008.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0024.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0011.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0005.wav,LibriSpeech/test-clean/2961/961/2961-961-0016.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0051.wav,LibriSpeech/test-clean/260/123288/260-123288-0002.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0031.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0037.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0001.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0018.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0013.wav,LibriSpeech/test-clean/260/123440/260-123440-0010.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0027.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0049.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0008.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0003.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0033.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0048.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0017.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0023.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0011.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0007.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0000.wav,LibriSpeech/test-clean/260/123440/260-123440-0019.wav,LibriSpeech/test-clean/237/134500/237-134500-0041.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0010.wav,LibriSpeech/test-clean/121/127105/121-127105-0028.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0036.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0015.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0005.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0008.wav,LibriSpeech/test-clean/2961/960/2961-960-0017.wav,LibriSpeech/test-clean/2961/960/2961-960-0004.wav,LibriSpeech/test-clean/2830/3979/2830-3979-0011.wav,LibriSpeech/test-clean/260/123286/260-123286-0028.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0016.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0025.wav,LibriSpeech/test-clean/1221/135766/1221-135766-0004.wav,LibriSpeech/test-clean/121/127105/121-127105-0002.wav,LibriSpeech/test-clean/908/31957/908-31957-0019.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0058.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0031.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0005.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0024.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0019.wav,LibriSpeech/test-clean/672/122797/672-122797-0016.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0013.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0023.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0022.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0036.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0033.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0015.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0013.wav,LibriSpeech/test-clean/8555/292519/8555-292519-0005.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0005.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0013.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0003.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0021.wav,LibriSpeech/test-clean/61/70970/61-70970-0039.wav,LibriSpeech/test-clean/61/70968/61-70968-0033.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0034.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0035.wav,LibriSpeech/test-clean/260/123286/260-123286-0026.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0005.wav,LibriSpeech/test-clean/121/127105/121-127105-0031.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0036.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0000.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0032.wav,LibriSpeech/test-clean/61/70970/61-70970-0001.wav,LibriSpeech/test-clean/61/70968/61-70968-0026.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0054.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0052.wav,LibriSpeech/test-clean/2961/961/2961-961-0008.wav,LibriSpeech/test-clean/2961/960/2961-960-0018.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0055.wav,LibriSpeech/test-clean/237/126133/237-126133-0019.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0037.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0005.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0047.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0002.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0002.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0020.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0004.wav,LibriSpeech/test-clean/908/157963/908-157963-0026.wav,LibriSpeech/test-clean/908/157963/908-157963-0020.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0028.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0059.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0044.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0018.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0006.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0000.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0029.wav,LibriSpeech/test-clean/2830/3979/2830-3979-0000.wav,LibriSpeech/test-clean/260/123286/260-123286-0006.wav,LibriSpeech/test-clean/237/126133/237-126133-0014.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0039.wav,LibriSpeech/test-clean/121/127105/121-127105-0011.wav,LibriSpeech/test-clean/121/121726/121-121726-0010.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0028.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0038.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0021.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0018.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0032.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0013.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0025.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0015.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0021.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0037.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0013.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0050.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0048.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0036.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0004.wav,LibriSpeech/test-clean/672/122797/672-122797-0038.wav,LibriSpeech/test-clean/61/70968/61-70968-0041.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0024.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0067.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0016.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0074.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0010.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0002.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0027.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0013.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0030.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0010.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0042.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0000.wav,LibriSpeech/test-clean/4077/13751/4077-13751-0001.wav,LibriSpeech/test-clean/2961/960/2961-960-0022.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0032.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0023.wav,LibriSpeech/test-clean/260/123286/260-123286-0030.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0036.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0016.wav,LibriSpeech/test-clean/121/121726/121-121726-0000.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0002.wav,LibriSpeech/test-clean/908/31957/908-31957-0009.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0041.wav,LibriSpeech/test-clean/8224/274384/8224-274384-0005.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0015.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0005.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0024.wav,LibriSpeech/test-clean/61/70970/61-70970-0037.wav,LibriSpeech/test-clean/4077/13751/4077-13751-0010.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0009.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0066.wav,LibriSpeech/test-clean/260/123286/260-123286-0027.wav,LibriSpeech/test-clean/237/134500/237-134500-0037.wav,LibriSpeech/test-clean/237/134493/237-134493-0001.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0008.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0002.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0027.wav,LibriSpeech/test-clean/8555/292519/8555-292519-0007.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0013.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0001.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0010.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0009.wav,LibriSpeech/test-clean/7021/79730/7021-79730-0005.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0020.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0042.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0001.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0023.wav,LibriSpeech/test-clean/1221/135767/1221-135767-0014.wav,LibriSpeech/test-clean/908/157963/908-157963-0025.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0039.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0044.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0002.wav,LibriSpeech/test-clean/61/70968/61-70968-0050.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0022.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0001.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0050.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0047.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0003.wav,LibriSpeech/test-clean/2961/961/2961-961-0011.wav,LibriSpeech/test-clean/2961/960/2961-960-0016.wav,LibriSpeech/test-clean/237/134493/237-134493-0004.wav,LibriSpeech/test-clean/121/127105/121-127105-0003.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0018.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0034.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0004.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0002.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0001.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0007.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0022.wav,LibriSpeech/test-clean/260/123286/260-123286-0016.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0040.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0027.wav,LibriSpeech/test-clean/121/127105/121-127105-0013.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0016.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0033.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0028.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0017.wav,LibriSpeech/test-clean/61/70970/61-70970-0021.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0051.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0016.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0029.wav,LibriSpeech/test-clean/2961/961/2961-961-0010.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0025.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0027.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0005.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0002.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0021.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0053.wav,LibriSpeech/test-clean/61/70968/61-70968-0028.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0023.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0004.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0004.wav,LibriSpeech/test-clean/4077/13754/4077-13754-0003.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0044.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0014.wav,LibriSpeech/test-clean/2961/960/2961-960-0007.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0036.wav,LibriSpeech/test-clean/260/123286/260-123286-0023.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0016.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0001.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0021.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0039.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0008.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0002.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0012.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0014.wav,LibriSpeech/test-clean/2961/960/2961-960-0015.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0056.wav,LibriSpeech/test-clean/237/134500/237-134500-0022.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0012.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0004.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0070.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0024.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0033.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0026.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0020.wav,LibriSpeech/test-clean/61/70968/61-70968-0000.wav,LibriSpeech/test-clean/5142/36586/5142-36586-0003.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0013.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0025.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0045.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0029.wav,LibriSpeech/test-clean/237/126133/237-126133-0017.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0052.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0008.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0004.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0003.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0010.wav,LibriSpeech/test-clean/61/70968/61-70968-0024.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0023.wav,LibriSpeech/test-clean/2961/960/2961-960-0001.wav,LibriSpeech/test-clean/237/134493/237-134493-0015.wav,LibriSpeech/test-clean/237/126133/237-126133-0005.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0031.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0011.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0030.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0045.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0015.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0005.wav,LibriSpeech/test-clean/61/70970/61-70970-0031.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0018.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0013.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0006.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0005.wav,LibriSpeech/test-clean/237/126133/237-126133-0010.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0031.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0005.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0032.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0020.wav,LibriSpeech/test-clean/121/127105/121-127105-0034.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0033.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0006.wav,LibriSpeech/test-clean/61/70970/61-70970-0026.wav,LibriSpeech/test-clean/61/70968/61-70968-0043.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0017.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0012.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0026.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0028.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0037.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0019.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0040.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0017.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0017.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0006.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0025.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0008.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0019.wav,LibriSpeech/test-clean/672/122797/672-122797-0072.wav,LibriSpeech/test-clean/61/70968/61-70968-0017.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0004.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0053.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0011.wav,LibriSpeech/test-clean/2961/960/2961-960-0014.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0027.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0006.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0028.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0015.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0011.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0006.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0004.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0005.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0012.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0001.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0065.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0030.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0051.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0005.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0014.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0036.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0019.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0059.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0024.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0048.wav,LibriSpeech/test-clean/2961/961/2961-961-0020.wav,LibriSpeech/test-clean/2961/961/2961-961-0015.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0039.wav,LibriSpeech/test-clean/237/134500/237-134500-0036.wav,LibriSpeech/test-clean/237/134500/237-134500-0000.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0009.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0007.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0003.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0021.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0039.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0029.wav,LibriSpeech/test-clean/672/122797/672-122797-0020.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0018.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0017.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0033.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0019.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0051.wav,LibriSpeech/test-clean/260/123286/260-123286-0003.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0038.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0023.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0020.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0042.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0020.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0010.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0030.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0020.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0020.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0028.wav,LibriSpeech/test-clean/672/122797/672-122797-0070.wav,LibriSpeech/test-clean/61/70968/61-70968-0047.wav,LibriSpeech/test-clean/61/70968/61-70968-0030.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0020.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0009.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0032.wav,LibriSpeech/test-clean/3570/5696/3570-5696-0004.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0037.wav,LibriSpeech/test-clean/260/123286/260-123286-0018.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0014.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0009.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0009.wav,LibriSpeech/test-clean/121/127105/121-127105-0005.wav,LibriSpeech/test-clean/121/123859/121-123859-0003.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0035.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0003.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0007.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0006.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0012.wav,LibriSpeech/test-clean/672/122797/672-122797-0013.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0007.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0006.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0011.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0019.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0009.wav,LibriSpeech/test-clean/2961/960/2961-960-0012.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0023.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0033.wav,LibriSpeech/test-clean/908/31957/908-31957-0024.wav,LibriSpeech/test-clean/908/31957/908-31957-0023.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0020.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0007.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0002.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0012.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0023.wav,LibriSpeech/test-clean/8224/274384/8224-274384-0000.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0005.wav,LibriSpeech/test-clean/61/70968/61-70968-0023.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0010.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0024.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0019.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0019.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0007.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0024.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0022.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0069.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0008.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0020.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0012.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0005.wav,LibriSpeech/test-clean/61/70970/61-70970-0040.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0004.wav,LibriSpeech/test-clean/260/123440/260-123440-0015.wav,LibriSpeech/test-clean/260/123288/260-123288-0027.wav,LibriSpeech/test-clean/237/134500/237-134500-0033.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0029.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0005.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0007.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0003.wav,LibriSpeech/test-clean/121/127105/121-127105-0001.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0038.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0023.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0025.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0020.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0024.wav,LibriSpeech/test-clean/672/122797/672-122797-0073.wav,LibriSpeech/test-clean/672/122797/672-122797-0012.wav,LibriSpeech/test-clean/61/70970/61-70970-0016.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0005.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0001.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0010.wav,LibriSpeech/test-clean/237/126133/237-126133-0011.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0018.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0011.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0045.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0043.wav,LibriSpeech/test-clean/908/31957/908-31957-0003.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0037.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0040.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0035.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0001.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0011.wav,LibriSpeech/test-clean/672/122797/672-122797-0061.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0011.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0003.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0012.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0035.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0043.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0001.wav,LibriSpeech/test-clean/3570/5696/3570-5696-0006.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0011.wav,LibriSpeech/test-clean/260/123286/260-123286-0009.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0039.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0029.wav,LibriSpeech/test-clean/121/127105/121-127105-0012.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0022.wav,LibriSpeech/test-clean/908/31957/908-31957-0017.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0018.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0017.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0024.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0031.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0045.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0026.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0006.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0015.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0036.wav,LibriSpeech/test-clean/61/70970/61-70970-0027.wav,LibriSpeech/test-clean/61/70970/61-70970-0013.wav,LibriSpeech/test-clean/61/70970/61-70970-0007.wav,LibriSpeech/test-clean/61/70968/61-70968-0061.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0005.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0015.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0038.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0009.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0000.wav,LibriSpeech/test-clean/237/134493/237-134493-0011.wav,LibriSpeech/test-clean/237/126133/237-126133-0022.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0049.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0024.wav,LibriSpeech/test-clean/1221/135767/1221-135767-0024.wav,LibriSpeech/test-clean/908/31957/908-31957-0014.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0013.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0014.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0012.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0022.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0014.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0000.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0016.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0004.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0040.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0031.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0009.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0008.wav,LibriSpeech/test-clean/61/70968/61-70968-0032.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0008.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0001.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0022.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0021.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0024.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0075.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0009.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0025.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0014.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0022.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0015.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0023.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0020.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0053.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0015.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0036.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0005.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0018.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0052.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0032.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0015.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0056.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0023.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0012.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0017.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0011.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0010.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0028.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0076.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0008.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0013.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0024.wav,LibriSpeech/test-clean/121/123859/121-123859-0004.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0031.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0029.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0005.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0008.wav,LibriSpeech/test-clean/7021/79759/7021-79759-0002.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0002.wav,LibriSpeech/test-clean/61/70968/61-70968-0015.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0018.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0007.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0044.wav,LibriSpeech/test-clean/5105/28233/5105-28233-0004.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0033.wav,LibriSpeech/test-clean/2830/3979/2830-3979-0006.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0021.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0042.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0044.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0007.wav,LibriSpeech/test-clean/1221/135767/1221-135767-0005.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0011.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0021.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0030.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0012.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0022.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0025.wav,LibriSpeech/test-clean/3570/5695/3570-5695-0000.wav,LibriSpeech/test-clean/260/123288/260-123288-0017.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0004.wav,LibriSpeech/test-clean/121/127105/121-127105-0006.wav,LibriSpeech/test-clean/908/31957/908-31957-0020.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0064.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0041.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0008.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0006.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0003.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0008.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0030.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0011.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0010.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0055.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0038.wav,LibriSpeech/test-clean/260/123440/260-123440-0012.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0028.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0026.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0015.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0015.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0031.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0017.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0001.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0023.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0005.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0023.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0020.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0022.wav,LibriSpeech/test-clean/672/122797/672-122797-0066.wav,LibriSpeech/test-clean/672/122797/672-122797-0007.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0005.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0017.wav,LibriSpeech/test-clean/5683/32865/5683-32865-0013.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0007.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0020.wav,LibriSpeech/test-clean/5105/28233/5105-28233-0006.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0016.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0006.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0019.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0013.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0018.wav,LibriSpeech/test-clean/237/134493/237-134493-0018.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0009.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0034.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0026.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0003.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0012.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0024.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0023.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0027.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0023.wav,LibriSpeech/test-clean/61/70970/61-70970-0018.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0007.wav,LibriSpeech/test-clean/5105/28233/5105-28233-0001.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0013.wav,LibriSpeech/test-clean/237/134500/237-134500-0002.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0029.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0002.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0004.wav,LibriSpeech/test-clean/1221/135766/1221-135766-0002.wav,LibriSpeech/test-clean/8224/274384/8224-274384-0006.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0035.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0017.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0052.wav,LibriSpeech/test-clean/61/70968/61-70968-0057.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0049.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0008.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0006.wav,LibriSpeech/test-clean/260/123440/260-123440-0016.wav,LibriSpeech/test-clean/260/123286/260-123286-0013.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0024.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0015.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0025.wav,LibriSpeech/test-clean/121/121726/121-121726-0009.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0006.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0003.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0014.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0033.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0007.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0065.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0002.wav,LibriSpeech/test-clean/4077/13754/4077-13754-0000.wav,LibriSpeech/test-clean/2961/961/2961-961-0006.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0063.wav,LibriSpeech/test-clean/237/134500/237-134500-0010.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0058.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0000.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0015.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0000.wav,LibriSpeech/test-clean/8224/274381/8224-274381-0011.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0007.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0003.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0007.wav,LibriSpeech/test-clean/4992/41806/4992-41806-0009.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0013.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0034.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0051.wav,LibriSpeech/test-clean/4077/13751/4077-13751-0017.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0021.wav,LibriSpeech/test-clean/2961/961/2961-961-0021.wav,LibriSpeech/test-clean/2961/961/2961-961-0018.wav,LibriSpeech/test-clean/237/134500/237-134500-0039.wav,LibriSpeech/test-clean/237/134493/237-134493-0014.wav,LibriSpeech/test-clean/237/134493/237-134493-0006.wav,LibriSpeech/test-clean/237/126133/237-126133-0013.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0000.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0056.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0035.wav,LibriSpeech/test-clean/121/121726/121-121726-0007.wav,LibriSpeech/test-clean/1089/134691/1089-134691-0005.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0034.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0017.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0009.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0002.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0035.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0026.wav,LibriSpeech/test-clean/61/70970/61-70970-0011.wav,LibriSpeech/test-clean/61/70968/61-70968-0019.wav,LibriSpeech/test-clean/61/70968/61-70968-0013.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0010.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0023.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0020.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0034.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0010.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0022.wav,LibriSpeech/test-clean/2961/961/2961-961-0009.wav,LibriSpeech/test-clean/260/123286/260-123286-0005.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0036.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0004.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0041.wav,LibriSpeech/test-clean/121/121726/121-121726-0003.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0023.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0019.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0052.wav,LibriSpeech/test-clean/7021/79740/7021-79740-0001.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0014.wav,LibriSpeech/test-clean/61/70968/61-70968-0016.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0042.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0041.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0021.wav,LibriSpeech/test-clean/4077/13754/4077-13754-0004.wav,LibriSpeech/test-clean/4077/13751/4077-13751-0013.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0017.wav,LibriSpeech/test-clean/260/123286/260-123286-0000.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0013.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0022.wav,LibriSpeech/test-clean/121/127105/121-127105-0007.wav,LibriSpeech/test-clean/908/31957/908-31957-0012.wav,LibriSpeech/test-clean/908/31957/908-31957-0007.wav,LibriSpeech/test-clean/8555/292519/8555-292519-0008.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0042.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0034.wav,LibriSpeech/test-clean/672/122797/672-122797-0034.wav,LibriSpeech/test-clean/61/70968/61-70968-0040.wav,LibriSpeech/test-clean/61/70968/61-70968-0022.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0022.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0012.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0022.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0003.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0072.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0061.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0001.wav,LibriSpeech/test-clean/260/123288/260-123288-0008.wav,LibriSpeech/test-clean/260/123286/260-123286-0029.wav,LibriSpeech/test-clean/237/134500/237-134500-0024.wav,LibriSpeech/test-clean/237/126133/237-126133-0021.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0054.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0010.wav,LibriSpeech/test-clean/908/31957/908-31957-0013.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0020.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0009.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0024.wav,LibriSpeech/test-clean/61/70968/61-70968-0029.wav,LibriSpeech/test-clean/61/70968/61-70968-0020.wav,LibriSpeech/test-clean/61/70968/61-70968-0005.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0023.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0036.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0002.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0012.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0027.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0019.wav,LibriSpeech/test-clean/260/123288/260-123288-0006.wav,LibriSpeech/test-clean/260/123286/260-123286-0015.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0045.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0030.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0005.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0013.wav,LibriSpeech/test-clean/61/70970/61-70970-0029.wav,LibriSpeech/test-clean/61/70968/61-70968-0056.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0027.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0020.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0002.wav,LibriSpeech/test-clean/5142/36377/5142-36377-0000.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0068.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0064.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0003.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0048.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0009.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0021.wav,LibriSpeech/test-clean/260/123286/260-123286-0007.wav,LibriSpeech/test-clean/237/134500/237-134500-0032.wav,LibriSpeech/test-clean/1221/135766/1221-135766-0014.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0035.wav,LibriSpeech/test-clean/8230/279154/8230-279154-0039.wav,LibriSpeech/test-clean/8224/274384/8224-274384-0009.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0029.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0022.wav,LibriSpeech/test-clean/61/70968/61-70968-0055.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0016.wav,LibriSpeech/test-clean/5639/40744/5639-40744-0010.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0006.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0008.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0041.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0000.wav,LibriSpeech/test-clean/260/123440/260-123440-0011.wav,LibriSpeech/test-clean/260/123288/260-123288-0016.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0019.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0009.wav,LibriSpeech/test-clean/1284/1180/1284-1180-0012.wav,LibriSpeech/test-clean/121/127105/121-127105-0019.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0037.wav,LibriSpeech/test-clean/908/157963/908-157963-0017.wav,LibriSpeech/test-clean/908/157963/908-157963-0005.wav,LibriSpeech/test-clean/8555/284449/8555-284449-0015.wav,LibriSpeech/test-clean/8463/294828/8463-294828-0032.wav,LibriSpeech/test-clean/7729/102255/7729-102255-0012.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0007.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0028.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0014.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0021.wav,LibriSpeech/test-clean/5105/28241/5105-28241-0013.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0035.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0059.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0035.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0068.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0053.wav,LibriSpeech/test-clean/260/123286/260-123286-0031.wav,LibriSpeech/test-clean/237/134500/237-134500-0040.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0053.wav,LibriSpeech/test-clean/2094/142345/2094-142345-0027.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0022.wav,LibriSpeech/test-clean/1995/1826/1995-1826-0015.wav,LibriSpeech/test-clean/1320/122617/1320-122617-0008.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0029.wav,LibriSpeech/test-clean/908/157963/908-157963-0010.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0003.wav,LibriSpeech/test-clean/7176/88083/7176-88083-0016.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0022.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0039.wav,LibriSpeech/test-clean/672/122797/672-122797-0030.wav,LibriSpeech/test-clean/672/122797/672-122797-0021.wav,LibriSpeech/test-clean/61/70970/61-70970-0020.wav,LibriSpeech/test-clean/61/70968/61-70968-0008.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0046.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0028.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0022.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0009.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0015.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0028.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0024.wav,LibriSpeech/test-clean/237/134500/237-134500-0021.wav,LibriSpeech/test-clean/237/134500/237-134500-0006.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0024.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0002.wav,LibriSpeech/test-clean/121/127105/121-127105-0022.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0020.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0010.wav,LibriSpeech/test-clean/8463/294825/8463-294825-0008.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0010.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0007.wav,LibriSpeech/test-clean/6829/68769/6829-68769-0012.wav,LibriSpeech/test-clean/672/122797/672-122797-0050.wav,LibriSpeech/test-clean/672/122797/672-122797-0015.wav,LibriSpeech/test-clean/61/70970/61-70970-0022.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0016.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0010.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0019.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0011.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0010.wav,LibriSpeech/test-clean/260/123440/260-123440-0020.wav,LibriSpeech/test-clean/237/134500/237-134500-0011.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0019.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0021.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0008.wav,LibriSpeech/test-clean/1320/122612/1320-122612-0006.wav,LibriSpeech/test-clean/1284/1181/1284-1181-0007.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0026.wav,LibriSpeech/test-clean/908/31957/908-31957-0006.wav,LibriSpeech/test-clean/908/157963/908-157963-0028.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0050.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0003.wav,LibriSpeech/test-clean/7127/75946/7127-75946-0008.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0019.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0007.wav,LibriSpeech/test-clean/672/122797/672-122797-0017.wav,LibriSpeech/test-clean/61/70970/61-70970-0002.wav,LibriSpeech/test-clean/61/70968/61-70968-0037.wav,LibriSpeech/test-clean/61/70968/61-70968-0003.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0043.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0016.wav,LibriSpeech/test-clean/4507/16021/4507-16021-0045.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0056.wav,LibriSpeech/test-clean/2961/961/2961-961-0013.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0071.wav,LibriSpeech/test-clean/2830/3980/2830-3980-0062.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0003.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0040.wav,LibriSpeech/test-clean/8555/292519/8555-292519-0010.wav,LibriSpeech/test-clean/8555/284447/8555-284447-0024.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0037.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0018.wav,LibriSpeech/test-clean/7127/75947/7127-75947-0013.wav,LibriSpeech/test-clean/7021/85628/7021-85628-0005.wav,LibriSpeech/test-clean/6930/75918/6930-75918-0008.wav,LibriSpeech/test-clean/6829/68771/6829-68771-0028.wav,LibriSpeech/test-clean/672/122797/672-122797-0040.wav,LibriSpeech/test-clean/61/70970/61-70970-0019.wav,LibriSpeech/test-clean/61/70970/61-70970-0014.wav,LibriSpeech/test-clean/5683/32879/5683-32879-0009.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0025.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0010.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0019.wav,LibriSpeech/test-clean/4992/41797/4992-41797-0002.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0014.wav,LibriSpeech/test-clean/4970/29095/4970-29095-0029.wav,LibriSpeech/test-clean/4970/29093/4970-29093-0015.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0013.wav,LibriSpeech/test-clean/3729/6852/3729-6852-0036.wav,LibriSpeech/test-clean/3575/170457/3575-170457-0028.wav,LibriSpeech/test-clean/2300/131720/2300-131720-0006.wav,LibriSpeech/test-clean/1995/1836/1995-1836-0011.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0016.wav,LibriSpeech/test-clean/1188/133604/1188-133604-0014.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0010.wav,LibriSpeech/test-clean/908/31957/908-31957-0016.wav,LibriSpeech/test-clean/8455/210777/8455-210777-0065.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0001.wav,LibriSpeech/test-clean/672/122797/672-122797-0074.wav,LibriSpeech/test-clean/672/122797/672-122797-0056.wav,LibriSpeech/test-clean/672/122797/672-122797-0036.wav,LibriSpeech/test-clean/5683/32866/5683-32866-0007.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0056.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0049.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0048.wav,LibriSpeech/test-clean/5105/28240/5105-28240-0002.wav,LibriSpeech/test-clean/5105/28233/5105-28233-0000.wav,LibriSpeech/test-clean/4446/2275/4446-2275-0022.wav,LibriSpeech/test-clean/4446/2273/4446-2273-0029.wav,LibriSpeech/test-clean/4446/2271/4446-2271-0006.wav,LibriSpeech/test-clean/3570/5694/3570-5694-0012.wav,LibriSpeech/test-clean/260/123288/260-123288-0001.wav,LibriSpeech/test-clean/237/134500/237-134500-0028.wav,LibriSpeech/test-clean/237/134500/237-134500-0008.wav,LibriSpeech/test-clean/237/134493/237-134493-0013.wav,LibriSpeech/test-clean/237/126133/237-126133-0012.wav,LibriSpeech/test-clean/1995/1837/1995-1837-0009.wav,LibriSpeech/test-clean/1580/141084/1580-141084-0021.wav,LibriSpeech/test-clean/1580/141083/1580-141083-0032.wav,LibriSpeech/test-clean/1089/134686/1089-134686-0004.wav,LibriSpeech/test-clean/908/157963/908-157963-0022.wav,LibriSpeech/test-clean/8463/287645/8463-287645-0004.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0032.wav,LibriSpeech/test-clean/7176/92135/7176-92135-0024.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0024.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0023.wav,LibriSpeech/test-clean/6930/81414/6930-81414-0012.wav,LibriSpeech/test-clean/6930/76324/6930-76324-0003.wav,LibriSpeech/test-clean/61/70970/61-70970-0033.wav,LibriSpeech/test-clean/5142/36586/5142-36586-0000.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0037.wav,LibriSpeech/test-clean/5142/33396/5142-33396-0018.wav,LibriSpeech/test-clean/4992/23283/4992-23283-0007.wav\nTHE MORE SHE IS ENGAGED IN HER PROPER DUTIES THE LESS LEISURE WILL SHE HAVE FOR IT EVEN AS AN ACCOMPLISHMENT AND A RECREATION,AND HENCE WE FIND THE SAME SORT OF CLUMSINESS IN THE TIMAEUS OF PLATO WHICH CHARACTERIZES THE PHILOSOPHICAL POEM OF LUCRETIUS,ALTHOUGH THE BRETHREN WITH ME ARE NOT APOSTLES LIKE MYSELF YET THEY ARE ALL OF ONE MIND WITH ME THINK WRITE AND TEACH AS I DO,HE OBTAINED THE DESIRED SPEED AND LOAD WITH A FRICTION BRAKE ALSO REGULATOR OF SPEED BUT WAITED FOR AN INDICATOR TO VERIFY IT,THERE MAY BE A SPECIFIC FEELING WHICH COULD BE CALLED THE FEELING OF PASTNESS ESPECIALLY WHERE IMMEDIATE MEMORY IS CONCERNED,BY QUICK MARCHES THROUGH THESE INACCESSIBLE MOUNTAINS THAT GENERAL FREED HIMSELF FROM THE SUPERIOR FORCES OF THE COVENANTERS,HAVE YOUR WILL CHILD IF THE BOY ALSO WILLS IT MONTFICHET ANSWERED FEELING TOO ILL TO OPPOSE ANYTHING VERY STRONGLY JUST THEN,HE GAVE WAY TO THE OTHERS VERY READILY AND RETREATED UNPERCEIVED BY THE SQUIRE AND MISTRESS FITZOOTH TO THE REAR OF THE TENT,A LITTLE CRACKED THAT IN THE POPULAR PHRASE WAS MY IMPRESSION OF THE STRANGER WHO NOW MADE HIS APPEARANCE IN THE SUPPER ROOM,THE LOG AND THE COMPASS THEREFORE WERE ABLE TO BE CALLED UPON TO DO THE WORK OF THE SEXTANT WHICH HAD BECOME UTTERLY USELESS,FOR A FEW MILES SHE FOLLOWED THE LINE HITHERTO PRESUMABLY OCCUPIED BY THE COAST OF ALGERIA BUT NO LAND APPEARED TO THE SOUTH,BY THIS TIME THE TWO GENTLEMEN HAD REACHED THE PALINGS AND HAD GOT DOWN FROM THEIR HORSES IT WAS PLAIN THEY MEANT TO COME IN,UNCAS OCCUPIED A DISTANT CORNER IN A RECLINING ATTITUDE BEING RIGIDLY BOUND BOTH HANDS AND FEET BY STRONG AND PAINFUL WITHES,I GREATLY MOURN THAT ONE SO WELL DISPOSED SHOULD DIE IN HIS IGNORANCE AND I HAVE SOUGHT A GOODLY HYMN CAN YOU LEAD ME TO HIM,IT WAS A PAIN TO SEE THEM AND A SWORD LIKE PAIN TO SEE THE SIGNS OF ADOLESCENCE THAT MADE REPELLENT THEIR PITIABLE NAKEDNESS,THAT EVENING TROT GAVE A GRAND BALL IN THE PALACE TO WHICH THE MOST IMPORTANT OF THE PINKIES AND THE BLUESKINS WERE INVITED,BUT YOUR POWER IS SO SUPERIOR TO ANY THAT I CAN ADVANCE AS TO MAKE US HERE FEEL THAT THERE IS NO DISGRACE IN YIELDING TO IT,THAT SUMMER'S EMIGRATION HOWEVER BEING MAINLY FROM THE FREE STATES GREATLY CHANGED THE RELATIVE STRENGTH OF THE TWO PARTIES,A FRESH WHOLESOME LOOKING BOY WAS TOM GATES WITH STEADY GRAY EYES AN INTELLIGENT FOREHEAD BUT A SENSITIVE RATHER WEAK MOUTH,SHE SPOKE WITH A SUDDEN ENERGY WHICH PARTOOK OF FEAR AND PASSION AND FLUSHED HER THIN CHEEK AND MADE HER LANGUID EYES FLASH,THERE IN THE CEDAR HOLLOW THEN LIVED OLIVE LORD AN ANGRY RESENTFUL LITTLE CREATURE WEIGHED DOWN BY A FIERCE SENSE OF INJURY,MISTER POPHAM EXAGGERATED NOTHING BUT ON THE CONTRARY LEFT MUCH UNSAID IN HIS NARRATIVE OF THE FAMILY AT THE HOUSE OF LORDS,OF COURSE HE REFLECTED SHE ALWAYS HAD THAT COMBINATION OF SOMETHING HOMELY AND SENSIBLE AND SOMETHING UTTERLY WILD AND DAFT,EVERYTHING HE HAS DONE HAS BEEN AIMED AT THE CONSERVATION OF ENERGY THE CONTRACTION OF SPACE THE INTENSIFICATION OF CULTURE,SHE HAD BEEN BORN WITHIN ITS BORDERS WITHIN ITS BORDERS SHE HAD LIVED AND GROWN AND WITHIN ITS BORDERS SHE HAD MET HER LOVE,HERE SHE WAS TEACHING DIRTY CHILDREN AND THE SMELL OF CONFUSED ODORS AND BODILY PERSPIRATION WAS TO HER AT TIMES UNBEARABLE,TO EMBARRASS THIS DAMAGING EXPOSURE JUDGE LECOMPTE ISSUED A WRIT AGAINST THE EX GOVERNOR ON A FRIVOLOUS CHARGE OF CONTEMPT,WOMEN CAN HIDE THEIR PAIN BETTER THAN WE MEN AND BEAR IT BETTER TOO EXCEPT WHEN SHAME DROPS FIRE INTO THE DREADFUL CHALICE,RALPH THURSTON HAD FOUND A LINE OF LATIN FOR THEM IN HIS BELOVED HORACE TIBI SPLENDET FOCUS FOR YOU THE HEARTH FIRE SHINES,WHEN SHE COULD NOT MAKE A RABBIT OR A BIRD LOOK REAL ON PAPER SHE SEARCHED IN HER FATHER'S BOOKS FOR PICTURES OF ITS BONES,THE QUESTION IS WHICH OF THE TWO METHODS WILL MOST EFFECTIVELY REACH THE PERSONS WHOSE CONVICTIONS IT IS DESIRED TO AFFECT,NOTWITHSTANDING THE HIGH RESOLUTION OF HAWKEYE HE FULLY COMPREHENDED ALL THE DIFFICULTIES AND DANGER HE WAS ABOUT TO INCUR,AT THE FOOT OF THE MOUNTAIN THAT SEPARATED THE COUNTRY OF THE MUNCHKINS FROM THE COUNTRY OF THE GILLIKINS THE PATH DIVIDED,A MOMENT BEFORE THE GHOST OF THE ANCIENT KINGDOM OF THE DANES HAD LOOKED FORTH THROUGH THE VESTURE OF THE HAZEWRAPPED CITY,HE PLANTED A COMPANY BEFORE THE HOTEL AND DEMANDED A SURRENDER OF THE ARMS BELONGING TO THE FREE STATE MILITARY COMPANIES,IN THE OLD BADLY MADE PLAY IT WAS FREQUENTLY NECESSARY FOR ONE OF THE CHARACTERS TO TAKE THE AUDIENCE INTO HIS CONFIDENCE,FOR A MOMENT BETH STOOD STARING WHILE THE NEW MAID REGARDED HER WITH COMPOSURE AND A SLIGHT SMILE UPON HER BEAUTIFUL FACE,RODOLFO ARRIVED AT HIS OWN HOUSE WITHOUT ANY IMPEDIMENT AND LEOCADIA'S PARENTS REACHED THEIRS HEART BROKEN AND DESPAIRING,SHE'S WONDERFUL MORE WONDERFUL THAN ANYBODY WE'VE EVER SEEN ANYWHERE AND SHE DRAWS BETTER THAN THE TEACHER IN CHARLESTOWN,THE SIGHT OF YOU BARTLEY TO SEE YOU LIVING AND HAPPY AND SUCCESSFUL CAN I NEVER MAKE YOU UNDERSTAND WHAT THAT MEANS TO ME,THIS SENTENCE ALSO DEFINES OUR SINS AS GREAT SO GREAT IN FACT THAT THE WHOLE WORLD COULD NOT MAKE AMENDS FOR A SINGLE SIN,DID EVER ANYBODY SEE THE LIKE SCREAMED MISSUS POYSER RUNNING TOWARDS THE TABLE WHEN HER EYE HAD FALLEN ON THE BLUE STREAM,HE KNEW IT WOULD TAKE THEM TO THE HOUSE OF THE CROOKED MAGICIAN WHOM HE HAD NEVER SEEN BUT WHO WAS THEIR NEAREST NEIGHBOR,THE FIRST OF THESE TOUCHES CONVEYED THAT THE WRITTEN STATEMENT TOOK UP THE TALE AT A POINT AFTER IT HAD IN A MANNER BEGUN,NEVER DID HE OBJECT TO BUCKLING UP HIS SUITCASE FOR ANY COUNTRY WHATEVER CHINA OR THE CONGO NO MATTER HOW FAR OFF IT WAS,AMONG OTHER THINGS ON WHICH SHE CAST HER EYES WAS A SMALL CRUCIFIX OF SOLID SILVER STANDING ON A CABINET NEAR THE WINDOW,HIS HAT HAD A PEAKED CROWN AND A FLAT BRIM AND AROUND THE BRIM WAS A ROW OF TINY GOLDEN BELLS THAT TINKLED WHEN HE MOVED,THEY WERE VOYAGING ACROSS THE DESERTS OF THE SKY A HOST OF NOMADS ON THE MARCH VOYAGING HIGH OVER IRELAND WESTWARD BOUND,I COULDN'T SHIVER MUCH BEIN BOUND SO TIGHT BUT WHEN I'M LOOSE I MEAN TO HAVE JUS ONE GOOD SHIVER TO RELIEVE MY FEELIN'S,THE LAST DROP FLY AS LUCK WOULD HAVE IT CAUGHT JUST IN THE CORNER OF THE HAWK'S ANGRILY OPEN BEAK HOOKING ITSELF FIRMLY,BUT SUDDENLY STRAIGHT AND SWIFT AS A DIVING CORMORANT HE SHOT DOWN INTO THE TORRENT AND DISAPPEARED BENEATH THE SURFACE,TO SAY NOTHING SAID MONTALAIS SO THAT WHEN MADEMOISELLE DE TONNAY CHARENTE THINKS ATHENAIS IS THE ONLY ONE WHO KNOWS IT,THE STOP AT QUEENSTOWN THE TEDIOUS PASSAGE UP THE MERSEY WERE THINGS THAT HE NOTED DIMLY THROUGH HIS GROWING IMPATIENCE,AT THE INCEPTION OF PLURAL MARRIAGE AMONG THE LATTER DAY SAINTS THERE WAS NO LAW NATIONAL OR STATE AGAINST ITS PRACTISE,NINE THOUSAND YEARS HAVE ELAPSED SINCE SHE FOUNDED YOURS AND EIGHT THOUSAND SINCE SHE FOUNDED OURS AS OUR ANNALS RECORD,YOU KNOW I HAVE JUST BEEN TELLING YOU HOW THIS SCHOOL OF MATERIALISM AND CLAY INVOLVED ITSELF AT LAST IN CLOUD AND FIRE,NAY I RATHER THRILLED DISTRUSTING EVERY LIGHT THAT SEEMED TO GILD THE ONWARD PATH AND FEARED TO OVERLEAN A FINGER EVEN,THEY MUST HAVE SOME CHARACTERISTIC WHICH MAKES US REGARD THEM AS REFERRING TO MORE OR LESS REMOTE PORTIONS OF THE PAST,I COME NOW TO THE OTHER CHARACTERISTIC WHICH MEMORY IMAGES MUST HAVE IN ORDER TO ACCOUNT FOR OUR KNOWLEDGE OF THE PAST,MISS DE GRAF SAID KENNETH NOTICING THE BOY'S FACE CRITICALLY AS HE STOOD WHERE THE LIGHT FROM THE PASSAGE FELL UPON IT,YOUNG FITZOOTH HAD BEEN COMMANDED TO HIS MOTHER'S CHAMBER SO SOON AS HE HAD COME OUT FROM HIS CONVERSE WITH THE SQUIRE,BY THIS TIME LORD CHELFORD AND WYLDER RETURNED AND DISGUSTED RATHER WITH MYSELF I RUMINATED ON MY WANT OF GENERAL SHIP,HE HAD PRECONCEIVED IDEAS ABOUT EVERYTHING AND HIS IDEA ABOUT AMERICANS WAS THAT THEY SHOULD BE ENGINEERS OR MECHANICS,HESTER PRYNNE NEVERTHELESS THE LOVING MOTHER OF THIS ONE CHILD RAN LITTLE RISK OF ERRING ON THE SIDE OF UNDUE SEVERITY,LIVES NOT ALONE NOR OR ITSELF FEAR NOT AND I WILL CALL THE WEAK WORM FROM ITS LOWLY BED AND THOU SHALT HEAR ITS VOICE,WERE I TO COMPLY WITH YOUR ORDERS WITHOUT EXPRESSING MY OWN OPINION I SHOULD SEEM TO HAVE DONE SO WILLINGLY HEREAFTER,NOT A DOUBT BUT HAD YOUR FORCE BEEN ONLY DOUBLE OR TREBLE OUR OWN I SHOULD HAVE FOUND IT MY DUTY TO STRUGGLE WITH YOU,THE PRINCESS SAT DOWN UNDER A BLUE CANOPY WITH BOUQUETS OF ROSES AND SHE LET ANDERS SIT IN A GOLDEN CHAIR BY HER SIDE,PUT THESE PLAYTHINGS ALL AWAY QUICK AND CAREFULLY AND WE WILL NOT LET THEM KNOW ANY THING ABOUT YOUR LEAVING THEM OUT,NOW DELIA CONTRIVED TO OBTAIN A GREAT INFLUENCE AND ASCENDENCY OVER THE MINDS OF THE CHILDREN BY MEANS OF THESE DOLLS,AND YET YOU MUST OWN HER BEHAVIOUR HAS WARRANTED THEM HAS IT NOT BEEN IN THIS PARTICULAR INCOHERENT AND UNACCOUNTABLE,IN ORDER TO PLEASE HER I SPOKE TO HER OF THE ABBE CONTI AND I HAD OCCASION TO QUOTE TWO LINES OF THAT PROFOUND WRITER,INDEED THERE WERE ONLY ONE OR TWO STRANGERS WHO COULD BE ADMITTED AMONG THE SISTERS WITHOUT PRODUCING THE SAME RESULT,HE CRIED IN HIGH DUDGEON JUST AS IF HE OWNED THE WHOLE OF THE PEPPERS AND COULD DISPOSE OF THEM ALL TO SUIT HIS FANCY,THIS REALITY BEGINS TO EXPLAIN THE DARK POWER AND OTHERWORLDLY FASCINATION OF TWENTY THOUSAND LEAGUES UNDER THE SEAS,IN NOVELS THE HERO HAS OFTEN PUSHED HIS MEALS AWAY UNTASTED BUT NO STAGE HERO WOULD DO ANYTHING SO UNNATURAL AS THIS,HE DETESTED THE GRASPING DISPOSITION THAT WOULD ENDEAVOR TO TAKE ADVANTAGE OF HIS EVIDENT DESIRE TO HELP YOUNG GATES,AND NOW HE DESIRES TO SEE THE IDEAL STATE SET IN MOTION HE WOULD LIKE TO KNOW HOW SHE BEHAVED IN SOME GREAT STRUGGLE,EITHER HE CALLS MINISTERS THROUGH THE AGENCY OF MEN OR HE CALLS THEM DIRECTLY AS HE CALLED THE PROPHETS AND APOSTLES,SOMEHOW OF ALL THE DAYS WHEN THE HOME FEELING WAS THE STRONGEST THIS DAY IT SEEMED AS IF SHE COULD BEAR IT NO LONGER,BUT THEL IS LIKE A FAINT CLOUD KINDLED AT THE RISING SUN I VANISH FROM MY PEARLY THRONE AND WHO SHALL FIND MY PLACE,AND GENTLE SLEEP THE SLEEP OF DEATH AND GENTLY HEAR THE VOICE OF HIM THAT WALKETH IN THE GARDEN IN THE EVENING TIME,I AND MY WIFE AND SON AND THE TWO CRASWELLERS AND THREE OR FOUR OTHERS AGREED TO DINE ON BOARD THE SHIP ON THE NEXT,IF WE HAD RETAINED THE SUBJECT OR ACT IN KNOWLEDGE THE WHOLE PROBLEM OF MEMORY WOULD HAVE BEEN COMPARATIVELY SIMPLE,THE BEHAVIOURIST WHO ATTEMPTS TO MAKE PSYCHOLOGY A RECORD OF BEHAVIOUR HAS TO TRUST HIS MEMORY IN MAKING THE RECORD,IT IS YOU WHO ARE MISTAKEN RAOUL I HAVE READ HIS DISTRESS IN HIS EYES IN HIS EVERY GESTURE AND ACTION THE WHOLE DAY,AND THEN HE TOLD ALL ABOUT HIS YOUTH AND THE LITTLE MICE HAD NEVER HEARD THE LIKE BEFORE AND THEY LISTENED AND SAID,TO GROW AND GROW TO GET OLDER AND BE TALL THOUGHT THE TREE THAT AFTER ALL IS THE MOST DELIGHTFUL THING IN THE WORLD,ROBIN FITZOOTH SAW THAT HIS DOUBTS OF WARRENTON HAD BEEN UNFAIR AND HE BECAME ASHAMED OF HIMSELF FOR HARBORING THEM,YES SOMETHING EVERYTHING SAID RACHEL HURRIEDLY LOOKING FROWNINGLY AT A FLOWER WHICH SHE WAS TWIRLING IN HER FINGERS,THEIR WALK CONTINUED SILENT FOR THE GREATER PART NEITHER WAS QUITE SATISFIED WITH THE OTHER BUT RACHEL AT LAST SAID,THIS TRUTH WHICH I HAVE LEARNED FROM HER LIPS IS CONFIRMED BY HIS FACE IN WHICH WE HAVE BOTH BEHELD THAT OF OUR SON,WHAT I MEAN IS THAT I WANT YOU TO PROMISE NEVER TO SEE ME AGAIN NO MATTER HOW OFTEN I COME NO MATTER HOW HARD I BEG,HE STOOD A LITTLE BEHIND HER AND TRIED TO STEADY HIMSELF AS HE SAID IT'S SOFT AND MISTY SEE HOW WHITE THE STARS ARE,STUNG BY ANXIETY FOR THIS LITTLE SISTER SHE UPBRAIDED MISS W FOR HER FANCIED INDIFFERENCE TO ANNE'S STATE OF HEALTH,THE SUBJECT WAS A VERY NOBLE ONE HE DESCRIBED THE MOST FAMOUS ACTION IN WHICH THE ATHENIAN PEOPLE WERE EVER ENGAGED,IF EVER HE WAS IMPELLED TO CAST SIN FROM HIM AND TO REPENT THE IMPULSE THAT MOVED HIM WAS THE WISH TO BE HER KNIGHT,THE HELPLESS WORM AROSE AND SAT UPON THE LILLYS LEAF AND THE BRIGHT CLOUD SAILD ON TO FIND HIS PARTNER IN THE VALE,SHE SAT DOWN IN A ROCKING CHAIR AND CLASPING HER HANDS IN HER LAP ROCKED SLOWLY BACK AND FORTH I'M SORRY SAID BETH,THESE WOMEN WERE FLATTERED BY THE ATTENTION OF THE YOUNG LADY AND HAD PROMISED TO ASSIST IN ELECTING MISTER FORBES,DOUBTS NOW AROSE AND SOME DISCUSSION FOLLOWED WHETHER OR NOT IT WAS DESIRABLE FOR BEN ZOOF TO ACCOMPANY HIS MASTER,MOTHER CAREY POURED COFFEE NANCY CHOCOLATE AND THE OTHERS HELPED SERVE THE SANDWICHES AND CAKE DOUGHNUTS AND TARTS,SHE A TORY AND CLERGYMAN'S DAUGHTER WAS ALWAYS IN A MINORITY OF ONE IN OUR HOUSE OF VIOLENT DISSENT AND RADICALISM,I WILL BRIEFLY DESCRIBE THEM TO YOU AND YOU SHALL READ THE ACCOUNT OF THEM AT YOUR LEISURE IN THE SACRED REGISTERS,WHEN YOU ARGUE ABOUT THE NATURE OF GOD APART FROM THE QUESTION OF JUSTIFICATION YOU MAY BE AS PROFOUND AS YOU LIKE,THE ATMOSPHERE IS CHARGED WITH VAPOURS PERVADED WITH THE ELECTRICITY GENERATED BY THE EVAPORATION OF SALINE WATERS,WE WANT TO KNOW MISTER GILCHRIST HOW YOU AN HONOURABLE MAN EVER CAME TO COMMIT SUCH AN ACTION AS THAT OF YESTERDAY,WHAT COULD HE DO HE CAUGHT UP EVERYTHING WHICH WOULD BETRAY HIM AND HE RUSHED INTO YOUR BEDROOM TO CONCEAL HIMSELF,THEY UNITE EVERY QUALITY AND SOMETIMES YOU WILL FIND ME REFERRING TO THEM AS COLORISTS SOMETIMES AS CHIAROSCURISTS,SO GHIP GHISIZZLE ORDERED THE CAPTAIN TO TAKE A FILE OF SOLDIERS AND ESCORT THE RAVING BEAUTIES TO THEIR NEW HOME,JACK HAD BEEN STANDING IN THE FAR CORNER OF THE ROOM TALKING TO EVA AND WAS NOW REDUCED TO SILENCE BY HIS PRAISES,HOW CHEERFULLY HE SEEMS TO GRIN HOW NEATLY SPREAD HIS CLAWS AND WELCOME LITTLE FISHES IN WITH GENTLY SMILING JAWS,EDISON HELD THAT THE ELECTRICITY SOLD MUST BE MEASURED JUST LIKE GAS OR WATER AND HE PROCEEDED TO DEVELOP A METER,IT WAS SIMPLE ENOUGH SIR IF YOU ONLY HAD KNOWN BUT WITH ALL YOUR CLEVERNESS IT WAS IMPOSSIBLE THAT YOU COULD KNOW,I CANNOT ALLOW THE EXAMINATION TO BE HELD IF ONE OF THE PAPERS HAS BEEN TAMPERED WITH THE SITUATION MUST BE FACED,THERE WAS SOMETHING IN HIS AIR AND MANNER THAT BETRAYED TO THE SCOUT THE UTTER CONFUSION OF THE STATE OF HIS MIND,HOW IS IT LA VALLIERE SAID MADEMOISELLE DE TONNAY CHARENTE THAT THE VICOMTE DE BRAGELONNE SPOKE OF YOU AS LOUISE,GIVE ME A CHECK FOR A HUNDRED AND FIFTY AND I'LL TURN OVER TO YOU THE FORGED CHECK AND QUASH FURTHER PROCEEDINGS,HE WOULDN'T SEARCH SO DON'T WORRY REPLIED CYRIL QUIETLY AND THE TWO LOOKED AT EACH OTHER AND KNEW THAT IT WAS SO,HE WELL KNEW THE PERILS OF THE FRONTIER THE SAVAGE STATE OF SOCIETY THE LURKING INDIANS AND THE DANGERS OF FEVER,BUT IT IS NOT WITH A VIEW TO DISTINCTION THAT YOU SHOULD CULTIVATE THIS TALENT IF YOU CONSULT YOUR OWN HAPPINESS,HE SPOKE FRENCH PERFECTLY I HAVE BEEN TOLD WHEN NEED WAS BUT DELIGHTED USUALLY IN TALKING THE BROADEST YORKSHIRE,AND OFTEN HAS MY MOTHER SAID WHILE ON HER LAP I LAID MY HEAD SHE FEARED FOR TIME I WAS NOT MADE BUT FOR ETERNITY,CRIED ALICE AGAIN FOR THIS TIME THE MOUSE WAS BRISTLING ALL OVER AND SHE FELT CERTAIN IT MUST BE REALLY OFFENDED,I CAN'T PRAY TO HAVE THE THINGS I WANT HE SAID SLOWLY AND I WON'T PRAY NOT TO HAVE THEM NOT IF I'M DAMNED FOR IT,I GAVE HIM A LITTLE BRANDY AND LEFT HIM COLLAPSED IN A CHAIR WHILE I MADE A MOST CAREFUL EXAMINATION OF THE ROOM,THE AWKWARD THING WAS THAT THEY HAD PRACTICALLY NO OTHER RELATIONS AND THAT HIS OWN AFFAIRS TOOK UP ALL HIS TIME,THE WHARVES OF BROOKLYN AND EVERY PART OF NEW YORK BORDERING THE EAST RIVER WERE CROWDED WITH CURIOSITY SEEKERS,SUDDENLY FOR THE PURPOSE OF RESTORING PEACE AND ORDER SPRING ACCOMPANIED BY HIS WHOLE COURT MADE HIS APPEARANCE,HE RECKONED THEREFORE NOT ONLY UPON ASCERTAINING THE EXTENT OF THE LATE CATASTROPHE BUT UPON LEARNING ITS CAUSE,IRENE BURGOYNE ONE OF HER FAMILY TOLD ME IN CONFIDENCE THAT THERE WAS A ROMANCE SOMEWHERE BACK IN THE BEGINNING,NOTHING CAN EXCEED THE BEAUTY OR ART OF THE INTRODUCTION IN WHICH HE IS USING WORDS AFTER HIS ACCUSTOMED MANNER,THERE IS NO DANGER OF THE MODERN COMMENTATORS ON THE TIMAEUS FALLING INTO THE ABSURDITIES OF THE NEO PLATONISTS,THE LORD WHO HAS GIVEN US POWER TO TEACH AND TO HEAR LET HIM ALSO GIVE US THE POWER TO SERVE AND TO DO LUKE TWO,ITS JAW IS ENORMOUS AND ACCORDING TO NATURALISTS IT IS ARMED WITH NO LESS THAN ONE HUNDRED AND EIGHTY TWO TEETH,MY FRIEND DID NOT APPEAR TO BE DEPRESSED BY HIS FAILURE BUT SHRUGGED HIS SHOULDERS IN HALF HUMOROUS RESIGNATION,SO UNCAS YOU HAD BETTER TAKE THE LEAD WHILE I WILL PUT ON THE SKIN AGAIN AND TRUST TO CUNNING FOR WANT OF SPEED,THIS OUTWARD MUTABILITY INDICATED AND DID NOT MORE THAN FAIRLY EXPRESS THE VARIOUS PROPERTIES OF HER INNER LIFE,CRIED ONE OF THE WOMEN HE TOOK NO NOTICE OF HER HE LOOKED AT ME BUT AS IF INSTEAD OF ME HE SAW WHAT HE SPOKE OF,THOU CANST WAIT THROUGH SORROW AND SICKNESS TO BRING SOULS TO TOUCH AND THINK IT SOON WHEN OTHERS CRY TOO LATE,IT IS FOUNDED ON THE ACKNOWLEDGED WEAKNESS OF THOSE WHO SURVIVE THAT PERIOD OF LIFE AT WHICH MEN CEASE TO WORK,YOU HAVE RECEIVED US WITH ALL THAT COURTESY AND HOSPITALITY FOR WHICH YOUR CHARACTER IN ENGLAND STANDS SO HIGH,ALL THAT I AM DOING IS TO USE ITS LOGICAL TENABILITY AS A HELP IN THE ANALYSIS OF WHAT OCCURS WHEN WE REMEMBER,LOOK YONDER DO YOU NOT SEE THE MOON SLOWLY RISING SILVERING THE TOPMOST BRANCHES OF THE CHESTNUTS AND THE OAKS,SHE WAS DRESSED IN THE REGULATION COSTUME OF THE MAIDS AT ELMHURST A PLAIN BLACK GOWN WITH WHITE APRON AND CAP,YES THEN SOMETHING BETTER SOMETHING STILL GRANDER WILL SURELY FOLLOW OR WHEREFORE SHOULD THEY THUS ORNAMENT ME,SHE SAW THAT THE BED WAS GILDED AND SO RICH THAT IT SEEMED THAT OF A PRINCE RATHER THAN OF A PRIVATE GENTLEMAN,THE SUGAR MANUFACTURER WHO SAYS LOAF CLARIFIED LUMPS BASTARD COMMON BURNT THIS HONEST MANUFACTURER TALKS SLANG,I ADDRESS HIM IN ITALIAN AND HE ANSWERS VERY WITTILY BUT HIS WAY OF SPEAKING MAKES ME SMILE AND I TELL HIM WHY,THE METER CONTINUED IN GENERAL SERVICE DURING EIGHTEEN NINETY NINE AND PROBABLY UP TO THE CLOSE OF THE CENTURY,COME COME SAID HOLMES KINDLY IT IS HUMAN TO ERR AND AT LEAST NO ONE CAN ACCUSE YOU OF BEING A CALLOUS CRIMINAL,THE WHOLE PARTY CROWDED TO THE SPOT WHERE UNCAS POINTED OUT THE IMPRESSION OF A MOCCASIN IN THE MOIST ALLUVION,A CIRCLE OF A FEW HUNDRED FEET IN CIRCUMFERENCE WAS DRAWN AND EACH OF THE PARTY TOOK A SEGMENT FOR HIS PORTION,WHILE THE OLD GOLD AND THE MARBLE STAYS FOREVER GLEAMING ITS SOFT STRONG BLAZE CALM IN THE EARLY EVENING GLOW,THE ROOM OF THE GREAT KNIFE WAS HIGH AND BIG AND AROUND IT RAN ROWS OF BENCHES FOR THE SPECTATORS TO SIT UPON,HE WAS A FANATIC ON FORMALITY AND HE ONLY ADDRESSED ME IN THE THIRD PERSON TO THE POINT WHERE IT GOT TIRESOME,BUT HERE HE WAS AT A TERRIBLE DISADVANTAGE AS COMPARED WITH THE OWLS HAWKS AND EAGLES HE HAD NO RENDING CLAWS,SURFACE DUST AT LEAST HAD BEEN REMOVED AND THE FINE OLD FURNITURE GAVE A HINT OF ITS REAL ELEGANCE AND POLISH,HE IMPLORES US TO BE DISCREET AS THE GRAVE IN THIS MATTER FOR IN SOOTH HIS LIFE IS IN THE HOLLOW OF OUR HANDS,THRUSTING OPEN THE PROPER ENTRANCE OF THE TENT ROBIN SUDDENLY RUSHED FORTH WITH HIS BURDEN WITH A GREAT SHOUT,THEN I DRANK HALF OF THE HORNFUL AND SENT THE REST ACROSS THE FIRE TO THE FARMER HE TOOK IT AND SMILED SAYING,BARTLEY LEANED OVER HER SHOULDER WITHOUT TOUCHING HER AND WHISPERED IN HER EAR YOU ARE GIVING ME A CHANCE YES,TWO MONSTERS ONLY WERE CREATING ALL THIS COMMOTION AND BEFORE MY EYES ARE TWO REPTILES OF THE PRIMITIVE WORLD,NO ONE WOULD DISTURB THEIR LITTLE HOUSE EVEN IF ANYONE CAME SO FAR INTO THE THICK FOREST WHILE THEY WERE GONE,SHE WAS YOUNG UNTRIED NERVOUS IT WAS A VISION OF SERIOUS DUTIES AND LITTLE COMPANY OF REALLY GREAT LONELINESS,IN BOTH THESE HIGH MYTHICAL SUBJECTS THE SURROUNDING NATURE THOUGH SUFFERING IS STILL DIGNIFIED AND BEAUTIFUL,YOU WILL FIND ME CONTINUALLY SPEAKING OF FOUR MEN TITIAN HOLBEIN TURNER AND TINTORET IN ALMOST THE SAME TERMS,I DISCOVERED AND PUT OUT A FIRE THAT WOULD HAVE DESTROYED THE WHOLE PLANT BUT MARSHALL NEVER EVEN THANKED ME,THERE BEFELL AN ANXIOUS INTERVIEW MISTRESS FITZOOTH ARGUING FOR AND AGAINST THE SQUIRE'S PROJECT IN A BREATH,THE STROLLERS TOOK THEIR PART IN IT WITH HEARTY ZEST NOW THAT THEY HAD SOME CHANCE OF BEATING OFF THEIR FOES,THAT IS THE BEST WAY TO DECIDE FOR THE SPEAR WILL ALWAYS POINT SOMEWHERE AND ONE THING IS AS GOOD AS ANOTHER,HERE IS A RING FOR SIF THE FRIENDLY AND HERE IS A BRACELET A SWORD WOULD NOT BE ASHAMED TO HANG AT YOUR SIDE,BUT THE MEMORY OF THEIR EXPLOITS HAS PASSED AWAY OWING TO THE LAPSE OF TIME AND THE EXTINCTION OF THE ACTORS,BUT IN THE REST OF THE WORK THE POWER OF LANGUAGE SEEMS TO FAIL HIM AND THE DRAMATIC FORM IS WHOLLY GIVEN UP,TO BESTOW PEACE AND GRACE LIES IN THE PROVINCE OF GOD WHO ALONE CAN CREATE THESE BLESSINGS THE ANGELS CANNOT,DEAR ME EJACULATED THE OLD GENTLEMAN IN THE UTMOST AMAZEMENT AND SUCH A TIME AS I'VE HAD TO GET HER HERE TOO,HE WEIGHED AND REWEIGHED THE METER PLATES AND PURSUED EVERY LINE OF INVESTIGATION IMAGINABLE BUT ALL IN VAIN,SEVERAL CLOTHES HORSES A PILLION A SPINNING WHEEL AND AN OLD BOX WIDE OPEN AND STUFFED FULL OF COLOURED RAGS,I HAVE A LETTER HERE MISTER SOAMES WHICH I WROTE TO YOU EARLY THIS MORNING IN THE MIDDLE OF A RESTLESS NIGHT,MY FRIEND'S TEMPER HAD NOT IMPROVED SINCE HE HAD BEEN DEPRIVED OF THE CONGENIAL SURROUNDINGS OF BAKER STREET,AFTER PROCEEDING A FEW MILES THE PROGRESS OF HAWKEYE WHO LED THE ADVANCE BECAME MORE DELIBERATE AND WATCHFUL,DEAR ME WHAT A CHATTERBOX YOU'RE GETTING TO BE UNC REMARKED THE MAGICIAN WHO WAS PLEASED WITH THE COMPLIMENT,GOLD IS THE MOST COMMON METAL IN THE LAND OF OZ AND IS USED FOR MANY PURPOSES BECAUSE IT IS SOFT AND PLIABLE,AND SAYS THOU MOTHER OF MY CHILDREN I HAVE LOVED THEE AND I HAVE GIVEN THEE A CROWN THAT NONE CAN TAKE AWAY,TILL WE ARISE LINK'D IN A GOLDEN BAND AND NEVER PART BUT WALK UNITED BEARING FOOD TO ALL OUR TENDER FLOWERS,I OPENED A LINE OF CREDIT SUFFICIENT TO COVER THE BABIRUSA AND CONSEIL AT MY HEELS I JUMPED INTO A CARRIAGE,BUT IT IS SURMISED THAT YOU WILL FIND DIFFICULTIES IN THE WAY OF YOUR ENTERING AT ONCE UPON YOUR GOVERNMENT,I WAS TO BE TAKEN AWAY AND CARRIED TO ENGLAND OR ELSEWHERE OR DROWNED UPON THE VOYAGE IT MATTERED NOT WHICH,IT IS AN ANTIPATHY AN ANTIPATHY I CANNOT GET OVER DEAR DORCAS YOU MAY THINK IT A MADNESS BUT DON'T BLAME ME,I MADE HER FOR ONLY TWENTY OARS BECAUSE I THOUGHT FEW MEN WOULD FOLLOW ME FOR I WAS YOUNG FIFTEEN YEARS OLD,BUT THE MORE FORGETFULNESS HAD THEN PREVAILED THE MORE POWERFUL WAS THE FORCE OF REMEMBRANCE WHEN SHE AWOKE,IT IS SOLD EVERYWHERE BUT FOR THE LAST THREE WEEKS NOBODY WILL USE ANY SNUFF BUT THAT SOLD AT THE CIVET CAT,WE WANT YOU TO HELP US PUBLISH SOME LEADING WORK OF LUTHER'S FOR THE GENERAL AMERICAN MARKET WILL YOU DO IT,WE ARE LOSING TIME AND THE FACT IS I HAVE NOT COME ALL THIS WAY TO TAKE A LITTLE SAIL UPON A POND ON A RAFT,ASKED PHRONSIE IN INTENSE INTEREST SLIPPING DOWN OUT OF POLLY'S ARMS AND CROWDING UP CLOSE TO JASPER'S SIDE,I'VE STRONG ASSURANCE THAT NO EVIL WILL HAPPEN TO YOU AND MY UNCLE AND THE CHILDREN FROM ANYTHING I'VE DONE,SHE WAS THE MOST AGREEABLE WOMAN I'VE EVER KNOWN IN HER POSITION SHE WOULD HAVE BEEN WORTHY OF ANY WHATEVER,HOUSECLEANING A DOMESTIC UPHEAVAL THAT MAKES IT EASY FOR THE GOVERNMENT TO ENLIST ALL THE SOLDIERS IT NEEDS,THE RETREAT WILL BEGIN ON WEDNESDAY AFTERNOON IN HONOUR OF SAINT FRANCIS XAVIER WHOSE FEAST DAY IS SATURDAY,ATCHISON WHO HAD BEEN HARANGUING THE MOB PLANTED HIS TWO GUNS BEFORE THE BUILDING AND TRAINED THEM UPON IT,BUT THE AFFAIR WAS MAGNIFIED AS A CROWNING PROOF THAT THE FREE STATE MEN WERE INSURRECTIONISTS AND OUTLAWS,AND IT IS MADE OF MOTHER'S BEST YARN AND SHE KNITTED IT HERSELF AND EVERYBODY WANTS TO GET IT AWAY FROM ME,HOWEVER HER FEATURES AND FORM MIGHT REPRESS ANY EVIDENCE OF NERVOUSNESS THESE HANDS TOLD A DIFFERENT STORY,THE ATTENDANCE WAS UNEXPECTEDLY LARGE AND THE GIRLS WERE DELIGHTED FORESEEING GREAT SUCCESS FOR THEIR FETE,THEN ROGERS WOULDN'T DO ANYTHING BUT LEAD HER AROUND AND WAIT UPON HER AND THE PLACE WENT TO RACK AND RUIN,SOMETIMES I'M THAT YEARNING FOR A SMOKE I'M NEARLY CRAZY AN I DUNNO WHICH IS WORST DYIN ONE WAY OR ANOTHER,MY BED WAS UNEXCEPTIONABLY COMFORTABLE BUT IN MY THEN MOOD I COULD HAVE WISHED IT A GREAT DEAL MORE MODERN,BUT THAT WISE AND PLACID WOMAN UNDERSTOOD THE SWEET REBEL A GREAT DEAL BETTER THAN RUTH UNDERSTOOD HERSELF,THIS DIFFERENTIATION IS FURTHERED BY THE INHERITANCE OF WEALTH AND THE CONSEQUENT INHERITANCE OF GENTILITY,DID NOT CHRIST HIMSELF SAY I AM THE WAY AND THE TRUTH AND THE LIFE NO MAN COMETH UNTO THE FATHER BUT BY ME,SAID CAPTAIN DONNITHORNE SEATING HIMSELF WHERE HE COULD SEE ALONG THE SHORT PASSAGE TO THE OPEN DAIRY DOOR,THE CROWD DRIFTS OFF LEAVING THE HERO AND HEROINE ALONE IN THE MIDDLE OF THE STAGE AND THEN YOU CAN BEGIN,BUT JOYCE HAD NOT BEEN LISTENING ALL AT ONCE SHE PUT DOWN HER CANDLE ON THE TABLE AND FACED HER COMPANION,THOUGHT THE FIR TREE AND BELIEVED IT ALL BECAUSE THE MAN WHO TOLD THE STORY WAS SO GOOD LOOKING WELL WELL,I LIKE YOU WILL YOU ARE THE SECOND WILL THAT I HAVE MET AND LIKED WITHIN TWO DAYS IS THERE A SIGN IN THAT,NAOMI SHOOK HER FOREFINGER REPROACHFULLY AT THEM AS IF THE TWO STURDY YOUNG FARMERS HAD BEEN TWO CHILDREN,BUT YOUNG SHARP TONGUE NOW THAT WE HAVE CAUGHT YOU WE WILL PUT YOU INTO A TRAP THAT YOU CANNOT GET OUT OF,HILDA WATCHED HIM FROM HER CORNER TREMBLING AND SCARCELY BREATHING DARK SHADOWS GROWING ABOUT HER EYES IT,THIS ATTITUDE IS UNIVERSAL AND PARTICULARLY DEVELOPED IN THOSE WHO CONSIDER THEMSELVES BETTER THAN OTHERS,THEIR CONTENTS HAD ALL BOILED AWAY LEAVING IN THE BOTTOM OF EACH KETTLE A FEW GRAINS OF FINE WHITE POWDER,INSTEAD OF SHOES THE OLD MAN WORE BOOTS WITH TURNOVER TOPS AND HIS BLUE COAT HAD WIDE CUFFS OF GOLD BRAID,IF YOU DRESSED IN SILK AND GOLD FROM TOP TO TOE YOU COULD NOT LOOK ANY NICER THAN IN YOUR LITTLE RED CAP,I HAD SCARCELY KNOWN WHAT I HAD BEEN SAYING OR DOING UP TO THIS TIME BUT AS HE SPOKE I LOOKED AT MY HAND,HER MANNER WAS NEITHER INDEPENDENT NOR ASSERTIVE BUT RATHER ONE OF WELL BRED COMPOSURE AND CALM RELIANCE,POOR RACHEL HER NATURE RECOILED FROM DECEIT AND SHE TOLD AT ALL EVENTS AS MUCH OF THE TRUTH AS SHE DARED,SO NO TALES GOT OUT TO THE NEIGHBORS BESIDES IT WAS A LONELY PLACE AND BY GOOD LUCK NO ONE CAME THAT WAY,HER SEA GOING QUALITIES WERE EXCELLENT AND WOULD HAVE AMPLY SUFFICED FOR A CIRCUMNAVIGATION OF THE GLOBE,ITS ORIGIN WAS SMALL A GERM AN INSIGNIFICANT SEED HARDLY TO BE THOUGHT OF AS LIKELY TO AROUSE OPPOSITION,PLATO HAD NOT THE COMMAND OF HIS MATERIALS WHICH WOULD HAVE ENABLED HIM TO PRODUCE A PERFECT WORK OF ART,WE LOOK FOR THAT REWARD WHICH EYE HATH NOT SEEN NOR EAR HEARD NEITHER HATH ENTERED INTO THE HEART OF MAN,THESE PERVERTERS OF THE RIGHTEOUSNESS OF CHRIST RESIST THE FATHER AND THE SON AND THE WORKS OF THEM BOTH,SUDDENLY THE ICHTHYOSAURUS AND THE PLESIOSAURUS DISAPPEAR BELOW LEAVING A WHIRLPOOL EDDYING IN THE WATER,NAY DEAR AUNT YOU NEVER HEARD ME SAY THAT ALL PEOPLE ARE CALLED TO FORSAKE THEIR WORK AND THEIR FAMILIES,THE GLIMMERING SEA OF DELICATE LEAVES WHISPERED AND MURMURED BEFORE HER STRETCHING AWAY TO THE NORTHWARD,ALSO A POPULAR CONTRIVANCE WHEREBY LOVE MAKING MAY BE SUSPENDED BUT NOT STOPPED DURING THE PICNIC SEASON,AFTER EARLY NIGHTFALL THE YELLOW LAMPS WOULD LIGHT UP HERE AND THERE THE SQUALID QUARTER OF THE BROTHELS,AND THOUGH I HAVE GROWN SERENE AND STRONG SINCE THEN I THINK THAT GOD HAS WILLED A STILL RENEWABLE FEAR,THERE CAME UPON ME A SUDDEN SHOCK WHEN I HEARD THESE WORDS WHICH EXCEEDED ANYTHING WHICH I HAD YET FELT,ANOTHER PREACHER AFTER REPROACHING HIM TO HIS FACE WITH HIS MISGOVERNMENT ORDERED THIS PSALM TO BE SUNG,AND SO ON TILL YOU GET TO THE END WHEN OPHELIA MIGHT SAY AH YES OR SOMETHING NON COMMITTAL OF THAT SORT,BUT SUPPOSE YOU SAID I'M FOND OF WRITING MY PEOPLE ALWAYS SAY MY LETTERS HOME ARE GOOD ENOUGH FOR PUNCH,FOR THE FIRST TIME THE MAID SEEMED A LITTLE CONFUSED AND HER GAZE WANDERED FROM THE FACE OF HER VISITOR,HIS TONES RANG PLEASANTLY ON WARRENTON'S EARS AND FORTHWITH A GOOD FELLOWSHIP WAS HERALDED BETWEEN THEM,TO THE FERVENT LATTER DAY SAINT A TEMPLE IS NOT SIMPLY A CHURCH BUILDING A HOUSE FOR RELIGIOUS ASSEMBLY,JANUARY AND FEBRUARY OF EIGHTEEN THIRTY SEVEN HAD PASSED AWAY AND STILL THERE WAS NO REPLY FROM SOUTHEY,SINCE CHRIST WAS GIVEN FOR OUR SINS IT STANDS TO REASON THAT THEY CANNOT BE PUT AWAY BY OUR OWN EFFORTS,I CAN DISTINGUISH THE EYE OF THE ICHTHYOSAURUS GLOWING LIKE A RED HOT COAL AND AS LARGE AS A MAN'S HEAD,BUT EMIL IF I UNDERSTAND THEN ALL OUR GOOD TIMES ARE OVER WE CAN NEVER DO NICE THINGS TOGETHER ANY MORE,HIS WIFE NOW LIES BESIDE HIM AND THE WHITE SHAFT THAT MARKS THEIR GRAVES GLEAMS ACROSS THE WHEAT FIELDS,I BELIEVE IN THE TRAINING OF PEOPLE TO THEIR HIGHEST CAPACITY THE ENGLISHMAN HERE HEARTILY SECONDED HIM,THIS SET OF ROOMS IS QUITE THE OLDEST IN THE COLLEGE AND IT IS NOT UNUSUAL FOR VISITORS TO GO OVER THEM,AS SOON AS THESE DISPOSITIONS WERE MADE THE SCOUT TURNED TO DAVID AND GAVE HIM HIS PARTING INSTRUCTIONS,IT IS MY HEART HUNG IN THE SKY AND NO CLOUDS EVER FLOAT BETWEEN THE GRAVE FLOWERS AND MY HEART ON HIGH,AS TO HIS AGE AND ALSO THE NAME OF HIS MASTER JACOB'S STATEMENT VARIED SOMEWHAT FROM THE ADVERTISEMENT,IN SHORT HE BECOMES A PROMINENT FIGURE IN LONDON SOCIETY AND IF HE IS NOT CAREFUL SOMEBODY WILL SAY SO,ON HUGE SILVER PLATTERS WERE PYRAMIDS OF TARTS AND CAKES AND RED WINE SPARKLED IN GLITTERING DECANTERS,AT THE FARTHER END OF THE LARGEST HALL A TABLE WAS SET WITH GOLDEN CUPS AND GOLDEN PLATES IN LONG ROWS,SO YOU WILL BE A GOOD GIRL I KNOW AND NOT MAKE ANY TROUBLE BUT WILL STAY AT HOME CONTENTEDLY WON'T YOU,NANCY'S CURLY CHESTNUT CROP SHONE IN THE SUN AND OLIVE'S THICK BLACK PLAITS LOOKED BLACKER BY CONTRAST,IT IS BLACK IN MISFORTUNE IT IS BLACKER STILL IN CRIME THESE TWO BLACKNESSES AMALGAMATED COMPOSE SLANG,BUT THE WINDOWS ARE PATCHED WITH WOODEN PANES AND THE DOOR I THINK IS LIKE THE GATE IT IS NEVER OPENED,YOU SEE I'VE LIVED ALL MY LIFE WITH UNC NUNKIE THE SILENT ONE AND THERE WAS NO ONE TO TELL ME ANYTHING,YEA HIS HONOURABLE WORSHIP IS WITHIN BUT HE HATH A GODLY MINISTER OR TWO WITH HIM AND LIKEWISE A LEECH,I SEE THEY LAY HELPLESS AND NAKED WEEPING AND NONE TO ANSWER NONE TO CHERISH THEE WITH MOTHERS SMILES,THE INMATES BEING REMOVED AT THE APPOINTED HOUR A FEW CANNON BALLS WERE FIRED THROUGH THE STONE WALLS,BUT IT IS THE CIGARETTE WHICH CHIEFLY HAS BROUGHT THE MODERN DRAMA TO ITS PRESENT STATE OF PERFECTION,HIS FEET WERE RED HIS LONG NARROW BEAK WITH ITS SAW TOOTHED EDGES AND SHARP HOOKED TIP WAS BRIGHT RED,HE MADE AN EFFORT TO HIDE HIS CONDITION FROM THEM ALL AND ROBIN FELT HIS FINGERS TIGHTEN UPON HIS ARM,HE KNEW HIS UNCLE WOULD BE GLAD TO HEAR THAT HE HAD AT LAST TURNED HIS THOUGHTS TO A PRACTICAL MATTER,IT ENGENDERS A WHOLE WORLD LA PEGRE FOR WHICH READ THEFT AND A HELL LA PEGRENNE FOR WHICH READ HUNGER,TABBY HAD TENDED THEM IN THEIR CHILDHOOD THEY AND NONE OTHER SHOULD TEND HER IN HER INFIRMITY AND AGE,TABBY HAD LIVED WITH THEM FOR TEN OR TWELVE YEARS AND WAS AS CHARLOTTE EXPRESSED IT ONE OF THE FAMILY,IN THE COMMUNITIES OF THE WESTERN CULTURE THIS POINT IS AT PRESENT FOUND AMONG THE LOWER MIDDLE CLASS,THE GENEALOGIES WHICH YOU HAVE RECITED TO US OUT OF YOUR OWN ANNALS SOLON ARE A MERE CHILDREN'S STORY,BUT PLATO HAS NOT THE SAME MASTERY OVER HIS INSTRUMENT WHICH HE EXHIBITS IN THE PHAEDRUS OR SYMPOSIUM,THE AIR AND THE EARTH ARE CURIOUSLY MATED AND INTERMINGLED AS IF THE ONE WERE THE BREATH OF THE OTHER,THERE WAS A UNANIMOUS GROAN AT THIS AND MUCH REPROACH AFTER WHICH IN HIS PREOCCUPIED WAY HE EXPLAINED,AT ONCE THE GOAT GAVE A LEAP ESCAPED FROM THE SOLDIERS AND WITH BOWED HEAD RUSHED UPON THE BOOLOOROO,I'M GOING TO SEE MISTER MARSHALL SAID KENNETH AND DISCOVER WHAT I CAN DO TO ASSIST YOU THANK YOU SIR,WHATEVER LORD CHELFORD SAID MISS BRANDON RECEIVED IT VERY GRACIOUSLY AND EVEN WITH A MOMENTARY SMILE,THE SOUND OF AN IMPERATIVE AND UNCOMPROMISING BELL RECALLED ME IN DUE TIME TO THE REGIONS OF REALITY,IN FIVE MINUTES I WAS IN A NEW WORLD AND MY MELANCHOLY ROOM WAS FULL OF THE LIVELIEST FRENCH COMPANY,HE GIVE UP HIS POSITION AND SHUT THE FAMILY UP IN THAT TOMB OF A HOUSE SO T HE COULD STUDY HIS BOOKS,THEY WERE BOTH REMEMBERING WHAT THE WOMAN HAD SAID WHEN SHE TOOK THE MONEY GOD GIVE YOU A HAPPY LOVE,THESE THOUGHTS AGITATED ME ALL DAY AND MY IMAGINATION SCARCELY CALMED DOWN AFTER SEVERAL HOURS SLEEP,HE RETURNED CARRYING HIS JUMPING SHOES WHICH ARE PROVIDED AS YOU ARE AWARE WITH SEVERAL SHARP SPIKES,HOW LONG WOULD IT TAKE HIM TO DO THAT USING EVERY POSSIBLE CONTRACTION A QUARTER OF AN HOUR NOT LESS,YOU'LL EASILY JUDGE WHY WHEN YOU HEAR BECAUSE THE THING HAD BEEN SUCH A SCARE HE CONTINUED TO FIX ME,AS A PRIVATE CITIZEN I SHALL BE A MODEL OF DEPORTMENT BECAUSE IT WOULD BE DANGEROUS TO BE OTHERWISE,I WAS WELL SATISFIED WITH MY CABIN WHICH WAS LOCATED IN THE STERN AND OPENED INTO THE OFFICERS MESS,JACK WOULD BECOME EVA'S HAPPY HUSBAND AND WOULD REMAIN AMIDST THE HURRIED DUTIES OF THE EAGER WORLD,BUT IN THIS FRIENDLY PRESSURE RAOUL COULD DETECT THE NERVOUS AGITATION OF A GREAT INTERNAL CONFLICT,THEY THEN RENEWED THEIR JOURNEY AND UNDER THE BETTER LIGHT MADE A SAFE CROSSING OF THE STABLE ROOFS,AND WITH IT I LEAVE YOU A NAME SIF THE FRIENDLY I SHALL HOPE TO DRINK WITH YOU SOMETIME IN VALHALLA,YOU MUST SEE LIEUTENANT I SHOULD THINK THAT WE ARE NOT SO NEAR THE COAST OF ALGERIA AS YOU IMAGINED,PLEASE TELL ME ONE THING BARTLEY AT LEAST TELL ME THAT YOU BELIEVE I THOUGHT I WAS MAKING YOU HAPPY,BUT IN EGYPT THE TRADITIONS OF OUR OWN AND OTHER LANDS ARE BY US REGISTERED FOR EVER IN OUR TEMPLES,BY HIS RESURRECTION CHRIST WON THE VICTORY OVER LAW SIN FLESH WORLD DEVIL DEATH HELL AND EVERY EVIL,I LEFT INSTRUCTIONS FOR SHIPPING MY CONTAINERS OF STUFFED ANIMALS AND DRIED PLANTS TO PARIS FRANCE,OTHER SUBTLETIES OCCUR INSIDE EACH EPISODE THE TEXTURES SPARKLING WITH WIT INFORMATION AND INSIGHT,ON ARRIVING AT HOME AT MY OWN RESIDENCE I FOUND THAT OUR SALON WAS FILLED WITH A BRILLIANT COMPANY,REMEMBERING HAS TO BE A PRESENT OCCURRENCE IN SOME WAY RESEMBLING OR RELATED TO WHAT IS REMEMBERED,AND TO THINK WE CAN SAVE ALL THAT MISERY AND DESPAIR BY THE PAYMENT OF A HUNDRED AND FIFTY DOLLARS,THE HEAD AND CHIEF OF THE RIOT THE NOTTINGHAM APPRENTICE WITH CLENCHED FISTS THREATENED MONTFICHET,YOU WERE QUITE RIGHT TO SAY NO AMBROSE BEGAN NEVER SMOKE WITH JOHN JAGO HIS CIGARS WILL POISON YOU,I SWAN TO MAN HE EJACULATED IF YOU DON'T WORK HARD YOU CAN'T KEEP UP WITH THE TIMES DOCTOR OF LAWS,I SHOULD NEVER HAVE ASKED YOU IF MOLLY HAD BEEN HERE FOR I REMEMBER YOU DON'T LIKE ENGLISH COOKERY,MOREOVER HAD THE PEOPLE BEEN INCLINED TO REBELLION WHAT GREATER OPPORTUNITY COULD THEY HAVE WISHED,I WILL MAKE YOU TRANSLATE THEM INTO FRENCH AND YOU NEED NOT BE AFRAID OF MY FINDING YOU INSATIABLE,TO THOSE DUTIES YOU HAVE NOT YET BEEN CALLED AND WHEN YOU ARE YOU WILL BE LESS EAGER FOR CELEBRITY,BUT THEY HAVE NOTHING TO DO WITH THE INTERPRETATION OF PLATO AND IN SPIRIT THEY ARE OPPOSED TO HIM,WHEREVER THE MEANS OF GRACE ARE FOUND THERE IS THE HOLY CHURCH EVEN THOUGH ANTICHRIST REIGNS THERE,THE RAFT WAS HEAVED UP ON A WATERY MOUNTAIN AND PITCHED DOWN AGAIN AT A DISTANCE OF TWENTY FATHOMS,FOR ONE LONG MOMENT HE PAUSED STUPID AGAPE WITH UTTER AMAZEMENT THEN LEANED DIZZILY AGAINST A TREE,AT LAST THE COTTON COMBINE WAS TO ALL APPEARANCES AN ASSURED FACT AND HE WAS SLATED FOR THE SENATE,WHAT SHALL WE DO WITH THE MINGOES AT THE DOOR THEY COUNT SIX AND THIS SINGER IS AS GOOD AS NOTHING,IT HAS NO BEAUTY WHATSOEVER NO SPECIALTY OF PICTURESQUENESS AND ALL ITS LINES ARE CRAMPED AND POOR,I THOUGHT WE WERE STUMPED AGAIN WHEN I FIRST SAW THAT PICTURE BUT IT'S BEEN OF SOME USE AFTER ALL,THE POOR LITTLE THINGS CRIED CYNTHIA THINK OF THEM HAVING BEEN TURNED TO THE WALL ALL THESE YEARS,SHE LOOKED AT HIS HEAVY SHOULDERS AND BIG DETERMINED HEAD THRUST FORWARD LIKE A CATAPULT IN LEASH,WESTMERE AND I WERE BACK AFTER THE FIRST ACT AND WE THOUGHT SHE SEEMED QUITE UNCERTAIN OF HERSELF,THE STYLE AND PLAN OF THE TIMAEUS DIFFER GREATLY FROM THAT OF ANY OTHER OF THE PLATONIC DIALOGUES,OTHERWISE PAUL SHOULD HAVE WRITTEN GRACE FROM GOD THE FATHER AND PEACE FROM OUR LORD JESUS CHRIST,WHEN SHE USED TO TELL ME ABOUT HIM I ALWAYS WONDERED WHETHER SHE WASN'T A LITTLE IN LOVE WITH HIM,SHE WANTED A GLANCE OF THE NEW BOOKS AND PERIODICALS AND TALK OF GREAT PHILANTHROPIES AND REFORMS,DISTRUSTING HIS OWN JUDGMENT HIS APPEALS TO THE OPINION OF CHINGACHGOOK WERE FREQUENT AND EARNEST,AND THIS PLAN WAS ADOPTED TOO IN ORDER TO EXTRACT FROM ME A PROMISE THAT I WOULD DEPART IN PEACE,HOW MUCH OF EVIL OF REAL ACCOMPLISHED EVIL HAD THERE NOT OCCURRED TO ME DURING THE LAST FEW DAYS,AS HE HAD PROMISED TO PROTECT THE HOTEL THE REASSURED CITIZENS BEGAN TO LAUGH AT THEIR OWN FEARS,THE DRAG UPON HIS BEAK AND THE LIGHT CHECK UPON HIS WINGS WERE INEXPLICABLE TO HIM AND APPALLING,FAR FROM IT SIRE YOUR MAJESTY HAVING GIVEN NO DIRECTIONS ABOUT IT THE MUSICIANS HAVE RETAINED IT,HE BEGAN A CONFUSED COMPLAINT AGAINST THE WIZARD WHO HAD VANISHED BEHIND THE CURTAIN ON THE LEFT,BUT THIS SUBJECT WILL BE MORE PROPERLY DISCUSSED WHEN WE TREAT OF THE DIFFERENT RACES OF MANKIND,APPROACHING THE DINING TABLE HE CAREFULLY PLACED THE ARTICLE IN THE CENTRE AND REMOVED THE CLOTH,TO MEET THE NEEDS OF THIS CONFLICT WRETCHEDNESS HAS INVENTED A LANGUAGE OF COMBAT WHICH IS SLANG,I AM NOT GOOD ENOUGH FOR YOU AND YOU MUST BE KEPT FROM THE CONTAMINATION OF TOO INTIMATE SOCIETY,YOUR LETTER HAS GIVEN ME GREAT PLEASURE AND I SHOULD NOT FORGIVE MYSELF IF I DID NOT TELL YOU SO,THERE JAP YOU'VE CAUGHT IT LAUGHED PERCY WHILE THE OTHERS SCREAMED AT THE SIGHT OF JASPER'S FACE,I MUST COME ANOTHER DAY AND SEE YOUR HUSBAND I WANT TO HAVE A CONSULTATION WITH HIM ABOUT HORSES,THEN SHE GAVE ROSALIE BACK HER MAGIC RING THANKING THE KIND WITCH FOR ALL SHE HAD DONE FOR THEM,AS SOON AS THEY ENTERED THE ROOM OF THE GREAT KNIFE THE BOOLOOROO GAVE A YELL OF DISAPPOINTMENT,OF THIS PARTY EDWARD A BOY OF SEVENTEEN CALLED FORTH MUCH SYMPATHY HE TOO WAS CLAIMED BY HOLLAN,THE CAT GROWLED SOFTLY PICKED UP THE PRIZE IN HER JAWS AND TROTTED INTO THE BUSHES TO DEVOUR IT,SPOKE THE SQUIRE LOSING ALL PATIENCE AND IT WAS TO YOU THAT I GAVE ANOTHER PURSE IN CONSOLATION,THE STRANGE WOMAN AND HER PASSIONATE SENTENCE THAT RANG OUT SO SHARPLY HAD FRIGHTENED THEM BOTH,THE INFLUENCE WITH THE TIMAEUS HAS EXERCISED UPON POSTERITY IS DUE PARTLY TO A MISUNDERSTANDING,THERE WAS SOMETHING INDIVIDUAL ABOUT THE GREAT FARM A MOST UNUSUAL TRIMNESS AND CARE FOR DETAIL,OH SHE'S ALWAYS AT THE PIANO SAID VAN SHE MUST BE THERE NOW SOMEWHERE AND THEN SOMEBODY LAUGHED,BRAVELY AND GENEROUSLY HAS HE BATTLED IN MY BEHALF AND THIS AND MORE WILL I DARE IN HIS SERVICE,SHE WAS A LARGE HOMELY WOMAN THEY WERE COMMON WHITE PEOPLE WITH NO REPUTATION IN THE COMMUNITY,SEMON'S TWO BOOKS MENTIONED IN AN EARLIER LECTURE DO NOT TOUCH KNOWLEDGE MEMORY AT ALL CLOSELY,CAPTAIN MARTIN SAID I SHALL GIVE YOU A PISTOL TO HELP PROTECT YOURSELF IF WORSE COMES TO WORST,THERE CANNOT BE A DOUBT HE RECEIVED YOU KINDLY FOR IN FACT YOU RETURNED WITHOUT HIS PERMISSION,HE WAS SOFT HEARTED AND IMPETUOUS SAID BETH AND BEING IN LOVE HE DIDN'T STOP TO COUNT THE COST,CRIED HE WAVING THE LANTHORN BEFORE HIM TO MAKE SURE THAT THESE WERE NO GHOSTS IN FRONT OF HIM,TO RELIEVE HER FROM BOTH HE LAID HIS HAND WITH FORCE UPON HIS HEART AND SAID DO YOU BELIEVE ME,CONSUMPTION BECOMES A LARGER ELEMENT IN THE STANDARD OF LIVING IN THE CITY THAN IN THE COUNTRY,AGAINST THESE BOASTING FALSE APOSTLES PAUL BOLDLY DEFENDS HIS APOSTOLIC AUTHORITY AND MINISTRY,DO YOU SUPPOSE THAT GOD FOR THE SAKE OF A FEW LUTHERAN HERETICS WOULD DISOWN HIS ENTIRE CHURCH,OH YOU ARE THE DEAREST AND BEST MISTER KING I EVER SAW BUT HOW DID YOU MAKE MAMMY LET HER COME,HOLMES HELD OUT A SMALL CHIP WITH THE LETTERS N N AND A SPACE OF CLEAR WOOD AFTER THEM YOU SEE,YET HERE ARE WE WITHIN A SHORT RANGE OF THE SCAROONS AND NOT A SIGN OF A TRAIL HAVE WE CROSSED,I WILL SHOW YOU WHAT A GOOD JOB I DID AND SHE WENT TO A TALL CUPBOARD AND THREW OPEN THE DOORS,THE FIRST LOT WE TESTED ON OUR GLASS CAT WHICH NOT ONLY BEGAN TO LIVE BUT HAS LIVED EVER SINCE,IT SOUNDED DULL IT SOUNDED STRANGE AND ALL THE MORE SO BECAUSE OF HIS MAIN CONDITION WHICH WAS,SHE ROSE QUICKLY TO HER FEET WITH AN IMPETUOUS GESTURE THAT MADE HER VISITOR CATCH HER BREATH,AND THIS WAS WHY KENNETH AND BETH DISCOVERED HIM CONVERSING WITH THE YOUNG WOMAN IN THE BUGGY,FITZOOTH'S HAND RESTED AT LAST UPON THE TOP RUNG OF A LADDER AND SLOWLY THE TRUTH CAME TO HIM,FRIENDS SAID MONTFICHET FAINTLY TO THE WRESTLERS BEAR US ESCORT SO FAR AS THE SHERIFF'S HOUSE,CHOKING WITH EMOTION LEOCADI MADE A SIGN TO HER PARENTS THAT SHE WISHED TO BE ALONE WITH THEM,AT THAT MOMENT THE GENTLEMAN ENTERED BEARING A HUGE OBJECT CONCEALED BY A PIECE OF GREEN FELT,SHE CLOSED HER EYES AND TOOK A DEEP BREATH AS IF TO DRAW IN AGAIN THE FRAGRANCE OF THOSE DAYS,NONSENSE OF COURSE I CAN'T REALLY SING EXCEPT THE WAY MY MOTHER AND GRANDMOTHER DID BEFORE ME,SHE INTRODUCED ME TO ALL HER GUESTS AND GAVE ME SOME PARTICULARS RESPECTING EVERY ONE OF THEM,I HAD NOT VENTURED TO HOPE FOR SUCH A REPLY SO CONSIDERATE IN ITS TONE SO NOBLE IN ITS SPIRIT,WE WERE MORE INTERESTED IN THE TECHNICAL CONDITION OF THE STATION THAN IN THE COMMERCIAL PART,THERE MIGHT BE A BIT OF POETRY HERE AND THERE BUT MOST OF THIS PLACE WAS SUCH DESPERATE PROSE,THEN AS IF SATISFIED OF THEIR SAFETY THE SCOUT LEFT HIS POSITION AND SLOWLY ENTERED THE PLACE,THE PRIDE OF THAT DIM IMAGE BROUGHT BACK TO HIS MIND THE DIGNITY OF THE OFFICE HE HAD REFUSED,A GENTLE KICK FROM THE TALL BOY IN THE BENCH BEHIND URGED STEPHEN TO ASK A DIFFICULT QUESTION,THE CHAOS IN WHICH HIS ARDOUR EXTINGUISHED ITSELF WAS A COLD INDIFFERENT KNOWLEDGE OF HIMSELF,AS HE FLEW HIS DOWN REACHING CLUTCHING TALONS WERE NOT HALF A YARD ABOVE THE FUGITIVE'S HEAD,AND THE GARDENER'S BOY CHOPPED THE TREE INTO SMALL PIECES THERE WAS A WHOLE HEAP LYING THERE,I COULD NOT SEE MY BOY INJURED EXCELLENCE FOR BUT DOING HIS DUTY AS ONE OF CUMBERLAND'S SONS,SHE SIGNED TO ME WITH A GHOSTLY SOLEMNITY TO TAKE THE VACANT PLACE ON THE LEFT OF HER FATHER,TO DIMINISH THE NUMBER OF THE SHADY TO AUGMENT THE NUMBER OF THE LUMINOUS THAT IS THE OBJECT,I HAD A NAME I BELIEVE IN MY YOUNG DAYS BUT I HAVE FORGOTTEN IT SINCE I HAVE BEEN IN SERVICE,THE IDEAS ALSO REMAIN BUT THEY HAVE BECOME TYPES IN NATURE FORMS OF MEN ANIMALS BIRDS FISHES,ON SHE HURRIED UNTIL SWEEPING DOWN TO THE LAGOON AND THE ISLAND LO THE COTTON LAY BEFORE HER,CAN THESE THINGS BE RETURNED DAVID BREATHING MORE FREELY AS THE TRUTH BEGAN TO DAWN UPON HIM,A BED QUILT MADE OF PATCHES OF DIFFERENT KINDS AND COLORS OF CLOTH ALL NEATLY SEWED TOGETHER,WE ARE TRAVELING REPLIED OJO AND WE STOPPED AT YOUR HOUSE JUST TO REST AND REFRESH OURSELVES,I DID NOT MEAN SAID CAPTAIN BATTLEAX TO TOUCH UPON PUBLIC SUBJECTS AT SUCH A MOMENT AS THIS,THIS HAS INDEED BEEN A HARASSING DAY CONTINUED THE YOUNG MAN HIS EYES FIXED UPON HIS FRIEND,IF THE COUNT WERE ON BOARD A STRANGE FATALITY WAS BRINGING HIM TO THE PRESENCE OF HIS RIVAL,I FELT IT IN MY BONES WHEN I WOKE THIS MORNING THAT SOMETHING SPLENDID WAS GOING TO TURN UP,YOU WILL SAY THAT A WOMAN HAS NO NEED OF SUCH A CAUTION THERE CAN BE NO PERIL IN IT FOR HER,THE UTILITY OF CONSUMPTION AS AN EVIDENCE OF WEALTH IS TO BE CLASSED AS A DERIVATIVE GROWTH,PAUL ANSWERS THE MAN WHO IS NAMED JESUS CHRIST AND THE SON OF GOD GAVE HIMSELF FOR OUR SINS,THEY DO NOT GO WHERE THE ENEMIES OF THE GOSPEL PREDOMINATE THEY GO WHERE THE CHRISTIANS ARE,NO THANK YOU I'LL JUST LOOK AT THE WHELPS AND LEAVE A MESSAGE ABOUT THEM WITH YOUR SHEPHERD,WE HAVE OUR LITTLE STRUGGLES HERE AS ELSEWHERE AND ALL THINGS CANNOT BE DONE BY ROSE WATER,IN THE LIGHT OF THE MOON I SAW A KNIFE RED WITH BLOOD AND MY HAND TOO WAS ALSO DISCOLOURED,THEY LEFT HIM THEN FOR THE JAILER ARRIVED TO UNLOCK THE DOOR AND ESCORT THEM TO THE OFFICE,I HAVE VERY FEW TO LOVE ME NOW AND I THOUGHT YOU MIGHT LOVE ME AS I HAVE BEGUN TO LOVE YOU,YES AND WITH ALL YOUR FINGERS IT TOOK YOU A YEAR TO CATCH ME THE KING FROWNED MORE ANGRILY,IT HAS OCCUPIED MOTHER A LONG TIME TO FIND AT THE SHOPS THE EXACT SHADE FOR HER NEW BONNET,HE REFUSED AT FIRST TO LISTEN TO THE CAREFUL ADVICE IT WAS REPUGNANT TO HIS LIBERAL NATURE,THIS IS THE EXPLANATION OF THE SHALLOWS WHICH ARE FOUND IN THAT PART OF THE ATLANTIC OCEAN,MANY LAWS EXIST AMONG US WHICH ARE THE COUNTERPART OF YOURS AS THEY WERE IN THE OLDEN TIME,THE TERMS OF GRACE AND PEACE ARE COMMON TERMS WITH PAUL AND ARE NOW PRETTY WELL UNDERSTOOD,I CAN'T PLAY WITH YOU LIKE A LITTLE BOY ANY MORE HE SAID SLOWLY THAT'S WHAT YOU MISS MARIE,FRANK READ ENGLISH SLOWLY AND THE MORE HE READ ABOUT THIS DIVORCE CASE THE ANGRIER HE GREW,YOU OUGHT TO KNOW JOHN IF I TEACH NEGROES I'LL SCARCELY SEE MUCH OF PEOPLE IN MY OWN CLASS,FIND SOME CRESSWELLS THERE BIG PLANTATIONS RATED AT TWO HUNDRED AND FIFTY THOUSAND DOLLARS,WITHOUT HIS SCRAPBOOKS HIS CHEMICALS AND HIS HOMELY UNTIDINESS HE WAS AN UNCOMFORTABLE MAN,IF A LAYMAN IN GIVING BAPTISM POUR THE WATER BEFORE SAYING THE WORDS IS THE CHILD BAPTIZED,I CAN ASSURE YOU HE HAS NOT EVEN ALLOWED ME TO SEE THE TRIGGER SINCE I HAVE BEEN ON BOARD,TEN DAYS WERE CONSUMED IN THESE NEGOTIATIONS BUT THE SPIRIT OF VENGEANCE REFUSED TO YIELD,BUT THE TREE DID NOT REJOICE AT ALL HE GREW AND GREW AND WAS GREEN BOTH WINTER AND SUMMER,HE LOOKED UP AT NAOMI DOUBTINGLY FROM HIS PLATE AND LOOKED DOWN AGAIN SLOWLY WITH A FROWN,THE ONLY CHEERFUL CONVERSATION WAS THE CONVERSATION ACROSS THE TABLE BETWEEN NAOMI AND ME,YOU WOULD NOT EAT WITH US YOU CANNOT SAY NO TO HALF OF MY ALE I DRINK THIS TO YOUR HEALTH,OH IT IS BETTER TO LIVE ON THE SEA AND LET OTHER MEN RAISE YOUR CROPS AND COOK YOUR MEALS,AT TEA TIME THEY WERE SAD AND SILENT AND THE MEAL WENT AWAY UNTOUCHED BY ANY OF THE THREE,YOU SEEM ANXIOUS MY UNCLE I SAID SEEING HIM CONTINUALLY WITH HIS GLASS TO HIS EYE ANXIOUS,HE FELT HE WAS UP AGAINST IT AND THAT PERHAPS ANOTHER KIND OF A JOB WOULD SUIT HIM BETTER,GOOBERS DON'T GROW ON THE TOPS OF VINES BUT UNDERGROUND ON THE ROOTS LIKE YAMS IS THAT SO,MISS TAYLOR DID NOT KNOW MUCH ABOUT COTTON BUT AT LEAST ONE MORE REMARK SEEMED CALLED FOR,MY SCHOLAR HAS BEEN LEFT VERY POOR BUT HE IS HARD WORKING AND INDUSTRIOUS HE WILL DO WELL,THEN HE APPROACHED IT AND STANDING ON TIPTOE WITH HIS NECK CRANED HE LOOKED INTO THE ROOM,BUT IN THIS VIGNETTE COPIED FROM TURNER YOU HAVE THE TWO PRINCIPLES BROUGHT OUT PERFECTLY,HE SUMMONED HALF A DOZEN CITIZENS TO JOIN HIS POSSE WHO FOLLOWED OBEYED AND ASSISTED HIM,DOUBLE NINE TWO THREE ELSINORE DOUBLE NINE YES HALLO IS THAT YOU HORATIO HAMLET SPEAKING,WHERE THE WAVES FOR AN INSTANT SANK THEY CAME CLOSER BUT NOT QUITE WITHIN GRASPING REACH,QUICK QUICK THEN AMONG THE HIGH REED GRASS SAID MONTALAIS STOOP ATHENAIS YOU ARE SO TALL,THE GOLDEN STAR OF TINSEL WAS STILL ON THE TOP OF THE TREE AND GLITTERED IN THE SUNSHINE,MASTER MONCEUX THE SHERIFF OF NOTTINGHAM WAS MIGHTILY PUT ABOUT WHEN TOLD OF THE RIOTING,NOW BE SILENT ON YOUR LIVES HE BEGAN BUT THE CAPTURED APPRENTICE SET UP AN INSTANT SHOUT,AND SHE THREW HER ARMS ROUND HER COUSIN'S NECK AND BRAVE RACHEL AT LAST BURST INTO TEARS,PHILIP LEFRANK THIS IS MY OVERLOOKER MISTER JAGO SAID THE OLD MAN FORMALLY PRESENTING US,BUT PHILIP IS HONEST AND HE HAS TALENT ENOUGH IF HE WILL STOP SCRIBBLING TO MAKE HIS WAY,THE SALIENT FEATURES OF THIS DEVELOPMENT OF DOMESTIC SERVICE HAVE ALREADY BEEN INDICATED,SO MUCH FOR THE TITLE OF THE EPISTLE NOW FOLLOWS THE GREETING OF THE APOSTLE VERSE THREE,I SAW AT THE HAMBURG MUSEUM THE SKELETON OF ONE OF THESE CREATURES THIRTY FEET IN LENGTH,THEY DREW BACK A LITTLE FROM THE ENTRANCE AND MOTIONED TO THE SUPPOSED CONJURER TO ENTER,SHE RAN TO HER HUSBAND'S SIDE AT ONCE AND HELPED HIM LIFT THE FOUR KETTLES FROM THE FIRE,THEN THEY STARTED ON AGAIN AND TWO HOURS LATER CAME IN SIGHT OF THE HOUSE OF DOCTOR PIPT,I COULD WRITE TO MY MAN AND ENCLOSE THE KEY HE COULD SEND DOWN THE PACKET AS HE FINDS IT,LOVE IS A BABE THEN MIGHT I NOT SAY SO TO GIVE FULL GROWTH TO THAT WHICH STILL DOTH GROW,THUS NO KNOWLEDGE AS TO THE PAST IS TO BE DERIVED FROM THE FEELING OF FAMILIARITY ALONE,YES THE CHARACTER WHICH YOUR ROYAL HIGHNESS ASSUMED IS IN PERFECT HARMONY WITH YOUR OWN,THEN TURNING TO JANE SHE ASKED IN A SOMEWHAT ALTERED TONE HAS SHE BEEN A GOOD GIRL JANE,WHAT THEN A HUMAN HAND LARGE AND SHAPELY APPEARED DISTINCTLY ON THE SURFACE OF THE POND,WE'LL COME IN HERE THIS AFTERNOON WITH OLD CLOTHES ON AND HAVE A REGULAR HOUSE CLEANING,I AM NOW TALL AND MY BRANCHES SPREAD LIKE THE OTHERS THAT WERE CARRIED OFF LAST YEAR OH,RACHEL'S PALE AND SHARPENED FEATURES AND DILATED EYE STRUCK HER WITH A PAINFUL SURPRISE,A NEW MEMBER OF THE FAMILY CIRCLE WHO INSTANTLY ATTRACTED MY ATTENTION ENTERED THE ROOM,WHATEVER APPEALED TO HER SENSE OF BEAUTY WAS STRAIGHTWAY TRANSFERRED TO PAPER OR CANVAS,I WILL MAKE NO UNJUST USE OF WHAT I KNOW HE REPLIED WITH FIRMNESS I BELIEVE YOU MY LORD,EACH WILL THEREFORE SERVE ABOUT EQUALLY WELL DURING THE EARLIER STAGES OF SOCIAL GROWTH,MANY IF NOT ALL THE ELEMENTS OF THE PRE SOCRATIC PHILOSOPHY ARE INCLUDED IN THE TIMAEUS,YOU'RE A RARE UN FOR SITTING DOWN TO YOUR WORK A LITTLE WHILE AFTER IT'S TIME TO PUT BY,EVERY PLANT IN THE GRASS IS SET FORMALLY GROWS PERFECTLY AND MAY BE REALIZED COMPLETELY,I LOVE THEE WITH THE PASSION PUT TO USE IN MY OLD GRIEFS AND WITH MY CHILDHOOD'S FAITH,I LOVE THEE FREELY AS MEN STRIVE FOR RIGHT I LOVE THEE PURELY AS THEY TURN FROM PRAISE,THE COMBINED BANDS OF BOTH THE COUNTRIES PLAYED THE MUSIC AND A FINE SUPPER WAS SERVED,THEREFORE HER MAJESTY PAID NO ATTENTION TO ANYONE AND NO ONE PAID ANY ATTENTION TO HER,EVEN SO I HAD JUST RETURNED FROM AN ARDUOUS JOURNEY EXHAUSTED AND BADLY NEEDING A REST,THE NAUTILUS NEARLY PERISHES IN THE ANTARCTIC AND NEMO SINKS INTO A GROWING DEPRESSION,IN THIS CASE AS IN MOST OTHERS WHAT MAY BE TAKEN AS CERTAIN IN ADVANCE IS RATHER VAGUE,HE PASSED THROUGH HENLEY SAINT ALBANS AND CAME SO NEAR TO LONDON AS HARROW ON THE HILL,THE ONLY THING NECESSARY WAS TO FIX SETH REYNOLDS AND THIS HOPKINS ARRANGED PERSONALLY,BUT I WRESTLED WITH THIS FELLOW AND DO KNOW THAT HE PLAYED UNFAIRLY IN THE SECOND BOUT,I WAS THINKING IT'S VERY LIKE THE ACE OF HEARTS ANSWERED THE CAPTAIN SOFTLY SMILING ON,I STOOD WITH MY BACK TO THE WALL FOR I WANTED NO SWORD REACHING OUT OF THE DARK FOR ME,NOTHING WAS TO BE DONE BUT TO PUT ABOUT AND RETURN IN DISAPPOINTMENT TOWARDS THE NORTH,MY YACHT IS AT YOUR SERVICE SIR EVEN SHOULD YOU REQUIRE TO MAKE A TOUR ROUND THE WORLD,IT IS SUCH A NOBLE AMBITION THAT IT IS A PITY IT HAS USUALLY SUCH A SHALLOW FOUNDATION,BARTLEY STARTED WHEN HILDA RANG THE LITTLE BELL BESIDE HER DEAR ME WHY DID YOU DO THAT,IN THE EVENINGS I CONFESS I DO THINK BUT I NEVER TROUBLE ANY ONE ELSE WITH MY THOUGHTS,THE VICIOUS CHARACTER OF SIN IS BROUGHT OUT BY THE WORDS WHO GAVE HIMSELF FOR OUR SINS,I THINK THAT WILL DO SHE CONTINUED FOR THE OTHER QUALITIES ARE NOT NEEDED IN A SERVANT,HE DARTED LIKE AN ARROW THROUGH ALL THE HALLS DOWN ALL THE STAIRS AND ACROSS THE YARD,BUT YOU MUST NOT EAT WITH YOUR CAP ON YOUR HEAD SHE SAID AND WAS GOING TO TAKE IT OFF,THE TWIN BROTHER DID SOMETHING SHE DIDN'T LIKE AND SHE TURNED HIS PICTURE TO THE WALL,THEY REGAINED THEIR APARTMENT APPARENTLY WITHOUT DISTURBING THE HOUSEHOLD OF GAMEWELL,IN THE NATURE OF THINGS LUXURIES AND THE COMFORTS OF LIFE BELONG TO THE LEISURE CLASS,I WISH I HADN'T CRIED SO MUCH SAID ALICE AS SHE SWAM ABOUT TRYING TO FIND HER WAY OUT,A SUFFOCATING SMELL OF NITROGEN FILLS THE AIR IT ENTERS THE THROAT IT FILLS THE LUNGS,I WISH YOU WEREN'T SO RESTLESS AND DIDN'T GET SO WORKED UP OVER THINGS SHE SAID SADLY,HENCE THE EDISON ELECTROLYTIC METER IS NO LONGER USED DESPITE ITS EXCELLENT QUALITIES,WHY IF WE ERECT A STATION AT THE FALLS IT IS A GREAT ECONOMY TO GET IT UP TO THE CITY,THE MOMENT I LOOKED AT MY TABLE I WAS AWARE THAT SOMEONE HAD RUMMAGED AMONG MY PAPERS,FOR A LONG TIME HE HAD WISHED TO EXPLORE THE BEAUTIFUL LAND OF OZ IN WHICH THEY LIVED,SOMEONE ELSE TOLD A STORY NOT PARTICULARLY EFFECTIVE WHICH I SAW HE WAS NOT FOLLOWING,BUT NOW HERE IS A SUBJECT OF WHICH YOU WILL WONDER AT FIRST WHY TURNER DREW IT AT ALL,YOU GAVE ME DOUBLE FIVE I WANT DOUBLE NINE HALLO IS THAT YOU HORATIO HAMLET SPEAKING,EXQUISITE SOFT TURF OF THE WOODS THE HAPPINESS WHICH YOUR FRIENDSHIP CONFERS UPON ME,YET LITTLE AS IT WAS IT HAD ALREADY MADE A VAST DIFFERENCE IN THE ASPECT OF THE ROOM,OLD WILL IS A FINE FELLOW BUT POOR AND HELPLESS SINCE MISSUS ROGERS HAD HER ACCIDENT,THE WOOD FLAMED UP SPLENDIDLY UNDER THE LARGE BREWING COPPER AND IT SIGHED SO DEEPLY,I WOULD FAIN KNOW IF I AM DESTINED FOR SO GLORIOUS A CAREER CRIED THE TREE REJOICING,WE WILL GO OUT TOGETHER TO THE BOWER THERE IS A WAY DOWN TO THE COURT FROM MY WINDOW,FINALLY THE ONE PARTY WENT OFF EXULTING AND THE OTHER WAS LEFT IN DESOLATION AND WOE,SHE BLUSHED AND SMILED AND FUMBLED HIS CARD IN HER CONFUSION BEFORE SHE RAN UPSTAIRS,THE MODERN ORGANIZATION OF INDUSTRY WORKS IN THE SAME DIRECTION ALSO BY ANOTHER LINE,ISN'T HE SPLENDID CRIED JASPER IN INTENSE PRIDE SWELLING UP FATHER KNEW HOW TO DO IT,HER REGARD SHIFTED TO THE GREEN STALKS AND LEAVES AGAIN AND SHE STARTED TO MOVE AWAY,WHEN WE WERE OUT IN THE DARKNESS OF THE QUADRANGLE WE AGAIN LOOKED UP AT THE WINDOWS,HE WAS STILL SUFFERING FROM THIS SUDDEN DISTURBANCE OF THE QUIET ROUTINE OF HIS LIFE,SEE THAT YOUR LIVES BE IN NOTHING WORSE THAN A BOY'S CLIMBING FOR HIS ENTANGLED KITE,WHEN CALLED BEFORE I TOLD HOW HASTILY I DROPPED MY FLOWERS OR BRAKE OFF FROM A GAME,DEPARTING FROM FIVE HUNDRED THOUSAND THROATS THREE CHEERS BURST FORTH IN SUCCESSION,THEN SAID SIR FERDINANDO THERE IS NOTHING FOR IT BUT THAT HE MUST TAKE YOU WITH HIM,THE MILITARY FORCE PARTLY RABBLE PARTLY ORGANIZED HAD MEANWHILE MOVED INTO THE TOWN,UPON THIS MADAME DEIGNED TO TURN HER EYES LANGUISHINGLY TOWARDS THE COMTE OBSERVING,TABLES WERE SPREAD ON THE LAWN AND A DAINTY BUT SUBSTANTIAL REPAST WAS TO BE SERVED,DON'T YOU KNOW ONE ABOUT BACON AND TALLOW CANDLES CAN'T YOU TELL ANY LARDER STORIES,WHEREUPON LAKE LAUGHED QUIETLY STILL LOOKING ON THE ACE OF HEARTS WITH HIS SLY EYES,AMBROSE MET ME AT THE BOTTOM OF THE STAIRS AND SHOWED ME THE WAY TO THE SUPPER ROOM,IS IT NOT IMPOSSIBLE HE MURMURED ALOUD THAT ANY CITY SHOULD DISAPPEAR SO COMPLETELY,TRUE HISTORY BEING A MIXTURE OF ALL THINGS THE TRUE HISTORIAN MINGLES IN EVERYTHING,BARTLEY BENT OVER AND TOOK HER IN HIS ARMS KISSING HER MOUTH AND HER WET TIRED EYES,THEY ASKED HIM TO COME TO SEE THEM IN CHELSEA AND THEY SPOKE VERY TENDERLY OF HILDA,AS USED IN THE SPEECH OF EVERYDAY LIFE THE WORD CARRIES AN UNDERTONE OF DEPRECATION,PAUL DECLARES THAT THE FALSE APOSTLES WERE CALLED OR SENT NEITHER BY MEN NOR BY MAN,I TAKE THIS AS MY ANSWER AND I LEAVE THE PROFESSOR TO BITE HIS LIPS WITH IMPATIENCE,I ENTERED AND I TOOK YOU INTO MY CONFIDENCE AS TO THE SUGGESTIONS OF THE SIDE TABLE,SOMETIMES IT IS CALLED A CRAZY QUILT BECAUSE THE PATCHES AND COLORS ARE SO MIXED UP,IT WASN'T SIMPLY THAT SHE SAID SO BUT THAT I KNEW SHE HADN'T I WAS SURE I COULD SEE,HE STOOD STILL IN DEFERENCE TO THEIR CALLS AND PARRIED THEIR BANTER WITH EASY WORDS,MUSSULMANS AND GIAOURS THROW KERCHIEFS AT A SMILE AND HAVE NO RUTH FOR ANY WEEPING,THIS SHE SAID WAS TRUE HOSPITALITY AND I AM NOT SURE THAT I DID NOT AGREE WITH HER,MY WIFE ON THE SPUR OF THE MOMENT MANAGED TO GIVE THE GENTLEMEN A VERY GOOD DINNER,THE FIRST OF OUR VAGUE BUT INDUBITABLE DATA IS THAT THERE IS KNOWLEDGE OF THE PAST,HE CONTINUED HIS PRETENDED SEARCH AND TO GIVE COLOR TO HIS ERRAND MADE TWO ARRESTS,LORD JOHN TAKING OUT GOLD CIGARETTE CASE FROM HIS LEFT HAND UPPER WAISTCOAT POCKET,WELL SAID MADEMOISELLE DE TONNAY CHARENTE I ALSO THINK A GOOD DEAL BUT I TAKE CARE,HERS HAPPENED TO BE IN THE SAME FRAME TOO BUT SHE EVIDENTLY DIDN'T CARE ABOUT THAT,THUS IT IS THAT THE HONOR OF THREE IS SAVED OUR COUNTRY'S OUR MASTER'S AND OUR OWN,ELIZA CLOSED THE DOOR BEHIND HER WITH A DECIDED SLAM AND A KEY CLICKED IN THE LOCK,ROBIN CAREFULLY DESCENDED THE LADDER AND FOUND HIMSELF SOON UPON FIRM ROCKY GROUND,THERE WAS NO CHANCE TO ALTER HIS SLEEPING ROOM TO ONE NEARER TO GAMEWELL'S CHAMBER,HE WAS IN DEEP CONVERSE WITH THE CLERK AND ENTERED THE HALL HOLDING HIM BY THE ARM,YOU ARE A WORTHY LEECH WILL PRESENTLY WHISPERED ROBIN THE WINE HAS WORKED A MARVEL,THIS TRANSIENT SPRING AND LIGHTING UP ARE BEAUTIFUL A GLAMOUR BEGUILING OUR SENSES,OUR FIRST IMPRESSIONS OF PEOPLE ARE IN NINE CASES OUT OF TEN THE RIGHT IMPRESSIONS,HE SHALL NOT LEAVE YOU DAY OR NIGHT WHETHER YOU ARE WORKING OR PLAYING OR SLEEPING,AND WHAT DEMONSTRATION DO YOU OFFER ASKED SERVADAC EAGERLY THAT IT WILL NOT HAPPEN,FAST AS HIS LEGS COULD CARRY HIM SERVADAC HAD MADE HIS WAY TO THE TOP OF THE CLIFF,HOW BROWN YOU'VE GOT SINCE YOU CAME HOME I WISH I HAD AN ATHLETE TO MOW MY ORCHARD,I DIDN'T HAVE ANY FEARS IF I WORKED IT RIGHTLY SAID THE OLD GENTLEMAN COMPLACENTLY,NO SIR HE ISN'T HE'S GONE TO ROSSETER TO SEE MISTER WEST THE FACTOR ABOUT THE WOOL,FOR A WHILE SHE LAY IN HER CHAIR IN HAPPY DREAMY PLEASURE AT SUN AND BIRD AND TREE,PEARL SEEING THE ROSE BUSHES BEGAN TO CRY FOR A RED ROSE AND WOULD NOT BE PACIFIED,A RING OF AMETHYST I COULD NOT WEAR HERE PLAINER TO MY SIGHT THAN THAT FIRST KISS,SCUSE ME SAID TROT I NEGLECTED TO TELL YOU THAT YOU'RE NOT THE BOOLOOROO ANY MORE,THERE WAS GOOD REASON TO STOP AND THINK EVEN FOR THE WORLD'S MOST EMOTIONLESS MAN,SUBSTANTIALLY THIS WAS JACOB'S UNVARNISHED DESCRIPTION OF HIS MASTER AND MISTRESS,SOME POINTS MAY BE TAKEN AS FIXED AND SUCH AS ANY THEORY OF MEMORY MUST ARRIVE AT,THE LEADERS OF THE CONSPIRACY BECAME DISTRUSTFUL OF THEIR POWER TO CRUSH THE TOWN,ALL ABOUT HIM WAS A TUMULT OF BRIGHT AND BROKEN COLOR SCATTERED IN BROAD SPLASHES,OH MADEMOISELLE WHY HAVE I NOT A DEVOTED SISTER OR A TRUE FRIEND SUCH AS YOURSELF,YOU HAVE COME ANDELLA ANDELLA WAS THE NAME OF JANE'S DOLL TO MAKE ROSALIE A VISIT,SOME GIRL HAS BEEN HERE TWICE TO INTERVIEW MY MEN AND I HAVE REFUSED TO ADMIT HER,AS REGARDS MY ROBBING THE COMPANY I'LL SAY THAT I SAVED THEM A HEAVY LOSS ONE DAY,THEY WERE RECEIVED IN THE LITTLE OFFICE BY A MAN NAMED MARKHAM WHO WAS THE JAILER,FAIRVIEW WAS TWELVE MILES AWAY BUT BY TEN O'CLOCK THEY DREW UP AT THE COUNTY JAIL,HE FELT FOR AND FOUND THE WIZARD'S BLACK CLOTH THE SQUIRE WAS QUITE OUT OF BREATH,I BELIEVE I HAVE A LITTLE TASTE THAT WAY THOSE ARE ALL REAL YOU KNOW THOSE JEWELS,WHAT IS YOUR COUNTRY OLAF HAVE YOU ALWAYS BEEN A THRALL THE THRALL'S EYES FLASHED,IT WAS ON THE LAST DAY OF JANUARY THAT THE REPAIRS OF THE SCHOONER WERE COMPLETED,WHAT SHE WANTED FROM US WAS NEITHER OUR FLOWERS NOR OUR FRANCS BUT JUST OUR YOUTH,I SEE A CROWD IN ONE CORNER OF THE GARDEN EVERYBODY STANDING STILL AND LOOKING UP,BUT THE REAL SIGNIFICANCE AND COMFORT OF THE WORDS FOR OUR SINS IS LOST UPON THEM,IT IS POSSIBLE THAT I MAY BE IN A POSITION THEN TO INDICATE SOME COURSE OF ACTION,THEIR ASSUMED CHARACTER CHANGED WITH THEIR CHANGING OPPORTUNITIES OR NECESSITIES,THE HAWK SAT UPON THE BRANCH AND WATCHED HIS QUARRY SWIMMING BENEATH THE SURFACE,AND ALL HIS BROTHERS AND SISTERS STOOD ROUND AND LISTENED WITH THEIR MOUTHS OPEN,WON'T YOU RUN INTO THE HOUSE AND SEE IF MARTHA CAN'T SPARE ONE OR TWO MORE MAIDS,I DIDN'T STOP TO THINK WHETHER IT WAS FOOLISH OR NOT I DID IT AND I'M GLAD I DID,SIT DOWN PLEASE SAID GATES IN A CHEERFUL AND PLEASANT VOICE THERE'S A BENCH HERE,I TOOK FIVE GREAT BRACELETS OF GOLD FROM OUR TREASURE CHEST AND GAVE THEM TO HIM,AS OUR BOAT FLASHED DOWN THE ROLLERS INTO THE WATER I MADE THIS SONG AND SANG IT,HAS THEE CONSULTED THY MOTHER ABOUT A CAREER I SUPPOSE IT IS A CAREER THEE WANTS,I HAVEN'T HAD A CHANCE YET TO TELL YOU WHAT A JOLLY LITTLE PLACE I THINK THIS IS,SHE CONSIDERED A MOMENT AND THEN SAID NO I THINK NOT THOUGH I AM GLAD YOU ASK ME,WE ARE TO HEAR CHRIST WHO HAS BEEN APPOINTED BY THE FATHER AS OUR DIVINE TEACHER,FOR A MOMENT GILCHRIST WITH UPRAISED HAND TRIED TO CONTROL HIS WRITHING FEATURES,BUT THE DUSK DEEPENING IN THE SCHOOLROOM COVERED OVER HIS THOUGHTS THE BELL RANG,THE PECULIAR CIRCUMSTANCES OF THE COLONY ARE WITHIN YOUR EXCELLENCY'S KNOWLEDGE,THEIR DISTINCTIVE CHARACTERS HOWEVER DISPLAY ONE BROAD AND UNFAILING DIFFERENCE,THE HAWK ALIGHTED ON THE DEAD BRANCH AND SAT UPRIGHT MOTIONLESS AS IF SURPRISED,SOME MYSTERIOUS FORCE SEEMED TO HAVE BROUGHT ABOUT A CONVULSION OF THE ELEMENTS,I LEFT YOU ON A CONTINENT AND HERE I HAVE THE HONOR OF FINDING YOU ON AN ISLAND,ALWAYS IRRITABLE COLD INDIFFERENT HE HAD GROWN RAPIDLY MORE SO AS YEARS WENT ON,ALL THESE HONEST PERSONS ARE WAITING THEIR TURN TO GET THEIR SNUFF BOXES FILLED,ON THE OTHER HAND WE ARE NOT TO REGARD THEM AS SO TERRIBLE THAT WE MUST DESPAIR,PAUL TAKES PRIDE IN HIS MINISTRY NOT TO HIS OWN PRAISE BUT TO THE PRAISE OF GOD,MARY TAYLOR HOWEVER RELATED THE TALE OF ZORA TO MISSUS GREY'S PRIVATE EAR LATER,THAT IS ONE REASON YOU ARE OJO THE UNLUCKY SAID THE WOMAN IN A SYMPATHETIC TONE,SO I RETURN REBUK'D TO MY CONTENT AND GAIN BY ILL THRICE MORE THAN I HAVE SPENT,STEPHEN'S HEART BEGAN SLOWLY TO FOLD AND FADE WITH FEAR LIKE A WITHERING FLOWER,OUR BAGGAGE WAS IMMEDIATELY CARRIED TO THE DECK OF THE FRIGATE I RUSHED ABOARD,THIS WAS A FORMIDABLE ARRAY OF ADVANTAGES SLAVERY WAS PLAYING WITH LOADED DICE,FOR LIKE AS NOT THEY MUST HAVE THOUGHT HIM A PRINCE WHEN THEY SAW HIS FINE CAP,THEY ARE CHIEFLY FORMED FROM COMBINATIONS OF THE IMPRESSIONS MADE IN CHILDHOOD,CONGRATULATIONS WERE POURED IN UPON THE PRINCESS EVERYWHERE DURING HER JOURNEY,NAY WE REFUSED THEIR REQUEST MOST POLITELY MOST NOBLE SAID THE LITTLE STROLLER,TO MY MIND THERE HAS ALWAYS BEEN SOMETHING INEXPRESSIBLY AWFUL IN FAMILY FEUDS,I'M GLAD YOU LIKE IT SAYS WYLDER CHUCKLING BENIGNANTLY ON IT OVER HIS SHOULDER,I AM STIFF WITH LONG SITTING HE SAID I ITCH FOR A FIGHT I TURNED TO THE FARMER,ONCE IN ACTION HE WAS LEADING A DETACHMENT OF INFANTRY THROUGH AN INTRENCHMENT,DO WE REALLY KNOW THE MOUNTAIN WELL WHEN WE ARE NOT ACQUAINTED WITH THE CAVERN,A WORD SHOULD NOW BE SAID ABOUT THE ORIGIN OF LUTHER'S COMMENTARY ON GALATIANS,THAT'S THE WAY WITH YOU THAT'S THE ROAD YOU'D ALL LIKE TO GO HEADLONGS TO RUIN,A SUDDEN IMPULSE CAME OVER HIM TO ENTER AND SEE IF THEY WERE INDEED THE PROOFS,I DARE NOT GO SO FAR AS THAT BUT OF THE THREE HE IS PERHAPS THE LEAST UNLIKELY,CHINGACHGOOK HAD CAUGHT THE LOOK AND MOTIONING WITH HIS HAND HE BADE HIM SPEAK,IT WAS THE SCARLET LETTER IN ANOTHER FORM THE SCARLET LETTER ENDOWED WITH LIFE,SOME IMAGES LIKE SOME SENSATIONS FEEL VERY FAMILIAR WHILE OTHERS FEEL STRANGE,HE STILL HELD ON TO IT WITH BOTH HANDS AS HE RUSHED INTO HIS MOTHER'S COTTAGE,A LITTLE BIT OF PLASTER TUMBLED DOWN THE CHIMNEY AND STARTLED ME CONFOUNDEDLY,THEN I WILL GET ME A FARM AND WILL WINTER IN THAT LAND NOW WHO WILL FOLLOW ME,SHE'S OLDER THAN I AM BUT SO TINY AND SAD AND SHY THAT SHE SEEMS LIKE A CHILD,IT WAS VERY JOLLY HE MURMURED LAZILY AS MARIE CAME IN TO TAKE AWAY THE COFFEE,IN A GENERAL WAY THOUGH NOT WHOLLY NOR CONSISTENTLY THESE TWO GROUPS COINCIDE,IS THE ATMOSPHERIC CONDITION HAVING ONCE REACHED THIS DENSITY TO BECOME FINAL,HE PANTED TO KNOW IF SHE TOO KNEW OR KNEW AND CARED NOT OR CARED AND KNEW NOT,THE OTHERS RESENTED POSTPONEMENT BUT IT WAS JUST HIS SCRUPLES THAT CHARMED ME,I THANK ALL WHO HAVE LOVED ME IN THEIR HEARTS WITH THANKS AND LOVE FROM MINE,AND I HAVE NO ONE READY TO WHOM I CAN GIVE UP THE ARCHIVES OF THE GOVERNMENT,RE ENTER BUTLER AND THREE FOOTMEN WHO REMOVE THE TEA THINGS HOSTESS TO GUEST,LEND ME YOUR EAR FOR TEN MINUTES AND YOU SHALL LEARN JUST WHAT STAGECRAFT IS,IT MIGHT HAVE SEEMED THAT A TROUT OF THIS SIZE WAS A FAIRLY SUBSTANTIAL MEAL,GENTLEMEN TO YOUR POSTS WHEREUPON SAINT AIGNAN AND VILLEROY TOOK THEIR LEAVE,IT DID NOT BECKON OR INDEED MOVE AT ALL IT WAS AS STILL AS THE HAND OF DEATH,I WAS BOOKKEEPER SO IT WAS EASY TO GET A BLANK CHECK AND FORGE THE SIGNATURE,I'M RUNNING FOR REPRESENTATIVE ON THE REPUBLICAN TICKET SAID KENNETH QUIETLY,BUT IN SUCH A CASE MISS MILNER'S ELECTION OF A HUSBAND SHALL NOT DIRECT MINE,TO TEACH READING MEANS TO LIGHT THE FIRE EVERY SYLLABLE SPELLED OUT SPARKLES,GRACE BE TO YOU AND PEACE FROM GOD THE FATHER AND FROM OUR LORD JESUS CHRIST,IT'LL BE NO USE THEIR PUTTING THEIR HEADS DOWN AND SAYING COME UP AGAIN DEAR,NO NO NO TOTTY UD GET HER FEET WET SAID MISSUS POYSER CARRYING AWAY HER IRON,WELL WHAT CAN'T BE DONE BY MAIN COURAGE IN WAR MUST BE DONE BY CIRCUMVENTION,BUT THE BEAR INSTEAD OF OBEYING MAINTAINED THE SEAT IT HAD TAKEN AND GROWLED,MOST PEOPLE TALK TOO MUCH SO IT IS A RELIEF TO FIND ONE WHO TALKS TOO LITTLE,AT THE EMERALD CITY WHERE OUR PRINCESS OZMA LIVES GREEN IS THE POPULAR COLOR,THAT A STYLE IS RESTRAINED OR SEVERE DOES NOT MEAN THAT IT IS ALSO ERRONEOUS,FOR A FULL HOUR HE HAD PACED UP AND DOWN WAITING BUT HE COULD WAIT NO LONGER,WE SAT WITH THE OFFICERS SOME LITTLE TIME AFTER DINNER AND THEN WENT ASHORE,ONCE FAIRLY A WING HOWEVER HE WHEELED AND MADE BACK HURRIEDLY FOR HIS PERCH,IT IS TOO DIFFICULT REPLIED MADEMOISELLE DE TONNAY CHARENTE LAUGHING LOUDLY,THEN SHE GAVE A LITTLE LAUGH AND REPLIED NO MISS BETH I'M ELIZABETH PARSONS,WE HAVE HEARD SOMETHING OF YOUR STORY SAID KENNETH AND ARE INTERESTED IN IT,WHY ONE MORNING THERE CAME A QUANTITY OF PEOPLE AND SET TO WORK IN THE LOFT,IN AUTUMN THE WOOD CUTTERS ALWAYS CAME AND FELLED SOME OF THE LARGEST TREES,AND HE MADE A LITTLE DIP OF HIS CANE TOWARDS BRANDON HALL OVER HIS SHOULDER,ALL THE TIME HE WAS TALKING TO ME HIS ANGRY LITTLE EYES WERE FOLLOWING LAKE,DO YOU KNOW LAKE OH I REALLY CAN'T TELL BUT HE'LL SOON TIRE OF COUNTRY LIFE,MEANWHILE RODOLFO HAD LEOCADIA SAFE IN HIS CUSTODY AND IN HIS OWN APARTMENT,A MORE DREARY AND MORE DISUNITED FAMILY PARTY I NEVER SAT AT THE TABLE WITH,NO CATHEDRAL NOT EVEN BURGOS ITSELF COULD VIE WITH THE CHURCH AT MONTMARTRE,RUTH SAT QUITE STILL FOR A TIME WITH FACE INTENT AND FLUSHED IT WAS OUT NOW,IS THY FATHER WILLING THEE SHOULD GO AWAY TO A SCHOOL OF THE WORLD'S PEOPLE,THE WORLD IS ALL THERE JUST AS IT USED TO BE BUT I CAN'T GET AT IT ANY MORE,DO YOU KNOW I THOUGHT THE DANCE A BIT CONSCIOUS TO NIGHT FOR THE FIRST TIME,I SIT DOWN AT A SMALL TABLE A WAITER COMES IMMEDIATELY TO ENQUIRE MY WISHES,THERE IS EVEN A WHITE ROW OF BEEHIVES IN THE ORCHARD UNDER THE WALNUT TREES,BUT CRESSWELL ADDED SIGNIFICANTLY CAPACITY DIFFERS ENORMOUSLY BETWEEN RACES,WELL WELL DON'T TROUBLE TO ANSWER LISTEN AND SEE THAT I DO YOU NO INJUSTICE,AS A MATTER OF FACT HE COULD NOT SAID SOAMES FOR I ENTERED BY THE SIDE DOOR,THE HAIR WAS OF BROWN YARN AND HUNG DOWN ON HER NECK IN SEVERAL NEAT BRAIDS,PLEASE FORGIVE ME FOR THIS UNDERHANDED WAY OF ADMITTING I HAD TURNED FORTY,MONSIEUR WAS THE ONLY ONE WHO DID NOT UNDERSTAND ANYTHING ABOUT THE MATTER,AND MY POCKET MONEY IS GETTING LOW AGAIN AND YOU HAVEN'T ANY LEFT AS USUAL,THEY THEY EXCITE ME IN SOME WAY AND I I CAN'T BEAR THEM YOU MUST EXCUSE ME,YOU SPEAK LIKE AN EDUCATED PERSON SAID BETH WONDERINGLY WHERE IS YOUR HOME,THE HOURS PASSED WEARILY BY AND MOVEMENT COULD YET BE HEARD ABOUT THE HALL,AT THE PROW I CARVED THE HEAD WITH OPEN MOUTH AND FORKED TONGUE THRUST OUT,HE SEEMED BORN TO PLEASE WITHOUT BEING CONSCIOUS OF THE POWER HE POSSESSED,HE MENTIONS THE APOSTLES FIRST BECAUSE THEY WERE APPOINTED DIRECTLY BY GOD,A BRISK WIND HAD COME UP AND WAS DRIVING PUFFY WHITE CLOUDS ACROSS THE SKY,HE DARTED THROUGH THE TREES AND PAUSED A TALL MAN STRONGLY BUT SLIMLY MADE,JOHN TAYLOR WHO HAD SUPPORTED HER THROUGH COLLEGE WAS INTERESTED IN COTTON,WHEN THEY WERE OUTSIDE UNC SIMPLY LATCHED THE DOOR AND STARTED UP THE PATH,YET THESE THOUGHTS AFFECTED HESTER PRYNNE LESS WITH HOPE THAN APPREHENSION,THE KING STOOD UP AND CALLED FOR THAT PSALM WHICH BEGINS WITH THESE WORDS,GOOD GRACIOUS HAS THE KING ANY RIGHT TO INTERFERE IN MATTERS OF THAT KIND,OH LET HIM COME ALONG SHE URGED I DO LOVE TO SEE HIM ABOUT THAT OLD HOUSE,HE MIGHT HAVE HAD THAT FORGED CHECK FOR THE FACE OF IT IF HE'D BEEN SHARP,THESE ESCAPADES ARE NOT FOR OLD GAMEWELL LAD HIS DAY HAS COME TO TWILIGHT,THERE IS HARDLY ONE DAY OUT OF A HUNDRED WHICH IS WHOLLY JOYOUS AND SUNNY,WHEN DID YOU COME BARTLEY AND HOW DID IT HAPPEN YOU HAVEN'T SPOKEN A WORD,I THOUGHT IT MIGHT BE SISTER KATE OR COUSIN MIKE WOULD BE HAPPENING ALONG,I SHALL BE PUNISHED FOR IT NOW I SUPPOSE BY BEING DROWNED IN MY OWN TEARS,THE SHADOW OF THE RAFT WAS CLEARLY OUTLINED UPON THE SURFACE OF THE WAVES,BUT THE PLANT RAN AND IT WAS THE FIRST THREE WIRE STATION IN THIS COUNTRY,THE SQUARES OF COTTON SHARP EDGED HEAVY WERE JUST ABOUT TO BURST TO BOLLS,THE MAN ENTERED AND TOOK THE PAPERS SHEET BY SHEET FROM THE CENTRAL TABLE,HOTEL A PLACE WHERE A GUEST OFTEN GIVES UP GOOD DOLLARS FOR POOR QUARTERS,I EXPECT YOU HAVE BEEN A VERY GOOD GIRL ANDELLA SINCE YOU WERE HERE LAST,TO GIVE AN IDEA OF THESE CONVERSATIONS I WILL REPORT ONE OF THEM IN FULL,WE OUGHT TO HAVE MORE ATTENDANTS BETH SAID LOUISE APPROACHING HER COUSIN,IT WAS BETTER FOR HIM TO THINK THE GIRL UNFEELING THAN TO KNOW THE TRUTH,BUT UNDER THE CIRCUMSTANCES I DOUBT IF SUCH AN ARRANGEMENT COULD BE MADE,SOFT HEART HE SAID GENTLY TO HER THEN TO THORKEL WELL LET HIM GO THORKEL,WELL MOTHER SAID THE YOUNG STUDENT LOOKING UP WITH A SHADE OF IMPATIENCE,THE ARMY FOUND THE PEOPLE IN POVERTY AND LEFT THEM IN COMPARATIVE WEALTH,AND WHAT WAS THE SUBJECT OF THE POEM SAID THE PERSON WHO MADE THE REMARK,UNDERSCORE THESE WORDS FOR THEY ARE FULL OF COMFORT FOR SORE CONSCIENCES,IT'S EXCITING TO SEE EVERYTHING GROWING SO FAST AND TO GET THE GRASS CUT,BY THE BY I'VE NEVER SEEN YOUR DAIRY I MUST SEE YOUR DAIRY MISSUS POYSER,IT WAS THE INDIAN WHOSE DARK SILHOUETTE APPEARED SUDDENLY UPON HIS BLIND,DID ANYONE KNOW THAT THESE PROOFS WOULD BE THERE NO ONE SAVE THE PRINTER,THIS WAS WHAT DID THE MISCHIEF SO FAR AS THE RUNNING AWAY WAS CONCERNED,HIS CONDUCT AND PRESENCE OF MIND IN THIS EMERGENCE APPEARED CONSPICUOUS,SHE THEN ROSE HUMMING THE AIR TO WHICH SHE WAS PRESENTLY GOING TO DANCE,IT WAS A DELIBERATE THEFT FROM HIS EMPLOYERS TO PROTECT A GIRL HE LOVED,SERVADAC TOOK IT FOR GRANTED THAT THE DOBRYNA WAS ENDEAVORING TO PUT IN,EXCLAIMED BILL HARMON TO HIS WIFE AS THEY WENT THROUGH THE LIGHTED HALL,MY LORD MISS MILNER'S TASTE IS NOT A DEPRAVED ONE IT IS BUT TOO REFINED,WHY SHOULD I RUST AND BE STUPID AND SIT IN INACTION BECAUSE I AM A GIRL,IN THIS WORLD EVIDENTLY THE VESTIBULE OF ANOTHER THERE ARE NO FORTUNATE,OH WHAT A RECORD TO READ WHAT A PICTURE TO GAZE UPON HOW AWFUL THE FACT,I THOUGHT IT THEREFORE MY DUTY WHEN I LEFT SCHOOL TO BECOME A GOVERNESS,BUT I WOULD NOT SPEAK AT THE TIME BECAUSE I WANTED TO REFRESH MY MEMORY,THE MOST FAMOUS OF THEM ALL WAS THE OVERTHROW OF THE ISLAND OF ATLANTIS,THAT WON'T LAST IT WILL GO AWAY AND THINGS WILL BE JUST AS THEY USED TO,THEY THINK YOU'RE PROUD BECAUSE YOU'VE BEEN AWAY TO SCHOOL OR SOMETHING,THAT'S NOT MUCH OF A JOB FOR AN ATHLETE HERE I'VE BEEN TO TOWN AND BACK,I KNOW GASPED POLLY CONTROLLING HER SOBS I WON'T ONLY I CAN'T THANK YOU,THE PARIS PLANT LIKE THAT AT THE CRYSTAL PALACE WAS A TEMPORARY EXHIBIT,I THINK I SHOULD BE DOING YOU A SERVICE TO TURN YOU OUT OF SUCH A PLACE,HOLMES TURNED AWAY AND STOOPED SUDDENLY TO THE FLOOR HALLOA WHAT'S THIS,HORSE SENSE A DEGREE OF WISDOM THAT KEEPS ONE FROM BETTING ON THE RACES,WHOSE FEET ARE AS THE FEET OF HARTS AND UNDERNEATH THE EVERLASTING ARMS,THE RECTOR PAUSED AND THEN SHAKING HIS CLASPED HANDS BEFORE HIM WENT ON,BUT AT THIS POINT IN THE RAPIDS IT WAS IMPOSSIBLE FOR HIM TO STAY DOWN,THE GREAT HAWK FOLLOWED HURRIEDLY TO RETRIEVE HIS PREY FROM THE GROUND,HE WAS SUCH A BIG BOY THAT HE WORE HIGH BOOTS AND CARRIED A JACK KNIFE,WILL YOU LEAVE ME ALONE IN MY OWN ROOM OR MUST I GO AWAY TO ESCAPE YOU,HE SPOKE SIMPLY BUT PACED UP AND DOWN THE NARROW CELL IN FRONT OF THEM,AS ANY IN ENGLAND I WOULD SAY SAID GAMEWELL PROUDLY THAT IS IN HIS DAY,IT IS ENOUGH SAID GEORGE GAMEWELL SHARPLY AND HE TURNED UPON THE CROWD,BEFORE THEM FLED THE STROLLER AND HIS THREE SONS CAPLESS AND TERRIFIED,HE IS NOT WELL HE HAS COME OVER THE OCEAN FOR REST AND CHANGE OF SCENE,IT WAS SO DARK THAT I COULD SEE NOTHING BUT A FEW SPARKS ON THE HEARTH,WHY IT'S IN MISSOURI SOMEWHERE ON THE FRONTIER I THINK WE'LL GET A MAP,HE FELT A TREMOR RUN THROUGH THE SLENDER YELLOW FIGURE IN FRONT OF HIM,I AM NOT DEPRECIATING IT WHEN I SAY THAT IN THESE TIMES IT IS NOT RARE,THE LIVERY BECOMES OBNOXIOUS TO NEARLY ALL WHO ARE REQUIRED TO WEAR IT,TELL US SAID THE OTHER THE WHOLE STORY AND WHERE SOLON HEARD THE STORY,I AM NOT COMPLAINING THAT THE RATE IS SLOW BUT THAT THE SEA IS SO WIDE,HOLMES HELD IT OUT ON HIS OPEN PALM IN THE GLARE OF THE ELECTRIC LIGHT,I HAD TO READ IT OVER CAREFULLY AS THE TEXT MUST BE ABSOLUTELY CORRECT,UNCAS CAST HIS SKIN AND STEPPED FORTH IN HIS OWN BEAUTIFUL PROPORTIONS,HAY FEVER A HEART TROUBLE CAUSED BY FALLING IN LOVE WITH A GRASS WIDOW,YOU SEE MY FRIEND IT'S AN ISSUE OF THE MONSTER THE NOTORIOUS NARWHALE,ANYHOW WE'LL LEAVE INSTRUCTIONS TO SHIP THE WHOLE MENAGERIE TO FRANCE,YOU WILL ALLOW ME TO SUGGEST SAID HE THAT THAT IS A MATTER OF OPINION,DELLA HAD A YOUNG SISTER NAMED MARIA AND A COUSIN WHOSE NAME WAS JANE,THIS THOUGHT HOWEVER DID NOT ENTER THE HEADS OF THE ENTHUSIASTIC PAIR,AND THEN THEY BECAME VEXED AND WOULD HAVE SNATCHED YOUR PURSE FROM US,AND THEN YOU CAME BACK NOT CARING VERY MUCH BUT IT MADE NO DIFFERENCE,YOU SEE LOVING SOME ONE AS I LOVE YOU MAKES THE WHOLE WORLD DIFFERENT,HILDA'S FACE QUIVERED BUT SHE WHISPERED YES I THINK IT MUST HAVE BEEN,ALREADY A NORTH AND A SOUTH WERE TALKED OF WHY NOT SET UP ALSO A WEST,THEIR SUFFERINGS HAVE NEVER YET BEEN FITLY CHRONICLED BY HUMAN SCRIBE,WHEN I WAS A YOUNG MAN I THOUGHT PAUL WAS MAKING TOO MUCH OF HIS CALL,SATURDAY AUGUST FIFTEENTH THE SEA UNBROKEN ALL ROUND NO LAND IN SIGHT,ABOVE ALL THINGS I DESIRE TO SETTLE THE MATTER QUIETLY AND DISCREETLY,THE DELAWARES ARE CHILDREN OF THE TORTOISE AND THEY OUTSTRIP THE DEER,TO THIS HIS ANSWER WAS PROMPT OH THANK GOD NO AND IS THE RECORD YOURS,IF HE TO KEEP ONE OATH MUST LOSE ONE JOY BY HIS LIFE'S STAR FORETOLD,COULD IT MEAN TO LAST A LOVE SET PENDULOUS BETWEEN SORROW AND SORROW,OVER THE TRACK LINED CITY STREET THE YOUNG MEN THE GRINNING MEN PASS,YOU HEAR WHAT SIR FERDINANDO BROWN HAS SAID REPLIED CAPTAIN BATTLEAX,THE DUCHESS OF SOUTHBRIDGE TO LORD REGGIE OH REGGIE WHAT DID YOU SAY,A STORY CRIED THE CHILDREN DRAWING A LITTLE FAT MAN TOWARDS THE TREE,RIGHT WILLINGLY FOR BETWEEN US WE HAVE WON THE BATTLE ANSWERED ROBIN,TIS FINE FOR YOU TO TALK OLD MAN ANSWERED THE LEAN SULLEN APPRENTICE,WHAT OF THE FARM OLAF NOT YET I ANSWERED VIKING IS BETTER FOR SUMMER,NEVER MIND NOW INTERPOSED THE CAPTAIN WE WILL TALK OF THAT BY AND BY,THERE IS THE SLANG OF THE AFFECTED LADY AS WELL AS OF THE PRECIEUSES,IT'S BEEN ON ONLY TWO WEEKS AND I'VE BEEN HALF A DOZEN TIMES ALREADY,THIS PASSAGE THEN BEARS OUT THE FACT THAT ALL MEN ARE SOLD UNDER SIN,NOT GOLD OR SILVER OR PASCHAL LAMBS OR AN ANGEL BUT HIMSELF WHAT FOR,THEY SAID TO THE GALATIANS YOU HAVE NO RIGHT TO THINK HIGHLY OF PAUL,THERE'S A HEAVY STORM COMING ON I CRIED POINTING TOWARDS THE HORIZON,THOSE HUGE CREATURES ATTACKED EACH OTHER WITH THE GREATEST ANIMOSITY,I LIKE TO TALK TO CARL ABOUT NEW YORK AND WHAT A FELLOW CAN DO THERE,SHE ASKED IMPULSIVELY I DIDN'T BELIEVE YOU COULD PERSUADE HER FATHER,OH SIR SAID MISSUS POYSER RATHER ALARMED YOU WOULDN'T LIKE IT AT ALL,I WILL TAKE THE BLACK CLAY WITH ME ALSO THE PENCIL CUTTINGS GOOD BYE,SLOW TO WORLD GREETINGS QUICK WITH ITS O LIST WHEN THE ANGELS SPEAK,YES WE ARE CERTAINLY I REPLIED EVASIVELY BUT AFTER WE MAKE A DETOUR,NOT ONCE DID HE COMMENT ON THE LENGTH OR THE HARDSHIPS OF A JOURNEY,THEY SAY ILLUMINATION BY CANDLE LIGHT IS THE PRETTIEST IN THE WORLD,THE SQUIRE HELPED TO THRUST THEM ALL IN AND ENTERED SWIFTLY HIMSELF,SHAME ON YOU CITIZENS CRIED HE I BLUSH FOR MY FELLOWS OF NOTTINGHAM,THIS WAS SO SWEET A LADY SIR AND IN SOME MANNER I DO THINK SHE DIED,YOU RESEMBLE ME RACHEL YOU ARE FEARLESS AND INFLEXIBLE AND GENEROUS,SO I WILL GIVE OUT THIS LAW THAT MY MEN SHALL NEVER LEAVE YOU ALONE,TWO HUNDRED WARRIORS FEASTED IN HIS HALL AND FOLLOWED HIM TO BATTLE,I SAY SIR HARRY THE LITTLE GIRL'S GOING FAMOUSLY TO NIGHT ISN'T SHE,I CANNOT DENY MYSELF THE GRATIFICATION OF INSERTING SOUTHEY'S REPLY,BUT THE GENERAL DISTINCTION IS NOT ON THAT ACCOUNT TO BE OVERLOOKED,THE ATMOSPHERE IS EVIDENTLY CHARGED AND SURCHARGED WITH ELECTRICITY,IT MUST BE AS WIDE AS THE MEDITERRANEAN OR THE ATLANTIC AND WHY NOT,SUDDENLY HE HEARD HIM AT THE VERY DOOR THERE WAS NO POSSIBLE ESCAPE,MISTER SOAMES WAS SOMEWHAT OVERWHELMED BY THIS FLOOD OF INFORMATION,THE BEAR SHOOK HIS SHAGGY SIDES AND THEN A WELL KNOWN VOICE REPLIED,IT CAN'T HURT ANYTHING I'M SURE FOR WE WON'T DISTURB THINGS AT ALL,FROM THE BLACKNESS BEHIND THE LIGHT THEY HEARD A VOICE WARRENTON'S,THE WINE DID CERTAINLY BRING BACK THE COLOR TO THE SQUIRE'S CHEEKS,A COLD BRIGHT MOON WAS SHINING WITH CLEAR SHARP LIGHTS AND SHADOWS,THE FLOOR MORE THAN ANYTHING ELSE SHOWED THE GREAT AGE OF THE ROOM,BUT DON'T THESE VERY WISE THINGS SOMETIMES TURN OUT VERY FOOLISHLY,IT WAS ONE OF THE MASTERLY AND CHARMING STORIES OF DUMAS THE ELDER,SO I LIVED AND NOW AM YOUR TOOTH THRALL WELL IT IS THE LUCK OF WAR,YOUR FATHER THOUGHT A MOMENT THEN LOOKED AT YOUR MOTHER AND SMILED,SHE IS UNDER SAIL BUT SHE IS COUNT TIMASCHEFF'S YACHT HE WAS RIGHT,THIS WITHOUT RECKONING IN THE PAINS OF THE HEART AND SO IT GOES ON,IT'S NOT PARTICULARLY RARE SHE SAID BUT SOME OF IT WAS MY MOTHER'S,SHE MUST CARE ABOUT THE THEATRE A GREAT DEAL MORE THAN SHE USED TO,HE CALLED THIS SEA A POND AND OUR LONG VOYAGE TAKING A LITTLE SAIL,I GET TIRED OF SEEING MEN AND HORSES GOING UP AND DOWN UP AND DOWN,PEARL SAW AND GAZED INTENTLY BUT NEVER SOUGHT TO MAKE ACQUAINTANCE,THAT IS ALL QUITE TRUE MISTER NEVERBEND SAID SIR FERDINANDO BROWN,THIS KNOWLEDGE IS MEMORY IN ONE SENSE THOUGH IN ANOTHER IT IS NOT,THE PARLIAMENT AND THE SCOTS LAID THEIR PROPOSALS BEFORE THE KING,THE YOUNG GIRLS HAD INDEED MADE THEMSELVES SMALL INDEED INVISIBLE,I ATTEND TO THE HOUSEHOLD MENDING YOU KNOW AND CARE FOR THE LINEN,ROBIN WAS GLAD WHEN AT LENGTH THEY WERE LEFT TO THEIR OWN DEVICES,MARK MY WORDS YOU'LL FIND HIM TOO STRONG FOR YOU AYE AND TOO DEEP,IT IS THE ONLY AMENDS I ASK OF YOU FOR THE WRONG YOU HAVE DONE ME,HE KEEPS THE THOU SHALT NOT COMMANDMENTS FIRST RATE HEN LORD DOES,HE SEEMED TO WAIT FOR HER REPLY BUT AS SHE MADE NONE HE PROCEEDED,GRACE INVOLVES THE REMISSION OF SINS PEACE AND A HAPPY CONSCIENCE,IN EVERY WAY THEY SOUGHT TO UNDERMINE THE AUTHORITY OF SAINT PAUL,NO I'VE MADE UP MY MIND ABOUT IT IF I'M MABEL I'LL STAY DOWN HERE,I REFER TO THE THERMOMETER IT INDICATES THE FIGURE IS OBLITERATED,COTTON IS A WONDERFUL THING IS IT NOT BOYS SHE SAID RATHER PRIMLY,IT WOULD HAVE BEEN MORE WONDERFUL HAD HE SPOKEN WITHOUT A BIDDING,WE HAVE COME FROM A FAR LONELIER PLACE THAN THIS A LONELIER PLACE,MISSUS GRIFFIN HOWEVER EXPRESSED THE NEED FOR A LITTLE MORE LIGHT,IN THE SILENCE THEIR DARK FIRE KINDLED THE DUSK INTO A TAWNY GLOW,THE CLOUD THEN SHEWD HIS GOLDEN HEAD AND HIS BRIGHT FORM EMERG'D,LIKE THE DOVES VOICE LIKE TRANSIENT DAY LIKE MUSIC IN THE AIR AH,I'LL NOT BE WICKED ANY MORE SIGHED THE OLD BOOLOOROO I'LL REFORM,IN PERSON WELCOME ABOARD PROFESSOR YOUR CABIN IS WAITING FOR YOU,SEVERAL HUNDRED FREE STATE MEN PROMPTLY RESPONDED TO THE SUMMONS,IT IS NECESSARY THEREFORE THAT HE SHOULD COMPLY THE KING FROWNED,THE SOMBRE OLD TREES LIKE GIGANTIC HEARSE PLUMES BLACK AND AWFUL,DON'T INSULT ME STANLEY BY TALKING AGAIN AS YOU DID THIS MORNING,UP AND DOWN THE WATER WE WENT TO GET MUCH WEALTH AND MUCH FROLIC,WOULD NOT THE LOFTIEST EMINENCES OF THE CITY AT LEAST BE VISIBLE,AND IF I HAD A FORTUNE WOULD THEE WANT ME TO LEAD A USELESS LIFE,TO BURN WITHOUT CEASING TO FLY THEREIN LIES THE MARVEL OF GENIUS,ALEXANDER ROSE AND SHOOK HIMSELF ANGRILY YES I KNOW I'M COWARDLY,THE GREATNESS OF THE RANSOM CHRIST THE SON OF GOD INDICATES THIS,AT THE SAME TIME PAUL CONFIRMS OUR CREED THAT CHRIST IS VERY GOD,AS FOR THE ICHTHYOSAURUS HAS HE RETURNED TO HIS SUBMARINE CAVERN,I PRAY FOR YOU BUT THAT'S NOT THE SAME AS IF YOU PRAYED YOURSELF,FOR IF HE'S ANYWHERE ON THE FARM WE CAN SEND FOR HIM IN A MINUTE,MUNNY I TOULD IKE TO DO INTO DE BARN TO TOMMY TO SEE DE WHITTAWD,I SUPPOSE THOUGH IT'S TOO EARLY FOR THEM THEN CAME THE EXPLOSION,SHE HAD ALMOST FORGOTTEN THAT IT WAS HERE WITHIN TOUCH AND SIGHT,THE YOUNG MAN IS IN BONDAGE AND MUCH I FEAR HIS DEATH IS DECREED,ON FRIDAY CONFESSION WILL BE HEARD ALL THE AFTERNOON AFTER BEADS,SHE CEASD AND SMILD IN TEARS THEN SAT DOWN IN HER SILVER SHRINE,BUT CAP'N BILL MADE NO SUCH ATTEMPT KNOWING IT WOULD BE USELESS,STRAIGHTWAY THE HAWK GLIDED FROM HIS PERCH AND DARTED AFTER HIM,I HAD AGAIN BEEN ACTING UNDER THE INFLUENCE OF THIS MAN'S POWER,HE LOOKED UP RATHER UNGRACIOUSLY BUT MOTIONED THEM TO BE SEATED,PERHAPS THE OTHER TREES FROM THE FOREST WILL COME TO LOOK AT ME,AND TOWARDS CHRISTMAS HE WAS ONE OF THE FIRST THAT WAS CUT DOWN,WILL WHISPERED ROBIN OPENING HIS DOOR AS HE SPOKE ARE YOU READY,TAKE YOUR PLACE AND LET US SEE WHAT THE CRYSTAL CAN SHOW TO YOU,BY THE BEARD OF ODIN I CRIED YOU HAVE TAKEN OUR JOKE LIKE A MAN,ON A BENCH IN A FAR CORNER WERE A DOZEN PEOPLE HUDDLED TOGETHER,IS THEE GOING TO THE YEARLY MEETING RUTH ASKED ONE OF THE GIRLS,MARGARET BOLTON ALMOST LOST FOR A MOMENT HER HABITUAL PLACIDITY,DON'T I THOUGH I'M SO SORRY TO HEAR IT HOW DID HER SON TURN OUT,THIS SHOULD GO FAR IN SHUTTING THE MOUTHS OF THE FALSE APOSTLES,IN THIS WHOLE EPISTLE PAUL TREATS OF THE RESURRECTION OF CHRIST,OH EVER SO MUCH ONLY HE SEEMS KIND OF STAID AND SCHOOL TEACHERY,JUST SMELL THE WILD ROSES THEY ARE ALWAYS SO SPICY AFTER A RAIN,YOU LEFT HIM IN A CHAIR YOU SAY WHICH CHAIR BY THE WINDOW THERE,THE HEAD OF THE PATCHWORK GIRL WAS THE MOST CURIOUS PART OF HER,WELL IF I DON'T KNOW WHO SHE WAS IN LOVE WITH I KNOW WHO HE WAS,THE GOAT'S WARLIKE SPIRIT WAS ROUSED BY THIS SUCCESSFUL ATTACK,AND IN THIS LAST ACTION HE FALLS INTO THE CLASSIC SIN OF PRIDE,BUT MUCH OF THE NOVEL'S BROODING POWER COMES FROM CAPTAIN NEMO,HE WORKED ME VERY HARD HE WANTED TO BE BEATING ME ALL THE TIME,ANYHOW IT'S JOLLY EXCITING AND I CAN DO THE DIALOGUE ALL RIGHT,OH SAY THAT'S DIFFERENT OBSERVED MARKHAM ALTERING HIS DEMEANOR,THEY SNUFFED ABOUT THE FIR TREE AND RUSTLED AMONG THE BRANCHES,WERE I IN THE WARM ROOM WITH ALL THE SPLENDOR AND MAGNIFICENCE,ROBIN ENTERED THE HUT DRAGGING THE UNWILLING ESQUIRE AFTER HIM,AGAIN HE SEARCHED HIS OWN THOUGHTS NOR INEFFECTUALLY AS BEFORE,ALEXANDER LEANED FORWARD AND WARMED HIS HANDS BEFORE THE BLAZE,COME WE'LL HAVE OUR COFFEE IN THE OTHER ROOM AND YOU CAN SMOKE,SIR HARRY TOWNE MISTER BARTLEY ALEXANDER THE AMERICAN ENGINEER,HE'S ANOTHER WHO'S AWFULLY KEEN ABOUT HER LET ME INTRODUCE YOU,WE WON'T TALK ABOUT HER ANY MORE IF YOU'D RATHER NOT WE INDEED,AREN'T YOU SPLASHED LOOK AT THE SPIDER WEBS ALL OVER THE GRASS,HE SAT DOWN WEAK BEWILDERED AND ONE THOUGHT WAS UPPERMOST ZORA,THERE IS NO OPENING EXCEPT THE ONE PANE SAID OUR LEARNED GUIDE,THE PROOF WAS IN THREE LONG SLIPS I HAD LEFT THEM ALL TOGETHER,LET US RETRACE OUR STEPS AND EXAMINE AS WE GO WITH KEENER EYES,SHE POURED INTO THE DISH A QUANTITY FROM EACH OF THESE BOTTLES,THE RECTOR DID NOT ASK FOR A CATECHISM TO HEAR THE LESSON FROM,OPEN THY HEART WIDE AND FOLD WITHIN THE WET WINGS OF THY DOVE,OR AN EYE OF GIFTS AND GRACES SHOWRING FRUITS AND COINED GOLD,ONE OF US ALWAYS REMAINS ON BOARD WHILE THE OTHER IS ON SHORE,YOUR PLAY MUST BE NOT MERELY A GOOD PLAY BUT A SUCCESSFUL ONE,DOES YOUR MAJESTY THEN NO LONGER BELIEVE THE DISLOYAL ATTEMPT,VOLTAIRE PICKED UP SOMETHING FROM THE GROUND AND LOOKED AT IT,NOTHING MORE NOT EVEN THE WRIST TO WHICH IT MIGHT BE ATTACHED,SOMETHING BETTER SOMETHING STILL GRANDER MUST FOLLOW BUT WHAT,MOST OF ALL ROBIN THOUGHT OF HIS FATHER WHAT WOULD HE COUNSEL,WHAT IS YOUR NAME LORDING ASKED THE LITTLE STROLLER PRESENTLY,HE WAS LIKE UNTO MY FATHER IN A WAY AND YET WAS NOT MY FATHER,THEIR EYES DANCED BIG THORLEIF STOOD UP AND STRETCHED HIMSELF,TO ALL THESE INQUIRIES THE COUNT RESPONDED IN THE AFFIRMATIVE,IT IS SO MADE THAT EVERYWHERE WE FEEL THE SENSE OF PUNISHMENT,I DOUBT WHETHER BRANWELL WAS MAINTAINING HIMSELF AT THIS TIME,SOLON MARVELLED AND DESIRED TO BE INFORMED OF THE PARTICULARS,WE THINK THAT BY SOME LITTLE WORK OR MERIT WE CAN DISMISS SIN,NOT FOR A CROWN OR A KINGDOM OR OUR GOODNESS BUT FOR OUR SINS,NO NAMES PLEASE SAID HOLMES AS WE KNOCKED AT GILCHRIST'S DOOR,ONE HARDLY LIKES TO THROW SUSPICION WHERE THERE ARE NO PROOFS,OLD DANCES ARE SIMPLIFIED OF THEIR YEARNING BLEACHED BY TIME,COME AND GET THE BOOLOOROO SHE SAID GOING TOWARD THE BENCHES,YOU HAVE COME TO US THREATENING US WITH ABSOLUTE DESTRUCTION,I HAVE BEEN HERE THIS QUARTER OF AN HOUR REPLIED LA VALLIERE,I REMEMBER NOW AND I CONGRATULATE MYSELF DO YOU LOVE ANY ONE,SEEING THAT I AM SO FINE I MAY AS WELL GO AND VISIT THE KING,CAN YOU IMAGINE WHY BUCKINGHAM HAS BEEN SO VIOLENT I SUSPECT,SHE EVEN SEEMED MILDLY AMUSED AT THE ATTENTION SHE ATTRACTED,AND THE WHOLE NIGHT THE TREE STOOD STILL AND IN DEEP THOUGHT,AT LAST ALL WAS QUIET AND BLACK IN THE COURTYARD OF GAMEWELL,PRESENTLY HE CROSSED THE FLOOR OF HIS ROOM WITH DECIDED STEP,ILL AND TROUBLED DEAR TROUBLED IN MIND AND MISERABLY NERVOUS,I DID NOT EVEN TAKE THE PRECAUTION OF SMOKING UP THE CHIMNEY,IN THE STERN I CURVED THE TAIL UP ALMOST AS HIGH AS THE HEAD,OLIVE'S MOURNFUL BLACK EYES MET NANCY'S SPARKLING BROWN ONES,GRANDFATHER WAS ALEXANDER CAREY L L D DOCTOR OF LAWS THAT IS,WHAT CAN YOU MEAN BY THAT MISS WOODLEY YOU TALK MYSTERIOUSLY,IS HE GOING TO START A DAILY NEWSPAPER AMONG THE KICK A POOS,YOU CAN BEGIN BY CARRYING A ROD AND PUTTING DOWN THE FIGURES,I'LL DO ANYTHING YOU WISH ME TO BARTLEY SHE SAID TREMULOUSLY,WHEN THE KING COMES TO PARIS EVERYBODY CALLS OUT VIVE LE ROI,KESWICK MARCH TWENTY SECOND EIGHTEEN THIRTY SEVEN DEAR MADAM,THERE SEEMS NO GOOD REASON FOR BELIEVING THAT IT WILL CHANGE,POSITIVELY HEROIC ADDED CRESSWELL AVOIDING HIS SISTER'S EYES,I WAS IN SUCH A HURRY TO COME TO YOU YOU LEFT YOUR DOOR OPEN,DO NOT THEREFORE THINK THAT THE GOTHIC SCHOOL IS AN EASY ONE,WELL NOW ENNIS I DECLARE YOU HAVE A HEAD AND SO HAS MY STICK,DEAREST TEACH ME SO TO POUR OUT GRATITUDE AS THOU DOST GOOD,I SHALL BE HAPPY TO TAKE CHARGE OF THEM SAID SIR FERDINANDO,THEY WERE CERTAINLY NO NEARER THE SOLUTION OF THEIR PROBLEM,HOWEVER THAT WAS OVER NOW THE TREE GONE THE STORY AT AN END,SAID THE FIR TREE THINKING OVER WHAT HE HAD HIMSELF RELATED,HUMPY DUMPY FELL DOWNSTAIRS AND YET HE MARRIED THE PRINCESS,IF A FELLOW'S BEEN A LITTLE BIT WILD HE'S BEELZEBUB AT ONCE,HERE THEY SAID IS A RASCAL WHO HAS BEEN HARRYING OUR COASTS,HERE FRIEND TAKE IT AND HE THRUST IT INTO THE FARMER'S HAND,BY THE HAMMER OF THOR SHOUTED GRIM HERE IS NO STINGY COWARD,EXCLAIMED SERVADAC KEEPING HIS EYE UNMOVED AT HIS TELESCOPE,LENGTH OF SERVICE FOURTEEN YEARS THREE MONTHS AND FIVE DAYS,BUT WHY DIDN'T YOU TELL ME WHEN YOU WERE HERE IN THE SUMMER,IT'S REALLY TOO WARM IN THIS ROOM TO SING DON'T YOU FEEL IT,HE'S BEEN WANTING TO MARRY HILDA THESE THREE YEARS AND MORE,THERE IS A MORE OR LESS ELABORATE SYSTEM OF RANK AND GRADES,THE WEATHER IF WE MAY USE THAT TERM WILL CHANGE BEFORE LONG,I'M SURE ALEXANDRA HOPES YOU WILL STAY ON HERE SHE MURMURED,I SUPPOSE IT'S THE WET SEASON WILL YOU HAVE TO CUT THEM TOO,INDEED HE HAD LOOKED AWAY WITH THE PURPOSE OF NOT SEEING IT,THERE THERE HE SAID SOOTHINGLY PATTING HER BROWN FUZZY HEAD,THE LAGOON HAD BEEN LEVEL WITH THE DYKES A WEEK AGO AND NOW,ON THE PALM WERE THREE LITTLE PYRAMIDS OF BLACK DOUGHY CLAY,WATSON I HAVE ALWAYS DONE YOU AN INJUSTICE THERE ARE OTHERS,NUMBER TEN FRESH NELLY IS WAITING ON YOU GOOD NIGHT HUSBAND,COME FORTH WORM AND THE SILENT VALLEY TO THY PENSIVE QUEEN,JOHN WESLEY COMBASH JACOB TAYLOR AND THOMAS EDWARD SKINNER,HOW YOU MAY BE WONDERING ARE YOU TO BEGIN YOUR MASTERPIECE,TO BE OR NOT TO BE THAT IS THE QUESTION WHETHER TIS NOBLER,MY TONGUE REFUSED TO ARTICULATE MY POWER OF SPEECH LEFT ME,PERCHANCE TOO KAFFAR'S DEATH MIGHT SERVE HIM IN GOOD STEAD,SAID ANOTHER VOICE WHICH I RECOGNIZED AS VOLTAIRE'S KAFFAR,NOW WHAT WAS THE SENSE OF IT TWO INNOCENT BABIES LIKE THAT,TRULY SUCH A HORSE SHOULD BE WORTH MUCH IN NOTTINGHAM FAIR,IT IS MANIFEST THAT MAN IS NOW SUBJECT TO MUCH VARIABILITY,HAKON THERE SHALL BE YOUR CONSTANT COMPANION FRIEND FARMER,MY DRAGON'S BELLY IS NEVER FULL AND ON BOARD WENT THE GOLD,TO ASK ANY MORE QUESTIONS OF YOU I BELIEVE WOULD BE UNFAIR\nOLD WILL IS A FINE FELLOW BUT POOR AND HELPLESS SINCE MISSUS ROGERS HAD HER ACCIDENT,THE WOOD FLAMED UP SPLENDIDLY UNDER THE LARGE BREWING COPPER AND IT SIGHED SO DEEPLY,I WOULD FAIN KNOW IF I AM DESTINED FOR SO GLORIOUS A CAREER CRIED THE TREE REJOICING,WE WILL GO OUT TOGETHER TO THE BOWER THERE IS A WAY DOWN TO THE COURT FROM MY WINDOW,FINALLY THE ONE PARTY WENT OFF EXULTING AND THE OTHER WAS LEFT IN DESOLATION AND WOE,SHE BLUSHED AND SMILED AND FUMBLED HIS CARD IN HER CONFUSION BEFORE SHE RAN UPSTAIRS,THE MODERN ORGANIZATION OF INDUSTRY WORKS IN THE SAME DIRECTION ALSO BY ANOTHER LINE,ISN'T HE SPLENDID CRIED JASPER IN INTENSE PRIDE SWELLING UP FATHER KNEW HOW TO DO IT,HER REGARD SHIFTED TO THE GREEN STALKS AND LEAVES AGAIN AND SHE STARTED TO MOVE AWAY,WHEN WE WERE OUT IN THE DARKNESS OF THE QUADRANGLE WE AGAIN LOOKED UP AT THE WINDOWS,HE WAS STILL SUFFERING FROM THIS SUDDEN DISTURBANCE OF THE QUIET ROUTINE OF HIS LIFE,SEE THAT YOUR LIVES BE IN NOTHING WORSE THAN A BOY'S CLIMBING FOR HIS ENTANGLED KITE,WHEN CALLED BEFORE I TOLD HOW HASTILY I DROPPED MY FLOWERS OR BRAKE OFF FROM A GAME,DEPARTING FROM FIVE HUNDRED THOUSAND THROATS THREE CHEERS BURST FORTH IN SUCCESSION,THEN SAID SIR FERDINANDO THERE IS NOTHING FOR IT BUT THAT HE MUST TAKE YOU WITH HIM,THE MILITARY FORCE PARTLY RABBLE PARTLY ORGANIZED HAD MEANWHILE MOVED INTO THE TOWN,UPON THIS MADAME DEIGNED TO TURN HER EYES LANGUISHINGLY TOWARDS THE COMTE OBSERVING,TABLES WERE SPREAD ON THE LAWN AND A DAINTY BUT SUBSTANTIAL REPAST WAS TO BE SERVED,DON'T YOU KNOW ONE ABOUT BACON AND TALLOW CANDLES CAN'T YOU TELL ANY LARDER STORIES,WHEREUPON LAKE LAUGHED QUIETLY STILL LOOKING ON THE ACE OF HEARTS WITH HIS SLY EYES,AMBROSE MET ME AT THE BOTTOM OF THE STAIRS AND SHOWED ME THE WAY TO THE SUPPER ROOM,IS IT NOT IMPOSSIBLE HE MURMURED ALOUD THAT ANY CITY SHOULD DISAPPEAR SO COMPLETELY,TRUE HISTORY BEING A MIXTURE OF ALL THINGS THE TRUE HISTORIAN MINGLES IN EVERYTHING,BARTLEY BENT OVER AND TOOK HER IN HIS ARMS KISSING HER MOUTH AND HER WET TIRED EYES,THEY ASKED HIM TO COME TO SEE THEM IN CHELSEA AND THEY SPOKE VERY TENDERLY OF HILDA,AS USED IN THE SPEECH OF EVERYDAY LIFE THE WORD CARRIES AN UNDERTONE OF DEPRECATION,PAUL DECLARES THAT THE FALSE APOSTLES WERE CALLED OR SENT NEITHER BY MEN NOR BY MAN,I TAKE THIS AS MY ANSWER AND I LEAVE THE PROFESSOR TO BITE HIS LIPS WITH IMPATIENCE,I ENTERED AND I TOOK YOU INTO MY CONFIDENCE AS TO THE SUGGESTIONS OF THE SIDE TABLE,SOMETIMES IT IS CALLED A CRAZY QUILT BECAUSE THE PATCHES AND COLORS ARE SO MIXED UP,IT WASN'T SIMPLY THAT SHE SAID SO BUT THAT I KNEW SHE HADN'T I WAS SURE I COULD SEE,HE STOOD STILL IN DEFERENCE TO THEIR CALLS AND PARRIED THEIR BANTER WITH EASY WORDS,MUSSULMANS AND GIAOURS THROW KERCHIEFS AT A SMILE AND HAVE NO RUTH FOR ANY WEEPING,THIS SHE SAID WAS TRUE HOSPITALITY AND I AM NOT SURE THAT I DID NOT AGREE WITH HER,MY WIFE ON THE SPUR OF THE MOMENT MANAGED TO GIVE THE GENTLEMEN A VERY GOOD DINNER,THE FIRST OF OUR VAGUE BUT INDUBITABLE DATA IS THAT THERE IS KNOWLEDGE OF THE PAST,HE CONTINUED HIS PRETENDED SEARCH AND TO GIVE COLOR TO HIS ERRAND MADE TWO ARRESTS,LORD JOHN TAKING OUT GOLD CIGARETTE CASE FROM HIS LEFT HAND UPPER WAISTCOAT POCKET,WELL SAID MADEMOISELLE DE TONNAY CHARENTE I ALSO THINK A GOOD DEAL BUT I TAKE CARE,HERS HAPPENED TO BE IN THE SAME FRAME TOO BUT SHE EVIDENTLY DIDN'T CARE ABOUT THAT,THUS IT IS THAT THE HONOR OF THREE IS SAVED OUR COUNTRY'S OUR MASTER'S AND OUR OWN,ELIZA CLOSED THE DOOR BEHIND HER WITH A DECIDED SLAM AND A KEY CLICKED IN THE LOCK,ROBIN CAREFULLY DESCENDED THE LADDER AND FOUND HIMSELF SOON UPON FIRM ROCKY GROUND,THERE WAS NO CHANCE TO ALTER HIS SLEEPING ROOM TO ONE NEARER TO GAMEWELL'S CHAMBER,HE WAS IN DEEP CONVERSE WITH THE CLERK AND ENTERED THE HALL HOLDING HIM BY THE ARM,YOU ARE A WORTHY LEECH WILL PRESENTLY WHISPERED ROBIN THE WINE HAS WORKED A MARVEL,THIS TRANSIENT SPRING AND LIGHTING UP ARE BEAUTIFUL A GLAMOUR BEGUILING OUR SENSES,OUR FIRST IMPRESSIONS OF PEOPLE ARE IN NINE CASES OUT OF TEN THE RIGHT IMPRESSIONS,HE SHALL NOT LEAVE YOU DAY OR NIGHT WHETHER YOU ARE WORKING OR PLAYING OR SLEEPING,AND WHAT DEMONSTRATION DO YOU OFFER ASKED SERVADAC EAGERLY THAT IT WILL NOT HAPPEN,FAST AS HIS LEGS COULD CARRY HIM SERVADAC HAD MADE HIS WAY TO THE TOP OF THE CLIFF,HOW BROWN YOU'VE GOT SINCE YOU CAME HOME I WISH I HAD AN ATHLETE TO MOW MY ORCHARD,I DIDN'T HAVE ANY FEARS IF I WORKED IT RIGHTLY SAID THE OLD GENTLEMAN COMPLACENTLY,NO SIR HE ISN'T HE'S GONE TO ROSSETER TO SEE MISTER WEST THE FACTOR ABOUT THE WOOL,FOR A WHILE SHE LAY IN HER CHAIR IN HAPPY DREAMY PLEASURE AT SUN AND BIRD AND TREE,PEARL SEEING THE ROSE BUSHES BEGAN TO CRY FOR A RED ROSE AND WOULD NOT BE PACIFIED,A RING OF AMETHYST I COULD NOT WEAR HERE PLAINER TO MY SIGHT THAN THAT FIRST KISS,SCUSE ME SAID TROT I NEGLECTED TO TELL YOU THAT YOU'RE NOT THE BOOLOOROO ANY MORE,THERE WAS GOOD REASON TO STOP AND THINK EVEN FOR THE WORLD'S MOST EMOTIONLESS MAN,SUBSTANTIALLY THIS WAS JACOB'S UNVARNISHED DESCRIPTION OF HIS MASTER AND MISTRESS,SOME POINTS MAY BE TAKEN AS FIXED AND SUCH AS ANY THEORY OF MEMORY MUST ARRIVE AT,THE LEADERS OF THE CONSPIRACY BECAME DISTRUSTFUL OF THEIR POWER TO CRUSH THE TOWN,ALL ABOUT HIM WAS A TUMULT OF BRIGHT AND BROKEN COLOR SCATTERED IN BROAD SPLASHES,OH MADEMOISELLE WHY HAVE I NOT A DEVOTED SISTER OR A TRUE FRIEND SUCH AS YOURSELF,YOU HAVE COME ANDELLA ANDELLA WAS THE NAME OF JANE'S DOLL TO MAKE ROSALIE A VISIT,SOME GIRL HAS BEEN HERE TWICE TO INTERVIEW MY MEN AND I HAVE REFUSED TO ADMIT HER,AS REGARDS MY ROBBING THE COMPANY I'LL SAY THAT I SAVED THEM A HEAVY LOSS ONE DAY,THEY WERE RECEIVED IN THE LITTLE OFFICE BY A MAN NAMED MARKHAM WHO WAS THE JAILER,FAIRVIEW WAS TWELVE MILES AWAY BUT BY TEN O'CLOCK THEY DREW UP AT THE COUNTY JAIL,HE FELT FOR AND FOUND THE WIZARD'S BLACK CLOTH THE SQUIRE WAS QUITE OUT OF BREATH,I BELIEVE I HAVE A LITTLE TASTE THAT WAY THOSE ARE ALL REAL YOU KNOW THOSE JEWELS,WHAT IS YOUR COUNTRY OLAF HAVE YOU ALWAYS BEEN A THRALL THE THRALL'S EYES FLASHED,IT WAS ON THE LAST DAY OF JANUARY THAT THE REPAIRS OF THE SCHOONER WERE COMPLETED,WHAT SHE WANTED FROM US WAS NEITHER OUR FLOWERS NOR OUR FRANCS BUT JUST OUR YOUTH,I SEE A CROWD IN ONE CORNER OF THE GARDEN EVERYBODY STANDING STILL AND LOOKING UP,BUT THE REAL SIGNIFICANCE AND COMFORT OF THE WORDS FOR OUR SINS IS LOST UPON THEM,IT IS POSSIBLE THAT I MAY BE IN A POSITION THEN TO INDICATE SOME COURSE OF ACTION,THEIR ASSUMED CHARACTER CHANGED WITH THEIR CHANGING OPPORTUNITIES OR NECESSITIES,THE HAWK SAT UPON THE BRANCH AND WATCHED HIS QUARRY SWIMMING BENEATH THE SURFACE,AND ALL HIS BROTHERS AND SISTERS STOOD ROUND AND LISTENED WITH THEIR MOUTHS OPEN,WON'T YOU RUN INTO THE HOUSE AND SEE IF MARTHA CAN'T SPARE ONE OR TWO MORE MAIDS,I DIDN'T STOP TO THINK WHETHER IT WAS FOOLISH OR NOT I DID IT AND I'M GLAD I DID,SIT DOWN PLEASE SAID GATES IN A CHEERFUL AND PLEASANT VOICE THERE'S A BENCH HERE,I TOOK FIVE GREAT BRACELETS OF GOLD FROM OUR TREASURE CHEST AND GAVE THEM TO HIM,AS OUR BOAT FLASHED DOWN THE ROLLERS INTO THE WATER I MADE THIS SONG AND SANG IT,HAS THEE CONSULTED THY MOTHER ABOUT A CAREER I SUPPOSE IT IS A CAREER THEE WANTS,I HAVEN'T HAD A CHANCE YET TO TELL YOU WHAT A JOLLY LITTLE PLACE I THINK THIS IS,SHE CONSIDERED A MOMENT AND THEN SAID NO I THINK NOT THOUGH I AM GLAD YOU ASK ME,WE ARE TO HEAR CHRIST WHO HAS BEEN APPOINTED BY THE FATHER AS OUR DIVINE TEACHER,FOR A MOMENT GILCHRIST WITH UPRAISED HAND TRIED TO CONTROL HIS WRITHING FEATURES,BUT THE DUSK DEEPENING IN THE SCHOOLROOM COVERED OVER HIS THOUGHTS THE BELL RANG,THE PECULIAR CIRCUMSTANCES OF THE COLONY ARE WITHIN YOUR EXCELLENCY'S KNOWLEDGE,THEIR DISTINCTIVE CHARACTERS HOWEVER DISPLAY ONE BROAD AND UNFAILING DIFFERENCE,THE HAWK ALIGHTED ON THE DEAD BRANCH AND SAT UPRIGHT MOTIONLESS AS IF SURPRISED,SOME MYSTERIOUS FORCE SEEMED TO HAVE BROUGHT ABOUT A CONVULSION OF THE ELEMENTS,I LEFT YOU ON A CONTINENT AND HERE I HAVE THE HONOR OF FINDING YOU ON AN ISLAND,ALWAYS IRRITABLE COLD INDIFFERENT HE HAD GROWN RAPIDLY MORE SO AS YEARS WENT ON,ALL THESE HONEST PERSONS ARE WAITING THEIR TURN TO GET THEIR SNUFF BOXES FILLED,ON THE OTHER HAND WE ARE NOT TO REGARD THEM AS SO TERRIBLE THAT WE MUST DESPAIR,PAUL TAKES PRIDE IN HIS MINISTRY NOT TO HIS OWN PRAISE BUT TO THE PRAISE OF GOD,MARY TAYLOR HOWEVER RELATED THE TALE OF ZORA TO MISSUS GREY'S PRIVATE EAR LATER,THAT IS ONE REASON YOU ARE OJO THE UNLUCKY SAID THE WOMAN IN A SYMPATHETIC TONE,SO I RETURN REBUK'D TO MY CONTENT AND GAIN BY ILL THRICE MORE THAN I HAVE SPENT,STEPHEN'S HEART BEGAN SLOWLY TO FOLD AND FADE WITH FEAR LIKE A WITHERING FLOWER,OUR BAGGAGE WAS IMMEDIATELY CARRIED TO THE DECK OF THE FRIGATE I RUSHED ABOARD,THIS WAS A FORMIDABLE ARRAY OF ADVANTAGES SLAVERY WAS PLAYING WITH LOADED DICE,FOR LIKE AS NOT THEY MUST HAVE THOUGHT HIM A PRINCE WHEN THEY SAW HIS FINE CAP,THEY ARE CHIEFLY FORMED FROM COMBINATIONS OF THE IMPRESSIONS MADE IN CHILDHOOD,CONGRATULATIONS WERE POURED IN UPON THE PRINCESS EVERYWHERE DURING HER JOURNEY,NAY WE REFUSED THEIR REQUEST MOST POLITELY MOST NOBLE SAID THE LITTLE STROLLER,TO MY MIND THERE HAS ALWAYS BEEN SOMETHING INEXPRESSIBLY AWFUL IN FAMILY FEUDS,I'M GLAD YOU LIKE IT SAYS WYLDER CHUCKLING BENIGNANTLY ON IT OVER HIS SHOULDER,I AM STIFF WITH LONG SITTING HE SAID I ITCH FOR A FIGHT I TURNED TO THE FARMER,ONCE IN ACTION HE WAS LEADING A DETACHMENT OF INFANTRY THROUGH AN INTRENCHMENT,DO WE REALLY KNOW THE MOUNTAIN WELL WHEN WE ARE NOT ACQUAINTED WITH THE CAVERN,A WORD SHOULD NOW BE SAID ABOUT THE ORIGIN OF LUTHER'S COMMENTARY ON GALATIANS,THAT'S THE WAY WITH YOU THAT'S THE ROAD YOU'D ALL LIKE TO GO HEADLONGS TO RUIN,A SUDDEN IMPULSE CAME OVER HIM TO ENTER AND SEE IF THEY WERE INDEED THE PROOFS,I DARE NOT GO SO FAR AS THAT BUT OF THE THREE HE IS PERHAPS THE LEAST UNLIKELY,CHINGACHGOOK HAD CAUGHT THE LOOK AND MOTIONING WITH HIS HAND HE BADE HIM SPEAK,IT WAS THE SCARLET LETTER IN ANOTHER FORM THE SCARLET LETTER ENDOWED WITH LIFE,SOME IMAGES LIKE SOME SENSATIONS FEEL VERY FAMILIAR WHILE OTHERS FEEL STRANGE,HE STILL HELD ON TO IT WITH BOTH HANDS AS HE RUSHED INTO HIS MOTHER'S COTTAGE,A LITTLE BIT OF PLASTER TUMBLED DOWN THE CHIMNEY AND STARTLED ME CONFOUNDEDLY,THEN I WILL GET ME A FARM AND WILL WINTER IN THAT LAND NOW WHO WILL FOLLOW ME,SHE'S OLDER THAN I AM BUT SO TINY AND SAD AND SHY THAT SHE SEEMS LIKE A CHILD,IT WAS VERY JOLLY HE MURMURED LAZILY AS MARIE CAME IN TO TAKE AWAY THE COFFEE,IN A GENERAL WAY THOUGH NOT WHOLLY NOR CONSISTENTLY THESE TWO GROUPS COINCIDE,IS THE ATMOSPHERIC CONDITION HAVING ONCE REACHED THIS DENSITY TO BECOME FINAL,HE PANTED TO KNOW IF SHE TOO KNEW OR KNEW AND CARED NOT OR CARED AND KNEW NOT,THE OTHERS RESENTED POSTPONEMENT BUT IT WAS JUST HIS SCRUPLES THAT CHARMED ME,I THANK ALL WHO HAVE LOVED ME IN THEIR HEARTS WITH THANKS AND LOVE FROM MINE,AND I HAVE NO ONE READY TO WHOM I CAN GIVE UP THE ARCHIVES OF THE GOVERNMENT,RE ENTER BUTLER AND THREE FOOTMEN WHO REMOVE THE TEA THINGS HOSTESS TO GUEST,LEND ME YOUR EAR FOR TEN MINUTES AND YOU SHALL LEARN JUST WHAT STAGECRAFT IS,IT MIGHT HAVE SEEMED THAT A TROUT OF THIS SIZE WAS A FAIRLY SUBSTANTIAL MEAL,GENTLEMEN TO YOUR POSTS WHEREUPON SAINT AIGNAN AND VILLEROY TOOK THEIR LEAVE,IT DID NOT BECKON OR INDEED MOVE AT ALL IT WAS AS STILL AS THE HAND OF DEATH,I WAS BOOKKEEPER SO IT WAS EASY TO GET A BLANK CHECK AND FORGE THE SIGNATURE,I'M RUNNING FOR REPRESENTATIVE ON THE REPUBLICAN TICKET SAID KENNETH QUIETLY,BUT IN SUCH A CASE MISS MILNER'S ELECTION OF A HUSBAND SHALL NOT DIRECT MINE,TO TEACH READING MEANS TO LIGHT THE FIRE EVERY SYLLABLE SPELLED OUT SPARKLES,GRACE BE TO YOU AND PEACE FROM GOD THE FATHER AND FROM OUR LORD JESUS CHRIST,IT'LL BE NO USE THEIR PUTTING THEIR HEADS DOWN AND SAYING COME UP AGAIN DEAR,NO NO NO TOTTY UD GET HER FEET WET SAID MISSUS POYSER CARRYING AWAY HER IRON,WELL WHAT CAN'T BE DONE BY MAIN COURAGE IN WAR MUST BE DONE BY CIRCUMVENTION,BUT THE BEAR INSTEAD OF OBEYING MAINTAINED THE SEAT IT HAD TAKEN AND GROWLED,MOST PEOPLE TALK TOO MUCH SO IT IS A RELIEF TO FIND ONE WHO TALKS TOO LITTLE,AT THE EMERALD CITY WHERE OUR PRINCESS OZMA LIVES GREEN IS THE POPULAR COLOR,THAT A STYLE IS RESTRAINED OR SEVERE DOES NOT MEAN THAT IT IS ALSO ERRONEOUS,FOR A FULL HOUR HE HAD PACED UP AND DOWN WAITING BUT HE COULD WAIT NO LONGER,WE SAT WITH THE OFFICERS SOME LITTLE TIME AFTER DINNER AND THEN WENT ASHORE,ONCE FAIRLY A WING HOWEVER HE WHEELED AND MADE BACK HURRIEDLY FOR HIS PERCH,IT IS TOO DIFFICULT REPLIED MADEMOISELLE DE TONNAY CHARENTE LAUGHING LOUDLY,THEN SHE GAVE A LITTLE LAUGH AND REPLIED NO MISS BETH I'M ELIZABETH PARSONS,WE HAVE HEARD SOMETHING OF YOUR STORY SAID KENNETH AND ARE INTERESTED IN IT,WHY ONE MORNING THERE CAME A QUANTITY OF PEOPLE AND SET TO WORK IN THE LOFT,IN AUTUMN THE WOOD CUTTERS ALWAYS CAME AND FELLED SOME OF THE LARGEST TREES,AND HE MADE A LITTLE DIP OF HIS CANE TOWARDS BRANDON HALL OVER HIS SHOULDER,ALL THE TIME HE WAS TALKING TO ME HIS ANGRY LITTLE EYES WERE FOLLOWING LAKE,DO YOU KNOW LAKE OH I REALLY CAN'T TELL BUT HE'LL SOON TIRE OF COUNTRY LIFE,MEANWHILE RODOLFO HAD LEOCADIA SAFE IN HIS CUSTODY AND IN HIS OWN APARTMENT,A MORE DREARY AND MORE DISUNITED FAMILY PARTY I NEVER SAT AT THE TABLE WITH,NO CATHEDRAL NOT EVEN BURGOS ITSELF COULD VIE WITH THE CHURCH AT MONTMARTRE,RUTH SAT QUITE STILL FOR A TIME WITH FACE INTENT AND FLUSHED IT WAS OUT NOW,IS THY FATHER WILLING THEE SHOULD GO AWAY TO A SCHOOL OF THE WORLD'S PEOPLE,THE WORLD IS ALL THERE JUST AS IT USED TO BE BUT I CAN'T GET AT IT ANY MORE,DO YOU KNOW I THOUGHT THE DANCE A BIT CONSCIOUS TO NIGHT FOR THE FIRST TIME,I SIT DOWN AT A SMALL TABLE A WAITER COMES IMMEDIATELY TO ENQUIRE MY WISHES,THERE IS EVEN A WHITE ROW OF BEEHIVES IN THE ORCHARD UNDER THE WALNUT TREES,BUT CRESSWELL ADDED SIGNIFICANTLY CAPACITY DIFFERS ENORMOUSLY BETWEEN RACES,WELL WELL DON'T TROUBLE TO ANSWER LISTEN AND SEE THAT I DO YOU NO INJUSTICE,AS A MATTER OF FACT HE COULD NOT SAID SOAMES FOR I ENTERED BY THE SIDE DOOR,THE HAIR WAS OF BROWN YARN AND HUNG DOWN ON HER NECK IN SEVERAL NEAT BRAIDS,PLEASE FORGIVE ME FOR THIS UNDERHANDED WAY OF ADMITTING I HAD TURNED FORTY,MONSIEUR WAS THE ONLY ONE WHO DID NOT UNDERSTAND ANYTHING ABOUT THE MATTER,AND MY POCKET MONEY IS GETTING LOW AGAIN AND YOU HAVEN'T ANY LEFT AS USUAL,THEY THEY EXCITE ME IN SOME WAY AND I I CAN'T BEAR THEM YOU MUST EXCUSE ME,YOU SPEAK LIKE AN EDUCATED PERSON SAID BETH WONDERINGLY WHERE IS YOUR HOME,THE HOURS PASSED WEARILY BY AND MOVEMENT COULD YET BE HEARD ABOUT THE HALL,AT THE PROW I CARVED THE HEAD WITH OPEN MOUTH AND FORKED TONGUE THRUST OUT,HE SEEMED BORN TO PLEASE WITHOUT BEING CONSCIOUS OF THE POWER HE POSSESSED,HE MENTIONS THE APOSTLES FIRST BECAUSE THEY WERE APPOINTED DIRECTLY BY GOD,A BRISK WIND HAD COME UP AND WAS DRIVING PUFFY WHITE CLOUDS ACROSS THE SKY,HE DARTED THROUGH THE TREES AND PAUSED A TALL MAN STRONGLY BUT SLIMLY MADE,JOHN TAYLOR WHO HAD SUPPORTED HER THROUGH COLLEGE WAS INTERESTED IN COTTON,WHEN THEY WERE OUTSIDE UNC SIMPLY LATCHED THE DOOR AND STARTED UP THE PATH,YET THESE THOUGHTS AFFECTED HESTER PRYNNE LESS WITH HOPE THAN APPREHENSION,THE KING STOOD UP AND CALLED FOR THAT PSALM WHICH BEGINS WITH THESE WORDS,GOOD GRACIOUS HAS THE KING ANY RIGHT TO INTERFERE IN MATTERS OF THAT KIND,OH LET HIM COME ALONG SHE URGED I DO LOVE TO SEE HIM ABOUT THAT OLD HOUSE,HE MIGHT HAVE HAD THAT FORGED CHECK FOR THE FACE OF IT IF HE'D BEEN SHARP,THESE ESCAPADES ARE NOT FOR OLD GAMEWELL LAD HIS DAY HAS COME TO TWILIGHT,THERE IS HARDLY ONE DAY OUT OF A HUNDRED WHICH IS WHOLLY JOYOUS AND SUNNY,WHEN DID YOU COME BARTLEY AND HOW DID IT HAPPEN YOU HAVEN'T SPOKEN A WORD,I THOUGHT IT MIGHT BE SISTER KATE OR COUSIN MIKE WOULD BE HAPPENING ALONG,I SHALL BE PUNISHED FOR IT NOW I SUPPOSE BY BEING DROWNED IN MY OWN TEARS,THE SHADOW OF THE RAFT WAS CLEARLY OUTLINED UPON THE SURFACE OF THE WAVES,BUT THE PLANT RAN AND IT WAS THE FIRST THREE WIRE STATION IN THIS COUNTRY,THE SQUARES OF COTTON SHARP EDGED HEAVY WERE JUST ABOUT TO BURST TO BOLLS,THE MAN ENTERED AND TOOK THE PAPERS SHEET BY SHEET FROM THE CENTRAL TABLE,HOTEL A PLACE WHERE A GUEST OFTEN GIVES UP GOOD DOLLARS FOR POOR QUARTERS,I EXPECT YOU HAVE BEEN A VERY GOOD GIRL ANDELLA SINCE YOU WERE HERE LAST,TO GIVE AN IDEA OF THESE CONVERSATIONS I WILL REPORT ONE OF THEM IN FULL,WE OUGHT TO HAVE MORE ATTENDANTS BETH SAID LOUISE APPROACHING HER COUSIN,IT WAS BETTER FOR HIM TO THINK THE GIRL UNFEELING THAN TO KNOW THE TRUTH,BUT UNDER THE CIRCUMSTANCES I DOUBT IF SUCH AN ARRANGEMENT COULD BE MADE,SOFT HEART HE SAID GENTLY TO HER THEN TO THORKEL WELL LET HIM GO THORKEL,WELL MOTHER SAID THE YOUNG STUDENT LOOKING UP WITH A SHADE OF IMPATIENCE,THE ARMY FOUND THE PEOPLE IN POVERTY AND LEFT THEM IN COMPARATIVE WEALTH,AND WHAT WAS THE SUBJECT OF THE POEM SAID THE PERSON WHO MADE THE REMARK,UNDERSCORE THESE WORDS FOR THEY ARE FULL OF COMFORT FOR SORE CONSCIENCES,IT'S EXCITING TO SEE EVERYTHING GROWING SO FAST AND TO GET THE GRASS CUT,BY THE BY I'VE NEVER SEEN YOUR DAIRY I MUST SEE YOUR DAIRY MISSUS POYSER,IT WAS THE INDIAN WHOSE DARK SILHOUETTE APPEARED SUDDENLY UPON HIS BLIND,DID ANYONE KNOW THAT THESE PROOFS WOULD BE THERE NO ONE SAVE THE PRINTER,THIS WAS WHAT DID THE MISCHIEF SO FAR AS THE RUNNING AWAY WAS CONCERNED,HIS CONDUCT AND PRESENCE OF MIND IN THIS EMERGENCE APPEARED CONSPICUOUS,SHE THEN ROSE HUMMING THE AIR TO WHICH SHE WAS PRESENTLY GOING TO DANCE,IT WAS A DELIBERATE THEFT FROM HIS EMPLOYERS TO PROTECT A GIRL HE LOVED,SERVADAC TOOK IT FOR GRANTED THAT THE DOBRYNA WAS ENDEAVORING TO PUT IN,EXCLAIMED BILL HARMON TO HIS WIFE AS THEY WENT THROUGH THE LIGHTED HALL,MY LORD MISS MILNER'S TASTE IS NOT A DEPRAVED ONE IT IS BUT TOO REFINED,WHY SHOULD I RUST AND BE STUPID AND SIT IN INACTION BECAUSE I AM A GIRL,IN THIS WORLD EVIDENTLY THE VESTIBULE OF ANOTHER THERE ARE NO FORTUNATE,OH WHAT A RECORD TO READ WHAT A PICTURE TO GAZE UPON HOW AWFUL THE FACT,I THOUGHT IT THEREFORE MY DUTY WHEN I LEFT SCHOOL TO BECOME A GOVERNESS,BUT I WOULD NOT SPEAK AT THE TIME BECAUSE I WANTED TO REFRESH MY MEMORY,THE MOST FAMOUS OF THEM ALL WAS THE OVERTHROW OF THE ISLAND OF ATLANTIS,THAT WON'T LAST IT WILL GO AWAY AND THINGS WILL BE JUST AS THEY USED TO,THEY THINK YOU'RE PROUD BECAUSE YOU'VE BEEN AWAY TO SCHOOL OR SOMETHING,THAT'S NOT MUCH OF A JOB FOR AN ATHLETE HERE I'VE BEEN TO TOWN AND BACK,I KNOW GASPED POLLY CONTROLLING HER SOBS I WON'T ONLY I CAN'T THANK YOU,THE PARIS PLANT LIKE THAT AT THE CRYSTAL PALACE WAS A TEMPORARY EXHIBIT,I THINK I SHOULD BE DOING YOU A SERVICE TO TURN YOU OUT OF SUCH A PLACE,HOLMES TURNED AWAY AND STOOPED SUDDENLY TO THE FLOOR HALLOA WHAT'S THIS,HORSE SENSE A DEGREE OF WISDOM THAT KEEPS ONE FROM BETTING ON THE RACES,WHOSE FEET ARE AS THE FEET OF HARTS AND UNDERNEATH THE EVERLASTING ARMS,THE RECTOR PAUSED AND THEN SHAKING HIS CLASPED HANDS BEFORE HIM WENT ON,BUT AT THIS POINT IN THE RAPIDS IT WAS IMPOSSIBLE FOR HIM TO STAY DOWN,THE GREAT HAWK FOLLOWED HURRIEDLY TO RETRIEVE HIS PREY FROM THE GROUND,HE WAS SUCH A BIG BOY THAT HE WORE HIGH BOOTS AND CARRIED A JACK KNIFE,WILL YOU LEAVE ME ALONE IN MY OWN ROOM OR MUST I GO AWAY TO ESCAPE YOU,HE SPOKE SIMPLY BUT PACED UP AND DOWN THE NARROW CELL IN FRONT OF THEM,AS ANY IN ENGLAND I WOULD SAY SAID GAMEWELL PROUDLY THAT IS IN HIS DAY,IT IS ENOUGH SAID GEORGE GAMEWELL SHARPLY AND HE TURNED UPON THE CROWD,BEFORE THEM FLED THE STROLLER AND HIS THREE SONS CAPLESS AND TERRIFIED,HE IS NOT WELL HE HAS COME OVER THE OCEAN FOR REST AND CHANGE OF SCENE,IT WAS SO DARK THAT I COULD SEE NOTHING BUT A FEW SPARKS ON THE HEARTH,WHY IT'S IN MISSOURI SOMEWHERE ON THE FRONTIER I THINK WE'LL GET A MAP,HE FELT A TREMOR RUN THROUGH THE SLENDER YELLOW FIGURE IN FRONT OF HIM,I AM NOT DEPRECIATING IT WHEN I SAY THAT IN THESE TIMES IT IS NOT RARE,THE LIVERY BECOMES OBNOXIOUS TO NEARLY ALL WHO ARE REQUIRED TO WEAR IT,TELL US SAID THE OTHER THE WHOLE STORY AND WHERE SOLON HEARD THE STORY,I AM NOT COMPLAINING THAT THE RATE IS SLOW BUT THAT THE SEA IS SO WIDE,HOLMES HELD IT OUT ON HIS OPEN PALM IN THE GLARE OF THE ELECTRIC LIGHT,I HAD TO READ IT OVER CAREFULLY AS THE TEXT MUST BE ABSOLUTELY CORRECT,UNCAS CAST HIS SKIN AND STEPPED FORTH IN HIS OWN BEAUTIFUL PROPORTIONS,HAY FEVER A HEART TROUBLE CAUSED BY FALLING IN LOVE WITH A GRASS WIDOW,YOU SEE MY FRIEND IT'S AN ISSUE OF THE MONSTER THE NOTORIOUS NARWHALE,ANYHOW WE'LL LEAVE INSTRUCTIONS TO SHIP THE WHOLE MENAGERIE TO FRANCE,YOU WILL ALLOW ME TO SUGGEST SAID HE THAT THAT IS A MATTER OF OPINION,DELLA HAD A YOUNG SISTER NAMED MARIA AND A COUSIN WHOSE NAME WAS JANE,THIS THOUGHT HOWEVER DID NOT ENTER THE HEADS OF THE ENTHUSIASTIC PAIR,AND THEN THEY BECAME VEXED AND WOULD HAVE SNATCHED YOUR PURSE FROM US,AND THEN YOU CAME BACK NOT CARING VERY MUCH BUT IT MADE NO DIFFERENCE,YOU SEE LOVING SOME ONE AS I LOVE YOU MAKES THE WHOLE WORLD DIFFERENT,HILDA'S FACE QUIVERED BUT SHE WHISPERED YES I THINK IT MUST HAVE BEEN,ALREADY A NORTH AND A SOUTH WERE TALKED OF WHY NOT SET UP ALSO A WEST,THEIR SUFFERINGS HAVE NEVER YET BEEN FITLY CHRONICLED BY HUMAN SCRIBE,WHEN I WAS A YOUNG MAN I THOUGHT PAUL WAS MAKING TOO MUCH OF HIS CALL,SATURDAY AUGUST FIFTEENTH THE SEA UNBROKEN ALL ROUND NO LAND IN SIGHT,ABOVE ALL THINGS I DESIRE TO SETTLE THE MATTER QUIETLY AND DISCREETLY,THE DELAWARES ARE CHILDREN OF THE TORTOISE AND THEY OUTSTRIP THE DEER,TO THIS HIS ANSWER WAS PROMPT OH THANK GOD NO AND IS THE RECORD YOURS,IF HE TO KEEP ONE OATH MUST LOSE ONE JOY BY HIS LIFE'S STAR FORETOLD,COULD IT MEAN TO LAST A LOVE SET PENDULOUS BETWEEN SORROW AND SORROW,OVER THE TRACK LINED CITY STREET THE YOUNG MEN THE GRINNING MEN PASS,YOU HEAR WHAT SIR FERDINANDO BROWN HAS SAID REPLIED CAPTAIN BATTLEAX,THE DUCHESS OF SOUTHBRIDGE TO LORD REGGIE OH REGGIE WHAT DID YOU SAY,A STORY CRIED THE CHILDREN DRAWING A LITTLE FAT MAN TOWARDS THE TREE,RIGHT WILLINGLY FOR BETWEEN US WE HAVE WON THE BATTLE ANSWERED ROBIN,TIS FINE FOR YOU TO TALK OLD MAN ANSWERED THE LEAN SULLEN APPRENTICE,WHAT OF THE FARM OLAF NOT YET I ANSWERED VIKING IS BETTER FOR SUMMER,NEVER MIND NOW INTERPOSED THE CAPTAIN WE WILL TALK OF THAT BY AND BY,THERE IS THE SLANG OF THE AFFECTED LADY AS WELL AS OF THE PRECIEUSES,IT'S BEEN ON ONLY TWO WEEKS AND I'VE BEEN HALF A DOZEN TIMES ALREADY,THIS PASSAGE THEN BEARS OUT THE FACT THAT ALL MEN ARE SOLD UNDER SIN,NOT GOLD OR SILVER OR PASCHAL LAMBS OR AN ANGEL BUT HIMSELF WHAT FOR,THEY SAID TO THE GALATIANS YOU HAVE NO RIGHT TO THINK HIGHLY OF PAUL,THERE'S A HEAVY STORM COMING ON I CRIED POINTING TOWARDS THE HORIZON,THOSE HUGE CREATURES ATTACKED EACH OTHER WITH THE GREATEST ANIMOSITY,I LIKE TO TALK TO CARL ABOUT NEW YORK AND WHAT A FELLOW CAN DO THERE,SHE ASKED IMPULSIVELY I DIDN'T BELIEVE YOU COULD PERSUADE HER FATHER,OH SIR SAID MISSUS POYSER RATHER ALARMED YOU WOULDN'T LIKE IT AT ALL,I WILL TAKE THE BLACK CLAY WITH ME ALSO THE PENCIL CUTTINGS GOOD BYE,SLOW TO WORLD GREETINGS QUICK WITH ITS O LIST WHEN THE ANGELS SPEAK,YES WE ARE CERTAINLY I REPLIED EVASIVELY BUT AFTER WE MAKE A DETOUR,NOT ONCE DID HE COMMENT ON THE LENGTH OR THE HARDSHIPS OF A JOURNEY,THEY SAY ILLUMINATION BY CANDLE LIGHT IS THE PRETTIEST IN THE WORLD,THE SQUIRE HELPED TO THRUST THEM ALL IN AND ENTERED SWIFTLY HIMSELF,SHAME ON YOU CITIZENS CRIED HE I BLUSH FOR MY FELLOWS OF NOTTINGHAM,THIS WAS SO SWEET A LADY SIR AND IN SOME MANNER I DO THINK SHE DIED,YOU RESEMBLE ME RACHEL YOU ARE FEARLESS AND INFLEXIBLE AND GENEROUS,SO I WILL GIVE OUT THIS LAW THAT MY MEN SHALL NEVER LEAVE YOU ALONE,TWO HUNDRED WARRIORS FEASTED IN HIS HALL AND FOLLOWED HIM TO BATTLE,I SAY SIR HARRY THE LITTLE GIRL'S GOING FAMOUSLY TO NIGHT ISN'T SHE,I CANNOT DENY MYSELF THE GRATIFICATION OF INSERTING SOUTHEY'S REPLY,BUT THE GENERAL DISTINCTION IS NOT ON THAT ACCOUNT TO BE OVERLOOKED,THE ATMOSPHERE IS EVIDENTLY CHARGED AND SURCHARGED WITH ELECTRICITY,IT MUST BE AS WIDE AS THE MEDITERRANEAN OR THE ATLANTIC AND WHY NOT,SUDDENLY HE HEARD HIM AT THE VERY DOOR THERE WAS NO POSSIBLE ESCAPE,MISTER SOAMES WAS SOMEWHAT OVERWHELMED BY THIS FLOOD OF INFORMATION,THE BEAR SHOOK HIS SHAGGY SIDES AND THEN A WELL KNOWN VOICE REPLIED,IT CAN'T HURT ANYTHING I'M SURE FOR WE WON'T DISTURB THINGS AT ALL,FROM THE BLACKNESS BEHIND THE LIGHT THEY HEARD A VOICE WARRENTON'S,THE WINE DID CERTAINLY BRING BACK THE COLOR TO THE SQUIRE'S CHEEKS,A COLD BRIGHT MOON WAS SHINING WITH CLEAR SHARP LIGHTS AND SHADOWS,THE FLOOR MORE THAN ANYTHING ELSE SHOWED THE GREAT AGE OF THE ROOM,BUT DON'T THESE VERY WISE THINGS SOMETIMES TURN OUT VERY FOOLISHLY,IT WAS ONE OF THE MASTERLY AND CHARMING STORIES OF DUMAS THE ELDER,SO I LIVED AND NOW AM YOUR TOOTH THRALL WELL IT IS THE LUCK OF WAR,YOUR FATHER THOUGHT A MOMENT THEN LOOKED AT YOUR MOTHER AND SMILED,SHE IS UNDER SAIL BUT SHE IS COUNT TIMASCHEFF'S YACHT HE WAS RIGHT,THIS WITHOUT RECKONING IN THE PAINS OF THE HEART AND SO IT GOES ON,IT'S NOT PARTICULARLY RARE SHE SAID BUT SOME OF IT WAS MY MOTHER'S,SHE MUST CARE ABOUT THE THEATRE A GREAT DEAL MORE THAN SHE USED TO,HE CALLED THIS SEA A POND AND OUR LONG VOYAGE TAKING A LITTLE SAIL,I GET TIRED OF SEEING MEN AND HORSES GOING UP AND DOWN UP AND DOWN,PEARL SAW AND GAZED INTENTLY BUT NEVER SOUGHT TO MAKE ACQUAINTANCE,THAT IS ALL QUITE TRUE MISTER NEVERBEND SAID SIR FERDINANDO BROWN,THIS KNOWLEDGE IS MEMORY IN ONE SENSE THOUGH IN ANOTHER IT IS NOT,THE PARLIAMENT AND THE SCOTS LAID THEIR PROPOSALS BEFORE THE KING,THE YOUNG GIRLS HAD INDEED MADE THEMSELVES SMALL INDEED INVISIBLE,I ATTEND TO THE HOUSEHOLD MENDING YOU KNOW AND CARE FOR THE LINEN,ROBIN WAS GLAD WHEN AT LENGTH THEY WERE LEFT TO THEIR OWN DEVICES,MARK MY WORDS YOU'LL FIND HIM TOO STRONG FOR YOU AYE AND TOO DEEP,IT IS THE ONLY AMENDS I ASK OF YOU FOR THE WRONG YOU HAVE DONE ME,HE KEEPS THE THOU SHALT NOT COMMANDMENTS FIRST RATE HEN LORD DOES,HE SEEMED TO WAIT FOR HER REPLY BUT AS SHE MADE NONE HE PROCEEDED,GRACE INVOLVES THE REMISSION OF SINS PEACE AND A HAPPY CONSCIENCE,IN EVERY WAY THEY SOUGHT TO UNDERMINE THE AUTHORITY OF SAINT PAUL,NO I'VE MADE UP MY MIND ABOUT IT IF I'M MABEL I'LL STAY DOWN HERE,I REFER TO THE THERMOMETER IT INDICATES THE FIGURE IS OBLITERATED,COTTON IS A WONDERFUL THING IS IT NOT BOYS SHE SAID RATHER PRIMLY,IT WOULD HAVE BEEN MORE WONDERFUL HAD HE SPOKEN WITHOUT A BIDDING,WE HAVE COME FROM A FAR LONELIER PLACE THAN THIS A LONELIER PLACE,MISSUS GRIFFIN HOWEVER EXPRESSED THE NEED FOR A LITTLE MORE LIGHT,IN THE SILENCE THEIR DARK FIRE KINDLED THE DUSK INTO A TAWNY GLOW,THE CLOUD THEN SHEWD HIS GOLDEN HEAD AND HIS BRIGHT FORM EMERG'D,LIKE THE DOVES VOICE LIKE TRANSIENT DAY LIKE MUSIC IN THE AIR AH,I'LL NOT BE WICKED ANY MORE SIGHED THE OLD BOOLOOROO I'LL REFORM,IN PERSON WELCOME ABOARD PROFESSOR YOUR CABIN IS WAITING FOR YOU,SEVERAL HUNDRED FREE STATE MEN PROMPTLY RESPONDED TO THE SUMMONS,IT IS NECESSARY THEREFORE THAT HE SHOULD COMPLY THE KING FROWNED,THE SOMBRE OLD TREES LIKE GIGANTIC HEARSE PLUMES BLACK AND AWFUL,DON'T INSULT ME STANLEY BY TALKING AGAIN AS YOU DID THIS MORNING,UP AND DOWN THE WATER WE WENT TO GET MUCH WEALTH AND MUCH FROLIC,WOULD NOT THE LOFTIEST EMINENCES OF THE CITY AT LEAST BE VISIBLE,AND IF I HAD A FORTUNE WOULD THEE WANT ME TO LEAD A USELESS LIFE,TO BURN WITHOUT CEASING TO FLY THEREIN LIES THE MARVEL OF GENIUS,ALEXANDER ROSE AND SHOOK HIMSELF ANGRILY YES I KNOW I'M COWARDLY,THE GREATNESS OF THE RANSOM CHRIST THE SON OF GOD INDICATES THIS,AT THE SAME TIME PAUL CONFIRMS OUR CREED THAT CHRIST IS VERY GOD,AS FOR THE ICHTHYOSAURUS HAS HE RETURNED TO HIS SUBMARINE CAVERN,I PRAY FOR YOU BUT THAT'S NOT THE SAME AS IF YOU PRAYED YOURSELF,FOR IF HE'S ANYWHERE ON THE FARM WE CAN SEND FOR HIM IN A MINUTE,MUNNY I TOULD IKE TO DO INTO DE BARN TO TOMMY TO SEE DE WHITTAWD,I SUPPOSE THOUGH IT'S TOO EARLY FOR THEM THEN CAME THE EXPLOSION,SHE HAD ALMOST FORGOTTEN THAT IT WAS HERE WITHIN TOUCH AND SIGHT,THE YOUNG MAN IS IN BONDAGE AND MUCH I FEAR HIS DEATH IS DECREED,ON FRIDAY CONFESSION WILL BE HEARD ALL THE AFTERNOON AFTER BEADS,SHE CEASD AND SMILD IN TEARS THEN SAT DOWN IN HER SILVER SHRINE,BUT CAP'N BILL MADE NO SUCH ATTEMPT KNOWING IT WOULD BE USELESS,STRAIGHTWAY THE HAWK GLIDED FROM HIS PERCH AND DARTED AFTER HIM,I HAD AGAIN BEEN ACTING UNDER THE INFLUENCE OF THIS MAN'S POWER,HE LOOKED UP RATHER UNGRACIOUSLY BUT MOTIONED THEM TO BE SEATED,PERHAPS THE OTHER TREES FROM THE FOREST WILL COME TO LOOK AT ME,AND TOWARDS CHRISTMAS HE WAS ONE OF THE FIRST THAT WAS CUT DOWN,WILL WHISPERED ROBIN OPENING HIS DOOR AS HE SPOKE ARE YOU READY,TAKE YOUR PLACE AND LET US SEE WHAT THE CRYSTAL CAN SHOW TO YOU,BY THE BEARD OF ODIN I CRIED YOU HAVE TAKEN OUR JOKE LIKE A MAN,ON A BENCH IN A FAR CORNER WERE A DOZEN PEOPLE HUDDLED TOGETHER,IS THEE GOING TO THE YEARLY MEETING RUTH ASKED ONE OF THE GIRLS,MARGARET BOLTON ALMOST LOST FOR A MOMENT HER HABITUAL PLACIDITY,DON'T I THOUGH I'M SO SORRY TO HEAR IT HOW DID HER SON TURN OUT,THIS SHOULD GO FAR IN SHUTTING THE MOUTHS OF THE FALSE APOSTLES,IN THIS WHOLE EPISTLE PAUL TREATS OF THE RESURRECTION OF CHRIST,OH EVER SO MUCH ONLY HE SEEMS KIND OF STAID AND SCHOOL TEACHERY,JUST SMELL THE WILD ROSES THEY ARE ALWAYS SO SPICY AFTER A RAIN,YOU LEFT HIM IN A CHAIR YOU SAY WHICH CHAIR BY THE WINDOW THERE,THE HEAD OF THE PATCHWORK GIRL WAS THE MOST CURIOUS PART OF HER,WELL IF I DON'T KNOW WHO SHE WAS IN LOVE WITH I KNOW WHO HE WAS,THE GOAT'S WARLIKE SPIRIT WAS ROUSED BY THIS SUCCESSFUL ATTACK,AND IN THIS LAST ACTION HE FALLS INTO THE CLASSIC SIN OF PRIDE,BUT MUCH OF THE NOVEL'S BROODING POWER COMES FROM CAPTAIN NEMO,HE WORKED ME VERY HARD HE WANTED TO BE BEATING ME ALL THE TIME,ANYHOW IT'S JOLLY EXCITING AND I CAN DO THE DIALOGUE ALL RIGHT,OH SAY THAT'S DIFFERENT OBSERVED MARKHAM ALTERING HIS DEMEANOR,THEY SNUFFED ABOUT THE FIR TREE AND RUSTLED AMONG THE BRANCHES,WERE I IN THE WARM ROOM WITH ALL THE SPLENDOR AND MAGNIFICENCE,ROBIN ENTERED THE HUT DRAGGING THE UNWILLING ESQUIRE AFTER HIM,AGAIN HE SEARCHED HIS OWN THOUGHTS NOR INEFFECTUALLY AS BEFORE,ALEXANDER LEANED FORWARD AND WARMED HIS HANDS BEFORE THE BLAZE,COME WE'LL HAVE OUR COFFEE IN THE OTHER ROOM AND YOU CAN SMOKE,SIR HARRY TOWNE MISTER BARTLEY ALEXANDER THE AMERICAN ENGINEER,HE'S ANOTHER WHO'S AWFULLY KEEN ABOUT HER LET ME INTRODUCE YOU,WE WON'T TALK ABOUT HER ANY MORE IF YOU'D RATHER NOT WE INDEED,AREN'T YOU SPLASHED LOOK AT THE SPIDER WEBS ALL OVER THE GRASS,HE SAT DOWN WEAK BEWILDERED AND ONE THOUGHT WAS UPPERMOST ZORA,THERE IS NO OPENING EXCEPT THE ONE PANE SAID OUR LEARNED GUIDE,THE PROOF WAS IN THREE LONG SLIPS I HAD LEFT THEM ALL TOGETHER,LET US RETRACE OUR STEPS AND EXAMINE AS WE GO WITH KEENER EYES,SHE POURED INTO THE DISH A QUANTITY FROM EACH OF THESE BOTTLES,THE RECTOR DID NOT ASK FOR A CATECHISM TO HEAR THE LESSON FROM,OPEN THY HEART WIDE AND FOLD WITHIN THE WET WINGS OF THY DOVE,OR AN EYE OF GIFTS AND GRACES SHOWRING FRUITS AND COINED GOLD,ONE OF US ALWAYS REMAINS ON BOARD WHILE THE OTHER IS ON SHORE,YOUR PLAY MUST BE NOT MERELY A GOOD PLAY BUT A SUCCESSFUL ONE,DOES YOUR MAJESTY THEN NO LONGER BELIEVE THE DISLOYAL ATTEMPT,VOLTAIRE PICKED UP SOMETHING FROM THE GROUND AND LOOKED AT IT,NOTHING MORE NOT EVEN THE WRIST TO WHICH IT MIGHT BE ATTACHED,SOMETHING BETTER SOMETHING STILL GRANDER MUST FOLLOW BUT WHAT,MOST OF ALL ROBIN THOUGHT OF HIS FATHER WHAT WOULD HE COUNSEL,WHAT IS YOUR NAME LORDING ASKED THE LITTLE STROLLER PRESENTLY,HE WAS LIKE UNTO MY FATHER IN A WAY AND YET WAS NOT MY FATHER,THEIR EYES DANCED BIG THORLEIF STOOD UP AND STRETCHED HIMSELF,TO ALL THESE INQUIRIES THE COUNT RESPONDED IN THE AFFIRMATIVE,IT IS SO MADE THAT EVERYWHERE WE FEEL THE SENSE OF PUNISHMENT,I DOUBT WHETHER BRANWELL WAS MAINTAINING HIMSELF AT THIS TIME,SOLON MARVELLED AND DESIRED TO BE INFORMED OF THE PARTICULARS,WE THINK THAT BY SOME LITTLE WORK OR MERIT WE CAN DISMISS SIN,NOT FOR A CROWN OR A KINGDOM OR OUR GOODNESS BUT FOR OUR SINS,NO NAMES PLEASE SAID HOLMES AS WE KNOCKED AT GILCHRIST'S DOOR,ONE HARDLY LIKES TO THROW SUSPICION WHERE THERE ARE NO PROOFS,OLD DANCES ARE SIMPLIFIED OF THEIR YEARNING BLEACHED BY TIME,COME AND GET THE BOOLOOROO SHE SAID GOING TOWARD THE BENCHES,YOU HAVE COME TO US THREATENING US WITH ABSOLUTE DESTRUCTION,I HAVE BEEN HERE THIS QUARTER OF AN HOUR REPLIED LA VALLIERE,I REMEMBER NOW AND I CONGRATULATE MYSELF DO YOU LOVE ANY ONE,SEEING THAT I AM SO FINE I MAY AS WELL GO AND VISIT THE KING,CAN YOU IMAGINE WHY BUCKINGHAM HAS BEEN SO VIOLENT I SUSPECT,SHE EVEN SEEMED MILDLY AMUSED AT THE ATTENTION SHE ATTRACTED,AND THE WHOLE NIGHT THE TREE STOOD STILL AND IN DEEP THOUGHT,AT LAST ALL WAS QUIET AND BLACK IN THE COURTYARD OF GAMEWELL,PRESENTLY HE CROSSED THE FLOOR OF HIS ROOM WITH DECIDED STEP,ILL AND TROUBLED DEAR TROUBLED IN MIND AND MISERABLY NERVOUS,I DID NOT EVEN TAKE THE PRECAUTION OF SMOKING UP THE CHIMNEY,IN THE STERN I CURVED THE TAIL UP ALMOST AS HIGH AS THE HEAD,OLIVE'S MOURNFUL BLACK EYES MET NANCY'S SPARKLING BROWN ONES,GRANDFATHER WAS ALEXANDER CAREY L L D DOCTOR OF LAWS THAT IS,WHAT CAN YOU MEAN BY THAT MISS WOODLEY YOU TALK MYSTERIOUSLY,IS HE GOING TO START A DAILY NEWSPAPER AMONG THE KICK A POOS,YOU CAN BEGIN BY CARRYING A ROD AND PUTTING DOWN THE FIGURES,I'LL DO ANYTHING YOU WISH ME TO BARTLEY SHE SAID TREMULOUSLY,WHEN THE KING COMES TO PARIS EVERYBODY CALLS OUT VIVE LE ROI,KESWICK MARCH TWENTY SECOND EIGHTEEN THIRTY SEVEN DEAR MADAM,THERE SEEMS NO GOOD REASON FOR BELIEVING THAT IT WILL CHANGE,POSITIVELY HEROIC ADDED CRESSWELL AVOIDING HIS SISTER'S EYES,I WAS IN SUCH A HURRY TO COME TO YOU YOU LEFT YOUR DOOR OPEN,DO NOT THEREFORE THINK THAT THE GOTHIC SCHOOL IS AN EASY ONE,WELL NOW ENNIS I DECLARE YOU HAVE A HEAD AND SO HAS MY STICK,DEAREST TEACH ME SO TO POUR OUT GRATITUDE AS THOU DOST GOOD,I SHALL BE HAPPY TO TAKE CHARGE OF THEM SAID SIR FERDINANDO,THEY WERE CERTAINLY NO NEARER THE SOLUTION OF THEIR PROBLEM,HOWEVER THAT WAS OVER NOW THE TREE GONE THE STORY AT AN END,SAID THE FIR TREE THINKING OVER WHAT HE HAD HIMSELF RELATED,HUMPY DUMPY FELL DOWNSTAIRS AND YET HE MARRIED THE PRINCESS,IF A FELLOW'S BEEN A LITTLE BIT WILD HE'S BEELZEBUB AT ONCE,HERE THEY SAID IS A RASCAL WHO HAS BEEN HARRYING OUR COASTS,HERE FRIEND TAKE IT AND HE THRUST IT INTO THE FARMER'S HAND,BY THE HAMMER OF THOR SHOUTED GRIM HERE IS NO STINGY COWARD,EXCLAIMED SERVADAC KEEPING HIS EYE UNMOVED AT HIS TELESCOPE,LENGTH OF SERVICE FOURTEEN YEARS THREE MONTHS AND FIVE DAYS,BUT WHY DIDN'T YOU TELL ME WHEN YOU WERE HERE IN THE SUMMER,IT'S REALLY TOO WARM IN THIS ROOM TO SING DON'T YOU FEEL IT,HE'S BEEN WANTING TO MARRY HILDA THESE THREE YEARS AND MORE,THERE IS A MORE OR LESS ELABORATE SYSTEM OF RANK AND GRADES,THE WEATHER IF WE MAY USE THAT TERM WILL CHANGE BEFORE LONG,I'M SURE ALEXANDRA HOPES YOU WILL STAY ON HERE SHE MURMURED,I SUPPOSE IT'S THE WET SEASON WILL YOU HAVE TO CUT THEM TOO,INDEED HE HAD LOOKED AWAY WITH THE PURPOSE OF NOT SEEING IT,THERE THERE HE SAID SOOTHINGLY PATTING HER BROWN FUZZY HEAD,THE LAGOON HAD BEEN LEVEL WITH THE DYKES A WEEK AGO AND NOW,ON THE PALM WERE THREE LITTLE PYRAMIDS OF BLACK DOUGHY CLAY,WATSON I HAVE ALWAYS DONE YOU AN INJUSTICE THERE ARE OTHERS,NUMBER TEN FRESH NELLY IS WAITING ON YOU GOOD NIGHT HUSBAND,COME FORTH WORM AND THE SILENT VALLEY TO THY PENSIVE QUEEN,JOHN WESLEY COMBASH JACOB TAYLOR AND THOMAS EDWARD SKINNER,HOW YOU MAY BE WONDERING ARE YOU TO BEGIN YOUR MASTERPIECE,TO BE OR NOT TO BE THAT IS THE QUESTION WHETHER TIS NOBLER,MY TONGUE REFUSED TO ARTICULATE MY POWER OF SPEECH LEFT ME,PERCHANCE TOO KAFFAR'S DEATH MIGHT SERVE HIM IN GOOD STEAD,SAID ANOTHER VOICE WHICH I RECOGNIZED AS VOLTAIRE'S KAFFAR,NOW WHAT WAS THE SENSE OF IT TWO INNOCENT BABIES LIKE THAT,TRULY SUCH A HORSE SHOULD BE WORTH MUCH IN NOTTINGHAM FAIR,IT IS MANIFEST THAT MAN IS NOW SUBJECT TO MUCH VARIABILITY,HAKON THERE SHALL BE YOUR CONSTANT COMPANION FRIEND FARMER,MY DRAGON'S BELLY IS NEVER FULL AND ON BOARD WENT THE GOLD,TO ASK ANY MORE QUESTIONS OF YOU I BELIEVE WOULD BE UNFAIR,THE REAL HUMAN DIVISION IS THIS THE LUMINOUS AND THE SHADY,WHY SHOULD ONE NOT EXPLORE EVERYTHING AND STUDY EVERYTHING,WHEN SHE FINISHED ALEXANDER SHOOK HIMSELF OUT OF A REVERIE,LAMB WOULDN'T CARE A GREAT DEAL ABOUT MANY OF THEM I FANCY,I SHOULDN'T WONDER IF SHE COULD LAUGH ABOUT IT WITH ME NOW,SHE SAVES HER HAND TOO SHE'S AT HER BEST IN THE SECOND ACT,YES BUT THE MERIDIAN OF THE PALAIS ROYAL IS THE MOST EXACT,SOCRATES BEGINS THE TIMAEUS WITH A SUMMARY OF THE REPUBLIC,THE MOST THEY COULD CLAIM IS THAT THEY WERE SENT BY OTHERS,AND EMIL MOWED HIS WAY SLOWLY DOWN TOWARD THE CHERRY TREES,AT THIS THE BUNDLE OPENED SUDDENLY AND OUT POPPED PHRONSIE,BUT I HAVE OCCASIONALLY DONE THE SAME THING AT OTHER TIMES,THE PHRASE AND THE DAY AND THE SCENE HARMONIZED IN A CHORD,PRIDE AFTER SATISFACTION UPLIFTED HIM LIKE LONG SLOW WAVES,I HAD A NOTION IT WAS YOU MATE AS SAVED ME FROM THE KNIFE,FOOTNOTE SUMNER TO SHANNON MAY TWELFTH EIGHTEEN FIFTY SIX,DO YOU SUPPOSE THE MINIATURE WAS A COPY OF THE SAME THING,NOTTINGHAM CASTLE WAS REACHED AND ADMITTANCE WAS DEMANDED,COME TO ME MEN HERE HERE HE RAISED HIS VOICE STILL LOUDER,THERE SHE SAT ON THE ROLLERS AS FAIR A SHIP AS I EVER SAW,STEAM UP AND CANVAS SPREAD THE SCHOONER STARTED EASTWARDS,DONE HE AIN'T DONE A THING HE'D OUGHTER SENCE HE WAS BORN,I WILL ASK THE LEAST IMAGINABLE BUT I MUST HAVE SOMETHING,YES YES SHE HURRIED PULLING HER HAND GENTLY AWAY FROM HIM,DO YOU REMEMBER THAT FIRST WALK WE TOOK TOGETHER IN PARIS,THEY ARE ALL SKETCHES MADE ABOUT THE VILLA D'ESTE YOU SEE,IN THIS MONOTONOUS LIFE OF MINE THAT WAS A PLEASANT EVENT,ON AUGUST TWENTY SEVENTH EIGHTEEN THIRTY SEVEN SHE WRITES,INDEED HE PERSECUTED THE CHURCH OF CHRIST FOR A LONG TIME,AT LAST HE CAME OUT OF THEM AND WIPED HIS FACE VIGOROUSLY,RUN BACK UNCAS AND BRING ME THE SIZE OF THE SINGER'S FOOT,AND LAY ME DOWN IN THY COLD BED AND LEAVE MY SHINING LOT,DESCEND O LITTLE CLOUD AND HOVER BEFORE THE EYES OF THEL,AND WHY IT SCATTERS ITS BRIGHT BEAUTY THRO THE HUMID AIR,WHY SHOULD THE MISTRESS OF THE VALES OF HAR UTTER A SIGH,DON'T WORRY SIZZLE DEAR IT'LL ALL COME RIGHT PRETTY SOON,HE WENT HERE THERE AND EVERYWHERE IN PERFECT CONTENTMENT,WE ARE QUITE SATISFIED NOW CAPTAIN BATTLEAX SAID MY WIFE,FOR SOME TIME AFTER THAT I REMEMBERED NOTHING DISTINCTLY,CRIED THE YOUNG LADIES AND THEY QUICKLY PUT OUT THE FIRE,I AM VERY UNEASY ABOUT IT WHATEVER IT IS I CAN'T HELP IT,THIRTY MEN ONE AFTER ANOTHER RAISED THEIR HORNS AND SAID,I ALMOST THINK I CAN REMEMBER FEELING A LITTLE DIFFERENT,THOSE CLOUDS SEEM AS IF THEY WERE GOING TO CRUSH THE SEA,IT WOULD SERVE YOU ALL RIGHT IF SHE WALKED OFF WITH CARL,ASKED PHRONSIE WITH HER LITTLE FACE CLOSE TO POLLY'S OWN,I REALLY DON'T THINK HE KNEW MUCH ABOUT IT MISTER HOLMES,THERE'S ONE AND THERE'S ANOTHER THE DUDLEY AND THE FLINT,THROUGH THE BLACK NIGHT RAIN HE SANG TO HER WINDOW BARS,MILLIGRAM ROUGHLY ONE TWENTY EIGHT THOUSAND OF AN OUNCE,NOT AT ALL YOU ARE ON THE CONTRARY MOST AGREEABLE TO ME,VAST IMPORTANCE AND INFLUENCE OF THIS MENTAL FURNISHING,THEY FOLLOWED THE JAILER ALONG A SUCCESSION OF PASSAGES,IF IT ONLY WERE NOT SO DARK HERE AND SO TERRIBLY LONELY,YET HE WILL TEACH YOU A FEW TRICKS WHEN MORNING IS COME,HE IS MY ESQUIRE EXCELLENCY RETURNED ROBIN WITH DIGNITY,YES SO THEY SAID BUT THAT WOULD I THINK HAVE BEEN WORSE,IF SHE DOES NOT KNOW HOW TO ESTIMATE HER OWN VALUE I DO,SO THERE IS TO ME ADDED SANDFORD WITH A SARCASTIC SNEER,FATHER THEE'S UNJUST TO PHILIP HE'S GOING INTO BUSINESS,HE TOOK HER ROUGHLY IN HIS ARMS DO YOU KNOW WHAT I MEAN,BUT A WORD FURTHER CONCERNING THE EXPEDITION IN GENERAL,WHAT SIR I SAID TO HIM AM I FORTUNATE ENOUGH TO SEE YOU,WE HAD METERS IN WHICH THERE WERE TWO BOTTLES OF LIQUID,HE KNEW THE SILVER FLEECE HIS AND ZORA'S MUST BE RUINED,WHY BANNISTER THE SERVANT WHAT'S HIS GAME IN THE MATTER,LET US HEAR THE SUSPICIONS I WILL LOOK AFTER THE PROOFS,THEN YOU CAN ASK HIM QUESTIONS ON THE CATECHISM DEDALUS,I DID NOT WRONG MYSELF SO BUT I PLACED A WRONG ON THEE,SIR KENNINGTON OVAL IS A VERY FINE PLAYER SAID MY WIFE,I SAY YOU DO KNOW WHAT THIS MEANS AND YOU MUST TELL US,THERE WAS A GRIM SMILE OF AMUSEMENT ON HIS SHREWD FACE,IT WAS IN A CORNER THAT HE LAY AMONG WEEDS AND NETTLES,ALSO THERE WAS A STRIPLING PAGE WHO TURNED INTO A MAID,DID YOU EVER HAVE SUCH A LORDLY GUEST BEFORE I WENT ON,THE SIGHT SEERS RETURNED IN HIGH SPIRITS FROM THE CITY,HOWEVER HE WHO SAYS LIGHT DOES NOT NECESSARILY SAY JOY,THERE IT CLOTHES ITSELF IN WORD MASKS IN METAPHOR RAGS,I SHUDDER AS I RECALL THESE MONSTERS TO MY REMEMBRANCE,DON'T MIND IT POLLY WHISPERED JASPER TWASN'T HER FAULT,AND FEAREST THOU BECAUSE I VANISH AND AM SEEN NO MORE,I NEVER KNEW OF BUT ONE MAN WHO COULD EVER PLEASE HIM,OR OF THE HABITS OF OUR PEOPLE IT IS QUITE IMPOSSIBLE,MISSUS NEVERBEND YOU MUST INDEED BE PROUD OF YOUR SON,IT IS THIS THAT IS OF INTEREST TO THEORY OF KNOWLEDGE,HIS DEATH IN THIS CONJUNCTURE WAS A PUBLIC MISFORTUNE,LARKSPUR BIT ME AGAIN THIS MORNING FOR THE THIRD TIME,THE DEMOCRATIC COMMITTEE FIGURED OUT A WAY TO DO THIS,THE SERVANTS AS WELL AS THE YOUNG LADIES DECORATED IT,REJOICE IN OUR PRESENCE SAID THE AIR AND THE SUNLIGHT,I LIKE YOU STILL RACHEL I'M SURE I'LL ALWAYS LIKE YOU,IS SHE NOT AFRAID THAT I WILL THWART HER INCLINATIONS,I DID NOT THEN REALIZE THE IMPORTANCE OF THE MINISTRY,I GET WET TO MY KNEES WHEN I GO DOWN TO PICK CHERRIES,BUT THERE'S FATHER THE BARN SIR IF HE'D BE OF ANY USE,BUT NOT MORE THAN WHAT'S IN THE BIBLE AUNT SAID DINAH,I OFTEN HEARD HER TALK OF YOU IN THE SAME SORT OF WAY,WHO TAUGHT YOU TO SCRUB A FLOOR I SHOULD LIKE TO KNOW,I AM MY DEAR AND ALL STRANGERS ARE WELCOME TO MY HOME,I PASS AWAY YET I COMPLAIN AND NO ONE HEARS MY VOICE,THAT WAS BUT RUSTLING OF DRIPPING PLANTS IN THE DARK,WHAT COULD I DO NOW BUT JUST LAY MYSELF DOWN AND DIE,HAVE MERCY LORD ON ME I PRAY FOR MEN WOULD ME DEVOUR,THE ARROW PIERCED HIS HEART AND WOUNDED HIM MORTALLY,CERTAINLY SIRE BUT I MUST HAVE MONEY TO DO THAT WHAT,THEY WERE NOW PLAYING WITH THEIR DOLLS IN THE PARLOR,WHY IT'S GOLIATH AS USUAL THEY BOTH CRIED PEERING IN,HE IS SUPPOSED TO SIGN ALL THE CHECKS OF THE CONCERN,IN THE MORNING THE SERVANT AND THE HOUSEMAID CAME IN,NAY NAY LORDING ANSWERED WARRENTON WITH A HALF LAUGH,THEREFORE DON'T TALK TO ME ABOUT VIEWS AND PROSPECTS,MUNNY MY IRON'S TWITE TOLD PEASE PUT IT DOWN TO WARM,UP IN THE SICK ROOM ZORA LAY ON THE LITTLE WHITE BED,THE GOLDEN FLEECE IT'S THE SILVER FLEECE HE HARKENED,NO I FORGOT ALL ABOUT THE BRAINS EXCLAIMED THE WOMAN,OJO HAD NEVER EATEN SUCH A FINE MEAL IN ALL HIS LIFE,WHEN DO YOU INTEND THAT THE JOHN BRIGHT SHALL START,LADY LARKSPUR STARTS SUDDENLY AND TURNS TOWARDS HIM,AND I SHOULD BEGIN WITH A SHORT HOMILY ON SOLILOQUY,BUT EVEN THE UNSUCCESSFUL DRAMATIST HAS HIS MOMENTS,LA VALLIERE IS QUITE A POETESS SAID TONNAY CHARENTE,THE BALLET BEGAN THE EFFECT WAS MORE THAN BEAUTIFUL,THE KING SEEMED ONLY PLEASED WITH EVERY ONE PRESENT,HE UNLOCKED THE DOOR AND CALLED HERE'S VISITORS TOM,IF FOR A WHIM YOU BEGGAR YOURSELF I CANNOT STAY YOU,NO THANKS I AM GLAD TO GIVE YOU SUCH EASY HAPPINESS,BUT THEN THE PICTURE WAS GONE AS QUICKLY AS IT CAME,GIVE NOT SO EARNEST A MIND TO THESE MUMMERIES CHILD,NOW SHE PUT HER HAND ON HIS ARM AND SMILED AND SAID,AND THESE SHALL FOLLOW YOUR THRALLS IN THE SAME WAY,THERE STAND SO I SAID AND GLARE AND HISS AT MY FOES,YES DEAD THESE FOUR YEARS AN A GOOD JOB FOR HER TOO,EACH DAY HAS ITS OWN GREAT GRIEF OR ITS LITTLE CARE,KEEP AWAY IF YOU WISH WHEN HAVE I EVER FOLLOWED YOU,ALEXANDER GROANED I MEANT TO BUT SOMEHOW I COULDN'T,AFTER THAT IT WAS EASY TO FORGET ACTUALLY TO FORGET,MAINHALL LIKED ALEXANDER BECAUSE HE WAS AN ENGINEER,HERE GO AND GET ME CHANGE FOR A LOUIS I HAVE IT SIR,COME COME I AM GETTING REALLY TIRED OF YOUR ABSENCE,BUT YOU BELIEVE IN SOME EDUCATION ASKED MARY TAYLOR,SO CHOOSE FOR YOURSELF TO MAKE A RUSH OR TARRY HERE,BUT WAS THAT ALL HER REWARD ONE OF THE LADIES ASKED,HE QUITTED THE FIRE AND DROPPED BACK INTO HIS CHAIR,WHY AN EAR A WHIRLPOOL FIERCE TO DRAW CREATIONS IN,AS USUAL NOTHING WAS DONE IN THE WAY OF PUNISHMENT,WHAT WOULD BECOME OF YOUR GUN WERE I TO KIDNAP YOU,NO DOUBT IN PROCESS OF TIME THE LADIES WILL FOLLOW,THIS WAS AT THE MARCH ELECTION EIGHTEEN FIFTY FIVE,NATURE OF THE EFFECT PRODUCED BY EARLY IMPRESSIONS,ISN'T HE THE GREATEST FOR GETTING INTO ODD CORNERS,IT WON'T BE MUCH BUT I'M GRATEFUL TO FIND A FRIEND,WHOSE NAME DID YOU SIGN TO THE CHECK ASKED KENNETH,WORSE TOM WORSE N EVER REPLIED THE JAILER GLOOMILY,PRAY FOLLOW US WITH MINE AND MY LORD SHERIFF'S MEN,MONTFICHET CALLED OUT FOR ROBIN TO GIVE HIM AN ARM,WELL SHE WAS BETTER THOUGH SHE HAD HAD A BAD NIGHT,WE SUNK HIS SHIP AND MEN BUT HIM WE BROUGHT TO YOU,THEY COULDN'T RUN NOR MOVE THEY'RE JUST PASTEBOARD,THY WAYS GREATLY TRY ME RUTH AND ALL THY RELATIONS,BUT HOW DID SHE MANAGE TO RENDER IT SO FASHIONABLE,HE NEVER LOSES SIGHT OF THE PURPOSE OF HIS EPISTLE,LET US BEGIN WITH THAT HIS COMMENTARY ON GALATIANS,IF SHE COULD ONLY SEE PHRONSIE FOR JUST ONE MOMENT,I NOW USE THEM AS ORNAMENTAL STATUARY IN MY GARDEN,IT WAS ALMOST THE TONE OF HOPE EVERYBODY WILL STAY,HARANGUE THE TIRESOME PRODUCT OF A TIRELESS TONGUE,SOON THE WHOLE BRIDGE WAS TREMBLING AND RESOUNDING,HE IS CALLED AS YOU KNOW THE APOSTLE OF THE INDIES,WHY A TONGUE IMPRESS'D WITH HONEY FROM EVERY WIND,BUT I DO NOT THINK SUCH AN INFERENCE IS WARRANTED,THE BOGUS LEGISLATURE NUMBERED THIRTY SIX MEMBERS,THEN IS THE TIME TO INTRODUCE A MEAL ON THE STAGE,RELAPSES INTO SILENCE FOR THE REST OF THE EVENING,BUT THIS WAS WHAT THE TREE COULD NOT BEAR TO HEAR,ENQUIRED ROBIN WITH HIS SUSPICIONS STILL UPON HIM,TAKE HIM OUT THORKEL AND LET HIM TASTE YOUR SWORD,MAY YOU DRINK HEART'S EASE FROM IT FOR MANY YEARS,I HAVE NOTHING TO WEAR REPLIED THAT DEMURE PERSON,HE WAS UNABLE TO DECIDE EXACTLY WHAT IT SHOULD BE,ALEXANDER WENT OVER AND OPENED THE WINDOW FOR HER,SHE HAD ANOTHER WEIGHT ON HER MIND THIS CHRISTMAS,THE ORCHARD WAS SPARKLING AND RIPPLING IN THE SUN,WHEN I APPROACHED YOUR ROOM I EXAMINED THE WINDOW,OJO EXAMINED THIS CURIOUS CONTRIVANCE WITH WONDER,I'M AFRAID I DON'T KNOW MUCH ABOUT THE LAND OF OZ,SHE SENT ME THE PAGES IN QUESTION BEFORE SHE DIED,I CAN'T SEE IT IN THAT LIGHT SAID THE OLD LAWYER,A MONTFICHET A MONTFICHET GAMEWELL TO THE RESCUE,THANK YOU RACHEL MY COUSIN RACHEL MY ONLY FRIEND,EFFECTS OF THE INCREASED USE AND DISUSE OF PARTS,THAT TIME IT POINTED US INTO YOUR FATHER'S SHIPS,THE THRALLS WERE BRINGING IN A GREAT POT OF MEAT,NEXT CAME OLIVE'S TURN TO HELP IN THE CEREMONIES,AND YOU BELONG TO THAT SMALL CLASS WHO ARE HAPPY,THE EARTH IS NOT DEVOID OF RESEMBLANCE TO A JAIL,WE HAVE NEVER UNDERSTOOD THIS SORT OF OBJECTIONS,MADAME QUINSON BESIDES CAN ANSWER YOUR ENQUIRIES,MEN SHOULD NOT SPECULATE ABOUT THE NATURE OF GOD,I'LL TRY IF I KNOW ALL THE THINGS I USED TO KNOW,MISTER EDISON WAS A LEADER FAR AHEAD OF THE TIME,HE STARTED AT THE THOUGHT HE HURRIED FORTH SADLY,BUT JOHN THERE'S NO SOCIETY JUST ELEMENTARY WORK,THE EXAMINATION HOWEVER RESULTED IN NO DISCOVERY,YET THAT TASK WAS NOT SO EASY AS YOU MAY SUPPOSE,IT IS HARDLY NECESSARY TO SAY MORE OF THEM HERE,LIEUTENANT CROSSTREES IS A VERY GALLANT OFFICER,AND WHAT SORT OF EVIDENCE IS LOGICALLY POSSIBLE,REMAIN I IMPLORE YOU THE EVENING IS MOST LOVELY,IT HAS COST ME TWICE SIXTY DOLLARS IN ANNOYANCE,SORRY WE HAVEN'T ANY RECEPTION ROOM IN THE JAIL,THERE'S MANY A ONE CONSIDERABLY OLDER THAN I AM,DISMISS YOUR SQUIRE ROBIN AND BID ME GOOD E E N,AND HENRY MIGHT RETURN TO ENGLAND AT ANY MOMENT,LIKE AS NOT YOUNG MASTER THOUGH I AM AN OLD MAN,AND HE ADDED SOMETHING STILL LESS COMPLIMENTARY,MAKE ACQUAINTANCE WITH MISTER JAGO SIT TOGETHER,A ROBBER VIKING SAID THE KING AND SCOWLED AT ME,A HOUSE SMELLS OF SMOKE A SHIP SMELLS OF FROLIC,THE REST OF YOU OFF A VIKING HE HAD THREE SHIPS,WELL I'M GOING AS AN ENGINEER YOU CAN GO AS ONE,ALEXANDER UNCLENCHED THE TWO HANDS AT HIS SIDES,FOR A LONG TIME NEITHER HILDA NOR BARTLEY SPOKE,I TELL HIM TO GIVE ME SOME COFFEE IF IT IS GOOD,AND GOD THE FATHER WHO RAISED HIM FROM THE DEAD,FOR A PERSON TO POSSESS KNOWLEDGE IS NOT ENOUGH,OH WON'T SHE BE SAVAGE IF I'VE KEPT HER WAITING,NOTHING NEW WEATHER UNCHANGED THE WIND FRESHENS,I DON'T KNOW ALL OF THEM BUT I KNOW LINDENS ARE,THE HOPE AND DREAM OF HARVEST WAS UPON THE LAND,HE IMPRESSED ME AS BEING A PERFECTLY HONEST MAN,ONE COULD HARDLY HOPE FOR ANY UPON SO DRY A DAY,IN TRUTH SHE SEEMED ABSOLUTELY HIDDEN BEHIND IT,PEARL WAS A BORN OUTCAST OF THE INFANTILE WORLD,CRIED THE LADIES WHOSE DEPARTURE HAD BEEN FIXED,WE'LL BE QUITE COMFORTABLE HERE I TOLD CONSEIL,CONSEIL I CALLED A THIRD TIME CONSEIL APPEARED,MILLIMETER ROUGHLY ONE TWENTY FIFTH OF AN INCH,AND THE DEATH OF WHICH I DREAMT COULD NOT ALAS,IN DESPAIR HE HURLED HIMSELF DOWNWARD TOO SOON,CONCORD RETURNED TO ITS PLACE AMIDST THE TENTS,WE WISH TO TALK WITH HIM ANSWERED KENNETH TALK,THEN GOOD BYE SAID THE RATS AND THEY WENT HOME,AND HE LEANED AGAINST THE WALL LOST IN REVERIE,I WON'T TREMBLE TO MORROW THOUGHT THE FIR TREE,BE NOT SO FOOLISH FRIEND SAID FITZOOTH CROSSLY,BUT WHO IS THIS FELLOW PLUCKING AT YOUR SLEEVE,AND MINE IS WILL STUTELEY SHALL WE BE COMRADES,IN THE MEANTIME I HAD FORMED A NEW IDEA OF HER,I HAD A HORRID DREAM ABOUT HIM LAST NIGHT THAT,WHEN I ADDRESSED HIM HE ANSWERED CONSTRAINEDLY,ARE YOU CERTAIN THAT THIS IS THE MEDITERRANEAN,DOES THEE THINK THEE COULD STAND IT SIX MONTHS,HE PULLED UP A WINDOW AS IF THE AIR WERE HEAVY,THOSE FELLOWS ARE ALL VERY LOYAL EVEN MAINHALL,WE USED TO DISPUTE ABOUT POLITICS AND RELIGION,EMBRACE HIM AND FORGET ABOUT THE NATURE OF GOD,THEY REMAIN DIVINE REGARDLESS OF MEN'S OPINION,I AM VERY TIRED OF SWIMMING ABOUT HERE O MOUSE,TWO HOURS AFTERWARDS A TERRIBLE SHOCK AWOKE ME,I WANT TO BE DOING SOMETHING ON MY OWN ACCOUNT,SURELY YOU ARE NOT THINKING OF GOING OFF THERE,SAID MISTER IRWINE WITH HIS STATELY CORDIALITY,PERHAPS SHE TOO MIGHT BE THERE WAITING WEEPING,THE CRAMPNESS AND THE POVERTY ARE ALL INTENDED,I SAY I'VE BEEN WONDERING ABOUT THIS BUSINESS,DO YOU THINK SO SHE REPLIED WITH INDIFFERENCE,THE HOUSEKEEPER LED THE WAY AND BETH FOLLOWED,OUT IN THE WOODS STOOD A NICE LITTLE FIR TREE,TIS LATE AND I GO MYSELF WITHIN A SHORT SPACE,ITS CURTAINS WERE OF THICK AND FADED TAPESTRY,BRACTON'S A VERY GOOD FELLOW I CAN ASSURE YOU,I'VE BEEN READY TO GO ANYWHERE FOR SIX MONTHS,ALGEBRA MEDICINE BOTANY HAVE EACH THEIR SLANG,THANK YOU BUT I DON'T LIKE IT SO WELL AS THIS,BUT THE ESSENCE OF LUTHER'S LECTURES IS THERE,THEY SEEM TO BE WE ARE LOST BUT I AM NOT SURE,EACH OF US IS LASHED TO SOME PART OF THE RAFT,NOW YOU'LL STAY CRIED VAN SAY POLLY WON'T YOU,HE COULD EXAMINE THE PAPERS IN HIS OWN OFFICE,YES BUT THAT'S JUST THE BEAUTY OF HER PASSION,A COLD LUCID INDIFFERENCE REIGNED IN HIS SOUL,MORNIN GIRLS HOPE YE FEEL AS WELL AS YE LOOK,YES BUT PERHAPS I FRIGHTENED HER IN WHAT WAY,I AM GOING TO THE COURT BALL ANSWERED ANDERS,TIS NOW WINTER OUT OF DOORS THOUGHT THE TREE,IT WILL NOT BE SAFE FOR YOU TO STAY HERE NOW,GEORGE MONTFICHET WILL NEVER FORGET THIS DAY,WHAT I SAY IS ALTOGETHER ON YOUR OWN ACCOUNT,THEY ARE COUSINS YOU KNOW WE ARE ALL COUSINS,SHE FOUND THE DOOR BUT IT WAS LOCKED OUTSIDE,AND WOULD HE NOT BE A GOOD GIFT FOR OUR BABY,SO I SET GUARDS OVER EVERY ONE IN THAT HOUSE,COME COME I CALLED WHEN NO ONE OBEYED A FIRE,BUT I STAYED THAT SPRING AND BUILT ME A BOAT,YOU WILL TAKE ME ON BOARD COUNT WILL YOU NOT,AND BESIDES SUPPOSE THEE DOES LEARN MEDICINE,YOU'LL NEVER DIG IT OUT OF THE ASTOR LIBRARY,WE'VE TORTURED EACH OTHER ENOUGH FOR TONIGHT,BUT I DIDN'T KNOW YOU'VE ONLY TO TELL ME NOW,HAVE YOU BEEN IN PARIS MUCH THESE LATE YEARS,WHY ARE WE TO BE DENIED EACH OTHER'S SOCIETY,SOME POEMS OF SOLON WERE RECITED BY THE BOYS,WAS IT NOT ENOUGH TO SAY FROM GOD THE FATHER,AND SHE WAS VERY FOND OF YOU TOO AUNT RACHEL,YES MY DEAR WATSON I HAVE SOLVED THE MYSTERY,AND THEY ARE ALL IN FOR THIS EXAMINATION YES,TO THE BEST OF MY BELIEF THEY WERE ROLLED UP,HE HAD THE FAITH IN HIM THAT MOVES MOUNTAINS,WE HAVE A COMMANDER WHO'S GAME FOR ANYTHING,FAMILIARITY IS A FEELING CAPABLE OF DEGREES,YOU WILL TAKE THEM FROM MY PRIVATE TREASURE,I AM CONVINCED OF WHAT I SAY SAID THE COUNT,BUT IT WAS NOT THE FIR TREE THAT THEY MEANT,WHAT'S THE MEANING OF THIS THOUGHT THE TREE,HE WANTED TO BEGIN AT THE TOP OF THE LADDER,FACTS FORM ONE OF THESE AND IDEAS THE OTHER,THIS DECISION WAS COMMUNICATED TO THE GIRLS,THE WORLD BRANDS THIS A PERNICIOUS DOCTRINE,THE CLAUSE SEEMS SUPERFLUOUS ON FIRST SIGHT,AT NOON THE VIOLENCE OF THE STORM REDOUBLES,THERE'S A WHALE A WHALE CRIED THE PROFESSOR,WE NEVER HAD SO MANY OF THEM IN HERE BEFORE,IT IS SIXTEEN YEARS SINCE JOHN BERGSON DIED,COLD IS IT MY DARLING BLESS YOUR SWEET FACE,THE YEARS OF THE DAYS OF HER DYING WERE TEN,I AM AFRAID THERE ARE NO SIGNS HERE SAID HE,ABOVE WERE THREE STUDENTS ONE ON EACH STORY,COME THEREFORE AND LET US FLING MUD AT THEM,GRAM ROUGHLY ONE TWENTY EIGHTH OF AN OUNCE,IN ALL THE NOVEL HAD A DIFFICULT GESTATION,ENTER HAMLET WITH HIS FAVOURITE BOAR HOUND,WE MODERNS HOWEVER SEE THE ABSURDITY OF IT,YOUR MAJESTY'S PLAN THEN IN THIS AFFAIR IS,A FEELING OF FREEDOM AND I WAS AWAKE WHERE,SAVE ME MASTERS BUT YOU STARTLED ME RARELY,BEG ME A ROOM OF THE SHERIFF CHILD QUICKLY,I RESIDE IN THE MARAIS RUE DE DOUZE PORTES,NOT ALL THE GALATIANS HAD BECOME PERVERTED,I AM SO VERY TIRED OF BEING ALL ALONE HERE,I WONDER IF I'VE BEEN CHANGED IN THE NIGHT,AND YESTERDAY THINGS WENT ON JUST AS USUAL,OH NO JASPER I MUST GO BY MY VERY OWN SELF,BUT YOU KNOW MORE ABOUT THAT THAN I DO SIR,OH SIR DON'T MENTION IT SAID MISSUS POYSER,SHE'S GOING TO PUT THE IRONING THINGS AWAY,HE WAS PACING SWIFTLY UP AND DOWN HIS ROOM,THEN HE TOSSED IT DOWN AND SEIZED THE NEXT,ONLY THERE ARE TWO SORTS OF CLOUD AND FIRE,STUFF IT INTO YOU HIS BELLY COUNSELLED HIM,OF STARTING I DIDN'T KNOW THE WAY TO COME,BUT I MEAN TO HAVE MY INNINGS BEFORE LONG,TO THEIR SORROW THEY WERE SOON UNDECEIVED,IT WAS IN FACT THE BEST WEAPON OF ITS DAY,THEN LORD TUPPENY WELL WHAT ABOUT AUCTION,NOW THE OBJECT OF THIS SOLILOQUY IS PLAIN,ALMOST INSTANTLY HE WAS FORCED TO THE TOP,YES SIRE AND READY DRESSED FOR THE BALLET,WITH ONE JUMP ANDERS GOT OUT OF HIS CHAIR,NO SOUND BROKE THE STILLNESS OF THE NIGHT,NOW LET'S DUST THE FURNITURE AND PICTURES,YOU'RE FOOLISH WHY SHOULD YOU DO ALL THIS,ALL THE FURNITURE BELONGED TO OTHER TIMES,FOR ONCE IN A WAY I PROVED A TRUE PROPHET,MY MEN POUNDED THE TABLE WITH THEIR FISTS,SHE HAS A SON THEFT AND A DAUGHTER HUNGER,THERE IS NOTHING ELSE THAT LOOKS SO JOLLY,SHE DOESN'T TAKE UP WITH ANYBODY YOU KNOW,THE GREETING OF THE APOSTLE IS REFRESHING,THE RAFT BEARS ON STILL TO THE SOUTH EAST,MARIE'S FACE FELL UNDER HIS BROODING GAZE,SOME TIME YOU'LL TELL ME PLEASE WON'T YOU,BETTER GO HE HAD COUNSELLED SENTENTIOUSLY,IF MISTER SOAMES SAW THEM THE GAME WAS UP,NO ONE LESS THAN THAT WOULD HAVE A CHANCE,HOW CAME YOU TO LEAVE THE KEY IN THE DOOR,DID YOU LOOK AT THESE PAPERS ON THE TABLE,A BROKEN TIP OF LEAD WAS LYING THERE ALSO,AND YOU MUST BE OJO THE UNLUCKY SHE ADDED,MOTHER CRIED SHE I SEE YOU HERE LOOK LOOK,A VOICE FROM BEYOND THE WORLD WAS CALLING,HE CLASPED HIS HANDS ON THE DESK AND SAID,BUT THOU ART NOT SUCH A LOVER MY BELOVED,ALAS I HAVE GRIEVED SO I AM HARD TO LOVE,BUT WHAT IS THE DELICATE MISSION I ASKED,IT SEEMS THE KING WILL NOT CONSENT TO IT,THAT IS A VERY FINE CAP YOU HAVE HE SAID,NOW WHAT HAVE YOU TO SAY CYNTHIA SPRAGUE,AND HE DESERVES A TERM IN STATE'S PRISON,MISS LAKE DECLINED THE CARRIAGE TO NIGHT,HE ACTS AS THOUGH HE HAD NOT EXPECTED US,ANOTHER CIRCUMSTANCE WAS MOST REMARKABLE,SHE PRESSED HIS HAND GENTLY IN GRATITUDE,THERE ARE FEW CHANGES IN THE OLD QUARTER,WHO BEGAN THE QUARREL WAS IT THE MORMONS,BUT WE ARE CARELESS WE MAKE LIGHT OF SIN,THIS IS NO SINFUL PRIDE IT IS HOLY PRIDE,I SHALL NEVER GET TO TWENTY AT THAT RATE,THE ROARINGS BECOME LOST IN THE DISTANCE,AND ANYHOW THERE'S NOTHING TO UNDERSTAND,I DON'T WANT TO STAND AROUND AND LOOK ON,I SUPPOSE THAT'S THE WET SEASON TOO THEN,THAT'S WHAT YOU'D LIKE TO BE DOING IS IT,I NEVER KNEW YOUR EQUALS FOR GALLOWSNESS,ANYONE IN THE ROOM COULD GET OUT YES SIR,A ROUTE SLIGHTLY LESS DIRECT THAT'S ALL,SAID SHE POINTING TO THE PLAYTHINGS SEE,A TERRIBLE THOUGHT FLASHED INTO MY MIND,I REMEMBER SAYING HAVE WE BEEN TOGETHER,WHAT IN THE WORLD IS THAT QUERIED JOYCE,I WISH I KNEW MYSELF SHE CRIED FIERCELY,REJOICE IN THY GROWTH SAID THE SUNBEAMS,PEOPLE SUFFER IN THE LIGHT EXCESS BURNS,SINCE WHEN HAS MALADY BANISHED MEDICINE,NOW WHEN HAS HORROR EVER EXCLUDED STUDY,HE MOVED UNEASILY AND HIS CHAIR CREAKED,HOW MAY WE OBTAIN REMISSION OF OUR SINS,HOWEVER THE GRACE AND PEACE OF GOD WILL,THE WORD OF OUR GOD SHALL STAND FOREVER,OH BUT I'M GLAD TO GET THIS PLACE MOWED,SHE WAS SO STRANGE AND HUMAN A CREATURE,MIGHT LEARN SOMETHING USEFUL DOWN THERE,I THINK SO YOU HAVE FORMED A CONCLUSION,THE TOP FLOOR BELONGS TO MILES MC LAREN,TEA PLEASE MATTHEWS BUTLER IMPASSIVELY,MAY WE SEE GATES AT ONCE ASKED KENNETH,I AM BY NO MEANS OLD SAID THE FIR TREE,THE DEPARTURE WAS NOT AT ALL AGREEABLE,THIS IS OUR LAST FEAST WITH YOU I SAID,SAID MISSUS HORTON A FEW MINUTES AFTER,I GET NOTHING BUT MISERY OUT OF EITHER,AND ALL THE BRETHREN WHICH ARE WITH ME,ONE MIGHT BE WITH LESS REASON THAN NOW,OH I'VE NO DOUBT IT'S IN CAPITAL ORDER,THEN HE LOOKED DOWN THE LAGOON WAS DRY,HAVE I TOLD THE TRUTH MISTER GILCHRIST,YOU DON'T SEEM TO REALIZE THE POSITION,IF SPOKEN TO SHE WOULD NOT SPEAK AGAIN,HOSE MAN'S EXCUSE FOR WETTING THE WALK,HELLO STEPHANOS HERE COMES THE DEDALUS,IMAGE OF WEAKNESS ART THOU BUT A WORM,WHY FADE THESE CHILDREN OF THE SPRING,DID MASTER SUMMON ME HE SAID ENTERING,I WANT TO GET AWAY FROM IT ALL SWOONS,MY OVERWROUGHT NERVES YIELDED AT LAST,IN THOSE VERY TERMS I EVEN ADDED MORE,YOU WILL BE FRANK WITH ME I ALWAYS AM,HER EYES WANDERED TO THE MAID'S HANDS,BETH UNEASY AT HIS SILENCE NUDGED HIM,I HAVE MY OWN REASONS MISTER MARSHALL,I'VE SEEN LOTS OF THAT KIND IN MY DAY,YES IN REALITY THOSE WERE HAPPY TIMES,SISTER NELL DO YOU HEAR THESE MARVELS,YOUR MOTHER THE QUEEN WAS STANDING BY,WE ATE AT MANY MEN'S TABLES UNINVITED,THESE HE GAVE TO THREE OF MY BROTHERS,CAPTAIN SERVADAC HASTENED TOWARDS HIM,MOHAMMED ALSO SPEAKS HIGHLY OF CHRIST,THAT WILL BE A QUEER THING TO BE SURE,AND I DECLARE IT'S TOO BAD THAT IT IS,COMB THE WOOL FOR THE WHITTAWS INDEED,THE HISTORY OF THE HOUSE IS PLAIN NOW,AND WHAT THROUGH THE LEFT HAND WINDOW,I WAS ABSENT RATHER MORE THAN AN HOUR,WHEN HE FINISHED SHE SAID CHEERFULLY,WE'RE LEAVING ON THE ABRAHAM LINCOLN,THINKING OF ALL THIS I WENT TO SLEEP,THEN THE LEADER PARTED FROM THE LINE,SHE WAS HERE JUST NOW SAID THE COUNT,SURELY WE CAN SUBMIT WITH GOOD GRACE,HE HAD HIS HAND UPON LAKE'S SHOULDER,BURN FIRE BURN FLICKER FLICKER FLAME,SHE IS WILD TO KNOW HOW TO DO THINGS,THAT IS WHY WE CRY EDUCATION SCIENCE,YES HILDA I KNOW THAT HE SAID SIMPLY,I THINK WE DID SHE ANSWERED DEMURELY,I WILL IF TIMAEUS APPROVES I APPROVE,PAUL AN APOSTLE NOT OF MEN ET CETERA,AND HOW ODD THE DIRECTIONS WILL LOOK,AND YOU NEVER USED TO BE CROSS TO ME,PLEASE WAIT FOR ME MARIE EMIL COAXED,THE INDIAN I ALSO THOUGHT NOTHING OF,SHE HAS BEEN DEAD THESE TWENTY YEARS,HEREDITY THE CAUSE OF ALL OUR FAULTS,IT MUST REMEMBER BE ONE OR THE OTHER,WE DON'T KNOW WHERE IT WILL TAKE US,METER ROUGHLY ONE YARD THREE INCHES,THEIR MASTERS SAID MISSUS NEVERBEND,BUT ANDERS CARED NOTHING ABOUT THAT,I DO NOT KNOW I AM DAZED BEWILDERED,DORCAS IN HER STRANGE WAY WAS MOVED,YOU HAVE BEEN SO ILL MY POOR RACHEL,HE'S NOT A MAN FOR COUNTRY QUARTERS,AT DINNER LAKE WAS EASY AND AMUSING,THEN HE TURNED TO ME AGAIN FROWNING,NOTHING MORE THAN YOU KNOW YOURSELF,WHERE THEE AND THY FAMILY ARE KNOWN,ONE THINKS ONE HEARS HYDRAS TALKING,THE CALL IS NOT TO BE TAKEN LIGHTLY,TRULY THIS SEA IS OF INFINITE WIDTH,THE HORIZON SEEMS EXTREMELY DISTANT\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_patch/AdversarialPatch.ipynb",
    "content": "{\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0,\n  \"metadata\": {\n    \"colab\": {\n      \"name\": \"AdversarialPatch.ipynb\",\n      \"version\": \"0.3.2\",\n      \"views\": {},\n      \"default_view\": {},\n      \"provenance\": [],\n      \"collapsed_sections\": [\n        \"zIVtueEZGlOe\",\n        \"pa3x4VU2HDPD\",\n        \"kFWZi57amziK\",\n        \"fqxh12d4yeK7\"\n      ]\n    },\n    \"kernelspec\": {\n      \"name\": \"python2\",\n      \"display_name\": \"Python 2\"\n    },\n    \"accelerator\": \"GPU\"\n  },\n  \"cells\": [\n    {\n      \"metadata\": {\n        \"id\": \"pv2EIpnIHSUL\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"# Adversarial Patch\\n\",\n        \"\\n\",\n        \"Code from [Adversarial Patch (Tom B. Brown, Dandelion Mané, Aurko Roy, Martín Abadi, Justin Gilmer)](https://arxiv.org/abs/1712.09665)\\n\",\n        \"\\n\",\n        \"> We present a method to create universal, robust, targeted adversarial image patches in the real world. The patches are universal because they can be used to attack any scene, robust because they work under a wide variety of transformations, and targeted because they can cause a classifier to output any target class. These adversarial patches can be printed, added to any scene, photographed, and presented to image classifiers; even when the patches are small, they cause the classifiers to ignore the other items in the scene and report a chosen target class.\\n\",\n        \"\\n\",\n        \"You can run this on a free Google Cloud GPU to replicate the results. Just set the runtime in the menu bar above:\\n\",\n        \"\\n\",\n        \"**`Runtime > Change runtime type > Python 2 w/ GPU`**\\n\",\n        \"\\n\",\n        \"![image](https://user-images.githubusercontent.com/306655/35713295-6f5f8e90-077b-11e8-9c78-ede4ed549bd1.png)\\n\",\n        \"\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"m87hXY8wHQ_y\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## Dependencies and Imports\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"gJ4qeEdVtkCj\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 442\n        },\n        \"outputId\": \"c06d9bda-c12f-4dac-8324-493478357c48\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517597946679,\n          \"user_tz\": 480,\n          \"elapsed\": 5749,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"# Install requirements\\n\",\n        \"! pip install keras\\n\",\n        \"! pip install git+https://github.com/nottombrown/imagenet_stubs --upgrade\\n\",\n        \"  \\n\",\n        \"# Create a directory to store our results\\n\",\n        \"! mkdir /content/adversarial_patch\\n\",\n        \"\\n\",\n        \"# Download a baseline true toaster image\\n\",\n        \"! wget -O /content/adversarial_patch/toaster.png https://user-images.githubusercontent.com/306655/35698271-658aba28-0741-11e8-898b-5a3134634e9e.png\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Requirement already satisfied: keras in /usr/local/lib/python2.7/dist-packages\\n\",\n            \"Requirement already satisfied: pyyaml in /usr/local/lib/python2.7/dist-packages (from keras)\\n\",\n            \"Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python2.7/dist-packages (from keras)\\n\",\n            \"Requirement already satisfied: numpy>=1.9.1 in /usr/local/lib/python2.7/dist-packages (from keras)\\n\",\n            \"Requirement already satisfied: scipy>=0.14 in /usr/local/lib/python2.7/dist-packages (from keras)\\n\",\n            \"Collecting git+https://github.com/nottombrown/imagenet_stubs\\n\",\n            \"  Cloning https://github.com/nottombrown/imagenet_stubs to /tmp/pip-bhlPca-build\\n\",\n            \"Installing collected packages: imagenet-stubs\\n\",\n            \"  Found existing installation: imagenet-stubs 0.0.7\\n\",\n            \"    Uninstalling imagenet-stubs-0.0.7:\\n\",\n            \"      Successfully uninstalled imagenet-stubs-0.0.7\\n\",\n            \"  Running setup.py install for imagenet-stubs ... \\u001b[?25l-\\b \\bdone\\n\",\n            \"\\u001b[?25hSuccessfully installed imagenet-stubs-0.0.7\\n\",\n            \"mkdir: cannot create directory ‘/content/adversarial_patch’: File exists\\n\",\n            \"--2018-02-02 18:59:06--  https://user-images.githubusercontent.com/306655/35698271-658aba28-0741-11e8-898b-5a3134634e9e.png\\n\",\n            \"Resolving user-images.githubusercontent.com (user-images.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...\\n\",\n            \"Connecting to user-images.githubusercontent.com (user-images.githubusercontent.com)|151.101.0.133|:443... connected.\\n\",\n            \"HTTP request sent, awaiting response... 200 OK\\n\",\n            \"Length: 37989 (37K) [image/png]\\n\",\n            \"Saving to: ‘/content/adversarial_patch/toaster.png’\\n\",\n            \"\\n\",\n            \"/content/adversaria 100%[===================>]  37.10K  --.-KB/s    in 0.02s   \\n\",\n            \"\\n\",\n            \"2018-02-02 18:59:06 (2.14 MB/s) - ‘/content/adversarial_patch/toaster.png’ saved [37989/37989]\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"lgCXsKXjtGVK\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import matplotlib.pyplot as plt\\n\",\n        \"import pdb\\n\",\n        \"import tensorflow as tf\\n\",\n        \"\\n\",\n        \"import math\\n\",\n        \"from matplotlib import pylab as P\\n\",\n        \"from mpl_toolkits.axes_grid1 import make_axes_locatable\\n\",\n        \"from collections import defaultdict\\n\",\n        \"\\n\",\n        \"import os\\n\",\n        \"import os.path as osp\\n\",\n        \"import numpy as np\\n\",\n        \"import pickle\\n\",\n        \"import StringIO\\n\",\n        \"import PIL.Image\\n\",\n        \"import scipy\\n\",\n        \"import time\\n\",\n        \"import glob\\n\",\n        \"import random\\n\",\n        \"\\n\",\n        \"import keras\\n\",\n        \"from keras import applications\\n\",\n        \"from keras import backend as K\\n\",\n        \"from keras.preprocessing import image\\n\",\n        \"import numpy as np\\n\",\n        \"\\n\",\n        \"import imagenet_stubs\\n\",\n        \"from imagenet_stubs.imagenet_2012_labels import label_to_name, name_to_label\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"F7Bw7EX34Wy6\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## Hyperparameters\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"zTtUa8qb4VOV\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"TARGET_LABEL = name_to_label('toaster') # Try \\\"banana\\\", \\\"Pembroke, Pembroke Welsh corgi\\\"\\n\",\n        \"PATCH_SHAPE = (299, 299, 3)\\n\",\n        \"BATCH_SIZE = 16\\n\",\n        \"\\n\",\n        \"# Ensemble of models\\n\",\n        \"NAME_TO_MODEL = {\\n\",\n        \"    'xception': applications.xception.Xception,\\n\",\n        \"    'vgg16': applications.vgg16.VGG16,\\n\",\n        \"    'vgg19': applications.vgg19.VGG19,\\n\",\n        \"    'resnet50': applications.resnet50.ResNet50,\\n\",\n        \"    'inceptionv3': applications.inception_v3.InceptionV3,\\n\",\n        \"}\\n\",\n        \"\\n\",\n        \"MODEL_NAMES = ['resnet50', 'xception', 'inceptionv3', 'vgg16', 'vgg19']\\n\",\n        \"\\n\",\n        \"# Data augmentation\\n\",\n        \"# Empirically found that training with a very wide scale range works well\\n\",\n        \"# as a default\\n\",\n        \"SCALE_MIN = 0.3\\n\",\n        \"SCALE_MAX = 1.5\\n\",\n        \"ROTATE_MAX = np.pi/8 # 22.5 degrees in either direction\\n\",\n        \"\\n\",\n        \"MAX_ROTATION = 22.5\\n\",\n        \"\\n\",\n        \"# Local data dir to write files to\\n\",\n        \"DATA_DIR = '/content/adversarial_patch'\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"U_zb6nIdHI4E\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## Image loading\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"499h7GM2tIyA\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 717\n        },\n        \"outputId\": \"5431e4da-cb03-4897-f21d-0a83cf6c7910\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517598005544,\n          \"user_tz\": 480,\n          \"elapsed\": 2431,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"def _convert(im):\\n\",\n        \"  return ((im + 1) * 127.5).astype(np.uint8)\\n\",\n        \"\\n\",\n        \"def show(im):\\n\",\n        \"  plt.axis('off')\\n\",\n        \"  plt.imshow(_convert(im), interpolation=\\\"nearest\\\")\\n\",\n        \"  plt.show()\\n\",\n        \"  \\n\",\n        \"def load_image(image_path):\\n\",\n        \"  im = PIL.Image.open(image_path)\\n\",\n        \"  im = im.resize((299, 299), PIL.Image.ANTIALIAS)\\n\",\n        \"  if image_path.endswith('.png'):\\n\",\n        \"    ch = 4\\n\",\n        \"  else:\\n\",\n        \"    ch = 3\\n\",\n        \"  im = np.array(im.getdata()).reshape(im.size[0], im.size[1], ch)[:,:,:3]\\n\",\n        \"  return im / 127.5 - 1\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"class StubImageLoader():\\n\",\n        \"  \\\"\\\"\\\"An image loader that uses just a few ImageNet-like images. \\n\",\n        \"  In the actual paper, we used real ImageNet images, but we can't include them \\n\",\n        \"  here because of licensing issues.\\n\",\n        \"  \\\"\\\"\\\"\\n\",\n        \"  def __init__(self):\\n\",\n        \"    self.images = []\\n\",\n        \"    self.toaster_image = None\\n\",\n        \"   \\n\",\n        \"    for image_path in imagenet_stubs.get_image_paths():\\n\",\n        \"      im = load_image(image_path)\\n\",\n        \"\\n\",\n        \"      if image_path.endswith('toaster.jpg'):\\n\",\n        \"        self.toaster_image = im\\n\",\n        \"      else:\\n\",\n        \"        self.images.append(im)\\n\",\n        \"\\n\",\n        \"  def get_images(self):\\n\",\n        \"    return random.sample(self.images, BATCH_SIZE)\\n\",\n        \"\\n\",\n        \"image_loader = StubImageLoader()\\n\",\n        \"\\n\",\n        \"for example_image in image_loader.get_images()[:2]:\\n\",\n        \"  print(\\\"Example true image:\\\")\\n\",\n        \"  show(example_image)\\n\",\n        \"  \"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Example true image:\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAVEAAAFNCAYAAAC5YlyiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvdmvZdl93/f5rbX2PsOdh7o1dvXE\\n6m62OLTESaQs0pIpCrajwFYiB4kDJHAQ5E/IQx78lKcgDwmCPAQI4MByjFiKHdqRKMtix5TIpiiR\\n7ObQQ/VQ1TXeW3Xne8Z99hrysNYezq1i2wgfygHuAi/r9rn77GEN3/X9fX/DlhBC4KydtbN21s7a\\n/6emnvQNnLWzdtbO2v+f2xmInrWzdtbO2s/RzkD0rJ21s3bWfo52BqJn7aydtbP2c7QzED1rZ+2s\\nnbWfo52B6Fk7a2ftrP0c7QxEz9pZO2tn7edoZyB61s7aWTtrP0c7A9GzdtbO2ln7OZp5khf/n3/3\\nd3n44JirT11DpIPWGqU9IQRC8CjtQRwA4jWEDBGNUiDKYxSIyKM/wQOgVNwj2n+LCVqKEAKlBEII\\neO/n/q2a1L+q+vtAur9AcEX8GxmEdH4N4EEsBIWIhqBB6XQuTwjx75oeSIFjglI53mYY3cMHi9Eg\\nEgjBoZQieAMhR0SYFAe4cELPr5J1hU7XoHSOd4rB+IjB8IDLl58ieIPROc5N6HZzvA1kpotRgJQQ\\nDCEEBI9IQNIDKy1ordHK1M9c94kISsX+6GRqrm+rVvVP1d82eEKQuX723iM+HuvS8fX3hfr7qfeb\\nsazPzSP3dfo+0GrufptreEQE50J9r/VIt/L3ZrPZ3H2EAM655tlEsNbGZyNgS4+1Fi/xflzw9bNW\\nfCV4CCH1C6G+93a/1fNQCaDw3lM6h3MB51z9d7Gh/t58v8W5Zn1cAzr1n9KgddUf8W/tvlFznRrX\\nkBGFqBDPowWF1H0asEiI58myDGMMSimMAq313LgA6VpNn1ub5oNjbgx86zbqZ5tLrPSp/9LYt9Zp\\ndc3qPqs5LT6gdIUJcUyK0mG9w1qYlZaZBefjOMc+8fUV/4OvfZ6f1Z4oiN66fZML558nhAxjOlg7\\nRQWH8yVKDCFkgEpAWiLBIaIJIUO84MTVg6SRGqeqQRPrH1lccaLF7rc+dlINivWCOk3Q3SMLNISA\\nDwI0A0UIiIdqAtb/hvRTfxZAwPkifdYjKMF7h3MTtBis97gwpiimdPJF8szg/RSlHSYL3Lv9kI3+\\nhK7NKF2X0XDG5rlLLPQWKcsZzkYQdr5Mm44jz3OUCN45jMkJ9U1JfOQEDtXCqv5tP3Pdt3OgNN9O\\n92dAajCpQcJDSJ+1QTS0FlAFnIFmETV/PoWiSP1ZtQildb/zTRFPF+bmhwq05gBkWdb6vsxvuERA\\n1VoTgiAEgpc5gA+h6bNQT5FQ/65P3ZtrPXcIzXzVKkPQOBylqPoeXXCE4BBOz834e89k9ThWAKIU\\naBWPN6YZ37p/q/H18b61Sd8n1PNBKpD0DVBqrdFaYxRz8+axmxvzoNi+h3js/P2EU+NYgZyQALT+\\nU3NNJdUGH1ABJAv181ckygaP8hkQKK2jtUjjJv+4qfOY9kRBdG//kHObEbSmkwKTQWkLtNaIGOxM\\ng6jI6sSCBAQTO0UyUIlxiuCUAkfdaTA/EPNM9Gc3odmBQntFN2u0biF9GIJvVn99/tA6yoP3iVk0\\nf9NasKUAETRFAO8IeJR2OF9weLjP4gKsrPYIoYBQUhYjDnb3yDaPGRcGPcg4OilYWVkh7/TJdAdQ\\ncYd3MzCesnSIibfR7/QQAe9tvF0RRFT6EbR6FEDrZw4BURDw8/3T+nt7MwqBtNgTA3UNEEmLhdYg\\nGkcUAOfif3nxKJ/YYxpPDYTWeEr9I03Xq5BYII99lvbnFYBWn4UQWn0gzXOJxNPPzS0FhLhZGY1K\\nz9rMO00IaeNogaiqp4xEsBQhhLjAvUQGKiH2hVIa0Ij4+l7KPFoqzX20tpjQbBBaa7REC6NigyIB\\nrVWrtxuGWZ3HqGT1VcApqmZykWk2TE1E0KdY/+MBtBnvGjxb56g3wI9Yq+0xm1+Tcc6pRGy0Vqgg\\nKBNBP+3JNXO1wSNoUJZpMcM5iw+CUvoRJvpR7YmC6NHhIJqn0wF5d5FxMabby5hMLVoRQSUElDSA\\nFXvcxUms48SLfVo2g+VDBNxTu+HppvlZf5/fnSGaYe1D4oIW2mAJRCba2BeIBHwyH6uPazPXzXAY\\nCBrvNQTQymH9mH6uCR5UUGSZJjBDZwbvHLnpYDTcu/ceWmvW1jfZ2z3EXnuWOx/cpNdfpdfrQVCg\\nhBCiaT4ej+l2YDKLG02e54m9N7t2XDAKSeyx3UKI/YqPx3t0MgubHSayr+onsbYEIN6HOUZanbP6\\n3afxbTaxebZSSTUigleqJZFUzAmUajEqLwQaoKk/pwLikK4XsJ7HLPz4473HOVdbLvPPoAjSsNC4\\ncXi8r0A+WhgVePrIWeMccKl/lUYChGgOxHN4IOg4q0Qn4yWgRMW1IBBUgASqIolpIQRcTSSiea3R\\nRmEkdlk1znX/+lAfG8Emoo3Rqv5dKch1lHdC4syi8zQmzRhGFp1AMsxzj/aeG49vgX4LeD+Khaaj\\n47UeA7SSLAGRKGOgPEpptBa0KJDmXnNv8Ci0Dxhj0NqDi2ZjxXbT5OKj2hMF0eFkSKefQwiU5QSl\\nFNNJidYdnAOlolYXpR9DnMMqLZioD7UBUCTMGeLGNDttbWK1xsO3zIfKtINHTZv0zRbLTIy1ngRN\\nJ/sQalyVaJfU147nU7jqVN4RxOOCQ0KfEAQVHPt7t9n1U85vXWE2KynLko73FFPLYqfHeDrm4f17\\nBLVHZjocHu7x1jtv8XD3Dts7Jzx99SV++2/9x6AMZenQuksxdnS6C1hXIMoj2mDdDBXaumbsg4pF\\nhRBQ7a1eGtBRSuFp932LrbX1Le8jeHjf+qlA1qX+liSzNOa+S9eI9zA/FpXpLf6UpYHgfdJPg0en\\n2eBtqO+/DZKJU6ZrzoNoxT4hyj7WzoO/9z7NpchmQvDY1nNaH5/NORfZd83A0nkT42zrhT5IZKAu\\nMl4RnTbqqikQqLYOh4/mvFRzMOqoCpWstWhV5FrQWqGN1Iy0umYIAfw8CMb+9RjVfE8pha6lhDTm\\nLdY5pyvX0OmpYDRuwKcBshlPR6gX6WkgfbSl41pkRzEPqJGlxnmsCGhRaKNa5w2YrI/1oLVDSUae\\nz5gUjmI2oyzLx1z38e2Jgqj1JwyGhyz2LuFcZDU+zAgCIh2qjVpQaceVZBLFaRQk6hhx55Gkw1fm\\nSDxeRGoT7BFdRogDm/522hCf1zHTR9XEDxCSgN8GmkdNgAg2ShQh6MTgGjUSdDQhJG4Y3juKouBg\\n7z6D4yNu3LzHX/nKb6JVDtrj/Izr7/yY7/35t9g457ClZ39/j6W1Rfb2bnNwcMztD2/xmc/8Is88\\nfY27d27z8sc/Hc2/skTpyjkStUPVNvukzaxT30vjqIOortTgFh41u+YXlOBCeARAvfd40uJNG1jD\\nCH0NaLX21xqM6pqiHCjT3KMIOrEx7328RwlI8HP3FPXBqKHb4NL9N89QMaTKmROC1M4cTwN+7ecF\\nV4Nf3AA8zsXruvr6ETRiVwpIBFYlgijBKx1nUtqDfYDg46Z7mm15KuZOZKniUUETtfmka6dNojLH\\ntaIGUF2tl2RBePHJsEsbUPpvJYHMREuoGnPnIjAqLWkWp/XX7hMiyQktiSScIhcN04+DKqEBxOqY\\nx7d4/Ro448Fz34nzIDFrSaa8ltpJVrWZb+aHcw5rLbNZibX20ct+RHuiIDqeHrC9fY8XnnuWYurJ\\nO8JoMsD6Kd5pVlcuIOSIqrz0Pt2yiv+qynFToa0mSJqYYuIkCx79uIsTza16qB5ZGI8OaLWcScCj\\nKyY1x38VFeh6IYn+GsSAaLxEBhZN3AyteygBh0X8FFsMWVla5fDgLg8f3uDh3n12d3dYX7tKWY7o\\nL3m2t68zneyzsz1gaXmdzOTgXGSYzBhPBvzZn/4R17feQJs+WaZ59pkXopbpBecVQQxBtzzNIWBF\\nJzO3xQRak64ypVXy1qITo/NNf1U9UbvWTgGoa7FNESH4aAp7mQfOamL/rEVV3UebCVsRNL7lha2U\\nlUYX9d5jvEqmdiMbxPuJG7D1vvaERzmiDbIWL8nhFVyt20qyMOpnrZlnNbXajicNCEEUTlRS8RRe\\nBE/sCy8SgTTu8HPPXQGWoBKB0Gmr9sTIgzjvtGpM+No7L42XXNL81QnPlIrAqjDEqBBpefMT+KbN\\nQGJMRwPwjxmfSg5qr6cKQONm1xyvoyeg/u/Tpn08Z9zgGgYfaG/6laNOKY0WRWZ0vWkaqbTgZi0H\\nHzeFoigZjcaMpwWli3JKtRn/27QnCqKuCKwurVKWljzrc3KyC8qyu/8Ao3OWllbiUAWJAJHMY04Z\\nOSFpp957FAovjagPAVsN3ukbOA2SIXDaV1JpQG3zozpWUek6kaHEL8RJ7CXqV3FyZRHgtamZlRcw\\nsgxBcKGM4oAERsMTxI+5+cE7eEYsLfa4+tR5ZrMhna7m3fd/hDETLl7uItKh21nhYXnI4GTE6ios\\nLS3T665wcHCX6++9gXeGS5cusfNggX5/kYWFHkYbLBrNrA6/CaFh9C6xDk2Izro2kAooQs1O23JK\\nwxobhtqA57weGlnavARQmfXVudrm85w5HyoQ9XMgKiI4EYxXkam2jo0/6fiWXFF52asFo3VWm+Pl\\nLDFQaZwt9T0FQYzgbNUP4IPUDBQqb3tr3ohq2FuoHFICNUhXJn1kx6hQS0aNpBEIQUUWnzzopvKY\\nhMZpFfsvYJVCXHTOiYuslxTSpltjJ9I4oGLfNNoo3iFKoVLYkrU2bjpGE1p6ajy0Aco2CFXm/Px4\\nMddUaOYitf/jMbqktPTT1nyrn0Oi09YYUwNoCK41Dj7p0UJZlozHY8bjMdYHtMkJQSitPbUR/+z2\\nREF0ZfE8ZRkoJieMhnusri2wdzQC71lY6TErR1g7YHFhBR9M0p4Cxjh8KMDn1HFglT6Ci1qdD0kv\\nejSOFOYX5dxu15qE0SnjHj1GKk+/TeZdwzjj8QEEvHeYrINP7E8pnaSFgFcBazO0sYiyGAXj4YT+\\nQsa7b73N2++8zuLyIrOZ4i/+4jVe+fQX6ays86PX3+D69e+RZwcMB5p+JxBKod9f5f33b7K5sYEN\\noLSDMKXXX8HOphRFgYhmdXUV5wPOWlxwGGMaYPOeTBtsik31yRQM1qNCDPkppgXGRAeDVbM6tKXq\\nozbbqGJDK5ByLU2wMg2td3N9610DmqfN2Lr/030p3x5XapCsxr1eBMq3Yk2ruNVG/41gGjfC0kYt\\nzCHYAM4HrCtP3UvSAqt1HapFGrW9GkSTrCA1c40ztXqIEALiFS6GGqQ5rBLDDKB0Y0WlqJOIRXFu\\natewRJEoKoWg8Lak9DGOmhCir0QsoNDK1PGhCj+3LpRq1lHVfyaL1onzHudsetxG52x74yNQhnpT\\nMMbMxdU2pGKenc5tlNJ4GuY3UPXIZ80a9lUXoZQkJ5Em043DFCodPEoVAVCiKYqC6XRa368nbnTV\\nnI4j9rOkhdieKIgu99dQLvDeez+iKAq2inUm0wELS0t0O4bj40M2Ny8kk8qn4G+wtkSbeSoPle7S\\neAYf9/dmgc8b4dBWPtPxj4szDRWXCARKlORorXFWmM0Kuj2DF1eDcGktonMCCheid9ARbSydAViM\\n8agww7sRo8E2B0f3GIyO2No6z3Aw4ruvvcaHH9zna1/7GnsPdvClpcQDXcZTiy1gNjyh28uYldMU\\nCK3Y3d3j/IUeNz74kPX1Z1laXCYEhzYxbExE1xqlVgYvULrIFrX2aJ9MIaOx1lIWM0QUhXVJp7aI\\nuKQ9PRoBcRo4K8BySSvzLtSsBpgLFq9ZENUiaoBPbPpMzbPQiqnV//qATuEuSinklHddKYNtMWFJ\\nbCeksDVro7lu20kYoZFrwqnrR4lA1Tjpgk2OxsSafOt4BJOSGULQEWDQtWGjWl781AvxfxIZKyGg\\njW6RgqqfPUEUQSL7hwQuXkAnz34V1KR1zXArsKliTisQVaKR1kJpWw6nW9wU4urwjwGeOM5zNuSp\\nMX48WWm+245B9eCr9dz0Q22+K5k7T73ZtOQAa8GYHK2niCQrScLc/cSe/3cYRL//l6/hbMni4hIr\\nawt8ePMH3N2+zaXLz/Lcc69w/tzzGLVAWTq6/Q5l6fDOo0yOdQFzanDb7CUpG1QDVX3uaSYK7hQ7\\nPTWA0bx/1NlSn09pZs6ifGRdOtcxs8SXGKNTiI0nyxQ+6bVBoi4ZROHVJO57zjEcHfCdP/sDtEw4\\nPNhBBE4GRxweHdPrCF/+0sew0zHWnnDu3Dnu75wwHTnG40OU6pAZGA6mFLOSp65c4dbtm5SlYzYJ\\nGJOTKc1geEJ/ISPa6B7oELW6uOCcDa14Ooks0Xus1zXwGJ1Rlo7I1RqGVrObVogLQJCGQVRA6mx0\\nvlQe79OxnLXmymmAbJnGc2MVR/w0iFffjyx0XmKIYzurZYR4r/MM2PrIwKpogtNJGJUzRCAlXsTj\\nKlnII0iomBqIqthQ0p6reMT0OVIFrycmmyjT3HNVv4sgXtHAfmRQIZ1PScD7GFutiBpraGXeqeR5\\nDyEFD6bPqgykKtQpOppCSiqY16kfWQ+PaW3Sctq51Dxr9TMfpP+oLupT2FTqA1XpuE3mlW5tAjW7\\nngNRhfc2bXrRusqyjGlhwac+rKNOHq/Hn25PFERf+NgVLp5fYGf3PkHl3Lv/U6bFlGK6zt1bt1Fh\\nnYsXVsizvA5nUiaDYJLJMGt2MPEpmCLtSi1WwSOdIK1FkVT1dDRQp+0hTQeeniMicVHgPTozTWC4\\n9+SdHkUxIetkBCfMbBGdqMpEbSkzaWKU7Nx7QD+DzbUOZXHC6z/9C0RgZWmV8XSKyQyzyZinLl/A\\nuQE3PnyLlaUOqyvnuXm4g8pi9lYxtczKEoZTgttG6z55ljErZmjj+f4Pv8Ozz7/A8lqPnAytNdY6\\nSA4Cgo+MS8AHG7NxEpg5V+I9aGWYzAqcreJJ0+6dzMKYJNHSOSu/n1QaHbV5H0ITmxn7s9HIVAhI\\n0i01caFIPSaNDtoOxYpSCvXiiGNWsUAQF8csfiQ12Hlpa3fRUVMZlLVTqVK/2+xEJDkOdWKkKm6O\\nBHyKRZTENOcXtUJVJnW6UdW6Z4heck9AVRt/aG0QregAR4hMN01Qn5IbAgolnoCO5rwKZBKZaLPZ\\ntcaJStMMj9xrNYCBmFAS41cTMJ6y3eKGkH4PDXjO/Z02gM73Z9XnMVg+AVqI/o8I+M35lFK1ud4G\\n0ZqlQpMo0CJK1aboU/qt1pos66DMjLJs5fC1CdnP2CCq9kRB1GiPcwOOj29xeDShKA4pZwY3g40r\\nW3Rzw3hyzMrqKkEUgsEF3YjjVagTPi4iSOgWUEk/rQZuvjVOiHaGRlvTq1Z022Q77XUqA6gs6mg+\\nWLy3dLIu0+mMfn+J0nqyzMSYd+3xlDinUDrDe5g5D8azs32XyZFjNplhC8ukGNFd6FNMS7qdZTrL\\nGf/yG/8Hna6hYzLQhvF0CsB0OmU6nZGbPv3uGsFZ9veGZLlmPJ1wpEb8+V98i8WFFX785hv80i/+\\nMr/+174GBJRWteNHq6xmGj44ROIC9b6kKAqOjwasra3HdNEENM66us8gQDm/qNre2UedSAFawBcd\\nQNTHV+zSK4UiSQYV82vwpDaVm0SGdu51pdXGc82z2RSI75OjhvS9U4s+Onmiid6eR5I255BMSRGN\\nSmxNkhwwZ+W0gCnOL1Vfqn3eZuESExRafVIx3Ibla0JQdchToGLZkp5eo7CoIPgWC43x1AHnk6RV\\nWQDMA04VLd92ptX3ecpAm2OQp6z2uY2yBd7Vxhgzo9Tc3IinE5xLz5L6tgpfy3JDrtUjfRzPo+au\\n2e6/uU3cBmbJKoobaFPjwEcYaZ71I9oTBdE7N68znTzE+gGTcshib4VQZuRqmeeffoG8v8DuwS6H\\nx1O8z1leOkfe7YKUiHIEb5IDqRVLF7e6GE0Wt6J6POslXoGkFnxLT4F2AH6bOaja7JobaJ9z88a7\\nbJ1fo5gOCCGQqQkb6xcpyxhmZa1nWo4J4un0F8iyBZx1FFPL/b1trl5eZv/eEf/sn/7fKDvFFo5M\\nx8SC0kKvK2SZZ2fnBtNpSSfrMxqO2D3YAd+NoVJ4lBK6vQWODo6ZTi0KQ7+/zMbGCseDPRDHnbu7\\nfOaXvshs5iNLnc0wJk6BSpsMIVDMJnhvWVjsEnzgeHjMw/090JrlpVXKMi0omXe6Pd7Mq4CrYk3J\\nKy0N+6zYkE8aV5XOF6g8+RHsXQpRqUw2fGU1RLNQKqpZSQiq+r9q0Z8yx0natnpUiwOiN1p8zAxK\\n91LpcACis2SKayJnTvGZ8vi+qOYlIaYCV+HcczGW7d+r7JqgWg4rVc/jAITgcYQ415FWOFYkDxqJ\\noVeP8w+E+L0mFbQhFIpG38RXQNN6lMD8plKBlacZ0xYpqfXsFMIVf4+WjjEGrUyziad5WIUZteUh\\nLZAZTSfLU1aj4NPfH0eI5sdB1Qw0hOhbmU5nFNOq0Ewcwyb1NMmB/y6b87acMJ0YTKbI9QLlVJgM\\nLd3OEouLi9zdvs9P3nyDjQvnePrqCxSzE1QGvX6OqEBwnXp3qTpMtQY7qHlTvi2iowQnJrIJWjtp\\ndbAIqBhPiM7iZGuZqt57xApr5y7gmKK7huloTL+/ACjyvEcIgZPBPgfHuxSzIVsXLnJua4mZiyZd\\nty/cuv0e9++9x3RygA6OjjGQ9RnNCkRpJtMhw+MJzz31DOJLJrMZOlvA02O5f45uT9Hr5WzffcD2\\n9j1A4axnNJ6gy4yyLHnq2XMcHDzkwoXzvPjSNXq9Hgf7x0yKMSsrK5FdphjGgGM6HTMuJphOBJHh\\ncMji4iJ5nmGtjdlkomO24Bz4nCpY4hNIhSr0RqpRiDG6Ova7Do9xKFRyi7QBJsV2qpQTI5UHtbI2\\nkplfa5WqAdSWnlktYl0teOazyiqTMIJoTQXTPw3DCdrEK4Y0T9I9EhKTVNVnrnWOasMPBN38vR1G\\n0/49pommKlihuv9oFVVVooISdErx9ckMVgRscKmvYw9A7A6FTwCqaw1cQmUBRHXV+wYAfbJ/G+02\\nOnolyQfSSvuF8AjwnXYSGon3qqTRXyvduLIKqnlkTCr4UN+/rr3vgiXaRIFKhFFi6nC6eSDXhNAQ\\nhdi3iqIoYrWuVlRCtQnEZBT+je2JgqgPE3rdcyidsX8wQHTGK698kmeffYYQAtevX+fw8JDF1QVM\\n5uj0PEvLedTpvELI08N6fLCpc5rQhHZpr7YeU4vdrcENSrcWUFosibE6aRxS1WdBBLxmY3OL0egB\\nk8mYpeUF9h7uEdY6bK4uYm1Jnuesry6zezimLAuCK/FeWOwvMQyKo/0hg+EJg8FDOjrgvGFyEpgG\\nS9Z1TIsxlMKbP36PVz75CmE44OBkQHB9JgVYN8WHkrXNNY4OBxwdHaNVoNdbApUzHQ3wM5iVM/b3\\n9/n617/O3/27/yVFUdST1zlHSOFCzjscgSzLGI5OODk54Sc/+Qkff+kXUEpRliUiWdWrcxpSxWqq\\n/qvS7NphTbX6KLGAhRKF0qpV0aiRAGpzipZ3PJYeieeoK0q04jhJm10LPGudtBbsksGSpkqVtVU/\\nh0QrYs6xIfP+5poBpasEH6g897Wc4OveaeZZa5MvK0Amms2qdXiVBRcZegqdqvq7kiNSXQQSKQgo\\nfCr2Ei2wZJomuUtq8zcx91TVKJrgVZhQij6pALU1npX00kgLj6ZbtkkGQDsXvw2qomMwfNWXjcQT\\n6u+EEMiNIVY3i89ljKlD7CoHcdsx2Q6on69x0PgsqmfTuolOQbJ6w6zO2SYEH9WeKIhefvoCgQmj\\n2YCFhWV6vcusrz/Nux98yO7hlFFRorurrG89w+rmMyjdQ2ULsWReljQSKwTJMLqLdQXeW/K8i7UK\\nZTTOz3A4vDJAh+ANQTxKhyTfxwIgEVSrzo7e9hiQbDE6EIKPjgAfMJngyxLXfcjRoSXMAmtLfX70\\nwz+h111m4eo1ClmEbkkejnl48zraBuxogfFY019YAuBq7xm6Gwe8Ob3P4uoCD+6c0M8W0BRsrGQ8\\nPDjGOkMIQr6q2SnvMbVDZsxY7OVgC4bHQ0bHwuraOt1uF5PtYxRcvLTMYDim09f0FzOGoyW+8Pm/\\nyZe+9BuMpyPe+Mmf8sInfoN+1sOVFoLHqJh2uHf/Dtvb79LtCXfu3OHHP32Ppy9dwVz8WOwviezI\\n6RIJihyDTAuGh/scHe1RKotXM0ajIVrlLK2sc+HyVaTTwYnG6wVsyAn0QMf8cC0eox3KOwgWLYFS\\nFGPdpZA+3jpWdEk+OqQXIJMOzg/iRqAzKo1VJUCJrM9TyZwqJHhWKQVXBOXHkbPpDIvGoetsJPEO\\nwaPEo0XhgsYjOGUimIlGgqvN7Mhm53PjKgiLMkPl6HR1hldklDFyo0Z0FHiHgpgRFxx4R96GcG1Q\\nCoJ4yDROFJOypAwB0TkuKMRX+e6CF4cVCMbgtaeQkkwLeZBGbknsq2zVowjeg2+qRD1iiaVnmLM+\\nQkzEUCSWqar00iZEqTK7jao28JhlqCWyd61j7dIQKlAWnJIk97jEOKvohdj3cWOMyQoi0ese65VK\\nDGNrZc5Vm4PzAaMzlCpiTLcKBNF4Hxl8ZX3Iz8x5jO2JgminCw8fHKOli+55Hjy8xe7BiNW1q3x4\\nd5ff+M2v0ltYob+8ztLyFkVRUJYTjMnxLqMIjizr4K3GBhu9bDrHeQWZJiiDaEGw0dGEiX0jiqBS\\nJlTS6HwyeRrtKHaiE0FC3HF9Hb0HKstxvsf9Ozfp5xmr3Q7bd+9zPLgJ6jKXnlKU7oTz65a33vwR\\nm6tbnL+yQqZHUVOUDr18iZu3H/LezR1Uack6OcEXdHua0ck+udF0Oh1M1uXq01cZDg95cLzPubVN\\nysIyGE6YTsZ0sgWOT05YWemxubnJxUvnmI5mxOD6dQBGoxNMBhsbq+R9z927d9k9/jb//m/9Vpxg\\n1pIJiA68+fYbHOzfwYeC3f1BfVq4AAAgAElEQVQDTN7l3NZlXDBknS6lLxCtkvdXobKcb/7JN/m9\\n3/1ddCjYuLBOf6nD3u4eR4dHmN4Sf+c//c/56l//m8ymBV1b0FOODX8LZz1Rzo9ZJFpnsdqOn+L8\\nDK+FYLoErzEIjg7jbIV9q9FZn5DKffnabI0tjRJQme86hTDpZJForIomW0j1C1zL2SOiwMU411kN\\ngAonFo9O0SDzRbwJ844ML5LK27VUzCA1Gy8dkJ6+inAQomkvwSYPvUOnYiC1XikOJYFSTAzoJ5BR\\nmcQSHXASZ7y4Eh9KnChwkQEaNNoL/rTOKZUXPswlCKmktz7iaW8VLqk+i1KZBglkJmvCpNpxvq0+\\naluG9fOpCKLtjKcYJdLopdZalNGPsOD279V36rCslkUU79fQ7XUo7YzJtIj3g0uMe75AzEe1Jwqi\\nBMfy8ioPdvY5Gc5Quk852+XipatcefYaN27e5NOvfIGVpQvYMoV9ZArnQUkP03H4MpVE84ITW2eu\\nOxc9y0qRPIKOEGYx/IMIjIKH4CM7CFWqZtRCCSppamWdV62UQZuYEeLDDK2WePby8xw+vM+3Xn2V\\n4+Njfvj6OxhzkbW1DSazbQ53dzk5OcROCrQRjk62ufbxz9BbuMzUaxZXLzMpOoTZmFkx5dLGJkpK\\nlFmMpgYGxHDv5m1ms4KFbAXlDL4oOb+1yebGOXZ295iMJsyKIddeegqtITOG81tbscDLwiIXL1/g\\n3v0PUcbxwx98n9df/yGf/eIzZNpwcnLEzvY2F89vcOvD67z3wVssL2dMpgOKouBj1z5Fp7eCzvsU\\nZUnezSlDQS4dXADT7zL2U4aTAzZXFsi1IiOjn/cpuyUzHyiKgn63x5qznJ/uk93/kLWHrzIpC0hs\\nj5DR6W6CyZlNjjAMETtOpldOGfqc9K5yuPUpsoufYNv04zQKiX2KfsSZEVrgg6gUBhS9IlOXrBmp\\nwrFaMZDiU7qgSmwnLSxJWoAPcYMWqaWQNlls5AWASq7w1NSYlhnrY1lF5YkBZyH+KPFIcLGghlTe\\n8ygrKRTWVdqmIVcGQ5QxnHMxH96XGO3JgX4GXQHj47mDhKYv0vO2s4+a54gUvnLkxf6uTOPqORtz\\nuspg00ahjcFIFTvsHgG505JBrUUn1UWdkocqR9NpvbM+J47gGy9/7Ym3rg7val8bb8mySFSKcoZ3\\nHkRT1Vv1dQzrR7cnCqKToTAZzzg+nrC1uUJvZYVnn32exZUF7m3f4qVf+DJPPfUySM7x4JiZG9Pr\\ndeh0MspZEfOjgwEPmdYI0ZTITVabGSZTSDIbnLMEyWpNyHpP8DZldii0aodEpWrsoSQER6eTxYlg\\nA8FbOnmOLz2bq2sMHtzi5gfXOTreZmNtnelowNOXl7n+wU/57nf+JS899zLbd3a5++FbPDjY5sNb\\n7/Lcx77ECy9/lavPPMff+3v/Ff/qG/+Eowc7rG2uYKdjJhNhNJwxnVrAM7UzNtbOIUHYe7jD+fPr\\nHBzts7CwynQ6ZXllia2tVTodzeHhIYPDCWUprCwvsrKywtWrz3Lzxh6/+w//V3b3d7l48TK/8sVf\\nIVOaleVFjg+EyfiQGzfeopyNub89YDqd8vTTL3Lx8hU6CwsEEUy3lwqXONTMk3UyjFEsLOd0uoAb\\nMR13MVmP2QyCDWgBOynoGcUGIxauv0rnp6+yZT9Ach9j/n0AswSbz0C+BMcPYfgAygG4EoKiLLvM\\nwnmK1Zss/9KMnRf+al3sQ1B1Va7KpKtQLVQe1yD45KQJgKUDykfzuo4zrrQwlTbTxmUVmSLJSInR\\nBnNpwqfavKe9bfbGfzOVqjWJoGunEzFAP3iSnRSrgJG89ekzEPLM41EYE5181oP3FicOhSPLoWuE\\nXq7oGkWmHOJs1OVFsCpq21UV++AbB1tFRaOeHJJJnlrSEePepWqXXe3cVap+K4Cq9ep5sz99YT4D\\nKUlpp4+r/rvS8CvN0p8G0RBqdlyx1TokymSx/KO16ZUuacxDLJnZzTNK50EUGYrSuZgs828hiz5R\\nEH34YIZ3My5tXSHr9LDjGZPpMUejA1xYYTQ8YTw8oQwwLoZMZyXLy6uMx2OMUWTFjF53GRcsmRa0\\nMVhboMSi8oxgPZkEjAGvA3ipCxOIBE5m4CxYHzUTknnnU053rjWHR8dMJ0M6W1t0TBetIvjiphij\\nCMWYjAmHD+6wf/SQxeXz9HL402/+AaPpHQ53H3BHL7PUW8SXR4wHO9x4d8bDhwMuXHkJO9vn4PAB\\nX/nVr7Bz50Pu3brF4cke5cxhZ8KsiH7D4bjg8rkee7sP6fd6HB0ecDQ8wXtYXV6OqZzK4rxjPBlz\\nMhiA66AEHjx4yE9/+iaHhyVra1d4+ROfpNfP6He6ZEZhROh24f333uSd6z9h7+EOogLTWYkoQ7/f\\n43hwSOnHrK5tElDorEcvc2AMudIsdno4OwVjMB3FNASCKHKtoZyReU83KIq9beTtb/PU3uuIEdAB\\ncqK/yI5weztY3cUIaIlViRBHmAWMn7I4s+gjYGGD7OO/jpWAxKh3RMDPLeqo50WMjFUVQmthKJMT\\ngo/XCR5VvUqiXjghlqlr5237uABVgKBjmmbl2UZ8rXfCvGOzcktVTq4QoqltJGUSKZWYT6qXGzLw\\nLlV28nVCRARyjULRVwWZFrJM4WzA4BEthCy6oBY6hswIHU1ktc7HLCaSPFUxSRXlBAioVo3W2APE\\nKmq0ioxUsleowDTUtQlOs9lGMpjXRKHasOqr1Nc9DaJtZ1CbTdbxAC1W2i78Db5mxlmWxbXtW45P\\nJZQu1q3o9ToYF1OBnQ/4Ykook6beznt9THuywfaqx87uCf3uKuPpkMXFBXqddZQT7u+c8Np3v8nh\\n4IBPv/J5TNan3+2DiwK0LcdQnFAcH6NMl431c3R1TukDRgIEixgh06AkgHeEYFHeomw06ZdyjVMK\\nWwaCkWjWoSjF49LuuJiBssKiEawdk+c9tLIMhyfYMObVP/wGP/7etzg5fsDa5gq9Xpftu++zu/0W\\nly6toFzG8GTIpc0L3Hj3XexoytA/YGllizf+4k/Y3btBWexipxOWeivcvbPNcDBEaUVZwoUrT1MU\\nDvsQ3r/5IZkStA4sLmQsLXfIcoOdlSwtrzAYHlOUgYV+n83nLvHwwREPdnfo3jHkvS6/9mtf4taH\\nu/zo9Tf4K1/+Vbbv3OLZq1sE5fjgg5/w/b/8DseHe+zvH9Hv91laWWZne4d7529x5dlrDMYDFlfX\\n6OWLzErHOAjaaozvYKQP1gA5DlC5ho5GTwKuLMjLAC5nMCgpjo+xExh1O/S7Bm2myUqAkMX4weAF\\nXwoFhjLvYtUM5UsKojZqj4boVMPNphCXgCDePfqisxAruKqQiqoAiI7vnwpxsSnvoh5ZKd+SHAra\\noKX2wRNUXcUSleqZxkryyRmZXOzVWxOqEn9Ajc5VkQuV2GaMTZcYFC+kO3ApbEojQeNb6zjmsyuK\\nssCECGrBRkkq68SYy1wZcgNKbHTEhCh7BDHJA98qsJGuE5KjrP16nWjGS0rXP6WJBof3qXB3Zcbr\\nWNSuLD25NqmSVQOC1Xdj4ezmnI9ExtAE2LfHsn3caYeWd41Hvnk9Swu0feP9r0O1ZhZE0ckyRGy0\\nPlyo2Tm0Y1Ae354oiA4Gh2yub9LtLhOKE3yAbrbM5sYVDvevc3/7PYrZA7a3r/PZz36VYqI5OXrI\\n8ckBGxsraIFZOWa53yEzJcE5Mq3TqygsRsec76gxkXZwMFHUQnuPQmO0SrsreCxaKXyA0ju6mcJO\\nSsRPmY0ndJQnuJL9ndv8+O3v8eqrf0hPe0QJeWYYTw6YjKb0Ooa33txmMinQvsP+gx2Oj0YcH044\\nKaZo8wEXVp9mtHeb5RWFM4HR0TGdrM+sVyBiWVxdpAhTNi9c4fkXrvHBu+8xm4wZnRyzvLTJSn+B\\nk5MxhPjmxc3NdbKOYu/hISejPYppYKG/wGg4Yf/ohMsX9/nEL3ySc+cv4ZxjY2OB5eWcb37zj/n6\\nP/sn2FnByWDEuY3zdLtd8k6He9s7XLiyzfvv/5TNracpiwFKd9HSZZr1Ee8IBXjpoU0PIVBaS1cL\\nkkeHn8ZRliXWCYOpZ9lrotRrsCic1xAsQcX3+Ih3iHWIU4gYsC4WlFCaKZAtbzDJV4DEbAh1nn80\\n2x+da1UcYqOPChkeER9TTFWMJG0X2FYqZTXVHzXFRQCs+BpwRFKAOr6ukARRN/Q1CFcAUb3NM6+l\\nI1s5nVIoUQiqid+UdN9VKrPEhW1DjrNSh1EawNuAUg6nIWiFi6iMF0GFCN4uEEOytKVyGNVOnTDP\\n7Ko6pOHU59XDiUgMUUsAWlXNFx8IqknGCKHyN8R7DSmAvx0KJSIE13xWJYK0QbU25ZOME2+j0kjn\\nQblq7VKHMYoiArF1NjHayNArC6OSbrT42gr5qPZkg+3tGBu6PNh7QKeTgRJ2dnY4vL7N8x/7Bc6d\\nv8hbb/+Y/QcTPvXyF1ld3mR4PEWFKQ+3D9lYWabX77Ky1mVajrAl9PoreFdpLT6xy6gjVTnDPr12\\nRHzlUJLEJGx6CyUQhEwrrPJoDXmmOC4nFFPodAydrvDxFz+GHX2F1/71n/HSi5/iwcPbTMdHrG2s\\nsnP3IWXp+ZUvfoluZrh35xZZltPrrbK0kbN/cszr3/kWNuyzca6H94ZMbVAUJc899zHe/uANhoMR\\nayuX2dm9i/OXWNvcYnIyYH/3iAcPj+ivTwFDp6sJlIzGJX7omE5LtOnhwpRer8ficp/hYMDrP3yD\\na9c+zW9+9TfQecbh0Q6///v/kB/85WtkRvGlX/4y77z5DkdHAzoq49zmOZ555hneevc6x0cjrj67\\nx707e3z6lS9xbusyJ2SYLIPMkS/3cEZR2hErsswSmunMY0URspyjcgTGov0UNR7Tm4KRIZkimvPE\\n19voiDHEd204utqRj5M/BhiUU/rrHaYpttRRBY8D+LqaVLWYopkNLoWsRcBQkZ0qUEEQY2otVCUe\\nCDSOjMpUTO83qsJuNNEBERde9NYbFYteVIHkccFXhZ0dDtAhBquX0knPXamxyZxP2i5SyRTx3kER\\nXLXdg8Ok+M5YjCeWJ50RfFUooKpfG1VU62Plo1hPopEbapBKDLw2h8WjxMSNDHCuxLnWi/FCBDqT\\nabLMxGIg1UbVrkELaVAjW69YorW+Pp9PiRfOp8ryPszJA/XbFFKfWmvnsqhCy/yoQ7TS7leDbjrE\\nVwW3XfU68ig7NKnDVQxpU1Pho9oTBdGltXWGg1gvdGV1Ce/gnetvMivh3Lkt/sPf+S84f+4ay6sL\\nLHZ7ZMrR7yhev/4jso7n3PrnGAz3GRVHTMYzFhY2uNJbjq/tUMLMl+RaYUPUkbyFbmawvsSkF7SR\\nuKkPHhd0XQrL+UBItS6VhqOjA5yfcXIyZTg6YlqMMAR+69/725zfuMpTl7b44Q++xf/zr7/O4lOb\\nXHv5eT68sc3x8TEjHKPJgOlkxmRWYpzHFwUzN6K7pMlzYf/hMePxiPOXPsbh4THTqaPTzZnMJjx8\\ncMwzT1/jnbfe5XjvEMST5YaisEwmAy5evMhkMsQYw2xmKaeCMsLa6irawHQyxFn41V/9Mgu9Lu+9\\n/w6vvPIK9+6+yx/8i9/DFpbhaMhoMOD5557jzu173Lu7zWc/91l+/Te+yn//P/yP/OInP8VXfv03\\nWVk5T9ZdYTotKWYT8jyglUV3PRgHZUDPZuiypINhTM5Uz5jpGS4M0G5Ej+jxzaqYfZVsAzEgPZTS\\nSF7iwpT0PsZoSXjo5MucBIcxlq6OrLf0KYFSmDPfALrdXlqwFhste6x3kSEa02RqBZVYY4w11VQb\\ncUA5H83S9B6lVPcIHWzcnkM00LUivs8oaYhCGZ1Bqnq9dlQjI5gYJiRACM2cs6GMFpOO4UuByNra\\nm4KSSr6I2qfGo41gdMBQxthW3U5RrrzwTbIBUBdg1jWYRkAWFTsqz/MWIDWsUgKIBm00nW4sBYmL\\niRNVJEz9/qaauTbZT9WzVG8PqECx8qjXZrtPOnUKeYoMvqy97lU0BlRFahqwjffahEk5Ar4qmH3K\\nWxRCwLoqycPiETKdigp5X7+g8Ge1Jwqi3e4y3V5Op2OYTkZMJx4tOQsLGZcun+fcxjp/42t/I4nx\\nUybTAbc+uM79Ozf43Oc/zds/fZ17925x+emLLC+ts7WxFWPoiNkwRkNZFggmlviSPGbcKId1Jbnp\\nARrno+Dsg4+icvIQZpnh4PCE3/+9f8wrv/gpXvjYNYIKTMfHmEx49vJVRsMZ+7sn7D54iJ05zm9u\\nsby8is77bGxMeOP1N7hy4Rzrm+uU/pjNtVWODg7pZYv0egsMJzuckyUQjXWe/Qe7SC588sVXuH3/\\nDhIMl86dZ3NjjVc+9WkGgwG3br6NLYcEb1hcXMM7IvvUno21C9w+eshoNGLFe9bW+xyfDLh88SnK\\nomBldYHnnr/C93/wGv/gf/tf6HZzjqdT8Ja3fvJTtDEMB2M+97kv8PTVq2g0L1/7OLlkXNzYxAaL\\ncgNWF3sUO9usLS4RTGC9p2LKashATP0myxiXaCiLGUopbL7Eu9NFFstldo5iUeiiLCicxeIhlIRQ\\nElSJkxlOacQaFn0HgzBRwnByzPJCweW+wnuDc02BjarGaAiVsyOSMr3YJc+6lN5xcjJgMBgwLLvR\\nXBMd3zZQWSzE5Ipcov4aVEB7H8O5lAKVEQATqpqbEh1hiuScqnLeU0iTVMBLS68NZClSwBGwLjCz\\njpl1FG6GKxWYLMamppMEFKIjD5UA2s8ieCgSiHu0inKV0VVYkU7gGOe31K9U8UBkqqX3zStHEmi2\\nixJX4Uk1OEnAB+hpE+sY+DAHgLVcEb/cOk/l/U8FQNA4H6IGKZX80UQF1I6sEKt6NaFrsV5BoDHx\\n29domGNyFCczJnrv42YREyQkOcfS83khqFSPNTQvSvzoUPsn/d753X1WV/scHe8ioslljSuXX+DF\\nl17mr3zxS5TuITdu3GdleYvNjS26HcNr3/4m0+mUuzd2uHf/Q569dpXJyQHHewec37jCla3nYsWg\\nKixD5dgyoFRGWUbPJOIwWaxqLRicT92gAfEEG7NPimnBe+++za1bH7C6lPPB9Tf54i9/nvX1RV77\\n9qvs37/LZz77V/ncL3+BP/7GP+do9y55p8fNG3fQ3T7TccG1F65B6di+t4vua4aTISbPGB0VZEsK\\nJx32j2eorMfVq5vk+SJHhwOuv3WD8XiCzqCT57z10x+zunKeFz92jVm5z917B/TUMmUxYzKexVjD\\nILz77i0W+6t4CgYnx/T7isuXLhG88Npr36W70OVzn3+FP/zG1xmPpjjrWOh2UMETKHHeoYxw6dIV\\nNtbPcff2Np/9xc/y2vde4/6dD/jYtWuMiwn9POfckqevJ4jKWMu7SDA4nzHwlm7H48oSZ2doF1CF\\nx9OhvPgCb299hh9ch/cfjBgcH6BDYDKweAeOGWUaCi9gtWVpJWMxX2RjaYn19RWWuuf53POfpis2\\nHqgFpc0jpfiUhrKMzEXjyAJ0jaG71GE5C9wbBqaljc4UFR1iIQSMxGwaJZ6OAmViLGg07T3OF9hA\\nrCJEfI2E0RI97aGKCkhxyEDMSkrg0DI7lY8FtDMRnIZcoFAKY4XSC0Udlq+p0lerMnQxKsDEv4QQ\\nJQ2ipqvQ4ATvIo5X8aBVrKfoKGlUgNWwP13X56xeg9xojE2qZARaCEoofSpRGVqOKNomdQTVxknT\\naKROWsyzCm1SulUTVNffraC48so/zhGVejU+k1CXCazB08/ruhH4o25dpT4nZTlif5VM8G94P8iT\\nfT3Iygp7e3sYA91uzgsvvszVpz/O0eEx33z1G1y4ssHB/pDPfeYr9Hrn+cHr3+Vg/y5bm0+zvvoU\\nzz57kYODXT547zrPPXuN5f4iWlRd4GDmY8X2Km/aqDjBfRBsGfChJM9M7ZiI3e+iOacDg8ExN997\\nh3NrizzYvg3B8a1X93G24O69G9xdWefFl17m4y+9zM72Nd7+8SH37hyxsXGZnZ0HBDyDkwGucAzH\\nU0zI0LmnGE/pmj4zDCsblwl2xLnzm8ymBcfHuwwGU7QIHZ1jZ1N0H8rpkIHXfP+HR9y6fZ3VjYxc\\nDJPxFDsrwcOsLIiVo2A2nbK63uO555/n5o0PmZUzlPJ878+/w3vvv8XMluS6y/HRMd2OZmmlz0K/\\nS6Zzlpc2+aM/+gb/+z/6p7x47eP89u/8LY4Pd/nH/+gf8OVf+zJf+PyvUE5O+Pafvsp4MOS3//bf\\nYX1hCY1QovDK4CSgsNGJZzVaMhwZay98mr/+3/x3dMoxR2hUsOjpIf/Tf/v3+fH3vo0xHTyG0pYY\\nE+iurvGf/dd/n0//8pfx1rG5soBOMb5+clSH6BgVnXsVe4khPC7qhCrVCXUFhJJ+3mGhs4jLA4dH\\nAyalBR3L7nkXHTg6CKGcEoyQ5xqjpTaLbVp0otLL1oJDvIoebB+dFLFKX6VexnAgV7OgCgwqU1Sl\\nLCUhUwKZRjw4G+qXHc69Rbal3SliyTsC4HyUKwAJIb2q2VeZmxEETQARRHxdNKV6+Rw0NV9DiDfc\\nhBZVwJUyoURhy1ZKaCtgvga4SoNuebqhBWS1Ri01Y4dKHyWa80q1JJr5wiYhjUOlq2qtEUMLINOr\\nX9yj7/eCFNoY0uusU30CSfGvlXO6KsTyUe2JgqiSjMlkyta583zmM1/ggw9u8P6HH7C1tcqFS+f5\\nyU92WOhtce/+DpevXODr/+L3OHdhiy9/6cu8d/0+q+sr3LpzByUZnXyJ1dVN8jzHWodoQWMAg1Ya\\nFzxKBZx3ZCqnKEp2dx+yurJBr798apCiAL+5tsbnPvsZ/vAPb3Kwu4PgUG6V0fCQYjQkLGV877v/\\niu/9+be5dfsmXQPXXnqRtdVzDE++y+JSl6ODfY4OBngRRkcndLqGXq/DytIS/bWL/OTNN7hyaYvJ\\neMasmDCeDOj2c0yR0826HA1mlNMhx37KtDvCO0232yXTGVjL8vIio+GEbjfDBbAzxXAwRTLD0fEJ\\ns1nJr/zKV/jjP/omiwuLSB44Ojqk349hSsGBdXGn3j84jK9p2fRcuvwUW1uGhYUFlIYXX3qOW7dv\\n8M//r/+To/0DPvGJV1hfu8R7736XwjryXo7JoCxKOroL0xI/LYCMkhIrCpU7rD9GlCZoT0drRGtW\\nVzfYWltkU0M/E4oA3cVVQjHD2sCFlQUW17v4IBSzGb6YIZ2MficHUjEYmY9TBJJZXmlq0VHgQmWe\\nKlZ7Bik1w6nH4SiTaRvLpaUc95BMTBXNfKXASMyEsiI4R8zppqnjCSolcAhV9SgboobpvbQcIhrl\\nFSSG5IMnKB2Plfia44CgU/kRoH7FSXRimfQmXCBEMFEp5rVyIMWstwTWotLnlfe6VTrOQ9Qtm9TK\\n6FxKDLT1tswImo5cNQ44qCIgKsBR9Tna6Ztt9hikydOvzg8g6d1RXinMKQALyfyGhkFWbNgLKNvy\\n2Ff92gp7amvLrnrTrJ83+dtB/BLmX3D+uPZEQbQoJmydO4+gefPNNzm3tcbY7jAqxtzfLsizK3zw\\n7m0ePhjxl99/jbfffof/6Hf+E648/RRf+MIXuH3v/2XuvWIsy/P7vs8/nHRz5aoO02Hy7mzipllu\\nYNCS4i7XtCjBsgTThgDrwRBsEbD9bPHRAmgCBmzrwYRtGKIVIQmSZVGySC13Z3dn4+zknu7p6VQ5\\n3BxO+Ac//M+t6lmS+2DDGB6gMZjuqrq3qu79nd//G9/i9Tc1zzz/HM888xyNRsp4csp8PkdqRW91\\nkyKvmC+m9FZa4RhmDYPxmOmkpLu6Spw08UJhXKjMkEoHMBzBnTu3+PrXv453jmeefYZB/5Tx8IxG\\nlrB/OCKKNrl16xXmk1DgZb1BCc3W9mWUs4z6Z/RW2pycHLK1eZnhYMZkPKKVRRye7GNP+rQamiiW\\ndLtd9vcnOOnQsSaOEvKF5fr1G1RmiNcF08mctNGmIRo468nLE9rNdcaupDKC+SKn1eyR5zO0cjTb\\nbQ72j8FlGAPtbovNSyuMRiNMKTgbnOGsRUSKe/f3qUxJs5VQmQP+49/4Cg/vH5GmKd/74cuMR0fM\\n5gMm4yHfeukbSBRnw4KtS1v0J2EoRxoKX0FhSNuShQ3xY4USzO2CSC3oxhpZGKSxKK9YeE8jjvnY\\nVofhbMC6BZloYnpUKEzS5bleRGZH5KVDlxakYG4WSJmFwIplJqwMSVJKhJ4drMSY8vxIqZRC+mX/\\njyeyOZ1EooUmryx5FT4udxbrACkpvUDYIFiKRNicAz5nA5GCrzWcgTwxvhaj17Ii55cOqZDMbmst\\nsnf1YT8wVvV2GqRHXoTMBusC/oi/iAQMYvtAZCFKqCEEV+OMVd2lDmHrtfWWFYwANZ64JFGI3gd/\\nLK/z47atffziMaZccn6jEtFyQ7xwO50PX38xRH+y+vpCyG/Pv6597ASxfDytNb7OUlX2/Ud370Ph\\nILwfF318eD7+vZxvnFx8r6Ee2b9vSHr/2McIH0oRLT/1+oB758eYqmRjY5ONzYx211P4JlHUptO5\\nxi/+3K8xm1e88uMf0el0+E//2n/F5Svb/PN/8U/orSY0UsVwdMTp2RH7e8fMpjmXL1/m6OSANG0Q\\nRRp8Qr6YUTYNQpccH+1zdDwmTXqsX3qGyqrgmUWgZFQfyQTOGW48/Sxfqn6R3/u7v0tezCnyBUkc\\nMxqPidMmZWlQAtZXW9y5+y6NTpfBeMhkPCSJEjY2V5mbCZ11TacXMxzMubrzNHnVZ5YvuH6tR5Ik\\njEan7OZzdnYuMZ6nvP3m26ysbPH8s59gZ2eL+4/eYLbYYz3LkEIzOFtQFtBuR9y4cYV2b87bb98O\\nzYXznGvXn2B4dsZHP/YCAs3e7gnb21d48Og2k9mALGuSJm067QZSKabzCmdjKlNhjKC13ubW7Te5\\nffs9Op0eZ2cnfOkLn87skC8AACAASURBVOPd22OiOKasSl597RXOJqd85StfQ8oSjUV7hfYR1kqM\\nhSSN8dMpkRJIYcHmYCKchThKkaXBRym5k6x22jzXgk+tw8p6g7mX7PY9+4kg1ioUiuWGxIVwZqTF\\nO4OSwZXzOBES8hIczlkiTYDBBTVzHFhbKSVlXpLFCi0lkVTB2ZZXIZtBaQprKY2nciHxKFY+1DET\\nvP7CVOf44LKD3XtxfjS0NrDyFhFkdkLWvqDgQlLnWFv4GtYHwsbagBdaEbBQj4dli4NYJueH1Pql\\nVlNbjcEjfAUukE1BS7nMMg0nLRtWOby3WO/etxmeb6fnrh9T/zwlUrnz09q568gFe6d0F5+/HL71\\nb+J9ASDnrHv9mFpcQAFLHaxc3gRrKdM5PCB5nwkgSM74Y6ePn8Q9gYvc1T92s/jjMykEy7w/01T8\\nWcZEowTSJAv9Ju6U/cMFzrUwecozTz7Dw70HPP3MdYpqyumppMybbG1GHJ8e8eY7d7i0tcmLn/08\\nSjbYfXREM9NUZsrdu2/y5JNPMZ2e0etdYnOjS398gI5LXnn127Sbm3zo0x+mEqHtkbpd0uDAOpQI\\nlkDjS5597kP8h3/1P2JwesCj+/f47ssvkaYChKLIA/EwL0a0Wy1QmtPTIRtrTRppwnQ8IHdDohSO\\nz/bQtMlnJcPJMHidiwH53AAR89zy5hu3QEGnt4ZH8qMfv8H14ZSsEd5IjZZmPBwRxSmT/pzNbc0i\\nn4ATFEVBEmt0lLC+scL6ahdjDHu7++ATGo2Ez734Iif9Q6yH+aQia8YM+1OGgwVSJFzeWae32kJo\\ny627bzMYjUHBykqH4+Njmp0uZ6dnZFmDJ5+8weK9Q+68+yO++NkXaUcpnajJoBhjGjGlECzMAqks\\n0hrK+RRfOkgySh0xdylNaRmpjIW0pL0dPvXCs3xxZUarYZlFHXZmbX5QdCijjIoWMpFEymD8HJ85\\n1KIk1pDEEqWX2ZAGsPWmFnBu6y1BjB7E80FiLsmSiMqGo3kji1BOUlpB4QxKZ1SVDc0ENvzXGI/C\\nEEmIlCSiQtTJT2GD5LwobmmNctRSG0TIUBXUEhsRMgEI/UFCBRcdtr5JCIV3MmhTl/30ARAIsX7C\\nEZ/bWCVWBiBP1MlQwovQjVVvhyyrL6zDW8AKKp/XA+jxLF33x47g2lucEyDMYxipxNfTYyldkjVG\\nfK795GITXW6Ij1+pfv8ADML9oD1VQrKcxecb8PK4vTyWq4thF1QSF9Xdj1dhvw9HfexmsYQcltdF\\n5ckycOj9IeN/2vWBDtE8l6RNS9x0TBY5kWxjyhhDn+9+959ytH/M1371L/Lw1lsIBWlWsbtrmY0P\\naacaU0443N3jM5/6BTa6K5ydvMHBwYCzo7sMj+7x4mc1W50V3nnnNY4Gd9g7vEsUrfDpT/4q0nUo\\nZlOmsyFba2s444hlilIRRlicC7XEXnb4+Ke+Qhp5Xn7p9/n6H/4BidSstjrM8zGPzgZolRGJDnle\\ncmnrGs22pFzMOB4OWV3tMToaImnQW1mnfzrCRwpXwHCcstJZp7KG6fQQ43NaSYuN7W0AimLO2rph\\nNnVou8ODO/vEWpJlik43YzouMOWYfGFIlKaVdTDWMe7PgmD/rVvMZlOidMK8POPgOKKqHM10FWzF\\naGIYzQp0LOmtZHQ7CUIYhqdTcIrN7g7j0SminNB98jKvv36flZVNPvLCC7zwwkdZ325SFpZXXv0R\\nndYquRojsorKzbBVhqxJPevBo6iMpDLgbIkUBs2MyKzSRtBRfVT0kMxabNkmYcymPeX55jarbsI8\\njhBRQWaGpE6SJJt4Owkv9CATR4pAJF3IU+qEJRmKDisr0FoinQMPlbYgLVo6lC1Q3qFSR1MJcrsg\\ncoJhaREiAqlZWBsE/kqSOwskSBskRdIHB5xwIbpOeI9WGglUPoxt58NKHFxDlkrWjjoHElkTQeKC\\nOfd1GtNjl/DUxpCAm3ohqEQIDpdIvKojSwLwiXcGV5nA2QuJtxZbBWIoJwJbu7Qey74LuODjLPtS\\n7xkMBZEMbqoSRZHb+hTgz3MFWGozrcUsh+hjknsIA8va+nPl0jWlgiqiMsGscD7Q3u+Zt4SPVXVR\\nZei398H4AaB0feOi9tL78632ce++lhfbpsQFKZPwLMO0I6Xqjq0/w5uoiqCRZSRJihA5xWIOsiJL\\n2wyHY4pqxg9+8DIrq1u89dYt5vMRzWZCq5MhhWA6GHJ68G1uv/02nV4TayuKoqLI4fT4BPwKh2cH\\n3N+7RX+0S4XjuWef4MHuMZtrK+QqImtvknsZKr91QuUl3iuEdOSzCWurLapijPGOk8MHZAmM+sNw\\nV4wKtE4QTnF4vMv6xgZZQ3N15zIPH73Hpc1tVKIASaJ7nPbPaDQbzPsWLSCfzxm4AWkShyN2o4M1\\njirPGU6nKDyzWU6j0eZgeMTq2gr90z1mixmrK+s4CqpyQZpmZM2ERiOm0+lxeHTKD394ys7ODlFi\\nsX7BbDbG+ZI0adHazCiKknxiSNOEONJsbqwzn00Zng457Z8SRynG5Uz6Q46qkihuE6mI1bUeewe7\\nfPObf0R3NWVr6xL37/1b2o0V8kWFMZY0AaUjyvrNC+CWjaFC42XorY+iKAi6qeqOoIDjSREGjq5T\\nzZMogkYDUzo0Gq0SCimIGynGGKqqwDmFUCClQmlwllAhwwXx631gZCH4p/EhZSjYbCxg0BoiD0YI\\nEqHIrGNaFHgrg0bUOcwibJCVlkGO46lF70FgJGQYbsY5nJRBD+mDmF7Ub26PIqpVJN7LQGaIsNGG\\njFMek/bUeCI1FBA0Phd4JoH5d8uQD19XJkvAhaHjjaXyFcuOKCkV1MPFuOqPDQohBEXNvi8trMHV\\n5TEqVHwIKymVIZI1lPIT8iGoiZ86TcnVZgiW250SiJpcClcVjvOEDAJR6zmXGLeQddTh8tMJQ1Wp\\nUIEce0BIhHmsAsTVcSmPbdBLi+r70uuX/xHBxgoXw/bxrfxPuj7gtk/oD0bkxZRIC7JmE1cWZEmP\\nPE5QUjEYnjLoTyirkhvXn+PRw0cU+YKrT1yidAvG4xNW1lscnuzSaW3w5M2PMx5VPPV0h8HolLdu\\nv8rD3XfRicbLBtNpxOFRn+0taDW6CG2xtkJoxdwqtNRoKTDlDGtyDh7eZv/Ru9x64/scHtxlY72H\\nabeD3EUrhv0z8sWMdjdja7vDdDJhMBjQaXfJyynOebTKUCri2rVLLPIZzvcYjxPyfEiv12bvYJ9G\\nM8Z7jdKKyWSOcOGu3T8bsPrUBlWRM5/nxFlKL0kZjaY0WppGMyNL28wmOdYZTo5PmE7GfPnLf56j\\no0NOBwcoaUizOKTMd9a4ffsWzaxHMZtRVDlzm1MWE9I0Y7bIuXxph6LK6XVbXNrYoTJwsHdIs6mp\\njOXLf+7LHOwd4VzJZDwlTVoMBhPKskLrkDJfVlWNcwX5SmUM2GXKu0BFklilJEmCrCwqkrXkBJQi\\nbBNVyfLVvazMXrqPVBYM3VGig47zMSwuihKkqImWWid64WKSAau0NTkiBVJ5vCtRKvQuSVshrSXR\\nMY0ErHUY69H1wKuoUAgKV4+tmkTxIjjjfJ1DapeMvaAuFPTn8iQA/GMJ6j7w8L6Ow5NSYb2pP3BJ\\nxCytmjXjL+rSEP/4RgXuPLZO4Gui1DqLKS1CQKw0KInJl44hfy7J8t5fKAvOMcVwc1PiHC0MW15Z\\nopSiWBJNP0FOCSHqE8ASHgg3rPOZaWyAPh7rVVrijxeDOwjxlar/7TFMVYql+iJ8ucgGbFxr+dj3\\nY8NmKfx5ZnAd64aoU7yWEquAx16QXz/J6P+pc+yn/uv/z1c764AFV4JSKTYPL5DXXn0L5xTtZpdW\\nq8VsviCOLMcn90AvSNMYleTEKmW9eYmFgbR1hcqkDMaWldUVimJBYed8/JmPsrK6zdNPfxghOzzz\\nzEdJm028d1RVjvCaSkqMkQipcQisK5C6IJ+f8q0/+H2q+Zj5bMhkcMYin5IXhiRpkY/meAtCQqfT\\nwFNSlXNOTg/YWF9HKslsXrGYGaazPq1ORG+ljdIKYyCJIhaLKdZUzGeOJE1ZW+txcnTKeDKl023S\\narT5zre/Q7fbZXNzk/7ZKYvScPX6NYbDIeNpwe07u2iZEMUxWjX4la/+Gl/72tf4Z//sn3LSP2I6\\nH7LSbrOzs8NstqAysLGzw+HhK1hfkqYp8+kCUwoSlaJQXLm0TVVWqEhwdjagKgpspol1ytnZAOck\\nk9GCzY0n+NQnP87bb77NcDBhPh/gXUwSxxRlGExU4M3708UfF24rFWRbM1GH6DhDWeWAJNbhiJZG\\nmryQNRMdhmOkl333mqqyzGYLyrKk0WjQajWQ0iOURKlAcJSlwVSOqgrp5WnSQEfBgy+kRkiB1oLI\\nOoqyQriSVCl8KrBGIJXAWk+qorDNmBKQVD5UTZQuBIl4FwiK5fCWUqLrzQ84f4NXNQvtRK2xEWEF\\nXdo8zxnneuiEAJFwnbdt1gNg+ffhIep0dgBdp005izNhY3PyYvNd7ul1hkldk+3PiTC//P86i1UI\\ngSxrwscKrCTk+v7EtbypeZZM+YWLqL6PYkRg8ZFhwC7vucvPlyzdWKEUUgTb4fuGXNgsA1hQeUMU\\ngbYe66pA/nmLlISakuUu73xtIyXAAvVzCrjq40PUnD+Xn3Z9oEN0NJzVA69kNi2oKsNsluO9YnVt\\njaossM6RphGdriQvJrQ7HbIsIU0ld3cHeCu4vPMMf/kv/jW0jvkH/+h/4Qev/yGRUlzaeYrLlz7E\\nCy/s0GytI2UDoSO8cxg/J9GKvCyQOkWKBCFTimKGTB3YBQ93b/Fo/y6LwYhrT1yhu7KOG3um5Rl5\\nPmRndRvBEKU9WZYyHy+YzWZcv36VrKkZ7vfp9rYRfh7qh6VBSmi3M7Y2rjIcH7GYTWi3Oqz0VhFC\\nMZ0ucMbTypo00jbTadDRRjocP62FKE7Y2z2ikTaZTWcUhSFqNIijJvN5ya1bd7n/4H/i6OiAOIZe\\nd5VGlmGNxFkFaO69d59r1zaoLFSFZyoKkBHNRpNGI+XWW3fIGhEbawalDe1eg8VsgdyK2dy4zGDw\\nPdq9lJ3tq3zuxS/wV/6D3+Bv/I3/jMPDIxqNDs5S63TD5axbQmW1etJTVQYjDbFwJEnC1Lv6xRyS\\n+Utbi6JNUEFYa0PQrhe4yGJMgVIRAsF0Omc2XQCCqV9QGYOQHq0lcRxTWsN0PqcsHdaEN21ZGHQk\\n6/IzVWN7EmclvvZNKwFNFbBG64MP3seBiGxUoVakdFA4SWGhXKYTEQitCIXysrZl1sfResMpdEgV\\nWwrTpQzTUEDNrodhc5HlsRw2IVDkAicMN6iAg14kSyGW7HZNzqgg6g9YYZ1KIMLA97WwPqifAtlk\\namOAq+VX0ks4T6h3aEQo+XMXm/IF208go+rfePi7x9lxWRexOpytw2G4yCINaVgC7etAlvpxpbyA\\nA5QWVJVBmLq7viawKinBWqQKeG+0BJaFqEMG6/AUB8vYpsd7lJbPM4Q6/xk/zs8XM+IZTKYTkqjN\\nxsZlNjYk9+/f5mMfe447d25TVQVpmtJbaXDzqSc5On6EFDFnp2PsYsxkXHG6O8UtYjY31rh964fk\\ndkRne5Oz/pB33nnEZz9/k1mRM5lPSLMu3ZVVhNBUGrwUWB9TVDpgoVGKp+KVN1/nh6/+GONhMFvw\\nVNZm8OgBRWlpd1pUtsLZ4D2OdMTgeIiQkpXeGnGq6Paa7O05BoMRZ4MzjM154YVnMdYyHEz5xCc+\\nxeFhyje+8XWajVYYoLOcsgjuo6osWH/iOs1Ok9G4T5JETCZTTvsjdna2sM7TWV1n7/CI9c1NkjiQ\\nYqUxnPZPWFlp4yhCYHzUYDQes1gUxDrhSz/3BW7dukWj4ZmNS1Y3N0miMUdHR4hmg/lsAT6ifzIl\\niRNW1tqkJcynM27dus27797nqZs3GE3PONg/RauUZquDry2JVVGd/46t9QgfwqKNMWgpMSKEVFSm\\nIvdzqnJCoyrCwJDgvMGZ4BYxpkJ4uPvee8xmIz6y3UbpOFg5ddhkZ9MZ0+kUL0LVg7WW6XQOOFSs\\nyBr2fAMN2sug0yzKOZWRSB3VgzTESZWlp6rqN6z3KLmsigi+aicc1lgiQnmbkhKJRXmIlqIkH/p6\\nIhE2IiUly04m4x2Vd0i/FJiHP7JOTgpEjgt9e48d35fscR3QFzJQxYXbKAxWcZ5lil8K4B1OCnTN\\nZuu65sR4EwaSVbW0KmilQyjLUsQvEfUG5wg1JaImyJbaMVm3c4rljeixFPzlRlpVFbYy5+4hcCgb\\n8FqWMq7lEV6IOgPYY1UwHYRUJ2qizYd2X0OAdOKQv1EUBYtFiSKQTViHlgrvFZEXOMk5Fu6dw7vq\\n/OYCIfnK18f+AAXZ+kj/0+fYB2v77Gksc564vkmsW8ymFaenZ+jIc9Y/RGlPVcHZ2RmlSfDMKasF\\n3qasdK/BSp/e9S5vvfkud9/+AdPhBt2WpBel9LpdXvjQz/ORjz7Hq69/k+H8lJX1y3z6U19mMh9R\\nVh7dSInjGIdFxBECg7XBj31p5wm+7SS99ctMZpaXf/AKWldU1Zy1lQ4ZEeXEo3XEeDKj0ehyetpn\\nkU9otgVHtqTdaZHPAG+oSsN8PuPkeMAiL3jjzR/QyFa4fv0ave4KB/unOGuZTSdBspNpTvtHFGWL\\nTjfl8GiPOMnY2b7M8fEhYOifvEqzk9FqNjg97dNoNNja2uTmzZtsbK7w3Ze/yXQ2ZDodIaWmLAOh\\n8NabbzBbzJiPHI1GjyiK+eSnPsH//Qf/iiee2ECqlL3dfTY2thESkiTDSU+v1yPPK8qi4OZT13hw\\nX/Cxj30C5wRFUZEkCUpJdKQx1l5EygmJscFHLwRIDM44bFmStlYpCoPW4dhdVSUi8qhEoi1EKqLf\\nP+XBLKLTa/Pg4UPa7S7p5Q5lWSKlZjab4QnSGFMFeYqOE4ytQl7CvApyGx+aJ60NQ05FFzIXY8W5\\nU6WqXC1QD3GKy3XMOYuTFlMnQeU+CsJ456k8YXMjHMO1dEQ6BJNo4c+PqtbXRJYUNFQtsXE+yIes\\nC+Lu820sHN8fzzO9MJKGoSvlsvZYoZZJRrWWaBkJaX14PKlDseASQqnqTdZaS1EUhKOuOA8YkUis\\n8kFq5dx52pNQot7w/Pnw1FqjIoWsy+mWz9lbF0J/lKIkx/oSlhKqpWRJWJaBIlIEi2mkJDhLJD2x\\nlsRRRJLURKSv82lNgKJarRZZljEajRhP5ywWC6oyBN5QN8HaGi+NhQIXcF5jSqQEEykSrd63Cbvl\\nieLP+iZ65do6IIijBuNRTp7nrPRalIXg3Tt3iVSC84L1lXUKM2c6MURRk1h3eefWHhjLyemQ8WzE\\n1tYVimpOo90Gqbi0vcOv/Xt/juPTIY92v8Nk0efmjV8mln364wnbW5fQnRZVtaiPMiGPtCEFJ4d7\\nvPP2q3z+05/n6ZtPYkrD//o//x2m40OcyZlPZ0wnM6p8SJY2yBcVxXRIWeRQGIaDOR/56HUm4xnz\\n2TFraz2GwyFx1KQsjljpdXHWYqyh0UwZj87CtikyrlzZQoiKS5d3QqWB84zHJ1if08h6WC8oihzv\\nDVnUwxuFQBPpmPFoSruxgq0M3//e91ldXcVT4Zyl1Vxh0J/Qa60w8WOKfM5f/St/nX/xf/5zXn/9\\nNYbDI1588ZP85m/+Jr/7u/87YTtSSB/x3u0Ddna2WNtY4eDgmCefuMHBwUMmkxm//EtfZXNzC2st\\nSZKcC5jrvQsAgaiP4mUd4+aozIJOEjGxBY8e3Sc7PkYag4jrbdRVQIQzFcVihm5JhqMBw5OHfP6L\\nX+LNd24RlTOuXb+JUDoEbMvwmFESh6HgBdZQy3dC5e45DauWvvelh9vhTBmIBFsHeRNCooFzy6ix\\nYJ3EOFgQERC7C6tgiG6DRLgwSAXoJZMuQXlZDzSPLivwtj7SO7zyJFFUO3U8s0VRC+s9Xgb3lz9n\\n5H342nUgslR1mr63tVazQrpgDXViOdhlENijiJQkjTMgOAeX7cwhADpwA84LtL8I6Qg4rQ5pVVKi\\n6gxQqS82UaEv6leEEAiliMLyd06+ORXYeqqQpL/8+SzZ81grIg2xjIgjSRpLmllKp92imSY4b4Iu\\nOtIkSUKcJigV0ckiZouC4XDIaDIFLxBKBmVEDVc4L1A1ex85U0cGxvXvJ2QKcO65D8HsF3beP/n6\\ngG2fOZNRTpo4jg6HWOPptjvM5iW4FCckadJgvpgymY6BDi7RTMoxpqo4m5YkmaO3tY1REkXMosjp\\n9ZpMRmf8nf/htxmORrQ6cHa8z/dLy73X3uHmzadg1qS3foOrV6/SzBrhDSMztI54Y1zw8M0f02x3\\n+OFL3+FTn/wsn/7ki7z0jX+NlBFSKNZWUo4Ozzjtn5HEKV4ZVlZazBZTjo/H3H13l7W1NmsbXcaT\\nOU3TYjYrSJMGcZRysH9Mb8XQ67YolMO7Et3IWFlpMpockedDhGwxGPRptTOuXb/M7qMTrI24fv0G\\n/f4x5SRGOkn/cMgsX/CVr/4qzz7zPN95+VtYYzk7GzCeLFjMc/RmC18p8tyTLyz/xX/+X/P6j24x\\nn025enWLD73wNA8fPuR3fud3uHXrXdbWezSyBqdnA/LCcXY2YrFYYEzOF77ws7RaHf7wD77FaDSi\\n0+mSpglCyVpU7VBRSBPyPtg0g3La0R8c8frrr3Dt+iVWdy4xGfd5795t7v/bf82vxUkI77CBDJA1\\nS/3unVv86MGAZ597jmevX8day3e+8y0+dP0G128opACtwwYqRMCylilAQj1OalykGTlr0GgsLgQm\\n46iMrWUvQI1hSi3qIBCJtY7KhoqNQCQFgsnUUhzhgne9mabEOLQriRX4qjpPTqp8OIJXODIqWu1G\\niLUTHm9DrmYcC6SMUNaAUhSloSjzABtEF29Z6QObjK8QVZA4udrmquvnHowHICKBEbUY3gfJmapd\\nQVoJ0iTCO4OUiihKsC7YIq0NG5l3qoYLwgCNpAJ1kQMgtEJF+hyvDMlY9c9bKuI0YM9xGeIonTEY\\nVaG9PzcaCBHcaWmiUAIi6WmlCoElkY5m5GmmCiUVLouIo6XLUOB9xWqnQbeZ0W2mzPOCqrQ4ISmq\\nkqKsGA7HCGFrfN7VASfh5+mcoywtywzZc1WFA1MZftr1wWKiM8NZfwrWYaqAAQ0GA4QQtNothsMh\\n7U6TvKiYTku2tiIW05y93VOU1qikyc7lbS5tbZEvDHsP92mlGlPl5AvB4e4uOkopp5r13g7FMOel\\nV/4ND6+9glALVjaus725E8TyqsWlnRtkjRalKXjyiU16qxv8y9//I/7xP/iH/PIv/RLXr93k+997\\niI8942IOytFsJFy/foOz/iHbl7YYDUcc7A+YTAydjmU0O6PZbHNp5zmSuMXL330ZN1kQ6zb5fEHf\\nlvQHp7Q6bZ5/+imazZTGUNJqZuzu7XN0fIJQG0RaUVUlzgparSZKbXHtIx/iypUdJtMR/+r3/y+8\\nsbSbTWajUdABeksrzUijjOFwQr6wFLnlM5/9FO1mi/7oiF/48hc46x/Wbw7Nw/t7VNaQNTVZI2En\\n3ubaE0/y49deYW9/n+eff45f//W/xOVLT/CXfv03qCrLYjHHuYo0TZEq9AFZ5wKeKRSmKjHGkM8n\\n2CrlD/7w93nu+afofvGL7M8Ns+mI0/fehRuKJIkx3tVHVEekBHt7j5BPbtDttel2W+zuPmRra4s0\\naeGdwtXYlrUmvPiVrNlVS1UY1HnNhAidVKZE4jCOIMbXCkfAKo01QQakZe1AUlgqirKi8hrrJcZ4\\nrBMIXW/YzoahsmR1qwAJaanQOHQShcd0hjSNg34USbfRrFtkPTiLtWArgcNinaXbCnmnWiybmILU\\naMkaI6LgxnIXes5zSZAQiGVsnqRmqASVD9F51ntcXY+hhUTHmlQ3g77MS0pToazH1Vv38lputFLK\\n0ENmbcg3DV5bzoNAeEzrKsNhQCkFcRjCLopIsuY5iaNqyEOrUKwXCU8WS1Y6LRLlwuacKCJVDzpd\\nJ1digvZWSNSShRcJSRTIsdJY8jICL+m1m2gdM1vMmc/nKAKmbp2hLPNz/ejy+3QIjHW1tvhPvz5Y\\nx9IcVnpbHB+esb66xeHBHo1WA2cL0gY8u3UVrRVpY4ut7SGT0ZQbN29weHhGr7tGezVjPjxGrDXY\\nWl1js/MMk9kJjazGvTbbHO8POBvnxFGPNInpdFZpttpU1lGaiuOzPpKMVkOzf3wLKRSFmXF0dkBl\\nHJPRhOee/gi7Dx8wHPcpqhK8JWumuMrRaLTZO7hHq5WCKLDGsr29zXQyZ2+vD3pOVRm0bPHOW68x\\nHE/odVaptGFju8XB/i4rqyvceOI6eZ6zv7+H9Tl+Y52z0wFp2iCJGoxGo7qC2LCY5szmBYvOiMuX\\nPsbd90Z89IXnAccPf/Qy25fWGE8GvHXrLpsbmzz75JO8/O0fkueG9kYK3vA7v/PbXLq8zhv/7mUA\\nur0ueW4QImx2g/4AU3mevPkcH/3YCyRJwh9+/d+QZS2uP3HjXEr09q03UUpx/fp1oihktmbOh+Ok\\nDOc4VQcEl9WUH796nyyFh/fv8EpTs/bRT9MfHJ4zqcY4iDW2suf5olev7HDtZz5GlkWcnJzwzW9/\\nm1f2Tvnrf/k/qY/oj6eZW5wNR7CyzMOx0SyPn6HtVcoYYyrKvKyJG0dVGcqyPH9tGh/yRK0tz51E\\nztWh3T5464UMvU6RcueDXKrQK1XaEKfnsMGfH0miSBJn8lyS5IwMtcnOYr3FSYdRgqKqAgyhwVOT\\nW0uRfQ0zCCnrFKJA0giCSSGKFFonKHHh0rFeoJyrMT+FcA7lJFpZlvbGQKxp8JJFWeKpe4mkJ5ay\\nfuzQHbVUUCAivFDnM3qZDSAIA/tczgYgQQhLJDVe+/Ojdf1LQwgfYhO9AR+Ge6vVoN3Ows8PS6TD\\n60gu1QJKnFtJg8v60QAAIABJREFUVU2sISDSoGWM9Y5IRySRREpNq9IgFYlyZMqDSABHURRUTqNq\\nCZsxBik1kdL11/8zjImWpaGazUgziFPPpSuXmYxHKK3pdTOMndNMO+w+eoSSgpVeizj1/MwnP4Kp\\nJLEumEQLytmAUZETR02219fZ23uEcYKN9avkc8Fp/4hZPscBl29cI04New8esZNdobd2idFwjtUx\\nOE3W6uDmEdNHD+l0uly61GaRj7l//z2Gk2OSRNBdWQE8Thn6wxO8MDRbXfLFgrOzEwQNWq028znE\\nKsVax4P7d/AWWnGHXnuN6XzIwf4JrXYP0Ny794Bf+fO/QpJGvPTSN7hz5z5P3nyamzefZDAYcnw8\\nxiwCGP/o/i7WWJTzOP+zxHHE008/zeHhPjeeeoLJBAajfa5c2mYynfHw0SPSRhTIpHzKq6/9gMoY\\nbr93Agi0jJnOS9rNDKTn+GxEnKRcvXqVv/Dr/z7f/tb3McbwlV/+Gr/wC18MP1+b02ptc+XKJfJ8\\nXmfCpkih6s3Pn0tvjDF4HIdHe/QHB4wnJ6RpysHhA+7bCh0JZKzDUbMyxEkEWuFc0PDNJgPuvfpD\\n+uMJP/fhD7G2tsaXn/84ve5qIC1qprgs8/Nys6o0tWwInCvxXqF1FBhfW+GdI2vUumAvWBQGbwxa\\nJ1jvsUZgZCCTzo+lwtHIkpCzUPv0K1ehtEZIqIocYwVlWeCiCJXEpFpQOhuaN/EIb8myoC6QNenh\\nvMCIsCnHUVQzxo5FbjHeU5mAHbola05Adm3NmC/rSbySqEgTRwFT9cv0JB9K3exjbLrXkqh270iW\\nInWNsWFTBRDnYSdL91SQbi2dQl4JFCpYVetnJWqdZfAV1E2gNR66lFSJWpdp668bYJCAS0sE+JDQ\\nnyYxSRSFhlspavyyLp6rtadeLDWeNXPn6ogXKfGVCd9fffMxrkKIUDGURk1KGzDiNIvPf8eLxYKi\\nskE6J1VNyF7cXP+k6wMdop2VLsP+Ec1Wiooco8EMJVO01oxGY3QsKArDbD4j0op2N2I8PuTSzg0O\\nDofsH5wQRTCZD8lSy6WdHrt7JwwHOUkace/+HZx3tLsaFTta3YhFMSRtNohiGB6ekUhNURoGgxFJ\\nukoUB79xr7NKv3/KpZ0d7t+/T5wYusRkrZTpPMc6SDysr6/hKEAI4iSjt7bKdDil3WqSNVKGo1OU\\n8ly7doXV3mVe/Mwv0u2s8ff/4e8xnfZZX1/j7KzPweEe+we7fPWrX2Xv4IjuygbrK6uYSnD71n3W\\netskUYfTk2OiOKGRNfj8i58F5/n+935EmqaMxgOiVGJMwXQ64aw/oNns4awn0inraxvs7h3ws597\\nkSLPORvssrqyhfcST8VkPqSRJbSbTba2rvI3/+Z/yfraBu/cepe/8Gu/zjNPP8dkesZL3/p37B/e\\n48PP/xyf+JkXODre5fU3XuOVH72CjuNay1mhdChiS5MmOM/L3/kGxk1Y3+ixubnJyd59VJrw1ms/\\n5tnZFGihlMYYC1R4L1ERnPWP+PHhiChr88Nixkc//mmSnS3iRLNYLIjjuGbd319jEavazit0GLbe\\ngbMoBCu9FZwsscZjXBj01obNTtaJSc4G95OSgahJlCBOA75aFAWVVWSxoKpyFIJWpnn48CHT6ZQP\\nf+hDYCxKZSGtyS8ZeoXwAoxDCgMClBBBh2pDkpPFUxrHaDbDeEXlA8kTtD614kGGLdW6eoSJQPJb\\nL4Lzy5pzt431Ad80zi6FUGETtrUDqh4g1vqa9bYXZog6hQpXp9nXWlkhL/DlQPLLmoq82Nsed1LB\\n0np7cTQON7zayeQrlIBYKdK4SRbJ4KMn6GdDlmn4/pfEm3XUaggZTj11wtT58/LB2mmMw/gKhENJ\\nSVTfaLVVVPVNUimFqQIWnxhHZT1VWW/5j30Pf9L1gQ7R4+Mjur2UVitjOJhQFiGQYHVtheHogE47\\nvAlv3rhBt9thkY9YXevy1puvMxrlqHiN05MzoigBBbu1TMg4S7UomIwHJGnEzqUdFrMF3hUcHDxi\\nMJCkqWQxOmUYGTa2NkiaKf3hgCqPSaKUS5sr+HIGpqCYD+l0mggfOt4bcYvjswFRKrBWBeY9SWmk\\ngRhImglCWWbjKRJFlqaMRjM2N+D2ndcxBn7+57/A62/8gAf3d5nOpjSyhNt3b9P/e4Nzgf0TN27y\\nd3/v94iJmc1yXvjI8whRUhYFvW6bb730EisrqywWBZ/97OdYXe9S2SnffvkbDCcTtnZ2yNIOh4en\\nLIqKlW6XrU3Ho919Yh2h4zaomHarzcnJAYPRlEWRo3XCvXv3+Ft/67+h0+kym8/pddu8e/ct3njz\\nFdqtiHY35t69u2xudfne97/D3XfvM5oMQ65k/fu19WAyVUWWJVRmjlAl9x/c4eGje3Rjz6c//0Wm\\nZ8ekB+9AXRYnhQzHZS9wxlIWMxZFxeVr1+k2WnjvaTabod5FCPI8D/pIpSnLkEy0ubUOtdd7Mpmg\\nowhnPHk+p9fr0UgzKudrogfajSaucowmCzyGOE6JIkWWRSA83oJSgkiBjiSdrEE8tRTFglRbDg73\\nODk55vT0lI9//BO0tEclKdYGc4AWikhopFfks5JIhdbZpWtLC43zFms8pXPklcXLuLaBBilWaD8O\\nR1/r62NzPbwE9XHaeUwVyD1r7XmrA1BLpkIaKR6qygT1lpL18Ckoy4rCVCAUCBXUAMs555eBziq4\\nAYRHyAtn07n/HM41wxAGqaotmkv5xpKIC/F3odlKY2mkEa0sJlWh8sRbgxWgIlXDMXVDqrX46iKn\\n1Pnl1nyhNfWq7k2rdbvLbXspY4pEyBmAGh/GhyO8t+SLBUVZ1brWn46Jqt/6rd/6rf9vo/D//fXf\\n/4+/TbfboyxypuMZjUaKUIIkgmYrQWpPkoakems9+3unjEclpycTFvOSRRmR5452p4u1lrPBCWkj\\n4E+jYR8VyRqYT5nOCvK8IGskVGVFp93DE/Cr01GfRrOFJ7x5R+M+d955m+l8TDNNWe2tEkcRD+7f\\nI58XpDqlETdx0tQyHk2apDgHZVmytrbG0fEhZb4Id3fj8MZRVjNG41M8FcPBiMqMQXqm0wlCGrww\\n5EWON/Do0SPu3n0XrSSXL11BSsnNm1d58qknOD09DFIh4UAItrZ2+Nt/+7/lU5/5JLdvv8Frb77C\\nYjGlLCucC0LvbrdLZSrSLME6x5NP3mBz6wpvvfk28/mM4XjEysoq3mhm05xWo0X/7AxjC6bjAW+9\\n/Qq377zOeHJGv3+K95KbNz/M3/v7/xtvvv0aZ2d9WlmPk+M+znuSLEaKYJc0lSNO4PKVFYpqyHwx\\nRivNdHDI9269Qz6b8UQx4SPasp2G7THIiTwjnfK20eSrO7z8ve+z9+57nPVHXPvQR1hvdzHGMh6P\\ngTBEAdrtFs1WyiKfMp+Omc+mtFstsixBCkWz2cLZ0PBoKo81Fq0jnDUUxYJYadIsptEI4Sx4Q6Qg\\nUp4s0TSTGFPkNLKMyfCUH7/yMv2Tfd5+80ecnexz9dIWaaKJouh8G1uK150LsXpRFIc0qxpv9AKs\\nExSVozAwXhQsKkuFxkqNkwonFUJqvJR4qZCWQGYRwqgjVfcD1RpMa835AA3SqLripN7ohA/2Tmpn\\nkrWW0oTIOiGDe8t7GWpQwiG8Hp7h76SWj22J4tx1JUXta6cW/4sLxcNSLytlWJ0F4egeCYgUtJKY\\nZqrCEd+WaBVaVNNIk8QxOopYWj7Pp3Z9Bc/BkoCrh3v9sxFSo3UUQtelDGEmznDRkU6IM3SesixZ\\n5GVg8YPElqduXP5T59gHm+IkIx49PKDXDno14+Y89dQzjIcDzgYndLoN+qd7SFIOFxDrLidHFYoV\\nysUZRhi63VW2N7a5e/ctdOLprTY5Oz2lvdrDVp5+f8Z0OkBh2dxcZb4o2dp6Imgnt2LeuXObZrPD\\npLI0sx4Gz3A6wvgcLTTHx0dcv/okWxvbHO8fMZkOWe+uoLVmUHmMESymAyodXgQrKyscnxwDlihR\\nJEmT+bTgbDCkMEM2Ntr4kWEicjxDptOSzc0VrF1QugpTOc4GZ8Q65tHuA7IsY3PjEj/381/iey9/\\nE+OnRNqTZRFra12k9jQaEW+8+Sr/6J/8H7x16xWgoNVOWSxKTk8PSKIMpTVpmtAf9Dk9GQRMs7GF\\njiKm0xHj6RRBhBIJWrVJsgabaUKjmfH0Ux/nnXfeIE7DG+Lh/QfcfucB3/n2W+jEsrrWosg9i1ke\\ncDARNkhRM8+qjnazzjAaDyiKnEbSoiwWnEwrtq53ybIG3s+AsKxoIXHLo6KxvPnW68G/nkRsb2+z\\nurpKt9vl4cOHLBYL2u0OQgiazSYrKyvs7t0nX4Sow+3tbdqdDCliktgHKYsQ2MrjjMNYS6ojkkiT\\nJpo4SQJrLh0Ig5a1/pPAEk8nE370/e+hWx0uX9lif/ce2zvrvP3GD5FK8nIn5cXPfQmODrl27cmA\\ne9sgB3KVI0vic32kl/VAEKHCxtT4ZWkc6AghI6SIQ66o97g6mcp7T6yiwNQ7QtFgfSQ3tgq8jg8K\\nB4TEiVrvuexiFyHqLdRr+IvaESGQOqpzJIKEahlTHPSSF5FyXlqW8rFgI6UekvWR2i/dWMswE3/+\\nGABJpLHOhNgVF7S5WgVn1bLeWAlJFifhhlQrH5abJVDXO19sikKoUNDnL0KgpdQgPUrWGPS5o8zV\\nLjJXmxVqnqaq0ErgnHzsuf/p1werEx0N0KScHYJRGZUb49RDLm+sEtNhcGhYWE3SyzgZnpBEFU9e\\nv0plcmbKo4spkTRsr16m275J5UsWs4LVZIfh8ZTxeMZ0MSVuaUQa8WAwZqO3DqbJ5UaL+5MJP/Ph\\nL1GUU7ypGJ3tkmVNYuFZX91ESsl8NmdW9clHI9Ke5mSSczg8ZmNtkyxOOBmFFCetekRRymCcU+YK\\nYyyrayuUxYLxdADeMh1rhJQ888w29+/fR8cFs8mMzlqPlB5RZeiPh4z6QyIZg42ZTy2P9vfxSnJ3\\nd5efffEz3HrnLUbzIT1GTHoLaE740Z3XmC0WTE+nHJyc0FxbZ2X7OqNHBygE7SRhNh0RRZLNS5sY\\nwBQlrWaDw8Mh1y7frK2SBUkMw8GIj3zk45Rlwbv33qWyDjNP2Ni8jGHMYHbMimqAc8z2BrSaLSbz\\nAoEHIUMMnnBABaLEWqgKRSu7zKj/gL7Nudpdx2XrRJ0NpmeHoA3CGbSESubgUlKXIKaaYigQrZTx\\nYsJsdspg/x5XWl12H95hda2FVAnWJjy8v6DV6HB6fEJnRXL1iU2qQmPKhO9972WyRsTzz32YvCgx\\nrqCsDM5H+MJSGkWStDG2riI+F6hbdBSCrx/sH9PpbjAsJO+9/S95avA0rY7gjTdfYTpb4K1kpb1O\\nQzeYTBZ8949e4itf+UrA3WQIGs5SXWtZbQ0gSqqqorKSRe5ZVAqpGmilMcJj/QIlwtD0XhBSPyKy\\naI73AlOFDdO4ClToc7JGIGxEHDeCkwmLlDmq3lSdA6kWWDKk6uCEIIotRd4njjUlMZWPMFi0svhq\\nTiQjpNM4qXFeoU2BixWl8Aitgq7XOWIkyhqkd1TaU8q67iP3RE7htGYhPJ6YSCcoW6FlRSuWqKpA\\nFh4tIGu1SdIIdPjjhcTV5YfOVjgqIq0RaIzxeLOs9RBopc9TsHzdAAAhjEDWsIIVnkWxII6y+jVb\\n4aVHxxrrS6RzeK9QIv6pc+yDHaJWARXoAq09ynvILfNRxWQ0o/KS9sYG0zyn2+qhjCEWmv3dU5qN\\nLs2NQBAcHh/gqCiLnG53g9sP77OYGbyXpFkLoQJbrCiI1CK8uRsd1lUS+nKcBKE4OjxFySFKxeR5\\nyXw2J0pijk/3uXHjOh7H9vYWpyd9Fs0Gq+s9hOiT5zlJXGIrw+BsiDHBcbS0yeEdzUaTK1evECUp\\nt2+/i3OWRpZgyBmcTUl1wmg44eT4mLWVdbQOBNZwOEZJzdtvvU2kBA/vPaTXbDObT5hYz2z3gM9+\\n4Yt85sOf4DNPf5j/7uCQg5NjzGTBMD9gq9nGiur/Ye7NgiRLz/O855z/P1vuWZW1dfXeM5h9BgNg\\nBgsJUsAAXACRJmkaIcuWJTIcclh2MHTlO0u+kCNsRzgkhWwxJDGCNEHSEk2aIEiAEACKINZZMEtj\\nMN3Te3d17ZVVuZ2TZ/sXX/zZTd0Yt8NzWTdZmXnyO9//fe/7vESNhJPpMXWtWB6soAzUU4UqKs6f\\nu0C73aRWU9I0pddbZqnfYz6fUtWG8UmKVpqqnoMvOHP+FFk+IU1nBLGg3WowGo+x2t1OZTWn2YyJ\\no4giLxagZEOez6lNgScllTZgBY2kzd7eIRcKCw25kLcspI/WdWm9Xp+VKmIvGzNPc7a2dsiyHNAY\\nW7C7f0Tc8mgkTe7t/BBPjrmzdYP2uMGZ0+cpC7h58zpf+vKf8LGPfYSnnnqcosjIVYXwI2pVMZ3l\\nC1eOptF0DhbXWXkkUeBE2kLw6svfY2mwxuapNb72tdtcvfou3W6fne09JtMp7Wab6XSKMYarV9/h\\n5s3bfOxjH2M0GrGxvsrKygpgiGPnqvK1m2kq7ZHnFarWi//DKQgCKRZdkQVTIxHgO3RdQIUvJNYT\\nWN/9RQagjI/RknRWYo0LXvY9jWN3WkTgjrah8KlNQK0NRVVjlHbhd1bAfyzdMhYhJJEfLI7RFoQm\\n9K3rJI1253HfQ2uDZwTWk5S+oUKBsaiyQgQJc2UfslY9r0BViob0kdKiTY7wNGEU02wki4WhUwkY\\nox4K+Y014IP0I/C8RbzPA6ebh37QVQuBUhVKuV1LtUD31XXFZDSm1WkymUzodSVmYfH0PInWxUMY\\njVWg6r/G2/mlwQZJrGn3Jcv9Htv39l33NSlJ5y4hshxNwEAkfOo6Z3x4SK/RJo5bWDll/3AXX8Dq\\ncp86z6jmKUk7cu/ME3g4wbJHRTsRnFqOqauCw0lGv9vFWk3SajKZjNAKal3jeYaiqJxdrCiIY8nu\\n7g6zdMba6jrtTpOqyhmNLNYq1tfXOBlO0MrljfvC4+R4xGB1gDaaSxffh7aKstRoW9JsdBkeH5Pt\\nT8BajuopSRhTVBVCNJGygVKGfFYQByHHR0O0qnny+edYHfS4d+cWGMg1/PhPfoJes8/z73uaf/Wv\\nf53dw2NEELofiYHJ8AjZTChQnDp7nnQ4IiJ00N7QQ4SJ81gLzYWLG2htCIIYIXxG4xGbp07z0Y98\\nlD/94leo6py9vW2WB0tEUUxdl45fqQ2nNzcYHs3IJgVxFGGsWcQeh+4hkzg/5+h49NC2d1TUBEtn\\nGQ4nTMsS24sW8zntoh4W5Hc/AF/A2to6z77wPO+8fYVmq8tkOuLazats79zgB1deYXNzg8PDfX74\\n7jfo91YYXy1pJF2wgh+8/SYnowMnt7KWIPQ5nmuuX/sBa6unCYIIay29XosgEGhVOe6mVihtiGJB\\nt9Xk/LlNvvJnX6XRaDEeT5lMJuzs7hP4AYGQzLKUtbUV1tZX2d/f5bHHHmWWjpilIy4mZwgjn6Ko\\nKKsKT4TMqxrfczEl81wv0kYVgW/xA7OIZXYmAN/3CYSP8FwX203c94x1CQLGKDwBdQ2Vsqi5kwIJ\\nIZDBogAZiychkD6RAN9qPK0x1mlehXAeckc7chR7PIOtFiF7Foyt3NLQQCAk0jpJmRFuQYYfkCmD\\nCh3LNPEEYRRQakMl3WjB93ykXyOE04YqXdNMBI0gwBeu4AthnZ1VOASit5A1Gb3gw3pOKuZynOr/\\nSJnhgCZlURFFEXWtmc/nTuRlDUHocXi8x5VrQ9bXTruYn7hFq9mlrBTSDyjrwhkbVO2IXj/iek+L\\naFaktHvLqLzirTs/pJgpWs0uyvh4QYTWNYG2aKXI84pGIohCx2WMhKL0QQYBnXaLUEhOn1qlqAza\\n97m/v0+cRNhaMTwas7mxTqdl2N26R20bjKfbPPvEB2m2EqbTjJPREXHcJM0yBL6zvakKpWrq2mNp\\nqUsUxmRZijUetVZM0xRrXcENogAfnzDyqcoSpWr2dnfoL/XY39+n0+3z0qde4u/9vV/h5o3b/Pqv\\n/0vu3btLq91iNptRWY+sVC6lUgb4KAbLy4QyYHd7i/W1FWxdOWC00dRagRfzysuv84Gnn+Of/Yt/\\nwfWb1zGhpPAkZV0gS0sQh+gAprMJ/d4SEsk8zZFRQK/f4WQ45vb+PR6NzyHm5cObcGd7l83T6yhV\\ncnJyjC+cVq/VW2J5aY1r727hex5xKLn06EWGhyPiQDqbpee5FFHvQd6OT1EUVIViOssoiszRgFYi\\n7u/uMc9LhIzcQ0x5SAR1rfE9jYx9ptMTDo5OeOYjH+XOnZsYa7lx4zqvfOs7vPzqt0Gk9LKEk9E+\\naTpjbW2N69dvcufWIY+/7wOMp2P+8lvfZJ5VzOdQ1YDns3X/Pm9evozvXeWpp57hkYsXENIjjKTz\\nzlsPuZD5CAP3795Blzn7O7d5/KmnkSLARzJJxzSbLeZVQbPZ5Dsvf4dvfvObeJ7g4z/x43i+YX1j\\nhW6vxc2b1/jCF75Ao9Hg05/5eebzinZngDWSeeE+fxkKGu14oYt0RClPSOIoIggEWMdDaAY+UoiH\\nlKHq4RzSYKwhDhyExPNByEWXZZ0kSvpgVAYGhCdIAuHGAsajUhpPSPfdBQJjXbS1sT6+8PEETnNJ\\njMaA1XhOPIoyzsbpCQ/fNwSehKpGGe027B4On2fhgSTJM25t1WjENEMfzyz0xXWJxHM6XHyEDMFY\\nSuVUF3XtOusHJe7BZh4M2jgJVZ6XDw0ZZTnn7t1bLA+67Oxscf/+fbI0p5F0efyJ9wM+wg+YTEdY\\nWyMCQRBCmo1/ZB17T4vowfCYeTonIGA2UsRNyck0o8Z55htC0oxDKmUoap+k2yOtDUkErSVJPrG0\\n4i579485f36DSXpEFAUMxyf0e03kAn7cLiTWltR1g6IQtDoN6BiuXPkB6+vrDFb7CF9wtH+M0opm\\n0iIKQ4TnkdYKVWumk4w4iTk6GFMpw5nTm1gPsmxOr9en1Wpx68ZdhBZo427iTruNqpxwN8/mJHGL\\nM6cvMB7N6XYHCHOXbqMF2jJNZzTimHlRMBweIDT4nmSp06Lf79FddEi7B3usrA2oqoqDg5z7d+9x\\nvH/EG2+9SVYVzvGiDaEQyG5AEMYk3RYN3WZjZZ17R9dZ6vWRjZg792/RbnZ57H0XCOOQujaURY6u\\nS9Y31jhz9gzXrl/jaP+7rKxu0O12uXd/m3RSMeivonRBsx1zcHCA9AOqqkb4HqquCcO/kpI4XGCE\\n5/tEQUyv12Y8HpNEjmy/tBQT5GM0FVI6yUkQLBYEpkL4Cb1Og7v3rmFHQ9JZwVuXX2W4c0Kazcjy\\nHcYTSRAkqNqSp4JANuj31wiigB++8xYnoxFxuMTwMOPWzW1kYLm3dYvj4yFGCz71yU/TaDTwrUVV\\npbNNepIH+e27uztcvXqVH77zJofHh9Q/fB2NZJKleJ7HeOwANEEQMM8zrr97g+efe57XX3+Fg4Md\\nfvEXfxFfGN5863W++71v8gu/8AsoC+NpitIBvhfQanVcF4yjFwXCbZgJfEIhCWXguKrGOFBy7S26\\n1MXx1RqXGOAJfCmJOk2KSlMp51VfBGXAgmAUeo4boD1XZDzPR3uA72GczeshbCWUAcZqKlWAJ8GT\\nDiaCkxaE1iewHngKT5R4uqChDBiBVmCFpMrnbs4cRihtMYsZcRQmNMLEMaqUcvpQz82g8SRCPIi5\\n9vEXiyyx0NU6kb2LXjHYhWTMx2genjqcVlQRxzHGGG7fvs3169fJixnj8YSPffQTeJ5HVSlGkwlR\\nHFCUOQe7WwwGfW7e+CHwmf/fOvaeFlEfSVEIfNmgkcQYU6NNQa0q6mKCFJZAtOgt9zAy4mB4QhIH\\nYGsmkwllqhnNJ2Rzy7Wbu8QtRRylrK+vYUonIjaRIZIR0ouRImZEQTqtMVaRtNpM0hN6Sw1W11bR\\nRoPvs729QxDEKOM2epNJThg0MUoSxy0oKvb3TjBeRrPZcln2ozF4hkajRafdJs1nYJ2kBQsKQ1VV\\n1LUmDGKEHzIcH5EWMwc/waPVbLK6ssLZs2e5e2+Lre0dSHr8zGc/xeXLb3IwPMBajZA+zThhfDJ2\\nnnpVsbO/R2u5h7Aej26e5ehwH4ngcGebM/45Nlc3eOO7b5DOM9KyZGNznaoq0M2IuJEwGU9oNjsI\\n4VweeZlR1ppQxpw+s8nFixc5PBiTzmsOD4/pdlsMlpZgMa8qS8WDeF4pJb7nbmaxYE0WZYnnB/T6\\ny0BFq9HB9zXj0QStwEiFXQiira2plcXDxTcsLfc4lfjcPNojoKbdjjn/yCaSOcrzaXYGBIHgeDih\\n1VjhxvVtkqRFt9fmN37z/yAMPRAV/eUejXaDdrfLy698hy/80R9gjeTjP/5JpPSJQ+mOkvyVllFr\\n53Da2tnFeD61haXBEodH+0xThS/cEq0oKuIkptfrsr19z0mkOgnbO1tMpiM+/VMv8cU//iO+9rWv\\ncvr0JkkSc+XtK5w7e4H11QGT8QyjSqJGB9+XaFPiGUMYCIIgWHjzNbpWYJ2eUePYqdooHnSfaAde\\niWRArT0CYdD6Ic7ZSapwIX7aa7igO8VCi8qC0+q55RoBwvMQi6KOrQgDje9FbhlnZ+C7k6IoDCav\\nqeqMeXXEbLTL8c4uUdDj7OMfoLG8Tpw0UFUFtQYEWOlo/bWPMhoT+eBLrIWycEyAsBkjA5+qrCnq\\nYkFjMkS+QEjxcAPv7rXF+9NQ1xXWOiOESwvVFIWDs9y4cYt797aIEsv62hlqXQOaqpoTSp+yzLj6\\n7mX+6Au/z/MfeNp1/z/iek+LqCdjAimRgcfoxGkyY9lgeblHHAkOD7cxNidIBtzZ3SXNKjxa1FWG\\nmkpEJPH9BnGrwSQfESApS0Ov0STViko5oInSClNlnNk4w2OPPs79+zvcu3+fONFcunSROE6I45jT\\np89S1zWB0Kd2AAAgAElEQVTD4YiiqJBScjA6IopCxuMxcRwDgmazQ10pKlNQlopGQyKEpJk06HRa\\ngCWOYpRWpGnB+bNn2Ds4YDbLUEoRBKH7oaAp8ww0vPjccyx1ety+fYuTvT2ydEpeVNzb3+Y7b7zM\\n0cERrWYTlReM947xtUWT4OkazyqSTkycCNb7a6RDl4gZex6tpQHtUmOHGS88/wLv//hH+fKffJG3\\nvv86cS/BWMPx+Ji60KRpzmR6TLfXpCwqXv7em2xunMaiODwecebcRY5HBc14Rhz51FVNWWfURYnn\\nCZJkCechcYDbMAyYmTnGWOIkZp5mlPWcwWCZySRlPM3wop5byI3H2F6M8Wq3/BBu1up5Pvm85Pbt\\nfZLVPvnsAM9TvPLqd1ntGwYrHY6OKk5OJsRxTF7nLMap1Caj1w85Ojlils4R3l3G6R6Hx7toa5iM\\n9+l318mmU974/qt85jM/g64VnnQdksawf7RDf6nL7sE+3/7OX7K1e49GQzKdF/gypiwLwiik3Wlj\\nTE1RFAsrp+XWzRsEYYQxmi996Uv8zu98nn63y2c/+1mMMZzZOMWF82fxPIFcbjt024NYEQShv7Bm\\nehZjK9BuJmmth1aC3DpsX70AkKhaQeUSMINALQhFxo1irJNYObK+s5Eq+8DuqLHGCeJVNSdOBL7v\\nHmpK5aSTKaVKUfXEid9VQJFb8vldiqKinld4FehCYXSBkDmmTlFlxfue+zF+7pMf4fZhyq39IUHc\\nQRkPaQS1rgkW0S6mnNOMQsLEc9DpShEnchEot4is1qBqg7EKrWviRPKAwh+EAVotANCqptYOYnN8\\ncogxisOjfe7du/Mwg6ndbnN0fMdB0Akx2uPC+cdothIO7tzlK1/+Y06OdvnONw+Q4Y8uk+9tUJ3R\\nbpsYjgi6BWVR0EmWaSaCKNKsrMQ0Ox1GsyGDpSaDQZc6nRPKLmdXTzEuD/HDBnd3d5CyQoqYzdUN\\nZNhABHMwNb4n2d8d0kpiimJKb6nJpUcvkhZwar0Hi2MC1kFtkYLHHnmCvCwR0nvojCmrAoylqCq0\\nrun1OuQLWroxMJuOabVdVzqZTplNpsSNiI31dYoqZ21tlaoqnKMpihBBgK9ASgFo9vb2EJ5Hf3mZ\\nd65fI2412Ti9yjidEnghrXYbVSkskuXVU+xvO1BJYCynN5bZuHSGSVWyff8+sXb0oFajSTdqcr63\\nBjIhPnuat69dY//4mNXlVQ6zEw4PR/S6LWQgCUJ48cUX2NraIokk5565xLvv3mI8PmZn94ituwcs\\nLS/z7HNPsLu/Rbc7IJ0K5mLOyvIah0cTtNEOT2YtVVUThhHzeY42DmgxHk8pioI0TTm72cPTITKQ\\npJlbvta1JUwWgAnr49sA4YecHE/wjSKsHNhkd3+Pap6RzaDMfZRS0FFYY+n12rTbLZKmxzg9wvM8\\nVlbXCIKI3b27fP53fpPpuML3NPNsymw240MffJGqcpn101lGr9sF4MqNa5RlxrXrV9k7OmL/4Igw\\n9jmZzkDNCQJBFEdUVUVZFihVsbK6wvRkSjZPUdMZaMPXv/41Wq02daX5kz/5U/r9Pj/fOUv0REBV\\nF8ShIC/drNPTCweRcUAMY5U7gQgX7VLUmqqqmC+Kp2fd8dbZOp2t1ZcCrSu00WhtHOTE2AXWbiHf\\nsgZMha4L6rJkms3Z27lHFAO2IsvmFLliNBzhexpj5i5AzoboyoNwSERMSAzGw6oKgUZaS1HBqVOn\\n+ezPfILf+hf/Gy9+4rOcGmxw5zgjkC0CC2GgkbZy2EQLWTpC54pWEmOVJYqb5HlGWc1RxqPZXCZq\\nxihTU1VzptM5deVgMwZBValFoKFGeIainHLt+jscHu4xGh8xmUweaj7LBZxmb38XIRs0m+773tzc\\nREjDzVtXEVJD5ePV/MjrPS2irdAQNXyWN/tYzyCspJyWLLcC8qJAxiHWg16zRVEU9FoxxB0mo4KD\\n0ZDUTLhwqccHNy4yHR0xm86oqpI3336HJI4RvmQ8GtGMI5pxTFHmzGZj9ofbNNt9zi5oRHWt0doj\\nkA18zyCaEd2uc2LEcczdu7cpq4I0nboPTfhs724hQ7fxDEVMFMSMxzM3DA8lFy+dxxeCTrvNLE0R\\nD4TNdYkQPp1Wg55MWBmssjM8YO/omL2TEywQxBGtXg+0wRQVorJMdk8IG26DXyqFbSS0PEOvETPY\\nWGI8HzOvFfNihtE+y4MBOvDJ6oK7u9t4RFx/6022RgeIUNIPY6SEMIjxvNjp6kzN3u6Qc2ce4/n3\\nv0C73WZ76wCsx3g0ZjpLSRoh/lIDayz7+/sMlrq0Wk4qcjI8JpDyIWNSyAC74GeqWpMkDeIkochz\\nNtY3KIops0Lh+ZJm0y1IfJ+Hjhlr3LGzLGqOD0Z4uqYnalqtiDQtmRwOMXWTbmcFGTQ4OTphsLrE\\nyvIas9mM8WxOWWrKHHQgODoYcf5MxKVHL/DlL3+Voi7o9TdpdbtYX5DOK4LAQxmPvNLEYcgzzz3N\\nl//sC9y8fZ3RdIz1fYYnU8K4ST6Z0+t1yNLM2QmFR6vVYTadoq2hnudEUUKn32NyMubg8JBz584x\\nmU0AWFtdRSnlYp+1ds48tfDXG4HUekFid52X9YQbnVQaVUNu1YIC73zfRmuXLS89irriYQKq9Rew\\nD4H0A5R1gvVQ5fheyXS0w/dfe5Uyr93SVLlgSGM0wg/xjCsTURBjVOVITCHYqIcpffAiF7YnLcaX\\n5NoSdwf84uf+Nt/6xl9y6+1X2dm6w3/7P/4vDCcaZXOkLxGicEd6o/FNST4fMy0mRBubNOKYfD4j\\nLzXj8Zj+8hpap3h+RZ7nzOepA7IYh8HzPUm9YCf4nqEoZ+zv3ubd61e5c/sa2lS0Wg2azSbz+Zx2\\nrwPeEmVhmE6nvP32Zfb29vjoRz+MLwzr66ts797D8yW9Xu9H1rH3tIg2pGWp1UFNaqyviLoeXsdn\\nXEypag/hdQhlk2Yj5PbBDSZHY2QQIoME41lm2hFkqmxGMwqwSYe6BDQcHYxZGbRY6vVY7W8ymU6x\\n0jKrLX4Q0GsnTKZjpAgwxmc2zYhj+7Ddr6oKz7N0mg06nQ7b29sEUeRSPKXH7NYY6beI45hms8HB\\n/oHb5CvF0nLfRQSrkp3JmHanQ55nzNKJI3JHCVIKamUZnowJg4jSOijw8uoyUgjWT21w893rZGnK\\n7r07rA0GFLXi+PgE7cGjTzxJ284xVhE0I+YnM4SUnF1fJzsY00ua1EaxN9wnqAXFpCTqDejGLQpq\\n0rqg1Q7Y3DzDbDpfPKVhamrOnHqKd354k1pl/Jd/57/g85//PYqyJJ9PyeYzrl4ZM88rmu0Ws/mc\\ncp4xHs8IoxZVqVzKovAcIf4BB8062lGr2cAoxXQ2I02PCZdOg3W57MYI8KSzK/puaeAZi28d0znx\\nIgbLy8xmGbOqRJYtuu0BqoLJZIIMQuapYhZmHA+PqWzBxsYqR4d7GJ1RFYL9gxlrGzWVmtBdWmaw\\nvsGHP/Zxilqj8fFkCCKkrCwicJEf23v3Mbbi/vYWUoZ4FkI/hMQwmUwBQxRHrPQHzOeZm+nVFZ12\\nl0BIbt24jed5rK2uM5/l+NLnb/7cf0J/aYnRdAI4hF5V1WjrIkVAQyixtaM0adzn4XbvoNFEMnCj\\nk0WSnL8gbBq9ACPrmqqq6Xb7GOujlKGqHZRYGU1ka9L0mO+//JcU8zlh0EQZj0YYoXROI4woi8oJ\\nnkSMVhCHDaqicK4jFVErCzJE+NrBPKKAvLL8rc/9bXZubfPtP/v3nOk2GGWH/Olv/Z987u//Q16/\\nvoXfaCKFc4MJPKqiRqs5SSzBUyhVkM5m7O5uc/7iBcajKdn8GM+PiMLEmQrK2oXOIbDeIscJQxxI\\n4jjG8wRFXiFEQLOZMJ4cu0bIh/VTa4QiZmVwiu2dA7TSlGXG4dEuW1v3SBoRRVGgKs/pUX/E9R5T\\nnFbpBC2y0ZDheExwpkV7Y40f/7mfp908xb0bO7zynW9z4eITfOZnP8fOzh6/+3u/x5kzZ/npz34a\\n5fV469tfoi5Knnj/h1haOcuV19/Am77G6dNdMjw80eLo+IgAn6xSHBwM6TbbxIyQ0tDp9CjznDQt\\n2EiaxHFMWeYLUIF7kjeimFazRRRHjMdO7jAYDMjmJb1en9l0glKaKI5pyzZ1UVORUxYlqxtrjMdj\\nOp2ey36pa5KkSbfbpbu+zng8pq4KGkmTosjRVUV/uc/BnpvFRYmP8CVFXRAEEe2k4ZBhaU4V1Yg4\\noBbON72UdIk8w159wmarx8F0RDbO0AoCQrrCpx9GHFWKMvDIs5xGHHPr+h2MdnlRUdTi5vU7hFHI\\nS5/6Cd555wp1XdLttCmrGVY7J4lWGarWVFXtYBkGqrLEWLeMcPEnFVrbh5vUqnTRDdZa6qJmKRK0\\n2w2M9ZF54IhEnsRfzPG1MSBrwkiyfmpAnUSks5QsL9E2JvYjDo6OMLqk020DgqoS7O0ekLQjyvGM\\n3d19sJJTG6dJMzh9+jTT2TFxU5Nrwcl0zq37OwSNZfqNJpnShELi+wHZvGAyG5PNZxyf7LOxukye\\nl4BPXRVEkZO8dbodglCQZZlzJQFRGDGZTGg1W4RxSLvVZTweY2rF008/TbPZ5Hvff5WVwRpnz19C\\nKU0QJPhAVZdu0268h7EW4OP7Bm+Ry2StBuVgJODoSb7vuvkH4nPhCdrtLr4vXcemWQBiJHEQoMqM\\nV7//OvNCucJkfUfHrwyhjBgeHNLtdpFCggdKV1gjCAKDqWtsHdOQErwCpd3CMy0Lfu6znyXWc/74\\n9z/PhV4H680J2jF33/gu3//SGZ5+6We5cjgkkjFhIMBaOr02DWk4Pjzgzq0bzCZT3v/+5+h0Omjl\\n8r2UHjPP64X204FtPCmQkRuCexLAIAOfOAjYPHOO23duUBYFxtQIPyMvUpSpuXfvHulE0Wn3OHv6\\nLKPJmGazyWuvvcrR0QGzdMJgaZk0yxiP0x9Zx97TInrnaIbOMtb8ir/1yz/Nazeu0TnzFN3WOQaD\\n87zw3Evs7x/xyFPPo/yA/+zv/CKES5wc7xHIJh//0E/x5MYKr73+TZ54/hOsrF/ghUvP8Maf5VR+\\nytWZ5q1bM6hqfCrWN1fI/Irx6ITyeEi77OKL82AD0mzCdNakrh2kJE1n+L5PHMc0Gi3WVzYo6prp\\nLCMKJEGY0JUR62trGG3JJnNQlkpVzIs5YkH7OT4a0mi12d87Qgg3O0sS58agHUMtKccWnWdIQBUF\\n+zu7tHoteit9giDGWugGLY73h+TZlDiIoK6pY4/5vGA0mzHePWAmhvSiJlEQMx1PmB4eQ22pgLgd\\n8+hjl5hOZ5ijHbYmR1DDa6+9RhwnRHFMWYBSKVVd86mXPs2lS49x48YtxuMpvmdpt9o0mi20quh0\\nmuzuH6PqGl9AGDeo8wfwhwfUHAmUD7/vui7J5nPs4kj6xOPrvD46Ip3knJsX+BsthLBoUyzs0BYP\\nhRSKZiLJAokUAb2oSTE3tJKIbj9kPDnh9Jmz3Luzg0dFlDx4PU2aFpw5dx4hLRcvnUaZlHd+8CZV\\nOSJoXuTRx5/h0iNPkrQ6KOdYpbY+dVmTzUYIzzI8OeTwcJ84bhIFCVWhaAQhIo7pdLokcbQILBzT\\nbrliHkWSXrdPGEZsbW2hasM8y4jjmP6gz42b17h684D/6u/+Knld44sEVTn+aaU0jTgkryuXcmn9\\nh7EVnnWOIeNp5KJwPRCcW0/heQFSuM42jB7AR9zsPi/cDFEIgTKG11/5HsdHQwLPRxlLXedEUQS+\\nh1KKdrOHr50u1FqFkG6p41mDLwyqLqGeY3SJiBvMlMeHP/wiT1/Y5Df+539Ez1ZQeHiBhNJwutvl\\nz//499l87AlWButUqSKKBGWVozRUuSIMYoaZo3Jdu36VQEZ0un1u3b6BLwKM9ZnPPRqtLp1u0/np\\nraWoKxDWIfGMXXBmBYPlNY4OjtjePaBSNYOVdUaTIUncptNoorWm2+2yurqKMor5fMZ4coiHxReS\\nJGlB8td5sdRsc3K8zdOnPT762AZ3b1/jZG/C2ZfOcmrzIrs7tzh7Zh18yzPvf47ReMrG6ib/7nd/\\nh/5ym0QP2FiVnL7wKKPa41L/FMF4m7/7cy/x23/4rzg6SLH+AC0sUlT0Opqn1jc5PsqY3DvG9xTz\\n+RgpG8RxSKvV4PDwCDOs2dndw2pFq93m7NkLKK25f3+Huiqoo5goTkjTGe9evcZoeOLkUQuyeF1V\\nVIDJ4Kmn3ocfCMpCk6U5aTrHaAjDiLouePbZZ3jrzTcpZikay3Kvh7Y1MvJQdUFtFbVW+L7H4dEQ\\n3wcpAlRdM57W6LqG2uDpCETEWBta7SZ3hicIXyLjBA/NjJJvXX6VRAQk3RbrywPGBylCKjY2TmGU\\nx2SccnRyRFCnfOtbXyeJG/zqr/w3nIxGvPHG94iikCwtyPIpUaCJ4x5xHDrnkvDo9zuMRikPIL7g\\nFmdaK4T0EUHAuXPnGB4dcmltlcloh3wO+IKicIFpSnmIAIJYUM40nm9R2gGWz549xeHdO2xv38e2\\nVtGRi+EQoSCfz5lnuXPidBsEQUC71ef4aJvD/ROWB5AVGfNrGdrmBIngZDjlySeepdfvY30P61uO\\nR0M8HbA6WGdre5/r777CytoqW/cirNZMpjO6jTZBGGKFz/LyEtPpjGl6AsA4ndHvdghkQJqmVNXI\\njXzaDXwf2q02h0cHvPzK9zh/8XlXAJVl73AXX4a0221kIJjlBcIaMN6iy3Q+cM94CxSeJRKSKArB\\nd0XDGh8pQ4Tv7J/G1vg+FMWcoizxPQhDD89TXL78Jke7d0hEgCoqPN8jET7Sd+qAShsCESB9n7ys\\nkEmIJyT1Yj7rG01lPFpoJ2rXirOPPMbf+Imf5N/+y3+KqFIQFu1HCCvd66iKfrvFb/+bX+fX/vE/\\nYU9X6LIAXTIZp1SVIptOiaIIKQW7u9sEQcI8rxisrXIyOmR374DlpXXOXXiMRjNYcJjVIpnzrx7i\\n2ji//sbGJsOjA8YnJyStAdPpiCwtqKp9NjdOI6Xk9TdepdPp8KmfegkZGPb2t+h02wyHQ0fM+uvs\\nWOp2I/QxZDPLa999mf17+9yYjHn2uSuc6w/Idu/x7a98kceffoZPfuTHuH9zm8vf/Rb5yQmD5TbX\\n3rnMn3zxLVobfX71v/8fiEzO4c59rrz5VUwVENbQb8YUFi6ePcXheAspDGdPrXNYgvI1cRxydDii\\n2x4wHo/Y3tlB+BAGgpN0QpZnHJ+MOL15hpVBn/39faQErWrm6RytpmhlCONowWf0CMKYB4zCm7du\\nI31JpS1L/cDNDIUkSZostdoc7Ow6H3QYEEQBXhywsbJOXVcoXTI8GNFqNImIOHvmPBLngXSUfOvi\\nsmvwI02jGZPrnHi5R90qiBHcffsQ2whotRIunDtLejKG2mLTHLTjUx4cHKBqS5EXCM8gggAZSL7z\\n3W/SbrfZ29tzx/FaU5UKhIfSHoH0SBoNipMCX/jMq9ph3qSj5SjlNKdxHJPOx1RljhA1Fy+do6pK\\nVtfPcuXuHlpb2m2QgcSYCh8WVj5QtUZGgmxWkN29TzlxUrO92QRT1g9dKtNJQRDFTNMplZqjqMF6\\nC12qxGiPs+c3maUTDg73Kec5j156jOX+APEgFU9qjk8OSac1K4NTNFttrl67xs7uO/hBgDGQFynt\\nRo/xNKPdazGd5uR5gScDokAwmc0YMXPW10XAWZI0qFWF8TTD0SGj8dC9h909/u/f/V1+5b/++5yc\\nDGl2ujTbLfKicng439kmrQeeXtDplUMgGmvRnqaBhwx85xlXBmUMvl/jK4MIDLPjY7761a9SFIoP\\nPP8hzp05x527N7lz8x0E7ogeCImPxhPGqSgWGUtFURIEAX4UoP2Q8Sxzy9GywKqKtY11alVR5CVr\\nZzb5z3/pc/zZF77A8e4+H3z2A2BKdra2CWhgZjlJktC0gnme8e9+/X/nA5/+HPsH93n0fecIpKKY\\nu7HM4dGYq+++w3yeksQdPvTCR4iShEY7JIw8Wq0Bs9nkYaaX9X2EH6K0osgrMBprFLrMuXv3Ns1m\\ng063wbxIsWg+8MHn2draIssmTKdThscnCB/evfYOcUNSFDlFUSDCmHqaMRnnP7KOvbeLJZMyONVj\\nfjDmuy/vI7obPPHIGq99/Svs/uBN0tmIVSQHb1/lN/6nf0In6ZDeucfptVV2Dve4eeMPEKFP/7jL\\nP/q1f8AnXnwB7+iYO2/eoNZz6DVImgWbZ05zNJtQmDbBDOY64/HHHmf3ZJ9bN+8ym9RMTgqEiFlf\\nX2dn+x7tdgtrDXEcOyiDZ4njiGYSOaub0IQyIGgk4EnG4zG+J1C1opnElEo5aK71CcKYIs3J85I8\\ny/F9SRI3oVZMTsZMRmPOXzhPt9ejKOZsb+/SbjfxfY84alKWBkuIL2A8LoiTEBCISlNrCPwATxrK\\nShM12rRaHY6Lmvs7B3gyohnGeMrpQduNmCoryPOUs+cuMhmPGI1HIDx86aAgve4Sp8+cZndnm3/7\\n+/8XRVEQxzFxHCMEFEXheJJCoLQhiEIacZOD/WM8BMZqarXINq8MdVkSCEngC8JYsLuzQ7fXY2+Y\\nUk0NxCGDwTKeN3fbVd8tkoTwiGSMNQGzccZkktGLoNnpEaiCulasraxx+uw69+7dpShqIhuTZXMU\\nFUK42XW7NWBldYMqd44iazSNuMvGYJXh4SHjUUZWTDl9bpXtnbsk0RIay8bmaZ58+v3cun2ZUEKl\\nFK1Oj5PRhM0zp8hz1/16vo8qKorC0Gw0KIqCPMtIoojNzdMcHw8d2KXfBs+QNBPiOGB1aY0PPv8c\\nR4d7pOmISrvF5Llzl6jKehG7Yam1kzjZRfqFth54wn3+ucWvnAbHGg+BQUoHHAmx1MbSaDQIpWWp\\n0+Vwf4/Lr38fTytU0MFUJQQeeepSHkQYUVYaL0g4HO5w4cI5jOcznhX0B2fZ3z9kls7odhr4ukLh\\n0Vxe5Zd+/pe48s1vceUb3+DCI2eJVk4RRYKDkyn1eIJnK7SNECj6kSXducLWnSuc2lzmK1/5QwaD\\nVc5sPsJSf52TE827196i3++R5XOuXHkbP5Acnewxm6Y888yHaTRXyNICIR0mUMiIorTkuQJPUWQT\\nTo53uPyDN/AoydIx04V98/XX96iqiqqa43uCMHRD+FIV1Jly5pcAWq0HAOi/xp1oOTzg4uMv8vyH\\nP8BLn/wZopUWJoFY+OhpgSk1Cov1DGpWYGsog4C7JuVIlrz5yhW+/h++QSsUZAe3ePGx8zz52V+g\\n/OX/DqqK6eQOX/yLP+T60THbaU2vv8bx7n1Mfshw6Rjle2TzgrqGPJvR60ZYBSsr66yuLuELGI3G\\naKs4OR4SNyKWBz2m6Zgim5EkCTIMKIraDaHnOSwAHr1ezHjiNJGzWQqeII4b7qihLK1Wixdf/DBR\\nFNHr9Wh22iwvL+H7Pvd3t/j853+bk/HI5fBoODg8QQZNPBlhCYhEDMZRlWptiWSErUt8BbEO6CVt\\n8jijMUhQKnVHaqWYlxlFWdPotFld6+JhyQvXSUZJQCBj+v1lnnryScIQbt+5Q1laZCBotRsMDw+Q\\nMqKYA3HNZLJLu91ANHs0Wy10YSmKkjCS1Mp15p4Q1MUcYy1l4aj8e7vbtKoOWAGzHNOM0dbNtKzR\\nizmcoK7ASI+yBBW4Zcl0mtLtDlhKGkSRx87uPURQI7Wm31whjmN2DvaJYxistglFglbQavU4HN3H\\nGjC+JRCC/fs7PP/Ch7l/+TbffeUv6A/6PPfMRbTWHO4d0mq32Tx3mmtX3iYWMXEjopSaLC9Jp1Nn\\nX23ECyNG7ayKQH95mUDKRdS3E/+ns4w4CQnigMlkQjfOWer1+dY3v4EIIz7+N14iLSr29vZYX9tE\\nVbVLATXKzUOFwHoCzzjIsLI+uqrxhUcoJJ4nUNbHavDR6HlNs9nmySefJc/mSCl59eVXMMrBRpor\\n53jkwlnu3fwh28M9Ngd9srLmQx/+Cf7Dv/86g/UNEB7zLOf5D3yM1bWL/LN//s+5cGaF1UGDpD4h\\n90N++m9+hmx4zLe/8EecazcRwif3IxdTYi1W5YSBpVok+rYjCJKab3/767z/+SdoJB7Xrl7GGghC\\nwds/fMsdrzyXwnn33m3iRoOt+7fo9Lr8wR/+Po9eepb3v/8nkSFUCoS0KG0pCkcbOz464PJbrzIb\\nD8nzE7A18yqlkcSUVUFeFSSBJJ/PGY8LjLWsrq2gjaYo3GL5eHSE9COH4/sR13taRP/xSYjNLI99\\n4kX6P/+TXD08cbrAMiPaCPClRFgIkSRhwPF0zMbmJufTlP5wzAuf/Bl++T/9WU4tL3H7YETU3yBa\\nWWc2PUT1YxrND/MPPvNj/L+/9g+ZHG1zKyjZbnaJe01ik3N3J6dQPqo24HuM0wmjGxNarQb7R0fM\\ni4wwdG4IJRSFhjiIEVHMaDon6bRRU5ffnZJi5JwwCFEKssxSmpJSVUR+i8CLaTXbvHPjHdpLXe7e\\nvMF0UjMYdDh39lHiJOTUqXVe+f5r/MXXvkMrXqOzfopsnlNXChEE1HXJfDJGxxmy00L7CUaBpwXK\\n89DaxzOC4WRMUU7w4pLNtXWuXxszm6bM85pWq4WuNUVZ8PYPrlLWpWPlKsCLsdIwHXm8c/ltLly8\\nhCThB+nbpFnKsKqp6noRIWtQyqfVaKIqze1bN+m2eni+ixiGGCl8Kl27Ga+UGCuJw4TjkyFLS2cQ\\nxREyUgRxQncpZl6NMb6T+FgNnqeAEt8zYBTGJByPanq9Hq2oT1HcxJoO7cYS1hrK+R4nk/usrK5w\\nJlomDGIm44wnn3qEItecTCZoFVNVEnRBPp+il6a88eaf8/KrrxA1W3zy2U9yenODshhSliPu3LpL\\nIgfYOqHSmjIoabYC0nREd/kU1veZjo/o9ZoYfLJ8TL/XIUAiVcJkPCdpN1ENKKxChS2mxxo9gzPP\\nSKzZSGQAACAASURBVLZuXObyq6/y2HPP8frr32Gwuow/2KQuEywhymoILTUGo31ikRCKEIzHsb6F\\ntTHdZJWKAKtcDpTRJdJmFON90vmUcjannte8evkyupw4FYCIwEt47ZWXOd55l/edPY3KPX7yhZe4\\ncu0KoVBEsmZ2PCGQCZGe8//89j/lzLJhvW8JbQ4q4adeeolTzTa/9W/+V5ba4EmDFQGPPPo4Kp8x\\nfOcyOmmQ65xZUBBEIbEOIO/S90a88/Jf8rGXfpZsoPj+D1/h3tEd7tzaotc+TRS2MeRMsinDrOLU\\nIx+jNBHvWwkp64JruxO6/QZREmFLRSgjrCzQ1ZCbt17FqgzhSfICoqSHDHpsnjnP0fFd7u+8S6lj\\nbNCg9hSrq+uUtWI8TomiGKU9ms0uQSgIw/JH1rH3tIg+f/EMe+mMoz/+Ah958kk63SWqMKA0PlIb\\npGcoMVS6QNfQ92EpS8nnGZXwyIYp73v8KXqrfZaWT0gnFUtVSQ8YzWZEteQxv8Gt5gp3k5RZt8+l\\nfpMyHdMaDqlNughFc+FXRel+oHEcc3hwQNiImEwnxFEEniZJmvQ7PZIwZp4WjKZDpBZIAzawNDpt\\ninGBxDKeTUBYojiGygKa8ckxzWbEBz74LKP9Q37zN/81s3TG1/98leWlPo1Wwr37W7TbHbStODwc\\nY6xHu9OlEQeUvkE1EyLp0U6aLK9vcjwcUZQ16SwlkJIkDjCqoNftMhoWaKPp93ucnIwRXsB4NKHV\\nbqIU1KrEEz4PMEBFXlGYAg/B/v4ha+sbXHv3XaaTsSOr81cZ7nGzgdUKz/eIRITRmqSZkE7nLgjM\\nPKDs+A4mYRyGbGdnl1k6wfcGLMdNNvs9wjjk/o0fwIqjkGulCEJQJfhS4PvQbCRUIqI8zinKnPRo\\njzqr6PRK8kzjC5BeE6RGlR75LKOONKoW7O2MKYoST/qUVfb/MfdmwbZt933WN8Ycs11zdbvf5+zT\\nn6tz75VkyepsS8SS44oQciUGKRQO4Ie8YEiZKniiyhQUFcgDhBQOhCLECY5DbEyo4MKR21jXkq6l\\nK8mSbt+evtvt6tfs52h4mNvmKeJR2q+nqbX3WnvMOf//3+/7KPI1URTxnVde5cnxCcv1ksU649at\\n59jZ2UUIR1Fl3Ln7Nkparl++zPHj+zx9eJfWOrwoIA0lTTtjNBoxiAfEgxgw+F7A5PiMNLaMhh5W\\n5VQ6xAsUPV/hTE1RWQZJj0k247svvAsqoWpzbt95G89/P84GFJnkuec/gtVd+sHqhjgKcKbB2hLT\\nFLStoxfH+ARY3QXzpW3xrOUbX3+R4yfvYducUX9E5PdY5xlxFHE6PeXGjef5ystfoVic8JHnrtNk\\nOY8fnXJ6OMUpx8ZmD2crqqrgZHnGk6NDkrTH7vYuCoerWz780Y/yIx96P//z3/nbJAKEttSmJJKC\\nZZXj6pK8bgmtQraKcW9I3taU1qB9BVVHSfvTb7/E9sFF2rrCtA27u9s4Izk42Ge+mHJ0NiFKA3q9\\nPqoN6I+38IOQ2WRJo1t6wQjoDKn9QY9vv/Mup9NjaAWrvCAdjIh7EU54+JFPr79BL91mvVojBWxv\\n7dK2LXVVdzhB0VkgjOl+lnn+QxxxCre3iWdLirv3+M1f+iWiZ28x91TXGzZghaZSUIUSjSD1YkTR\\nidqiKKSKRlx+9io//bOfJ1KCL//Bl+BkThBAE3lIZ3jlnXu4J1Nib8CgP2ZnNOZoVXFylLO1uUXd\\nas6OJ9SmA7aWZUmWZQShoqlyQqXAQZqkJL2Ypjn3kxvLwYURkYjI5hlhHGGA2jRUVUvk+1S2pala\\n/HNjYV5WtLrG6oq0HzHaHHB89pSHD9essyHjzRGeaDGuoKpzlusznBNk2ZxRf4TnBQhnSdMNziZn\\n4HuMRmOKrKbM1ihhsKYmTnzqqkL5AW+98TZlUaFkN0cFR1l0CyDoHv38ICQvcsIw6JZAWU5eVnz5\\ny1+maWqkp+iUOJowTLuffVXRNi261Sil6A8GjIZDqqpFNxptDDiH8hXi3Kfjeeo8LL9gOpsiI8Wq\\nUfTHQ5Cd+6ZtDb53PvvrAg+dGG7YQ/gJmanY3OqzaEG1+0xPzwgiQT9NCcOYxWKO1YqtzYuUTU2R\\n5UgkN25c5+69d6jyNcNRH2c9br7vFtD1sT/1yU+zub3NarFkMLC8+forfP3FF4ijgMnRIcIZQhWA\\n1fT7Q0xTs7O9wec++0UePj4lSiL2dsf8y9/7HZYn3YU3bzJUrCirmijoEXqSoqoYDFLKZcV7Dx5g\\njOJTn/wLBEnCl770O2xu7dHWAR/8zKdw7lxtIdw5dk+wXk9ZTJ8SeC3zpo/uwfBiipKG2LPMJxO+\\n+ScvMp88RYnm3Eek8QKInUdVryiyOW++9qf0sFy7sY/vGqQHVy7vYRyoEIzOEWg2Rj22tzZpOjUo\\nfgCitVy6eJm/+JmP8yv/4O9Sz07YjBWDSLLUFiUdF3a2yFc+xgmsloQuRNSOFo/MWnJhOuITmuPD\\nR5wuZlx55gZhHCGpCbyAR49uUxQZw/EGfhxRlwXjzT1a7WGQHc3MNBhnO92zbroRmFJsbm+yOFsh\\nlYcKBHE/4Oj4FOFJtrd3ee+9+zRlxXg8JgxDZnnOfD4ljntY20n8rDU8eXLIeJh+33PsB3qI/pGI\\naXtwtlqQnR2SZ0ts3EeKEKkNSEOtLKW05GXNQKWk0kedGw+rYZ+Tds1Pf/ELCN/yxqPbHL99B7vO\\n8ZSH5yyb2uK3mkIpjtclM205fjqjyVoMJXHcozdMUbWmaVva8yhIfzQmzxxJGlOVFVhYL3KirYjj\\nw0MCP0QJTVkuGAxThIhYrguccajAR+uO8BP6Emv0OW6sE9kZY841s4YoVuztbrO1PWSxmKNNTSJ8\\ndrc3mU+mVFWDwCPL1yg/oK0Ni8UaD4FSkpPDQ6Ko13EknYczXU4uW654/Pgh2jiiIDx/hFPUTXUO\\nBJZ/bguv6pYk6sKVZdkglcRzfyYd87pO+3mAW7earKk74LL0MMbiSXdeUqi7GqPRREGIOqffSCHx\\nQ5+mbQGLblqa2nGygNWIzuUjw3MfkMM68CVEkUdZ5qjeOZQCA9Iyn0+ooxCfMQKfqjA4XQE5fugz\\nm2ecni7wPEd/1Kc/9JhMHuIHHR5lPplz8+Yz3LxwkbPpnGBDMX16zDgdcHFnizxf8vTRe0wmj0mj\\nmKLK8D0ffIkXBcxWC8pyxf7eDT7w/Ad5+PTLTKYzPviB54mCgLTvY2zLuqiptCGKU9I0RVcFbamZ\\nZhO2tjfxw5i2dnztqy+i/AC0QJeGT3/uJ4nCgLrNUKGP9H2c9WnqGuHgyYOHlPmEZz74GYaJIlYF\\noWp58vA9/uSPX2Q1WxMHIbWu6SUBST/FSUtrMnAtF/c7Fbd0Dl8BrqUxmsY6PF9SNTm+ZxDGoURE\\nvq4Ikl4X9MewsbHJv/WFv8of/T+/yuzRO4x8H99WFOsCVEx++pSHb7xKW9c0ZYWrDb41yLoBWWGo\\nqE23wAl9nx4B2weXGA9HLFZLZpMJaINzmrqu8HxBs6pI+rvk6xmbW5doWocwAh9JpCTatUgpmS8K\\nVsuWKBhx48Y2d2+/x+HJI1pX0lQN4VZEW1Rsb2wwIyPPC05PTwnDmPF4G09I/DDgwf17pHHKhe0D\\n6uaH+HH+7z06I+z71IHojId5BesWbQTSE2hX0+imk54JD08uUMYidEMoBUu/5iO2RguJi2Ie5ku+\\ndvtVfOsRCx8PCbruECNeSL6cQRQzTPtsfPwT/OnLL7BcZ4S+j1IhnhC0ViM9RZmVGK0p1hnGWKq8\\nRHiCRw8KECDxGA6G2FAjCZjOcoq8QFuAFuVLtDDUpu2cLp5H1EtpigZcQOAnpL2EXtIjTfs0tcYP\\nfNIwJs8Kzk5ngEC3oKRha/cCy2mOr7yu5uYMedZlMp2GMIzASPI8J4lHREHE1mbXuKjKhoNLWzgH\\np5MzpHQUdUXk92nqCpzFUzFFmZ87vUEbg7Bd7Ej6ClNVACiv80f9mbvLU/J8qQJN3eIJgT5/fzue\\nKF0F1nYZx9V5NKUsy45a7vuUZUkv7WHcGik7co9zhqbp+vZKKQZpjJeOCFzBOstZLnJidOdalYq6\\nbbh0eY/FfEZV1mxtbDLaHGLMkndvfw/fV0iRYGpL5Ec8fPCQyf1jwihm98JF7j9+wsnRA4xesVzP\\nefv179BWS3auXGA47HP3zn3S4RBjG9arjNbAG6/c4Rf/418kGaQ8fXrMv/jtf84w9Ugjj7JqKHPN\\nYHMPvJY4DpjMZwgNwzRFSEe17MYj5bLCuJxhf8TzN27xwu//Ph/48Ee4+swNPN9D+Yo8r3Da0Yv6\\npElKFFiUzUj9hJCcN175Nt9+6Su4xhEHKVWZMRz1iaJOdWLPO/pgqOoaTwbQGqwV1FaD8jBojHUI\\n6nMZnqSoW8J41B34aKRQfPGLX+SNN1/hlRf/mFG/j7Q1re7SEEqCzdd880tfwiBwXoAOQrTxcEVB\\nrByJ5yFCReUUxlrS0Gc83sDzFNlqzXw6IwkUcRJQFAuyJ2tGGxcpswlJPMAT4y4lUysKXWF9i+cH\\ntK1jmG5xcf8ZitWMUDk2N5bk+RppBRv9Hs16TdGeoMspVVUymUxQyqeuu07+aLiJLAS9KCGOYlZZ\\nQS9Jvu859gM9RN8pM/auXOekmOFWC1hVULbdM5znwO8e8ahb0B1fEGlB6+7PRc0b777JKs8YbYyx\\n1nJydARRDxDdv/MFNJ2g6rwXxsXdbabHTwlUBLbGOslqvcYXAk92NKeqKuG86RGEIePNEXm2Jogj\\nqqpiZ2cHX4Us5lOyfIoQMTgFXoN2Dd3HFQbjlOEgwRc+ftTHGoVtJcqLidMBSMl4c5uqzlmd5ZxN\\nF+haY3WXy/REgHMevXhIFbaAx3q1wrpuG2m0QwpNG2r6gyG+59G0GqVC+umItm3RbYvvSza2NvBD\\nyZ37t/FDDyyMx6PO0Oh5NHV1/ovWMUFDP+xAvEWFcYb+IEV5irLKMUYjRfdN6kBzcnLS3bXidTVB\\nKWhbQxTFBJ6i0jXWWvr9Af1+HyEdxdkTFk1DOhyiTYGx7rytI/6c1l7XXQUyDmOeLqYE0uPS5ctk\\nj5+g8wqhIIoc73//80xnMzxlCEMJXovWGemgR9UsMa2mNWsOLl4nW9eUZU0kRDd2EDXXrm5zePaU\\n737nRU6np2hds705osxWVFXNanFGhscgHeCrHsqL2d4asyiW9Hs9rt044P7t21gT01qfXrrFdHFE\\nkS2QgeDJ45xxL6Xnh2R5RVXW+AgGG32CkY/0IFSKl7/5dYQMwBmauiAejnjuAx+hHw3ImjWryRmT\\ns2OePnmH915/jc3NbfZ2trl9+0085cF5VdkPPNKks2TaVtO2BoyHsS1BGGKtoHIFVVZ1BY6w+1xL\\nz6OXRBRZifR8wnCTlpi8cIxHQ/7aFz5PNjnjd//5b3AxHSBklynV0u/o90aCloyjiEYqMiEJNrb5\\nsY99lLvf/Qar4we01ZrAj1jkJVnesm4q0s2Cazu7HB+f8PyzzzI7O+X+/ffopRG+8ijyOR45ujnj\\n7p1TnPC4tvdxAs9QFi0qMoRRgpaKCxcvMQsT7t++w3B8Ffl0QtITeE6zXJxh2wJhuvbY7u5et4mf\\nzhmNRtR1xag/wKZdBlU3DYvl5PueYz9YZbJec/zKd8D3u3Wsobut0hpaQCvQElrbHaje+W+t7Hzr\\nygXYGpqyITKCy4PN/+9b8oBQge50tKgQL/TYGvSoi4xIeDz77HMcHh2RLTOcAd22KNn5y4UwVE2D\\nkoqqqNCNw1qDFN1scbXKOJkdMx4NiaIek8ka4zoqeZKEWKG5sLvH5u4mpqlYZwXLxZLpdIHyIjzP\\n5/Lly6yzFet1RrZesVyWrJc5CA/PUzS1I1Q+IPD9kCCKOH56hKcUzhm0dgQqoNWWttXMplMG/ZS4\\nF/Lo8UPapuDiwQX6gz6z2RnL1YJWt1y9eoXDw0OkE+RlQeh76NKAdCgpccbijKYsLcZZPCEx53eT\\nKlIY3c03rTb4QYDvd1fyVms8T6CERAo6Snvb4diEUOeaWjg8fAI4BqrB833GmyMevvKA9pkA4XUN\\nJ98HzwOs6dxF2Zqzkwm+55jO5qgo7qSXHlx9Zps41bhZztbOkGy1ZjxOEVJQlYa0t8d0NqGsMtr2\\nAb6MqUqD7Ifs7O/SH/ZYLKf0UsXZ9GlHtVcSSUtbLWnKiiv7mxRF04E+jGBv54D3PXeFk9Mli8Wa\\nyFMIacirGkPIar0iChWCFqxA+TEH+/scPniCq2B/5zpNOWV6fITW9fmC03L33bfwoxgHROmI4dY+\\n77v1Ya5eex9XLl3i3t3Xee07L2Hdmu3+BQoy7kzXOCdxUnaOMNsyGgyo65y6cqS9EVhDo2tUJHGS\\nriAQWZw15GVOoEuG6Rbz+QKrYsbDPSorSNItkDHbUY+Pf/gD9KTPr/zq32fotxgtCP2AwPcQOIyQ\\naKnQ2lCVOSKKGO5dxPVSfvzTn4FqzQt33iIZpGStpig1Rng4aTg+PeFkPuXKlWscHR4jnaOfDDC6\\nIe7FnM2m3Hn3NT74oz5FnhMEAQ8efgcZxFy+cYsgirBComIPX0aI5Zr+xg6L+YzdC1cYjT0e3nsT\\n6TkOz5uH0Xj3XGGj2d/fJT6/QcqLFZ6Aqs7o93sk/R9iitPVCxucna2oKoNQKU61SAORUnhGIEQA\\nUYhLQ4ywaNdiMHhK0GpHYhXK67Ne5sgLHgejiwzVEBN1YjZPWEJPUOUNSTpi/+ol2jpnUT7FOUuR\\nlYz6I5Kg13VmFwukEDRVibUWJUOEEKRpF6BujMHTmrap0WsDyuP4dEovidi/cAEpPZbrOb3EY3N3\\nTBinvP7GG7S6YdAf0GjOobE1URQgFUymZ1RVRT/t0zYtaTqgKCt8FaJ6EXXZgUceP37Izu4u23ub\\naN0iVQfTtcYxCmKkUF3t1PM4PDrpAu5RxHqdUVYZZVXhgMFwwGS6oGkttl7hKcW67sjoQkjGG2Oe\\nf/553nrrLebTBUrJrjUkPbJ1RpYX3cy3ac998o4iz5FCol2HYtNGE8D5oSmIwohMZ9jzTWfT6G7Z\\nIeHmx26yWGfsROeSQK/zixvjsOf/h9WaSCrStMf+7hZh5PNkumDY80nSEOULJrNjRuNurru1vc9q\\nmSNlRBSEVDl4LuXqhQOW2YKmrlkt5lzYu8VwOORsckRjCqo6YzQcUuQ5AGW5Ig4DkljiJRHOtZRl\\nSxQn3HjmOm++9wq6hqo09HsJHhJtLAYNzrC7sUHci3j33j1C6XP48IhERuxe3ubOvUMsE5pW00/H\\nGFMShVG3UBMlw2HCydkDiuwJT++8glJ99vcvcWF/l820DyImlVt4RoHXUdCKcsnG1pjVIqfWgiKv\\nSOKYupGkacrxdIIvPIq2xjqBLgp6SYS2FSqAVTWlvzFgMj+inT9BeCFV+Q7lymEbcNMn3E4Eo1Ch\\nvBZZCmzbkoQhwkFtHMuywAsDwsgD2bKeHeOygv/+v/6v8Jo1YS/gdHZCbgWr2nF8eoIXhZh8waVr\\n18jzNdPpBCUkutHURYPyapIopW0qXv7OS2xsb3SeezlhMN5jlI2grlmsaq7fvIXyuyfHLJ/z5Re+\\nQhzBH375Va4c7BL7Hr43pG4Fs/kU3WqCoFuoPn76qKvoJjHgKJuK+4+edk9W3+frB3qIfvQnP029\\naqhWGk8l3HvygNn0BGkskRMMhtu4IKQSncpWATjTAXGlh3TdcqVtOm9MvLGH39skCgOiukVJUJ5i\\nY5zgpwnD0Q7YhtXRGUJZJpM52xsbtI2mrVvaukV5HcMSJOC63Ko2BFGMUD7OGJAKax1JkuLRMhj2\\naKq8e0OkYb2YMegHrKYrRkmfqikZ9lJK4dBtRd1keCE4DFnesSUXK01/lLI12uLtd96hrFYIJCrw\\nkcpQN2sOn2ZI5eEwpFFKHPcoi4K6zqhbg20dxmh0rRESAuR5VbGFc1DvarlGCg/rHJbO9CiVh24d\\nShnixOe92+9S11VnjqwboihGeB5lniNcJyLb2twmy7rXbq0jDM4XH0J0NKHzlkfgh+c++855Y4xD\\nSIlwgr29AVIpotCnLEB6Hcqtg5d0DyZ+oCjLnOl0wmBjkzDwmU1nZEXBT3zsOTxPcef2XcqqZGcr\\nZD6f4qzHclGztbnHerHg4OAqN2/eZGtzj9dffxVSzc2bNxiEA8oio60atNGYusE0FeNhn9lsgtUl\\nNuhC7ir02Otvsl41nBzP+O5b30HXNVmWsbO5Q0dZChiNQnb3t8mXGcuzFatlhed82qplsVqg0iEP\\nT28jhEOlhs3BNr7s06tGzOYTVKD46U9/jGeeucB7771OU1Y8fXLGfLIkO1vx6qM3GI33uXXrOdKd\\nAdrWWJnTtEsaN+uqmQ4eHj5ioz/CUmIoOZw84Oj0EV4sWK1XCBWh1i2jzTFlXRMl3QWoXjwmjHx8\\nD2I/IlU+KghYneS8/Y0X+Le/8FdokgPu3H6Vbd/HWIOruotfWRQUTU2S9Jku5myM+og6xzeG46NT\\ntjdTHj+9T65raqlYFBoXOJzvCJKIdbkiDgLyImd/e5ezxRIhPE5PZwgl6A9TZosFTVVjjGGwuca6\\niju3LV6wSxLvoixIoxmEjvfe/BpFdgfbKMb9gMRPyBYFx4dL4ihCxQ39wYBBv4/0OukfgLMSYwy9\\nZMx8VlA15vueYz/QQ/Tf/ev/ETvjHfJFxcZwi9/7gz/kl//uLyM9j9I5/sO/8YscXL/KZD6hLQuW\\nZ1OqvMJKjxe+9iKPj45Zl0vm8ykoiLY2aFSA13hEqHMftkc0HNHZtz0C6zPqDajyKb00Zb3Kmc2n\\nHbuS7k7ROYf/Zx8QB04bvCjCaIOW3d2eaXXnVFeauPZQzmLyjKtXL7K9f5UkSXj37QcMegMWwnH1\\n4DIvv/IWq9UM0KjQoZTiypWr5zqHLl61XEzxQ0E/HZIkMWenZ9RtRS/uWjHzxYIkiVllCxbLBU1b\\nE3ghWlvqusFDEUUJWhvKqmKdtSh1zqHUrptz+VH3d+yajY0xZZWTFyV7e3vMphNOTrKuOgj4oQIc\\nUkDc6wHd409VlPT7A5qqJs8zwgCiJMEZd+7p8bvJjOjgI846hOjkdVXVcPPGVQaR5u7RGWXdkAAG\\nSWM0fd9DSoPnnV88PUFTVNiR4fjsiOViCUnK4ye3SeIR29t7lOuSKAioqilYGA1HRImPJxN29lKa\\ndk0Q7vOFL/6bPH3ykFdf+1NsrcmKDOsEQvr0eyMEjqLIOthx4NHrhbRtQ92W5EVJEPTYubjJbLrA\\ntIJeP8WLY6p1y3i8RZx6nJwc0VMxwoMwCpEhKOvY6vfITqZIBeFIIfshZVMxLUqSaIzGMd4YsC4X\\nvPbWE9JQ0Bt6jHr71JcsvXSLx08XHB9nfPNbL+JH3+ajn/g4t56/yWTRsj6Zk63n1HUFzjCXLbKU\\n9NoRzgnO5gs2/TG1cdi2hKpiwCYq6rPMc8LYZ12sCIzgYH+fncGIlBi3smzgExiJK9d4rsUZsG1G\\nqy0EIdpqatdS6BppFMKHcjEjCfroVpL2Ik6mJxAofOWxzivwHYEfEKUxg40x6WDE3dv3OJtMGfV7\\nDEd96lojfUncSzk+PaYsalZyxWi0QRolPHvzBncfnJHrmovPbdPOHrPOV7z++kscvvMdNnzDaLDB\\no3lJYCXjdAAX9hj2U+b2CUIKrK6pKkfa72ONZr1e4/sBxmjSdEBV/RB752MnOdjdpu1XJEHMtZ0N\\nEgtW+ZS24eDaRT71iR/Bl67TBXsBTij+wa/8KvOjx5hcI9qCVXaGcY5eEiKFREqB1Q4knf0PR5Vl\\n5EGIkY7+oE9Aw9F0gXGWJIrxFFRliQo92rrpZq6+QkrvvLq5RorOslhXhsD3qDKNimDRZPgGfurH\\nfpTnn71GqyuqqmHVT9B42DbkpRe/DiJAOEPd5OAJPHymJ1P8MCQMFfPZhLIq6PVCkrSTngWhR1GU\\nKM/H9xVRHDE5m9Bqg8SjrRyoGnM+H3UIyrLA97uYVdcUqrEOtDUMooDRaEB/MKRuPJq2wliLJyGK\\nQjY2Nzk968LFrYZAOPobA+I4ociKbvZZa0pddxXItsbzFHmeYZ0j6fXPbZLdgioIfLK1Q3kKazsS\\n+633PcNoNCTUJdVyQb7M2d0Z0EsjEAWN6R4vnQNjLHEY8Nxz13j5bI52NVLB/oWLjNKc7a0dTk+W\\n7O7u8/Wvf7vry2/38X3LxmZIFAwYbYRMJ0vuPXyFk7M7/IVP/STf/FbBUXGGlB6elDRthZAdhs+Y\\niuEgJkm6F6HbFms8oijGtg2hp0gjn6JtQSqqyjIYbXB6dIhZtBRZg4gknudY5hOsM6QiwLYW12as\\ncs14+yphqMnbFk924f4r1y4hvILHh0/Y3grJVzWB8AllgO8pymbB1n7A5VvP8qNG8va99/j6917g\\n69/+BrduPcdotEPdrnB6Rd0saO26IzLpgCDss1gBXmfQNM7RCMu9s1N0JYn9mCBvWSyXbO9tYkzI\\n6dQQbvdp2hUeDuULYtXteGMHTgqsUqyaFusFrKzF+B7LomYQ+GhrqVtHbirmjSZrLetlThynVJVP\\nsBnghEHbzkQ6nc6p65r+MKWuS/q9GNF0nxmrNUmUYFrDeLBDmozI5yuyecVnP/2XePDwKU8efI/F\\nU483X3uZAMOmrzBiyPTJksiFRNLRGwWEQYRuKmwpqPKKMEzIlku2treIkiEbQ8lqucIfdDQwbX6I\\n70RPH9zjwzcvE8sGUZXsph6J7yhcg+8ZmtWU1FR4dYUfhlS24n/6+/+Q3/gn/wxTVCjdeeVXiyWe\\n59jsR0SYbi4lBcJZtsYpv/w//B3uPHrAr/+fv8nR2TE3nnuWB/duUz89RWMBizKy01jotstF6hbp\\nSew53EE6Cw6UJ7o5W1UTeBGmqvBC+PxPf4offd818tWU3c0hZdEwfP4ZTucFg7rlvbsPaVzDkblQ\\nFAAAIABJREFUcr6kKCrGu9s429Hts2xOUeZsjkdsb2xjbEs/iqmLjOVsSpz06SU9iqqmKlvaFoTw\\nEVoQhRJnOyCKQGDOneFaW/Ak2jVIAWk/ZNDv07Qa6YOQBo2h1i1pPyXP4f69uwz6Qy5f2uL4eEIv\\nDnGuWx5UVcliPuu0uroLN8+mU6TorKq9XooxXa7PVyFadyOFVhuEJzDOIKXqLKq65d69u4g8JyOA\\nMALhWGcFduB1ESfTPQV4sgv5G20JQ4WuYHtnj7Iq8WnZ3oK8yNjeusClgyvcv38frTVxT7LOJrRR\\ngjZ1d3cGGLfia9/4A3b3RpzcmaIbh68CsqxASYFzFaNRRNO0SOHjgH4y4unTU9oafBViXUWWrVlN\\na1pVs7nVP2d11hRl04GpowRnC3qDkNZa+jJArSt6scfaGA5PFlwIRigULTVKSpbrBVovUUHL7s4G\\nQdRHtoJGO8IkQnuWrJnz9OgM6UcYz7BzcYd6pXjjjTvo2nDhYI/RKEUKR1VkFHXFYDhgsWw4PV3R\\ntDX9foSUMHcNXikp55bNoU/YaJSKwCgWc00YJASDCwzibU7vvkvdlBhqPFkTeo6itmgV4kLFdLkE\\nX9EaaGtNkzdsJjFhkqIbgZaWUhumpSFp6g6s02QEcQBSsliswXn4KmJ7f4ytc8DhB4r52QShuj57\\nGIbUdY0nK/zI58033qOuA6azE06O7yFNicIRSJ/xeJu69phPD/GwNLpA1gWtW1GZilD1CNOk+7xE\\nPZbzNdFujHEG4RmqYkHpLEH8Q9ydv3/0CINBWkvgK4I0pA6hdtDUBl1UJFLh+SF50/BLf/O/4YUX\\nv0k6HOP0gtYoahST2RqsIE0SothnWXTxm9YZiqbEU4rPffZf5+oz1/jP/9bf5EM//RkmSYR8/U3S\\nKCGKA9q2wfclVdMihUAgaOsW4UlCJWm1xvcVOI2uNApwdcV42OPWtQtc2NhgnAQkoo9pu+/JtTWH\\njx9xkrV4XoTQrmtCGIluYdQfsZxm58BbRZlXrBcLDJplFNJqzebmGN1YglHMbLJmucoRQuGrkDT0\\nyfIMrW0Xx9ANSoVEUQ8VelRljpSSq9cO6PVjwiDgjTfe5OxszWIeEKURu7u7ZOs1g8EQaw39QR9j\\nO01xFMadStdBm9U0jSYIFEpJrNVYYRF4GN1daLa2t2ga3f1CAFVd0/M6nFs3D+2295OzKfsX98i1\\nhWUNuuKkyBBbo3PHksDJ7k7UWpBWUuQlg+EmYRwh/BDlBUgsb715F91a7t6+j3Vw9do+KhBYU4Hz\\nabWl1/OYHc1x1rG5tcFkekJVVQx7HXlKW41EsL21zWR6iiJCogn8brGoreTSleus1hmHx8eMxxv0\\nN0Y0WYVUEm1LiqJmvZgT92JM1bJa2Q6c7CIG44S6zBkGCq/06fdjCg/OTgr6aYLAp64K0J2pAOs4\\nOjxjf2+XQTKgrWvO5kuiNCDTmsPpBOeFTI8Nnowo1iXDcUwUphwfP+bxE8vGxjaDUYqkh5IDwiCj\\nl4bgdSUWIRS6BBWG9IYxeVVSipK9rQSDZlWsGQd9/vTlbxMazZVRn+V6gVEGpx34jjDooZuOlj/s\\n9ZgvF9173RjCMCIrG1pZkDuJER0ecZD0sdpS6gppu93DYrlmMBzRNp3KY7lcI3RFEinquu1kka2m\\n1+8WbziQXjfLd07w2pvfJYpCol5ClRnqyrCxvYkWjngYcOHqLm+8/R6b0QA/9sjaFX4ckc1bjIUw\\nDEl7AbPpBK0dRZl14PC2wfFnipt/9dcP9BB9+8ERX//e21zf3cday7fevUepQmrt8ITij7/yDa4f\\nXGa5mvEvv/rH/MGL3yLub+K8HmLoU9VTRBCRFV22NB6kBL2UtugC9HGvx8poDtdLbng+z125wkdv\\n3ejiPcNNBoMBURThRz6LxRSkZTBIqc5JPKPRoKtPeoJ+HFGVGUp4eKGgqjRKwsH2mF7gcfTwPvuJ\\nx8npIQ+fHJIVDU8enTIrQCQDHAFG15ydTMiygp2DS0Shj/IgDHvdHaRz+CpC1xVtBdpYMIqDCwfd\\nPKissI3G4uErwd7WFv7eHvce3CErutfprKauC+J0iDM+6XiE8CX3H91nf3+fmzdvcHR0ws72RTSG\\npiq5cuUq7925zfb2LsPhAF8q0l4PZyV7exd4eP8Rx4fHeB4I0dHSpexiT0ZqlB+wXC9pdUs/HWBa\\nTXzegLK2U4f4KqRpan7hF/4DPvjB9xNGPrIoOfNTvvInX6f8k98hDqdoUyK6cxchuu18r9fnxtXr\\nzNMxBzcuE/f6iCAhpERrx4P7T/jWN1/i4PI+QSjwZERdd/ZNRMPhkzPqWhD5KYG3SRB6eHLFZn+b\\np3dP8JRHq1tcA8/dfI6zs2MGgwjlCyyWs+kJaR9aYYiHPUpXI11Ikg6xbU6a+FRZi3BdqD1KJW2l\\n8UXKelGibYtqclKvj60MS9fCOCRfN7Rtw+Z4yIXdC+SrNUa3KN/nwoUtwkDQmByLIx0Okb7ArS3r\\nBazKHKeHRL6HDAxZOyHd2OTqs9ucPs6YzZYsljn9fo9j7xgvtGxvbeBHHcA5ivo8M9himbVUwmCU\\nT5RI1nWJ37aMxwlXL+0hneX00V3W2YTtwRAVxZS5wagQH8tyMUPKCCscnm2QbcsoGhLHKWWZ0TQt\\nYZrSljWj0GfuOVwAuW3pxUMcBtu0LOcL4iilbkrqfIVpK5ow6FTcvQGB156/7hCluotknAxZ5xWt\\ny7txnwtYZxB5KaezGs8rGW1qbj+6zzJbYuVVllmFNhGL5RKpPfppStO0eNJjc7RD5Mdsb+zy8PED\\nfKEIInVu5P1Xf/1AD9GeN+Q3//ffZjqZs1ivmC0X6NYSKYXyFS9+41t84+vfoDYVUb9HMhjROoH0\\nFTqK0TJDWctsMcMaR78XEkcxntJsH1zmwsEYoyy/9Ye/yygK+MTlHT576yaPWget4EN/+fNcuXKF\\nf/xPfhXnDNvb2xwcXOJTn/oU4/GY/d093nrzTS5fvMCrr7zMb/zTf8z+xT2khK2NEVd2L7JcZ3hO\\nE0eCx48esloXHB7NmS0LhAgx1PTSAT/xgY/Q7/cxtqGtaqTzCANJFPkoT+D7AcoLaOuGoqhwCJzx\\nWK0LJpPXMdqQDoYdEb9pUQI8q7lx/RqtyciLgvlqzTorMcIwn1pGm32EsJycnhL4IavFmul0gW1g\\nubhLZSrSOEF6CiUVxhjeeutt9nZ2kULgiYDvfu97TI6nnfdIgrZddtZqx8c+9lEmkwlPnjwh8kOs\\nNuRZQRAE53XQbkv/Z/ZP6yTPf+D9fOGLX6RpK0IBuUr4mZ/9y2yd/QKT/+W/ZPXi/4WIZMcUpTtM\\ntzZ2+V//i79Hno5IBimtg8YFxDRdZtVX3Lnz3p8zT5vGoryggxfbhpdf+TZN07C/f5Ek6mGtPeeK\\nSr761a+yWCy4dv0KQRCwtbWFcxY/ELz8yrf5vd//bdbhEm0b2rpga3tMVTcI4WGcx/qsJVuXnTg4\\n6jHc6vN08pR+1GejlxLpkOPFCT0VMM9r+l6MsDV+EFEHDda1TOfHtGXGM9eeoW0tfmLxpcL3HXVZ\\nUzcaIQS1FvgyZn/nEu54wlrXtKbGDxSD0Sa1MaxWE4QXoUIHtmY2WaKbgqTfzfeWZUXSH7N/4RaX\\nhgnLouFwtuRscUYvkdTZnLYsCV2f1WzFsB9idI2RisYKWhtSFBllJVFSM4j71FrgZIfr6/dTmgaq\\nrMaTIUVdUbVzED6+AExLoUtKqRFrQW/YQ2AxuqaqPaQVGGNQXoC1Ek+ECEKqsiQZKFpbEkdDqqJi\\nMasYbexSVCVlU7DO1wgZUmmN50e0RvHg8ZTFusZ6IXnW1VsXkww/GLBaHzMajhG+hxCCJEnpDwbM\\n53Mk3ShH1xr5/3NM/mBFdSaGcJMn2YwiE0ibsBXEOF11sjhPoZVic2vM1s4mURLigghkTNkYbl7y\\nafOa0ThFuJrYE2yOhiwrnwsXDiBocUpzdHrCP/v1X+MTf+Ov458+ZdtP+PG9fV66/w4HBwfEccx0\\nOuHmzWe4du0K77zzFs4Jfv7f+/f55Cd/HCUFTx7eY3tzzM7WJljDj//YJ0iM5fB0Qlnk3H/vda7s\\n7XTBXDnnmWef4Uc+/BG+/NVvsHX1WT75U5/lZ3/2Z1guz3j85BApJUkUcnBhl+ViTeAHKBUyrWfE\\nQYJ2FuUESZCwMdpgvc5YrRYgPPwwoGoqdFvy8MEdLl3cp9dPefudd8mrlsl8QaVNlz8d9hgMU6aT\\nMy4eXEIQdJT4rOhUvdYihKAoCqy1HBwccHp0TJ7nNFUXjlfKw2Hp6v4OazX7F/b53Oc+x8svv8zx\\n8THSEwghO2+6AHkeYpbSA2dxoqt/Zlm3tHr11Ve5sjnkD16/w+37D3h/c8aNB3fYD3ysrbB0d6JS\\nepydnfG7v/UvMBcu89yH3s/V6+9DIsCENE3B6y9/m/l8yaWD62xtXCfe7MYAQsBylXHp4vOEkcf1\\n61fxPB+nJUpCI+DC5Rt4nqDXi5FC4qxBnVexfuLHPsFn/9JP8U//j/+NL7/wexB6rKcTQOFFEWEP\\n+k1CuXQgJXVVczpxaBsQRglFscBJ6MU9toZjOFngK0W1KAllnyBZUqzX+BiysuHtd97i0v51BsMR\\no+GAt9/9HjjNqD/A78UM0x73Hj3Elz7DJKE3qChrS1U78kwAgrryQFdEMSgpGQ+HzGcZZdHSS4d8\\n8GOf4G/9t3+bCxevkJoZ//DXfp3vvPoWly9fR3mO6eFT3nn1dXJleGd6Fz/SjFPF7s4WsUrxREIv\\nAmFO0E2JJ3yElLRogqRH2WrKRpMGaUfit4LWdJXmttVEcUQ8TGkTDztzFMWKJIkI44imhrqs2N7a\\nosgyTG0IogRfRWxt7aFCTRjbPweF6KxmOZtRZxVWOITUhEGALwRhGFLljjyrCP0tsA39dExdZRS+\\nZiPZB7Okn6QURUk6HGENnBydogKfNE44PDlktVow3t74vufYD/QQbeWET3z6Kgc/qnnnwZqH72r8\\nqaDnOw4+fMCkOkOenhIdHvP4zbf4bs9n0g8JkpAP9VNW/S0eLaeMqxPmNIR+xMbWNq8tnvK9s4cE\\n9ZLYGoQXMAtDXjqakfX6uGZN0jymdJqw30MpRVu1hH7Eu+/exQpLHAe8+fb3uHX9Mr1YYoMp6YFk\\nxSG39i4yJiPwKpw6JI9reteGpGHCTz73fj6+f5HSaBbTQz60vcmF7TGfPBhRP3qNp4ePIe0jVYsf\\nbyBaGApQMmRaCRaVxGnLSDXsjXpEXoQxKX5/iBE+y2xGJCSm1fxrt7a4dOkKk3nG3dMJ08WM8f4G\\nN3Z3KRYZnlEkvk/blmwMe5w+OWJ/dx+TLHiUnSKJqPKSp2fHbO3vMYr6nNx/yvKkpPWhtzVEtIaw\\nhGJV4gc+jal45mrKz/3sp0jmD7i5E3Hw83+FDddyxfNZrw3/3a9/iWKQUgqLVCvwW2yt8NuYBy++\\nzXfaf8Ts/is8tQkLEXEw3kBMjlmdHbGP6+5APA/ZGlIPbFlyerTg7Udr/uhbL/Nv/Mxf5CMf/Sh3\\nTm7ztT/8Jsd3p3gy4IX6q1x/5oCf+3f+KkkU8cbb7/E7L3yZZVnSFC2Xdy7y83/t59jZ2+Lh5Cl/\\n9Eff5NHdhwTAzWuX+PznP0N/I6WxNS999zVe+uZ3MaXlmWuf5NrP3eT//q1f4/76XQoDcZzjOcXe\\nZoQdeKxmx0hV0bYVHlCuJ4hWk0awH4NulgS7KdNpxmZPYh7fRd98lqiqcEWGFzg0K4ryFU7uwfJ0\\nC3/jEpv7F5ifvEtUHBIHI5Io4myuWGeg3Qmu0Wz2BlRGY+KUtc2otSbUEOgQ1Y8Z78YcPXmKXNTc\\nfek1fvN//Af8J//Zf8qbd55wsH+Ng4MbhPEAT0XQ86i8Eh/J0CX0iYkCiR9LoihAqYjWaZ5rC8Sq\\nZC4kjdD8v8y995skeX2g+YaPSJ+VWd5XdXW1n+4x3TPT42AGmGFgMAt7IEASOul2kXbv0Uqs4bTi\\nWGl1i1aPdKsT0iLDnIQVAuHNMAxje1ybad/VVV3eZ2VW2sgM/437obif7ll+PBR/QzxvRHzj83nf\\n5vIVfvL5vyQZgaZqhKKNpcV4dg3VsJCUkJq9RSS5pPRRvNDE99o4dY++YoKwtUMmIaMPFDG7+tio\\nlEgmJKKmixWr5LIJKvYWQlLRUmk6XpHQb+J2AnxPQxExvd19NF2HSFfxEQSRIJuy0JUOgRmTUV12\\n7TrdpgbYdJsKg10pSrGPrkosrGywvVVFIkkmnUG4OeJQo1b9J/w531eq8gvT78DK3cn1ZZs/W/sx\\nDVVmYCjDIw8ep74yj5fQWN8tYbR3kRe2aVspgmQaJZEmEc1we5eJroFue6i6Qd5tULz0IkXdhEDg\\nywJfDTGlkK/+6yukNJOqBp1cispcmR+3OqiE9I72c++Dp3nT6ftZW1xma2ONMHCpl2pseW1uzW+g\\naxkSsoomp6hu22R6iwR4eO4uXbkuknqSCzfmUZUUTddnrVShq2cYYRV55sWLzC5dQUnKPPT4u5DQ\\nUXUD0zSJfBsFDyN0ySh1uvqLe3FxJQkYqL5Lry4TaeBKMqEQGGaSLdsjrrSoNjtkeodR1ndYL1fp\\nyqXwvIgoiGmFTayURr3dwPVjRKVCT0plZChPNepidW0BM3YZzifY3SlRr5ew0iYEAaLtYCoy2VyK\\n7lyCdDJLfzHPZE+RE8PHKe1UuPjsD3DcDndnc5iZLLsdD4MAWxFIkYYeGvhhhNBBiiIWb13j2fYm\\nmuRh5Yp0LIvWThvLUfB8CWFKSOZechkV/DAmiAVO2MENJEIl4plnnuHb3/8B3fkMilDZd2iMOApZ\\n3XRZ3Nrkjz7z16g/tVx5cUQmm6cjtdhYnuNLT/4FqUKeRhTQrtWwEhmatseL519no7rNyTuPs7K5\\nytWbt7CyBRzZ59Ubt5gYGaC47wHaiQN4skUnUggVF9PM4bV8RFjlyKkcvf2DlKtV7HYL01BoNtvY\\nLmhmEsdto3RVKGZSLFy7jllZZHL8Njp0EahJTEtjerSbJD4Xz79Ka6NGx4sw9SQNN0l5OaRSa7O9\\nvctI3yAt9RDb9V3SvWN4rTLr83OYGgz0DaHGewIeu9Ggv6+fk4+e4sbMLZaWV3jyq5+nGTX4z//l\\n0xxOHENBQRUKcqzg4uApHqq+53hQYhMhBLEIMBWBHAu8SJCW8lhdDj2yRmwYaKP9XHv+BRauXkHT\\nZRQzQT1sI1JddAIdJU7hhCGGFbG6WSc0fZydOg0/xE2ppPVu8kgUzF4sI481lGN1bRFDyxJhsLjb\\nxI1UVHdvrBG/giIH5HIZHB8IYpCgkMnQcGx81yOVzKFKKqphk0hqyJaO2iVht3y6egdxdwR1R2F1\\nq4Fm+lTqTWJZwfPbhHWXmD0tY7td+5kc+7lCdLxW5ebnvoBT32W7HpDdaLHVaXPlXI3rn1vmoZEx\\n9nf1M1atM6apPNzdg6+Y3IwkVgRMRoLWVpmBgQFStg9Zg0Npg319KQ6FKnJsYKd1bKmDEbUxfY8g\\nmeOFWo21ap3jyV5e+dHTVPMmbUPhjYsXeejUvZw+dTc9Pe/A8zxK21vMLc6xsVsnVpIYskxfMkt/\\nMkfHSKO3FTRXxjJMOl7IxevXSXf18Mjb340/v0pf7yidjsfKyi3qjQbNUoN7OiGqkkAzdHRVx4sg\\nrcVkegxyKRPNCOlEOpEi4fk+GVMG38EgIp1OgpYglUgzefwUpmbSXFxjvdykq3eYbn0QVYGqVMP1\\nQzRVIVfMEqkaeSuNLst0Jw2KaoG1RsBQ4SDEEUGzRuDZZItJLCuH3XJx2w6u0ybQJIrFHA/eeYRf\\n+/BHuXL+Gqgpxm+b5uBamdnnfswkLn0Vh027gSkpuFFAysyC4yIihUD2MaSQWn2bG24TLZmks1Kh\\nZuzS8WAy2ORBxSMwFCLhgrz3HPHDkDiOuevkcQoYXJ27juM4tJptilY32WKG4/ce3/uZtpzm0vV5\\nSpUGnUabqdFhTh6/jWRKY315mR1FptpyuLY+w8D+CUZ7uhgYn2Sr3marVGGj1uTJL36VkYFBEnoa\\nQhmnE9DxJUoNWNvRidTjBKILPzYxzBCR6SGUI5JZjWKhG0VSGOiJaTgVFEMmLTRKZR9VttCVECWq\\nkJXbmM4g4fUnaeYCDj30KI4yiN32aMUu5cYyev4QD98/zhsXX2d+bYuRkUlGJiaY0BXqu9tIkkdo\\nTdM91EGxNLTdBexqnYwsCLZd0n1FTj90P+98+yPcd+o06VSBjVKJ3/+vv8eXvvwkX/77zxNYMn/4\\nX/4rRiiztbxO0HbYd3CaWEhERMSywI87e+IeaU9jIcfgehEiZk+fFwpkISHHJr1jR7m1VKIVuiQ0\\njb6hQXxfYNowNLqfMBbISkSAS91ucbPxKrneDF0Tk5iqgtJq0T8wTKVeY/+xw9gdhXbLxglC4oRB\\nxhrEqe3i1Frk0xkiqUnbC9CTWYJ2B8d38QIXwzSRQh3DTCIiFdXScSOX7nw/tfY6WlLFI8IJTda3\\nG2xWHBTFRVJN0ASqEuC6LoQBmqZhGP+Ez0TvGe1B7JQQMzfotzs8pOkUKztIBowWcmS31zHWtyiY\\nOeqqRieXppkxqfoeLUVCUfJYZYGotQibLdR8lsnuIr6Aid0KcRyzY0vkVVBsh4yZpGyXGNMUtmt1\\npLF++oYHWatt8Oi730c+kec3f/vfggT3PHAvb3vkYU4ev51H9k1y+uFHeOHVM0Sey73HjpORVTyR\\nxo3r/B+f/l2uXriGgcnwkdtYLi0zdts4b33i3YQOfP87X8M0bPr7LdpLNdxOBxH4qIZOPlPk9mO3\\n4wdV5KSgZtdJGUl0TcZIJRidOko+N4Fh5rAyOnJSRU1kgARdWoASxUhoCHUPumHUQRIhsmYQSSqe\\n00ESHqEIaIUBq7cW+eZf/gW65zMp+yR7h7i+sc2m7dHBxFU9TFVhev9BSqUyIQINlzuO7ue3/+Uv\\nceaVV/jx7HXe+7HfIJua5CNDBf7ywgv0eU2KoYTediBWkPUEQRSiqhqmFFN1HYQKDd+h2qihp7Ok\\nkz08+J7/iekTJ8isnMd4/u+I1l5BVVVkKUSSwNRVRODQ21WkLRnMW0k8fy8jLToBTqeJaiqESpZY\\nb+EEARgxoRrTarv4O2VK567QPVCkIqtU4yxtS6XsuBzpHWVifJouP6ATXqJab4CkEroRg5kUjz3+\\nONVmnas35pmdX+eB2++jt+8QtxZ2WPqpxnG1bKOoRUSyh/MLNUxFxrIMAilHMmdhSB2Sik/brqEW\\nRqj4OlW/wdhdj1K3b3BtYYWW/DSn7/9nxB7sbG6xvHadTEqwVnYpDp8iTDYoV8uULsyQTxs4oUe6\\nv4ja3EGWFHa2V9lYv0FS1mnVbZKqQW++jyCW+MbTz/L17/4IXcDB6WnuvuMYr782wuzsHF/+/JcY\\n7R3gd3774/y3//ZpmrUWf/ZXf0dkJPGjCF2K0SMXXYFQlvGFSiTFBFJMLAQbzYiulEUyjEFRCdQ0\\nT5+9jKlLHJ2ewkrGEIaMjAxxx8lDjO8/RLHQT0pLYFer/L30+8zXa/yHT38axcojQgWCiDDysd02\\n9zzwDjZL2+S70liWyeLiInbdoWl7uF5Eq73Dxctv0N3dxeLMVRRNJpFKsr61jQg1lhplctkeFMNi\\naWke1xGsLczQbtcJ4hAr3Ue9XicM4z0vhrZXt5Al6afSHMjqCVLJ7M/k2M8VouU3ziDVWmjVXZK+\\nQ0KEFCUd4erIrRpq4BEKqGCwOphnfqqbxaJMWQlQVJ3rXoLhdj/NTkhLjskrMlkrycrOLiLwCZWI\\nKNJR0UljIpo+kRYwmM9yl6rzraWbjN59F/ccneLcqxcwhMLuboWxw/u5unqL73z8e+Q1ixPHTnD/\\nw29idN8Yf/OVL3H/3XcRqxrrV2e5cO1FItHByiQo77TRYo98b5Lnn/82S4UruLU2KyuXOXJwkMBP\\nEAYxrUYd1AjD0CkUugnDiGarTTpX4OF3vIWwWef7X/rvvOnBu3jo1AEGDr0NW5goEoSRTRiG6FYO\\nOWihRjKKkIlkme1KiWqpwp0nToBuEiCjSrC5tMSthTmmDh+maKT5Rickm0xxtLfIRqxTeOhtLDoC\\nKZmCwMGKQ1qVOpKe4uDhQySkkDsGu0nKJtcXb7DT5fLtxjn0HzxF48Y1RtMKWQSeCAkTOlq8t0cf\\nJQUhIMcRhlBQUGnHIZEUIiQf3Y/p6i2wWV7HrW0zSIQiJJRg786UBAReA0X3cRot2gg6dgSoyLKM\\nLsfIkc/Zl16j4emUqw4SGkHYRugxuUIPNy5c4c5+leGkxdx6BTXRTxx5pA0NEScJfOg0WxBFSJKE\\nE8sEqoaRMElrITu7GxhOFbW9y9BIN4dGZPJunYfGTBw/puVleWFmlZWggzE2wmapgQvEkoHX8ehN\\nlxnKLTK4r8D5lTmi5DhtN4OnevSfeDdN7Xk2ly4wE1dJpvqYnV8gVUwx2jdFT/cQTVHE1AOOn8px\\n7ZkvsnbjVbJDI+yUFfz1iwinwchID/c/ehff+/5TdOVSjPf1srJ8mecuPo+cKyLCkJyq8j9n3k+r\\naXLvyVOYhsblCyt89o//FN3vMLt8Cy/SOXt9hrvvuxv8GDX00IQBYi/XjKLs+WFdlzhwSSRzVLfX\\nubFwk5N3nuK+hx7ik8YfcPPKFb7z7e9y4fIq3QNF+sp1zsxcRTWzRKFOVklzcGiEx+97kOVv/D3X\\nXnwerXsfSzsumqJy5MAoPd1pfuvffYL5pWV6CgV+4b3vorvQx1/99ech24OVL5JPdTF6+FF68ion\\njp0i/9NxpEqzQdv2iCOZ/u4BFCPJmTNnwPe449BhNhau02qW2RRpJCOJoZuo+t6UimElCITYG3sL\\n9ppirtP5mRz7+Y44LczjdRwM2GvEKAqx0HBEvCdI1qBmmcwVc1wYLfBy0mdT91AshaSEJan6AAAg\\nAElEQVQkM6+4jHsuA6rMnGtzp6qTthJkVBkpiOjIKm1VJw5CdAliJUbWVQzP5YCpMNbbx/bmBtlM\\ngjiMWV1bp6e7QH+xyMTkKO++53521rZ58cwZXrvwGr/zH3+XAxMT7Gxvs7Qwy1ef/CKlxg4eezmM\\nSmObQn+Cgd4eWlvbvH71IpFf49S9xzh15ySDvYf57o/PUwl9YnkvyWClVJ598Tne/tgjfOBXfols\\nsci/+OVfYHp4krW1Lf7wU/87H//PRXpGT9Dx9lYzJREj2nU8RaDHKpocI6SIVqfO1s42tVaDHz3z\\nHWbml6nslGmVd/A9DyErZJIJqnWb/cVehseHIYx5dWsTs3cfXmAgAgXNVIniFgM9BXKaxL6eQeJ6\\nhy/831/n3NUZhj54mktLZ9l3YYa3HThFZ2kd33OoyyZOSiJoNzEVdc9cyJ6cWZc0wlAQ6wp9XUV0\\nScHt2Jx94Smuzs4w0V7lPZkWI6pANSTwAQUsU8Zxm3z/29/kmpcg1deHkdJpNVp84Xt/R3dvitvv\\nuANfSrJTdxmaGECOFOQ4ZHVrg0JskixO8vLLrxBrOgnDJddpk/e7ubmyyPzyLI3dbYSqkuwdxhZV\\nbF2n5Nd57tWnWL91DVmxUEyVrd1biKvr5EQd1W7Sne9nImeyr5Diz7/9MhfX5siOnqTR8dGI0N1t\\njk60eXBSoi/Z5twz3wTjNIXBI2yXtmhsXufUnfdwLeywtnyBvsFVhoeyDA/1sruyjD60n1iOCdUC\\nL792k3FZRZXLTCQzlP2Qc60txooa/9u/fDe5YoGgvkAmmWSgmMNIHubJb/+Y5V0XEaloSYOzl6+S\\n70ozNjLKHXecxt1RWVy9zH//q89iZApU2xL/67/5Tb7wN59hrK8bN5DxrBweIGuQ0WWMIABJEBsq\\neRp85gt/zvUrl6i+4/2864Mf4r2PP4b2jscYmTzMU+dn2Wq7HH3rAzz17a8ykOvF8yPe/I7HuHTu\\nZZ7+i89S21zlu69dJTd6DLM4gS6FfOJjHyKnFimtLNBxfLbWd/ijP/hjPvKRj/Lxj/8H/vab3yNU\\nNeymyU61TLFLQXN2WX7jPLoaEekKejJFKpVhsK/E4MAwDzz0CJahcPblF+hgUGkLwmwXQ5MjVMpV\\nImTMRBLb7aAZJoIYI5VkrHeA0cGhn8mxnytEC0FILYyQTROhmjSEjpMq4kQCQ+kQmwE3EwZnJ7o5\\n363i5jTG0kl818dxVSqxQ0p3aVUdykTEmoqVThFrEb4LAg1fKEhaiK24xKqKr1h7M5hxRG/b590f\\neT8LaowTRmyureK7Nj26ycOHjrG1vMzcxiaFfJ6Xzp3l07/3++wbHubcSy9iZAw8z6ZUtdFMA9et\\nQ1jDr5aYmV9hfKDIw/edIJnzGZ0YZXR4CEvVGezJsDq7gQgjUlaCSLjcfsdR3vfP38/4wSP8wb//\\nLa6fP0f6ruNIkmDh1g3++BMf474HH+Wt/+xXcYIeVNPAkMFTVNxI4MeChGFRrlSIYsHLZ8/ysY//\\nWwKhkDIS5JNJDFnFDwLSSYtEKscrc7fYKK9w99sewUx22Fi/SeBb7FZskgmTrpxCSnYp+C266jqv\\nfP8FVra38dMhG6/dok6Zw5bF3aPTvBzMEYUeWDG1WoUID4SKFMYouobrCaJIoJsqGc3AImLl5iwi\\n20u2USWTSmFFaUxLEIUVnMghYUHk7jXW4zgmlkNGp4bZbtjEtsfNs5exbZe63WRpZZMTd97JyZMP\\n0HBdZFeivLLKYnsRPcpR6egEdYW8UScK5zhx4jYkVWKuXcfeXGOyu8Djb3+C9VbAwsIGpqlTqW4g\\nN+vocQtVldCsFCfuupPlG9eoVndJJmM8r4LbaCJFMqeGFZa2lqiWR7HlHgqGR1EqMaR5SJ0Sfqzz\\n5iPd/PjcG+gZmTeuXmFSe42gmeWhN3+AH/7IYXv3MslcQK2co71bpaC7pHvTLN8MGOrbxxF3nf2p\\nMW7b18cXvv0qr0Ymj77pnUhNjzOvf4vjU0WSlk7suxiaxoff+WY++8Xvg5kmn+ujFUlEXkxrcR1L\\n0unpzrO2ZdDstOktDNGVMgmadWbOPUffPUdxfJnA7CUwc2QyKUInRPZdDCkm0hWsjZeRyue558AQ\\nK9fOs3btEMJtkzBVhnuTCF2h7XdxYaHFellja22ZwbEivu5z+1tu44cv/oCEkcZuOgzmR3GFjt2o\\n0NtTJGEaWJbF2o0FErpJQlX43Be+yK9lC/zaL72fz3/hc5RqMY4cUlENinqOZG6Qhatv0HSbkLBQ\\ndZO28yoPnj7N44+/Bcdu8bkn/w43BjPTxUBXilxxlI6r06w1cFxotjqklcTeVl4YkU8mGe3t+5kc\\nUz71qU996v8fZP5/r+uf+WPqsoqnJ2ihEWSz7CrQFBEYJmVd5XIhwfneJEumoCeV4M0j+3nbbQ+y\\nvVKj5VQIazVEJ+Chu9/EweF97C4u8cJT30Ujxg9BqDKeFNGQItpCxQ41miE04hDHF5jdeQZPHCY/\\nOsD2zjaDfb1cOvsqSVlGigSzSwvMlzaRdRMliJm7dh3JVKkKFwWLUKg4jQaWCLj/tqNkY5WBVI7h\\nYoahgTx3nDxBIpFmZ6PE9soChq6BmmJ44jjNpk1je4t9I0P88Okf4TYaxO0WUb1Mf3eRqQPTjI70\\n49U22V6dR9JNCuP7EUoCP5CIhUDRTSRFQ4kEK3OzNKp1YtXguVdep29ohN7efpQIDM2gJ1dEU1UE\\nEWY2Sd2LsAHZ0Ihjn9hvs3LrJpXSGoFbR3ea9PsBuZ0a7fkV3HoTXU+RUNLs3tghkR2nEaQZG54i\\nLQLapQ0qhMwGMVVZQ1cT6EImUlQ8AcJxuWPfCG85eTs5UyHqHcUY3UcDjeF8hsGwRY9fI61GKPHe\\n7nwrtKgqRbbMPLc6bdR0ggtnXqW8tIYk64SqikNIq92it1AkoZkgBCvzs0Q+NOM0UXGaoROnefX1\\n12mXt9g3MUGsWvhRyGQhRyF0yYY+zuYWG7duMpQxSLZ32Z+xmMpmEU0Pp+lz6fxVrp69yOHxKaZG\\nJtFjCdXIsF2psr66RqMdUIvyiMQIwq5xtKvGdL6Orgi2G3D0+GnwbNZvXaSQipDqr7NV9rFSo6hR\\nhOQ2cFr2Xt4ka3Lk4BgNH7arET1ywFTnDT50zKDHkJmZ3eInbYWJ3CD7u4boyWcpt0usl9YppIus\\nLa5z+OARjGSStivQzQx+FNMJAtx2iNcMaVRX8aWIZttBCmKGentR5Yjqzip33zGNGpTxG1vEfodc\\nJo9pJUGOiZSAhl2leuOLTA33MTYwyljfGFYMRd3H8CpYUkh3oYfFazO4G2scK2ZJ2Dt01mfJijrn\\nnv02u7c2MLyIrJ7lyMEThGHAJ3/3EwyN9XNjcYXJQ8dRNZO23cTttDE0lUajwS995J/z8JvvZmNt\\nCy9o4zoucRzT3dfN8NgQUwf3ceDgEY6fPMWbH30bT7znraRkh35DIqcbNH0JqThAzoLQ64AfoMkS\\nKoL9+8fp7e6ir6+bwd5+EprB+tIy73n3W/+HHPu5vok+O94P5TZKqU4yjojqTRTVRCfJ8q7Nelph\\nJhew7giUTAGn1aTdEehyEtMXmI5LKGRCYpxWHQVw01miO++jVKvgz86S1FUcWaYTm8SKBqGKL4Or\\nqwRexNLaMmJ3ioGpCT7yy7/Ii8/+BKlk8uyV10knEgjVYMdtsbG9Tt5IYZg6LSUi15eHqk61vEhP\\n0uAtJ++nS5LpaDXiwCGTVTEkhcpKna7eLirra8zfnGFj26Fr+gHiMCChmQihstNsM7u4TM22efsD\\n9/H2xx7nwP5hhqdGSOfSXL54hZdeucCttQ2Oxh6O7yB8jbRwqFVbWPkUOdOks7hBp7rLvrtHSKWS\\nJA2doNEgoWokFI2w00ZWBKoEHiGymuXm7CZe7HHsxDSJpGBwQEdVLWRFJ3ACMkaGXCPg7kIXE9kE\\nW4kMqaFjaJUE35QP8PR8k08+9iCPTfXx0l/PYrUhrvsI3cJDIdLkPb+pKqGFKgYyp08c57aJAZ7d\\ncJmPVcamxjG2V3HLoMRJtDhEjiGKY3TJJPYEN69dpzlxgMhMsbq5Rhj6KICPwFNiKvUG6xtbZHNF\\nPM/Dd6Fpt4jTXew069w/MUX/kXvYPNvgq//4NA+cvoPBQo6iH2M1dwiul7B8l7elI7KdNcJOhxPG\\nFF3JHDfWWwyrBlc6ZaZ6i2RbbaKtBgm3itE1SuznmLnxFHagMTZ9G9eb2yR1QX17ga+/9nUmpic5\\n8tAHGTzxEN3L6+yv3OKBe0/y4gWbH55ZYObaD8iHcDjZj53MsdTaZKO8wHef+i6pwXuZ3v8A8upZ\\nRpinW8vw3MwutxikqxfOvPQ6d+SGKI6kSeSnsFsSz19YQusErJefpffgYfYfynLp+jx+BDgQeBCr\\nKdAN0rk+7HZIp1alnd4mkDUWVnc4d+4ceuMGqu/QiHq57dH/hQOnHqEjPELPZmtxljQdBgYmWL1a\\nR/Ejhrq7ySZ03JqNXLd5k5aHEYmt7QqmEtN/9wDXrpQIr1xivFVnMJGh1u4glDbDwS733nWcjOrT\\nCUP+/lvfx7dDHn3TY3zgPe9ia2meH33zO5w4dIC0oiLls/z7T/wKUSjTbOxt+HnCYXV1np5snna9\\nw/pOBSmlYvtVOoHP00//hEEty+/8+q/wymYJxV7i2tVZlta22D95iJm5Ba6dn6fQ3UOkyBycPkJg\\nqBjmP+Ha58XRSf7TJ38VZXGZL/yff4JvNymk8sRqFiWVRclLVJuzxH6ToOZR0dI8c+U8565cJ2q6\\nhLK/J1QOQtbLGyBHZLoKyIV+LqxtoeS6MIkgjDBldW9rRg0JDKh4Dtlsnpn5GbzlKTqbm4xPTjG7\\nvMD48SOMjAxSK1fY3tnFzOfYl8/jVhukTB0jm2R+aZGCm+WJ97yHX3v/u7ny7HOozt6xwktnzvLw\\nIw8yve8wK5trbG3fYHNzB8MaYWNnlopZIpICErrBRqPG3OJNdMtkp9miHAg2qi3OPvUMd28eYnR0\\nnPM3t3hlvsJbH7+P7nQBESg0HYfq0jJbwmVgcgSprx+z2eJwV5GEqkLosrO1Tk7WSCRzRE4LKRLE\\nwZ4IN5QjwppAMjRQZJqtCMuIIN4TUxuZBG7kstNymY51+tNpupQEXZkMLeCd9z7I6499hKMZjdXS\\nTUTfFGOPv5dn/+EbaFYWJRaoisALAhRJIQ5jYjliY2uTr33tHwkaFTa3apSlFIFsUtteYbpPRhn6\\nf1WGHmqsItwOuhTzpuMnWbB6WG408ZsOSCGeEmIpKloY4voBu60yWjaDXWvhxxa206GY9dErc+Rq\\nCxxIhThRhem8xB1WwJjmYgiHdMohQQdZsZFMBVUEoCmE1y9QDiXySGQ0g/4eA3SdlltC2a6Sk3yC\\nMMFkbPLWQweo4vPjm8+jdyoMTE1jSh2K+4ZodJosrm+yaTv07T/A1uIlxnvTXOnej2UtEthrxLaE\\nluqnpyuPo7ZZKlfZ2CqjNmYJ222Oq/M8cLuO3azyymqHK9oUpr6LmvL48ve+zi/+6kdpG3mM/BQj\\n2TGuvXSGaqnMmnuLt7/vA7xxZQYR7BUxRQB2zSZOShDtafBc197r0qe7MVBQ23W6lTb53iypfQ9h\\nDu3n8tUZ0opNWjQYCEPcToLlpWXKCzZprcjFjW12yhs0K1s0ylXaDY8gBtvtIBkS61GEKpsk9AJW\\nnEEzFQ709aGmLTJSlfbMy3zj+hk6mkp9c4d2PeCH8/MUhga59/aj/MoTT3Bs+hCa49OwDbJmSEqR\\nIKqQNFQUy6Dv4Ah+IBPlCmyXt1FEzMjoIHJtm7c88U5kT/Cjs29g16uMdsNot8X8GyUmhu7j5vWL\\nBO0abkqh1uiQz+UYGZpkfGzfz+TYzxWij3/k19lWoNZpk7/3ARQpQblms9a22fVrlIXDdqdNJAnk\\nyEOYAdXQRjXzhFWbVuQjuS5SKChVa/hIpBRYOvMSvh8Q9XRT0RQyrksi9PBFk7YSI1IaDiEd2ybd\\n3U1lt0p+cAjJD9le2WJ0ZBghJAw9QbGoICSDoZERdGQ+8L738eQXPscv3P9hDFLcd9dJxgYGmHvj\\nIrolcXj4OIWRAe44fgeSCJjcn2R5e4eXL9ep13UWq0XGx7vpSBGqJOFYGlsEdMXQrttstVq0e3u5\\n951P8NLXvsUzL90kMi3yw1MIksxfWqS0OIfj1unrGWTqrttI9xahY5NXZI5N7mPT1DH0PcOTbsog\\nOntSZGJEHILY8ygKYWIGMmoQErQ9UpqKrqUghpbjEirQ0RXaHsSagSkHZGUFJXJI0qGkC/oF7PgG\\nn33mPBvnF3m90qIWRyR00MK9LTJNNWm7dTwcfD3m6O13Ie82CXf+ESvbg2XmkFIR6XgTBRtPdklo\\ngBOS1DWSvo+0Uebg6ChBpcpALFOOQ9qyRLITYwYhB2/bz8ThSTwpxLdDItsnGXnk3XUOJF2Oll/l\\nof4qH3xiiHFLQ2tWkIMKUeSgaR6ScFCUEFU2CIM2kmQiJTTCMEBRVNx2CcnT8NoCEw1J05FDn7jS\\nYEzLMtJfxM6onBgrsNYZY3lnl+X1dTJDKRbXN1h68WlOnn6Q2w4f4twzaazCONMHdKZuzrO2sEJr\\nt8UmLZTAw5fBjIsk83tuhuq1Z7jz4WEGEiZvXK9ypRSRPjbNe990nNee+hY9JvzJFz/Hm9/1Poan\\nxqlVVzl0+iRtO2R48ABe00cKBZ1wb6xOUyUct46npFCjCCEEAg3bV6DV4dD+UdJBHUuXcbQuQr2X\\n0twKolFhsCiRdVvUtyo05krcnF1jc7PO7q5NpVEnArwINEVFikHSVPxYAk/Gd0NkfMK4giv2xM3+\\nQhtVCcmYOslkmq7eblKZNIOOS6na4sbVOpv9kxzt6aE7neD8sz/hdE+BntEB8GxMJcAJatS3NtnZ\\n3KF3bJqmMAiUNAlV5bN/9hecvu8kH/3FDxC0mgSBS5g28MstGnWVZqNDodhLxwkYGhzEzBgEhAwO\\n5pi5dpEb167xxDvf8zM59nOF6FtO3Mu3vvK3XDt3hZWVEis7LdqShB01UfUASY+Q5TQZRSEOI8xA\\nx9JS5LQUth4hXIOE7aIHIcpuE1+E6KZCjwGteoeGHaD3FEhqLka9RDplMDY8TJS1WFqZY2PFxshl\\nqDfrHDl5F7VKmT/8j58kiHzavktNrbOzW2WrvYPkxwhJkDTT5JJ59g9Ncf7GDboHhghVndtPn+Zr\\nT/45D9x7itMHjmLpaeZu3kSx0nSPHaCpdtCHxhnJtIhNG7sd05dIEMUy9Y5AiiJaK2t85jP/F+//\\nzX/Fph1y7tYORwcGeP3sS4weOURz9zn0lsf+4T6OHbuT7sFhGkmNptPCartcuXqJq1ev8/i/+y2O\\n3naM8xfOo0s6jUYb1TCRJRlF0vD9iChSCeUOOSsLHYesLpFPJtG6uvFCj8DQiMKYptukTRqhaViy\\nRkKA1G6htjwa9Q22Wi71186y/PR3cWvrmKaFqoQYfgslUkCNcbxgz/KuG4SyxGalzMLLF/jQdgnd\\nN0n3pcj29+N7NrHcQBCCBOgQ2Q6W4/DYof00QoOhniFG73+EZ6+dYba7j6KRp7K9Td/oJJqhIzfL\\nGDuL7I8qHJhOcOrgMMf78+TaF0iJLSxqUPHAM0CXEFKEH0QIRUIoBl7kEqOCFCHLIJt7iRQroaHG\\nAkOKkPCJYptAikhLPrG9SxRIiAZMJjuMWhKPHB9ha/oe1tolpMBisWozmJbJJzVQ05y9tctTP/kB\\nsqxhJgu4hSSxaZJQNXTPQFIKNAKVe24bZbDtcXqim3qzw1zT4vA9dyKZCvedvoel2YtsLM5RFT6v\\nn3+ZheUZjp84Srq7l7WdWzRmrlHbqWJqBqoiCBBIaoxiKmhKTCah0HA9/DDGVE2yOYuJiT6MTExX\\n/1Ecc4hSuYlw2nSLDjuLSzz7yiss3FrH3dzAjsBRQRgmoWoRKQYuKg0AKcYNIwJJJXJjTC1LIFwi\\nVcWOQZECVD2FFLjYgcCsVFlb3yWrQlfOpH9shFzPFJ3Q5F2n76LbMgnUkLNLM1x4/QwP3/cgntvg\\nm195krhRRfYjhsYXyQ5P0fAE1d0mou3zpc99GSJ47/vfy+LmBh3VINc/Sm/KYmc3ZmHlMjfmvkNM\\niJlWGJ0YoFavs3+8H11L8vyPvgv83v+QYz9XiP7Gr36UlaUl/CBG0hNEKYt0UiGNgqpIIMD3AzbW\\n11HViA4enuTQokLb7VDzNMZ3d7kz18XDyR6SscR2Jo0y0E+XHzHeX2Qt3AuqyWaGZrXE/LmrdKRw\\nLwBqpnA9l/HjB+gZ6uHSxQsMdhX4jY/9Ok2vg+357DaafP6LX+Txx95BLCRGBkdodzwuXJ1BUzWS\\nCRU5Ctkp18hlBpEwkLWYUAErN8mNuSbnbt3E0cbY2m7Q21OAWBA0NaSiTCHRy+Gh2ynNzyKRxG3X\\n2b46Q2l2hcCr0ZYK1D2fXKNF32SB6TumeeoHP+JbL0dYcYeSHBEbOl3NNtL6JnfedTeKbvIHv/+H\\nxH7An/6n3+PlF84QI+OHAl2WUWUL4QpUrQOyi6ILxsYHyHYl0aQewjCkEQQQqxSaHmq5hRRESKFP\\n5DqkrC4COyArywwlZV5/4yeErRVUMyaQ9nr1CBURyoSmQaTIRMgIP6LdsvnKV74Euw4fzpqUhMIN\\nz+UDb347m5c8/NV1CsZe4ToGdNUgGUQ0Zq8jp8dJC4WHBwe5q/8dnNt/nGT3IC1J4cbcG7ilGcbV\\nCvdOSIxMj7G/x0B0ttBqN9GFhxrHEAmIZdAEyDGyrmNEMrGiISkmIlKQVAkpDoiEhywEMntbOb4f\\noAj2xBsyyEJCRA6aaREFPhlJwbRdRKdKVFtiNNXNaPcQh/qnubS5zgvf+nsy1gcpFPMoZpKri6u4\\ntV2mJvZjGBnSmkleEgR+mqApga4xkFF561g/g0mV11ddvnphm0rxKsXpFn/12T+iWbHZrboM9o+z\\nvr6MYSicefEcRiJJGPg88vADfGvuElY6R0HJ4IY+bttGTZtInTZyAKFno5saQejiCYn1Ro1xZQzV\\ntmgvrzPSBZWlVc68/DI3Zm4i0PGimKyZoiNBR1EJJfDDAC8MEaqKG/rEeHv1c8lE0mW82CEmwgs9\\nYkVGjQMINaLYwFElXAJUPUJIKqW6yxuX5kjndKb7h/nJV/+GD33og/zD0z/mk3/7t0R9g3z+i19F\\n1xQK6TQj/b003TpvnLuM/fxrSLGCFEIqleDA4f186xtf4+aVc9QrdTqxYOzIEVIDFpeuXMDxXKJI\\nIhIBeTPPgX0TzM/P86YH7+fW3Aql1fWfybGfK0TP37xAV9cAupreC7JJDvg1JgYGsFsBqEmsdIaM\\nZWEmDXQzxQuvvIzrtEDyQU/TC3x4cj9DO1WURpsolYehERpr6+xuzFE2LFxNR3YCVEmDYhFBjCaB\\nm5S545H76D96iH/43jcZHBhCzie4OD9DMp8lNjXirIGvxPQP9lLMdhGrMiERTz3/Yz7xy/+CpeuX\\nuXbhHPPnrhPXfA5MHSSUUly5sc5zz6+wtC6RG5lmbvkqk/uH6TQrhO06amggqyp5Lc+dE8Ms0sMV\\nW+AGAq9kk0h0sKQOm6VlbNdle3uHfVMjTJw4yC8fOozrq2SDKnE2RyxLJBotvvwnf0Lf4YM4sULo\\nBOB6bK9v7FU2XYeUlUCK4j1ptKyhRwGyLBEpGqV6k+nbDhJ26nuF00hCVSyyDR9at3BkB9XUCFyB\\n7QeEskq377F47gWa69fokpookkKARhwpSLJFrKqgGAgChLSXQxGBhuQJTh0cQerqIh6dZOyBh5Dv\\nu4dg8wrSWhL8EMkIEZJCEEioisbC1ipba2V8DKx5haSish2nSNgOUVKnH4+CEXJPyqNX3aUYOcjb\\nFTAikBzQDMI4h6Rl9vrsOIjARRYyEgqEIAUhUugSh94eOCMfIWJiVELhI8UyIg6RooCYEEVICMXE\\nkWV8xSOhySidNors4QRNhN/Gq9fJ5ft4eHSMay2LlYsXuf+Ow8zMLjN3aw5TFfybd/0rrpy9zuVX\\nL2J294JpQVLitukhpvQtjvXq2K0mz82V2clNsuoG3Hr5eeKESlrrpi8/QtLKEhS7mVtY4tiBO5ED\\nDQ3B1s4mxf4C5Z06bifgyMFDTB+Y4vLli9RK22yvL0EQoiUTdA/3o8UO8/OLTBQyLJZucSBb4OXv\\nPMXitVUqITi5JI5iEscRDV/gKzJClfA9Fyne8wBHUYAc+2hyhByGxHjI/FS0TYwaQzY20QMfT0QE\\nqoUvqQSqSiRb+ELFN5Kg+fh2jdlrC1SvLnD1/EskxoZ48PYjaL1DOFKSi5dn2I01HJrs1Ku02jWG\\n+go8dPIubl2fQdOlPUv9/Cav/eQyjXpMrMLiyiL7PvoAN25eIvDANFIEgUOn4/PCSz/g9Kl7iCMb\\n265gJX+2lfnnCtHixBi5fDepVAYFibQuowkXyzCRMx2arsdmbZ1ADZFlDV/1cRMR6DJqbBAmZA6m\\n0vSFVeTyBgQSumyQMxKk9w1jHZtGSiRwIwnD2ZO62rJAjiMKssxGq8KVVpVrly7QVGIa5Q3amsJz\\nNy4B4BMiFIm1pSVe+dcvUrQyPPTAg+zsrHL/6bu5+OwzfH52L4lsCZmi2UXN1jjzj1c488YSTpig\\n2L+PSruJohk4bZ/a7i6G7uH4bSQtj2UZLC7v4gYZHn/Pb3Br5gxJrUVlZ4GYBIu3llHVkBifoeFx\\nktluNC8kH0uoko4Tq8hRTKpLoyx8/vQrn+cPTp8mZZgsz85S3lxHNmJ0TULRYnBDYiUGEaEIE0kx\\n8T2XasvjpTNv0JUy0A0NLZ0hldyzQFV8h/LOKvm0QaTqYKnsNur0LV3j7HM/JBlGqKqOE+2duWYM\\nCc8XCBRkSUYVMqosE0oGnis4mC1yemiSoSeO0ju0j7Jscevyq2wtzjEUC5AVkOegQ2QAACAASURB\\nVCIEEbGqUddjOrkCcXaUVsOluVPFatuEXp0BJUPWbVFknfFCDdPewMJBFj6klT0nX5wASUdVZALR\\nJgj2+luGFBFHAoREHPhIIkIWLiL0iWKx99IqqcCexUeKIQw8TEUljiGUQMQ+oReiqhD60p5YO7aI\\n9Qgv3sUIWsSlXfxWlX1DY3hmmqylMHrPAX7jw++l3mgyNDjKxnCLygtnqa2VGJk4yNET04zoFSaC\\nMkVF4tWVCjdtnXBwmkzUJhWZ6JpG1I4orS8ihI8nXGJ8VtZmmRiapFarcfbFbbSERuS5DBZ7sWKY\\nvXCB0uoCG+U6dsMmZZqouT6kRA5vo8xtAz2cziS5ubLOUz/6PpEToqoGgRlhqxJ26KGi4McCIck4\\nrosmQUpS8V0XQ9UQskQcqkiyiiz2NIiKzk+lHgqIEDQL+f9h7s1ibD2v9Lznm/5hzzXXOXXqzCNH\\niRTVEiVRLYlST7JbthtOJ+nEdmwgceLA17nNZeDLBAgCOEDiuDvttpP0pI5bLUrWQJGiSIqTzjyf\\nU6fm2uM/fVMuNp0765a9gQKqgAL2xsaP9/vWWu96Hx9IhIPgkXOiDVJ60hCxNqKzAUJU1GXFnWuP\\n6Tx6zJXPPEu/mXJP1lwrd5hUE1xdEsuSLDY8uneN/+3he2QEfudvfpMb1z+g8nuMdKR7Yv7Wx5fn\\nwSSnzihUsoRzilZnmX7PkCWCvF9zML3D0vGE7tqZX6pjn6iIPvepT1P7hiAcBoWMhrrOOHAFZqnD\\n6HDKrGxwwdGoAh9LLn36LPVsShoFTzLNif1dwvAxh4erxKJmfWGVc1nO6zsP+fBe5N2VVUJtWasK\\nvNHsJAZFw2IxQYYMXEDse6KWeB3YuXeVFE0iFU4GHBbVkRyMD/no6s95/Y0fcHJzg7d+MOWVtfPs\\nPz5k1jSsLWW0Es1rb77LYXWOSbhIZ7XFkT+krmt63R6rixtMDnZ45rnzFHFKlD0aUbM/PkSZk5R1\\nD9k+gRmUhLri4NEjxmPH+fPrROEhKmJtMI0lFUOOVIYQmhDmITb7VYFtGXyiSI3i2tWPmMyGiLYh\\n6bbxZUmMHplkROHwY8NwWFER+eiDW9y48Qs0Dp0lWC3QMnK+1+NLp86wgKWXRYbTQ44OxpTTivv/\\n15js0X2Eg1lo0ygQTBFyvp4aZUSKNoRAtAGHwAtNsbPP6qWMv7j7Y7be+h5+rHh55QRnEoEQDVaD\\nVhEVIZjINMJ700Pu1QbvU/o4/OiQ0fZ1BsU9TmUTzoqHDNQhZjCAtE8lEqK0ED06pFA2yLiPiFOS\\nJAffxfsaPLgmorwnxgoRa6SKNDEQTYqLEEKNlhC8JzXqYwqBoUwkrRgwzlOXIEyCCCmNC1jTUOuI\\nkjNyW9AuMnbuZUzrSBMtndWc//6f/Kd85/Xr1LXh1JUX+Y3/vMdP3/iIL3zjtxkwon7vJzxzHtx4\\nyM+vb3NnssKjrELomnoyZilbIMs0/QVDNbF0dJuDUc3R3iM+muzjaoXwGkdNkmnuXL9NW6UYEehk\\nkpNXXuRbX3mF3//9P8Ivn+Rbv/OfEa+9yVfEYz78F/871x6C73SYdU4zrqYEPWVqhwhSQg0GR+Ut\\nWZqDcwgkXZESfKDG0OgMSAjBkyQRZMDJCrCIRDJ2OZmyYEsSKWlLjbSzeXwlkYqccWhBukqSNlxa\\n0Lx0ZpnJ/g5bH37A0hdeolvtcm+/ROrHdEiQKfi04tTzZzm9ucp4+IALJ1dYP/MqExVQyrCkOnS8\\nprMY+MJXPwuihwsKIR2z6TZaNjTyABcqVjZOYcNfY8bSW3ffJBIJUuCJCCFQKJrgCfsRH0FnEmU0\\norG4siYYqNuSkYIsav7P1VN8eyD55qtf44WNnDYlz/7X/wW/L3Z4+/F7uKPHZHVgYgW1zvAqxViI\\nTlLpJziRQUygiEgR8bFBmJxmIkh8BgpmeY3rZKSbSzCtGGnHwegJ2ZmnUK9cZsEkpNlxDiYt7mxX\\nrA9qjp0c8ODOHicvnKPqjqiqglu3riG85ubde3z2G5cYDAasrZ4khgM2F1cZ3ntM5tssLJ1CH1vg\\nyf3/B0eNN4oyyek+dYldGVgQinbdpqcDUZU0wIiMF3/jH/CHf/gHHG7vsiaGqNkNOu6ArjhNXUnG\\nTuPTBB81aWhRpGOcq2gbzWy4Sz9RzBogJojKIaWnaFnsSouDUDJJBKG/QFxd4daN28ThAaUvSLIc\\n28wwkTkiVGs0GoQgSktQllzW5IWDrM1fdda4G7v8d26fr6xF0nSLE4ttjpzBmnWWwjba1R+D6jxt\\nG6nuPMJttnkcp+RLHU701viyLMmaGaNpwXuuS1eukD/xnN7s0h1McXGId2OcD4ho8KREsYBoPDGM\\nyW2kEeCiR0qJqgXUCto50VuMUCTWI0JCFIKGgFdmDrSrHJlM5khtOf+cQXp8rOcJSEGRBgEiw0aP\\nsVssx23y7Q6FPUsvvMBBcsS9+1u8+JUXYGePM6vrXD9RI06exN77Hs8vNaynGf/udsp3yjUeoIjF\\nFr7RDO0xJsUWSZKjvOTc2TNkueGYlgyHQ3RTQ2mpVcZRgMFSj//4N79C6i1nLn+a9sZlLmUz7NJl\\n/sVfvsuZ2TZ/e/s16skt/vgHP+NBkaFXMpytmbhHjIzG40hEhveaSmcM5kBXonVIIoYZIfVENCZK\\nEgdWenymqOKMJHhaIXxMBdAsuYoa8CgSJ5F4vNCUytDDcMk1nFAHnOsdcHFd0c07XH28zy+GCXvL\\nVwg/vsXXPvU8X34pcNQqGbcCVfC0VIcF1Zt7jbWkVAVaBQY+kEVPKEomUXBpdIZBEXF6RC0jwUkS\\n3cM7RRoXUWmHUxsXefDo5i/VsU9URLcnR8QYUUoSIhAjMkKIAqkVLoT5RNkFjJAoEUBIfAjzgApm\\n1DPF0uIF/vHv/VMy2aUqS05dvMSvff03+PH/9B6ulDivISoEIO0YLyITKahURW0d0X9c9kmHcg5d\\njDmRrXLl5HF+9NbrFC3w3YxZlZHmPXqbGywsdpB0Odbu4UcH3HjjB2zdnfL8s6+SdRKE0WQDw/7O\\nPepZwRdf/gIfzD5k49Q6y6uOE4MedXnA5skBX/zyM7z/3gP2qxmnjp+kqAP7+wUvfOZXiU9vkIUD\\n9u7e5ustw/lyTJUoDpQjiwkBgQ8B0Vheef4p/O4XKfZ3EOefZivt8bC/QaI7mKAZZC1CVVA3FXU1\\npakKEiOQwtM2mknwdFI5x7EohYqOfiLoJALpIhKHbTw+Ck4v95mMPZlUNNWMVpZSNXOcsdOANyil\\n8XUkyzvs+ymJkkgsa1ry5I3XuaEMm5dW6JtFJntjHj8csyg9CAVhXj7XtSQagcokmdIMrGC1cby0\\n0qYzsfjSElwkOI+LFQezEXZ8j3NnEwb9ChMLCHFewzEHNwVhidEDERMFJkpwdt5GMAbXOKRS1HUA\\npUFLopAIEpwLNEFi0nyOJlEWIR1aGWTaohaGpglEOw9Twfs5DYCAdwZRRdgfMvO/gHiWS8fWORgf\\ncf3hI8pKUM0OKZ9c43j1hCv9DrPhEW/cvMPdKuXZl7/Kg3v3yVs92osbuD24+/AJZRAMq4QuCSaJ\\ndDsLmBCQLQFkpHXDr//6r/Ff/Tf/CF/M6PUXGRUW2ZE0o4JvnMr4jXMvc//6+3z/hz/mgATfymls\\nReMcpVA4qYjREWpLGqElPNKXJEYTjCIgqL3BiwwhBYmXZExoNw0xeIIEA7QQJALwkU4KudLkAjQR\\nCSjvMUBblyx2Ek4tLrDZ7zKrKt55vMcbe5Hrs4qjgwbrKh786A2+9JufY2OwjhEjahMxJp1vLNZT\\nGlfSNBVJnjDvIiiQKUoYjuodrCqxCJwTCKVIski/Nae9BunJ2y2SJPmlOvaJiujkaAQStJp/DBHn\\n3ScfIlHMcRMyCjKTgNZY74k2UMUaZQyeCdguwklsGWjygEcwPhxhp44w8jgxP51yIYh1hVKeIsyw\\nKuBiQ0KH4BSOBqQlQSGmkle//CX+8d/7+/zO73yLWw/2aJ88xedf/XUW1pY52LpLx2iGDye8+dE7\\n7Ny8iqrB6CVOLq2xvTuC3HP52Qu89aMfs6h6bN9+xP7WI6J4wle/+nUubKyTteD4+ozHu4rOfUtR\\nR1Qm2d8b0URDb2mVU90B8er3+Vyni/mLP+PP/vTP0K+8zJlv/Q3K6zfYO9hnY2OTzeOnufHz93jr\\n9e9z8tS3iDrhs1/4Cv/8X/7JPI4Og2sqRITgLImJOK+oqxlaGLRR1M7hHFjASIdtIGtlNLYkxSGR\\nyCBQUTAdDhkeCQIGZebcdGU0lfdkQuEUOBfo5ilRGJTOaNwUqQJ2MiJYzx//ZMas9Lxy+TjFzg4m\\nRBaMIwY7F6+gECalKCsuXjnPp5/7Cg8f7rM+fkR+eBNTZPimonaWonEYYZDCsV8MaacwyDtzq1RU\\nEPR83C8CUkaIgRAlIkhEFNiYEqIgqoQQHCKK+UGt5rmZOIuW82cSNU/N0qo9z6GkwgmJFQqrBDIV\\nCK0RtSZYixAOpR3RgXaW3E1Rfotp03DxUy/x7Wsf8O5Hd3ExoZdGJte/y6mlCetpzbvXHnG0sMLl\\n5z5HbRb4/Poa1jua7gJ5+4i148dpSFhbOk6qND5UNL4gOItoJNJL+tby3OWn2NreZXV5kUlZYUxC\\nraEze8jfe2GFW997jR++dY1xPmCmEyo3A28JaCwK4QOZUGQ6I3Eg8LgUXHRE75EolM7QHqR15E3B\\ninYMMuik0M4EGSldqWlrIFZoKUkaj45zCGAQ0EaxkEBiPP1lSZbCwdGID3drfjCMvFXCVIHyFWSa\\nWeV47btv8Bt/60usrPUY6hrRSSjLAiEiqUpQLszx3bVFKoUykohkGKbQTlBB0dSevJ2SZA4vpkxm\\nM5wXlE1N8zHN9j/0+kRFtFNqQvQI6Ylxnkwt5FxItZ4/9Lap8cphtSZKEIlGS0VsLDFPUElKUReU\\nTPA6I4Salk5Y7q6yunQc24rz9xIpikhDxcyNkSaSe0lb9pA1dDOJjwXGdBC6h0sSRnXDZFxzbuk4\\nL//qr2OW+lRNwfhgzM9/8i4PH+5jpENKQewklDFhFAPtxQHjouS9t9/m5S+8zI2rd/nF/Tu0WgnL\\nvYzpcMRwMiWp5qXX0f5DqtETjrWPY4+GTIcjzn/qGe4//IiFBcvLi8dY23sI777F7rjiT1//KdVr\\nb3D1L/4VRwdj1o+d4Pf+wT/kT//iO/zi9k3KjqGYHtEdD/m6m+JnUx7VnlG7x8ykkBtU3SD6PawI\\nVKmirKZUCUSp8Xh8iPOno9+l0gnTaUmmI1m7y2zW0EQDUmNDATKgtEQj5lCvMOcdS6GICJy1aBRG\\nZVTWMUk9Y91QujY/f/sB//OHD7hg4L988TJntcfoeQ4lRCSSGBPq0Qh55x7JwYRod2iYUlYjysaC\\nNMg0xTYeiUaIHkdFw5QBWnucSCEajLeksSa4khgVwScorbFKQ9rFxxQpBYnw+GaCq0pMU9MLFmQg\\nxEAdFELN804b2cWIHEipoyN4UKEi8YEYNJVzcyYWcX4bCzUYiQoBrKUzFBxdfY/PX3yOVn+V7/zs\\n57QZ8bUNxUW/z3gy5HrlmS0e4yfvf8jF889zsH+AlwG6+5gnD7h86VmORiOuf/Qm3cUBo2lJp79I\\n7WqyVCBjQNvAn33733Dt5ikGywv81jf/Fiu9Bdpb73D1//0Dbr72Jzy5v0+pYCw1Y1shg0WgCEKT\\nIGhH0E4QgFoKYiJpfIrGk0ZH5hxJ2dARsNoxrC62GKSBjojkCFpETFWT2hpt4zzU+eOJfJEayjQj\\ntlt4LZHaMTANLoUnlWW4vM54dQATWC5L8npMLKeMG42YjhiNS37wwzf5xu/+JkJojsaOaaXJdEo/\\nz2nlEm9LGj8Bk+FJ8BFi1ic1Fu89oazxNEyKBp0YGq8wSZui8dQf03//Q69PVEQ/deZZlFIkiUYp\\nNe8taTHvjar5RNR7T1QRLyBppyAEMlFkWcZEenohx0wcs+aQmHRRDgiSft7n9IkNhm4IzuErixSB\\nxs1YNJAET1bIOUTLGU56wzPHT/HWjV/w3vQ+r7/7Pr//R/8KO5rS1JIffu/fka6laOm4/dOruGGk\\nm2sq5XAtQ1UJMpnxaHebz7z0NONrt9FecOvGbfbGB/jUY4sp+9sFs8mMo8mYQXcVHyQiwupgkclW\\nzdHuiNOnTrH95DFl0TBRlv7qgOpwxHOnT3DfDVGHju//+Q9Yl5aVtQV29h7zz/7Z/8Bg/QQFkdd+\\n9GP23/0Zv7XQ5j85toyra/7g6k0OU9gTHURjyWclI13Q1CXtqPHB0xkMcMB0Nv14UADtpIVvIsIJ\\ntM4oRzXRCq6cfYqljuB7P/4rEDUpjjxqbA2tZMChj7hEEqLFaIO3FuqIaqVIXYGf4gigM6Ye7vqK\\nJ4cjWLZYKkgB61FYBrqNuL9DOPgZ62lKjEMO5ZRUCJyGECOaSBAJQqeE0ENkGm/WSZYynDBYF1HR\\nga8Io0Ost4g6ohMDiYKsQ5Z3wTXYcogjIlQyR442DWiQqSZIkEZgJFhKfMgIXhNDIIn13Pto5yG/\\nic5ohMM5gRTMS/o4xlMhRY8YMtq7D0GnPHPlc7xuS5K9q2x0Eo4vwE92RxyuX6C3fIHNg3tc2jzF\\n64/2OX7iBL1ehvMW4RSyccRmzNLiMttPDjh/5jwfXv+I1WeO8eDuL7h8+gJPP3OJb33rb3P77g22\\nH9yAoz3Cv/3nvP5v/m8mwzG+v8rhcI8iOGB+SydCIhQqgLYRhcanKVY3zGjoqi6ZHbHsKk5ozalu\\nh7UspZWUSDkDPDpmGKfnN1QBMVUEDCEkVCZlP5HcVwmTzoDumbOQa0yYsU6FOdpnGmr0mfPMWosc\\nizkndcr+0TZlmBFEh77SlAe7zIoxhxNN6K/T7XbIWxLhBdI5hJ/fbBcW7Lxasg3OR4ZTg9KQ5Zp6\\nust4tEdqWmjXxroUk3QZDitc/GucbP/Kl15FS4WvK6aTCVrAwkIfJSV1XVNWFcIIjoopP/7ZT5gU\\nU7y3CB8xRA6ExARYMBn/6Hf/I/KYYIWiFo4k1+zcvs1oekQryzHS46odji9rlhPNwYNt6smAabZE\\nVUgGIRIPJ1zUCaNBysLGCR7ceMjBwYTVzeO0No9xbes2R/duo1ybLG9hqSHWpJOGxQZa4YjT3nL3\\nrTd4+tkXwVk+fPctNhf7DJaX+fCDLWg0qpnSjiVZ1iLLMnRicFJyVFdUPiBiJEyn6CAZVbDvFb1u\\nn1tbj5lMA5PDMSdPn+fc8oCjcYHJO2z2lkgbh7ozZK3b47krl1hppdz7+du0pGLQHpAEWM4y8rRN\\nKwh69RhlBM9cOs83vvZV/u23/5zJZMajR48QuSMlcn5ScCLVLOQdWomhPeiDTtjdH3I5jfzKr76I\\nrwv6LtKKBt/u8xc37/Pm7jYu6ZGg5r7MVOF8wFjPM2TUE0EiHDOjiCrn+eVVnum0MHGPmCQ0NGgJ\\noonosuR8qsjcBMoDZolnnCqUFyij8VIRo6fTbwEZ1awi0xmZh4MHW8jFRRZW1rC7O8ymR/gmMLHg\\nxlPk/oROWxNbBtPpEGNFM5pSV4FRaVhYOYZJu0jhMGkHbyRRVNRxhrKzuWsCSKMlczXBQx3mPTTR\\nlCQBvMxwsoP1FiMEMjiEHzFOFxjYBrF1n6q9xm8/f5l4e5+n1S713phRe4MdvU5lYVVHsmCpSeZV\\nwNQRG7BBMI2KUSUoRp4wnNJ1DbMHd/HrhufPn+b8+VM44fnRm++yffs6XzzRZW/vDj/9w3/J/gQq\\nscy12/uUKiVK8EEjhEbHgAaEiDhlsNGgQyR3Da04Y9FZNruS890263i6tkJTEaLDfswnatkKI1NG\\nQjDsdxkmCV7mJKLNuAXTLKfurFBnHapulyo2JEIxdhnt5Q4oSWMMB+MjivEWrrQMi4JSRTr5iFIZ\\n1lbWycQ6+4UjeI3QAq0Ns9EQZwt8KNCJB+nnqGypSNKcxgmUSSgrAWqZXr9Dlhhi0KRJhtI5dQWI\\n9i/VsU9URN9/5+05+GpaMNw/AB/o93p46ygmUyZlAUbw9Gc+zcrCCpubJ+ereDHQMYYmzYm2oadS\\nZC2Qs/nGSdAVaUfzzJWLlGVNCAFVb/Hlp9f55mdPoouCb//Jd/nRjxtkJthC8+DhFneqI8Z2THXm\\nFLaKnNk8zemkRavT4a/ef5dyWkLszkua1DGYelLnuJjB5zf6XFm/DH3FO5OC0c2fQT3i8ysJxcF1\\nJttTTlWHPLdxhWPs0y8OsaHBaJAqMqwLtsoZX/jiK9x6/wNklCz1+mzv3mZ6eRPf7VLsb7E1nPDk\\nYERrc5mvvfzbmDzn/Z+8yeLREZdyz9+8cIZ0dZXHT3b4zr0HtJuaJZNRB8eJRHFCliylmpVOysry\\nKu0sZbWTcuz2VRY7CcmgjdxYQXiHCQ7dlLSlR8wOMYUkjo4oyobLKBI/wwqJ8YFuGVDWs+sLPowj\\n3rYlIvRJ/fxG4xNF2VQYV/FPX3mVTxGR+QzhDbnOGR7uMB7fQmhP7QXtLMU7DzpDq4imJFiHlhlG\\nJWRSIXyOi4ogA41o8B7qpkJYx+zwiK2rjxgMIrbeZXp0H1VWyKrhaOqZiDbZ4gL1o33yWJMFULLC\\n+YrUg/Mppnuc3uUvkQwWsGWFaxxNNcPaQ5pqh47dAuExwqJEBK9w3lOFgBAB4z2pTimjYPuwYu+o\\nZm3QZ62XkeoSHyuapqItDbsPPuLKhXP013q0Zkf87OYRN3sL3GHM0mpKN7c09T6D5TmYUfkKlQsW\\nji/wqDhEZ32WuseoFg5py8Cz505zorfCsWPH0KqNNAlHj7ZZntXEa/d476/+D/70fUfa0gSmRN1B\\n6UhRVwRtMCZF+wasJUqFSDXSWlrNmM20YaMrONVp0dYVHVGQ2AhKUJoek9aAJnFk9QQmNW1Vs68S\\n9s5usru8gpA5i6pFGEASE5aSDmkTaKInLyw0jlFZsx1AaEluHYvtNj2dMqxq0pVVyhqqowdMiooH\\nW9uMCwemTaJy8qzLsdUVuv0E2lB6S7ujUVpRlQ2z6YzJ0T6qk+ImLUbTwOraGkUxphwfooUmhoSq\\njggjiLhfqmOfqIj+6E//mOj8///3v/9NB8hUBjga73nm2Ss0xZSt8RYOR4gWQsA2gUwZ4qTkm1/7\\nBiiFiYImSkxq+OjhLX5x+xaakk+v1bz693+Tpfg2jRvymecs1T2JZ8KONiw9t0m73WOh0+PxqGJa\\nGg72tlGP7jBoSZ5tRQonidMSb+cgtc90NS89dYVfObbIaTulEwMP/D02zpzhSRiRMuPMgqVcLJCu\\nIdGakNxl9GiGO7OBOS2QeDIt6LQSBgvw05//lI5QZMLQVDVJkrB67hx3rhpkprn0K5/lG48esfGl\\nl3lh4TiTyZhT5y4i7l7j/GzCuSsnGZeWnW6L/cEzJEaReofwntrPa6o8WqSr6BVjdFUQ7jzB3Pas\\nBofwkeg9GonyDSpYEuGJ1qKAIDRRyLn9jBKf5sQ60nEAAqc93ViSJYKJFnPXRe2J0c9vbcHywRvf\\nY7O/iEwjqioZOsdhNeNxOeTzX1gnNxZfzZCyTeMUtfSwssIhy4ysRihNty1IxTpZa470FYkjzRNa\\neZ8lnVHffgd5+B6GijR6MgmSEqSnSVNE2iU79SKlaJG4EVmu0f2c6eE2SkakbpP2TjMJA/wsJTQS\\nFTQ6WaLfO44OJ6DYpC6OaCa7TEKJkQAVwldEAkFKSlcRdYZAsTuMHExq6vWUzYUuqZgilKL0EwZR\\nEh4ckLcc+82MW9qQnN7kQneRpeUOnOnwYG/C+nLDQqeG0Zi1KysMFlLO+QWWMtg4vsjhXh/Z6bK4\\nukart8AsGGIt6bkJl5KU41nD29/9Ca/9zFEu9wgmx1cOEz22qtBGzbksoSYQ5zMKV5FWI9ZTxaV1\\nw9l2zkAF8jDEuTlQ0BookpTddpeDwQa+26dbjih279F3JTtRMFxcZKe/wGxWsl0e0YwqunkfEUZM\\nJiPaaUKxv8/uzhE7pWOsE5RO6SNoiYjXgZmS6LTH6uA4C+01ohL0VgGtCDaw+3Cb4d5dbu/dJWlr\\neqsdZAp5skIm5xXCyvoarVaHx8X7RNo8v/4SUWXcvPke586exURoaoFQPYTKCSH+Uh37REW0FRVB\\nK1wMWDxCKqIAFyUuMh9GaEmIDTv7j7k32yFmCq88UUQSL2mjyILmyWgLn1bgFNo52nkX1c1xrSlx\\nXPHK505z6oRGjcdkizUnBw3rr0kudQ3ffeMeB7pDWL/Eaton6hy3v8eTD37OFzeX+dR6h73r13jm\\nxCpnl1ZITI3KPRejRpgI9UPaYYb2NcdNh175gPNaoWOD35khZCD3NR3rOZq2uRY0ZUjoBkmiMnSc\\n+xHXe10+enyX9vISC2vrXP3wKi88dYp2v83g0nlu7N8n1YZnLj/PwYNt3v/gIe0soSdq4v5Dtuop\\nSbeDnNW0vaAbHDJahKsgQowQiEgBgkDmAgKPihHlAwI+/pn3oyURFefGZ9AE5gOBgCQi8OTMaoVF\\nUQHOOcbSELTFE3FEagWZMWQWXLBYIRmv9HlHRlrJgP7C8txmZSKL4x2iKEhcTSbBxYoo21QiZeNz\\nX+Pcs19hqBfopIqFMEPKPj4qnGvAF4SmBq8R45J2jPjUYdlC5J7WYo+6fEgIDegurd4ahThOvpoR\\n3QyrJRWe2D5GsAV5t03MlqkPJog4QomAQ9OgcTSkcQb5MqlepNVfp65HVMU+ot4ncRVSCbwURKkg\\nOnrtDJ1rxtbwwdaUwg149lhFrVNq4THNDt0kYlSLt4sC9elnkOtdtJ+xN9vHKMXKZovljRwdFb7o\\n0XQLsmTKcxeWGA0kB0fb6J5mai1Jp4VseWpVsdTrszI5YmX4gK333+HPf3id7XaHgezhqxIp59yr\\nSITo0I55foD3pATWpeOpZc25vqYnLDp6JKAFEEHrhLFUPLGRDw8nJJsrfHkX0AAAIABJREFUuMUN\\n9oqCFbPEwyd32C+nTB5PGJeGvYM9WiHSp89etU3tHUgQIVIUJbvDmtILqmghWg6cQ6pAEIHaOzT7\\nPEy3GJgBXlt0W5AncGJticvnVmmOD5iUDe9evcnD3UNkorh3a4+lfo/jx1bR3pIIh7AziuoJfuWA\\n+/d2Odi7S5722dt+gLcpp868wEK3w3g8/qU69slanJRCKYWLHus1/uMVVa0UTmiUEtR1gY1gTEIy\\n/67nvsDYIIWCOnDx9Fm6RuFDQdQZ0QnSoDiXdSBNePXXLvI3PvUMD27us7a4Sjs/oj+o0XnOSneZ\\njrjPKHTYHlrs8B4XNxd54QSE5ATfeP4ZjgtHXBMsiwlJ+Zh2MrcJmdBQeEEhDPQN0Re06ind2TYy\\nAhJcAkWAlJRoM8p0QNVexw6W8UGCSFEmQ0rN9Y+ucvrMFWbW8t61GwwWFmii5da9u/zV939Es3/E\\n2zf3EEIRReR0mjPIUpYyw6CrGamEupNzcmUFuXOEHA7RzqHwGCyaiAgCJzROag50igSEgBgjIXr8\\nxyKJkATm01iYH25RaZROkUmKUIZUSWh3ke0OQWmEVrQGfTrXrxO33iLiiQk00iJ8oBUldRQ8/c2/\\nw0tPP4N2KSI2GNGw2UtRj69y89v/CyYF4twz2NECXwUm08BwZ4QbzIdbEzsj2COcC4SmxrgZwjvw\\nhkwYWlHRO36B4AdUoWGKIrYMeQ656tJky8QSrE+JAioSgpCoJCdTMyQC5T0tPyaLDSo6GqFoRIrA\\nYWJNUQWCUqAiShlaeY/gKqy1EGoSgOiomilaazbWU47uHxJkh9v7E5b8mPbmAG8gY0Q/S9kdDhnJ\\nNodJmwM/4Wh6iERTekW3U0NscDJj+3CELBwPDirWusf59p99j8HCBhdOPU3Ye0w3a1hWfbwdMzgs\\nWalqDrZu8Ud/+SHbEsqFE6xORqADpZ3hJSAMeMiURDtLOzaczxSfXuxxQjZkoQI19wH7OLfCdQ2I\\npqGRbfKsw97emAUEk7JCmoSyvULsC2Z2B1lnlI8n6KCxQnFoLaUTOGWQUjNrHEcOik6C8p60rsAG\\nmkxiEfNBo2+I0lL5kh3XItKQNI5W6imGRzxUkhAT0u4iaXuJw3KEqDS2loyGY7a2xgz6OWdOb3Ls\\n9Bqdfgc73aeXRWw3JU8iiQlErUkSTcTR66tfqmOfqIg2KqLwCB9RIWCQKARYh4wOGzxagRiXrIcU\\nbEo6FbR1RmY0MRUsdXos1jmX9CJJCYcKbCLJUPzdcy9y9qnLrHY0w8dT7u1OGHZzXng2Jxw+QalN\\nMr/MV698lbt7jrZzdA9v8rI94qXNBUo5Q2/9nE7aJjMVuZiHKoiyQluoEzCpJBXzxJ2mSmlJh+zM\\nHeeNblPLHNukTHyXg/ZxvrM9JDu7SVtpurFBpQnRpFitIDN476H2+KLm3HObYHfZPtjj2tW7PHV8\\nk/7xDkUaOPRD3vzgBuu9BYyHYnRE3tb0WobnL1yiFVMas4wwipa0LImSZVfRioEochqTYDsdtDYY\\nY1CJQZsEk7dI8xYmzUjbHaTSmDTHpBkmyZDaIJRGoFASvFLUPhAFJCabA8wagfjJWyQ4IgGZpTAD\\nKeYbQXvbNVfjIY2dou2U04OMxDjyo/tIoSkCdMUcd850RkcN2L9xleWQ0uo8RIaIDAEhBDGCCI5U\\nWGJoaIJACoXC4mJBjBqLwdeSRK/hRMSimDlBzhZZdBAtdVA0UhKFw1FivEcLjRAREWsENSYkIAxB\\nBIKoGMgxpQMlJH56yGQ6pLO4QPv0OSaHu9TDbRI7JU0yrJtyrNtl1LYcllO6q2e4/niX1bxgZSUl\\nzSWYjP3b26yeusIw9hGuIHiPERnlpKTAUYQheavP0BacWlyjXQ9pZkeUM0s5G8GjN1idPOZ3f++3\\n6OWSt97+GdIKFi88zf/6nTf5oIKYKVbihCgCZd2ANoBERoORYKqKVeX51HKHi5lnRTYIb2kQIBU6\\nekyM2Ag45m2MUGPlAjJpgw8stANFM6GInthKKdsDgrVknQ7OOVSeM7VjFCmZkEiRIFuezCQoI3Hj\\nIboucXXN1FqqCjxhfgHAYqmpY4OSEBsQQmE9+DRjOCqod59g0g551sU2Dh8cCMnUeuywZO9nH7J2\\nb8Dl506zttFmtdujZSDNLYPLl5kWilarS/QBH6e/VMc+URF91gXSRJG3M/J/T+rsdOl0euRJSp6n\\nGGM4tr6KiueIF54li9DRc++alRWqtPM93vfvI7+cYTsZtQgMpKJ9WPPBD9+kqioejCY4Bcc7DZ0P\\nM4qtKRfOn0QfP8+rX3qGj27fYefqm5w6tc4Law159QQ6au4ISBS1hFK1KCtB3hmQhIiOM+oaXKPh\\nKKGyGdu0eRgyhtkyR5WHxlNPAg/GhmNffIn32jucTpeogkMLj5EBEQMyWF753Au89/r7iMpzZbHP\\nR9//cz716VN89Ve+xv3XnmXn2j3Of/YiJ37lEvpEhx/96+9w8HibcyfOkiDpJBKjAsurqySdJWaq\\nC2mfxVxzMrWcVTULIoLKQbUJLYWUcn7LjBHrPY6AC/MouqJqsCFQWI+1FjeZgg/EOC8ZvKtQRs5D\\nfZ1HRZBpxmx8gNYRER1NU6HThCglFZFBaijubCEOU2q5y3Jas+k1aTXhzddf4+xmj6A6IIZQgTEG\\noxVmNuSYPUIf7GFEIAaPFwIp57cFGefBKk2EgEBGS4g1CIOWGRGFFHOmeZQKJQOZOyQloKJHYeZb\\nbXp+sEsiXki8AK8adPBIKsCADB9nGRzQSROCc6StAN0uQ+8YViP6SwsEV9LsTtGhQgtLmmvOr3Z5\\n59YuoRnS3bjAwyd3yPMO508fY7o/JNg2C75Nd+wx0ZOQY0xKExsEiqKe5zlonTKTA47FAzazCJ95\\nih9fHfLoo5u8OICLowfMdh3te4/50td+nT/87o94fzsyaQ9YUYKlyRY7Yp5h2jhPArRDpFVVnMol\\nz6/2OK1L+qHC1uBbbcrgSURA1Y4EKLMBB6qARHKUDdiOGXqxy+HogEFmqWaHZEkbR0J3rYPSCSLR\\nJMGT5l16SYcOmo4waKFpQiTJUrLUYIsC7yzOefa3h9y9s8WunYLKCGiEV2RAVILoNU0jKC3UVlI6\\ng1Byjnl2DYkSNNHhRZjb6hxkJuVgP/LBO/f4xUc3uHDhHHnX0O4H0h4YkyGExAdI1F9ji9P/+OrX\\n555QEfHWEW0zN746j3cF1cEI11ia69cQIZJIhZmvoOCkIPGeBWGZTGYEqaGuodsmISCCRXcXiWvn\\nWUxadJuKtq8415Ucd1O2nhySVNeI+xOO7t/l+c1F0osJeZ2iphNQbUhbtBLPUAqy3gAVNGFSoX1g\\nMhzSnpRMp4FiHJjuF9StFa63NviBXmLl4qscbO/x8KN32Nzc4Ele886NByz0M3IfSeqSVlMSq5pj\\nQnApT5hsP+TrpxdpmZTVtUXGRYeTm4tsuCn/5O/+HYqDkqzTI11uQUfy9X/4386ThZqGTCUkCGSY\\n89Mr5ymjpPIRZyuUHXFkPZOmRrkGQYndmweShBCIMeLx8HEBL4lorZnvJAlS5l5MokeGSIyBiCXa\\nQAge4wPaBWpr6LkhWjU4HecWLguJSJkIQRkt4/171IcTrNkhW3b0u23qZsbV60ccX0sRYc43FwkU\\nFoIWHE4Pmfoh7VSg/YgkVlQyInSCiBIXA0opjEzxcX5AqeiJokZJSwgBLQK4gkSmJDrDqDESgRCa\\nlHmPL8YIys4HKkoQmR8GEk8U8/8REVSMWGUQ0ZMqIBq8UqQfR+j5piEZDLBVTXW4TaYcQkzotlZZ\\nXOzxYOcRrdN9Tm4O6LYKyAS3j6YcO/MCswiDumGQSSZ5SjSQ5JCnil7oo2RKO4eJSVhzJZ9XJZvn\\nVrg3mmCHcGFVsyFqbu0c8IVXvsHbj4/4zvv7+EygEOgoMaSgPVWsETpFuppWPeWFnuaF5YyFOAHn\\nmGiN7Q0orCczAREqSDUTDzvZKuNEcJhL3PIah8HQEgoZAiDopl2Ec6wt9yDLOSwK9g4PEBGmB9sI\\noTgqCqSYL9cYKZFx3huNRoPKOToas/14n7KqIW9T47Fekpk2wjmq2uKIRAVSp7jg5737usFVBWm7\\nS5qkRKHwMaDFPCHM24AmUlaB0d4IWz/kC198kV4e2Nm7g40VZ89dYOdgjJN/jafz9bWbSBFJpCAB\\n0hjIpCRVEiHAaINQAjPoYrRGSIkwCTUemRiavQns38Nljr0whlghg0dHS54mHGrFX965RT9GFqZ7\\nnFIVy0sLmAYWknXyyQN2p/tkJzbQrQXG1SMqbTEiJSFBuwSbSJJ+l+7yCtMHjzEN1FOL8xmH+wKR\\nDegudFhaGVB2TzDtb3I+WaXqd7g06PO5586gWx6Vw5JMWRKBTkcjS0914xaurDgfPGc2VkjXVzBB\\nYK3FK4+IHWx9QPWLbfomo9vREArYGpHI/4+5N4m17b7O/H7/bjenu+e2ryMpkhIbW1RnWbJiJ7Fh\\nOC6jAleCKgNB4EmCBEECZBJklEwyyqRGKWRSyCBABgYKqaogSOKqFJBC4oJKsCyrLEskJZIinx5f\\nd+99tzn3nrPPbv7NyuC/7yOdlJzM6A0QfO/d9uyz99rf+r5vfUsgqSyqKGEdAyEJVmnU0DMhMU8D\\nS4kkB0MB3gkKg0uOMlms7fOUmMkPMkggkRQCpEDscjycpICkiAoBlQYkRpRkxT2qnLFp0oAbPKZc\\nMh9WFCrncIJGRyH22Vg/SIdyG3RsWHDF0WICZkWyLb/7e7fpLzZ54qmAdYDeaYZt4GJ9zR9+54/4\\n63/j15AYcDFgnAE9gHYYMWhV5AIXwWlDShGtFdYEYuwxKuBSVp5JAbQjKEUwGoOjTBpCIipFtAno\\nKUNEJQ8IURtiUtik0QG2dYka8rnxRKIYCumY+R4fDa2aopdLUtcRNyugJxQd9+7u04VIt33GW2/s\\ncvvWnCdnF8Tdu8jebfrzK2oilRdEDwSnsWXCKsX+ZIfClqhhYF93vFIoqqs17z98wtd+9Xe4e++I\\nnUfvEtqWyd4uF7tH/N2/97+zqgCEBS3OLjhrSpTqmaiAxrMbAl+/VfMrc82yu2LQcLVc8mxxRGsc\\nLx/tcvrBO9jgqBYHeON4OrvDM+s4qQr6okBJRPlABHynkN5iRXH+4UNOL0/ZBs926/HtwHJnB9WU\\nnDUr1qnDKMWkdGiBbghQVIiu0KqgG3r6GCiswbp8TQUv1FGobIGxiW5o0SpROo3ThnXnkaDxPiHe\\nY0tHpSyd5HUvIQYm1cCm9fhYcXbh+fa3/4w79wxf/9YXeXzyjNT13Dk8oKr+Cqc43f1bf5Pr01Pa\\np0+R1YqyaSl8pAweSZ7Qbgl4em1QKYdMGGdpY0AXBYUtqfTAZFblG6NrKa3kpWgpUZcVtVEsU8uL\\nVccvLafccQGVehyaSbQsihkPLxu+809+gpspyjKwV8GuBgmBOD1gVe5w64WEnB0Tnj7i+OOWLsDh\\nq1/jK2+9gFPXuHrC4vA2R8WUr1lPso8JIRBDT5IW1W1xwaJiTXNS0OFYkSB4ChQmBdCGNglGWxg8\\nxkBVQN+3BH2NMSYPGkjCklv3EAecM4hVuNLi/UA1gSp0qBQgDKACgUQ3RFICHcBGTQyrjEBTwqdA\\nGiPIVPpEUhK5GclNGECpnNhjFKQoGF2QEKwaMIXHWMPMwCRYTK/oVE81m2KsI3mL7wJOew53SsLm\\nmgNTUG6vsPqaag6pLiiSRYoFLg1crXpCF7m3N8VPIiZeM50YdGcpKUhpIOpse4spYJLOaFyyx0AS\\nxNghOuCTR2mDRUPMuNur7DhAdZiUUZAioiWOD46UVRQFSnVoyF68CK5X5OiNmJGqCEoUWoQyWaIE\\nsEu62ZLNtmdqDS60zLTwyoHmcQTooTrgZx88I915g256yFxNOT/7mKktMMOWEAQVFdLGcQ14xPcb\\nfvPqAXvAH97f8g8fCK7eon76kN85KvPk7aLm7/6P/4DHG09RTVF9h0lCCh1mWhAGYTFccwf48q0Z\\nr9WGorsiWThfLHl3+Tl+0CbuvHTI/JW7/GzT8ON37/PCwV1cadC7Fe3oKU1DDqm+bBrOr67xXiFe\\nY0k8PX7Mut8SRLA4EEXTt4gfCEYTKOhDoE8BoxURi04GrclCmgkInujBxhqLJYoi4fFAFyKYcbIq\\nKvwIHGOp2cTIoqrwfSAhlJWj9R3aabquIUoBpqSPgfOrgaYbuDxreeXzr9DsrLlqTnjvJz/lP/2P\\n/4ufW8c+0yJ65z/697m3brDHz4g/+Snr7/+Q7v336a4uUSYbtCkqfBooxVCJQitFITmNp9OB+miX\\nVTeOZvU+UwEEjDEcmILddcOkO+X2xLMXDLbpcSbQyobTWLIxBnPwEq+9+CWeXD7i+uwDfu0XX2DR\\nPqJQljNzm7svfo2jL3ye4cmf8SSsaVrhYPkG79efh9UpC/0RposMp++y00b2+xVWNqTCEHWN6wIV\\nlsHtMex8gWL6KlOzS2cCtcm7bgYTibVjSAYdNBMzIwWPlwFTl0BA9S1axWz1UBCkxRhN2wckBbbr\\nLUk6tipzlCmq7PUTwTBQpAEbU04XQqFcixKwSuUCQG5VtclBG4ksGEXJIcZKSxZa8kcwWLRoJCm0\\ng6TzHiprHXWoqEKBto4heZJRaGWpVIluey6vjtkxVyz9PuUQYR6hBqlbRE0J3qKi5tZBzXIywQfH\\n/LBC0ZCuAybNwDu0Fmw15KKvPYXSICEHrJoyX+TKgLUMUSNYYjSYZBDXYkXGXNGOmDxKIjEKKQoa\\nxZA0IhpJ5PASIlGyo7n2EUwAG7AjEyJ6ilChojBR4Js1ja7p6yUOzzx1VLJiZ1mj5i9w+/aU1eMn\\nuOo2G7PkWSO8sthnsb2iKQxytaK/HtAp4IqafhB8mUgifOv8EX90Hrl/+FU+2M7wP3V8+anw8st7\\nFFXH99/5CR9+2DGfzVj7gDM1bQgsZwWqXdHrfZam5xtLy5uVpRxanIFNbXlQ7fKuO+Bhoemcphg8\\nT+dHnL52yHGIvHZ4wP68QbYbLu+/x/ZsDbriWZe4UgajK2bFlJOLSzpdQF3jdIF4QGlahK7sKQEV\\nFKWzpCj0KWb3SYwoC5GA6IBJEd0PaG0oyopeaZIVcIrgodQmj3a7kiSCmBypiQqU0lO7TDOIRLRT\\nBISpLeg6S4iRpAIWCH3BxWni6vx9Hj58yNe+9cv8yre++ZfWsc+0iD5iynz/iDi5i3npNS6//Bqb\\nD96l+ZNvM3n7T3mlv6T2G4JxRCkoPNR9hJjN9rWZYPsrDirFs2cVDCsGcXSqpLCWYW/C/e6Ue1cr\\nUsyp+UNseVgvuT54jeXRK6ipRpUDF4+/x0Se8M23FuzrhyjbgCs5mJ2A+1MIZ6jVx5Sp5d6i497d\\nj/lK84hQLWmrA0TNmc6muN1I569pQ0dZTij0BMwMY0tmSqNiJOln2OqCubeQcjhFEQJpG4jJI7FH\\noofoqYkg+Q5VkkM5ZESJSWtsVCiEaAPJBowoCkogISo/kp2UKLFEKwxVyLxYunGFglI6BxzpRCKL\\nShBRImilsGREp0cXqR59pFfOUoRIESOJAaUTUVpsrZBiQzQTkAlFstjQ4UKLY6DvNhgF92ZgZ1uk\\nKEh6iSIDZ6xBOYuulySlKOeaUgPJIxQYa4gyYIr187SvQhmy+1UQqzN6vmnbJaG8x8YIKZ/PhCBt\\nvvy1ZHEvjahbqxyCo8diqcYYRUkJnTTjScv2gTglBlAmoG1EksaniJSgVAI3xW7yxoVQRi5VR6UM\\nc1ty69U9iA3++phXDr/Aaq55uHrI6ewOvHaLVfOM4XjDnl1wva24HGqK1Tm/ri/5dTnnD4pbPKs9\\n0xde4l6jOducc7QHxaLnw8s1//gHHVflPk3o2HE9bDp2yyVfmVniOuD8Gb/80pRXqy0yNPixa9U+\\nshThzqTkupoS0obaOHalJ0jD0/On7L8+4aPHAx/df0rbBVx5SLv1aOOy8Jg0IYKranaBIQREKaJL\\niEpESUyiRSQR0ie+ZBUjRmWbo/iUV/rgCBLwCpJOiGqxhUOkRoaBKj/pkQIuaalnFTQdhSSExBAD\\nyQq2KCAknKkIXUejLbY0RHpAo8SBc/S+x0TF2Ynnz7/9AV/5ylt/aR37TIvooTsjtB/THj8lrXt0\\nKHC3XmfyrQPE7PPwn/8hLzYNPmxpS4vXMwYB5iXs1ExFMTsdUM0V6/UGVlfcVpEYPCYM7Lo5sUts\\nuzXtcsnjas7O4assbx8yqyzt9Sn92jPRJV/5/MsYv8RfHfPscsVuadBDT0jQ9idwcYX2iuXunFQ7\\n1t2AUlOcchSSIFyR+jUdDm8UdVlB3EIYCHT0UqIkEnxDUJFkLS7ZsQVMQIKUJ0QUAYNkRCgJZQSD\\noLTJN2YOpcvobrwAo46ICWgxWHFAwhufC2Sy6KRQWnBGoUWjRCNqLMYSUQKiBJ2AEZWKRPSoxCst\\nuTABIvnrZj7h/LhRTgLRB5TWFNHlohdz5qNSipACQSVaEQZrSUWJ2u+RxR7RdCg82mqKBKBAOyRl\\ncSjhIYTnPz+pjCiMmDHSDlLKBVAki0OaiMS8BkVJ/lotESShx9ft+ITryl87GpVFj8HBCpQhqZwn\\nmpTKTgaVPye5DhkShZ0SfEMK+UYNvWC7gEoBU0SK0lD4Ft1tmRQG0SXV/IBqUsLjY3osZ8crdnY1\\n81pxvbpgsfcqpbMEOaGJgqthqjxa9Sz2pnx88iHt9IjgHOcXG85PW2qnmccK8TXf/d77dBr0zGF6\\nT2qFuRhemE55oXK0ER4OkWU7sFCalCBoS46uznTQbGooipIiGYa14eIicbaBrTjefe9nXMYJUVuq\\nqcuir1FU1QQ/RDqf6GIgmBJQiIpok3MDhIj1CuqCfhjy9RWFIYW8alkrQoh5KMTkZDedcii0xEhI\\nEZPyXizrSuLQE3z+fA2EPqADKLH5Wg5C5QqUqLzuJQpOW5IM2XUSQh71NCk7TUQyVBkij4+f5jXj\\nf8nx2QpL1x9y+vgB3fEJ24dXvPnWXyNVt7lc7vPF336R+z9+j8uTZ8xMzWUwXO/sMHnzdY6NcJJa\\nDq6v+fzByxTmGb7Y4/rxE8zb36NvOuwmoM+e8fv/5l+nXD9iV22YLnY5HwZWZ0/ZKQP39jTz+RyI\\n0LfYBGq2RM1qhm6N0oEYFFE8ThWjeyChjKae7oLeI2lNCg065NYwMCHFki5ECjYYSSipMJSITjjT\\no7QmqopSdSitUCojPq11/rOA0grIXkgQlNJjO/3JWyYS8s2MyZ+nwKRxVl2rsRXP3J8FdAogeWMA\\nYpBRdVTyCRcIkrlPbgpmRmMpQByLURprTZEGGDSIIkrIwxKuRIsbsargY09SmqAjYgxiLWaywEwr\\n7BLSpM6FLuVCrkK2oCg8KfiRkw032BvUiLCVgK/G31E+eR3ccLd5Qks/P1uKMcn7eaG9eW1qRLHI\\n+MrH6S7RxfPims8MmdZAkzR41VNWc2LXUYgQ00C37nKGZTfgRNF0a1oHPgyUXcfQBhb3DuHgDgxr\\nLk5POGsCDzdXcN1Q7x5y1XuuLlqGmBiSI2qh6i+4Zy0v357SXD3h/rbD357gk+P0dEPRbJi0Dbf3\\ndnjwrOftY1iXOTxEoynVlDpueXlesBxapgaOgANXUEikjQlXlJSpwXrQXUfwLcHOiOueIVp250fc\\nv7hPMDOut4atBLS2lEVBYTRFiqTo6fotPkIAQtQkNEYpUkz5oTd4qqpgiEBSWFuChVL3gEOS4GN+\\nKGf3iCaf9dxppBgYPDhbosdr0SlNiuN9E8BhGYLPXuIYoAgQLVpBHElTZVQO7Jbx8hDJlj9tshA5\\nDgJdXq3/0jr2mRbRd99+n9XJKY/e/jEn7zxANgd8/Tc+x/XJY6gSX/rm13l0cp95XXPbTml1QVdV\\ndCGxv3PAnQXcnk/YsbA/q7kePMc/+FM2j58w7xNLVfDVF3e5vmpo1i0/PfsJOkXeePE2Sy0U5hRC\\nS/KJEodF5fCIwuF2lugQsdoxSE6A0Rps6ZCg6UPKXsRkCKgc2KsjTjxRLKICzil0Spg0ZPHCJEwR\\nSNoSEYo0oJTKnaH6ZKOg8C+f1RUhb58ci4ZmyFNB4kCNbepNAYhgrKAIkPICNU3m/MASk8VI//x7\\nffKzeR63IJJRl1I3xieQ50VdIc4hWqGwGO0wSrCmougd2gIooi2I2ShEioHYB9p2S6Miabumv64g\\nNqjUkSS3czpqSCkjERVQY+p5/l0ElM+/UxrbcaVQcvM7j0VPBKUMowxG0ub5zH9GRiYHJct4H415\\ntlrnKMbc0gsKyebycTwWCWNSfiQMPSkMKC/YAZxiHFcdUGE8bzGizA5iLKshcOdoiV7uw+4SnvyQ\\nbXPNVROolrc5udpwtPMC08mcq+sLNv0FfXfKfLHLvGt5vYaDxvPOesvF0ZeoZ1NWeko4bZisnnKv\\nu+LVN7/EH//4Qz4uoXcVpuupsIBnUQqHqmHGlrQLXzpc4OaaS9+jrWYiPSbkwaXOGJ5eXJFuH3B0\\neEAxXLGcFSwvNOtTz6pX2EKYzWaUZUkfekLKnLgrSyoL1ubtBkVRUtVTDg4O2NnZ5f333+ejj+4j\\nSTBaY6wlhkDAYJTK68wlP9NCFKJEjDIoY9AxEkO+zk3h8D4PdNjK4ZsWElijSGTqxhSWGAU/DGgb\\nsUY/v04yI6OxYpEIISZqY9AGQhsJIypt/V/hPNHrHzzhyYMnzMw+b33rFzm0luFH32Hn8WM20tBc\\nPGU9rZmUC3RZU3QNZw/fo+jh9s5tQkh8iEZPK54VwiR6Xv/aFzk7O+X4ne+zTQOzacHx+UP88IzP\\n35nwueUU3ZxRhBIxAz5GnDN56igZpgYGnRAt2LJEAhTWMfgGbaDbrLFugtYFOrUUxuGMQekKo4Bo\\nmJKFDG62GkaVt1OohHbjwHH0iM2tTEqC3IQcyCfFNCV5Xlzl00V/VrmaAAAgAElEQVT2pq2mH6tb\\nyt9T9SDZw5nRZcSkrMgjgcCAiB/zLy2lCOhcxGVso5RxeeWiMmOBNGg9VtL8w7mp8VFnZMgNbyuR\\nFFuMKEprkB5SUGhr0TFSJoMNieG6YdWtmRxsqbYNSTq0dOjMKeS5NWPGZHWF0gothrxzN+W7nJhH\\nAckgwtxgTgWi9di6aZKosd1XRA2iivG1ZP+B0joXTa3yklGVUbiSiNM6k7Q+oLwn+h4VQn65CWyA\\noCUjZyETqeNmgLqAOOTT01w3nG092lVsTMXi8AC0YTg9Iaw3TNwO+597hfev81aDF4/2sWpgI5fM\\n5vCiEl4Kwgsx8e7D+3Qv/QKP/IwX+oFezVke7XHVPeWrU03VPeO9izOeuDKn+fc9daWIvuELd2oW\\n7Sm705K2tCyswtPRFj0zQLcgzvC0qviT8xUnbsNb33qZsL0A1VFMHZXpCX1LsI5DpUntgE8wmU2Y\\nHS5QWoDIpCpAPJIiy+WSw4Mj1s2W+x/f59npE2xpcs6qMcSQGLwnxJAHJYxBu4LCOvAeE83YmUEa\\nXSEAvm9HYJGtbHGMMIoxA5Fgxi4KoQmeiSrxIft/YxTcp0z0iYAERYoRayyFc3TdFqXV82Ckn3d8\\npkX0m9eeX733MsujO/g4sFldcPbOfYZmSxt7ChNwtw9YNQP99SVKD7w8K5nVirI/Z6MNogzWKvaW\\nS2zhmK+3XK03WOmpqsT9D/8FL95Z8Mbr9zDNMZN2g4oW1CIjCh1RVtMPG3RUOF1mASMl+iCorBAQ\\n6FFAUVQo7RAx4BJGNujoSUnh9ZQg5PWv0aNNGJGRRmJuH03MrYZK0Ju8dkD9nPOj1PN6lfmdmz+P\\n/5c8JItSZA6QADqhUkInEN+hY763RQuYhDKM/wBod0Pw5eKjNELKnKcIEoUkaUS2edSSlOkGALQQ\\nUwQCMXV5c6bqiF2iUuBE0CFhsXk1RtRUFKDzb1uIRfuMLkeXKkp9kuYlyiBa5+IJIBaVdG7pRUhF\\n/kwRiCmjynx+buxZAaUUzhRoEzDGonT65IFwc5JvzmoUYgz4KMQYuR6y7Yt48+AqgXIcNBCSKRAc\\nqsgTUCENRAVWw+X6mh1FpmZ6j296iumE+fyI5ukKU3u6JrG9CLzyi7c5r0rmUhDOT3ELw5P1OQ98\\nYj7f4cXrc75WGZ5ctXyw8yLr2S4Mgo6O6z6wd+sWi194kTfDmpP336UPsLE1KsBUR6p+ze0ZfPXW\\nlNnDlh3f42SKaa5JCyEYqABTKB66JX8cIv/srEHZZ7z65AEhttQTzel6YDrf4+jI0eLYm0zZ2dlh\\nPp+iraasXN6KED1JPHWxIKVE22758KOf8vTJCU+entD3keA9XZplkTBEokjeigDjOK+QYspvj9F5\\n/HLkQ3PlVEhIOJe9wUM32s80xJhG/wj0Q+6rNDDYROgGrFVYY0hRIUlG50W+kPqhR5XgyoIoeZAk\\n0z0///hMi+j2u9+mWizobh+iFjPKesJrb30J5ruwvoTmnPb4Ad24MiO2DbUO2KHH4okBKm3oTx8R\\nLi3nD37MfVeRJhXKKd7+4G2+8cZdXpwGpptzVOwyP+gshGvEB6IBZQXR48lIHpU6jMmcibWKgGZS\\nVogXlC4hKKxxROkzelI9OoJ40KrOPKkKMAo2ioQykRQEnUxOSboRbBRopZ8jTvWcr0uoT0Vwify/\\nW4osBOUWM6mQVwSnvCBNkqBtns4gaZQkJDG2OYKKgTS+/en5d8zlR8vIaN4ITCkiKY9aylhUDYLy\\nGbRiMugGUDEvKZsWlqpTGCJGBQbJboMAtGLYlhYxWXHNfK5B3yR5pdxSJ8UofumR6TRjPc24Mxfw\\n8edq+5wayecz4XQ1gs6b85iHCAgRUsrFOQkxSr6RI4SkiSm/56JLPBWDKhmUY1CWISn6KPQxckUH\\nvcY3gfPNhh7h+rqnauC33qqoJwH6gE1QRGBI/PTt9zAycO/oiKHz2MIw3z1g3bfcFo8vOx6fP+L/\\n+skDfni95ne/+ipf3i04+fhD/qQ84F/sv4QWy6x9yEXxMucXK5R2vP7KHezjwPGzAORdT6KEhXhu\\npcAv71Tshg6voNMGbI1BUcRNfkg4eGp2+E7v+K53XO3sUHeezcljzq5XUE/BVlTFlDfefIGteA6q\\nOcnnzALftfTtwDB0aK1J2vDB6TnHJ2esVmuKoqYqSrq2w/eeGAKdKanIToqycMSY8H5ARUeIHmsM\\n1lgk5c0WQsJIvi40CuVv3ltN9D3GuJzIn3LnodAYk3l9o1SGsSZfP4ImxnFSL5KLOUIYPL3SlNoQ\\nRjGzKP4Km+3/6YfvU9mCyUcVqbakas5k5yfcWhxhtivM9hjbrihEYcVCirQyoGOPNVBGj7+xtXSK\\ncjZwsPsyF0bzwYMP+bWvvsZdc8XCr1HRk4wjmZTfIBVRJlFYnXM2I5lbjB0kj60tKQWEgC3z+l9V\\nlPmNcFn1s7GnsxO2Zk4REjPVY9QAOuvrGouWADrmfEkEHcZVwtjnZnAlCbnBX5KtHnBz76fn7TlK\\nnivjSmlC6kd1XuUiqrLhWQeHKBh0JKmI9iobyZ+Duvx606e4VzUWdUNGtQBa6/yEdgCZp4xBCAH6\\nCJNRpAk+t1DWFAgVoktcWYNLRNXjSpdV/gJENFug0Y6kc6iEkvQcSafnRoVhnOtP3LC0ShVZYBtt\\nTcZWownekrTJ6vnobUhK08Rc9NOIMCWFTJGMgpIfbvjjSAiRYRhoO8+2iwweLjctTYCrFq572AbY\\nxmxBDQm6CRR9XsSmS0sxmzJfLNk/iEgFWzmjTGAISILdW/u8+tpdVj/7McX1KQ9Xwt7rb3LpNfts\\nKC5O8fsv8Y/efcR3332fL+wW/FLaZWjgf/nZOX/kLD97ErizXzLbPOH9Qlh3G8Kzp9zWkQcXa449\\nrJQiWaGSwGEKfGuv4ot7S6QKnN4OtIf3aINle9mwGBy7FlbG8L0Wvh8tz5ihVImzA+fXDbtHd4mm\\nIiaFxJSL4brl0eXP6LqGFCNDu6XvejbbDYim84HVqsGHSDXZoVt7htKiKOm84GxFiIEgDmcs1pQE\\nvyX4gHPZTzqk8FzgjJK7oESmvnwKOGXpfMg8Z9JE8pZVZTQShCgeax0p5Q0Ive8xzmbBSxI6ZgdM\\nTvNX2aGgIvQ9Qs5t6LqO0P8VVuf/2+Nr9kzF0g5UZWI2XbHPE14va755tM98uKSULbENWFWRREgq\\nkFIAo9F9y9oWXBQF9u4hsntIP5nw9p//kN/6tV/gMD1hx1+iYq4gSUc0Pit6SpN7SUOhHUZ09p/q\\nzJVIyqIGMdJvO5SOFBrGva4op2AQNtU91C/8Bm3b0r3/zzjoH4Lv0MqOBI5HdCRaA8rQDg3OQlSW\\nwv8/tgiONp0bFkaiIES08Mnk0HiIEhR9tpBicptOQsUyFyESvowkLThtwEecsgxDT+Hy3xlRoNY3\\nZLvKk2FjhxtjyJRCAHSepTeFJuiB0EOXMqAzRd6WKBn0oiWHPwQSti5ZvnBEe9XQnwR81+CpCabE\\nOoO2OrdVxqKNhRGlW2MRLc/tJU5ZtLaAyjQsia2qSCgEQxDNkAxt1PQJBix9ENooNJ1n23VstoGm\\n7dlsNmzbQN9A6KAb8oMAyUtGnc2Udj2BooJ617I/m3GnnGKLCucKtCkINpL6gI6GthtomhbVdlyf\\nnNHMpoQp1DZfVgFYfu4OvHCIu7pP2qyQEtLOPt44Zu0JtnnGB3rBo3VL2Az8e791h9erS/7nn5zT\\nfvW3iY/P+I3PHfL651/ie2//mMOXXyA++pAv15b56QUPVh2PBDbOUkrHraHjV/drXjYR3295utjl\\n/u4+01dfpRt6vv+jR1RdYLaBawIPtCHOdzksd3lxd8lk4XALh6lL+m7L0DR0/ZYP3j0m9nDWnbDZ\\ntKw3DSGS91Ulk4tjFFTKG0CDT4homq7D2BrlZmxCoLCKrmvpgL7vKauSajqhbbZ5wIPRTicJSZI5\\n+0/x8/14bQQfMtAYcYiOOotLPhHjgFGGGD2C4IeQTRpa5SyIaJ5f6yKZE6UAHQKCw1mbV7T/Jcdn\\nWkTfmR1hfcT2Dbsh4a433ALOgBdNYNcGim6DtQVB9fgQR/uKYdt6dEhsZwX6hS9wdnQLdXjE23/2\\nPX71V97gyJwx6Y5RsQdxGdHIAAw5SkMcUQxEM86NxywJ5sTizDV6C0ZjJaGUYeg7itpC3BLDQOt3\\nCa9+jeqtfxulLLJ8kfvf/fsstg+o4oZJDGAUEgwhWWLqCUOD1eCDQfnmUxacT9BnEEbBZvzIiEhv\\njuc0ns2fplRGRhGDSRaizk9jCYQQMtdrLDGBMlVudYRcwFLM3e0n7Csysq5aaUBQKFRKDF3M7TAw\\n1YY+5D06cRuZADZFuthR1RHZNoRO8MWEddPSe88QE4XKYRPTxQxVg57MSNIxSE+PAe2IGHxKoAVl\\n8xhlCCnTIVGIYcD7gVXv6Yee9abjcr3huoOmg3UH6x6uO+gCDGSlVzsoKks9m1HVNfPdkkVdM51U\\nFKXDakGrgIRAigPB9wztlmZzzepsxdCt8B34MM57jGdMq9ztGgNzY9mfWkxRo1TE+0wNOQur8wvW\\n4QrVBbSGvYMlfXPOjtNoo+mi5vz4mIt3HvD731jw2q2K7/zwPf74ekaSCV/9whtMtw8x3Zq7r7/G\\nfL/gtjnky37gwf2PeXR5ha8sbui4pxVfvzXjbuiorObSFjwol/x0vuBgtk+Zej6sLmCigY6kQFUV\\nd24f8fnDW8yNxlSODYHVZsvq8gzfrol9w/V5w/Vlx8Yk/BAYvCUZhR/KTFdGA2SBRiSvMRdJhAhB\\neUyR2+cUsuoeJTJ4jzKSU7k0RB/ztW0+KZwp5o2q1pi8/BBPSAFJiShxpMBAaYNOGqPzz818uUah\\nMEoRs3CRLYCMeMpYFDZ3a1HoYkcq83jzz9Msbo7PtIgupgVeRSyK0G3QwfIoRJogHF1suLNcshg6\\n2n7NunAQNZOo6PyW4BwbVeAnFd3Ogv2vfovv/OjHvP6Fz/Pm/JLq4mcIHZ2pMFhc6rBEvCkQcVkc\\n0hat8lgkagAjYCCJQsWEshb6gHaa3g9Y7ZBuTUgeXOLB3i/x2i/9Ng/Vgo2bs/+l32X31st0f/6P\\nkfvfwV5/TNn2o7cyoq3H6UgKWxwV5lOc3qcPBXyq0x7p079YbgXoo6JUJRaLD4EAYzRcvnhKMVgJ\\n2BxpT0iBqAxJbN7cmHrAfmJj+pQAryWr3IRIihGtDA6Dxo0m9rwKNw2B1GcaIPoIymMqhUOoAOsT\\n/WaD1jnSDgzb3rPqep4OE66aIt9ktqaLQhsUjQef4KrZsN02NM2arvUMbU9zDUM7blQeD+Myaqxq\\nKEvD4vaUg3pCNV2gXIHShqgsUWAIkU3Tsmka2u6C84stXRMY+jzMlPzYbBgoNEynsJgapvWU3R1H\\nXRbUdU1ZloiNFKogxYLGRxrf07Ub2qsL+qgJQ0EVOwSoFfSPn/D0nQ07y4LXX3sN2bas20ushWep\\n5NFQ8PSjB/zWPvwbv/KL/B/v/JR/drVkvfsK4eHH3Lqzz2JvwQ8++CFPS+jvR37TWB49W7E6O2fj\\nBeUDb5YFb04cB6HF2cilqWj2bvE4VVzFKXdkSnhyykJKrqSlXE65c+cOSimWszlNuKZpW8JFR9NF\\nVq1wsW7ouk3eltp3DN7ThSWKEuvUGAySHSXJ5gspxjyZJMSs2quE0gNOCa4w+KTzg0jyVoQYs09a\\nKY3WipQSxMSNGTSN1ItPgWDUc4SactuYBaBsk86juc+FRlApjUy6UIydWiyz4EsEpTIgINksGsZI\\nCAPGWoz9KxyFdyt2rEtPsoGJCK6ac2GnPMPyk9Dz0EcOfWAbhN6mbMztApWFrXhW8yOK5YLOJZqr\\nY57e/xH/7m99g8n9H6L6DaGuGKyjjOm5B0V0jVY5LQY3Q9+IDUkjWvAmv9lOSYYw4xiEKfLES/IG\\nVSxoRFP+67/P1c7nEOXwWnNid2lv/RIv/vpd+t27PPzn/4Db8ZRZ7Jj0DUhg0Imu7VnM5njp/kKL\\nrtTNOMynnU7queocufHRjB+xmpRKYtI4bdE6872JhEMwQ142h4IQI6bM0FWJwhiHlub5BSqix0i8\\nnGivlCEGhTE1Smd0mg1ZhpB8HqUbhSZVphy0ayqCnfHYGxpdIXhmrgJtca4gaUOwllW35e2Pt/yj\\n8w0YWG+hDxlFdoFsRdJgK3B1wWQ6oa5nTHamHL46ZVqXWKuZqJRFjDDQdy19u6Vvt6ybNe35NU1z\\nTNdBO3K2IqAsVBOYTsBN4XBZMbu7T1lUFEVFVZSZ/hgDb2Lf07Zbum1D37RsTle0HQw+W5mkGR9v\\nDvQETAFLDe7IY1X2QCoChcAsRm7dusXjizMePzjhaLagkoG4XfEsTHm03pAG+L3feZ3vfXTMH/zp\\nOaeHv8jt5Zzd/ppHH6047Q850wFVbmF5xONHZywvW7rrCC28uKh50xle8C0zoDeW66LmRBx9McVv\\nA2bTM4vCXq9YLnbYOZyytzfHuIpHT08JCG17RWx7Ls7WXG4iXkq0sZSmQpcWU3oWLPIVYXLymkUR\\nRgU9pOzxDKOTIaaAxI4YO0LqIGhCnBFHEVUEvB8IYdzHJZBE0GoURIUsiBrJI54+kZeU5HtGVI4q\\nTOoGbKRslUqMY6hCSCoHxCiT3Wixe34/iQiDDyglGJVtVhLyAIn6/4Cin2kRTQSsUvQ91NWSoVdo\\nLMHARddwURVc68S8svghQ//SGLSOaAJxsks3XRKnU975/j/hy/sJnv05yrdgZyTR6JSwxIzZlcGi\\n0CrfUaLyBEtu4W1GgAaUjnl3UsZ2DGnAmEDyETtdcjLMOXrzGzx79atci8Z7obaJoAa8LTg295h+\\n+d+iLvY4+eP/CXX6I6YECIHkSpJktSZPpWeFEH1DoY9FUj5pF9OIQtU4dnhTYe1wYzo3GIlYiYBH\\nFRqJoIIBsWAsqpSMPCUXzAFLrXLr8omBP6/KRVkCBo8mUeK1ZZA8VBBQdCbRm8DaQx97+uTZND1D\\nJ5ysnvGwP+W9VtEUc/oYKYeBsiywWvAkrnxgaDtOLeztWfb2HIvFDnW1oCh3MLbOqela0YaObbdl\\n3WzYdlsePz2n2W7ouoBf57ZaIhQuJ15VJcxqmNSGe7s1s+mMej7F2QK0BdEMMTAMnuthy7ZpOLm4\\nYuhOaLfQNdkaalJObK8NzIssHk0r2J3AfN9QO8diIkxcTa0LnNEE6dFO0Cmgu4ZpVVCI5fo6oArw\\nVnAO9pY1bddwPmiquWW73tCHDcNqw6/95i/wUz/hv//29zmRJavLNWUB5cxyebnm/PQZ7lZFtZt4\\n3DxGP77kzrZistG8XNcsZxNMd4XVEdNB5WasigkyX3B23aCXu+hK86g7o/EFValxRtNsViTt6PzA\\n2dmK7XZLu+4JAqooWdY1LkViMHnxnrVMnhc6hSYLfkYrxGcl3RqDEIkpjbywJaYSnwa8/0Qw1Nag\\nYiSOfmeR0VaUIpjs840x50a4NLb23NwHMrbl2UMsZIN8ijn7ATJ15ZTNnaVAN46fpRQwirxmiBtX\\nTCQolZvSsTreTLb9vOMzLaKnPrDtYOgCdglTa6nE4yQS/Jr7G+GN2Qy93lBH0PSkquQMx3axZP+l\\nu3zQb6Eb6E4/4l/5117HrB4QjEVUBdJSp1x8MRMwoFUYJXGDjwPovGIA5UCKzP8pAZvHv/qQPWul\\n6nKIrd7B738R9Y3foxuLjik1RfTYoePscsUzN2Fv7zb7X/kdPv/Sq6z+6f/Ak3f+iLnrx5HKQHft\\n0dogMiLNePPEuxF5ElpnkeVmhBFRo50tl9tKaXosnbIUo/kbnejRtEHhzDLvPHcq741pzihjRGvH\\nVjTXLEiJjEAThCQMPtF0Ha0XrruetQ9cdbAa/1uPvKNP0KSMxuIouCkzpsTNZpxbS1fWYCzaGZJk\\nfjDEiKtrFtUOL74QqJxhsznn+PExzdUxbZfFniHkW0wAU0FZQzmFsrLc3pswqScsJguqqqJ0OfXH\\n9wPRdwxdR+x6Nts1Ty83bDcw9OBHRKp0Fo60g8kUZpOCcjKl3i+YTSdMK0ehhcoIpYpUKlFKxKUB\\nm8aZeIFJGMD3uASlyRSIGSAWECqo5wXJW0op8dFyXU7x8x3uLO8QLs7o2kCaTnF6gj35mH/1tYor\\nDX/nf/s+P1gr1I5laRqOH59ztTygKkqa63Pe+vxdvvXrv8qPnvyQ+VYxuVoz6z1TQPktVaXxLThj\\n8sO07+mHBjGOi82as9hy4SIrpbj8+CGToze4ulhxfbVlfdURvaCloLS7FJVF20Rpe9yQsvvBTknG\\nYeMFKJ0fuJLyQEPK8ThGCxIDdvQwK3L3k0yJjrkzCr5FaYWzKqP6kPKQBfn9jJKII20jkgOx83RZ\\nIgSf18Rk2zBaEmZEn2p0sfg+PB8aESKiAqLzEExSCpNu7qeYSfObQ4RIyA0qEfvpj/1Ljs+0iBIM\\nQ9cDCuscu8spq+6aqIVhNudB3/HUVcyrwHzboQvFIwWr19/km//Bf8IH/+f/yvn9Ff7xMw4ksewa\\naglZFLdgUo+RCGpKwKEkB3tkJrlCa0FSP/Z6BWCyqd0YoqlI5RJtdigwkNawPWcTJ+x987d5svcG\\nKQquNMSuY6dwfPzxMX/7v/k7/If/+X9GvTuhn8y4qr/Czt/8L/Gf+zoPvv33Odg8YqEC/ZAoC56P\\ncqrn/XsavaIQ0vAX5sJzsVPP/y0RObeeNJ9jQ8CtG5Q2XFvLptjjcpiw0VOuNj26PePNyYydvmGb\\nAu8+XfFem5cBbBvotuD7T418kkG6NbmA1dPMOR7tV1TTKVVVIeUB2mbyP4oiRMMghuMhcf3BQ7YC\\nGIcxBZGIrWtcUqw3DevVJd89huUsiy7LGewfKGbVDpPx+7vKoa0iKui90A+JthtYrzdszjc8/tkx\\nQwt9BzFkSrs0MHFQu4wejypY3oFZZZkWlkmd93MZDYVyz9fh5oCVSIqbPAGTAjomLAmtIk4J1igK\\nq3HjdJMzFZVojEmZTHVk42zSUE4RXeB7AVfx4GTDx1vN6dNjbHfNb37pDV6qTuixJIHbR0twlsu2\\n4YWX7vFHf/4EGwOLeUVB5MnTEyb1jGmhWF8do/tL/sZswb0vTBjW7/Hw+Izkcjdlx/Ud0Sqi6qhd\\nies7uq3HHNyh2XiWboIKHevmig/v32dveUCzEfpBURYVKiVKrXDGEfRAwhC0yklH47BIGLNBs3Ak\\n47kU9GiOT0pIWiO4nDw2Dk0YGYtxyAAihpi5zZiDY25ad+C5Sp8LY16mmClQwyJuqF1JXTumtqS0\\nCjci0hgjkmEXGx9pwsD10NEHiEZnL7G5QaCf/LybySjGuM3/P8dnWkR3iBzcPiA6uLWoKXVkOtvh\\nIgh+vsvJk2POxPKCMiwddIOgX77Nb/xX/zU/KOf86O/9bahLNk9P+Madu6h1DtO9mRRCD6SkiVET\\nUkLpSFCgXUG0JaXK7Qixy62BygbfpAxSTLDTfZK5nW+K85/B4Aj1Dhd2xrPJHvUQCH3L1GUhZbMe\\n+J3f/VvsH+7zD//gv+OLr77Gb/y1f4dn1a3/m7k3jbH0PM/0rnf5trPXvnRX9c7mKpIiKYqiFkvy\\nHtmRZ+wZYxxPJrGRDIJkEgdJkPwL8i9AAg+SAOOBPcjMJEY8Y1vyMna0JJKtoUyKEiluTbLZe3dV\\n11519m97l/x4T0tCkHF+SgcoVBdwUNV16nzP97zPc9/XzcpnN3n89CmmX/xNpjeuUNUKa4qgYwy+\\nROD7YnvJ7O/of2DR8wMfANMKrk6G7Lgh9RFcasOZzR5v3+7zlatjjjX0E81EGNIx/Kc/eY5YZwxd\\nyev3xrzV7tFIUtoLKd1Wxnwa04ojmqkk05JEeJQzuKrETCfUeU41zZn0+xxMLIPBNkUR9JMPgkVy\\nINfgGjGNzjKTusbECu01VkQUdUErTljpdfnE2TnmFzrU9ZiyGlNOJwwnOVt3tikrGE+DUsGYmcFK\\nPJAexSRxRm9+kSyOaLcatJOIRqJpKGhIS+YdiSuJTE5si/BvW6BcgSrD65kEDjazPUjoajTomHD3\\nEDNNcJTOWlfCCG72/h0JEaAXZYGJNTkGk1cop5keH1MhsXVE/8Tz9TdK3gAuPrxKJiRffOkq/8El\\nyHo5ee4pqbHSMxjAoujREJ5jp7EmpdfOkDbnsD9m3KrozCeMR+/zHCss2JrbeZ9dAbk2JBa6Jnir\\nKm1wqcD7CeQD2nqVSekQY8OF9gr3xB3KZko5GJGbhMQn2CjGJsEunElLTMnYOEopMbIR9hJCEEeC\\nomoElbYzweSBDdQwb2ZaTJiFyuBESE0wxuLrCiEsWiqKqvzeQhNCQXX4WWyL5AdNl9Y6nDWkaUqj\\n2eK5ucXwJ6kNNi+QZY32nmgm4K9tTa0UVayomi0mUjKoKwZlwbgoqX0KqFAr5Q+4l3BhD+D8D7qc\\n/42PH2oR/flf+3X+9J//75hixJnHP8VJWZEfTDitMsq64qCneS1O6Sy2OIwdWwuCj/z9X4UXn2Dn\\nt3+P450262c77IyvsLywSlH3aSQp+BhTRQg9h5I5XgyRoh8E2lWMKmsiphCFtE10A3QLaEA2j0zm\\n2F99CHP5ObK0Q/3Gt1no7yOtpjva5uT3/0uefvQS1378t8jShLKGvankW99+n7/1iz/NH/zh72Or\\nJkO3SqQSZFWzr2KGT/9tOuvPc/0f/ga9t75EWVe4rMMJGdO4zdCmlIVliYINf0SjHnIUt3jTr/DV\\nt7d47PwSzyxK5upjtLP8/e0NqsExy62UKJ2QH5zwN56+wFQPuL19nYc/+Qme3XiIxuiQvZf+mKUo\\nB1+TGMvf/PAqF9Nlyqoin+aMJ8fkhyX3JmPGY0NVhM505ghFEy7MZgydBmQJtFZgvdUjijNUu4uM\\n2uATjMr46nvvcMNXmAgWGimihsp4jARZeY53+3x5d5eugl2tfUgAACAASURBVLaDhoJOK3zeiKDd\\nA30mpTPfJKtLlpyn6yyJdOAqnKgCvd0BXiHqCF8KjLcgHUoZJAEKEuswDg1yAXBx+Ny2MJuvhCfq\\nJNwNjAtPshHOJ5iqhsLhSRhVgqmPmFqYlH1K68jLiCp3+InHFmZm0oCFnmU4suxWirknzvFIPeXC\\nZodNFN1ewa9tr/I3leGn0m1ahWc36vKFOwO+Vgv2VQs/nSBUTn+ux5HxpDbl8mjMf9OY4/njEd4n\\nWGfQaYSOoFlD4kAmiqHS6AhatqRXFXSSMSrJMVmPu/0+T208RLy6R+q7mNpReYGIoJtFVEZiRUSZ\\nNMidoKrDpltah5I1nhpTFIhGSkdAVJfkowLjG+i4TVFXKOlRKlDDhBFIC7mwFORYYVA1lLogjTTa\\nKIrKItIUSw11OWPnNnE+xQoBZsypxPD8UspGMaY37rN4DdotQWMuQc5rVKrJvKRhw5KrxgeZ2qTg\\nZAQ3pnDbwaTZou7O8ebEsZsfUiQOQ4KkizIRkgKbTDCyBpGEWN+/5vFDLaJnNzbp1zmxlmxt3SXL\\nUi6cXiZKW7gkYr7TZaGyyN4iUSPl+ccu8OhHPgU+Q8wv8n8f3CDaqVlPFKTLZKaGegIWskjh7BQp\\narxKsEpjhaT2AmMFQsSYqBUo+S7CiB4y7RInXeis0Wyt0jz3aFhuvP8aCgNJk9QqUlPx2pe/yne+\\n+w/4+V/+dZbPPsmhsvzqv//TfPMbf8bDl5scDE74G7/4KFV1H500iHzEXJVz45t/wsl73yG/XrBy\\nFvZ8xr/49h4nZg/rQ1GYV/ArL7TYVCC05u33d3n5sMS0CYF65R7xcYk5vMHf/dzPEXsYjI6JKVhS\\nEt1IORXBe6/+a7auvsfnLp/muScvE1UD+l6hWm3+/E9v8w12g5kyDh9xCo32HL1zPZZaLVpZSpYo\\nWpEmk55YGLQzlNMR5WSCn/Yxoz7VUZ/x9R0mEygrOAJUC9LeHEWckROjtKTOMkwxIIs8S3MZn7q8\\nwMb6GpkSaG/I8GhX08aSTgY06ym6HGCFITcgopT+pCZKU6ZFQUuEtF8lHM4WIKCRadJmSpRokiQJ\\n5FU/g1KKkGxqZyKI0nnqys+kTY6yGGJsibGOaVWQ5wUmP0GW4CoYT8K4wxLE+VqHb6tiaMXQTGPS\\nbopMBC6JaGRNikFFdjLmreN7vDkw/Nm9Qzbm2mTjgrv92/yjG7D7OHzm3CraJszHJeJkSNRbol+U\\n1NUE3tvmvIJnVxf4W5/+BJcWBVNXoosp1pUkiacmdNEqSqiLkkyrYDGOmtRKMbUJzeYcC815zOSI\\ng/4hq8urTEcFk0lN7YPcSKmIWOvZDBNcZRGuAqlwOCpnmVuYY3V1lfX5mE6nx7defZ2T0RF15RA+\\nxwjws2O9q0zwveNxtsZVJtykUKQixc4idCJJkDwoQZWkjIwlsiVtc8JyXfHExirdqElsprTSHqvL\\nLZRqM8qH7IyOKA4mVMbjijBVSRJQqaaRNZjrdplfb/BspLg8qdg5PGb7/g5Jp8Wwu8Ar2wf0EzBx\\nTi0nSCcRXmGdR0oRXIh/zeOHWkR//5//s3CUUh5hHfXxIQejPkZ5Si3Y6SzS6y4w6TR57sITPPbM\\nx6lcB4zEzy2wv9jj+P279JZ7vPvBPnePj5jXkDQLEGOyJsSRDeezqIGKJELPhLVRAlaTeItSEmsk\\ndRmgGd5OqGQf+/Y7JKlElBNsNUUVE2wxQZmS9YV5nj/5Nt/+Hz/g8uf+Hmc++ykmTc/Gww2oS959\\n99v83j+7wWMf+THOnf8IS76FeO877PzJP+KSHpFuQDm3ypdf2cWuXeSTT11mXg6ZVCO+/PU32G3M\\n03aWybTkrbs5H/qJX+YbL7/EUyee5bhBKwohal/4vT8iUVApaCr45ecfYjNTNGs4vbHJ2UuXWYgr\\nJre3yCKDa7eobM2nPtlhc+4CQkaIKMbJEFk7KU3QUJYFRwcDJpMhk0EfUwJl2IRLF0Z/pwW0JMwl\\nsNmFqAdpIrDNFb58b499bFBfOMISTUXUeCwVMo4pjODG3oDCeOrS0BCC+USynjjOCM+cq2jMHCaZ\\nhrwqaDQ63DkacpTD86c00nuUdEQpNJopcbsJURRmeFZQWYmtwNSCujZUpScvaoqqZt9YfOEoJ4ay\\nLhAmbOUrCQMNtpshq4TVesJ6DKdWwSVBV9GUCanq4cUYLwskEcrGeG+ZakMZOWw1IrE5pxqwLzV3\\ntw3vqZQ3dkq6Fs5ozXVj+O/egW/sH/BLjz/M4lpCenQnjC/SmOjwhL/z3Dmejj0fXV/iVBuczSlk\\nwkJSMi0rskQEKY8KMOOmhsRUxCrFxBkHMuXlmzusX3yRyxub7O8YhqZmbXmde3d3KKsxVmqcENgy\\nRwpBI02QzocAuBnLs7fQQ6cJTnjW1lZ4ar3Jt6/c5N3rWxijSWSE8jVeBSt2ZBW4GusNtXfYyqLK\\nwEIQkcTVLjj7hEHIkI/lHbjCojWk9YCn5xTPNJosVn2yqIttzdOva167u8ut6S6uLoNmWUIrEUh8\\nMEOU4IYG1IiIIQsNuNhNuNxt8MJKi3gh5dWdQ947GTN3eo1XRhOuTYb4DKxKED7Buxisw35vU/D/\\n/fihFtHjnbtoa0h1wv79PeZbDbwxdDpNzq+vcfriRZ74yIs89OSznNm8SGQUSkkKV7N58TxZOk/q\\n73KqoXj4zGWGSZtjBNMkIzcFqS9IqxJKD7VFmgphi8CdiFRYHCiH8RXGeazTZFGLSeGQ8wv4uRX2\\nBmN2rrzDzz11iQ01xk8OMM5QODhXQrs94d2v/RNGjT24tMk7N2/z1S/9JW9+4zWMgc2nXuanf/6X\\n+HsvfozjP/0dLo63aJucEwXHtBgAGxtzbLDL3NE1bNZB/NhTFHHKfiG5vXebA+C1t9/gRKV86eY+\\nlz96noG4wwufeYQ4bhN3liit5Rtf+F1s3GBQFQwN2HieD8aaWzs3yd865G8/o9joKLS3fHBzyNbR\\nd6nrMNOsCV2W5vub61YTFlvQXmsSZ03irEGSpaRZCx2nxLYkcj4Q7G2Fc3B0MOCkVhyLmMKGhMqY\\nKsx0lUNqQVF7tgZDvrg3pJr93AcgnRawBJzvweW1mEeWupxJBXN1zry25K5ifaXLYtZCTY4Qvg44\\nCQf5uOD4pGBcQO6ClKUoYTIOyyf/oI2cDblMAgspzMUak3bJYsGCmBJlETurFzn3S/8Ro8GYvS/+\\nNueLLYTPGcYZ4EmqCboegMpnwhwzsxaGzb00IGpoyBAi2HSGRxcSTgYlWQpdD/cLwzhpMUbztf0+\\nBy9dYW2+xYkRtBC06xHPnk75Bz/xLCevv8yqGpHZksJZmmkD3DH1dEpVGJqK4OgSlkhrEm+IKJjq\\njNf7Y94cWtq1I9m5hZ0OUIunyLIMiaOuCoROcR5E7MkaLSCAvbNOl06rjUJgbEUjEswv9Giqmu+8\\n/h3e/OA+3misURTCUBYjUI5Wq4MwNcpbrHBYY5HGIr3E6uBcMjZCCYP1hkSFAErtFc1Jn7Wm5MOn\\nl1iPSjp1SavT5HD/iO3+HnseplIwjpq4JA3JCTikssQ6ZIM5o3EmzLUnsmBajTm6V7Jzv+TRBTgz\\n3+LFtU3OzY94dXeHtN1kJevxdn/ASBsqB7HIEC4KyMm/5vHD5YnmRfB5G8cgr6l0xH/2n/8nfPqT\\nn+Ds6dN05haC2DVKKfKSWHiscQjpyKKIn904x9pGFz54lcOrb3L1Zp87usV1oRknmkxBR0k6StGJ\\nNd2oQVN1AztShi5GRzVRJkEIYp/gqjHn5yytRsFIHDAtDd/eBj4SI1xOLzIIYOoFXeMZiSGnLm7S\\nO5XwW1/4IlfujvjY8/8WT5//OSb9iu1pn//tf/1Dmrfe5dnd28ybikhpjLYQpygNef8arU6LVT8k\\nnzjeHtbUK+cR6Sn+6vZtPvHCQxTnn+Gg8Hz3S1/kj96PeGxzg1f+6rvIuUUmTmPGfdbbCdnCHNev\\nv8+Rg/HWFvnJlJWG4OEneqye75L2d8iEIAUe70KaQqsD7UZM1kzRsQxHN6mxOqIgYmwVY6sZGRiM\\nPbv7hwynOYfWMx0XjG3NcVVxUlhwYL1AdrvQbBFrRWprMIHek4gYF0nGOVQ0kNpSMiRuxQgkxsSM\\nqpr3xjlf/KBi5VbF5zdTfn6pywU5oSFL6rog0gXWWhQCLwRV6SkKGOYwqcJ9c5IDChIN3TnIUmgk\\nmigKN+NEdMjqI6SCaSzwTrFQQmVLPhhOOE46dB49y/jPDTofI2Yjsrw2NCTUKgcRbgAG8FrOeASQ\\nhj0KOEdhFN0o5mcvnabxzjV+/FOXWc9yfvVLd2nVlpZIkTrlris4rsFmGcvVlOfXM/6rn3+RaOcq\\n46KPzBYopSfzgnp0QHFyF6t6UGlsEWRci4sNTFXjFUwV7MY1H1hLv9Nk62SP55Y3acQt4ihlMj5h\\ndXWRwcmI4SSn1eySNBvoKKLGURlLEikmdUmqFYtzHZbm2pTTPm++fIUbe1uUU4WmhcVR1AUGQyoV\\n+fERrayJCb4FhAvQnYCcqTHUaB2248aGjZ0xnp4veX59gcupoGkKdNpmp9K8dPMImElD4xaVkyQ4\\nSv/9RbqyIH0FMzF9rCLquqR0UEcZ02bNzdKw24fmdMxPNiWraxGfutRi/u6YeBKTpvO8MR4wjkOW\\nWYB9/QhLnGLdpDATipkzYPXcGTpnzrD85DNUIma/MmgJlIYkUlgbjodx1mB8a0TxtS9SL6ZcWko4\\n3VIsZz303T7v3oIrhE1xDDQISxFFeMM/wH4EYlHogIaz554G/ovn4cNrGifneeUv98NFYiuErdEz\\nNUusAKEYZzHrLzzDV27f5ngS89/+17+JsB3uXjviyhs3eXQp4/yps/zr/+t3eO4TFzk6OcDmYyJr\\naJUndDUcFTW39ArHTlL0B7z0xh7P/vQ5vv7a+3xQgr11k2c3TrP/5luslDn797a5dGaDJxc0tS5o\\ndnosnVni4eXziOkOa8st/r1f+iiowDeNfMmcbGEP7uFUg5FIWH+2zVRkVFUV/Od1QTUtKI4LhnnB\\ndKYLHZfQr2BUw6CCCTDbN3HCbEaooY9AtDqsLK7Qzhrk5RTja1LjaWjQCKbeoXzQFRZOUiQJSRrs\\npYVy+Mrh0yY28dQ0kbagudDg5bv7DG4W/OKHFzjXEjTcGMYlRifB5TUjVGUNRdqKqL2k9GIWYgda\\nOJRwCFcjMXhfBpyfqdDCBmF13Q+zUQM+UjSzhPW5FuiSOAtkxm4EZjwmazQxVRlwibOu1qMphURI\\nTYRBuSD8HxuP05q49Jjb1/jZi2uczWI+eP8qdgyn05qWMtgkxndbHE0LEpvzE4+c4fOX59nwE67c\\nuMnG+nmyRo98esR4ckjdPySpIGrGjMYVuxNI5jVSxzSijGNVUc1FvHpyzH6aokXE9s42j2wu4uqa\\nkxvXGU/3WJhfY26hS+U0SqWUFZS2Jm1EpLFjbXWOLImwRUUxHfPyy1e4d+cO1hgmzRa9JEHWoSBK\\n4QNFvzJkOqE2hsrMTBxovBQYYfDeoLEoU1EKgYxTRDnltDS8sDLPaVGzmCQUdZNvvb/FzRLKbopP\\nE5oiIZrWNGWMlUMiwngptYHjmno9E80blMgRzuJlyCoxImUcwTHgVYQ+OuG8hedO93h+Y46ltCLZ\\nG6GyeV4fDhlFVfCqiB/hxdJmUaMbTQb5CUurPdr1iD/4h/8DsTH85C/8EjJNqeuaSCsqW+KFp64d\\nDZOQj0s+fqlHa36F69eustLqcqpX8PmFObLmEN6xnASDCr76fvEs+V5sOBDTpgpIOpEylikT20do\\naKctRkVGmkGnC9RjEqERPsViMF6SR45o5Sw7fo6Xrr7D5//Of8h8c4kGTdSm5rXX3+Dg3iGPXz7H\\n8dnn+OqNqzwWRzxFzNyooFUdcXEBvnZlwje3b9ATmkU74OGHm6y2PYctxcMffZhu7FitDjl1tk3j\\n0grtLMWaIz51uYvGE9sR2hvcyS61d3jlkYM9RGXJtArCY5lyQswHrsH1kwn3BrvcmEBRGvKiIC8C\\n3s764KEPFPigAXVC4ZRENgVC6BkwwuGUREmNcR6tHOtr60gpMGWB8gLrIoraMXUOV1nGlaU0FlNV\\nKDxW5sH/nyVkSJypSdKUQT4itRPW8fzKxz7B3Zs3+Po33+D9V4/4ux9Z5Me6nhUz4cjbGSRF8QBD\\n4Ki+b9slQCzUTCI24+4+cApipKWchQ84EzSmeQInPqKqSt77s/+DG/euctrmDCREHjoRmGoKiCBK\\nn72XvfJI4ZEEq6HAMCnDsse6EucVq2ubtDYv8WevvMKNLXjq0ipHt3Zpln2efuIcdaR47cYtcJYV\\nmbPUlNy+t8Vu0eL2tSG97SGnugWqPmSh1yYtc/amJfdrQ/T4GczcEm/fus1clGJFyu3jgveKhCpO\\n6ESa/sERb7x9jc21RVw5RicRu/uH5JUgSgL1vdVq02xFWDuh127RST0nhzts7+yzt3PEUX+M1BkV\\nDp9r+pMRzVaM0pralDRUg0hrvK8pvKWaOexiVIDdqFBSExOWVxagmLJuCn5qY5U1ZRBRg7d3j7l6\\nMEZlXZLEo7MYWk3u3dkmqiQ9UeOb0NbQlFA7z8gpSidJpCHBYqnCexSFNpZYWhIVM/SCyibc0tDv\\nQ16MeOF0xtk5R5REuK2Sur3AW9M+fepZuv2/+fFDLaK/ttpGJpJKaFzkmfT3KKzg7m/+99w+vM9j\\nn/4UjVPrBPO6otYKk2bs7N3n7tVbzM+16HuB6izSWDqNFIfEwAtPrrPxWMpIaio3psynFLmlqBx5\\n6Zl6S42mnkLDj5lOcvKow9RK5gw0opiaFr3506wvH3H11hjxpMPJwBf1QuF0RCHHyGyed68c0cg2\\nWVk+zWR0QrutmV9QrG6mlLdy0rTH6TMfZuvqDfbFmMIVxIWlzCxPby7zK8vzlKtPkaVtlt0+nfIW\\nYrrN6YfmkV7hy4IoHxJFAl2NaOcVDTfCK09UBbhFBRgFwoQLvTZQpjC1TQ4Kxdvbh3xrF94cw66A\\nUsEw7WCJQab4lgYirAppASAQWjGzNM3yhuoANMahI4IC0FniCE4vLQYIlrE0Gw0O+wOM95TWMQJc\\nVVO4CuNrjCuDgdTWxHFGZDRaSwpnmOQnCGdITIUdW77yx3/M1shwG7iOZvrGIckTPT7dTBGywM7e\\n3xKYJfMRspJmjl4PwjLjqQb3ihNhhuk1TJ1CyojEFVgHhRIMRUo9HaGuvU57cB/ZkFRJQl2WNKug\\n47VJirCBxuSFRwiHFBXayXBaQeBVgFtEeESUcG1Uce3VK5yMLJc/dIbm5kVuXNvldBOeW21QTCYM\\nY8e9AtpNxeriAq/dO+RP7ox5ZW+Xi8BvfHKBRSm5ff+Ecx3BkUix5y6x+aGP8trN27x77zb1MMfF\\nbcaySx43kLKmiaJ2FUf7A5SA+bkU5zPGxZQka9HNIryHRiaxdoorx+z3J9wtCgajEcNJTV44rE4x\\nQuMi6NiECkNhaqgNzawTOpVIUpk6zLlVhLeSylTB7DLj1ZUmsDtTW3MGw888dI75fIASgq+9c5cr\\nBpq9xUBsKvp0RyOyYkS7ETHqNTmqLK5QTCYDIg+tVkqaNomtpFEXtKQh1WL2XohIKoE0BlyJtgrv\\nNNNUM/QJV3OH3BrzwmnBZrfBxyzUu1OOZUSBoP+jbPt83hxB7kL3kggq6+k2OtSDE/Z+63/i21/5\\nA5Yevkxn6RR7TvDdquDlrV1uvXuP+n6fj9ktRAGPnOry/vVdRicH2HbGNLPUcRutJa3U004jFpsx\\nDZWREI6AUkPsCa4lKrRIEB60OEXGBOEdC8tdPv/Zj/Pb/+JLjI2kToNnP5GGSmisgKKccHD3CKPm\\n+Ys/+yrzSYvPfOLTDPIJ5zZP8frLV3nP32JlsYO1Bb0WxGURJDZK0KmHfDyqyI9fwjnIRE1kxwEa\\n7Q+wNjiKRdxAiAYCS8uOaNeeIgn6Rzuby2kf7syJBVK4Ibr86Y0Jf3HdMFGCI+sps5SJ8jgFzkuU\\nnEGdUXjhUM4HpKcHaYIXWdgHrqnQxj2YEDkPjUaLlcVF3AObnvcUZRBVW29ROGxZUdU1ZV1i/APJ\\ni0HIFEqDsgVDM8RqAaUg0jBBUGi4OzQoUiYqJool96o+//LtPo0PX+Tp9DpSz4wIBiIFVQVRzIwR\\nEI7bD7pFS7C3PuiyCUjVWacqQHhqUpxM2N/b41I34VSviTMFwumQCkAonKUzREoFDqW0+ChAvK21\\n6ABXD5ZVC4lXVDLmnlfc8zUfPrfI5y50+Y0rdygIDqtVOUZGE+4tNTmSEx595EmKgwP2d3d5ZX/M\\n+yKm8hV9r2kXjp1d2HhEcRi3uJm2iL0hOz1P+/gUV+8OsfSwdUUCaJXgJbQbnk67QWuuR19aWqJJ\\ns9tES1ic61DmY7a2blGVBePphMFoiiemrgWlVaBSlAhUJoUHJ1GppvIVrgBla7SIKXyB0AJlNFVh\\nccIhraGhHM7UWCJqnSDthDVp+JlzG8xXIyoc37p9yK6GGI0rapLMI03J2bbgcx95iis3bvHNw2Ps\\nYo/FcZPaJUzqEceTnOOqZKGzgJUxxjjSuqAVC7QwGCxSxWgLkbRom2PKJrXwDCO4WUB23/PRyHBh\\nzjGtPZVuMezD+P+nSv5Qi+gY6MQZsYFYaNoNBdMJLTztLGLv5m2O7u3xTiG4KRVf2NpmK4Wk1jyc\\nrXD5uedZSqD/7hssLbYpTgRvvjfmnWLMLbODBTKgCSQizDGbMiQyKoJgHB3gFboOsAkt4PwyPL3R\\nZH9rmysHlv0TmNgERwy+mMUSTEg8lMWY+aUW26/dYm1uk9vTAftPT5ib7zI/cjz96HOIbJ57975N\\npsCe9JGAa4BBkdmCdlWQuD7ChIs792HOKKJgZ/QR3Ls/pF8MaTdgfilGJRXOQBlpKjStKCapSqbG\\nctBc5C/3pvzuGwPe8LCvWnSWz1FNhkQUCFkChi4GZ0qc9eg4wBlMFbKIdKKxJthM7fegJw8gKQAK\\nIy2ToqA/HuOUIMrCTO1wdBIoHjOXijcWb2qwMx4oYXZojUJHAjvj2gmpMcISxQlToEgTZB0RlYYF\\nUdIsQqDafQt/cH3E40+CK4P8SUmoSx+stG7WMKtQyBwERJqYnelnRVQTCiiuwNcz/aiUWC8oaxhV\\nBVFVk5+ccKbbQT44ns5yqmpXhpADF1Bus5co/DwRwNe6hpqIfinZNSVHxSEPr51jdfAB6rjFmV6L\\nNJ5wcPsOSzE8fvYsdnWDMysrHH/jFZbshIeW4MZBFVxhoqIZSx4/l1EkKduF5t2TMWvTgjldsdht\\nsNOxHE89UW1IhKWyNbWTLK4usbG+iOxmHHhDY+zJ8xwZC/Z3t5kUE0bTCVs721iCO0GIBFSK1iqc\\nPqTDiwLhq/AaI0lMI4Ty1VCrEicN2khELYgskMz4dKYOQX+RpqLiqTjn0xcu0RhPmdSO7+4esp8m\\nyLSF2DqiQ07HNzACnnjsUcqjQ9rjY04XhmR0yMIYcgE2gjMdGBeeg6ND3NIyRdShKgSRr6jzMSpu\\nUtoIKQSpttRmSmqaEE0xyjAi49owp3mv5OmziscWI0pbcZxLpuWP8HH+D8uIro7pxTEdHQbySatN\\nK1HYyqCTDhUN7uYDblpL1lthmYq5CH7qY8/Sv/caL37yRa7fuULbj3jxfI+zG5reVsHOe32OCcul\\nEwgFIjCSiWZWLldCOutUhFCgBA1j+HdWYL6RkinFX7y7T064KNOkB+MhzPKYkgpcMaLRM8jM0uz1\\nWN1YQnfayGbM3MI8St1GxY7trfdZODmGEtL5jLHJ0ZVBRTOWpwZkOIYqpxFS45UnL0oaiaYTGdpa\\n0cgiYq0YlRWZDF1VrGJ8OaW2kvvxCv/0nQF/uDVmFygAkYFPPS7XeBPh8VRCkdgCkOhIkCZp0OjZ\\nPJB3zCy0jtDpPSBJMUONOV9jTYlAsL83okKgminGG5JI44uSZpIivaeuqzCzNJ7aWCQK7xUyAhsp\\nTGlIkyZVyJWm2+sxGZyQliWynLAMnDZwNoOLF5pc2y25erjHtbtwfqNHWZdErkaJAI34AfRqKGw/\\n8DWzL6UHL4LDKVICM4tMVkqALWkupAy9o5c28OYE6gorPCIOhTe2zOZ9hKwi43E6uEW9V+AUGoXT\\nksNccWQMu0cDVtcymr0W+bDHzzx8lnuHh8iTbfYPc86ehenRLhfnzzDduc3w+JCNdsrn1j0b8xFN\\nV9Isc+K0phlbbvll9suIfl6zYgVpkjAfRZyby1heaNI/clSTgmbWoNlbotdt08xixrYiwcPkkHI8\\nZioCoWtUFhyNDbnLSBtt4igjEilRnAaYsTcIH6IzvBegYrRTRC5FVJ6qKigpEEicscQiQglCppIK\\nFKdEK6TP6UQJn1+eQ1U5w9Jx6/6QOm2hIonzhiTVaAPaGJRWvHfjNtvDCe0pPNmGRguyHugsWDcj\\nK5jWkjvE/Kvr+5yolLVGC1/mCA+2mqCiCGcV4zonyjzxYIrUFmVCptZIp1wrChpHlscXIp6cg8IY\\npgc/wmL73zkcohiSAl3CmzuZ0el6CaSmj7cpJm3Re/gCbT+mPR3yb3/iI7z4yKP8q3/6Te7c3QId\\n0erG9NJwRJk/8ygrm8fcmxaMq5px6ZjUkqmdUpkpRWUpqyBQjyYF0kVMaVJFkmy6j6sgRmB9RDqn\\ncVsG6gIzDR2Tt0CqEbkhngyott+mgWP5bIdnXvg0R+MDdgfHjE5GpGuCV775Jcq9D+jVQ9YbKWIa\\nxMTKgVKaAslUqtChYZHGIL1hOg7xHDpqsdQzAZxncnxZBD1nBS1nqP0Ql7S4ZjS/9Y1t/ryAfTqg\\nCxIqomJMa7SF9gojdTCMyIgpFjmDMORVCH4zRDPpyQwzhgtUq/CbI/GBNyAADN1eD1sYdg/7gdIk\\nwQho6JjC5LOFQ2C8PNBCCKlRzmMpMQh01qIqLBJNzqT8OQAAIABJREFUEsPR/UN60rKUl/zCk6f5\\n2Jk5uvUBDVHTai9w53TJl791hw/uwNJKi4bUCDcmjiSuroLMSM+O7bP/+YMGUngCDcsrHBrnC2rl\\nMbOUAF0VtLyhERlu949wiyustTvE9ZQoJgTreYhrQxIHWhsyjFJsHbz43mqEtTjnGbiIt48mbKHw\\nY3jy1BKmtcY//qsPuLW1SzuGRzZXyaqKtNVm2eR89OI679y4QXNtg8PdbTqDiv/4hU+wv3eIGB+Q\\nG0NDeO6XCXv9Gq+bCJFQ2oJ8kpMJT2ULVAKxylhaWmduboGqKhhPTpiWBcZYqIY4YxnmY2pSxsZg\\nXMTC8gYAraxBrDSJDgmnZVlhnMSLBOszhLH4KAlZYtojlEPZGmOh9CEILpaCWCcc5wUiS6CcsFiU\\nfObsGmtFn+18wtX7fWTcJrUWRcVEz64vUhpZB+Um2MmAh86f5XInZd4XRKbARQVSOaJqStPA1ESc\\n781z4/4h8+fXONk6IKocrU6HiS0oR31ipSikIzeebiLxKKxXlKbEx5JDpXn3xDCfwoWW40PtiqPB\\nX++e/6EW0dMvPE0xmWLzgv1hn7IsEFh8YXAFSFvgKTjbyLhwdpVOecLp7gYffuwiwkw4KjS3d/c4\\n2+uyPR1xPLU4WUB+zFMLHT683qVWzPLJNTEO5SpqKoyUWApEBYKUsfFUOLpynTU7oJVIxOZDfHoN\\n3t75P6HMSSMNVbhAp06SRDBXFCzduc7nHnqGv/rG73JiB1y88CirCx3uFVu8dfNbjA7e4YnOlJVb\\nfR5e7JGM+whgZKFjPZGrQUqMVLMQtgLpoRWBipvYugZR4oVFp2HOJnyYAcYORjrltVzxP3+nz0sF\\n1KoFdorCBKCGF0hTo8QUIwAiIpfOIorDcdrM5p+I7xM5HoTieT/DAzILBQScdzOBvmKu20OrlONB\\nn0lZBIhLZUMIWBSeb5jxGgnUKmthhlPFAzpWOGeQFlrEtIsJl1L4+KLh6XiHhprgkYwm93iykfDY\\nizFf+k7F/uE+F9bnEUJTzvKrgFA1Bd+LdhDMkGkIpJehmBqP1wHpZxKggl5tiCPLTeM5MOArw7IS\\nNGqDNDARGikVijLwAAjw4VhAEhGkDd4SC4vRipuF5R6ao6nh6R58eL7DzrDmj7YqzgMvXF7krE4Y\\n37fs9aecWkqpd+8x3d7lu4djTsbw+NkUpiNkATvHcFQbFp7oMZh4Sh9hRcrJaEp3MWZQO6a1xCcZ\\nS6ttpHAomVJWNfl4iK8HpAgmJ1N2RgMm0xJjBXGqaUQp3VaKisN8V83snyiLs6Fzf5B26J0n8zGV\\nhakrqOsS5WoiF1xIaaKorSEfjIhsTBJrprYi9RWfffgcj5QFhwbuHB4hswYKj6prIhXijqtUhfGW\\nEkS1pVkbOvkhovRMdFhYda1GyPH3ggAj7VlKan7902dYmF9hO7O89t27CGoWzqzhhn0mewOmCkZR\\nk6Z31A5EEjGpHANvmNRwKOHO1LPSUCw3Y57u/gh3op/78U8iaotzgvmVVbYP9/CVwRUVSin2j/YZ\\nHB1SHBxz7eqrnDuzyuNPfQiVghtVnH/oKY7vvk0zH+Miz+7OkN1Bn9xtY2Ye2igLhPRGAnMSOkAU\\ngcyCjk8qEEqjZcCdSZUyFoqDRowdvM5+tMjyYpdxaSmspRFSdrFSUkpYcPBwYXj19W/x+EOPcP1r\\n/5JrX2kSxzF5NSSRlseTExrXrvHx1Zhk3CeTgqnz1EqDljRKiy4LHAWVhFLOFjsWIlFghcUnwYET\\n+aBnxcHYtyBu8Pak5n9564Qv51DphMxULGCYGshJKXUTgcK6gxA4Jx3CKaR3aBe27Il+kNZuUc6H\\n3Brge2fhBwFhnlk+vcRFDdqtRYSHJBI0WoLC9BFaESlwZUFpQ5SDCbE7aJWCkEjlqEhIZYR0hsoa\\nkkSSGkjHBWeakrUIFpMxHV8gncF46CUp2vRBwjNPLXP/9j7W9EkVeBk6hgdkM/GABOTDMEIKj/Rh\\nXe+FQLuQFRDrMK6JBaA0QyfpXHyIZx56AlmWJO+/CTtjIiuIowTrDTYKF4+QitpbWq2EXitjMjFM\\nT4Iw32tDJVJ2xwXdxR6PdwyreL5+5X32aXKxOebMSpPTk5JtDVNTEXdW2d3ZoqlSbC2ohWd+Y5H5\\n9RYvf+cNtnfho4/38CbUa0OYJed5jo4zfKQxTrO0fgqpwogj1U3u3rkPpqIZp9y6u4UQLZLeErUa\\nYyYlQkCsBNIaRGFIU02aBheTRSCkxHuNsjW1CQyFsJibpUZoEE5jjMeVFZUUFLYMrF2tEMWErjc8\\nv7nOZpKgTo55c1BQfi+Bt0RnCjoxy+dWuNBu895LbzLZ7bMxr3l0SfBQ15CWBVMh2LNQ73tUB5KG\\nJsoihFC4asTlpXn88XWUHbL4xCJffeuQUt7h8toiUnS4szukX03J6gibekoxppMm9HzKTp5TesO9\\nQcmy0lzuxZzq/fV17IdaRCMbOJrCSw7vbrO6skRVVXTWM1SkuHD5LPloSOZAe0u7mTDJh2ztH7Eg\\nJLoYcX5tHX90h7nYculDp3n//i6v3jN8cxCE4ab8PhszJoB8otkv/qBLCRz3cDF5U/ChFP7dTyoW\\n4oIr92/wyvsFn31uE584mI6RESQIBBpjDG0BTynFlTffA9VioNrkQtG2BdHgiJXC89x6zKKy2BJy\\nPE4KcBYrJbmGhofowYWhZ8kkgCst+gF3VMwMA0IgpMfoJtcLzT95e5/XJ+AyoC5DJjuBzK2UA2Fx\\nIkLINkKU4HUYSSiPcQ/Qxw9eDR/4kP/vQeL3GHCBFI4Lnd2g36clIqq6wOOYX50njSJSpTjZPWA8\\nmfzA93Lg60DTlw4lEpTziLqkGcWYwqCN4VJH8ESj4DMXUtZ7mrIypHGYYasZYcLXsLkkiEugKmYu\\nNBXshQqkfNCGhgIqPHgETgQSuvceoWA6+7WSKgi2+yrlWu8c2cd+gZXzF8ivv43c2+Po/jaLriDz\\nhgrIlUKXlko7ojRhbnkFsgQjBpTCQFGgTUrer9ASNk+v0RPHpM0G1+5eoVYLXEjHLIqKhh6xvqRo\\nrK0hIoXDsDzf5PRRwZlFxamoQgzf4TMfXSQvUxrCYMe7VG6BVpZy8cwyer6LqcOcWmFppoGEX09P\\nWJqv2FzrcOv2kPfv7lIaSeBlK1qtDlKWeCeQKkZKSTQ7FYTIF41CgHc4b3HGgTMIKZFZjK8KZG3A\\nBAkhzqGlDH9XJyCJGdc5C8LweK/Fx+bnsMcHXO0PyGVKFUXkWtNdneP8U4/gVmLknITjQy7td9lc\\nmvCRlTkur6SoyQHapJROsCASRL/PTq24kSt8kbCcNZkXBeP9Q3wxDvn0csRzT7R47a0xJ+KQjcUV\\n1pYc4mSMkBWFCg1NiqEjWkQ6Yt/CtCi5P6hZzTQL7R9hsf3Xv/4KjWaDbqNNPp3QunMX1YhYWF1g\\nYWmeZpyinMRKjZGeRtbClRUogwWKnfe5t3/EI6vLdLKSs3LCqYd6dC4ssnej4EoZc1jUTEvPyAqm\\nVmK8Q1cKUUhMU6ALaMoIKw1G1SyWAz50NkHrkqYfkkZBEHxSx0xqyYIASlBJjXKaQoBTmm7h+GTc\\n4sAJPshHHAloec25tMuZjsfbAYWEuqERhSVCkTiDVZIxglwo0hllKBcOA6RKE9UGLRRlHjbBasZA\\ndUowrXO+8s6Qt8Zgmop5Yakt1AoKkYIsaIkq8BtlC0SKQeGtR6CxskbJAFSGB+megfZtZmxI+QPj\\noAe9qnTg8CTeEZua0eSY/4e5N4mx9DrT9J4z/cMd4t6YMiIyI2cymRzEkkSJYqmLraFbVd12lXr0\\nBLgNGPDGMGzYS8Nrbzz0wvDGBjzBcMNDN7q7XFapBqi6ukpVLIqiJIoSySSTGTnHcCPizv9wJi9O\\nJMkqq9krQzpAIjMi7yJu3P///nO+732fN6qILxR17Vi2goyCTq9gUi3xT9TtBJRIABIlk8ZI4MkF\\nCBfJY8buep+XLub87WsFz6hTyjjFFwVLZ+l2kw608WAHXTJ7zM66ZnLkkCnF7KNyrXT6PaVTvToT\\n2oePpvVBgssFS9EntC07oUY7mHcGtL/0ddSL32BSHTM9mvDCcBtWzxGm9zAWsgzGQTDMumgNg2Ef\\nhmuwnLPfLHCZohM1ZdTgHHmAbq5YGQx5cHrK3EOxusFVe0xeL8lzT9lbwYrI+PiUomM4ePSQrIYv\\nPH2FlfoBBIduwYSkJlk2YDWsDQuOWDI+rlktNuhlmtG9PQ7znFmd0IV+ecLh8YjDw4qaDg2OXAtK\\nCeN6CSiUzvAyQ+QZnpASM6WgzDKUUDSNJcSGNtrUftGGiW9wrkI6j3YJmeeJCBlRrsUISSMiGMmK\\n1rx6+SL9yZhbjx9zqNOGJnR7rF+6zPq1i0wHkkOZ2nrrcsYXn93kS+MeO8tjhkXgpK0SNyBAx1aE\\nAbSmz629yHd/OOYSY37lZo5eT0nILgcvHL1eyVPXNPc+dKz0HcP1HotmzmKZsn9VAab1mHrCetYl\\nmD7Hc8NkOmfSDww6v8AAkp2LG+zde8isWjKdLmjupEAwoQJFR1N0uihjMFlBRynWMsErLzzFxafP\\n0y01+fomFzcv4ILncW5Z7SoGcswr7R6vXnFJ0duSthoeaptAxgcLsDnMHDQ27fAqB6GGC5vw7DoU\\nBk5Xb9I/d53LP/h/WJ/doWSIzRMGTaJxwpKRQtqighBa1iW8UqT3l/KPPs5KKrwA74lEYuZoW8VK\\nCx0XkdHhJDTiE4oB5xBCULVAWdAoixCCwiuyVvCfzc7z/cUUujl9bwhCUmcNSxp0rImNJvqkZ1XW\\nMRAVuVBUtEypwW6gFGhkmsj7s0hqJdAq5YfDE194TAOVKMhiQAaoZYeJtQk9pxU4SUcLQvS4uuJg\\nPkHoHGKdok6CwDpFED0isOIky6ygKjw742P+3jb8289rnto2NESiGOLbLfLWI6ixsUqxKS6i5i0L\\nFfHeI1TSieqYhkm6FDROojCo6DDSYXWSja1tCOpxpBlDVkdkNiPoSO0hdgRTqdhpK+b/+P+iM5tx\\nuLfH7QvnMcMbVL7mUn2I9+DzdbT0HEbH4NIN6Heo7r7Bhf3Ey1somK/kjHLYr+Fa1KjhBd5/4w95\\nLsC//2rJZx+AyStE7zyvv73H4+NTvvqNl7h3MOP+6S1e+fwW5WpNtSwSOcvUZN5BLJi4Gt3WjGvL\\nw6bFlpHd2OC6K9xZFHz/T9/l5ZtXETry1oMxR0tBU5uzAa5iUUsWbUMMitykY3uRK6QAHyJeCBat\\np+hppNbMlzMslhgDZVbgm5ZqPsNEQzOZI3WFlAuGnT7LccTHApkJSjtny8759Rs3GDRLHhw/5sh7\\nqkKzuFnw7MvP83ByzCP5AfWpZXVtm7gssDN4cOq4rCPnO2u48ZQ+BXVcpkKtQTRJTzrF8Wcafidf\\n4Xf2ZvxbccDXtoZ02uM0F6jG9NcLTpeOn06P+Xx/hRsdeNvCuiWpVjKFyBtyarIoiNoz0Zp35o7V\\nfvdT69jPtYheu3KV5aIlBkmzsLTSIpTCucBkUjOeWpTOWF0zkGdUkwUP9ue88PSA40XD+d0d/vS7\\nf8LuSp+pqHnzVnq6uO0uB8UKttOn2+1TSEHHaLS2dDJNLguykNNzSwY5RGq0NpB1sNZzFCrW3TGr\\nUtNfK/jaV36Zt370p4Qiw0zSQGcWFOrMDvZRBtJfWD/re59cImoCOR6LlP4jPaOVQFQECTIItAKN\\nJXMeG2EhC356MOcnt96lm2sa68gyQeUthc4INkP5gFIRF2sWCGxIulyUJM8Nm6rLia8I1oMXKBRG\\nGaJSNNHhmhaRpWOZxicq0VnkbCsCqEQhFyKiy9Q/00Hhnpz1jSGTxVm0biTgEEoj4lmSJgLfkaza\\nKRdszb/zxV3+lasDNsOI+XKMRBDrEwiKubc0wRECHx3NxRl0AhKeMgpB1Aohk0tKaYFwNgWgCZgq\\nTTx/md7FKzQffohqHtNoRSUgRkeXFLSnBpLp6gZ/sOyx+/xfZnjzEU/Xj1h854+4vDxk6M9kZctj\\nurVjbQBdPSZMDhlXU0TWoyY90AyGYn7MioPl6YRm9xrv/LTmxi5cLwJGgyxXOLJL9udw8/lVJkdH\\nHN69x5XzAzY2VglujCk7CFp8zJFO4WaRroOSBYPuJrkCJyRKZXSKgrXBgMlpzeODEbOZYBYtkZxc\\nKLRU2CAITpB1NdF5fPBkeZnaQK5lUVdJFB881XJGluW0bYORGZ6IdJbaNqioibZFdwusyIEO09qS\\nEobTg7hoa76ws861nuTo/oh7Y0vbW2Ht3JCnX7rCtJozOx0xaRMP1tsGgeZwMiEzMMIijEJUS3Sn\\nw0J0aOuGFUBKB9JxcafH5gdjKj/jJCq+dXuM8AV/+cKATn2MkOAkPHV5nXduHbNcLFgdlvR9xWIK\\nMhGnzxQc6ZoeFDnL2mIdnFS/wDvRL3/pFa5eus67t26ztXWB6XTKfD7FuZbeYIX1jW2yvEdRDhn0\\n+6z1Ogxzyaid8oM/e5PNO+9SRc/pbMz1cz2e3tzl9VsP+O7egm9PFzxUJwSlKaWm1BrhLeu5YI1I\\n7mpe7JZEo9i9vMODu+8w9xpX9OjbCd/clXy+77n/3gN+980x/a2CubVsnRnvY2GSZu6ThfIT//7Z\\nRfXjbwoBBHEWvJX6d0+cNPJMzV10i3Q8bxti3dDRgFbco8f/emtOBRQ+vdr7+iOX0YrPyNG0bpxE\\n+yLSijRsqbzHNik4rFtKZCbAK5yL1NbjbMIeZbnBewsxoINHIQkqEJBYCV5Iipi0g60NaK3PIiF8\\nygonopRCeEeeGer27L0LkFpQFAofKi6Fhv/0y5d4pe8RB+8zjS3GZGjXINsEmG/kGabvyc4+mWUY\\neI1Titp6rFGpcAuPCZYYPEJCVirmjSdbu87OV/42h0fHLOMB/aXF5dDrDFlMZsjYYCzIakY+GDD4\\n3Nc4OX+ZjdMPWXz7v2c4eURPpJuxBXLlEH3obPY4mk+YVo6FWaGix7QBFSvOMUdN4as34ThYfvLj\\nD1g4uL4+YDB7SPAFyhQoo/i1v/El/MSz/8EemYOnr25i7RIZIyYncVi1QocSO6uIvmGnFzE7Qx7O\\nM5zJeP/9e1y5dJ6t1RVmk5rGeWwVsUISlaCbSXSQBKWQQhO9p+yViYQVAlU1p65rgnX0VlbI8oyj\\n42OaZYVSGaJIx6o2enyMdJShDpaqdThdEn2GpsbKmigjOYEt4MuXtnGPHvLgcEzV3WC/qrimMrTJ\\nCbMpK2XOcGsVIQR2PCPPc+K5LabjA+6cnNKIPllogQ6u7CNND3c6RUsPcc7FYcHL1zSjDxyzoscH\\ndc239mpWjOalrXWEPcGHmlWdc3kFDvY9/WGX9TWFsHNsIwjSI88SXltfs1JoZkHiWjia/wKj8OaT\\nCWWuWVsbMFxdxXOepql54403ODo6ZH1jm7/6q79Kp7tG2zhWOiXYit/+zX/I//Htf8bfWG+5cOUp\\n1rRmcnwfuel55aVdtryhfHOPdx84Jt4xJYFHciCr0mDp2qUuYTYnigGvf/89FjZSeYjMea6Azes9\\nev2ccmVII8cUjaAURZrsRGgJmJ/xnn5W8RTi43C5T+ZfBVFDJEUhPNllSVDBY5wnxJaZ1SBzullE\\nNS0LIfi9RyP+b8AVgo5rWS1K8AVGQyEzciGJ3iF1j0Y7eiECDVbAUkKDgCAxE48yIM/yYbVK7QZh\\nLaHxZFqfCZrAilRAIxCDTMR4kaJsl43D+gDCJA1pdEnM7lNqoygkRpuEyAsqXfxNxU5s+fe+/jyf\\n4YjOySFEMLnAtmfYtMJR6aTNJIISGhE1PoIVkaVtkVKhy4JHozmb5wzaWkrhaC3EXGN6Q4Ids3N1\\nF56/hvmnP0EcPGDdeY6dx473WSkyoktGh0674IPX/oBr289xMAqc3P4e1Xtv8Xx/nfejZ2Y62GDx\\n0xMeVZLpzHLw3l0mE9BLsMcjZITf+Mo51rbW+OpuwXjpmeghe6ee+wI2e4ZOc8rUC04ePmD41FX6\\npuCne+9xvD/i2ZurFFlyBZlgIVpE5vFCMa9aGivwuuD8sGAeG06PxhyaFQpjkSKD1rJSFCxqjxUR\\nLyOZEhTaJCtvBNAEoXAepJEsZmMW01PWN1a5duUZLly4yK0PbnN6esp8USNkRDYWHyNKJyleFwVF\\ngZUNovEEaxHS0ZBuE71c8OqNmzCZc39/zBTBtI0EYTg+nZIv5gwHA4pQ4MoMpRRPP/08h/uHVMMe\\nh6UhikDTNkl8jEKYghAteZ6zCJHM1/Tm+3zlszd5nxP++N6SblnweFrz23fmyG6PZ/sD+vUYUU24\\nvLXC6WzKeGI534eyEATnEDFFbhsBWgWE9qwWknEL0/rT69jPlyc6HXP7zh7OB6LS2ODJc8O57QHT\\niaRppxyPHvDyyy9zNBrz5ve/xz/+R/879/beY7A95PGDuwh5hMsMO2sdhlsDjD+l37Y8+4Vt2ucC\\n06bhMDYcLj3LaYu2gkUdacUCV8AyTih6CfWmNHQ9vHpZsGFqFqJgnhVpRzWvEIs6jb3lmcPIkb74\\nRJjWJ9dfDAz8ZIEVIk2KQ2zQId3APgpEUCif8oGqJdTW0e91kU16Gp56zT/fq9kve6zImn6uiT5S\\n5l0iAm1bcumISiWyMiDCAoXGokFoapka7p0QsDZSe49XHqE0RmuKKFBB03qHFWBl2n1Gkr5ShfS3\\nFZYnHd+UKyRBCpQ05EqBl1jb4qzDnQlDlRbJLWNb/u7VnF/eLAh7x8Q8mQ9kiORCQNGl1YJWOaRK\\nygoVwEedmtitpMmOyVWkdY5WCT44nHN1vUTVjo6GxkX2j8Y45aA9ht/+37DvvE2/HRMCjCtY6Wq8\\nklQ6x5qc2mX4vfe4/9/954yKkuPDPfKTI16fVpz6gvv1lMq2+AaWn/jkzyt4dnsDnY34178x5KmL\\nBtqG+dGC3EXW42MaI3j1C112tnqIoxGtzFjf3CY0kdO7D+gKmCkYDDKinaJpid6BkOmo6SKyVdjg\\nWXpHPyvZu3uPtllFFR1a17JYWi6c32GyuEOLoa6T19+YFCUcEgIfhCMGTV3XzCZLjIzcfO4G57e3\\n2FzfoLGORw/vMxtPcB50LrA+Hf1DE3GuoXZgtcEUJbKa0NWKWkScEZj5gheHA24MBhzsPeCehYnK\\nWdqGICVOFMQsIpRna23I/nLJYrrg9uEHDMo+jpamklSxYNI2Ke+DJMfzCFCCJlthuKzJLYzshL/5\\nt77Bh//nd5jfP6IoMx60Lf9sb8T2cxucU+mBvog121sFR48n0M/p9XOcrWmbNLQVJJ6G9hWDzNAm\\nst+nrp8v2f7khDff/D7T2YLKtQQf+OIvf4EbN66xt7dH0yz59rf/CS9+5nkePtrnf/mf/1smpyOy\\nIiCE44Wnd3hq5yIb0TK/8wPebh8jWyh6JbrcwpUFcj1jIASbqoNBo6XAhiZpyuOUNuQEmROiIGqB\\nrStWlWVFTuiuDvnshZf4Db/L97/z+6gzrSMavP+4cIqfsfuEjwto/Bnb0xjj2R0oCcITEWcXt8Qq\\nQS2gFpJemaGqBVp5Gl1yf6k4clB2DZvVnK5zDEyOsHOENmfebgXek/kWKSLBQAg5GkHXSwofOEu5\\nQWdJP9kQsNFiW0dEpHRbCUooHAET1EcDMmJEBoE3ZxN8mXqSAoEUT6Am4MLHvyOdaQgKQ0TVC4Ya\\n/s1rG4j779PPCqp2QWnOBkQmEowmapVG0I3DhoaFa/FCYGKBdhpX5kjbYLKSccz5nXdq/trXz3NZ\\nHnCumiOcJ+QFstehmU1ojkZUTcTnG0y0492iILQVbeXYnzXcn08Zz6BdjJi6O8xItllZwqiCWgem\\nURJUgSocn9eK56/v0BOC5ajCH434jS/tcGM4o++PsBT0VgYUPcVyNmE6m7N5fitNzBVMRcYbb+zT\\nRPjCZy7Q7QYun9fksaEIluhqdA5ojbfQ0R3yLOLjAiRMsj7fv/VjxuuGcqfHfDHl3Q/u8/kXr3P+\\nwoIP7x1AtMiYZEqLeokSkiCT2SF4g2sbVgcdLl8+z9qwj1KREB1v/fBHHI9GeO8IaFprCQKMMSgJ\\nEIjS44OliAqtFT62SCPRzrHtav7qlecQkxH3xmNGWrAMnJ1sJE5n5ENFtBVeSIzxFKVhpSxg6chj\\nYKPXo+NKZtUpTRZQdomJ3fQzmC5O5cR2TC+2lPWYOLvPyy9e4U8fHyEclN2CcVVz+94Jl3f6SMZ4\\nYdkc9OE4JTHmOifLzhx1Z7Y2I0CKpOFrDIx/kYuo86B0jlAO0QSqaoZvA9ub2zx+8Jhcw/37j3j7\\nh2/w/vu3aZdTBj3Dcn5KIQNPPfssiw/vcGVthVkNg90BP3l7wrtHFe+yx90i4eBWgmbT9CmUojfQ\\n9E3AtDVX85asKNjaWKVdVCx8wSzrI1lwQ8+4dnzM8s6M6UnB0kOVuGYJb5YZ+GRswKcMkf5FAybl\\nQJDhpUdKiUzjFpyARmV4qVHO0c09dYgcZH1+/weHlBq26gWbLTy9u83m6gqPDu5x2izwZAhZpJ1b\\nrIjC0wqFzTTCSZRMAntFyVSno14L1CFSY7DO0QRH5XxC4cUnU3l/JhXV+LOfUTzx0QcBMqIERJ+8\\n8jaF3pKETAnSEaIH7ygcfPHaFhfFAuct2klC1DjvaUNM1r/ZCULmSC/QISKVAGUIAjLvKSIsdZ/S\\neWJUuE6X11zNW390m7/3xV1eWTGsEFmqApcVNIuCxyeB9x55PjypOJo0vA3U4/TRzfg4HqV88vkA\\ntQLfgikKrLMUxiBCpKN6/AfXJzz9TEnTGuaDDkd6xo6tEYc1vuOprafT6xPyLp2dNXrNXfx0Sm0X\\naCGoZc7tgzn9dfiTtx/yuauam9tDCmpcYzGZJuIQHozpEVyGD4HhYIVhVvMt3+H9E5hnM4bLGS5I\\n5rZFlzn9fgdra7QIRCdwLSxbjzICfxbj2infuMlTAAAgAElEQVQKNi7somWkrpd436Hf7VPVLY/2\\nH9FYi9QGUgALUkmklCADQkn8WdaKcx6tNcuqJlpBx1W8vHuObQNv37/LgYWRTi6noVIsvKNxjmU7\\np60qMiMpuz3Gy1OWGjbWu8zmE5SMdHqa6rTlpGlZz3IKA4tGYnWXPGSofA3aE7qxZc0f8Us3nuPO\\nrV2O3r3Pdq7YzjSns5bHwxXW8oJcNdBOObcBeU/jAWsF4omLTmiicEgiHTz2bHD7aevnWkR10eWz\\nn/8Sk8mUo6Mjjo9HSJHx3LO/xDs//YA7d+5w9crTLGZLPnj3PbIQyD2URY8YGvYrx2gZMKZBF8m+\\n9cWXLrA2Fey/85g3R57ZAkY4HnKadl+PU290dwUOg2CwrpneugMNHFTpiJYB/8YN+OzzBSG03Plw\\nn+MF1NKkqQIg/aeN3s+aeKTigfjZr0rjI4uQnigzggho7ykjZL7By5YYYY5i0h3y23sTbnvIugO2\\nW89mL7C7ucH+4wdUyxplFP0iJ7YeJSRKlyhqVoIj83MEgjYoap/jfESZith+bESIMVGaLAohBY1L\\nJgSN+ihZGBxeJXG+8watxJnmU+FdBH+m1cwkQihidGcGc4UUkozAAPjc9iqx/QBsRKkCRbqgi56i\\n8p68NGQiTwU0+BS5YQqcc3hf4WVFPS4oWkcoK6zqMdPwgdX8N//8AX+yAsMs0c5VC3UFew3UWwV3\\nF4LxHE57K3S7LcpDTUEdBEW74DO7a/QHfV579wOKckDhLAaHKCLeVegWvnFxg79Sjlke3+adQ8uP\\nb0Wu72oOjxqoe3Qy0J2c90dj5mVA6oYNV7KbG4RfMPGRlYHmm7++S3djnZPjEVuZpmmnVIs5w80h\\nFRUayFQBZsDd/YYFHXY21hk/uM0f3D2kXYeTesKqdGidYbKSD27f5urVCygchTEsq5alF9goUHmJ\\nii3DfsHuxSsoAePJCb2yx/mdC0wmE37847cZTxYgNEIrnEv9calEasuEgAJMoahqj42WEDKKzhrR\\nL9gQmpuXdnn4eJ+784aRKliIgq4I+LrBaI/WNdNRn4ur5xBR4SxkeYEuS+ZtQywEQgQImlgOaKqE\\nUsx9jVCKloxOC0EX1LKDjHN61YLBSs0rr36Rbx2MmUwnbGcG8pw7p6esXVk9M2ZAPswYrpRMFgsK\\nE/EabBQEk/CGEtB4ekaz/FnDj0/WsU//7/9/V1bkPPPsTUaHIzY3N3E2MBj2uXb1Gb769V/l6t17\\nZFnG0eN9RgfH9Ds9YlPjm4bNjQ3eenTAtNXsn3quixVeHfbYljPOrWU8deEqf/3BiFG95MS2nC5h\\nPk+Rvm1IeDljMx4dzAnAok490cLBF3cEz2zGFFDVzRFFD3emqQviibzmybDoib88vacncqcY+Yhp\\nqVR6bTjrfT55nchACEcG2NgQRUGUDuWhlFATqXvrPGxLvrN3yu/dbThUJUYYFLAfHYtb79LRBkuB\\nUQWxtWgCLipiKNDesYvjy9eGZDrju+8fcqv2+HwNiTjzmqfYYEkaCGkBtXgCJnF40vE/O7tatACh\\nIlGUaWdCQAiNFqlX5bxPpgCZaElaGpoQUCEgm5aLOZwXMelPc4MVgswUKOFovSUGDULRRse8mado\\n4qgIyxopNYgWmSuKvENfd3HKkZ9N5pzUjKTiD6YNUcPAwU3g6mrGpGmpBkOOmjlKZ2RIiiZRmVqj\\nkdLTp+Wim/DU2gbv+0iQkDmP8s1HaMUbGfylThoKGrPCB/dHzCT8dJZkWOdq2M41a6uG42KT3333\\nAcE5vnl1m2uFAamR/SFD26BlQ9Fq2qbhZLpg3CzZGBZU0eHQOATBaVynx61Y8taR43zR5+6jwJuz\\nKaE/ZHk8xujAcHWAjDnz5T6ra2u8+OKLvPG9t9FonPMInaFlwXC4Rs9ExqPH9Ho9hv0evd4Kb731\\nNq//2RvM6wqQaK2ROkFqQnRIdBoaCoEUJBkcqWfrY0TEQFk3fObSFgWB90+mTPWAOkSKqFHOpkRR\\nHJmrOH48xx7VXL18nnGYETLN3uMD2mXFcGudomsIsiRbyWhPGoSaE/0SobMkZ2vGhELQtgVGKrJp\\nw+5Fxbkvf4H375zwzu+/xoaHDRyLxjOenHJhJcfTsn7xHMvRDKk1ZQdc5Qgupr6xSIYGYVPaQbf4\\nBc5YevNHb/DySy9TVXNkjBSZptfrMVhb5Ru/9muEKHj06BF//7/8L4giEY8WdcPlC+eZTcYcHhxw\\nPIc4r6moGV8rMc0xvV6OjoEvXN7Bq4gvBMsY8TaHkGO9ZeFrbJOztIHGewKeGBPX9Bxzzmdjsr5i\\n4/xVnjmdc/zoGLeoUmCTgPgXYlRlMtP8ufWk0KY/n/x+avR3NjyFyagmLVoq2hhZyJJlRzF3juNK\\nsDe2/PGHx7x1Cu3KAJGVCfaQa4TuYhFUDrqmSBnfQWCVQwtJVs25WkT+yjNbXJZzVLT0r23R3jnm\\nlp2Rl6ss6wUCh1KRwjkKqbFITryjCSJlGKmcEMPZO04aLyHAKI0QkRgcT/apQgiUONuFniVQEgIx\\nRLwPGAlrBlabCl8kx5fHoRuH8ckVIYwGneRMRXdIUC7BSTIwaKTMWTY13jQs2gUhAmZKKc4AyCFj\\nlpXUWfqcVvo9nr1xhTdef4237+4jJWwDovb0nScTiqWbUxSaHvBs6bkwP+YpYBpgY2MdU42oqoaX\\nntvmy6sZl2eHnMqUt7WxUWDMkNfu7zOOkJ+O+crFIYd7D1iuFUysY3wM9ppisVyQdWHaRAayQdc1\\n1WjMud4GDxqgKJBlynzPtabVhlk55J1a84dzyzuVYfbDu6i2ZJkVeFeRZxlHjx9w8cJFNJKl7DOd\\nLvHRoEwHFyyZ1Jy/cJEQBSpYCIFuJ6ff63I6nvD9N97k0f6IrCgIXiLzjNrZxIixDZnJ0S7tbIkQ\\nQ8TFjFwlhYYTAeEkGwI+f27A/OAhk7pmODwHkyOq2YRWZlR5l0ZolPVsDArcsub23bsczyagDRuD\\nHWYTj49LRO6IyrAVFedMD9/O6VETcCwI5N3AdBkwnQFZPafX1oyPj+k8o2lkzlRnnIaWVgmsh3nt\\nEWt9VvqrzGYWa/qsD7fw9ZKMKUeH0wSYPsNTmpTnTvlpvTp+zkX0d3/vt/nBG2+wNlxjpbdCUXR4\\n6sbNM8Ct4uBwxKP9hxwdj8jKDBss53bOMVnOebj/mLVMs7E95KnVdeY/+DPmxzUP78DeacPh8ICT\\nToXqSTY7GasqozAV/bKgqwVdAT15wKDoEYMik2BVTq1LoKCNgsbXxMmc6xfWuL9bIGJygfsAQSb3\\n0KdN5+HP70yfDJqkhCLPUAPFfJE6BKZt8cJzqLr8kx/M+f4xnDg4delIp/MCHQSmrukWirpdUFQa\\nXSSZgMGBd7gixwqDWUz5bNfz9ac3WDNjchq0hSsdw6/f3OKf/vgh7zhPaRKFJZwNylxM8OJCGhbO\\nnZFQ3EdvUSiBUjrNwLSG4LBBID7xsBby4/5FiIkGD4oYU97jmoFOPUPnKtkzpUChyXxMDyPtE0zC\\ne9zCIktNGxw+1GRBIyoodY8jNU9pFAqMUAnM4kQSn4WWaJfMmpbH7ZzRYgdZrMByiowZrWtx2mMF\\nxOgxuUGpmkzB9aevc//H73Np2OU0K1gVDes03NiBX7lY0FmeYs5gMZ3Y8lQXRtFyt1fwk/2aDFi9\\nPuSad7x/f85zfc1Px45Z1eDWuki1JNOSatHS7a3QLwJ17VjtZwQDhWophSPWnlFW8mGvz9u9Pvtr\\nS/ZPx0TTIQqF9xGVdej24N6Hdxh0V9k+N2S+OOF3b99lOrVo0aPXX0FqQa4Di9mSslOwdW4TlUVu\\n3fqAd9+9hXWRoujQuoDKCyJgig7gyaTGWUduMoKPZ440S5MNwTaJPREiKtRcXRvSi5bjg33WVcFO\\n1/ONr7zEj3/0Ot96u+X9CL5cYXNji83tDqOj1OrpBsfjR0fMDpc8fe1pYvS0jePe9Ag7m7O23uWS\\nBqyjVLCQEi8szuQokWPEglUBp6cTDu4e8sO33km6Zl/T1AKynMm8YdIEWpY0wXJvZugejVnPoAwO\\nKdLdnCmRCF9EJCmG+dPWz1ni1NApFrTLmsf+EVFIbu/d45t/9+9w+fo1qnrB8ekJd+7tMSxzbNti\\n6yUnJwdsrK8xf3CfTVFwzs7pFwCR5z73FDyueW9U85t7I8bAENiAj3SdA+AccLmA1Q1oFimi4eEU\\nDkRywLw8gH/tRY2atLz14B1++H7NL+8mcIcSZ/lCZ+tJcXxi8/zzonrxkdby42l98h4HBcF0yNcK\\nisUReeZZFpv85IcLvmsHTE1JoWes0dCNjm2jMO0SZSM6ExRzg/AqBeeFJcZIYtAUMfLciuHXLvW5\\nlp8yb84C2QDj51xRjq+vw9HhiJjl1FHQBIFXhohG+IgWESNcOpafXWC5VhihQMuP4tsjkpYnO+2Y\\nXOrCp8vPBVSCJqWbntQjzhVk3iKjRbQ+kUxEjkfT4mh8jRLQIydXOU0TyYoMmSsyF8hEjqo1RqV4\\nFDxEqxAehC5QBFQ7p1COQsODFh5NTihloN8kNoFa2UKZhpP5jKz1lK7GLODrL19gLgrefuwoerAp\\nPFe78PKlHk8XNTt2nyo4TmKSXLlqStHCtmz43LDglJwf7TecLEa8tOH42nXNpWaT4/3H7B2c8svP\\nPZ+osfNjctGn2N5ksTzmeLIPS1hbW0Uul/hlS1Caeab53v6M/Qu7sNaj83DOom6wwhDbCl3mFFph\\nxJIfvfEmj7aGaO2p2sjqxgW6vVUau2SlTKSyrc0ViqLAh5bvvf5DHj14TF6UNM4hAmQmJyDIOwXO\\nO7QuCTh6HQ0xUhhDXdXoQmKFxPkS5Q19HRn4KTevvMDRyT5NBedMzTdvrHFZPOb6Zze5egX+0dsj\\n3tgbcb64SIxd+t2S2lqeffYK62sPqJcVq6uaMs+ZzGvUxg4cHzCWntrGRFkvwCtLtBGlC2wLHVMg\\nRI22FbmruHlpm9vjQ1T0iFCAzxCFZDqv8UGgMs0iZHzwzohnL8D5ribLFN76hHuU6T6XQPEvGmqc\\nrZ9rEf3Mc8+gVYZvWhbTdCxbzuf8T//D/8h/9J/8xwgBb7z2GvVygdeSarmA6PEy4ye371CNGjau\\nrKZGtwLVh96w5i+tdLl6bZULt2puzVrGU4uvIk2TPoMKOCRNx+8cpqK5dGm/tAQu5HBxCOdKTdvN\\nkL2SKXMqmeOYYwRkyNQ0iekpJT6eJX20Yoxnu1U+ek0qsgABX1XEIHHWoWKNsh5tGno6o9CGBWn7\\n6pSmbVPUrxYWITV1VESlyGNESUnUGbW3DKjZCTW/emWXTXGKXXjyBO3HZwqiorAVr2xD013n9tEx\\ndyuYGsGSLi6qRHcn0jrNMqZAN312vNEx/d68h1pHBAERPRFNIPVVIeKDxYcU0pbG3gG0xtbJUJAp\\niNJjgsfIlIsUJHg0hoJcBrA+Cc29QbiAbwNVa/EhJGtXO0CGlCNvbIaRybmV6YjOHI1P4X2NS9be\\nv/7CLos/fJcHCsZBohcOLTLWui0XnefrLxbcPL/O73znB1y50OPLLzzFhpywVrb01ZIBIKShmrTM\\nC42UGpn3mC1HdBrHLhVf3d2irg4YjeZwrkRbx5qwbPc0p63j3umUa6tQZIo4qxnN5mxev0JrHdN3\\nR/jpFF146MIiOvYXFe+PHOpczkquWBECpxUnTlMCg/4Kk+mMbqeXwDGuRWrD5tYGWdbDupYsN2Sd\\nAolnZdBlsVjw9ttvcef+PkVe0Djo9nqApixKhE5+ee8TkNuYlN+upKJeLgBwBJRf0OoB+Jad+oBn\\n+zUDY7k1duSyx1ee3+Zat4bmhFAaXtiUXPvaeb5/r+K12+/wW/8AZm1g4Vt+/W++yvpql2pg6XUd\\nJgaizollQRQrtIsxIprEg4wVUcwxIScXGqskrTBI1WNFKsJyn3Wm3IkWdI+qqlnp98BOWbaABh0d\\nJlvFuXRf5kUH2hbpk9NN6kQKEzj+JS3Rn28R/bVv/DVWuj1Ghwc0jWU+n3M8mfLuez/h7//X/xWb\\nm5u88b3X6CiDTHE9TCYz7j0eMVztMrw8wOVdxg2UJUzaGaqT0R0f8oLs8NQzffZNj9NshbmXLJqW\\nhfUct5GZU2RVxsmiwYpAE2cEAqvFkOHkiBvrC6ydU0vJytoGigfMlx5WC8K8Rut4thvz/x8J05Ov\\nYwQh40fF9ZMDpxA8ynlEOyG2oBO4EWMtW7pltRmlm0JBNDlBGoLSgMJKaIWmMo41rcmiJPpAV0bW\\n64bfeG6DK2aBdB5vNIX20MSUv51nBAJdA7+yKXhuY529yvLOaMbeaM7SzbGiS6EENoaEE9Sglcag\\nyLxAeIGOkcZ75BNAk0z9zBDOwHcBVIwpJMqfsYr1WV6TTJPd8AlMnQ8NVbQ07mPnlgwe65PYPjgJ\\nQSGNohWRLDMUqkesJ3hbk9GhbyD3aScRImiTE03JvBnTUQ2vbClONuC3Rim47FJYoFTOlX7Jb9wc\\ncjmecvTeW/y7X3uRD/ce8uq2oh8trj2myXMWPmdmBcde8IPbNccB+muKi8MNSjliU0KIDa9cHDIa\\nj3GiQysrFJadvmKYD2mbgFAFQsBiOuVieZ7FtKJuJFILlDZIo2liwxLNcROxISdzhp31VU67HY6X\\nC4LMkdUpjW2IUlB0exQdjTCR3d3zbKzv8OjBIUZphueGLOoZB/sH/PDNHzE+naALRV4O0XlGmRm6\\nnQ4myzBKE6Ogti5h7VSObS1K5dT1IvVCfUQKhQlTghmitaFra166uIE/3sdWLTcvXeTGpRXwd/FZ\\nTi003VjTre7xq5fO8dT2FdzbkR+8/R6HDex9902e/fp1ylXwuiJYA1oRnGOz06Gcj4kupqcvHkWN\\nFKto78gKw2KpEKKgEAEevUd99ycsFzDtdjCDHts7XTa0x4clRM9k5JjUDxjmaVNgVMAT0VrRek8U\\nZ4GHT+Dhn7J+rkVU4hkMO1TLguGgx8bmgEvsEpVkOp3xR9/5NvW8ZrW3gq8bonUcjU65fGWXstuj\\np2r6URLqio7uMRrN+ePJiPoIBllLNrRU/Ro5DOiiQ2kUa70el1SOV4qONwgRUKYlxD7aFMiYoedd\\nNpnQ1TW93Zt83Zxn//4DbHvK1BrWSo2omjRN+pesJ73QT/ZF0440ogXoNp45dVIGVCw03SKnoKFf\\nQHVG5TfCUDcOhUdGjTEaXTqEdRTesd0zZOM5r17LuVIsyF2FFwKnMhYWMpmgw21bIVUK+CraEVu5\\nZtjPeaY/5PRc5MP9Oe8dLdiz0JqMhVA0IsNgMCGpPoWOuOiQeIRMPlgfI56U7imi4AyKjwgRhUxx\\nEQi8AjKVWgFCIYMnthHrIz7zZDoniwYdFcpIiq6hsS0qKxEmB51htGQ5HePSUwcdQdgK78E5BVrR\\nkZE6ONq6ZqihFJGdruG5LXh9BLGe8HIv8tyzV9jqlfgHbxE7npdeWMXqJfuLY8LI42ICQLuqJogM\\nREFPKT5zRfMP3nFU707YfrGh0ymI9YKOClwqCk6n0NSOc4MeLGueHkYeTecwgf71TUaTB/QGXQ5u\\n7yM6JfXcpvhqH9iUCt9CyAfsH7c0Ig03qqamu9InHJ4irCdqS14a5k0NytPv98i7GVmnABHY2d7i\\n7oN7PHw05+HBPuPTUzI03d6QICJ5dwOTKbY2NjC5gOCo6hoRBVmUiJDI9k0gWS8j1K1DG0HrLBDB\\nn1BGmSb83XUev/sel2TBy5d7GLUEERIuErCtJFc9YrXgXAn/4Su73L/0Ar//5i1e319Qtp6WjKPj\\nCY2vIWriYs75QnBVKYbKgI+EOlIagVUGEVq0sCjp8GdBiN1M8M1vfJXO3Tmv/dEbHEnFpec+w5Y8\\npZofMT08ZedClx0MmYC4GKOcI+BAeLRRSbYXHBFQ4RdYJ/qbv/UPuX7lKlobVocDyk6XvCy4//Ax\\nP33nPULjUq/DtYgYOT4cMej16XR76Lyg507ZKHLK2ZKBNsyP4fqXXuU9U/EHdx7y0zuPmbIg55Qh\\nqTc61IlwPzBwoYTL58EvoKth0cIkJkxeJuCpi0PE/R8y56dM749Y3QKKVZbTEd0zKManLfEpNTbG\\niI6pP2jrs2O+hCZk+KKkyhtmWqddXN2gpYBSI1WOby3S1/h6TiRDusDNnR7Pnt9gJ1+QizZFBYuI\\noCFmBbUVZLElF8mL3mjOjuaOYXCs+gU7QnPt8oCnLha8sQz84eMxR5VJ/SSrMEBE4DOLP0M3cyaA\\nSv3OMzRdTLYBhUCGgJYqBZ0h0wBKCGzwxKCRUSMUCAVZodFZgWw1roookdMua6TW1DEyrWpqN6eM\\nisy1zOSc0nrKPF3oUgOxh3cR6xYUmWelW7Ale9R1w8ODEWtrPf7Vz3VZrD/H0/PvkcUJ+mTOL33+\\nc6ztCGan92jmo9SywOKVRkRHaaFLi7MtHa/pl5rPfenznP74dbap6VkQpmBuYVBI+gGmowmiW5DH\\nhst9QXMaoely/4O7GO2YLCLRNkxPxxQrOeOm4eLFAosnJwNXIqTktGqpxyesrfeobI2hJbcNUXoO\\nT/YxZZcXP/tL7B89JkqHE466aZgdT5iOT9mfjVk4hzIluSpQAvr9ElMOKMsiDQjP+tpGCqqqTc4z\\npVDKEJcV0fukPjm7qJ1zyP+XuTfrlSy9zvSeb9pDxI44ceZzcs6syppZrCKLFNnqwWqxW91twfBF\\nS76wLwz/F/8YAbbRbQiwAUvdktgai+JYVawh5zyZZz4xxx6+yRdfJOm+MHVZ2jcJJBKJQMTea39r\\nrfd9XqMpYk0Px/Vbd5lbg5vD9+8XvL0dIK5oMwW+ppASHzM6NcSbhhgW7Dcfs7+5w+3ffZd7VzWf\\ntp4njy+ZBEvMSibzMdczT89FtgqDsWl8JmSJbDPqnqJflNh6ThY9UWUY0efKZnz00XcYfdTjhz/8\\nEbXyiGEOSDZNjr2wyIUnzy09LVNulm0o8oKmWd/jwWGkIkafMI6/4fpai6jSOQ8fPObG9RvMZnOC\\nVixWDRfH5yluNusRBxWtNjx//AiF5/ZgxFZw5HbFlRixWi5xssFXPRYTuKEf850bF/zBfssffwX/\\n5xN44eHYwRfAjILaQiFKDv11Vi81soB4eoLoGpyqyEPDv96cc/964N7I8mWt+fQCDrYhs2C0YoZA\\n4NbFCl6lJFhPAjtoQZAR6T2FS1lIQa21+oIkVPUtwYMXAi9imsF4i4mapoWFc4niLkFmCtHL8NZi\\neoYoDMprhCmZLlv+/OEJF3tD3tjZZyvP2C4EQ2ZUYUYelklEL9a8TSBrM4QOtDKyEp4sgA6OGC65\\nruDmEH631+c/fr7k/14uORoU1Kqg14FsBUJX5A5smaXZrQtptptV1C6QCUUeOkRsaKVD65qq09zu\\noN9CkxUY2bB10GPWXDF3jmhz9FInHmemmeeBfn+DfDymP71gRPo+NlSi0HcaqkH67n8bx//6Gvzd\\nyQnLomS4e0Cv6lGoiGsWtG3HLy4t9dKR1ae81pziI9y8UbGzu8MqawlU2HCTrOnY709AW+Y48hay\\nNrFeVxo6OSC0e7xTX/Jid5+HseOrpSU0jqWSXMxbnq3t+jduH1DlE5SdcG0TnJpwORtwarcJk0uW\\nVcWP5hPOJx2Fhf/x4DrXskuEm+D1ApXv0l8V+ElDr5ejtzLmzxRB76HsJZnJuX14Iy07o0CKkm7h\\naFhwennJ+XyKbR2F1knMbjLyLKPoFWjjyWVHD1BCsHSO2gecNtjGEjzYZYvIJMKCaxqUTJImLQRN\\n3GGrO+JOdLxuBjRHHZvViHff2sGI51gkIVRJXRJrRK5xDnKrKF1GLA6YR0ERX/KHI09nHX/TFvxi\\ndJ/erbu81l3x2umn7M7PMG5FMDleFUSZo2NGVArtJVoMWBiw1jLqLK+3kcc/+xT97W/BZjLX9Man\\n9N2Y2i5oXET1BZnv8D5H5gW1a8iVpSw8bS2IMb1YhIJXQTn/f9fXWkT/7X/375menxPbjkE/ZzKZ\\n8PGPfoJYdhAUhTFoG4muQeHY39+mV1WsnGXhO5pen2ndcVMFMumwHfjRHabhEE3ku1uS69/w6cao\\n5yzml0wXcxadY7FqyGdjWgnLeXIPIWFjf8J4Ah/tQ649V2xheyMKjghdIi4pGdBr8fwr33xYt+lp\\nJxMQUWJDSLEUcq2ulElLKl/NRo0meIdTEbv+fxSeqtAUGrRJUb4GoJ4ytxqtoac1pfaJhI9AFZp3\\nd0a8kbW4oyc8cfCihN2hZivXbPQ30LlBSU8WbJpTyoB2DmnSZy5s+lytSdZO0UE/Kt64uc+f2Uus\\nzzEWfFcTy4JzqYmFQcoOa6egcrQwxG7OpvDQQpQaJwocDucUmTIEFmwVktHiAntjhNzdxjyZYFpQ\\neYuKLaWEjQDD3QPY7XExfoDJI8OyoDY51vRA5sz6BdPGgtXMGkndV+wO58TJJS+Pj5gvYDmDvoLd\\nEayWcLhbcPv661zf7FNySusL/u4XX/DgeU2m4Z2bQ/b6GRawTYeWGiE38IWhjQ2z1YTx5ZjFZEwd\\nQGa/zr1XCrZFw92qYGMHXhzDzAuq2DA04IeKi7aiFC3Z8YTGwf6e5v29ikdPFhz04HrpWXUtfQMq\\nrOi7MT29z3HTEkNANisGAlYuLXyKomA2H9OrSrwPtLamaTqm8wXj8QzfBfK8wBQFWZaTZQYpVXKn\\nxYhA0tqO0AY8AecCwaeFqCRlkHnrsbYDAiEKCBEhFUoHTBu5uVsyEHOeT57y7rs3qQYDXDtDGbEm\\n4StCzBDRkimHMqmDiaGjzCpCIEmlMs3rgyG9fh/ha/TlEVk7A+mJMkeIHBcEUQbIJVqGRB1T6dmz\\nMVArjdCSnnRkj5/x+hzeOgAdLIvQ0USHLDRu7dQTwkHUSAlC+hRmKF8907+5eL66vtYi+uJiwWZv\\ng61NjVvNOHr0COU8Zd4jtIm4rggsmz0MNEYAACAASURBVDmElry3SYdlGVqi0mRVBd2SbrlEKY03\\n8PGjF3SzFUNtGA0qeoOSTROpcsFov48KGZIc20mG/pyVT20YTdJ9urxkgcN1CwZlQXV4j97wLt96\\negbjM2wIFDEm6c6aWv9qkeQSRjPdZNbzK3mZSEU2rItnZE09kgVtWNCJJL9SQAwdMipaB21MeUCG\\nFOE80poD7diJDW/v9VkuLc8vJ2TAN25u8q3tIXHbMiHyfOm5GDtOxw4tGwajEVtVxUh7KtORZxYZ\\nOqQUGCLZWtweg0Cg0NGjQ8u1os9G5+jHiJfQdC1NaFkYjTcFKixxPuKaBk1BGT1FgtzjlMR1CjyU\\nOZhoMQJU6OgHWMqG6dkZq0mHVtCvQOVQrF1h+Ib48ohORvKNHRrRYxZLjpeSqzry5XLK5bhjOglM\\nx3OGhePaJgwzmJ+nEcEH7+yxXxWoesXLRxfc6e8R5ykx89YmnE5qPn1cs7tZ8ObhJpul4eT0GaMh\\nDHqbZF6xanKOpg0XiwkE2BzAtf0CmWsyu8A20FHhbKQfl/jQYDbh6Qt4ufRc39SJTJ9psnKH3F7y\\n4b2aeZ0xjTVGe779jZzdyiDDBSHzdAEqDds9jV+0jJdL6mXDftHnRI9pqg2MskQC/WrAfD6naVvq\\npma2WjG5mqcXrNEYUyT3kVJolaOUQKqU4OqDT5QopfG2JbhUKKPzOJ86jNY2eOvQRiJDpAsBISUi\\nWAo8b2xvo6bHXNuwvPfGNq49IycQu/W/01kiJDlP9As6kbb/BIfwFhEELREpLFt+RW96Qpy8RPox\\nueyISuBFhpIlMQiaCEF0eC+Ytx3GSZxI0T+LLKalZDdl86Tl93cFb++OkM7SScG4aYjRobVGOACP\\nkCk3bM1CT0U+/lfJYL/x+lqLKEKxWK4oRc5XX37B1WKGWEcUOAKtDGgRaHxD3tPEGFg2LY0P4GA1\\nm7HVOQab15j7mlZCXkaKZsnTTxd8PIeTCK4Ppg+DftKDDmTBqNxmNCiRZY8sK+i7SCYLVmicCmwz\\n5Z5vWbx8ydVVYH9vi9OLM6IZ0K3micEpNMR13AfpbejFuv2OSU0gSaFpSe60zs6UEDUImcAbPjrs\\nugBbl8L7IBXVTgmaVrKXl9ypJP90v+Rb+zmvH454ed4yr+eEds5urwY7IVeRa0ZTFRntQY9lqxmP\\na67OJzw7mXBewGgEg37BYDDCOEUeA53skDpNeYvgUcHR4thkzL+5XtE9mvG86DOvcnLbcts6fLOg\\nVtBqjSr6GAeFEHgTcb2c+byl37WU0ZE30NPw22+NuDPK8XHJsCqIoqCthgzLHq6INJnnSmpqlzO5\\njIznlmW7w9nDCy7HsGrgapEo/Wu1CrmGvhEUGj587z2u9Q3ff6OmdS39HPqxxnQaeQa7leQnnzxg\\nUcPDClYFFINtomt58fiYaZ4yqt54+z7TyTMWZy2zJagRXL8xYpA3aO8QweGkQ1vIPBAaJAXCQ6Hh\\n1sGIrecTvnz6gg+uH5LbBaUUjFdTMAUToB8tbduRCSha0EVLMMnvv1Eq6pCxaiMdgrJfsZrV3Nq6\\nxnCwZGozTCyIITKZTLDe4pynblvmswUAWZ4hhSIrc5QyGJ2sOAKV/l6BTEgmvE9Qbm8DqGTjbNsa\\nJQQyOJRIC8JXmmdIn3OrqtjOe5z99Ij7dyqG2mLcFOlmqNhDxR4x2rRN14EoCuqoEEZjokc4gUEk\\nBUpsMd2Swtl00shbnFZ0UhF8hhApzllmAm8kSnQIaZECSi9RUuKlwkpLFlcMFjN+7707ZCLQtSuC\\njvgOsqjxwaPVrxMS1vFiSbIck+rm1U7jH1A4fb1FVLiassw5On7Bl08f07oWLTVOgM41KM8qNkyW\\nEwZFQec8mTBUZYELkZOFYzaeM/Fg+gWqzPGzU37rmuJbGwV/+8LxR584frmExTIxlyKQ09DjBYOq\\nZBUb+mVB1izxtceaPrFd8t1Bxx/egg9v94lt4M//9IiNAlZRk+cDQlgRg1xXRY8IkbD+tgNrz3gU\\nv2JvBp8qqiNJgnwM+LDEewGuAr/ABWgDdNGgSdEgKkpyBZVb8E4v5/ffvcaOXuLcS64XBqWX5DuR\\nxrbMl0nYnjWOEdDYjp5UHGxnqJ2Spes4m3sup3A1bmhFw36/z85ggOn3UKahii194bEZeANF1/DP\\nd0f4Zcl/GC/pehU0Ld/c2uH2Rs7PX064oqDUgq2+Z//gFn/38CFnkxaaSEVa6B0Ar4/gtTjHLxeo\\n27cpCsXxvKMeXOPJ1QK1Mjy6OOfhwvF86qgXySwVvIOYHLcDYL+Ct0aw2yu4XgiGpeHcZ/zFlxfk\\nQjM/PmbYTbl92AcxoxAdWTmie2uf89ryvf/mFp/8/BkPXkIhQXRLOtFw496I588n9Abw6NEjKuu5\\nvg2374GXxVoj7MFHrE2z7xBAK5AuneZmEg4Ph3hT8uF7mh/+6ILLrsdg/wbx7AS7uuDnj2Hv9iF3\\n4jkIh0pqHhywMSzItWJ+seSqs3TRoDKFdQ1nF1cc3riGlYLWLyiLjLqu8cHTdZbZcsFy2eCsIyt6\\nGJ2htUHIVECVVmilUSr1v7kW9AYDrAssVg1F0UcIS9MscZ3FdV1ypkUQIuBs4okqqVBSIZuGa4db\\nxBYuGuDpgv7oSz56K6OvJViHFiHxDUP6DZ3KCULjXSRIg46v5H0B0uoxwQwEdBG8yJAmdY8RQ8w0\\nKte46GA+By+JLhDrjugDnda0JsPkGT0tcXlHU1syUyUd6Cp1KLooUL5OdSj+15btV5pvsX5W/6Hr\\nay2iOR3LyYLPPv0sgZmjwvqIWzVkeUGRaaz34DW9YojyktxkSC9olits0ATbMpu07BSHVPkA01pu\\nbOwR9Ip/enBA/x3Ny1XN5eSSycxyPu1o6pq4bGmbGlcoLi8WFDrBhq7t9rDzwJ0+bPbBZIGqKNgq\\nkgTJKUnrPZmICCl+HUQX0xHUS5/aYkAh8UKshy86kW+IeBFShpDwBKsILUQvQKYoh3lrsUApFWXn\\nuNuH//7+Hv/2ZsadkWe8XFH3B1wTluWsodAak5es6hoXFB6Bio6eByk9wte0AUoDNw4yDg56+Bau\\nFprlxQVPny9xBnoV7BSaoTHEXk4TW8oIvbDi+7e2uFSKP51ajsm48Jrv7WxzcXzJTjNlKBz7Q03Z\\nNrz70Wv8Pz/5AnYK9vb3uD/a5roP3JUtW8wxLDh5+pA/+wnE/RGfn0x59CLyzcOKx8cLxkDINT0M\\nu4OcfhHZ2ijY1oKblWariESxoLKSG34CdZ1O9AF+9vkXfLjpub8nMd0FwaRTf+NbfvF0wvO54Ae3\\n3uN3frDP9dO3+fynP0Q2De+8eQNEzsJNuLGtef2gz9B4pO+IoUP7BuXXVK61XNH5tL11HqSUOOHY\\nunFItpVTLxsONgq0hb/75Bk3fu9DTPTsyzl8tWA1tTSFYaVdglwMYXdU0LiChy/mGFExbyLPj4/Q\\nu4fEGHl26vjgzdep7YqT4xdk+4e0a1j3+dUFTeOI0ZMXfaSQGKNRJkegCD4kWMxaHUGMRBdZLOas\\nOod1ySoRg0erDJkL8sLgbYPtLNJCh014QynwwXMYaq4PruOUpLy1zdPZlOXRCkzgn72xjzRTvJ8h\\nvcQIjY8SS4qHIUSQJVF7oksyNTAECZ2SWClwoUQjyTGILIHEo5L4dkW3aujXERe6BA9fLYh+bVtW\\nGsqcZWhRMgdTpgiZhSVTfVRsUysf178nGrlOY1AqjbSCT2+PlPX7j3g7/+zLL7kaT5lPxomqbnLw\\nFpxguZhS7hVJaiAU3ob0tlAC511KohTgRUAVButryrzg/GLJZ18uKKLFb8y4tzPiXl9iBhk90ccF\\nlYpXWKHmjmXUzKzDhpq2W5KbgI4V9dWE4RCoRpTFiDsHBY+eNKzahmEmENYjov7VZilh30AEhXz1\\nRg0CJ+Sv9KRKyGTcIaK8QoRIDB2ua7A+zXJ8pug6SwmUpuDewPGdUcv/8OaAPc5xy0C1dY1V7MHq\\nCIoi6UBDH+MVk9UCUWVkukB1jsym70nk65alCeiwIo+BXs8QbyUDa+Pg4spxfuZ41jliBtVuwbCf\\nICG6XfFPdgvadsnf65zPl1f8H399wr//YIdvbPYoRWBaL9FFzuig4ubm+zyLkkcnE46fPWZooVOO\\nRizYvZFiVv7GCx4/nTJRfXrVkmW94N19wcZoyEavx24uGegWqRuUcWRWkNsa30zJKnC2gi5S5OBd\\nj6WasRrX/Lt398jjOUoIVlIRsh5dGBLyGePjOQ8fjemqJfVqwhaeu3dga0vy2ZOGxQruHlbs9heE\\nFqzoIYVE0yA04PKUMeQd63gqwtpskGeS3mZFbefEds7IG14/hJ9+0vDmdxXffP09wvJv+cH3Nzh+\\nPqMTAVPA3l7G7sBwdbLkaAFdfpPp6ZiLF1Pu3CmZ9OCEwHi55GI25fqNA3782c/5+eklt+/doWka\\nYhQoJVG6QAiV+AYy4esEaw6oENiuwbYR5xyNbXECGgRSZxAEfo1xDzjiOrDQti1CCcR6SwEgQmA/\\nNOyUJb98+pyfX15y5uB+von+yiJnp3zngxGqbGjqSO41SkGIK1Q0KAuBAhc9UXoUEREVXkAjIeoc\\naUE7ECFFucYMvKvxyxZmNa0vcS65qpxP7wbpIQ9pno93yEKiTB8bFa1QROUwLlKQIWWND4pX55z0\\nFQm0VImPIV5xLH/zVPRrLaJffvYFbdvig8cGj/eRwXBI35QUw5KmdTSxRSmB7xpEliNVoOksLQEt\\nLU4Lsp1tnAAfLDNbs2LEF59ecNFecGEgjmC0AVs9TZX12agGKB3ZzgQiy9nUAzK5i8ShlESqgH7t\\nAGMtWhlMWfLP/tl3WLQ/TGQcoTERfPTIyHoorUFkZApETNBRpQq8VLjoUhxxkIg2EGwHrWN+5Wka\\nsDgyoQktOBMJ3ZKhhlFVccsteIOGXT8nFy2CksXZFOmXXLYNvou0K49WkicvOxYNvL7dw7oFRkdC\\n1L8OeAspcz7zlpxIqx1Kp9FDpWHnoKQ53OZq6RnP5lxeLnj0AkwBu/205PidaxJx1vCdD97gsNfx\\n3e2CQzthdtXQRM3f//KEx399wqwPn16m2++3CnjtrR32NLhWYWWfIBvaJrJ/6w7BCZ6fLvj9b4z4\\n1n6BbBZIrih9i+nSiKJxC6RMIO/MgG2T7bQrUtz1Uhg2RhXz8YLTF2fcuTli5jSPTudMZjNiN0N3\\nsKXg4uERvW3I1Re88wZc34eJn+LslG99s6IygbhySJ0hhSEoSSAgfEiBcchkhW06HIl+71XHwe1b\\nLILDdpY4W1JFxe2dir84WvBHf/4Jr73579g8uEa7+oqtvserkuFoi0DgZ48vmImKZ7Xm7METNh28\\neb2P3howLfs8GFsmK8XRs0tu3zrkzrVtHrxouDgfJy+8iwhp2Bhu4oIjxP8PRQxLJvO0U6gXCfBD\\nZCvT9IcbSGuZLRqii3gXcK4jxETOUjKdPLXM0hjKe7QDieTtrSGxtfzi6JRHAqZGEyZL9ozil/OG\\n4E5478N9qjwBYRQWFVJOvZFFKoCFwhPprEVG8FJhpEgUJQR67XCzOKLt8HUD84689TxzGaYLjPKk\\nN47rrDJDhooRGcG1FnyHlBlCCSyBflYQrCPTv+4shEiLNiljSt6VoEVKnSD+Iz6Jbm5uobL0dnQx\\nEoRgOqlZdp48M0zmE0y5XhxUfTa0oW4WtMETlEAEj0Xyy5Mr3jzcISsVjYNqZPnoe3t8djLnp1/V\\n/PmztIgwODRT+kwxQDVMEo5hpik6GGQFXezIMss+kQ/68NGtIa045m+fTnl8DN/+Rk7oIllMiw1B\\nCv7KVYGUFcvxmM42yAh12yBj8r0rBa6BTKQWMHXvGmkcnSJxPX0aHdnGsTvos1+N2JlHhFsybwV1\\nlJhVzTCLyPGUq7KEZcd0EpmJji9nivMLyDdX3NxOBKUuCITPMEEQCRBseusGsEoQXCRn7a2PNTIe\\ns5MJdnfB7eYsrOF87jk9r1ktHIeH8D/91h66UqjNPZicoHB0IXI6sVzFbT5rLnnapBnf28C/vF9y\\nf+QxKjAXQ/7yq0uml0nv+fzFE17O4M4G3BtpRs0puEj7CupCKvJSQCOAPH12HZIkxSqwAVQ3pz/r\\n+MH37nArb/ji2QmfPYe5h70KXt+G+4Xm7QNF0ddsDRR5lOSZBNMw2tJ86y2FEtA1HdFCv5+lKF0N\\nrpMpwCxYXACHQIvEG7UCertbtIViNq0J8yVDm2yrW1sF1Y7li6Mp/9d//jF/8NvXUf3nZFtLKvqc\\nn804XimeigP+9uSCZeN4o4Rv7PXZkoKld2x5x4GHmSo5Pp7y3vvvcP3wkEWwNE0DMWJ9SLEZWiGc\\nxMaAFGqNJlQ439G2XQIbZ4bX7t7j/fv3ePD8iL/+8c+wTuBsgpAgE1tXaYV3Hi0UOito7AqtDcol\\nBu7hcMT5ZMKli6zKCqREyhXX793iWg5ffPGARXfK9755h4O+w7djsjUIJwqFRkJUtD4gVQZKEbxD\\n2IC2NTroZGLPNK6ucW2HbDx+4VESTn1gSyp2s4qwbPHCoXRG1wmMEkQhsF2ErkFliiyDNnTULpKZ\\nkpTQ4zGmoO0ipXwF1YlrmdN6ufQPSJ2+1iI6dw2xsTjXIpQiK0s2t3dZTmuOTs4p+jlVUdLLIlVu\\ncKsG7yOd88ycx8YMnORiteRwMGBbKQoNhYns748YvPkevN+x9+KMl4sll1PH+KLFN4G2WfFi5YgR\\nnHcMAMmCUZFTZQW9wiI3PYOeZFjkxKdTxg10cU1ybwDlkzdeCLwHu2xYTZrk8wdkpzBRkgVBrjKc\\nA6UNSicnkbMVsZ4Sioj1DiNSG+UjbI12yVBIIVjJnIUZoG3Ljl4LgAX41iKyHl9cLHlQT7gUQ9A1\\nvzzuuLW3gbRTBBFJiwypnX+FrAteETEQLVGkjXQUHh09JqSi6nCYzDM8GHH73jV8v6LpamZXJwzn\\nT/D+NiJmyKzH1J+TlYHtYHjNHHJxdMybd3f451uae6ZGtXP8QPPZ0wa5mfHu/Ttstc94xjblowt2\\nMkGJRRrFyjlsprFC01mH9Oll2QpQIqBIVtkEs04mhth0HOZwb5RRRYfY3ubDvYqsX7FhlmyEC7Rr\\nwAiaesl6V8W8AU1BsWzYkJ6mXeBiRW37jC+W+BjRGg53KqJNYnMjwMeCVjRECUYVbN+6y+nFOdI7\\nYt1g1i4slUvu7JY8vWj5yx9+znevDbi9dRNtH/D86SXn88jDK8VPL5e0mebuTsa39xWbzZIBIJxj\\ny+ZsC8OwV/KkWfH4+Qv2927w8OQZG4Mhi+WcsiwRpJdiki2p9GcQqAxsZ+m6hkHZ473332Fzc4Oq\\n6jGdjmm6FtsFjC7STFAGfEw2ykymzqt1HSFKEAGNp68No96Anz95zlIJoocKkN7x1eUxw7t34NZr\\nfPHiOfbjJ/zOB3vsDNICNcaWaDQIia1bpMqIKCwSYwpC16T9gHSYqmC1WpGbEj9pCAuLBFoPN/d3\\nGEbD6uKKMs/QRuFFWjzVbQs+ILBkApxdoiIUhUDrjMZBLtMzUa9WFD2NJ9k8pUmRMMArTO5vvL7W\\nIrpc1phMY8oKpGI6bRifP0ZjEE5Qyh5YGO3sYO2K5dKybFomrWMV0yZbxpbDwnBtZw9TLxARruaK\\nQENszzkIkT+8rijlCFtD05kUHdxNma7GLDvFuPHUsU2WvmC4vXODsyefowW4wqKEZrPMUHR0wdP4\\nhqEgIbMiRClTxIED4QVl2q1jMaxsQgk1EjAGiSbrGnoSWu/wMTLoCao8UihYaUFeFuiiYnw1YaQa\\nIg2l8SgfsHS0eYXbHTE4X3CqDB9P4CTTWC/Z0CXjpuZyHjnIc/LQogRp286rJRhY6enFgBSRqARB\\nK4ISmBCT4DiAkmkZ5uSMNmg++XxKqHbp5wd0/RUvjhuEayhwbPYEdw8kW8uGD3o3ucOKfqZ4zShs\\n0/KLU4ccOL7/2x+wd7jDo5/9iGLZcLNoWQ0GhFDjbcsMl1QOUf1KfqIykjQnpFOpEAq7hgFLoQnK\\nMJnX5HlKERCxYbNybGjHorlA4+jCgqjB5KB8GsEsOo3ThtlFTQ9FXKbCumKBGRQ4oTjY2WU+vmI+\\naxiY9Ey5DpAuSeqUJssyjr96gtkYsWEEoZfTzVoagGbG2wPBZASnFv74bx/xv/zu65TBoXZG/Jef\\nTZhFz8EQ3r9WsWcCVVjRK8C3YGSDETBZrihu5zRnx4wnZ7x7+y6DwZiuazFZjrAWH0EZjfAiuY1C\\nxBMRNuK8ZWs05PadW/R6BUVmOD0/4/nRc7QEmWWIAM5ZVNI+YeSvzSQxCoyRSO/Q3rK/tYFXntPx\\nDJVpSjyVBuk1H79Y8mDyBb/13ruYg2v8/OqI5udn/Kt3dzjoRRRLnFjgDWi53ugqQxMDLoDUOV5E\\nskHByre4GBGNpZm3SEeSCAoori4QJqe/oShHFdEIojC4JrIhNMurK6hXa6eVREZPuwrEwuDI1hZk\\njSkMnasxKVA0vUhiGoH9ZpJour7WIrq9sUsUcDKeMJmOaWrHv/mdf807d19nfHnFo6cPmKwmOK8Z\\nX8xZXM1pbKAh4gtDoQNd49javcHu9g71wylZNuTx6Yr8dMrZ0TM2N2CzgF4GW4OcUX+Ak5H9ytDr\\n5Yhsg1rn1DogVaBnQXcZ4s6HRLOiVDWlLPkX33ubJ4uP6YBosmR4l0lgH0RYY9wiMkhMTHO6iQfb\\n22DSLbDCo3JN5iLX0fSCw5qUX1T0FP28QwXIQ2RgMl60LZ30rOoJIwNb9RgZZvhCoXqayoxwJ1NW\\nEc40nIsePVNSGE03r3FBoIQhF44oPU5DQKGiQOEQQOVSEqhTEZf5FPkRwAdB9AUuKDARG1v+/icn\\nfPICDl9X7N3aZLJqyPuH/P4f/M8wecH4F38Gy3P2MsXZ1TEf6pqtQiDdEldW7H/nDdKYPmf14iGl\\nn5BLoGnYQ7PqGkqhybQg+kR/ksEnYUNMo5jMpYcnqICVKsmNYgRdMXM1ocy5bAJFqcnEjMnxlBfH\\n8NFHI3zULKyjLwpknuPqBcXmTcazCShFtJqqrxHSUpUdC9+AyHj89IzQea7tFMRC03UN3ifCj5cF\\nJlpCM2M2BTt2DDJN7iVdC0VPkK8a3htWvPZ73+WPPjnl7x485bt3S76zXZGJyD/5FxX5YIcd59hb\\nzZDLFee1Y6E1YSSZiB7/+ckpf3/l2Lp1l61Rn8vzc46LTQ739nn27ClaKbxzhK6jE2lzDqmV97aj\\ntZGtzRHbuxt09YqzZsnu9rtcXZyzahpiSOMSIQWmMCgtcQSi8+DBOofMdHIxRYf0NQe9gpkPTBrQ\\nlaSvwdkOiyaWPebG8Ge//AJlG7ZzzUKU+J9e8HtvbHB4UAELWreg1CUypG4jlwofC4IsUf0+ssqw\\nJ88xIVDPZ3jpiVmCoGul2TMgCo+uCjrV0kXBqq7BaRa1pQCGow1mU8eqaQgRlMiwHZxfnjPaB6Fy\\nbAdSFZhM0LQ1oQMpUhf4m4Drr66vtYiG2nG5WHB6OSYiuHv/bb754QdMX57S1RO6ZkqhPOcnT3Gr\\nmkIJdoYbiLIkq3pEe0WW3+H55ZRPnzzjXhbRWce8aXjvndfY0kd8+rjlP0zgKSBoKWgpNZS9VFyL\\n7JKiVyGUZtjTVNKhXc0g02xLx5sbioG85GV7ydWkYdpIfFWCnKWNPB6nEu07IpA+oKKi9Z5LbTjG\\nc+Ravjp1bGw3vLezQdXBrtMELdfWs+S5X1vD0V2HE3NWzZyuhVt3c8og0nyon+NCg7GQbe+j5oKe\\nnlDqjAyPW14yNDDKPZnqEDqdKIXSiSImAjKmn106n+I9JEid5nsxCkTIQCbykw2OHENVOm5sw7ff\\n2aQoINSS6fwlD/7T/47oxjB9QTeJPL+Ch6fwxs0Rb9/bZL4a80xU/P3ZHJMbTi+fs+1nXN/eJPdj\\nOhyKSKE8svZkChqbcs6lXpOvPAlnIgWCSPSe6B16PQ91wrFoYLJoOdyesX1oyGWP0SCQa0dsa7Rw\\nFAKWswUbVY/WeybnM2SELBqCtJBFCEtUcPQFdFoz9S11C95kzNZewdFuRVs3CBVwjSdHUQKPn0xw\\nuuDitOH91+FmCYdbOaK3w588fs6LyyWdgB/+5Ij3/+UdtuQpoq+IrOhpj+kFGiEJgxHF9Tf5q6en\\n/M3LCX81cbzwmtsXU25ev461lgfPn3Ht1k02RkOWx8fpBC4FXddAlCgDtgv44Lh57Tplr0ib9ujY\\n298lxsjFZIoQGh8sRq5nzUbRRk9jWwphyHWOxyOlJmDJZGDDKA76BY+vLmhZUxBjTutqrHcM+ppc\\nBLxXrEzG1HasHORFRfnZlO91OTduV+RqgXcNSmSEboHJChCKOlb0hvvUs1N0F3CzKa5uwUC9dgJm\\nRqNHBmMUIvNgHRmGECKLZkm9asl7QxbtimDA6ILQBLyTqCCpij4+LlgtVnz1eeT+G1CU+XqcAcGL\\ntajmH5Laf91k+8mcpm0otKJxHcbVmG7Bo5/+FbPzI4z2VBs5hZzQqxT3r91ka2uHo9MzTiYniJGi\\n1ho72OLJxZjtXsPhhmD+ErLMcf+t+2y9s83FsyWnM8upa1hcneLmltXMI2YNAkfGhJIMQ8dmIehn\\nkTs9+KgSfGMwotKBupnzxQXc7ASRIvXF68CuV5YxkKgokUbSoXnaNPzopGF4Z4dylAC8X02n3NQ5\\nMfgkPtaeqAtk6MiFQOuC8WrKQoy5ebjDt0Y7bF3b5NI4ou5o3Iqubei6hvmV5skCVFRsuCWbheTu\\nZuT7NyoONhJIWUqDEjkFEVRHUODJCVFjg0PEkAjzMhKER0ZJlN2v7ozcQk9v8PbNyN4NwVBN0Fdz\\nFk+WHG5CtbD4TGKFodo95GkrmJgLFv2K49UY6y1/+vkTfrKAN167zacPxtwxQLbBFmOcypirDhkg\\nz2Gg17PKAFGs45LRCHKi8kjhVzl6KQAAIABJREFUUCLDBEmQFl+WXMWChgUDDdsa7MJhtkeEAIOi\\nQa/jTXLSA1/Pztna3aa5kLx4dkZo4PZNgTQx7RA8qLUGeaMP1w5H+GBZOMftb7wHs0uKPPmv2ybp\\nm/OeYXPU8XTccO3+Dhs3KvJ+5GS64E/+yxM+PoVJH3o9wZNx5IcvNT/YMWRXM8rKswjwy7pmYTLc\\naMTTScsfH1kehU3ORhXjkxNGk5r7NyuKSrH051hbc/v2Tc7PT7HOobVIoyPb0i4iUhnu3r6T9ARS\\nImVG1wUUigdffsXHP/kJdW3TfFgLXFsjO4FNMbREadbB18mPHlyKXKkEbGeCv5y71OF4Qb1qiFKy\\nWRl6OiLbGutzFo2jNYpL5fnCRoZ6hHo4QUrB4U2FkIYYQ2rTRcPK5ZQ3D2D7kPr8lGEwdKsOE9dg\\nnyxRlardHagMwTfEpsY4IGo2pAHp2T7Yw7aO8eUlG8M+w15Bs4qslp7VsmVUypTDoASbO45qsAGy\\nTSMRIYjREeX6IQj/iBdL2aBE+QblOkYaZo8fstWN+YPfeo8HP1sRmglVadnYqtgqNO/e2+Pa9dv8\\nzacL/vLHz/jSH9Jai1CS2zcPuWFaxOwlzkMtNL5bkBeaf3V3k++YHl3ocN0WzkfOZiuuxlfUS8t8\\n3lI3SR5RiMCdGwfMjo9YTSJedlgTyHo9Im0S+3oPAaJU6OjWJ6VACOBjx9LlXBI5ahrynU3Gk4aV\\nWyI0zBbgdyIeRwkIpQhRYAIIH1llkucejlYt/+0P7nFLt/z1xSUPLhfUdcv8csLFEs487HUwGJXo\\nfMBGN+EHd/f49vVNBqohuBqhizQ5DylCRElSpgUiRSS8Ap16kFGgogbpiGLtrPKCQivq5YTNQcH4\\nsubpg5q8hTcPRmzuNDSxw3WaKDaZNQUxtnzw+jajbMnKwo9fLPnxOVyORvRcos/vAEpnOAs2Kzh3\\nHT2jqXGs1i27EoBQiJiMhkF4EA4hHJ0ocSJnGSuetxWfXaw4WsDvvA4HZUNoatpuCNJiXVr+ZBng\\nktJDBclseknbjrh20KfUK5SPyA6sBa01IebI6PC1Q+STBLkwGkyfViwI0hNkgV3rMbMi8lpPsT0K\\nFJsFrt/nTx6+4C8+mTC3YAvQRjO+cjQZ/PDhnO/mgroDsajJyooo+jxtBWLrNj8+63gYM0I2ZCBW\\n2H7ByekxZ9dvs7k7IlcwnYypen02Nzc4PT1L82MlUFagM81bb74DpEjkrm7Ics329janp6f89Gc/\\nYeZdSogF8JEiM4hMU/Q1eVngFi3KSrQ2WBxaK5T1bPYK+tJzsmhYRrC2BakYKE0vSpQN+Lxg4dJy\\nqkRgigGPm4ZmuWT7RsHzZw39HAa7A5xrKEm/j81g4+5dVo2CrE99eoRwENoEQin7BapXIAcVQmiC\\nj7R+SVCGYCPCe/rGEJ3jcnJJb1AxGJQsJjMml0uULDCElMOgIMs0t29vIHSKqZHr+ZH0Yu1J8P/g\\nYPRrLaKdcmxsl+wKw/6g4E41xD77ku98+AEfqPeR3SXD0lH4OYVvaK++YjNvOWzP2aphlffQuSaP\\nDTe2h2wHz+rsisCCL19c0V2NGS7hbgHvFNDLgSHpSJID1xSIikU01GWFxWFaRbcAf+stXD6nVzbk\\n0nBn/y73f/kxTTPH6ADi10xQPGghCCgaqWikZ+5TDInUPXZzQ7c09Ed9+v0FuXRIF5DWIfIMFz2l\\nAix0hWI+7DNZLvnj//hDKpdGEY9Y2wKBMzLqjT2+JycMyn1GynND1by/CXvhjDZ2uHKE8xqNJEqP\\nFx5JQCHTZl9HMhyRJomNnUZFRZQRK9NoQtHHO0teOmauQQe4efMtplPLWWFo3GMqGWnmNU9OlhxN\\nzri8irx7A27fgOfzgl+ewonImXQZx58/520p2LjZoyeX1BEulg2fPGl4/60hXW4JWULKFSLNQ51P\\nhCuhk6Nk1cDptOblrOaLC3jABWdixA5w++4h22ZMyDpQS0LskAosKXqk19PQOYRQeKuol5Z8owUZ\\nKSK4uaAwA7oQaKKj7RwqgLLpXSRNTnO15GLcUNdXHB+5dIq9dZ29oSYuTnn9ACbjI/63vzniP01g\\n0s8R2vP+rRvsDEd88suvsNZz1cGVyzEbFVdXC4ZuwZt33qbJt/nF8AYL75DDmmy2oGyWRA0nsuOr\\n51/y/zL3Xj2Spfmd3vO6Y8Knz6zMcl3Vtnp8c4Yz4g65ouhkFlhA4EqQtIAAAbrQrb6LPsIKu4K0\\nK2hJSKS0GtoZzgx7unvalq/KrHSRmWHOiWNep4uTzYWA1eiyGVd1WYjIeOM9///v9zzfmnyNrbU1\\nTi/Puby64ODmPmVZUtQNdlUjpWJjcxPvPVezGYguz5xmhscPH/Ho0cPusDVpp442ip7O6GU9PJ4K\\n2zWckEghSRJDVZeIpPtx62cpoW5YuIZKdLCZcS7oC0EeFHXImHvFFTWTTLGu+9RO8bReUAs4Dw0b\\nW5us5lNMv/PN4xsQEZ0PoD/gsyePuT8Ys1jV9G33HZNeY3zCcLJNJTXl0ykuFox3BxxfTKmryM5g\\nDdU4yrLAWocUgZNyBs11qqJtEESSrKuVmizHCE28XruGL7P1qpPUCfh/OdP+Xa+v9BD9H++dsj8Y\\nsZM6tJqBOukgkZ88JjpYCcury8ChH1CVmvKsInt1wi8Wnl/EAWo0IdnZJBlojvwCWTWUQpH3J0hr\\neW8/57NHFf/DS/jX9YSz8YDJRo+RNmwO9riVFUwyzWbqWPOWsWoYh8gg1QyDY7MR6LohCI/Tl3z/\\n3gGXiymCHs6AbhLarMVq6Nk50Q+w0uBk5CC0/OE4p7Xz7uMZW6SyND5yuiz5+e0Bb54USOPxImF+\\n7XVJZc1tWXKqYaHhUsLDFmb9hGgt2kbGqqXvj3ngPDr2cc4gU48dWFzSdo+urmIYXEdBEeB1hpAJ\\nUThq1dKowLDqlBcqzTABYhuJYUiJp4mWNNTkrUN60CLn8rhi2z3i7a2MWBb4bJfzszknhy3bQ7i1\\nk/FyUPN+Af/H6T6PVoKX9oqWhje2cuo28Oq05o9Xhg/O+sybB1yevER6UEVAmTHzkLCoG2YYrpyk\\ntIG28Syd4iJEzhvLrC4p65ogDDqt2RUzfus1zWbmWRlBm/XZ3n+N6ugSPzsnNC1jR1fLajvJ2VmI\\ntG37dwR+F8ArgxOWWlQEDa7qOtWCPqotyfISUR0i25R+8iZ6z+OffMZWc0Rf7fM0f5N/9mzBXz46\\n57SItD6hV8A3797i3vomiepzYc55eXHE118bkW9LRDpAbUVGWtOIGbPFjELC7b0HPJ0kzD0sY6Ry\\nPdaHWyxfXhFuNIzHI55bmL46p3r84jovGhgOhwwGQ5wLXM2mON+ZTBtvefH5IbPZDJKMKBWZ2iDr\\nB3QGWqQoBoi6YV1o2lWJbSJS92iFoJWK1NX0XeSm0QwujjhvJX2XcUNpho3sLhJKEukuCH0CRnUA\\n21mxANW9z2d1pN3cYuimODEjGkGdZ3g1Ybh+AC8f8lp5SDybMmot1BEnock1Zr0HeUt18ZAi7KBo\\n0XbFAE27ikyXBf3E4b0jFaAqiE2CUJ5We2wusY1A6U36bQHCEuMpiekO2fhlKxJDGwQqzfDx7/Hj\\nvLrxFgupmK9m2GWgbCquKpgXBXXtKBrPZYS5KzAWtj383oO77IhLvjVZ4/z2Hmcx4KOnr1O2xz3O\\n0xMy6bm4nDF67T7fXfNMioSth4c8PznEPYYSmPExMzph3Yd0c7gEWAM2Rh2h5s2tnH+wKbk3KFgo\\n+Gc/mnH/mwd8N2p0C41ukb4byAdynFYI3UWvHi4bxLjHONHo5RVu1XIsoUhSiis42DT0JGTWk8SW\\nke1GL7Ky9EXKoGdIemOa6AgXp8RgyYid9t5B4gz/8DXP5PW7/NlPPmGoIz0xpC5LZJbhhSHSkGIJ\\nskupC8z1drVb5qx8wAtBXS7QbcS46wqj0eRak0rIlcI5j/CWtx9ssGgCs2zE82nB+y9mzMqat+8d\\nUEUHPvDQCj5ctZwsz5nVLYWHMtXMTy7IWsuwhvnhjHQ5I2tgVHdtKDcv+GRe8DcVLB2UvrspcP00\\n5RS0RiAHY8Z5jiQw8Bk92/DD231+77V11jkn2RhC2xCnx+gQ8TrD+4RnCwcio7KOq3nLWdlyMwct\\ncyIVbRSYVBJDjfHdY70LXVnF+gapIDMjiioSVcH+vXXSjx7Bg13caIO/efKE9z88Ih3CD3dTHr5q\\nyMcp88sZ088esvjsIcMMJil88xvw9QdrbMtjRGMBw+qypRhu8eh0xgmOfDPQ1xmFV5iQUPkVKvOo\\noeWDJx9yVO1yVS6p6xrbdtvqtfU1dnZ2aZq6ozYZDVJwNZtxdnpGuSq7IL3SZFlGP8lRaSBe54ZC\\njDgNXnmWrUWlGrxFtI4s0fgVoDP0cMDF+RXgMf0E2c9oAljnOw8XYOdXKANZCk0ILJ2n1ilb/ZZQ\\nRsauZJKkyOsxQXtdqBA+UJyeoHzE2S5Drg0EJUhHI9LBBBcbhEk5u1wxzGF6UeN9YOfggEF/wvmr\\nZ9SLGcNegpE5atjNt4uqQjmPEWDCrAPIxOv6uLmGskWIMuJdS2JSEv2lyfb/+/WVHqL/4mdPUSbD\\nNZa6qSgjFFLR6hwRu05rm2jaFEb1nI3ckfZTDiaGULWcNlM2xiNUmnEr3+Ct9S3c0RnF9IirCgov\\nGYrImxtwd7SJbnJ8ccWy9Zy1ML+EF0t44eF41S2ItofdjbBB89mTin9vc0x/oCjSAbWaMbMaKTKw\\nEE13iCqvQGVdJVB4rEg5tlA7z9g13AoBKTManfHwbMY31wYcuLSL7kiomxabdUuPVGYMoietASVQ\\nSpABZR3Ju8QRPeDmZMA/+vYmj5dTtlmgCyhOSzb3t5nbmiANhE6IF5zH+grhG1SMOB1pTWBt+wCZ\\nCJYXr9CmIU81vnHXv7wSGRTWtkhDF5XyJSIZ8UUh+Ok850+PI0Eo/uIXh/SBTMHMCRYhJQhFoiV5\\n6nBZn3ktSDD0aPjGJnznwR6jAD4oUH2u2sBHh4c8KStqrYnCoAP0TEQJCyqQ6l6HKXOOft5nXMz4\\nxnqf39lepz89QvY9LFPCsiLoBpVrWu9YuTFfnJQc1hWHy4a2hBsD+NaDPr72pPkARxdGV9D9oloQ\\nXtM2Dpe562SDwnlLknsY1Wxsal40KX/0k5eUVxW//92Muxt9zq8avrWeMxqNaK3m+OICnUju7g7Z\\nHQIKrppjWC4IFqyDk1XKJ+c1zwvDvBfxs5LNyTqLswVORkRYgCrprSteHM94Opux0ctI0xQfPG++\\n+SYAZ6dnpFnOZDKhamqOj485OTnBNg6Vmk7wl2VkWcZAZXjV4H0goBBKUoeIJdCa7gfUNw2h9tft\\nEdVFgYZjjp88Q0vQGVwsp/TTAX1tiNZ3j7+dWJagoWk8UWiUzlDOMc49a5kg9QKVJBAs1nXBeNnU\\nhKqGtqUplxgFIe3oT9t7u+jxiOrqkFF/jd0bmxw+/YjMDFgb9pAEpqfPqaslG5MBTVlRtnOg05zQ\\njdU7C4B2CK9wrmscfqlLE6r7t1IQXIOPnhAc6a84x77SQ/RxPUAxwAEh3cIZQaE1tRDgA9JFnM4I\\nwpL0DKNdQ2WbTmdwdUF2+z6jnTHr4wn9JnIxXzLc2+dydk7t4IOHjxFXnt4I8q0JSW+D3tYBwaT0\\nTcLAtWxIwddMRtN4dGPpxYaqWCDxDL9RsyOXuDxB9Ca8vnVIrzghayagQbiMbsMkukZQaLoYiFFs\\n54ovjmbcvb9JajTOOoY28u4g5RtrGeOw5DIVLCZ9ys2MWkJWOyqfMRQF47YkSSJNhBsRRsOMXpZx\\nQzp2Q8UP3t7Au1MS4MG9A1RT0TYNF9OGRjpUmhFoyESLEpAmGQaDEhATyHVkuaiQtAgfSZKuHeQj\\n5ElKs7L4aMBkeF+TEvFtjYwpP/7lGT86g2Zrk0RrptNz5kmGbwO5SjBKdP7y6OkJx7oPXHmPExky\\nG7A/0dxrlryclhxOI4cVHHu4TDVtf4L1mgRNIhWtb0iFJ1GyA3YLQS4DoZ7x7S3Hr9/M2FYLvINK\\nDajPYLUQ9HqOkRHoRJA6z+mzgjrpFC8Hr2/w+t5NxvVTmlWDigrvu0VhKzxJpunHPu6yxV0v2ryE\\n1l8BGplscPh4ycuTlH/zs+foXsp/90//U9qXf0E5O0GUsOFg3c3o9wVv747Ba2gtLBsWdU3r4KI/\\n4WweeX4p+OW05uPlDHFwi5Mnx7y9e5Osl6MygyoFWojuZmYk2SCjsZos67KbN3d2SDPDclEwWZvg\\nfeD0/Izz6TmzqwUxBJJ+jgRMkjIcjjCmk+LFGKm9R0vdLVtsi48NeZJC6wjOIY2g9o4MjZaaQZJz\\nVkKmdbd4CpAGh689yvQoWovTGVVswPfwTkCEzDXo6BlsQ8gEqhXgI752KJ0Rifh6CXWNsqHTJseu\\nneRT0P0MlMbVkHrFxnjCjfe+j6LCr+bMzo8wviWXEMqC0IJRGhcktnVEIfBaEbzHxwyB6/YaEhI0\\n0keUCAg6wHM0sjNS/H2mODHexOsE21isjwS4vl47tIpIlWC9Z+9gn7d3csLVE4oQWO/12MszLu7c\\nAS1YNV3d8vR8jp3OcVqSjTSLyvH2axv87UcXfPjFjOdyhs1yDnZ22c77bOx5RkmPnrBs9w3DpLNv\\n3pysYViSUTNMM7xMyPtj/vP/8B/y/l/93yhXgAbTZjSmxqmGLKRkrcLZmpFyfH0oeGvQ56JacLxs\\n2brR57b1bOQ9ctmykA2rrR3qgx1OBinCW5JXM8axz2sHgnx9SJQpKhvwTZVwFAyNiuTzV3w90bwd\\nT2mTjPXBJk9PXqIouXF7h9TPUSajjl3ERQvQUULQXZAeS/AeEUFhSBQoFMJLpFAEGry1aClwvgN+\\ntE2nKMkEtKuSOsJgb5+tdUVfprysalpS0n5OaivGUuKFpGpaRm7JhvOs7azx0bxmWVf4wnP/1hrt\\nZIefPjrhUkDdz0h6A7COoYoMNAhXonRAOotxdGSrtmZ/lHD37gbf271AFFMaC4XIObsyvDorKU5b\\n3n1LoEcKaTxGLfjN74BJ+iSDnLp1mPoQ60pEcAjXNY9qC1WE0Wid8nKBxHZdbw++s02jsgFHC8Nf\\nf3zBn5859gT80+/epz/7nHp1hU40WxuavKdB2o6UMp/hWoX1GUWrWdYZHsVPLwW/PKr5YGo5o5t/\\n7kfJaGvCeDwkZoZeP2V+1YXEtZEEb+knAzb6Q/K0ZdAfkmYdUCNNM+qqZlXVHB4dUdfNNVleoZUi\\ny/v08x5K6U40FyO1d1i625m1DXhLTyqSaDCpYb66wkpAChSwkWTklaNXQoYmTxN6JkUGj8MRQkMU\\n0MZI7RUmZvgALQ1JdGgB4x7IWBAS23XUo+5GWQagJjYzYgsmdKUVMoGMgcvj54RWsLqcU7hApWvW\\nJ2MGuebq8hJ7HbDXaZc1TlJw0ZHpDG+6W/aibJACRtkYylO0ACMESZAQPAbTlWeExAZP0Jqok195\\njH3l3fnkWlOqJAQhoW2QwiG0QmnFvft3GI+HlMtXHC2W3Nvos6k8ozBHBM38quJqseT0+ITDDz/k\\nn/zG95G1IpSSiyvoP9jld//gHTZfnvO/ffaIp1cVTz57yjlw+X73xUzoQu4ZsJ3D/gZgFAe7Qzb8\\njDfXoTU1f/zLK+oATTqAogAd8KprQhADichIrCOVkbGK4CzrecKNnQ3EKGH+8oSTRUH/9i6z4Ygz\\nW5EMevzy8ozXDm7hxpE//9e/IEthVnZdiWyQ8WxW88uim+W+A/xH3x1x07d42WfQy3n9YIvlRUmW\\nNujaEm0kUZIWT0vER4+KmkjXXtIIJAlROny7QgmPiIrowagUKZprEkOnMFEmo2lq0jSll2wS9AWF\\ng/XVAkq4bTQN4OKKXAvy4BF+xWRQcUN53h7B3o0NNj5/wWnleetggBoOGXvD196c8PmiQbeR2MzI\\nifSjJ5aQmg6a3M+6zGuawsH2hNf3N9gdZ8jzU2QGr5bw7KLi8UVFVcNr+zAc9rGrinygqGzL5qYm\\nlDWyaNDeg4J5iPRMVx/1OJRWUMByOsO5FtmDagGDTLO3vUUTK754NuPJfMYHX4Dsw689yLiRvISr\\nBRujHEIPpMHXC66qBqEz2qWjKhxns5LCd4+KF6/gL43llIyXWcY5EYtC+oaqKXg91hxM1hlqw6lM\\nCGkPJzw61mQRfF0z2VnHaIM2CW3TkA9GzGYzjl6dUNUVUmqSLEGrFJNo0qQjGYUvY2Ou84QppQFB\\n3dQoYsdsaCPLqsIHQSM6nYZuWjbTCbqsuber+TU74NOLKU0cEBKJVhCbikSYTtCoILRzvOg4CMEM\\nqOoZr+8OGNopRQKDJCfUkeAUidQEW6FFjW9BxBRvPZ5Imgd60ndz6mAorxa0acPx+ZS1zQEbNw84\\nS4eUbY11jpAWjNYyFI4Uga0t0kkwCSEKWjsnDd2hrmREyNCRuoyA6JEioqVAGoXJer/yHPtKD9Fo\\nBIEanMUpjZeGqA2JytFZSjoedvKp1YKhTlg7uEMrSrSdMWgjZ0/OeHlyzi+evuRkecm69vT7Ofdv\\n3+LR9ByftRwtS7427PHvH2R868brXDae6mKGvJjxy6bHvJwxreHlHFoHrYEnBUxj4N88nfGfvaX4\\n4UFGk0jOLRxZzVJNwJ0QswVRdDOUiCSiUSIjtg1egNIS4yEvA9NyTra5x3Nm/OzFCe/8wW/x+sGY\\nw8WCvbV1ytNjJr0+W3dHrIqEk9MpSQam36e8qrk5grCEX7+dsyEl1JbV1SVxpdgdjRmFFNHOkAEQ\\nGc5fd/kkRJHgpEDSYWqcV0hvqFVFaq7ZiV6iZEbwDh8adAomCFwQSJUik5w2KK5KWJQ147HhnbU9\\noq5YTE9IdKRwDTUZidTcHDh++911ts0cv6zw9Qt+/2bCRSupkpSnakQVCvb3Nji+ekxq4fYa7A9z\\nDJZeqshMZC2TpAkELWiTlKgVvaQkMwGfwPMX8PwUzotupn13D+5sp2z0NNYKfGuIQvLqsiZTKcJ6\\netrgq5aQa+rGkfQUiIC3viNa1QESTYFjfDtjK9/l8mjKRV2wdBBb+E9+Y8D9GwP2x6DtafcHXVXY\\nVWTVemqZMm0ir85qFledGzAfwde+vcmof5uf/vVzLs5qZgrm1RKZGGTo5ui1gE8++YT90YSeNOgk\\nJ2SB1fyELKzIZI5NJGtra8znc9aGfZbLktPTU05OTqjbmizNiSGiVUqSpsjrOqjBIISgbR3GdTyC\\n4DxO0aHkhOgIUB4iCidT6tYxFo7EWyZ9zbwpqJzj99/Y5PSvp5xhaUxOrGsmQLSgEFjhqXzsfO4m\\nI7qOEXB/ZwOKApGBDwFfe3SSoIRgWSxIRUf6r9oGpTVCejKpyAQ0OJwKJKkGXMdDbS1mfYf9W29w\\nfn7B2Ch8fYWLl8Qwh1iTq8ggZEy8pHIVre84G0oBAoKBECIx1dhrpmr0sbtZ//9QSL7am2hjGRiJ\\nVpKgNa03tB5G/TGDzTWclngRmAxHbE8G5Fiq+Utie8WNHvzirz7i6GJKmaZkox1qW/Cnf/U+9777\\nbXqDXVa65NPnJ1SHz9ioYWNHMNy5zdrBPmp/l4napZEVJZbaaULdYotzLouSC5sjas8bowrhSmSq\\nyICkcUgfQXc+JUKH03MIfKwJwuJcoI6K4LoPfbma4gY5Hx4+47GD9/7wDxi8sU8rCh6//z5b4zGh\\nWfH05JjJ7X0uH1dYpig0rRD0J5rhcJ23d7f51iRj3Z6hrcNIjWtWqFySyAbfNAhpkCIgJWRREgI4\\nLB4D2O4DF5qoM4TKaEUNOLRKibGDJQs9pA4lPnrK2lNVK9qmZVXCQmrub2ZkriJ/OUW6kvdur7O3\\nOeDZ6RkvypaqqXmwCdvhHFl4ooLoW9ZoAcW/fP+CJ2mNKEs2BvDuwYQ3NjL2jGViPN53S0UZHMQa\\n6Oj0berxaU4kUFUNiJwwhDdee5e1qwUHWz3K0xe08wtOThqkgfXNPsrnHB/XLOuGt94cEFyLRBFr\\nutrgdcb3S0uBkBnee+5/7RtMry745efPGMZO+7GXGfLJACkFopkSC0flr8edNZR2wMnUMb2c0TZg\\nDGSjXVxsuHXHMF4f8/5nn/PT44JVtsFFU6IzQ9bU5B6yJiGxfVbLFTEIxpM+8uwMnXZ8umgNKtf0\\n14ZUVUWSJOR5zvH5lOn5lKZtULJ7/3SWIpT40gBGjJG2tQjhcC7gHSA8tm6I2iC1wuNxdU2mMrK8\\nz3y+INUZmXBkscJkcL6K/HQK/82dGd++M+KPni0ImQClKWuHVAarNTPhiVjy1rFra/oR/vGDHQY5\\nXfEhyXCLmlSn1NbilwXBRaLqEi9IiN6jREQ6R7tc0rQRpQ0ycegC6gi1bfj4s49BacajIU2qyHNB\\nng0hH0J9hTs6BbtCoulrR55DXJ/gbKQqaxrnOydaGjo5pLqGzVg6qtSveH213XkviUaizIDKWlCK\\n8SBjZ2uTVXTkiWRzPGR90EPIhLNlTRYyrBWMe7Buci4BjOBSRlR/nTO74tNpiVEDvJC4WDHZ2+Dl\\np0f86GeRs/4zyuEJ490J9yeW0ShlLRdMpGXSg15vjNwbY3RKTziyZoqRhqS3y3/5O2/y4x//LbI4\\nI6ZA081xbNAYKUFbHCu0TlkVHo+h0UBf89kXBcHAt97ZZNs4Vu05K51wfjVnc7hGfzBmFQKPzy5Y\\nuAQHaA+9CIMs4+LyEnP3FufFFZkuaULB9HPYujFAGs/qssb3YTTJqIIlFRrtA+q6shelREaDROJV\\nQisjhCFedL3xqo34ylPVjlW7xPkSXCddI3Zqke2JYtMMGK8P+Py04NdublItKnYmc3JZsLOX8kBm\\nBG3pU5NajxcaqVLQJSbVFLVj5qCWA+zIoEJNWUfGvYS+WBFdp9qNnu4Ekhqi64Le3qNcizIGG1ok\\nNUl/xGBT46SjnD5kLevV8IfVAAAgAElEQVRxthxwNC/Y29e0IUId2cwytK6JscQRUVFhMPi6QmWK\\n6ARlC7PSsZtGjo4q5u3H6J5i6yBjd113LSrnoZhD4ygV1KVg0aQcVo5P557HJ1OWc/jN+33e2DeA\\nZrp0XJ4scfu3+dFPXvJXz2qmQtNaQes13tXsNPBGAl+/u8NjpfjpyZSX0wsGG0N6vUjWWMhG4Ax5\\nntEb5dSrupPTVS+4ms9obIsS5jrVodGm628qIZGqu0156xASlFS0AggRrSRadpojIRV51iMVkrqy\\nndxOebA1afBkScpJWfE58KNPT3jtvQeMjz/mcFETdEbtOw5DicPJBLcKTJzjW8AfflPwD97KsKGi\\nuvcNstkhra/x0XVfJG1QIUOEiG2bjqKkunugEYCNGCQqDbQtmCYlyIYqAW0LZC1Qqykr6RADgSBB\\nS0OqIVaAAu8tKrkuIa3tU11ccLGYk6mOfuWMJNFd1slfc3+F/tXH5Fd6iN7Z2+L89IRKB5TKGA1z\\ntrY2SVOJsJF+T3NrY4yRiifHU6wXnD18yuujircT+NqaoVpEjlLo9TK80KTjTV6WCxZPPmMoFDcm\\nOacXNW/+4HvkFbz8+DGfHk2ZHp6wyQk5nUhtPYVJBrtD2BxnZEaTqIr9vudGXxBMzatFQlOVRDQ+\\ndgPpFtmlC+ho35IO4ZYoaLwn0MFF7u/DWq+PmfRI1zI+iSvmS8mNO2+wcXATW0y5sbZOxRXPX74k\\n6I6InwnDSGt+elbw7I9/xrs5/Bc/2KRXAqQEF3FVy/rWJienU/TmOj4WJLoj5RP1tWzL0XpH2Thq\\nW7Kiwc0usVgsDhXByIQk7TEaDTHJiJ5SGOWIzQodG3AtLtYIBPO0YGgc27uCVHUissy0ZKKzmmqt\\naX2CSnJc7DbcVjg29jb5npB88Lzk2LaYtuX8pGZxUzIeBaQBKSJBi25DKoEgiKuIiR5ta6AiMYCA\\nnV5L2ivIl1OcKvCtYvP+u50zy57AakbbrBj2Eva3Ms4vZihARUEbIyOjcY3DxY5N2gK6B19/d408\\nzdA9BSwIYcHcQltrsqaHnHk+qivKM7hcwSMUn9iUs3nN793qc+/mGrFeQKpZvppy8/YBHz254G9e\\n1VxkfVozJC+m7AKDLPK93YzfujPhxp0Jf3R8yafUvHjxnNfffJ1ECkZGo7RGjjKSTOHqCmsD8/mS\\nxlvapiU4j9QGOhMIznq0UYQYO76DVCSpJkkM3juy1BBcTW4GSCmpXez0HMUMa33HVtCGNkSEd/QV\\n3cY+5hzs3+I8ueT8xSl7d9/i5WfPqJxG6kDiGrIaJtTcnMDv3j3gD+70eKt3SRIuEAf3ufI51eWy\\n0+UIj5eKJO0SHm3bIIImyg5mLiO42iNEQKcpSaLIDPheSt93aR2amlUDJk+QHsw8IusGQwN5Diia\\nBAIBaSMpCVSB4qrBNeCEJ9USIzUiRsAhlEDKiPg79/m/+/WVHqK//1u/xj//X/4lFsNkY53bNw+I\\n0lI0c9Y2+uxv7ZAgefnqjDIqfvn5Q+Lnj/iNtzKq3YzvDeccmxWXcsBF6PrRL48+Z3eY8o9++3t8\\n+td/Q12VLENKWVa8vjHi1m+8xquLPoviiifnJcWV5+wSXjTwQQPZHHqHNQ2dHfSHA/jv/4OELHH8\\n8eMZf3EC3/nWGrqa46TCiU7FgIhEr4guBRVQmUQJR54YcinJyCA21LJlcOc2a7sT7KdXDDY9j148\\nZ5IEXF2zu32L8UbF0XFJogxNNAx7PQQnKGDrYIJtMpoTGGwOGeiW/fUhTw4veXQE6U6GkTXLxQq/\\nkjiraduCGGsCAikTkjxijGNnY4DQKcpotOp4NSF4bKi6dXRXJybEqms+eUA6TF8x0UOKakE2TvDB\\nXZtoOpSeEgpvPVqDDwU6OnoDhfceIwu+d3vArbXI9MSjtcZbx3ovIkUXsQoOHJE2OLJM45pIXydd\\nd7O1YDzBXpexUiifPUG1JXmiWfUnhNEYITzNGfjSUtctadahAEcD8BXUtaPJHEsLIw2mBwd7CW/2\\nRiTCABKaOXFZgBfMWsGpN5zXMD9ZoGbQ34XetuZsLlHpLfzLM97Ia37vmzeRq3MOo+TV6YrSw2I+\\n42/PZpwPJpQhRdnANxPHO28fsJPBTlgykZe0lyt20z67KZwcndDeep3N0Q6zi2esj4fUjaO1NcJ7\\nqqalqFad7sN3LnmlVYcM0dcK0QhS/Nse+GQ0YXtrC+89dV3T1jUyOuomUK2Kru5aV+ho8V7gTcdY\\n0AGMg5HJmBmBMSlfqJJmUaOuLlHpANksyVzLfgrfuQE/uJvw7Vt36QXP1lCgY4roD3AnJzTTAhMD\\niVJd9AhJG2OnDPcCKTSCSN14eqY7SFWSoBKNa2t6OVgZyFaQCChjxmWE54c1O+Mue5tEOrFeEyAz\\nOBsRWqNiQFhJ057jFkvu7O4gJZyfnRKk62wb1mNUF82S6u+xY2lZLsBosnzM7v4timqF9QXp2LC+\\nvk4qE2bnc6oG3n/0iJOzM/bThIcXNUcHO7yTnvLRIPKwkXgnqes5643lYlnxSfw53/j6A6azJUdH\\nR9jPPuSArnv+5k1Nsn6DN157D8GKSw9HIadoJX5xwXKx5MQNKOqGA3lMphqCL1FrYy6YU9rOceCU\\n625dQHSd3rbCYyT4pEUYAIcRmlRJWgF+fcRlb8xlbxcXS9YmG/Rly+444/jlK16dnpIO+7Ra4kzO\\nsqkZipZ1utnrwfY2sbrk3vaYQwUHe+tQXhFtwqKy/OKDl9za9OSmxvTGqFSzZdYY6AhJhpMpJlak\\nYU4IHdU+RNeBinEIHEY4hFKI6z8PKUWnb0bhpcElit7GhNXzkkoaXGjJTHfzEUqjVNYF5GPTLSgi\\n4D3KgWpqlKm5O4C39gCTEFVO2874Eh4VO6Y1idbUC4eSCRdlwCY95kHjYsSHhjbZwJcQGk/0GnsN\\no6ge/wRhCw4mhvUsA+MIKmJxrG2NuJgukEKTDxzrgwHDXgppDaIhNhXBQruqaW1B4eF8Fjm7hPNF\\ny8zCysDtd15nfyw6v1N9xtNfPuKdNfjW6xs8+eQzLhx8eAWnBWxtZITWcWRSWhHx5Sm3cs0//naf\\nraTGXUxJPCQTsNaz25swtpYXxYp50bC7f8DDp5/TX1/DV7A8scSmoQwtMcaOsqQgSoGge5RXSuFj\\nxAiFlGC0ufYtecpVQVEUFHWFJmKrmlVRs6wt2WjMaDzClkuCqMkUlE3Xf01Sjc4NL56+5LMXl1S9\\nGmMj/bZgDNxO4duvpfzGW5t8Y02z7wqMP4bBCGs9J43FTWes+4Zd6ygS1VGzInghWC0qmtWKxGh8\\nDN1oQOlr2AsE6WmCIM8zQl0jKdC9AS4MuFjBLBTcvHfARGs++fQZh5egx4q+jkwM9FKJEJFMKYbK\\nkFCTSUVdFQjVaWCECjS2JUkEPnRVpeD+Hnfn//n/+n8x3tpm99ZrlKsWLQQ6ydjd2qSfZkiraFae\\nn7//KdNVBV6TDLd42Z7ycTvgP1anvL6W8aMnSxLXx+uUeQUPvv0d5k8f8q/+5GeMbm9gs4zgJDdz\\nz8nLkr/6c0c1egE3LDf2RmzvrLHf14yGgvFahpGCWg1xXrBtBUn7EjXc5Yd79zk++jF929XnYhSo\\naxK8iA6ZetgAl1yTt1U3exEKWgU1Gj9IsUGgVY/KW85PnpOz5GkR8MpwVixZ29rnYG8Dd1WyNenz\\nxt6Eo6cnrICBWfHG3oDhxTOytTuotT7zk+covYGLGmcFb9+5RypOaXXECUfW1mjfYl2CVT1EtBhX\\nUwtPEJooNC6CENf2UvlluFgQo0BKA9ahEoWJClzDqLdOKSRp7DThslUkJAQ8ti26Cl8AwrVh4Utx\\nogTXABGCheBadJ6QorrZWxRYCwsLLihkyFi1UGQDHs0cp15zviyIXvKkuqBZOILvaqJVDVvAb99V\\n3NaexEa8iCjVIl3EL+HC1fQ3MjYHE5ScdWWCqkYsS6ToDr15bSjnjsUCnlbw0yO4MdG8tzlmy5b8\\n789r/uQnD9k1sLO2SfVixg8P4N5aynm55M9ewo879CgH+xOeLLsGmVaGbUq+dm/Ae/cO2BPPiVcX\\n3W3/ulfuZ56sqdmRQz6RCR8+/oIf/uZ76ByeHx8y3L7NrK7pB48PoIRB6IALESUVWZahtb7msLpu\\nE28t4VqgVywWaCMxSYLrpbT1irYo0U5ggNg6KiJ1UTBIE0JrSaNABEFAovuaojklKsdkpRlGxzs5\\nvHcz4ftvbrPeg7WeZiwVJl2DqqQ5ucAmBhMCqQDnHE0Edb3MESQoocB5hOvijZZAzHLKqkbQgZil\\nidgYaGtPrBy6htCb8JPHMy7rgt967x764iVl5ZGbm/zZ0ZQiwlaWsFUX3Oh+T+lr2OonbIqSvJdg\\n6xUhRtK0E9YZnRKuFSvd0vFXv77am2jIeG33LjJKhHIkWjGeDFkbTJienpFKy88++IiT4wv0YEgv\\nywnCMTUT3i97/G4Ot8Y5D3qWZ+cnXKkMxICfv7xgVATeefcBD8+OeHoy42s3JiQi45vf/w4bi5Y/\\n+egRs8+OcZ8dMwAONNwZws0xbE8g7UOeQN1PuDAQgkXqBd+/MUEWU+w6SN/NP310SBp0X5P0FV7H\\n7oC45haUOKTuduMxWpLWkrUeGwMej9eS9Z0DBpN9ToqfMc4SBpnlpJiRMyHzFbs5PJ5Br69RWY3O\\nYHdvk7OjzwhtpPUVUjqsh8vLC9bzBUG3f2d8FRGkblHRAvKaMakRMiEIRZeUhSAsUQQEHiM1IXS+\\n8ogDKTDBY9qGtClx1qHaSE9en44hggxda9Jx7fxJSKREyEhtA03oqoN4mCcK6z1tYcm1xlYVDlha\\nwaKFsnQYZZBJnz/98QknQKG6GXOiYNXr3uPWZyyFRmQ125uad+5t8mZqSUTL+fyKfg5rqaI3zumI\\n3IrWz6BVzIolwQvCFSzn8Lx0nPkaIfsUdc6zaPjMnzHc3KESNUlZs7M75m9m8OdLx8Zsyn/19h3e\\nGtfEesZ8uEXx2ibTp4doWVBfziBqNjPDrit5O295K4U4fc48r8hkQjCSVQxoe20ZrRuSWiMTw7Qu\\neDk94t2vvc3/9K/+Tz55dsUwzRlkCmfbTuGiEvBdf14bg1GGEEMHsRbdZx1DBBFZ25iQaUPEc1RV\\nLJcrhAsMdEKqNEJrrHX0kj65EcyKGq1TkAnoFkNLr3bseXinDz948w6/fnPAvpgxkiW9fga9ActF\\nzat5g/AR5VKG0TFwBYHuQnFlBD0f+TLGriIkSEIEFzzOaK7KirNjz1s3NInKaJxDpBlV3bKadYmY\\nn396yJNLeOtWH3txQq9qkRKSzHPj3oQ/eTTjWeW5JTXjieZuFmhmLY9P55wWcPtWw7DXZZEnkxHO\\nrtDmGpYnVedRDn+PH+fvv/MAjWegIg0VO3t7JHlCURToNOFPf/QXvDi9IBtPQKSkWiESw8IL3r+0\\nzDYEwyTyvd2UDw4vOFeeWd7j59NXrNctsy8ec//uHb6/vUtx+Kybq37xjNv3b/FPfvsBcrHg7OQJ\\nRydzji7hL6+gvupy5g0dLe9NWv7b39GM45Lj1Sv+xV8e8l//sIu4xKiIokXQxZ0iXQvEuYC1HcxD\\nC7rbmhd44fFa01hHtai6wFGSsL6zjlMDkv4maTLkanrK3o0NTp6d4ZUm1Rkqdv8npzaw8oJsCNPj\\nY5gVHWUJR5Z4svEmHx+e8923hqQEJBGUIQqFUB05XgiFUwbhwIuAFwEZPToqVIwE6ZE4Qlt0NwRP\\nN4CkKxYnISKWC6zz1K1GJymJciC7kL5QCuEDTUwIQtDYQHSRlbM0QRBDi6sDy3GfyqcsXUZVK84u\\nHJfzgqsFrMpuybOeFox7BWs7sJ3lFLOKQSroZwmp7jbAVvW5rGtEdLx7Q9OvDxFGkGQZd+5sIPu6\\nm/G2Dpxidb7ECsvlYsii9Zye1awuuzhLf29Af3uXk0bxi/NTnl3OGExGWGv5oi7IYsK0imzrhFdJ\\nRLcdeOwXVzVnheNzt+DjcoHQksY5KjSb+YC8PueHd/p8b2NM0ZQ8m7UMA4zyBBtbgpTYXo6KJYk2\\niPMlg+E6IQSePjnkd9/7Nd66+Tq/eHyE9I6iKGkxJAY0ApMYJN0sOrh/+6WXKmKtIzjL1vYWD95+\\nk9lsxsNHj6hnDcaoLj7mHOAZ9EaYLMPXUNYFFoha0cpufp3NLvmDXdh+d8LrWxv0jGA9tYyTHpic\\n9uqMi1fHmCRDo4khYjS0zQoVQCd0sUCtqES3cNQxYL0lIAgBWusI/ZRklPDWek6vbGgXM2Q/o1hY\\nTJLTz+B/flizKODt/TE3qJBFS5VBEaBHxQ8mA05z+KDylD3D5v6Y7+9qwrLm3Pap6in9nkaIirWt\\nEVI7YpAIowjt9d97jDjb/Mpz7Cs9RI0CRUNbLNm7uYXJHWezOQrNy6NXPD0/JmR9XAxMMkMv0/jQ\\nMvOeWeM4av4f5t7kx7I0Pe/7fcOZ7rlTTBkRmZFjzV3VrK5iD+ym2CQlk4ZEWAKshSFtrI0N/z82\\n4JXXXsgQDcM2YEim0RObQxe7uqqrKiszK+fImO6NO535m7w4QVIbtZbFQMQyAoGIe9/zfe/zPL8n\\ncOe25fWtmHf34OG8Y5Om1MFQa1DjKfMXFyTVnHeuD9mLBOXpc8rVcyIBR1PFbx3tYL/5W3ymd3jo\\nh1zUjuOV46tmyMWyYTz7c9KBYiI3NHnEaQJznaO6gla2/VVVXl1ZLUSmv/6GqO8kDxZy08NsTaIx\\n+ZC5cTw/u+SnP/8b7hworvlAlgzIoyk3tg5Yuo4Tt6KONfdfnrLDHlUHK2Bex3STHbCviGaX0MBg\\n0PeBexPY2j/g8aNT5l3M0XgX5SGQ0oqAFCWEBouiURGj0CGERUmP8hB52QM+6KO3wYFU/bXRASb0\\nbgOEoN4ULHxAqhwhwIsVaQL1EqzxtFbRhparmxjBaaRMsF1DUbXEkebpsxmPTuHYwontWapKDxmN\\nhuzdnHIjV4wjQ3n6mA9fv8uo7Yh3SibaoYVhu2lxcaD0BWpLkeYpJA3DbY2IIiDpY8H1CicEtgr4\\ntcU0lrMZ3J+vKYtenJruXCOJBAbH55894jRNeeqgTWBUlxTHa7o0ZWVA+o6xbzgcGEYSHp085Scz\\nKBKodEOsOqYe1kIw9zlDC+/dmvA7N+AoVKzzXZ4UBZfnBfvTgqGALlHEu/vsvHGbtjRkZ2vmL58Q\\ndo646ApmJ0vef/sbCJ2zLtYUizP8lXFeKEGsk16Rtxbr+h2ekoKehujZu7bHe9/4BtPpmKdPn9KU\\nJRObYiNNYUtkpJFBUpsOGRI629eSWxRWS2KrkMGy6wIfvv4ak+BIBi8g32NVCU5LTbFZkGlLlip0\\n1zBUYAM0HYQEGidQREhryJ3lMgECDER/jcb2DoKgFCGKSKKU0AaCsSQk1KWnxZNu5cwv+hTf927u\\ncsOUbBcd5HCZTqilY2tT8GbT8EcHOc+flVilmY41I5bUZUES1wy3tji4dchi9gSZaMqmQGeSxhni\\nJEKG3jjs/yGj8KRdo0cD9g5eI9+aUjQGKWC5XPPZp09IxJiOmHyYMUjhxs6QBw8esm41IZ3wPzbw\\nP/iUb4Y1//xWzifrkosmxoZ90m7JTV/x/QPBW1sH/OyTU37qCxaTA4ZRzp1xzBcvvuD85Tl6r+H2\\nG/DO1PLPpeVoWjOwn+F3TnFvWBoBZus2Rz7leyNIinMWk0Mye4I2fW1zR4OREGKLahXDLqUJBh9D\\nlQiM0NSDlLZYsv78VwQ74OzzC5qFJJkM2I83HIQZ060RD+63rJuEycFdPnv4gvmF40Xd/7NG+pKx\\ndVTnXV+BnMNGgEMzxDJyFQfDXUIXo4QhEecIGbCkIDSdM8jIEqkO5eqepynBSU0ZHFLovpPJgAqW\\nYPrdpdKK9oq52QUoy5aohmnaoFclSvUd704ICjtgrUacq5QLkXBcO15tOk42JbNlS6gC3//mPebL\\nU2LWvLMFf5LDfuIYjQqitCAWp6SuP8lXdwQvzx+yWkOc54jM4EPHcQ6724FcOaLUk45SrvqB+2Nl\\n3UAX03RDjtsRDwrFV6uGRxczvBYMg+dwmnMkJWPleDGf87MLOB5PWIYMozZEsec8jDgNCbXt/bkp\\nIJyCDl7FQz6tDSqDgRRoE4AhRlhqWnANbZNyaXb4eN3x3NbE2wn1dMikfsFaSRQNeXCkm2ekkzc5\\nj/f4uH7IE2PxGoSVfPHoCf/kh+9ztnJsGk+29RYUJzSmJZIx1ntULGk6269VbNc3BCDZHeXcPbxG\\nHklsWyJ82xP/I4/1MVGSkkYRiRBYZ2ibGmc7gnMkUYwwmjwEtK9wuqQJBWPdYcqcdjVHBktuLUMh\\nepKZguH2NXwJTdvgVIcPLcIHZPBYYlopiLuAsoLWWuLM0EWOpdd4mzNtErbZ0NYlnYdwFRrwccaf\\nb1L+3SPFvbtbyMkORZOShJcMAoyC5qRL+PG8I9m+ztwKBpxwK0442N6lShSN0ChyhmmD1QUmSfBS\\nMJCKYB1WZ3RBEQuBlhbv/gEDSNJYsbW1xXg8JdjAcn5JWXd88ukXoDQ4GA2HSBkRRTHHZxdcLpak\\noy02m0s+WyueHzS8O244Gg754VHO4qszVAR/+N4RelFQFjXpQca/+N1d3l0E/uJlwZOTU07P4IMP\\n30Ztaj5//IzPn3zCr4A3d+D2NcXO4S5b0yMOR7CtLTo4rg81f/J7u9jzGQNX464GkJC9zcnTX+G9\\n9HjToKJ+F9l2oIc5TRu4drDPRgjevHmD/1I0PH7yjLwKJBuL32ogV9SDiNoYdq9f49WrE4yvAHh/\\nDB9OHO7ynBqFlY7EQtpBmvZFdFIKoqijrjYIPaG2KVoqFFHvX5WOoAKVq/FB9y9M61HBEjsQ1vUI\\nfXpxzF2pvo0RBBlR1Z5127Ko4LQRtHZIkoyoupZlXdG2fRLli69OOSth3vQ/zgGDDD7c1uxuO9Sr\\nB9yQ8OH3jpgOAtqX5Cpgi5rIemIFIYLCWdYNxIOUnSygREmcwe5IIydX+8AgQSVYKyibQNcpfGOo\\nipqTVcujouWT2ZxnG5i3/a3h+n5KGsd8sVjwyxJeOxozPbgNfo5bt+QSnGvIBDhb9R5S4yhlykor\\n2iAYCwt1jbYOLwUbIoI0CNOfwGtiWuERquD/e1JwegLv76fw8BmTCM49XO7nHE222eGSrgi8eD7n\\nZ5XjrxeWhYHhsmBnMuVyvuT+41ck+ZTdHVisG1ynaUxDZzpQst8peXD277lDo3HOwfXrOOew1pLE\\nGf4qxqi1wgUwrSFYg0gSlBSovkcG4/7+BBa8QyqFlALnLNZ1NN6DsEgJbQAvFU71VeBdWZIwohMS\\n5T0xvQCrvEUHC/3n37bV0FnwQiOCpjMNdqBoXIS7qqypXEAPoGtr/MVLfnhtyF89nvFczNgZxtxM\\nY25mClVpPpqVfHTcoS6eElvIPHzr7dc5uLmP2VRsT49YXhS05SXLdcne4Q2kq3FCgVAEmfZOFhFw\\nVcGV0fo/+fG1DtE8jRikCUmS8eTJE5qq4tnLE8rGIHRKovuuaCEiNlWNqRry0ZSyLNFSchbd4f99\\n+BW//SHsaMsfXMtJFyWv3YPr1xUfb2C+sT3tfzPj3Uhx+60jXt2Z8vEXL/mzn93n9p0pv/vB+8jQ\\ncPb8Sx6+gB/PHYsvzthR8N/94RHfnxaM2iU2PmZPjTgzgPe9kV74/kTI33oqwSuJzByd7SEakYdg\\nHLFKePLgEeXdm7RuQz6xbFZrnnzximp3SaYFoxs36eKYXz74gve/8RZpHujmM35/H/7N9w6Znj1C\\nWzCkVy2MfZrDXL3eHQ2jrZhg1rSuReARvn/CRgFU8DjXEgX6pSP0VSeevytpQ2nQEaVUXNpA5RRS\\npJRFS20crUpoYs8vl/DLFy2zZc2sbpmteqD1GwcjTjb9i0sBHxzmfPD6HVLRgLlkb6yIXdMP7qih\\nKi2daChCAzXIoKjwtARM1Penx6llsp2S5YJhFiOI8KrsOWmNwBjLpRHMOsflqubyrGFewUsHjyx8\\nvgKXQpxrBgSKoFiWhjJKeSUafnG8ZnvdMZKaJNHQlKQRJJEgzUfUcsSTVzMWzmFsS5z0gyMTnjhA\\n5RVNLP5ufYHXCJkS0RKwXKbwFx6enBjeNfBf3O6FwtPnJZtDwZuThFu7U05Ewk8uS+bTA+yqplws\\n2E01Ih7x+YNjfvCDD4mTDPPsIW0libWgc6FXvDtHCB5CIAhJNki5fv06ECibkq2ww+5kjDGegKCs\\najqvEDoiHwwZZCld29E5Q49PlT2HxvVP1Z7ypa74o2D/I3eGlRqdT1GZQjWrXhMYjPDEyNYg6LUD\\n26NGURaE1Bj6BJW3oIVGW0Vdl9RZggoKbIIIGqt6fKAw8M1dzSgesnWg+d/+asnPm477u1PSp0uO\\n9gc8WUku8ilSWXZswTf24P3bUwgGl+YslgsGrsFHOTKBZJRRb2q8lwwGGa1X6EGGcB5blPxnovNf\\nc+/81pgsy3j54hW2c6wWa548fomPBqRJH1GMr5BUtgsYC955rOtIVMwyi/m0gP/nOfyzN4bciC3/\\n9DokHpr5GZMk4ZV1FG1gqjS2s+jwnEMi7n4w5qDMefLkhAd/uWT3WsKbb32Ld78z4rSrOd90LB49\\nRiyW7A17HyVdwIgWK6CIBiRujQeCkGAV0jm072eTkRpiS9n1JCLRNuQ6UDUZj57O+cuPn/HyvGa9\\n0qRqyTveM3r1nNa0uNWKRCXYzjERlm/dmfAvXj9iunhM1vY+Sk9DHKBxYJMUgyLO6WEPOmV5CZvF\\nimkMUdziDEiVQRdQAQYRPTHXWSyKOmiK1mJIaGXMWRGQ1w44d5ZaRyAS1DSmrDvmyw1Eks2NlKIM\\n2IMpSZKx6xrqixN+cX7K4Z0D7l0/4Lpv+WYK4ulnJBW89cGEruuoQ1/HXG/WeNe7AQL9Q79UPc4+\\nSRSjNGKYxuhhDAlcf9MAACAASURBVLHDoWiDxNqIstWoWmGXjovZirMNrCpQEehYYJMcE01YFA0b\\ntSSOst5j6CxnnaEioraWdR5TWTirDAep4Hqeoum5DbOiZHM+Z8UlM2K0hqNgeT+DpYO10cxVgpIR\\naWgwLhCUwnvNsGnJXEuewXGAC6EpHBztDbG3jtjZqbn86hnLk4IyT1mMd3G7h4j6hFwaZk1D13k2\\nRcG1/Sld67g4X/KN925zdv6ItYY4S3BVhzehX8s4gQ+C4WDA7VvXkQq6pmUwyEAKVss188sFZW36\\nYsY8Jx5kxPHVflX012ZrLUr+rVfSAleoSnqxWkrwKgbboQwo4fCdRWKJ6wZrNSITOBnhfc/bNQJa\\nlZCIQExHKzSt60+nqYPEtzQ2pmthuW4YjhJia2mdI6iEVARy1ZEpizenfGM04R+9nfOnLx3PjWak\\nt9gcz0liTS5TvFNMI/jht97kaChpihrjNGkHcVuw6qZ0Q8W8NkgvGGdDamMRWUSWpPiixBtD5+1v\\nnGNfb9tnHGOMwZheFXvw5Vc4A2oQ42wgjkTf9mgc3nnapqGpNsSRxuIhqlmohJ88a3n7uuOd1LCX\\nw9kFhGRIlmlwK6qmph7n2GiFigOpN6jG88EQ3n9/wrxyfP6s4G9+9DFqCHfefI3vXt/j1j/+Dsnp\\n5xTLMyZjQCu0HLFuWwqpiA14aftTh/HErq/5JQhKC0iNlA4RArEALSzLZcFXvzjl8RJm2S6OhON6\\nztau4G4heeduzLvXt3nw2UtWx0vEouXWMCK7PCMJCtNzHpDu7x+QPeJOYDw9nSfJyJOMYRLTFase\\n5hRB5wJaDQgup1xV1K5l2QQ29ILXQuZckFCnOethilM51UBwud7QWI/pHFVlGA73sM6xPUm59e5d\\nvnp5wsnsgjfffhO7P8Iu9lFth5uO6NpLim7GwRaMcnDdiss1VCEmKEgUYCzC902cMoV4WxElMcNk\\nTC/3d2CW+FJjQs6iESybmuWqZDMPmLq/zW5vw94u4GFtcz4/bpj5EecrAzJCGkfjayoEpXNsvCC4\\nBkMf+fQIZo2j6DZYbyltf2oKQIPCqcCW7fhX39rin23DA73D//3pOfMLDy6Q2JZMCwwRqbPc05Zb\\nqUKPpvzFsqQTglY7/vK84Kx6xJ984w4ffOdtbmmLyzJ+9GqB2rrB1m7O9WpBOco5LQ3L2rInPNvT\\nMcfHL9nezTjcu8F6PUNKBUHgfEPXBaxzDGLN/v4+SZJSlSustZR1jVqt+NGPf8bZbEmSpGRRBGlM\\nGqcMBinCWTrT4q0jS3r8ITiETAiuw4SADwqQKMB620NbBAgR07YWUzboAEkU9R5Q7xG2FySdgFZc\\n9b1IcN7ilCJ4hwoB7QOx0sQ6olz2/5eIljjWWAeh7dNJPoEqg616xYd7U76cVTy0KVL1Ee49b8lG\\njpfzju+9+waHw5ihXXPy6CXLleWNmzs8e1HwdGlID0dsScGNnQm2LvvW1SwFF5D1hsTU2PAPeIgm\\n2ZD5csN0e5ePPvoV66JFpyMGyQAVS6QP1OUagqLabLBtSxzFeCFxKCK/JHUtH3zjGokyNL5hMEyJ\\nusDZyiLSlFjAplgjdibsjKdcbpbUSGoC122JHioOhzG3d24wfzPi6ctTXnz2FZ/+1Ve8nMLuDswO\\nM3ZDTuIld47usr/q2J2O0Ytjug5wFk0vgtgQkAEGskeM/W0pvU8FUkTskvJHd4bsvpzx48WSwlrS\\nDg6zm4xHI6TsGOiKG+OURE85bTTnLwu6iaSTDqdjgu/6RJ9NGbkG2Vq61JIpwe5kn2EUWNcXBLnF\\nTEd0dYPZFHjfULeBrstAbjPXhsH2LhuVsggRZ0Fx0sFl4SmMwctVX4Am4dvf+ZDl8pL14pIyinDO\\n8Vtv3ONw/xrJIBAnNbaZsy5KNpuScZLwZDHDpB4Rp5wNplzfgksNIa2JHESdxTrIhzAZxsRJ1ENd\\nIwsi4F1LZ3reZ9sq2jowv5xzft4b062H6ZZmeniAMQ2xsqQRLMuWxxcFTxt4JTvWokOkgs4ZvHE4\\nkWCUJks0BE/TtgQDrQs0eFr63gujLXVwCKWQUqHblh3gzmTEqyfP+WSxYLmEsdCslMIBwgaGpuGd\\nUcp7ecqOgHNjuIbgpGlwccwmVnzaWeq/esQvUrizBSsDL63gu0fvcv36Acuioq4km5mjagpmy0sO\\nb17DOvjywWPee/cN9vcFr47PyMIVQNvWZGnOKM/oTMflZUsSS+IkQgjNx7/6FafnC+I0Rycpkerz\\n6jpJ8M5ibQ8BUjrQOYsPHikUsRTgA53zODQBhTOg06Yn/gOtFNRO9pXTobdWRaYCY4m8IQn92kkK\\nizQQO0i9JVO9t9k7qEKPPExFxKIouJSSaDtByxZtLZHMcNEQE8OFLbhmYTdq+f29BPlwyf7RkLuv\\nT8jdmiza5ittuDfOGasGu5oxrJYcv7T8arNk7+aUzx8seX085JvbN9F+jZMJjY8Zx1sQKkxXI5Uh\\n/c+Mya+X4iQ0w3zM2fk5Xz56jI9zJqMReIeyoudaqoSy3OBMiaK3+/WKjWa/WfBHd8b88Z2MUbFk\\nUziSiWY4SimbhqaN0UmfQnndWep5SQ6QxJiRIg4a4RsSaUnEJZFy7NxSvHc9ZbZq+OQF/MVLqGY1\\nd++k/PC9O0xczP71u5ycz9gVKUIItAYpA860GBPw3iKFQicRnffUwSFF3L9oveGNgeXe61PeDx1P\\njte8KmDHNehlyWqdEo8Sbh1NefrFDCFSLtqCpcqIqEi8JdJXNcA2JtYNmr4cz7qIdlWzs6Mo2pa/\\nPm35qxeGEEdsDydESSBk2zTZlE0JLwDZpjQAgwE+0szrNdZDMhwwyDO0CgzShL1xxkCPuX19l2W5\\nIslSirI/tbx26wa3jw44vtxQtJJyXSNdy/ZAg6n56/tfcnqiuZZq3hkp3stTjpThQLZkgwSVR/Q+\\nKN+LRKXDecXaNGxMzMXKcHrRUq96uv7OAHYniiTtT6xClFwUC0I6pFBT7lfwH17WPHCwliuKBNxV\\nGEAKiHR/2glt2ff30K9WAwpNRBQn/SnJWoZ50menq5ZBgHd2Uz56vuLsKSyUwqdXIph1dCImx3JD\\nOd6YaHRnOfeWpUj6OhkCwWisClgcpwieN4EfnfRvxP3xlMcv17y7v8VgOGYUFdzc3uXRacWL2Yzr\\n1YqDrT0UgvXScHh4g7OTGZ0pcNaSJBFZkiAIzOdztqcjpIzwQfLo0Rcs1wVxlhEnMWmWMswyrAfv\\n+uyl6QymM/SFlxIZRXjr+0ip7W8yzdXDy18FOAz9bjjg0dr3Z1QBQXrazQzlLdL2bAUtuBLq+u9F\\n9CE1Z8FFgs5LUIFh4hjlCV/NW9RkylB26BAgNRQ2YBtBJKGy0Nma27nm8P0xxBFbOymbomO9nPP6\\n1pC9eMPuIKa5mJEEy5t3h/zpLwqEW/LW99/hMEkQZUeSRzQDSZRs0biI2DeUAZIoIR1MfuMc+3p7\\n551ksbrkRz/5KaWFOM3wSIaJwnYN1oExhqYu8TikVH3MzTm0N/zRluZfvX+d6dl9Ig9GaDYrx84w\\ncGfioa56iriFV2XEW8mQrCnobI2eDFknQ1QQjKRhEAW8rdmUYAVMpkO+u7/LHUZ89uKck+Mzfrr6\\nBV9NckzrWBWW37nuuLa9zXSYYdoN3lriBLTXbAxc1tBFMSJYVN1wfVtiuxXSXRn5Ndy9oVl0Q4oo\\nkGUTvLxGEzqMP2fvWsr62FJazVcnK67fjhi0Ftv0zMuchpmAbhxThxyvKp4/eci62eXHTy1/sznh\\nuIPRZMyhHHFtukcl4LLxyEHGWoxxEdSmYSjhcDLknd0paRQRgkMkEUJJnLG0m5pcpVSrmoEecHG+\\nJNSGl8+P+8KyuK9RqY3Hdg1ZJLG7E9rOY6+9TjS4zfPTczabOU/Oz/n2rW3SO0NGkURXC1LncJ1j\\nWQVqP6JY1hTzhstFw9pCspsyPhwy1h27yhPZDkWH6jpy378RL5YFHz0r+VkZ+EzB5UBTGodE4Z0n\\nSoc46dA+YJsNqQdHig0QlCcWEc4auq5D4PpDcWvJI0hsXxD4O9/5A37+2X2eTSKM3kKYFcauIIvQ\\n1jJwjp1MsyoLzqzi3MJlKFkaIE57nieeDFiKiG6gemU8aCLgdLlgejZh5+AWl/On1LZGXjoCms8+\\ne8jgGymDKKNcVjx6/IAXL15gXCCOU3a29tiUG4p1zXA4RCBxTvDll49ouoY4yUDHpIMBWvf6fQ8n\\nUT2ODtCRQngJwRGpiNqWWGeJJHRBUBqH8R4l6FtRZb/Hjm1H5K7EI9nv6ukrlGjjjBKFlxorYiop\\ncDLh0q6hNmTOMxEJKjRErgICg3GKKeHRrODeXs5OWuODJcYiK0HiBS0BCSQocukwXUO7aFkVBu9h\\nnBbsZhrRNLg2IDVI6fjX/+Yf8etNww/eex9VV3RnTyBL8MITkpRIJHTzBcFpumSInxz2h6//xMfX\\nOkQv52s++dUn1I1BJ0OIYoSSaEKv3PlA3RW01hArRec1CYrUFNydxPy3724zWL5ACjBkEG3z7Pkx\\n2WHHYe65JktemyZcHrdcbBR38oQ0rdm7doMLG/Pr1ZKxMtzLEwaZQHQtmICyEVlQJGbDJGp47SjC\\nHh2xaC0//+yUT8+g1fDaFrx9+w2a9YL1ekkaAqmOQKY8Ol3y58/hxhtTwqzg7REMtqEWff1v5WHQ\\nN6MQ+4pBbbn4tOWXf/YrPt+0tBG8/eYtxkPLtIFcpISuwfs+oBmsJhMFr7Ip/+HZkns3cg6n/XXq\\nf/nrGfeBsL/L/v4Oh0c32LSBR9bjaZnsZ4jIEa0cWRZx6+YRkzyFtuFoewtnWsq2Y9k0GCGwNuCq\\nmq7s8A7OZnOsDAy0o2o7rAMhNkwmI6piTaDDB8+LV8ckgzHD4QThBdPxkNH+Dp29x78vlvzkF5/z\\ng9dv804cMVmdY9YVzy5bzkpDVznGDoYB9qdw7fZNNpsNwpZ0rgcLm6uWxhD6utvB1i6nizkPS7hI\\nE0ov++4rL1BB0tUOLwJog9YO7IjQ9ApzKzo6GrQOPf1f9PvQ2EJu+13bOFf88v59ji82JOkY4Qyd\\nVKAyYluzY1oOM42x8IyY47pj4RSFExjVOyfCf2Q5dLFBtaBlijUNZVSy8TWXywVH1w/YPdzitJiz\\nfZBzctpSrQ3PHp9wtL/PR/f/mlI5kjgmSpN+BbBcYk3LdGtCrBNs8Dx9/LR/f8Up6L4qWar+lwgh\\n4JxHC0EkBFZJnAuAJ3ioqgIdSZSQWB+oCdQWQpTgXE3oBD5WCCmRviNqevyri0BE0MkhRUg5Dwkn\\nned0Yzhbrnm1alhbwUsCcQ2vS/ggb/j29ZS9TOKFQ0eW7bHi8StLcA3iaMrQzMl9Dxt3JiJEDUFl\\nNEbhhMTgKZYO7xJk7EmHkvFY4NuWphKEkJBu7zC9sc31x89QmxWb8gI9jbCxIHiN1KBCQ10sUEZj\\n4pz07lu/cY59rUN0uVxxenaBlwIZaZJByvZkiFlcUpQlRsTUTYOKIlofCMQI03HNNvz3v/cBR7Of\\nszZQqjGdnPLrZyuKaAufjdiEc44iy7e3JQOXclHO6UzGWfAc2wEfXSh+/WTGb+3C7lQzDZp0PGVT\\nFwziDNd5bDMna3u13wRIkwl/+P3X+YO9A0wU8Vp7wnL+ksvzU0aDFCkibOfx3hOEZl5ZfvDmOxj1\\ngNcmgkw0fZ+6BB+n2DaGWGDrFdkgJSkt66dLcDGDg21mJ0tSLDsxHAx6HFjQV/Bc01cjOGc52p3w\\n2/fusPjiU6698waiXbB98DaHdw7JRMWyqljrGBdJImfBVBxdPyTbH9A5i440ITi8iik7cCFiVha8\\nOp+zKQtCj3oii3OasmY0ndI5SyxKomxAWbfEWpFpOLp3AxEJqs5RtoZMp7i6plnPaeqGuQWxtc/g\\n2msM777OL+fHfPTrX3ErNKRFRxogUorJKGOYaraGKUmwPL//EOnhcE8T674bx6gYn0TMEVzmioeF\\n5YsyUESAiAiNhQAKhxYBoT1GOa48DLjQCxUDCS5W1ABdBwZ8orCxYNhZfve1u+xGA3768Eu+ePKU\\nG1nKwXKFVpbNVTpwN4f9SYLMhnx6UfKwNKzQNMFhpQKpEKJDEfBX1CJLYIIh6jqcgsaCzDKapsG2\\nFXv7YybLEfFmRaY1tgm8Op5x/PIlSkE8yhgMhuzv7xEnEXES/d2QLDYbTk9ndJ1FRRFaRwil+kZN\\n2yGjGBcCQvi/u1obY7Bd3zVljMUHh+gcOgWlNSY4Cgs21lgDSZ5TSCiUJoq2CDLQBs9FsLxY1Lxa\\nlhyvCp6UcGZh7aACbKJoREQzHZPQ0Vz1aiWvCj48GpJFDd5bRolmb0vw+MJShJI3968xciWRF3gR\\nIbwhdA4vEtatYd12eCNIdMqyqFl2cHi0iyxKIlIaGTHav07x4iG3Mg92hRAVIk1Yd540G6KFRTQr\\nTLVAhYTBzhF6OP2Nc+xrHaLHz1+wqRt0NkTqiEEa94mlde8zK1yD81cUaqHRUpG0Nf/1t+9yr3tF\\naCCJYlpyHs8rnuuIO3/8T5lFHSef/Qzp1tyyG757EFHGKRsR+LMvAz+9f5/HgztsD3YYl3OciFFS\\nIhGMRkOoLXXb0EpYNvSd6glIXxMVz5mmMzQFroZxkIzHCicCbdlAiFHOkWO5NYSpqWlcQy6GdK0l\\nSvten6ht8M6ihCKT4KQhCMP1fTBzQwiCy5MNSaxR0jLKLZHshRhje/tPF2CrKfj94ZTuy/sIPeI0\\nHvPuH73PyOc8ffwYGTxiOMSIQCRqbu1vcftot+8yNwZhFc4LXFBUnefBi2dcXs5xzpLEGlzH7vaE\\nw8N9qqri7KxAyCWuqehkinMFbb0hTmJWRUNVXWClQsQDkjinXs+p1r0Hdmd/G7EpmZcXrOoFVk/Z\\nH2e027exOHbHJW+ZmjdjzyCJWEnBq01Be7EkKXvTtN7rT9vDDMqQ0YgBn54u+OSi4FWAVwiCHuAa\\nc2VTgkJ5RD8ika4PECAUaeQRwZEIqLVE+NBbwQJ0xgMBB3TO8eD0BcelxeeQ+YabAXY1bO/D3t4O\\nSRpRqJhP1oaZKzmz4GJABFRweA8hxHjn8FisCBDHtKH7e8qV01y8WqJ2cp69eMGde3cY6JRMRAyT\\nlKJtaTAgYTLO2RruMBoPWC4X7Kht0jQljmNmF3Mu5jO6rs+ZC61xQCR61qgPfZTRGUGWpnS2I5IJ\\nbduSpinWGCKlaDuJjiXOB4Kw1AHWrYVpyngwZRYUr4Ln89LwdGk5vYSX65oT51hcsSM61zvp6N11\\nIHpQd2NatPWIRHFRVrwgZmo1k1clb13LkbJDB9gapSx9zaPThhfLhpu7O2zlEVo0CJdB3eC6FQ3Q\\nmh5o0pqaWQtFA/4Xz/j2/pCJa9DDCJXFlLOK4fUtXLdA2QLdCXxIQKVE7QqWZyhhKbMJ07uvc/H8\\nOXu/YY59rUP05PScKEpBJ2itEd4ymy2oqxaRZLRV0zcw4og9yLbi/YMRP7g5YevkYxoEyg1YLjY8\\nn3WUr7/Bjy7OSKZjfvtbf8wvP/4Z567jBhZpDWawgx0FNpsWZwqeVIKRASW3kFKwLgrqukFWFdZ2\\niDQl353SbQqqukDHnhGWnbJj4KGWoC1YC0a0CC1QwWO7ilzCoIW8KZC2xXcalSiqtkEGGEVcUZcs\\nrQE6w95kyMDVfO+NnK3D2/z444esW0s3CphsQN30OWsdC9rOEAXFWHtsWbCSQ46HRzxJJzxZnjKv\\nLIMkx4SUojOkWeDde3fYGyY4JWiDI81GJFHM2fklr07OqKoGKfsajEgrpoMMb+FgOibXgdnijOXl\\nC6zzBCmI1SEuGNq2oS1XaATF3GK1Jo0rIrmmrmsMhjiNqZVGes8khRA6troN8/MZJhtQ5WO0mvA3\\nX37MzrUh5yfHrDeghnBjf8p2OsUbj9PQ2A0XxYLjouVVveJpDWcipkxGeKGIrCfYJSUtRgu0kD0I\\nht4WFrzqM+G+wF6FFKxOCEKglEI7x1hIOuuwFn58/zkKaBKFco7Daynfv3MNWoGvV5yeznm6hCcW\\nHls4B1AxxjukoicoOUsI4K+wMCJ00EKTJIRM0BYNGZpq2aL2D3h+uubuvYSdZMI0mlKmgbJrUcqR\\nDnJknJFlGcvlkiTRhBCIk5jLxSVnFxcURYOOY8TfYg0FKB2hJFjTYJwnGkQ473DGYU2BuqrBGI3G\\nrBcrkjju6zQAmUR0bWDVWCojOLtc8lF+jf/r0zkfFTCLoHQ5pRxiUo1NBUIkRNZCWIOtwcEggcg7\\ncm+Il0tc0jc4GCTX9nYR81OaoiDOVA+VNjV7eYw7UDxdNHz0cs4w6XF2JlIMkoimsIwUDIHJJGdV\\nW9ZOIAYD5hdr7EQhBorxVkLTLfBKgEyp/YpcC4QRpFGKbx2+KPDLBVIKTJ7DYEh1cv4b59jXOkTX\\nRYnKc7Tus7t1XdCta1SSYn2vCgvlEEEgm4ptUfFf/db7DBYvGXmYyQnVouX4pKbennKuYd41/OTf\\n/phfXT/in3znXap7b/DRg/uMbODiqzlPT1quKXjTzfg/qyECePhowbEpKZqKQSq5OVFkoe/iXs2W\\n+GDJYo11fVZNpoDvk0jySlD2UmGtA29RCdiyB7GjUqIkxdKQpP0f3Jh+8R5fdTQpDcI54rbiu7fh\\n3ltHfPXqJa+NLZ8dt8yW8Gze8s1JSmQaujaQZhHCes7iCc/ya5yNDznRKcdtSxVJBuNtbKNoioKD\\nvZxvvf8WKYpqU9P6QDTOqeeW46cvefLqeS8odB2uqhkmKVmW0NiKzXrNfLlkazzh5OSMKB2xbDYQ\\naXTVYkTAO4mpBeMsw2IgSJrSYKWjrCtcJCl8Q912ZCom1ZKuNbioIQwyVCJp25YTPGHrkH+7mvPb\\n0wm/fQjXCNROc2HgtPScLpasmoJFA2vb72x9OsAFQeIEwXlCrACLoyfkW+tRVhOQaCEJiehPR0qD\\nlKRBor0gEgGfeBSQWceWi0FLrBYYPLkKbFvHRMAvPn/O54Vg1gQKoAaaqy+Ie7x1UD2iDnqzKRaH\\nRAqJQKNDh201bafQaUqwfZne6VnOaJiwLjum023S5IxER6RpQlAdSnomwwlVvUZKQZ4P8R6quuX0\\n5IKiKMmHUzpjsMGi0GilCcFiDVzd7aiqGq81Wig8kt3dXYZ5ztOnT7HWkEZJf3MyDdY5SHsnhxMR\\nURbz708EP5rDfAh2mFNUoL0jdRYrRC9OeohljMERlAdiTOfA9FFS0ymiznFzR/H+gWai+r1qIR11\\n7UgkSOEwOsFvDZkVK+omYDUs4y0+my8pC/j2wZCJCBSF46LuMElOZiEzUK1KwjglHWlmmzN2dm7S\\nNAJPjEgycLqPn5oG2oJgO4KIyfMRJ189Jh38Jlnp665MlhohYlQU4W3o2YNxv/RrNhuEUATjiAQk\\n1Zo/uDflg3HH+LQkoKhcyvFsySVgtsaInZxEaQZSs3GS//nP/oIbN67zwZ3v8/ruIb/3nXco/9f/\\niXe7S97zngf3W44GOZdV4GxWUpTwrfe2cML0eXLTMk1jTLAE2zMsnYZabNEmMGwrDA5DH4ETwvX2\\njQhEqimEZRk0SI2LDNa1SHohpAEyLehUTNW2JCEQNx3XBCwf3GcUpbw+FVzOoLTQFh1NorGxxqfQ\\nqZi5jnm4dZvPd+/xQqSs1xdMBkMSkfDs6TkDrXnn7QMm2xF1PafqMgbJFNcWPPnyS9rTFqclWEvV\\nbkilRAVLPki4XK0436ypjSeKMlZVAS5nvQ44NaW1kNlAK8CTodNhnywJsh9kvi9DS7Kc2reoELDG\\nUzeODYLKKqphIHMwLBoGwRNPd7iYZMzyKc3ihIEtuVyuOFvDEzPjVQM2iilJMWmMSTNiHMo2pKZj\\nqBSLpiHIiDjpFXvo+8sjelx+FwymcThhQEkSwAWPch7bPwLwGqIAmo5osMuqsyi74pYI/DfffZ2x\\nrdkUK17Er/Pzjz9lKXQ/kBEknYVg6NxVXaRKcPQotQAgOlzoe3o1kCqNFwn4GhNAiMBsMSNKD3j8\\n7BUfvv8ew/GAvCwpjUCGmFE6JkdxaTqGeU4U9ajDs1cnNJ0hzYZUTU2Spn2/kvAIQR/XtI5Iqf7J\\nryEf5GRJynRnmyQf8OtPf01TlkiREGxvqNexBp3QNA2XRUvj+o6xSm9RcobVisa0JM4yEv3tDA3W\\nKqwVoDUoRYek8Q7lIY4yqkiiOsN1AX9wc8AtNSMewYWBsrtqN+nAO4NyLdvKMJkqSqWpRcYvT0uO\\nC0uuNbWN8DQ01hIlIwySoYA09PCc4dYEH/ohHycDirUlyUdYoQhSorDEwuLaAi8DSkTsZRmfv3jO\\ntesHv3GOfa1DlHiAjAdIEeGdQQtFkIF1Wfa+t8hhgkTi2dbw+3enpGdfopqOVm1xctkyM1ClmlXY\\nsO4i2kSwdbDHv/yX/5rnZ2f8u//jf+erT49JdMSf/vk1bowD9aVhURhUuUSPtwiDBBHB/gh2BwoV\\nDEEpjLco2+LUlS/O9/levMNID84h4r5m1jhPJvr9ZWvp35ASuihgtIXRgFgliGqNsiCDphUK6wU6\\nFjgREAMNlSNyCuUDBwPLD99O2NRAXUOTUA6GrHVMKVO+3H+L5WSLk9owX18ySoYQNKenF9w+OuDW\\ntW3GE8WiXlJ7zSAb8OjJS/5/5t7sybLzuvL7fdM55045Z1XWXIWqwlAoTARAEBwlkuCgVqvVg6Sw\\n3f3iVvSDw3+BX/3qsMN+8JsV3Q4rbFktka0hqG5REkWyCZAAiXlGjVlZOeed7xm+yQ/fLQBUK+Cn\\nDvSpl4q8mTdv3nvOPnuvtfZaO9u3aJjRli1aWYflTof+0NLUgWpiacKY4XSKRSFlNu9e0sUnY0Dq\\nDCkF1AMyndFEkXxU64CQClEYVA6FyWgVOTuHe9jowUucu2dyL9mvLEtUZC0IvmJqLfnCMhsrx1ha\\nXef5W9epJlhDKAAAIABJREFURgOMBRsgLmjqqPCiSIJvX+NVoNDQdh6GQ7qA1Jrlbs7usE6xUN6R\\n/kXmilEUJLs+PFF55FyOQ50TvcfiGAOZHWEqOEnkv7m6xleWK2JZMdQFrwVH7j1ok/blaahjgybF\\ncTTOgYvz4glCzgvp3M/AKXCuJiPiaSCZu1PaCqMzrt+4y7lTpzh5fJXpbMyoKtCyYLG7SKxqFhd6\\naG1w1rKzv81kWgECH0EbMyeOBJ6AFv7eL0drRWHaLBzrsb64TLvIcEHwxptvcnh0SDHXh947nLNE\\nJEYbKlcxnlX4TPC5M2u89Cb0h564kDaSyghaCIKL5CagiHgpabc7mNgwq6YoqSkrS5XlnKhK/sFp\\neKpX0SoryjaM9yGXOdHXNIrk3aAimU+KDCt6/OLWlJtNg1aaRZPT8g2ZafDRE11DprpYP4EM8oVI\\n0dFMJhOWFtewwxEma6GyVspSkgrDDOoBVTXA+kCnk8PkgE4coeXyJ5axT7WICm2IQsxzYsBHT20d\\n1lm0FogYyE2On064/8QyJ4tAb9CgtWZ7GtntV1id02hHFaYI3UN0JXKly2g85cLyMZ67chWjPO/f\\nvcXLr7/MO5niytoZbtYdFsQQHyP92RH+EB6/CkWzi8oLSu9RrQT8e62RQWOsQrkpmRuhclAKKuuI\\nBiQagia65GpT5BlnTja0Cs+Ji2dYKCTl7hY4TWHBEJmaOrnL24jNYYhDS81CbIOtaStP3nFs5OAM\\nHI5rbg8909V1Zq0erx57jDi5Q7vsszEuyWMbs7zK2SfOkIUxS4ViPKsYNJLY6bB9d5vJ4SEyRBaL\\nDrolGY/7lJXD1TCeWaw3lCOP1J2UueQdmRYI4SlyTVk2RFulRERhiTGmkTVqZFYwc5HaewyKLHh6\\nRlHWDi8zhJMoV6OFRfiSEHOsaxjXNY3ytIua1f0pqyJy7spneCtf5Xp+HO5cZ2W2j25qvPbIGGl7\\nQaE8IQaCc2ijOLO6SmdxiVcPD6gG0w99pL1yKDGHVwBpk9i7haSkoRZABsppjG+hnMCqPr4ARMPJ\\nvODXTp/mmSXHxvQOswm0ZMHC6BrHAeEqBoDT83wooHEVicZJlcvHua+1yBBYJOk9IQfrXcqfCvMo\\nmQB3D3ZY76yw+cEdnnzqAfaP9lm1q4xHFu8i3dxQdHOaxrKzs0sKE5ZkKqeJyeXeuhTpEkLEeYcW\\nisIY1taOs766Rmelgy8rBoMBO3uH7O3uYkxGjCTHJq0IziKVICiJqwOzqsb5AiEljyw0PLIKRxVs\\nAbEoqGKRWnnlEW7EQh7ItWRxKcfHyJLNWV/awNaSzcbydDHlNy4vccIPGGrYHoENBXmjsQhGOFxm\\nEK4hV1CbgvcPSq6XgWqhy3qQrNLw+MVTPH1ule2tHV7+YI+IIugcUVSsn12BWKGjANVGa00tLDNf\\noWKWimBwhMEuIVqiNJhuj4OdTTKjEc3wE+vYpzvO5zVCZ4hosNbR0gGqIdo1oA0Nko6vWZ9M+LWT\\nF1g82oEApW6zPQvY6Mi8oz2BVmaQ4zbaLGEmDTs3t/ibd97i2a99hdFkSFZbaG8hOwu8ttun5Q1P\\nP/s0565c5Na1V7i40scZT6uewHRC3XJMtSLzOatjQV45ZAvGGhqtaAVBjUSZQCQx50SHVKm4tkPD\\nFy8vYsab5NMpw2mKCHExNS4hQjeALh0LDYQaXC9j3C7YIuNQLLNZZ1zfcxzWGe/d3eVQBS4/eYWL\\nl8+RyciNV36AzrssLa+xU97heK/imYc2mFnLZFxz5BxSt4h9y+HmFs1shqFBdCXT2jPanrJ/NEDn\\nOUqkU6EFQHIZt0pSqZxKZ2TaUFYNVQ3YlN2dqW7SGoZkQC3xOBpi7YmFYVAH9rYHRAVaBQIBFxUu\\naGIwGD/CacUkgEFSTyP7WtC/u8tN+xLdXps1OabuaGZli0K3kNFhDUxNpKhKcqXZWD9HTwvqQvHC\\nwT4/vDtiqICM1H2l1XburW3fE4hr55L7uktrh0FCrSZYIipAq1JIAma1y4te8uoHsGTOcv+F88xG\\nQ/63W+9RaYF3ESUUMQq8T92fUvdSJeZJbPeMu+fWWUGA8s38UYFXOu2aO49WkcFgRNHOeGP3Ghfs\\nJU5snGOw9yaD8T6+22Oa5SgBdw/nF76ryLQi+ogUAudq9Dx1NSqNlBqHptXu4YViMJkwHB8Speao\\nP2R/Z4f23FYwiBaiyImxRkVPYwN1jGilmArFboB+Z5FHRjd59kyLa2PD4dCzWBh0LCldTTWBwnch\\nRpoWbPX7dLSgJQVDP6Q4v8hvjxu+fCHjoh5QDGFYd6lmFbWpCCpdE20E1ks8GqvX+aAfeH1yyGAj\\no1N2OOl3+cdXCr556ZBWvs/pR1aoBhX9nYrlAs6fUKx0BIPxhKXl08Q6pmUdaRF+B9Qq0INqRFMP\\n8EojWstQC5jMWL90ib+9O+Vrn1DHPtUiqpHolPiGMYbJpI9zc9EaAqkUcTrh1ErGsU6OH1rQMK48\\nw+GMEAtmztMu4LKIFDs3kYtL3Bhs0V5+gio6Xnnpec6c3qBTGFa7i1y+/0E2r99GusALr7zEjQ/e\\n5lufe4bm1AVeHd7h1mCTSxm0mwF58LBk2F7JmY4DbRvoRU0W5mYeMYBXKcVTpKA1Ex06QquBMBym\\nsDYvMKbFJARCyzCqpxipqLIu2WKHaRVwsmCvanjt/S1uD+CoOmBcJV3dEZAtdXniS1/ivocu0h/u\\nc3P7Nu3eCq6p2N+5xcbpE5w4eZrBeEI9HaOMJmstcffuXSajI+rpkOmsodNbJMbI4c4W/WruBGE9\\nNngyrRFa4lxAao3yniJacCUxTPG2gcYipSATBWVV40PA+4CLFucnED1KROpasLK4gPHgvEeE1JM1\\nAmSmcUpCLBBKI3QKWKOpCK6hsQ3bu1v0ykXaJqe7sk7W7nH4/tssR0enguUMTrVglBe8sbPN25OG\\nCj4keVIL6pMGkg8n2RRNARAz0tLiR0cMKtmyCUAqSp/QzNneAR+Q2P0MeG37NrYGazT+XhKk/GW/\\ntI/H8qS00/R/cU9sH1M2vErAafocVEjdakgFfTyaUBjNtQ+u87nPPMlrv3gZYzRSRGzTsHd0RFM3\\n83A/jyKgtEl4tJ7rQAEtgRDRKmLrkoPZjF6vy0KnYNqMOTo64t7dpsjbVCi0VtSThmL+cpPHaLr5\\nj8uaKmY0bsBnLp7npWtHDN2E0w+cpg41r755k956FzducK6hihBm4JpUm6Jw6F7Bw7N9HlpYJMwa\\nRkJzdzxBRk3uobQJHjAoWj7g2l1+Man42/6Qut2jN56x6nd57pENvvDAAnF6k8oGDiYzzp5a49SS\\nJ6fh5OkOZT3D5Brrkw9EEBGpBDpKvKuw9RRZ7xNtss1st9oc9QfIVodR1Lx8/fZ/uUVUiWQfJxAE\\nEefmvSGZxgqNCQpdT3n47BqrokL55Dp9VDqGVUSqnNKV9BR8ZqXNF5YK3g9j/mK6y9Zgj2/949/g\\nT37//6CXRVrLy9jK8cwTT/PEww8TouWP/uiPWT55ht/7879m48QxPvfZB3nqsVMsVYes3nqbMDvg\\n6hefZXRmldev3WD41nXqO326Po3r8+wNTDCASTaSoiFESy49gqTplHqRqSgYtTVDFaG9ip1VvD2G\\n3XLKB4cztg8aRnUinPxci5NnyZ2os7TIo1/6Eg9cfZRbm7e5dWuLztISwUlc03DmxAmWjh8jb2WM\\nRiNU9Ag0mwe77O0dMh3tg2+IUXDQ71ONq3SzEhIjwch5LKkSKQZEC2TwGATKRXA1QaSqIPBUVWA2\\naWiiwIVkdaR0IMZA8J5Iyg4fD6dzB66YboipahDReCJKtJLESAi8lxAkIkqUllhfM5pMmIqKemGB\\n+46tcbV3ldbmuzyRBe7vGFZiw8uxw892K+6QMqjuYY8qegigomCOzBFUnPvBZEgyrGh++YSUyY6P\\nmGqeV6m8OQAPVqfPc69Kt3ln7/lsAiGmM1eAlPLjT5qWL+b4pOSjx3z0SPFheUcImX4hDilgNquY\\nFY5XX32dBy9fpgmWvK1p9drsHh2BBy3nUcgyQ8hk6uOcw7mPv7b0B0QCztbkJidTUDYlWzs7WBfo\\nGIMIkSACRWEoqxqBAg1+jo8KIQkI9mcVh80SV9Y6XFzI+K8eOU978zZLj5/nb197k8sPnWU6rNgq\\nJ9TzXflctBDRUmio9xzt1oBfWYoctwHvu9wdV0zt3F876jTZBTAypb5uBc0PDg7oL3TpVhUX8fyD\\nx7p86dIirckOHSEZzZLuOaci60C3pchagaGtaS0uEWVAihofPDYIjDMIMcXEElcNkCJhsRmwO56x\\nevYsb03gzcFHn9Hfd3y68SAxRQ0rKah8SEWISMqL1IQIixIeXu9gRrvkyjD2BYfVjCDBNSUqh+WF\\njI3CUgjYa2a0s5yf/PwXdJfXeO6b3+C9d9/i6kNXGMwCzjmuv/c+v/K1X2VlcYUnnvosb924y/XB\\niOt/81N+tJDxT6/cx7fPfQk12Ob7b/fpdBbI7rvA5YuXkC++SnzjHbIYCNERrKMI0JZp1bH2kVIV\\n1J0Fxg1MSks7X+Sl927xyiE0SzDzMD2C3QgjBVOjacQCeatAykDtK7LCY51lbbHH17/5Dc5cvI9r\\n21u8+8H7FMUiIvYY929z9ZErbJzawDUlm5ubNLVFmRaDwV2CdfhgcRFcENRVzXg8wLkU94wJSCXn\\nXUagCjVNBKkkMQiaxoO12Noxcw2la7A+IKRMBJtSJIMfBy4RNsE7ZFbQ6y0SosBp8E09/2yTgzq+\\nAhxZFKgsyYH6wxF4SztT6QKvHX42ouguUA+HGAlPf/4zBDHlbJjQO9onE46amgGRMUn/iq/QPsnT\\nUtqAQqETneTnozTJVDjIXz4fRbg3Bc0PpfBu/mQiSZnmJH9qHOuPGtBIwgqUICn67x0hjfYxpvhd\\nPlZEuZfdE+eYg0hp1ffMPWRQTIdjZCfn1dde4/GnnuRP//zfkU9GHB4OQKc+MS9yWp0uta2TLlTP\\nn9N7jNa4qkJnmsJkEDyrSwtkueHGzh0AtFA03rHU7RB8pK5KRNT0uh1EaCidSzCFCkSVcTCr2G7g\\n2jRyXAy4L0oui4bXPrhJq72Cq0bsbe7RNOCFRpIjMEQtgZrlEp7rLXKh65jUDSOrGYwdWmsqL/Eq\\nI3MVC9ExDo6t7hLfvXnAnoXl8YQne4KvXz7P586O6NptcmGZTS0Hw8je0HH+HIhmQqezSNNMMaZI\\npuPRggyI4AhREKSkFSNUE5rK4SQsrLaYjo8wrTaTbI0fvneTbdX75Dr2/1vp/jMe1gWKzGBECtOy\\nzuNcQOscpQzBWo51Ms60PEVZIhFMfE5/BsJoNB4tYHEh0Mot9WyA9JKF1hJXHrzCX/zl9wgq0l5Y\\nIO/0+MavfZu8nRM85KrgxPpxFBFNzWKu+Oe/+U9YX7vA//WDt/kfvvMzXpQXuGuu8p3vvMZffe9V\\n9kaW5Qfup+/BW2Duf2mK1LmJGDELC+zna/xVP+d//lmfF8U6t5fO8JMR/KKBHw7gpTHcVDBuCYJR\\nSBTdTJKphtxZlpREVoFeb5Ffee7rXLrvPkYHh7z60kssry6zvLyMnTVceeACGydP44NkMi4plKFp\\nHNt7B0QE5WyEayrG45qjQYW1kCtFrhVFe4HFTpG8GqPF4tCZJDOCEBxVXTIsxxxMpxyUU0Z1g0Oh\\nstSeudjgQg14tBAp4M6DQtPOWywuLuNC/HA7x4l0k3QidXYOgbQVvhlBLHHUIANNjAxmNvmxqoJq\\nnETaO0dH/Lu//RH1yga3YpvtfJVXzCI/H9bcKj0eDyFSiCQdauK9WJKEp0GGIksdJg5HlUygmZtH\\n+XktixEVIypKlAMQ6KBQUid9272sE5dGfzG/gsK8gEr1dyZ7GUFGhJpjo3Nr4xiTiUf6+fljShLm\\nGoIY7v2oQEnDtes36Cz2ePTxxxkO++RafQiFeRfSOqePSRs6h8S01oTaorUmlwKN5/J9Z3j44cuM\\n+3vUdUUMgSwztFttppMJ2ig6nQIhIMtzhNLzV+fAx4SnOs3tWrI51bz/7h0Gb93mAakJt/c4uHXE\\n22/foa4gcwVFUyBLj4uR2giqyvHsGvzOWptSaKZRsD+YoOaYcdTpfdVzTfas0+X7u4dcq+FMV/Ff\\nX1jgd588xWfPKpbjBFVPaerAuFYMZjAYQ9NYFpc6ICMhSrKshfQZyqXASO0TLONNJNiKZlQRQkbM\\nOgRgMDygtbjG+yPNa4cw0t1PrGOfLiZqCtaPH2fr9ibRJjmIIt2KowtIW3NqNaMbS7oKpj4yrmFS\\nRzRpf3xxUdBrG7AlsgalPF2l6W2ss7nVYWdnhywrONw75M3X3uShS/ehcsm0mXHy3BmcbeiajNo2\\nbPQWuPIbv8m1R+/wkxde4H/687/myUvneebKMzSzu/zv//o/8PCi5vMLx/F5G++2Gc0UB1NPVnQp\\nul3euH3An75+h9dnUOWa29f3yN65wRTY7xRUWRflHSpUOB0pak8nOGQzwSsJRqLRdAvD1577VS5c\\nvo/rmzd57a23OXnhPlqLi2xv3eXk8WMcO3kCES2jwYTxcJZMW2yq8OPRlIjgcK9PU3tCVEQtUKrA\\nZILOQot20WHvYB8XwOQ5IQRsVVHNKiZlhQ0OhEYZiXEhjcg+xaFgBNbZJCHSKVnTW5fkLTYy3N+h\\nCDHl2/sGFwNOyPmYrAlCg02scXSWKEBmHQgCFzVC55TNDBOgHFc4kVyof344ZrMSuNuHvDdz3JjC\\nAZAJh4zJcs3CvBuD6JPk/uMdZhSA/E+Ndu+hk/cOiSBL+APBR3Kh8CIRQFrrVLhJPyRJBRQSSRX5\\nqMD+8hHT5lIIKMW9mkrAoz42NWZGoYJIf4911EHwF9//Pv/w17/N+toab732Bv1hRVVXVNYl31cE\\nLvoP9bHEFOGtiBS64PyZU1y8eIHoHXU1JkrItIYIVVVhtMIYhTY5sjB4F/HRo7QkEonBEaVipAo2\\nS8GvLvd47/0Drp6Bi0XOE+OKH//iDlWuaUSXJSCrJjgNlVb44Nkw8I+ubnCx2magC6bTAb5JWLEL\\nipyIdhN0AYNimR9tj7l+EPnsuS6/fnmdpzoV63oKTPC2xnvNtPJY1WZxrU0lBigD+UKX2WSEbreJ\\nGLScu1MBMjgEEudqmnJMJgNBZnQW19nbv4suWrjOEj9+ZZe7rs3Y/x3Y5+/WsU989D/zUXnPYDxk\\n0D8kkqG1ROsMhEAZTZxYTix0UG6Ywqx8oD9OFnn4SC7TKJPlbbS3qOjQVc3a0hIvvPMWX/j8F1nP\\nFLevXcNXM77/77/HWu+3iMKxM9lh/cRxyskMYwr6gyl//Mff5Qtf/DyXH7yfw+EZDo7u8Nb2Fq+9\\n8w6PPnyJhx/6Vcb2gNsyYKczqkmXa9sjDmybqdbs9He4u18xaMB2OszwuLIiDxoXQBcFhVIo3yQr\\ntOBRRpI3AYLHFAVjZ4na8djjj3HhvjMcjfu8tb1FtnGS5RMn2d/eYmO9zcXLq9hoODrcx1aWaVVx\\ncDgkM4JoGySe7YMBPiTWGN+gigVM0ULi6RYZo9GM0XgGSuNFZDqc0MzK5LsJaJVWbgmBDDEnZCTO\\nB6z1SJO0s4QIIqCUREsDRJqqJhMhPY9LJ2EUCqcEeEFAUHkBhcFTU1UlwnqM6aJ1QeUcSmRInUhG\\nEWFUet49mDBd6jAsuvzH3QF1TKJsOS9cEZJxJXFeFT3e+3Rzvve4ZA5q/nKK40f8j0fNS2QqY6mz\\nS3hpSL6gPs6XRZJtnBAiFduQnuXvL6DpECIgpST6j74vFWCPA7QS5Cbj/MnT3NncZDwekneOYX3k\\nJ8+/yFOPPspjjz7K++/d5HBwxGA4YeYcQSi8tSglUUIjvMCGhoW8x4VzZzh2bJ26nM0zohQqNe94\\n6wg+sLK0iFKaOPfD9T51kFobvA8QHF5lVCrnVtnQcZGNE4DRZKMhX10tuHuf4vfedwzaaeOtpUiM\\nnJ9yrIZvnSl4fFmj9yqcy/Gj5E0xQhCloO0cmYODVpfnZ/DiruPzJ7r80/s3ONeZoM2EUBhE7Wg8\\nTKYOazWykLRzwZW1NTqFZFpOkXmOzAuaaBFRIJxHSU8QabEia8C7KcKIZJdYWcqxY/nsJV4dlryy\\nu8fEHKeupp9Yxz7VIuqA67c3ibYmkwJnI05A0eoQbU2bmuWii7jncC4048ksFQWgncHyahdaCjvT\\nieXXipVWweYrN3j62a9wYm2Z13/+c46dsrSzgnIyI0rBwfCAJbVId3EB1WphpeD29g6d117mwctn\\nmQ12OLOxxHNf/3Ve+vnr/PinP+Ola9d47PwJWo88yLVym5/95IDtCYxpqARUUtPSBa0cpKvozkd1\\nLSVGaQof8X6CJoWbkRXUlWOiWpg8x7kGVWjOXjnP6Ucuc+Qcr7x/i8WNMwzLkrc/eJdLG2tcuXyG\\n3kLOza0GITVHg332DgdEFFEbTF6ws71L8MkrUhnAKGKMqQOSkoOjIZNJTRMc3kM5muHrhlxroq/Q\\nwmPmpIcTMiU5hkQYSSFp5ZLCzRAyMA+WByCGJMyOxtA4QGdYaSAIhILcOXIf8Vic6RFjRfCRji4w\\nUdBMpshCorUhipAYZu9BClxl6YsJi0ttVh56gKK6Rr1/iPMRJUApReN8YidECmwjpM7Tfzw7fJ7S\\nqhF89NX4URGeQw5EEDq9B+m5U4yJUiqRSDEFp4s55R6CSO8FGi31nNz5qL2UH875974/Bzwi4Qbp\\ndwZAKbQ2XL36MLPpiN3Dmp2DPc51z7O1vc+Z4/ucO3GcjdXjvPbmW7x37Rr1dALMre1URoxp3bXX\\n7tDrdcgyw3DUJ7iGtfVVugs9xGxGM7OAYGGph1QaJRW29lRlRdHqYKNAKTEn0iAKSSMku1Vgd3eX\\nMxfOkddTMnvI2nTCb1/aYDQ74M/uHDIqukxbXZpQsTh2PNuFf/HgBu3ZDraA8cFH+ksdI4QaHQ1V\\ntsSNSvDKZp8nH1jln13a4GGO6OWOkVJEoainJdQJ9ui2DNNyQJ4JOkVn/mk6lCmw0SbFRaiQUhCk\\nAh0IOPSkREqY2UinJxns7tDJ1xjrY/zttescALUvER9bPPj7jk8VE1VKYbICbXKQEa3VXJoRELak\\ncI6VliaEJGRuIljbpP10I2gV0C0cmhIrHaUGQcWTJ5f58vkNvv+H/w9//R9+wK27B2R5h1wbYhDE\\noPBWcLi5l06mQhODpasFjz7wIOPxlJ+88CJnT58nk4LPPvU4Z8+f4twDD/D+wZj/9Q//gp/1Iw/9\\nzr/k4pe/TJ1pfK7JC4WLFqJDExAuEFwiCpRzFLGhjU8ji1BkDWgKMC0cCmE0J8+d4vLDD7B6/iw/\\nfvUNVHeVsgoc7NxluWU4c3ydQubs3xmgIvSHUzZ391AikglLU5bs7A+Jso1RGUokx3ayAqUlNCW2\\nrimtJmYO7ypm40NiPUOpiA0VXqQExkIbFIJcKAqtyZSmUJE2NYu25GQ14mw14WI94XIz4f5mwkU7\\n4UQzolMNyaIjxoCXBquSTlGgyRAskLBVIQTSa6JTOKvITJvgLMHVaBUBh9BglCCTiSQ52DvEBs/j\\nl86xYFLejzA65UmqbD4bRsQ8neVDmVNqagEFQaPm/amaXwZCCMQ94miuM42kmuxEOueiSSRSJOJD\\nIsg+nMnnJVlKiXVuztIHpBRIKRAyYcTphXmUMjDn651LSgxI96OqqugP9rn6yINonQrYZFJSFD22\\n7uyws7NHr9vm6Scf4+TGMRZ7naRpVXJ+jXhMrlhaWiTPc4aTCaPREKk1tXfUzjOZTBFS0G53wUuq\\nskYIRW7S525tTavVwXufoBoEQglmRCpleHsIjZYISoyJSA/HJjv8dw+t8y9OaBaqCdZptM95KIP/\\n/nOnuMiAloC+V8ya5K9bI8gDdIjMtOG2aPHW7T5fOL/M71w9xf3LnlZXIaKkNfPIwwl2XOEdaKkI\\nTUmuoNeKGFHh7IQ8z5h/0mkvPtzDpD3B1fi6QvuaAOiWxk4rYuNorZ3g+c0hL+1VzLKCuhoTXP2J\\ndexT7USNkDipCFoj5mC4TzMjMdYsaFjMBEwFXsY50weddgKTshwWXMWaddgyhWa1Zn1O7b3L7z50\\nnudPH+cPX3qHvYMZN6/dRZMxHk+RuaGlOnyweYPHn/0cmRZoanACKaG1vMyxsxeRps1LP/0F68fX\\neezRhzF5xoVvfoOXnn+R5198iZ/ducl/+1v/jHfee4tycIDEITKFlIbap31mrSSKgIuRIAUOMEIT\\no0ZjWbIOXx1gpePYg2e5+tmHOPfgA/zsF6/RKtqE4JiOh5xaXuGLzzxFIRVNWRNCwWgyYXd3j25n\\nAWunNNWM3cMJ1im0yhGQzHa1Qqq0AYYPuCComkB/doCvHEZIiJaqjqi8he70UrppTCmp1BPEbELP\\nwGoBJ3pdNlaXeKBYJteaVpbiNnyMVNYxaCx9G7hxNObWYMrtYckEjdUFmAKncxrvyVVifYOPZMoQ\\nlaIKKZpXIvF1ajWU0bgYEoEtFNWsZrA34fj6IpfPbfD6u1sJC44KREBER6YE3ivmvvbzQZl5pHGA\\n+cAe51RTKnfp3Pvw++4dIV2MQiQs/t5jRoH3ScomVXpt3nkaC1musa5BybSRZOaifKkSvgqJONJK\\nEgJkecpeF1JDgKpquHPnFo89/gjr6+tUO0cc7A8wGHrG8Oprbyai6IH7efyxR3CvRmp7h3Jm8dEh\\nyFFC0O11ic5x1O9z8tQJim6P2jZs3tkj0x2MTLrSvJ0hickNymiUThaAg8Eh1lUpsM+D8xlSGxoU\\nr0wU99eRnkrx4CaHrIET9T7//NE12usV/++bA5Za8L/8q3/Ig/V1sqMJtcs5PKhQCkoHWnfw5ZSg\\nIxOteOfuNp956DRfvHic48UMG2ZMVKRVB+RwinKRXgYVRdIkV57lNchaGbOyQeUFUpk0iMxJNxmT\\nPC8nkWRoAAAgAElEQVQGj/AWHV3aVJM5IrYYjAdky8e4KzN+cucuh6JHFXOIFZL/FD//+PHp7s5b\\nT4xzVlR6EJooJVEpVIAFAx2pU05MSB2VkaALQxMsMkDbg56kndpoChaiY3W2hdw64tuf/TZf/53/\\nkf/ze8/zg7/6If1+nxAc3c4yJgqOZkOqasZiq4NWCpMb/vInP8R2C5565mmq/piprXn3xZ/yteee\\n47333uW+02f55jef4/Lli/z+d/8N7117N8XKOs2kcuhCMAsWnXVxMaDqBhXSnSwIiS46GOsIswmL\\n0XEOOLcM61dOUzxxhRNPPcJrb2wSKhBlzcJKG28t91++gIwwGlfUjWM4q9jc3max22Vn9y5V4zg8\\nGhEdGKMQRKQ0CWOTERFjsnaLAldXDAcDqggmakKTLAeLpM+hwBCdpahrFuyAi13H4+e7PHiyy6nl\\nDguZQgZPr/I0wdL4lAkepETlAtVK4kS/3mXQFGyXnjcPprxwZ8S7kwmDokul26jQkGuB1l2mZYkT\\nEIUgaEVwDUrE5ECRCWrvUCGNubMKdo8q2hkcX1/j+q0txlVMuUAqYOd5QAnZzYAU5fvx0T3hj6mY\\niXtTtrznXZsaVhnmhXVOqqeL5SOCqiZidPqKD4nEEhpyo/DepYZWaqSYd6jqXna7R2mBtw45d+hX\\nfERsOefIBIymE44Ghzz62KPsHP4IO3McHfaTFMnWXLt2jU6vy9LKGmfPnKF2lp29A5xzVLVl7fgJ\\nXHQM+odkuaaqG5CKF154Geshy5NZM0pQW4sWoGuwsaEoWszGoznIoTBKIOXc1JlIHRxb2RJvHZZc\\nWM/pUM03vkBFR7va4bfPLfOFtUUWV47xoDnCVzNcr8fN63fAKqTzZBJiVlEpidOGYTPi809ucHFj\\nmdVmhihLkBW1HdFMKjouqSCshxAFU1exdqwgawlK6xFFl6gLgpCoKMAlJympEtQSfYNwNco5bAEt\\noWlGFY4Cfeoy33v5Fh+Unkr2qKp0Lnn3X3ARFc7OXR/mo1aM+HuaOR8xEpQPKKHmp66gyBW1ckgV\\nEnOLxrdOcKdRvL+5Ty84zvcgLgbWejkXnn6EU499jq989Sv8wR/8AT9/+edIDV/+wrMM/JTd/W3W\\neotUlecLX/06W3vb/PhHP+QffevX2BmM+NJXv8Irr77Bd//kTyknM25/cJOnPvMojzx8BSMVhcpY\\nzHocKIePNSFvUbskGfLOogRkJsf6QOU8cZoMSDYWWvzuI0vcf/Iky8tL3FWCvZUltnYOefEXr3Nm\\nZYOrDz2IyBrOnVlJ5g/1lKrxlD5w+2CX7uICrpxilOZwPKHxmlaeoWkQMhCMQaEITY3wCQicTKdM\\nJkOwU6To4QkI3cJoRQYY19CZzliKloeP93j2wkWeOtllQ04xsyPqwS2qOp1UVZ2G2QqwaBAaHwNF\\naCh8Cu1cNXDKCC5uLPGZUxf42ZHl+c1Drg/2GJhFhFDU9ZS8KMC7tO7n/Tw6FSKGEBQxOBoZ53Ib\\nja0C23tjzl5Y4NTpDd77YAdBSGy8nt+YmYcvkVj7DwklIEem+F7mXSRz+uieSUdIXxEx4W5i/rNx\\nTsHHEMl0EtG7dP9HSTHXOKfvPXF6g+mkpKkqhBQ0dY11nqLIqauaKCpchLxI43qmNaCTwN07yrrm\\nzvYOl+/rcfbUCW7euEtTzbhz5w6XL1/Cxpo33nqHz3/xCxw7doybtzeR89F7bXWZXqfLaDxEFzlF\\nqwVK8YtXXuewP6XVyj4k2yDibNqR91rTVBUxFxQtQ39Y0u11ED5ghMa6+ZaX9xyognf7A55dMizJ\\n9FYHDbWDRaNp9/usK7CDEcP3tulsHGdYQW9lCdMGWTlqKibB0V5ZwmUFl44voPMG4YaUEaazGdoN\\naOHwASojUDLHhxpXe5aXupi2pA4NXrfR+QJBBAQOGWJaflACISIRS4gVBJ+ISLME5Zh66umcucSP\\ndhue33FMs0V846m9p/EC5Cejnp9yEfW/BO1//IjzszrBUxIhQxpPtaIhIkjxGDdVwd9c6/OjrYqJ\\n03RrOJvBU491+fbyBUrrOHZyia/+5td47AtP891/+x3+7Dt/xA++/5cc6IrrN95jfWEFJBz2B3zm\\n6hN877t/gq4FygnapuDRh69w++ZtbpbX6U+GvPnmGzx88RLeaoQVnD9xmnIwxmnYHvbRhUaIlCpp\\na0cjChCePBcE61HAfWeO88WVMZ0Tbd7xkf1iFd09xdHtA06uH2dxeYlpVdJG0SkyjFRMyxHaFNy4\\n9gFB5VTTMTs7ezgbmZUNrSxHS4WLmiLTKAJ145LaQeZMh0Mmg0PAoU2GCVAF0EUHiSVvJpyMUx5f\\n1Xzr0XM8uNZiKVb44S3GB3187QlinjRKKlQ2gkXMkcGAJmBRWO8pRDL7UDJSTKccE55vrq7weGed\\nN6/d5l/3a1zd4PKciavo9bo0zjJxFUoko1URZPKy1Jrkx+mRUhNjYFYJmtpzcmOD21s7jEoH6bYx\\nr4YOVEzs/Id4KGhSKFw9L573xnMR5gVT3Vv64N5uZjqkBCJeQJSBLBhCsAilIHpMnlE3NTF6Lt9/\\ngRgjB/s7rK2tkZuCWzdTrMesrMkzTasjCc5TW482guA8Te0oco0yGf1xycJSw92dHS7dd4HDnX0O\\nq4ayqXj7/fd4+rH7iUrz8quvc3jY5/DwgFZR0Gq3WV1Zw3lHOSsp2i18hL2jATc2d1haXMA5O19B\\nDYQYyLIcqRVSKXSWM5gMcAI6nTbVNLlKOV8TZUR5gYqRUd7ioPbslIYTrS4qpigfREMooZAdZmWN\\n9REhHWHnEBkVC90csxgpfAeRLVJHS5QSbQpmzZTGCSZNw2K3Q3AOBi5pZgXUUdFETdnUnFxp0eoa\\n6lASTJaCCIVA6mQEFKRD6UQwBgKNnRJDREmSgZAvGBwOaC3CXWX4i7e32dWrjBuPdxXe1dRoCNkn\\n1rFPd5yfH0IAQSWrOQn3SmdqniQhODIhE0soBHreLvSLnB+8e8C/H8BmsYzLeuRyxHZeI/MzfPPs\\nE4jucSbWMrI1qtB861vf4ivPfI7v/Nv/mz//8fd58acvcXJ1A60Umzdu8CvPfJ4nrz5By7Sxtef2\\nB9fZ2dvlua9+md/7Nx9QNhUbpx9hMCkZD1N8SV2NwU2JrqIgbWEFCw0Ok3Wx3mGbiqVCYUTyJb18\\nch1R7rNnAz8blRx/4kG2bva59fYmFTMuXTpNCIGl3hJGCIKrCCEyrcecPXuWrZ1D9rZvY13kaFyi\\ntUILi5QKo7spkM2WECzOGybOMZ4MwTt0rqhjpGtnrBQ5Ok5puZIHF+DXHjrPr55dYKXaI/ZvMThy\\njEtohKYKBTYoHIHGViCStjT4hDsJAlIlGzglE8ZmNGRBoQnkwtLp77AmBFdPd2hObPDj16+xXTfE\\nrINwEV/W9IyhdKnrVEriYkAnaTkueKR0ycrOK44GI9aOddnYOM7o5m5aXY3zblCRCIWPzN2Jcxop\\nvd55/ZyPewE53zYS85tE6mSQEnePPJIfdZrWBtqtDrWtUFLiQ023m7G2tkBZHTGZTChagJhy6swG\\nyAnTWQVRUBQFp8+sUVaOV1+5gVaKzJgPR38fAwjB3sGAwuScP32KL3/5c/zl9/+a0qap5ubmFhcu\\nXOD1199mOBjQ7XY4ubFBu5dczMq6IsTIdDrDU7Kze0Cn26GpG4xJhSHKtGnlokUFQVQBZy0qy7h8\\n+T6G/QFb4x1aLYOLAoJDqEihBYO6YoDipa0B5x+5n3h4l07VsN5tEYhM5TKv3L2D7sJDFxZgOE4T\\nRSEYyUiGwlcKKQLt4AgepkHhVs5w/PQ5/HiL9oJjPEtR6UZ1scMJUU9Z3zhGu/BU9RRVGEyWfH+1\\n1Hjvku4YBWrupVo3OJc+z0xrJIrp4RBamunaab737jY3yi4TpahChbUVjXOJ8Pv7+7wPj0937VPP\\nd5u9Qs5lMjL4tJIVA00AF5L9jhDpgtJKI4IlV/BSs8wLOztMuyrhW2EGbcXuzHKntLByjFq1KMcV\\nhcnoZAUbp3voc+eZTqdcuu8R3nrnTX7w47/BS8FgdMS719/lS9/4Ctu3t9je3mJ1fYUfvfAfeeDx\\nqywurVDu7LC0fpw7wyNcnDKYjcg7bSY4TAHrClTRZXdg8U2kKid0ck2nVeCailwJWj6y++773Lh6\\nhjdvDOg9+UXujGtuHR5hleSBc5fpGEGxtIARijs3tsizNmRddg62MblnNOgzmTYMx1OimIN5QiOV\\nRgrJrCqJPiCEZjwZMilnGA06V7gQkUg6uSS3U1ZcxTce2eDXH7/AhpggjrYY9I+YTVLO+Nhphk5T\\nek3jJbYJxJhTx4CIARnT5pgRoKRE64hSyadYS0Gmkiu8kCCDBeExEn5jseLSU6f5/Vfu8G4zowoZ\\nLVGk9FbV4GNCLZUn0dc6/ZnRWXyMeAWD4ZBuT7OytkK2fUhw85NapHx0JzNkIBFUcY6GqpgiuNHJ\\n49NHiAop08X6Ee55r2CKlI/+MblSOh8jrbamZ3oMx31WVlqcPnMchEMoQwgGIea2e72K+68cxzaR\\nyWQMKCrXR5suJgNb+4T5C4Gbs/8xKKyLjMZTrl97n2c/+zRPPP4oP/rpq0QhuLN7wP7hgGrm6BSK\\nTKfNIy0kSkDdVOR5zrSuODgaouYpn1Ln+CjQwc27amjqCpHPfRSU4szpkzzwwAP82Z/9OcZo6iqS\\nmYxpUyV7oABdCo6E4R1f8MLBmGeWV7n19i3CRmBtbY0QPA8/fpqF9S6z/gGh9HQkeJdurtH7RGzZ\\nkBQsEqTQaAq6qyc5PHgfaytMSzMYaQ7HJQu9jNW1NhSexk/QnYyAxAWPUZoQKkRMwXoCT4yB6Cqi\\ndUgPRhdEp5nVDb4sye57hL/ZDfxgs8+RUVjG+OgZ1Y4QFDqm6eqTjk+1iNqQ3INC9Am/CB+B71Jo\\n6gbKup5PUR4pBXmRMZ3U5LnizaOCGSArWFADpNGI2lEI2Fjv0V3uIkxBNxRkIhJmU0pXUuY5u/0h\\n9ZHn7Kn7+Se/dYqf/vxHvPjGi/zVT/+abMGwf3ubzbs3+MJXv8jKqRMcTMcobTDKsHp8gxfeeAUl\\nYBprQtHl0EUWFLRNQVVLbCxoZJP2lf8/5t7sWbbzPO/7fdNaq+fe49lnAs7BAYgDEKBIQqAoRqJF\\n0aRs0VYpiVMZlDhVsW9cyX+T3KTKl1YcJ+Uoki3TsU2KpibSJAiIIEAMZ8Q5e969e1y9hm/Kxdeg\\nlXKFrlSlCl73e/fu3mu9/X7v+zy/x7VE4dGmgCAYdAJ3Dm7wA9cn39+lX4y5/96HdLd22N3dQuEo\\npKSfBZbtnO7OENd0efMvPiAb5qzODjE0rCoP0VEoQ+0so51dunmXy/Nz6rKi6I+4mJxh6wW9LHWQ\\nDRKdGQyBUDuu9XP+i9fu8tWbHQblEc3kmNmsZdlCS5/J0lI2njYGyiYlf0qR422gNZsRi1BpMS6S\\neidGl0Y1zaaQGiBTNNInCrpUSAUHF4e4rS1+85df4fLNY45rhfeRqALdPMO3lohHBJmSBkhSIbdx\\nRlmtaGJLJDLuj+gWPdbz+YZWn+5uHxQeRR4cIiapklNpbqrdx8gmD8j0928AIiGEn4niiYGwmY/K\\nzXxUAkF6prMZW9sFn375Dr2hJlKjjcT5Gh9aQvSM+gOm0yeMRtt0egVCKZarFcPBkMcPTvABclMg\\noiK6Ni2XRNrUO+tYLlYMdGQxv+TLf+VLXKwq3n7vEcREyMoLzXA04Jmbt+h0cyaTCaOtMTIzXM6X\\nXFxc4mN6jfQ+ZeLAkgpZ4x15nqOURArB1u4O165f44//5E/SZx3zNC8NIZlhaCFCJzSUOudhgPeW\\nS37x6h43X9jizbenbC1O+IUX+lwbK/K+ZjZZoDODiAHtXIoKl4K6DCitfyarc1bSTuZUjx8SvUUX\\n3YSJdIHx3pitfY0PU4yoUH2DD5JgBdFHXKjRWqNUgY8aIdKC0jctrnGJHSp7NLVlftly7caQH6/g\\nn78z54h9rLA4O2NZWSJdgpdI30C0/27x+kvXJ2v7FAIjNU1IGTZeeZSEPHqCgqmCmc6wTtGzDXle\\nE3KNr3Jiq3nsa9Ya0D7R0n2fPGpkM6Pb30IOeyzDmqYs6RdZSrfKxqhV4ErsMtnWGNnBTwKf/dyv\\n8sqrn+b73/0O3/n9b7GwDqsFDy4v+Bt/7TfJ0Ni6oehm7PYK9MkEfIFrWnb3oa89uRA0VaD2KRq3\\nEJ7oPGojN9IEZCZ44hp+FEuubT/DSy9+mu/+8E32925wbWeP+/ffxGxnyO4tFgvB0alFmpyzyycc\\n3Nji5OkhYbXm5OIIGwuE6bEiUgwGBK2ZlUsmkymZEpTTJ9S2pFUBgWZkM/p1i+sEygz+Tj7jt//q\\nXZ4dO9z5EZfnNYvLgipmXDjL1HsuWs3aCoQX6NhHb4TssXBImZGJlkK2RKASOa3upsKqIplKkQsW\\ni/eeIigEiqADCM/DPlyrpvytsOTOzTH/44dn/FgVKd+GAgFMnMVrT6ZaZKsQvgcUuOgwviUKxWRe\\nc7UYc3N/xIfLOTUCRI4noGSLw6et8aYr1B87QWPq2Lxy+OBSwodOUqPUsxWEkBOjwxgDLnV2ddkg\\ndA6y5uq1Hi+9cgttBOt1SVtXWOdBekxe4FvBg6MlUhq6wLBQdLQi9w7XM9x+8Sqz2UNsXdFWiT3g\\nN+H03keU1pQ2sgiG+0cTrly/yW9//ZeRqye8+zhDicCg0Hzq2QNuP7vLhw/uYzJF6xpiFEwupigP\\nRaaJuA23YGMB9hJrXVKmOEGvV9DpdugVGR+88x4Xx6cIoaGICOWw1uGiIyiNkxon59RZj9YWPJic\\n8OjJhNf2Orz+2nU+OJvwxkKz371KfzEkCsEVeUZelciQqKq1jhiVvjTqFrwu0Nri18dkly3a1phe\\nj2xb0+/V4FfQQmsUodth0e1hWlCuIQsOFdMISGhPyr1uaJpZGgNJQZ4NKdeRyXTBtRu7/OGVX+af\\nfudN7ltLnUGFo7IK16o0+I8VKcji/+ls+3fq2P/PdfH/06WLLqFtQLbpyCU1MliCSi6D2sP5whOH\\nBcI1mOjpScOcgPMNZdXQGmjyhCgregJf11Tecf25F+jIPraOdJQBBNEraAXaSE6rE8rLKaoT6A0H\\nTE6mXN/d5Stf+lXuvnCXtz+4x0/fe48/+uY/57/6L3+HICPlasWVvR3atuXo8gLVKyirmkGvT18r\\n+rrAoWldRaYULR5hIyK2dE1BaFo6OiMvNB1VsHdwhadPj3j69IjnnnueR4/vM5vNuHv3synCuK4o\\nioyzyYzJ+SVSSlarGYvLS5xLWDWJT10EElvVTC+mgGBV11R2jTKCbjDEOtIYSWYie27G1565xn/9\\nxV9hKEvKpw+pTmdUlea8gvMGLhtHrTJaG1AxkkkQWJSUGJW6NuksIYdGaLq5ZOQ9ppnSlQJvI1me\\nUGYfQ41EJhJgxjq6GsquwuIJRMYd+OrzN5ncO+LYSebURGHQUiREW9B4SYq5kGlz71wqAHVdM51O\\nuHHjOvcefJTQcCSxe2DTXW72Q4F0SNdSg6gxBgzQH+eMBluU64bppKSsWpRogDotYIRge3vAer1G\\nZZFIYlPmuWC1WtLtGE6OnzAcDgiNpegZxKZIiQij4YDxeIeqXNKsSkLjEHpI8IZer8O8ShTU1OK6\\nxDKTMdmFlWJyecqgq3n8+DGvffbT/OqXv8Lj//1bRB+5ev2Am7dv8/T4kLKqGG/vIqThyb1HLFcL\\nik4PJTVlkzo1Lf+tdTfLCxCCwXjM1s4udblmtVpydnqGMTlCpo1cUihIhE9efqUiURfEzXz13Hb4\\n9tMV17Z73BQlrz875qIV3P/gQ35037E7hvkBjEdDulqSR4cRGifARkcoJKvVEruO7Iz6LNuMjz6a\\nYPoR2cnp7fbJOhl5rul3M1blku6qRimJyUUytURByDVWRrANuqrIAtQWsk7OcrGgWgcG169T723z\\np2+9x+myxVHgvaQNDtsCViKCROuC4BtMUfDzrk+0iLZeYn1NE0qkLFBBwsfzIGWoVcHTmcdudwlx\\nThZbBqaLJuK9w+v0kGwd7IKAQmtWixqk4vYLd8FJhkVOJQI+BnwTiTLQ0nDncy8gyThfWUJQPHPl\\nKmF1Tu7hp2+9zfaVfb7xG1/nnXfe5n/9B79Lpz9kUa743Gd/gWVVM6tW1BtLoRYZ2caJE50nE3JD\\nApe0LWTGEGOgyA3eBW7cvMWdT73EzvYe3/r2d9nZ2aNcLxCq5eWX79IttliXa87Pzym6I6bTKVXV\\noIRHqiSIjlGTAZnMUzRJlJSrGqMkURuqepWQdo1DIih6A2yzZkev+MazI/7Ol17A+AXLw0Oa8xl1\\nCZPKcVTDuVVUFISgUD5QEDHCIYRDqI/nVoquAouklp5gW3SAbQldFbGbwhk2y0KhNa2LCAS50hQB\\nRNDUCKSMbMmaL437nF8Z8HuHy2Tvw5ILsNGkmNvN/x0h8FIz6vWpqwofFOv1mn6/otfPWa0ahE4i\\n9hgCasPFC0KghUHlhl6nz2in5ebNm3jvOTu/oKoC0WdoZSG0HFwfsbs3oqoWbG/tgJScHp4ync6T\\n+qKAwSBnNOwh8BipWUymbI3HrC7XXL05Zr1esL+7y6pc8fDhU9x6RUfrNHX1C6q15dbNO7y/fEhT\\n11jrkFqhlEQEj/PQth5hYDqd8eG9h7x890X2rlznC6+/zOHhEddvHHA5W1C3kbrxzKZzVuuK5XJJ\\nnuVEJGWT0uNiVPimxeiMqME6R6fToygK5vMFSgmqdZ20zx9bFYIjSIGQEoRAbhS4bcgwtiZ4z1wN\\neauBZ46W/K2bMFiccNDd5eClF1nduOTs4owPLzxvXSwAkpGmhWggmDTy2e3C1e0h0UsePTmnIefN\\nd2rGzzg+/9Jn2P/Mi5AJwuOH5BQU5SnRb+AyMumwkRHblhjXEusWIwVZv0u5rqnWHj3cYTW+yr98\\n9xFvH0IZejQmYQStjcQGZNyoMJqGYBxlNfu5dewTLaKrsiHGhhAaojYIoVE+IHzA6w5eD3m6DJQh\\nYyeCDJ7MCPq5wtIwGIzphMjW6Arn8wuIlo6J6EJz+/oVHA2Pz064cmWPZtkgkBt/sOH2rRd5Zv82\\nf/LHb/Djt95HuYbdgUH6SDWb85P33mW0s8MXfvl1nrt1hx/84IeICPmgx+n5GSLAoOhQrmp8BKs0\\nK+fIiw6y9uBsQrIBbWyROkMZjdaawZVdxnvX+OjJEW3jybKAsxUyOsbjMT4IprOS0dYub7z5Fm0d\\n6HSHRB85ncxovUOJnFzrJCIWCtd4XJPC2KbVArcRTxeyAKVxzZJtSn7r7nX+3heepzf7iKPTFatZ\\nSVlpLiqXOABOUUdDVOLfot6CAh9RBoRKHZ4IGiEatHNsKYXUBV5kTLThzAWcjjRR4EOkYwRDERmo\\nig4ehGLloWjA5RonLR274sA6vnr1gJ8ua2Z1oJEaKTTGg5WGED2OBo0kM54YDcPBgNZVOCfx3rM1\\nHDCbNWgsQiq0UkijU/BaTFpZgUIqw+7WgOOnpxydnFGtU6yGbSM6g4Mrfa5f38OGFVs7BYMeXEzO\\n2Nkx/OIvfpE863E6eYBzHm8t9XpJv5Nh+lnaAPf62LVl1BtQ25pyvqRct+yM+uzvXcW7lv5On8nF\\nirpcEXFoLYiiSMJ3BD6kxFQjBc45lvOaUznjz//Nm3z+c6+yt92nqUacXpxjTAeBJOv0eXp4RLkq\\nMXmOF1C3LcKk04og0ssL2qYmSIVSGiEEVV1vQCMwmV6S5+l9xPiX1mwhbLTcDu8cQggyKcClhmZV\\njPnu8SPu7gz5XKbYcTWhLcl6I66Pt7nxSsaiCbQIllXNbuNpRUveExTKMVKKIniasmT/4DoWzfU7\\nFm8y9vqG6uQjLidn9LVgNBhCx+PnM8I6dfFSk7gP1QoTNg7gvEuoLeXUk/UKwvXn+cN3T/kX92uW\\nvV1a3aFqBbVzKfL8Z2h4S8gteU+Q/3vM8Z9sxlKMKeNGG4IG7zyGgIqS2ivQOcfLCyZryU2TvPNS\\nw2jQofU1t3WX9+4/4bwOXNgW1RUUQnEwHnKwM0Iax94zV0EYipBhlOJyNkMpRVx7srHhK1/7Kjeu\\n3+LRvfdZXDxhftngmhotFJPlhH/yf32TT9/+FL/xa1/l0fFT3njjDXzw5EITWpuAt90+s9aSAd2N\\no0MCIkS6RTqO2dDinOXZm3fYvX6TVhoePDyk6BT0uoZ6PefgYJ9ut8/lZEnRHXJ+MUEKTaerGI97\\n3L93wnJe0in6mKxILqTokFJTR0dEMp3NqOsVXWXI0AhyhHR07YT/+Bee5b/7xU/RnR4xe/qE5Uqz\\nWHpO1pLjBuYOhMwwIif6GmSDlpChyaVEa48yIh2hvMHIkp7MaJ1kLfo8EZp3LlYczyua2iNkhiSw\\npT2vbhle38/oSZEQeyYnts2GTxqIDopYc1Ou+cr1MY9+esxJPgatCdERo8dvOjNtBLkIxBBBKASa\\nuqpQWrG9vc1HTy42R/BUBKJLYntlkrw8uJq69Dx8uEaIDBkNnU4K4xttSXb3hphMQlyxXk6pFZTz\\nCePxGK0zfFsjdJd1uSTPumihaeuGrfGA3Z0hF2eXTC7mWOc4uHFArBquXd1ntawZ9EasVhX9XsH+\\nTpfF5BLR6RO8I2686YaMED1aZgihkDIFxrXOM1tWvP2T9xiMhty9c4eT0wvaZQ0UOB9YV47WevJO\\nB2EUUmosTaJhxUiuEodXSEUt04LJ2gbnckaDLqfnp5sTlKXb6eCD2wBW/Ma5k7KWkqvKEr1AYpBu\\nRdSaY9nnDx41DF7cRbk5A79CDwYsfaTvKg5ihZOSuLOLXi8QMgffIKND2xVSQH8Azk8phCTrpPTS\\n5YNzhDEURhONxseKdjgm749RXhBchfM1rmnoRI2UyQXcVCXLKZh+ATdf4R+/d8o3768o+89RycEt\\nTSAAACAASURBVJLaWpZNnd6bd8TYIJQiBgu65VOvvMwGLPv/en3CGUuJyxjIN5J7R0Cio0mfgJZM\\nVjWPZ/DytR6hKYlYep2cuIDXtOVJHXnUTFn1xsSVoMDyC59+nnzYY9ApcFFjXUaWpw/m6v42kGQW\\n6zxRY1557RVefPFZvv+db/Lwwx/jZEQamWZuGu7ff8Dho0Ne/6Uv8Ju//jXeffcdHnzwiIqWsq4x\\nnS4xy6iamqpcIo3Bi0h0CQesnUdLGA0GfO7upxmMxrz943e5uFjwyqdvY92M0WjAoDfk4nxKWTeM\\nxrs8evgEYzRaQtuUrJYLjOqBNLjoENrgpaCKa6wUrF1Faxt6yqC1xjnoKMjLGd/49AF/91fuMpx+\\nxPnRIatVZFY5FjVMVoGSjEYIaCNSB0x0ZNExyAQDqenoiClAZJAjyL1GGlj7gpkb8517h3xv5pkU\\nMAkgZI+x7jCWDhdWfHjR0rUt6qBgu6vxoUxdkG+ShMmkWGTjLnltuMc7Q8235pZ5twcqon1NCAJh\\neiAc0pfU3tDamvF4CE5gW0e/P8TkIoGJVUTLDehEepRwCAHdnqHINaYwPPvssyyXC7rdHgcHe9TN\\nCutqnHPM5yu2tvpkpqBa17hWcH5ygrqhWVdr2qrGtp7dnQOcrQnecnJ8zosv3OWluwXvf/gBy8WE\\nnSu7dLpDHj08ghDodbrsjEccPTmnkw94cP+MuvU4pzbRzRYhIp1uJ72utUil0ULTtJZlBT96+x2u\\nbI24uFjiAhQdBd5yenZO0eknSnxbkWUZOsuSW6ptMZnC1hahUv6UUoroPXkmsc5SlRVCJqNIYxui\\nj5gsSdcsgBCpuw/J+oAqEBsJWsDS5gVvLD2DezN+5+6Aa+sJuYz0+nvU6xodG/JQE6slWksyKfG2\\nRm4gL41vMUISWktuDHJjwR3IZGKTMS3c7GpGi6YQIkFufCAKjTJ9otLYtmY1m1E1kI+GtPsv8o/f\\nPuebj2ZMi11KV+NUSdVGnNsgD+OmWAqF7CYH3rsf3OfuS7f/vXXsE7skyTeYPDwblFoUhCCQMolk\\nWw1vn5V89mCHHVGDXVDoMbbX4bWw5sEuPJ1sCrKPNKsV+3u7dLtd3KrCRJJGUyjqWLFeLZFG0nqB\\nUYogEj6nWwi+9PovENo5//SP/hWLtqXXzQnBYZSiaRp+8Kd/yv7WNl/5+m/wS599nW//6Ls8vf+E\\nsizR0rC0JV5FlBJ4EpZL1A23dnep5he8dPs5hllOpjRnp6fs7F3FR0ddl2xvPUOn0+Odd9/nytXr\\nPHj4iCgkdd1y8+YeD+99iG+TK6ZTdHCxpZUGISxNVVM3DfPlihyF3jAiM6Pp+pIvHgz4e19+na3y\\niMvTY47PFrR1h0d1RVVpFk7TmhylQeLIaemqyHZXs1VotnNN1zhUF6RWaAudNrKO8Kg75vffPOXP\\nZp5QwFqAKApKKxhoiVjPOOgJbm/3iMFzPHd0ZGSvkzBzmU+awybPqZyjGx1X7SVfvjLi7UXJPKbY\\njEKI1JViEr/TpxW61hlVWZPlilVZMVYFg16PZVnjo8d6Dx729jvs7e1Q5FDkGiEjncGAvb0uTZu6\\nsSAv6PQ1PdFhPp8zHGmmFyvK0lEuHJ2iT2563L79DIeHD9BK0+sNOD8/4/zilP3dMet1zeHhKdev\\nX2cxX/DVr3+Zy+WMDx/cR+CZXkzw3YK9cZfjxxd0eztEW+BakCKFaskIMXgiNSGmCG7bOMgzhNSU\\ntSVbrPmzH/wFnd6Aw8NjtDScnk+olqt05CYQRdJPbo16FMqwdDXdQtMqmC/mKKlQArb3d9jf2+fR\\no0cbQprBh9R5ys1MJ0RB9MndtHl4aXyCriR+a8K5xODQgzFvzCbsPVzyn76wDbMJRdPQHV5j1UJB\\noBfX1DUpiTSCjZGgJB6FsJJCJUF83KQiGKWTCW0DmQ7e05tf0DjHuqmRUtLt9UDmLFc1TQkh9Ogd\\n7DMb7PF//OSMf31iWQ1v0PiW2JbU3hKi2uzyPFiQKiMqCUGxtg24yPS8+rl17JMtosHihMJ7kboS\\nkj3LISHUCBlxRcHby5J7jWFkDIO6RqoaO9xm5+SQX7055szOuD+fsVvArbu7/Ldffo1hs2Q5OUOL\\nDnP/hJgXkCv6wx6V92TFgCImXmWmEzUK7bn9zBW+8qVf4h/+3j9LSxBpiC6QAzoG5pfn/KPf/Qe8\\n8PxdvvK1L7G6u2RrOEJvEGwxeCrr8A6ciOx0O5Q4nnvlLnpQkA87HJ6doouctl2zWrRoY+h0OqzX\\na7rdPuW64ezsAiEio9GAi/NLppcrsqyLlJK6bZEGbJQEm6DJ9XKJDG6DWjN08oyub3hpJPjv/+av\\ncV2umN5/yuXJnCZ0mFSRo1hQRs3USxZ1i44tzxSBg1HG9ZFh1M/oZZKeEqkLyBUuOmgtqpmjh/v8\\n0Tsf8e0LmBWajoZYO1R0xNrSzSJXgU+ZyJ3c4KxAREd0ieXphKfYxEi3UUOeE8sF/djwwmjEjQIO\\nsTReoqXCePmzfE6dFSAkzrWgFG0TcJknyzV5ZpgtVyChKGAwKHju+Wtc2RsTQpnErMEiOop5eUFV\\nr4hBMBiMcI1jvZ6RZwVa5WSZQ5gCiWe9Kjm4ug3CsyynbG/tIbVhsVozGo1obKSuwHrJn/7593nx\\n7gs8fHzI8dlTdna2uKgu2B5lXL+yT6bS/HtrvM/52eMUylYobEj6TW0UwXtCSG5Tk2cEFxAKhBQs\\nqzXH55c8f+c2BwcH3L/3HoNej1vPHFDWDatqkzoQoSpLCq3pGEORGWKUSJkjo2V/e5v9vZ00r5di\\n4x4M4DboESVRQhJiREiZYlQ8CCVROtK6FUoYWqUwOrnU1i4iO9t8+3hKP3N84+YOej1BhlPy0T5O\\nDlh6iUzEQiQRpTfMDAdRCnwQCCkIMcECrQcjk2PR2pYoIqFeUllHVBkhL6iagF9dsp4tiWaIObjD\\nQznkn7zxiB+e1lzmI1Z1Dd4hrKPGo9GIAK71RJ9mxLW1OGexzqJzaOv/gFF4H0c0aK3BBqQIBJ2n\\noDYRidFToXiK5ntHa159fohe1CAqfNFQZJrrbcN/fm3EfL/hpZdvs7W1zY3pR3QO36Oztw/DAkwX\\nrGRV1VweT7EiR5qKKrZokaNHfVwzRYkGWy5gVVE4ICYRr/Gk6FgtEzRawEfvf8jjp+/x6qufpSsK\\nVnWZRtJSJb96BIvHlisu1ivqfuTzz32OZeZ5eHGIN4J+HnHOcfv2LWzrubyc0u0PePL0nKpqMBkI\\nmfP48VNEyJBag4iE4NGqg7QN3kNbQagi/cJQNTVeK7RtORAtf/vX/gov7WVM377H4nxBvcyZVJJT\\n5zkOfR5eLrlwBqFzDmQkCzUvbmn2ihopa6LIcV7QOotb+2S/iwmI/Sju8OPzM2qgihCsI0PgnCZX\\nEVWX3OzDy/tbXM0yyjqgVEHbrmhtTt5vcB785kambTfxvtARaz5ztc9PH60oeztYl5Tw3ULT1qno\\naiXQukNTVyBSNpRzDc88ex2RJT96f9BhvDOgU4CPK6Dh2sFOQrxJSVN7fNtBSsPZyYrxVh+kZrFY\\nkZk+WV5webGk0+nQG0kQNUfHj1EqYzQecnFxngoegunlkhjh8PgUrVJk68nJKc5GtNS8+MJtRHBs\\n94ZU5ZpJb8G1G1tMLufcf3SGFJ5hr8d80SCMIbhEeQpOpVwBKfE+eeu9c1wuV3zwwYe8cOdZvvE3\\n/jp721u8f+9Djo7P0dMly2qNbywx5NRNjTI55xczpDJ4BIPcsLc9ptfNaeqWQa9D0zasViVKm8Su\\nUArnP04OTSKxECMKQYeAE34jUuvho2Sj0WIlDLG3xx88ndD6yG/e2mUnzGD6EDXYw5k+StmkNPEt\\nhTQEW6PY4DFlSmzVKTQBQaQWgSjSz3jv8a6ha3ooWVDZyHI6Q1QN48GIdnyNP1t4fv/DD/hobRDd\\nHaytsG0DGGRrNh20wtkmwVi0JOBp2gVOgTEwHhfcub3/c8vYJ1pEQ0wZPik+N0BUeJ/EwDqmpUYt\\nFba/y/cPT/ja1R5XOhrpHbpd0hrNrrWMY41VEXN8SHt2wpOP7vPoX/8z5v0+iyvPcpbtsnP9Lq+9\\n+hkO9rfpDnvQHYHOsdMli/Nz8o7DU9EsF0yPjxnpPC23iOSknW74OFAMQWZyGtvyxg/e4I0fvIWN\\nAmFy6rokCpUkOQKa6Cgd9HZ32b5xlacnp6yaisFgjMQzGm0zGu6AsGRFDkJRrRuklBgjOD45pFrX\\nFHpASin3dPodqtqS+QZXw3LaYlSPYKs06xOeXu34+hc+w1devk157wdcHj2lWQumdcaJExx5z+NZ\\nzaUyLPMuwVr6dcP2TsGo8PSkp/XQ0iT3TwQp9eYI6JDG877NeLghOYnGoYqMVgYaKZB1Q9fAF175\\nFOP1JVsDzWjcBeEI6/TYCVIssQ8KEzwJ25zcOjJY7oz7XKXmobUsRYZUDhMrhILGazKRzi4mz8B7\\n2jYdf7d3eujOFYQImAIiLSZL4O1uT9M0JUJGrE02T616BC/Y3RnjQ02ea6y1bG33yEyX8dYAby1C\\nDIgxUtctw9E+8+mMF158gT/98+/RGY7p9PoorXFNjVSO5XqFlBopPW1leXRxwgvP3qQq1zx68IRn\\nP/UCq9WCpl2TaRAyUjcVQsrksFGS8DFqn0Tvl3+JRFXXNbPg+ODePcCxtT3kxrWrZFqRZxp9LliF\\nGuc9WVagld4kRMTUgFwdM+wXTCYX7O1d4frVK1ycnxOcRyiFkgbbJsDKx1HPWis+DscrBGilsZBm\\n9F7/DMPqZcNSSXxnyL+4LFn4Jd+4M+IZVRMX5yhVkQ8zTLfAkkOMm1TQgla4Tfy0oIggnAMREUbh\\noyRah5E5plsgSotdzWl8RBYdBjefYeIyvn3/hG9dNDxmDN0taFuaZp12FcIQiwIZamyT7g18ouFX\\n1Kgu7OzldPsFO+M+Rffnm+c/0SLqken2iAkSGASEGJFR4IKEEBAmo42KM1HwrcdTrt7eZt+eMYwN\\nPivIo8fGiBOak8kSkRXsOk93muDL93/6hP/zYcmx77PT6/HSjREvv/ocrfHkwzv8wutf5FMvf4pe\\nr0uzWDC/nHB+fp6G2RiQCVXhcUQfETEQUVjp8SIdf/wmobSsaxCaoCQuAs6jFdy6usWrt59nr+jz\\nkydvstXr0x/0KS+P2d2+kzaJQbG9e4X333tAxDIc9gmxYXo5RyqD0BolBSrLAXDekjlHtaoQCILM\\nUJsFTFavefHGHn/7P/lrNI9+yPzxfWJZc7HWPHCKJxjeu6xZ0MFKiW8W5NayW0RuXh8TshnVhp9p\\nhECJSJRsyEgeTaIiPSpnzCHJrSRE2xBMKqq9PIKDoQl0C4/uC7JBH0FNto6wWuGjxgqIwpEHT7Yh\\ngjQiQVxudwXPdeFJ01IXBUZrTKwxMtJu+Aq2aVI6pIQs76BNJMsDW1mGzgU21DSNp9vv0OsMePr0\\nMdn+FfCS5XLBzRvPsF7XKZrGJQLTfD6n08k5Pn/MsNcnRk3TOrxTBE+CvGRpfuZdZO/KNirrMLlc\\nMJ1P6fcKlImU60tu33oerTNOjp6iRU65sqznU1596fN87913OT+bMZ1VjMc9Dq7e5Kfv30OJJNNr\\nbJOSQ5VDiKSxTb7axPrTSuNcZFlZHjw+ZF2W/MbXv8qtZ27y4x//hK7Jmc1Kjk4vQSrKKhkHruzu\\nYoxiPBxQVVXqeCUolSJNpE4OHbVB7Sf0yiZTJUZigCwzuLVAmTTCSkF+kH3cbMgaCPg8ZyL6fM86\\nzn664jduj3h90EEvLmi9Qrg+GIMuCjAZwUdEVGRG4q1PYXpdiQ+Wum0wSpNlAlu3VPMG2dbI4Bnu\\nHLAeHfD9S8d3Dqe8u1Ysu1fwXuMaS1XXOAxBsSH7L8AFNJFIoKoreuM+d+7comVGfzunyA2x9Sz+\\nQ9aJCkzSoHiL05KoASeRUYHP8CaxJYWIWFPwR09n3L16wJeKEderOVo6yBRtSHatpXeYKLERhjEw\\naCw3qoZnKtAm0s7mdK52OBhEfvj+n/PW+/+G/+nv/88Md3e4eX2Hq+Muy3nJfFEmUbFPtk2HS5lm\\nUqBDKpCW1DG3zqGUxvqGqFWy1XkLJk+5P85zY7zHfm8Lv6igatna79MbdNnOrmNUpFwvERjWlWc2\\nn6ONIDOSy0mFsym0TOiUyJkXBRezswRJqFPAW0K+5/gg6MSMXR34u7/9DfLqnMP77xCnU6oaTlp4\\nqgw/OJkxlxrjIsIIekTy2jMGulnA6RSqZ1eOTGgy7Ygmbma+EhVBKYcQNRKoZEMrNHoDF9YiEpqP\\na27LcGtIb7uD7IKOmgKPLxtK30Noh5QNJoKOUCuNF5Bbx7iteH7Y53uXjmhEkn7H5NUvCSgtQJgU\\n5esbhIC6LrFOMN7OUDnMlgvGvQ51tWY+vURGRZH3eXJyicfy8NGHZJnBmIx12dLrjdga7zKdXaA2\\nX17CS5raMr1MD9N4PKa1JV05pKoatrZ2Ob04x9qaq1e3KDKBFJ6d8TbTySmz2RIpDN1CsZhXHOzd\\n5Ox8yWLR4EL6fQjD9Wv7PHx4j3XtcRtgufyYphJCErv7yMeZMyLmKK1Zr0uUdNT1Cf/yW9/hr//V\\nX+f1z7/GZHLJe/ce4oXi9HICCnqDgr3dEQLH5XxGDIGyaugsFlxMZszXNXmRE2Kkrus0QkKhdVKr\\nKJEIVELCKoL2GkRA4RIFXuQoCTEInE97jVorjkQP39ll8eCE45Hj12/fYLejmC4W+GVNr5P0tpmW\\nFJkhrJKN2pMWmCCILrBqVyk0TwpyMUDt7BLHY346t/zxXzzlRws47u2x7OXQWqjXCCROC1ZtTmwC\\n+JpMtYSoUSJQrSqyooPFoXLFlYM9LmZPkaHLs7dv8/jhRz+3jn2ynagXJP6Sx6v0ganQkoc85YWH\\nAJsjXmUds/6Y3337Ede++Cz9rMK1IckklEK0Dd0ciqIhUwUWRXCOW9s5v7Pd5XsfzfjxSWSrB9X6\\ngpH2XNkdczKZs54t+IvLC94OyVdtlCbDEH4WHwHSR6yCIAXeJ1KvjxJlCly0rGLEizQLxegUoxg9\\nRa65eftZusMRH97/gPH+VbJuj+PzM27v7NDrd7E+oHXB06cnOOfwsSZ6x2yyQGCIAoSI9Ic9rBes\\n6xatPNO6JaV1OXIJWnTR1vO1/+iL/Mprr/LoD/4+q6OPiB7Ooua41dxfLnmwiiy78BwKJxQBRzfC\\nlaFgf9RjS1u0sGkbT2JbBgNERfSSGB2Wlju7ffriNIF4pUNJaF1KUcpjhQcaFIvGslfkCGYIOyPY\\nJG+SVqDkhu9I+j4NEqKIFIBqKp4bb9G5vMDoFLIng07HWhFo2xYlDTH6TXRFpKlrYiwYDMY4sWYk\\nurTWEmJLUWTcuvkcT54ccnBwDWs8R0dHJEGpYTjsU67WxGAosi2stbS1QilF1gnsXDFY29C4JW1r\\nUapDU1tsdDRNxf7+kCu7exBbXF2zu7NFWzuKLKeqGubzlv61HS4u5xiR0x0pOr0+8/mCvd0x166O\\nyLSklWC9SnCUDRA4xAQSJooERfHJEuqcR+uc5aqiWxiODy/4h//o9/it3/w6zz33HNsH1wnie5xO\\nJwgV6RaGvJBMTieYbERd1+SdDlXd8OToCGM0cWPzRIkUXZKlFN62XlH0OgxHIyanJykbLAS0Somr\\neJvGWhhc1Cj6BC+wHnShOa8b9HCf79o133+75Iu78Mozz3LdCHy9RIopoV5SLhbkAprN/RAEiKhR\\nMqfT6RN6OaFjqPQOb01WfO+tp7x32VLpHr43phaGumqIziN9IAaL84qIJniBqgLSOWyhkVKS5QVS\\nKjwwXcwx24buIEcQePjwPnnW+7l17BMW26eaE5Ui+rQYoE3gXxQEBMpHdEyd0cJZHkb4X956zO98\\n5ha35AzRNmQxMDaQiTQayNoVXiroabRouEHD33x5xEsv5FwOc+azGcIa4vyCbQXrIImiAJ1uCNEI\\nMq2oNyNzEQXSC7yHRtiU+OhB6w5VW7HyHp//5XeWmGo+eravXiEf9bmoSx6cnTLe32F+fkqWZRzs\\n7WGto25bQgg8PTrEuZp+P0tWz3KNVnmiWmkIInI2Oce1HiccdVujJfSlphMiypbc3hnz3/zWV+Cj\\ndwmnx8gmchlzHjaCk5BzOK1Ze5i0joOoKfoDgvf0Ddza3WYgIrlU9Po5jVwRgk+4NFWghEarlE1k\\no+EVXfBsAY8s1Lmi9KCjQUeJyTR5cATTJ3YjNkZ6wiNcg4jQRkUuLEIEvAYvN3tGKZEiYBQo17LX\\n1wzxFMHiUKiNg0ZLjVIK72LCqKkc13hq7alry3w+Z/tKD2082iqKokCLApSkbRuWS0F3PGBneMBs\\nNsdaSVAeLXLWizXWepo6cuPGDdbNkk6noOgoslzT6w44O7tgflwzXy0YjHtkWcag22Mxn7A9HLIu\\nLUePj8lMQW5yut0B09mCyeUEJRVCwHi/YLlcsm0KlGkIseLOneu89dZDnE2nCxE1Dkd0AaEjQiRi\\ngpQCF8E5S1EUQCC4wGxZAn3+t9/7Q1577fO89tprLNdLXLPGBc/u1nOUy4qqSQGAQmfkWcZHTw8p\\ny5asKGg3aRIpNRWsTcucLDeMB326ueE8JihJ9A4VPw4i8FiRqNYhSlBFYgILQaxKOgVMlmumnS3i\\n+AbV8hE/+NETbhr47JUxt7b32d/aJ5cO5yqSqk2TmR62hVXjqbXmuK6499EhP1485cQWnIoBy2KH\\nXGfk0RGaEhU9a5/2F3iFr1OWVoyghGbc2+XIL/FtQycvEBi898ynC+7cfQaRRbaHW5wfz1jX9c+t\\nY59oEc2Epo020fqcQDq1YT5Wm7WDRlCglKKuS/Jueph/uKgJD1f8DwewleXExmIUjNUm1A9wMkFJ\\ngtxIRNycK/kOKLiYrGiDxCxquha8gJDlNN6hpUBqifUWoVKCYwiSlg20F5U25EKwan3iMm5YmnWT\\nAsq8CylHBzi4tk9/1Of8ckJr2w142jAejvCupm49RWfIoqwY7wxZLRLbUqFx1mNUuhGcl0ymFywX\\nFwn/1YIONVrn2ABCaQq/4j/78qtc69cc/dmf0ZRLrC+YNRlTK/lwsqTqFHSiYOwjNgY6RLK25nZf\\ncWtokM0KKz30t8kJxHZNGzxe2QTkDSCDABe5FS/50nXNW/ccC1tAbMBEXLOmcZGiD3lXsn99jPNz\\nZNYn857QrFn5FSPhsVLgNmg5pUAKmZJSJWgV6WnHjjF0moDVChkcSI2WBVCjtUQGiVE5bVsmAH5U\\nxCiZTRdIbUGCEBKlJavVnJ2dXabTKYdPzxgMBmRZTq/XodvtcnJyRsQjJegMFssJg2FB0csIsSHG\\nwGIxZzDoY1xO0evjo6OtaqaXF/SLnEzkjLu7aJ1xdHqMNgbvHSF4ZMdg2xVNU7E6NgwGAxpbMegP\\nUTLS7WS0Dooso7abJiNCUDFh3hAokg3UbrbmbgO8CSHgApzPluzt7/HR8TmH3/wmH773LvU68tyt\\nA27fusUbb7wJseDscsru7g6HZxOOTmb0BpsCqgxSCvxmwdS26XVGgz4IweVsQgwWr9OJQAYFaFAf\\nL1Qt+DQr9THRs5SBsrJ0Oh1E9NhqxqHoMRgazuqKtx7OCG9fsl0Y9re6DLqartH0CgWULErLZFUz\\ns56FczRkrDo71FJgVY/gJc26pcVhZZNwhyrH12n6EQVga2J0tJlg1dH4lceGlkwUpCAdiXQt7WLF\\naEvRzNYUIud8tvi5dewTLaK5yRIhPYDwijyk5YkXJRGHosCFiA4icUZ9SxCBRafg2+eWL1zOef2l\\nnG2jEU4nJqn0idgTJRqJkxovLE3wZAgGNtJOF9TdnF//7Ev8xdMZPzmpqBvo6g7WtngliEaREcF7\\nquixqERFj5LoAzY6KgxaSIigHfQAV7v0LU6kP+pw9eCAUafH4/c+pOMNi7MJo50xN69eYzxQ5JXg\\nfF5R1zUIT12vGXZHLJclJpebFElBRFCuFnT7OW37fzP3Jj22ZfeV3283p7v33Cb6iBcvX5MNM8kk\\npUxSEilZFEvVwCXBE8MoowBP/RE898fwB6iBh2VAsGFPClaVXJZQjVgqikoyme1ror1xm9Of3Xmw\\nb6ZUgMUpeUbvAQG8ePfcs8/ea63/b4H1sSE1ivwzRmv5zuU5f/w736H9yV/QrL6gtYbW5tQ7WFcD\\ntRT0aUZqJUdDwOnYtXSu4XuPjng2S5loi59OGYNE7oP7qfBY0eBwqKBIXIb0mrS+4gdvfoP/437L\\nq9qhc4VzO2ZTSLbw/I05l2czigJSSoLMqDY1Y7Vjkir0CLFuQ+BEQBCziiZI3H5SRQXL4XRCtnUE\\nNLiAUAIhdMS46TzS9JMMO/YEH3vfg4/H3sPDQ0Y7sF5v8AYeXTzh+tVtrL0YOuaznF3V7kcfHUJa\\njo6OCMFT1xuKCfTjGvoCpVKCD9R1Td/fMU9LsklKCHB0dAQhNrN+Wb2kUDOUyjiYHbGu1xg8s+WM\\nJJX0aU8uCh7WGmcTBJ7FbMlHP/trNg8Dz54sefFiA0LhhEfsjbwkkXtwSSRYkex1ZxzeOwgCrTO6\\n0fLy9R2bqqba1UwTODsuef70Ka9fvKbedSido/OU7a7h6uqafJIyjBa9Ny77wSKVIgyWLNWUZcl8\\nsSBYR1e3KKnolSdFoZwgoPBfA2XHuLAEQaYim7U3GpWVeCuYNltOspFKzDFpgivmuMkBobzgpQso\\n50maOMeosSRJihUZlZoR0gzvU4Z2IJgRpQO5GyiqAWkTuiKnVgk2TchswNu4jngFtjcINeALzV22\\nod+M0RDFMp+XrFYPLI4KLg7PyCYx/vjiYU1E/fz91692J5pN0L3Zd6BYBtkRxAhSIkgj01H29MGh\\nyPAui2VTYgTd8T/pA/7hdcL/cJTwe/lAblYxQ5ZCr6aMYkZiDXnYovOUOwX9LIWJ5GImsJKhQwAA\\nIABJREFU+H35Gf/Nk8BNOfB/38H/eQc36RI7Brw1VFhGERfT3Fs6aemUprchZnN09180RLkANhXg\\nHamFk1zx7GxGMpe8bLZkqmSZTHl+eYEb7tipMw4OltytH6jXd+RpzunimNvVil3fopIClEAQqexJ\\nkiM9OFOT5TAkjm6Muth0qPlnP/iAeXvD9mcfMa47Oj1lPVny+arjJSlXfkevB6YSJonhk2zGW+2O\\n//4s4/vFjqneUec9k1yg/BSR5HRygifqXMLCSA/hHoBVCo/7F/zP31nyv/zkhv+tApsdI7c1f3TQ\\n8z++N+Ht5EswOQcHl3B7j71/xVzHaZeqBOkVS6cQcsRnliAsqRNoA6MEJy2HmaA0Bqcn+KzEaksI\\nNaXSDL4jJJpNtyGVRYQHG8fTp6dsdp+QC8WbT97gkyAZRoM1O549PqB+2DFf5Oy2DQoBTjNJZlSh\\nIwmOcbRoFLN8xmK24IsXX5CkirNHJ0yCipKTUSQiQfoR249YE/ChZN331LpisZDYYMnnCaLrmeUJ\\naTrBMEVKyeygYr3dMvaGv/rPH/GwqymXp8yKCXnVY7cD0gm8gXI+R4SAD5bRRdZtQh5XURF5mcJH\\neHEiFQmBfl2TAvP5kvfe+zY3q3vu7m8YMCQaLqfH/PwXn0dpKpUE7YmWqSRFIV2EpOcJTBNN31qC\\nlFTOoVNFMYAUAqt05CkAIkicj6OkIYSYwFGxHTYMO9CKMc1YM8HbFlkbhMhipxYx1L/vroxdakKh\\nTTyK+xDwQ4fzDukkXiRYa+mUoJ9m2NGiE0/uM1KTMg4jXluGvsZjEcrFrVnIETvHUNecP36MsTU6\\n3XD22PD+b73D5dtv8LPPP6IeVoxpR6+rX7qO/UoX0eVRTtXeg4lABBwokmjcfI2OEYDF7YuqgDjb\\nKgULAp+8vOVfXsP6yZIPzy85kjuSYUdqG6a2ofDR4VwNMBaSahyZpgnzAKmDvh44mi94a3aAaq5o\\nWoNSmmAcMknwITAIgbPQWMe2j0ebqcoZXIRxyD0CDyVRQuHweAaeP3+Lspxzc3OLkopUpgjhCCHq\\nWEEKrq6usNYSQqBtWxKd0bYNWVbgEHv0mEAg4hfWGqyzOOcIQ0ImNBPlePdswvfePMe9+ITtw5qh\\nd4Qs52FXY7ygrjcIYTGtgmJGLzXv1jt+43zO+fkhYm4ZVEM+TcGPKD0jBIWSEhkcyvUoZ/HOYkPK\\n6EecyxBCMZ9Ifudpycuf1FTNPT96VvDPPnybt08Ds0Shsznbly/o19fkKXgkyst4a4VAiP//+oXY\\ncgCpTAi+BfagxODBx5ZNlGIwA96CTPLY5a5jBcry6JjNwx3zWcvJ0QmbbUVeZDjn2dVb8oNj2jbu\\nyib5hDxLOb84paoqfIBu2/DwYDk4PmZeloxupN62CC1Yzg9JrWRX3VJXPZNpiRQa7z2qYp/3NGg9\\nYbep8NYz9G10hX1gMikAxcHyBNX2tN1I6TRD3+CloSw0prP0HZTzGVp7+r5DJbHLSUiJ2pf/OOf3\\n0SCB2Oe9Minj3HmADz58j7aruL5+idCaIo/a8Mcvb9g5h8hTgo4dZ86HGDyUDo8m0WmEtKgMKRyb\\nzQMJAf1f3LKAc1GC+epSSuGCBeEIPmL0lBRIoQjeR6QhHmcjWcqLgPcDzg+xzWBfzapkghACJdx+\\nl7uX1MjwvkIneexOcpLgE5xx+DBixipmmhOJtGBtIM1y7BCz1HqSMz9UHB3kFFmOsx3Pnr/FO+89\\n5ovrz5lOFdttRSbhe9/51i9dx36li+hsDqfnJS9f3yFIkMiIL0MifcCH+CVRe2EoiKhLBmLDZDL2\\nuDLnx73hk083fHtj+YNHOd+a55yYnmRP8TEWdgJ2QrLtR8LoKZxi2/XkAZq+4eftwFU10E8KlIck\\nyxE4WuMZncOMDkPsbgFFHzyJyr4OQ8fvlIhirAtkOuPs7Iz5fM5/+Ju/wdnA5CBFjh1plpCmGc44\\n2qHn5n71dUjZC+jajtGCzPI4ySNjsRrAMIw457HOkdslhQ5Mmzv+0e+8z7mqWH/5C0zXE1zGrrE8\\ntAOv654xkciQkjmBaQLaaX6UwffPCx6f5CT+Aa0DhcixIQU5RwRLgiPIEWEahO9QASwFQ5gjkJix\\nJ6HhN481z37/gIzANw9LlnrN1GjoC7r1PfXdNcXUQhIwvaPQSYSHixAXUuKC6UVcCIR0SE9sCMjj\\ny2z/CRExwXGWfr89jia2G0iyCUjPp19+wdl5zvLghO2m4fHjp1R1z8PDmnlZMuBoH1ZorfBe0PYN\\ns8WMLJ9GJmnV0nQVYs/PDAHefv4Ot7d3GGvozYgNA8Erjo6XFPkS6wK73YbJNGe+yDHGstttIuc1\\nyZimOcNo4imn2nB8fMr9wzoyQ63l0cUp8+WMf//vfsysXLKYLvni81vKQlO3G6RyDOarzyEal0KA\\nkOrrplLnHOzbTp8+e8y33nuHu5srXl9dgYiGXECx2zTcbjvSTCCVYAwuat1foavjoDrGKZIkJ/g9\\nitBGTJ9yEISIR/7wFTwW/FfbyETHfyvE7HfwsdUqiK9QQ/HnvIvushAWwYCnwwePEikhJJGHJjxW\\nObSO9yE4GbGWWu3pXRlKK6w3WDMymA4tIMtT2mr8usF1tAYXGg6PTvjND36DUT9w/folz588psg1\\nSlh+8tP/l0k54enTJ/h+x9nxMYezg1+6jv1qj/Oq5/R4StO2PKx6tEqjm0fEn8U/qUjXDoIgwMuA\\n9xLv9maOSjHllMoKNtuOLx7u+fYSvnkCz+clS63IUsGDgiorqCuD6wV6MuMh6XB1z4OFa5tSScPG\\nBoIdOC1zAoqxb2jHAEQ4BHhciKaRcW2MP4SAYMT6gFeRwbZclCwPJmyrBzabDXk+J3jH4dEMvMMa\\n2O4q+n4gyzJ22xotJavbO6RMSDSxtVLE7bfznuA8fd/jw4i3HutnaFdxkTv+8L3H2JsvabdrjIdm\\nsKyqipaUjZBstCTonHK0TIaRo2LKH1zCW8eWefiUMhlJE0XfT5lcvAPOg98gfI0IIy6YrzcBAY/y\\nEqtgkimGekshFFppToqCotpRzFKG2tJv1gxVTSocqY/RvTwVCBMbO/3+vyiIoW4lVOwwkvHvwjty\\nLZD4KG2IaOwlUtAPliRT0XF1xGkoN6L1lOOzE6r6GpznYLrEDoHgYFYuqfodpxfn3N9tyLKMspyx\\nXC65ubnh9vaWk5MTsoni6bNHJDrj1atrLs7OcKPFjTFOdXR0wubhniRJ0SpjvV7RtB1FMSHROTrT\\njOOG2WzG8+dP2azXCCEYB8l201GkBUU5xRI11ul8SpZIqvWGJ48uWa93zOcJ4tkheTZlvVG8en2D\\n3uv1QiqcHfaxM3BhT5/nK4KV5/TsgqqJ6LzDoyOyrKDpI/CmrqPjnCgFRPq+JOqzUkVKPMA4GqS1\\nlEpjTJx11yJ2G6H37M340CKFwHmHEDIW7lkbT5j7K3iHQ3ydMLBWR/izH1BaoFRMWkilEELjjETK\\nOKcvZex/8oB1nuBHhBMoFYE0/VBFULuPv4/Mc5pm5PhoibE9s2WOTgKOgrfePeb4XHLX93zwg7cp\\nk5Rmt6XaPuBdy3x6wHIyIfGeqUx5dHD8S9exX23EyQ+4IXB6uKCpBsZ96yJCoPaGzb6gECdCtNFF\\nHIED8DrDOBt7G3XOOJnxpVHc1BV/tgkss4bz2YSTqefkIOOt0wVmc4+XBV92sC6WuKxnLeHjLnDd\\nO7bpgDE9Q+gpy5LZdMFsktD0PfXQERTxaGEDUkM5i1Mepg8MAyjp8EJwen5CWRY0bVwol4c5iJHF\\n8mA/+ysIQJqmPDw8sNvtKMs5u6rCOBthxFISorNEcJZ+GDBmjMPE3hMyj+i3fO+9Yy7SQH/1QD0O\\nVC6wHR3GKpySbPyILZeYpudMKo5tx/fP5rz79pIyaymTMZKfFCQHj2B5AfUW+lXstfEGpwU+UQgR\\nkXK56CPZh0CxmOHbkS6dcl8bqt7RdA6ROLRqSWUEjQgnmGQZMYlvUXJP5hExiyH2FTEeHydoBGjc\\nvkY7rrZhD+CQXqJ0hrFDbLH0juAdk0mK1pq6rlA6Y73esburub66Z7qYc3B+RLO+wnpHNpnQdS2H\\nkyOaoeHk4ojZwZRXr14xzSdorWi7mkePzpEovvzyFc4GxtHy5ecvyJOC25tb8iLhzTffZDBXdF1L\\n3xvOzs7Q6ZSu23G/MqRZhOyUsymTaYpzASkdRydTHj1eoFTCzz76nKGL2vebT99gt3vgrTeXaF3y\\nsLqBAMEl+7C5Axcf3xAijd3vnxUZPCHAX/7H/4zSYJ2mbixponDWUW8bUAmZNAgXJ5+yNMpoxgxx\\nBDIEhAgoLRFpQOeCurEgMtAqRrCsRUm13xELJGofS4r1MdZ6tAal94t+iDqp9SPBKvBpzKPG12WU\\n8UjxTkZTLVi+bmn1IGWC9Q4bYqcXJm5YrB2wvid4SwiCJJngHRSTKcuDJR/94sf8w//6nzL4DVIb\\nzh8dsd295PhkzsPdNRUC4QLr1Zrl/JCj2TH3V/ecLs959uhNjhe/xotomZdUZsBJyenxIS9ePwAO\\nqTKEkgQbXVsCeOvjw+Vib24sWbZkxHyoY6BXkk4l9BwhAmyE5sthgPs1HxjHW+9NcWHNCsNPPvmS\\nnQFCpM8/eGgQeK9wUkCZE/KMxCWk5CSpRozQmA43BNJUQaJQKou/XypICYwGCIH5dIrWmtWmjlrM\\n2KMTj3Ut88UydiQlKXYYaZsYeK52Vdxpehm/eCIuoH4/qxzhCez1JUmiHbmy/PY3HsP2mnqzpXWa\\ntTO0VmBGh1SeqYC6rcitY1HDHz6FHz6VLKYemStqVVKRk599k5P3vo+7XxG6FVK2SNHHTjevEV4h\\ngtu7xfEoqZXGmsBxLrkyDXlegE/YVC2LSSCdSUKAzkHmEgqZY4NH5QZhwQRAuoh/E/FxkjI+hEqC\\n3rdsir1ILgSoEB9IGSLdZxgGcHZP4OnpupRni2dUzQ3F7AAlNGmacLNZ8c5vvstgO65fv6IsDpmU\\nc7p+ZL2+5/TshDzPefLkDe7u7ilnOUJ6vLP8/OOPkSKha3ouHz1ltVrRdjvmswlIwTD0jP0Qu96d\\np6ofyKcFSZ4xnU6ZTqc4NzIMlnJeMo6G3WbDRKf0A6xWG5RKOFwueXh44NXLDeeXJdvqJc+ff5Pf\\n++F3+dN//VesVn1cRAVonfydpyl8Lfs4DzhFNw6EPjDJc6qmQYaG0VhsgESNZEmGsw7vszh6mcTV\\nynqPcjHmVU4Tjo4LhGwRvqHMs6jNsscM7nmeQijM/lifqXiM1/vx0a/weSGEeOQPHmtsrEnfXxFd\\nsxe1ZCCIASmjiBUpbznG+qiHC4sPI0oV+BBfTn0vUWkRKWemRynPH/7Bj/joZz/mD//RBzx764iP\\nP7tGace2usF5y9WXO5rdjm+9+03GpodZIE9ztuuKrhuY5BOapufTX/xH/vi/+/vXsV/pIprIgsVs\\nillvOZjNqec9VTfifKT7hP0OJebNArj4ZpNu/2GnFuUEei+GuwyGqI6TeYExFhJFMcs5ubhABEk3\\n9Ly2Pb9QIJIlY+gwfqTr4xinsQaVJSASnBckREiu9QNpoZDFBNtrpIMgE4ZhRBBQKuPwKKVrPENn\\nCcHjEVzdrDg+PGG92aJzyaRIUUrQNANCJ3z6xWcgBIlOuGtWgCRNU5wPcarXxmkV4wxmNCilENKT\\nKEXS9zxdprx1NMU/fEFfVRivaS3sjCUIzUGa8LyDR8pxPIP3n6X84OmM06IiT2ATEqryKWe/99+S\\nvfV9aCqah/+LTPQ4DEJpAg5lA9qO4OM5wHkixs450iJjKTyJ8+yGljDN8XjyZESGgBEClUwgibso\\npSRdH5hGO/fr47wM4L46aXwlEouANTYyHtXfnkLwCjeOUcKLs5GMWISUJEmGEinnJ4/Zru8QMrAb\\nWhZHS/7m5z9DioCUMlZgS8murjE+8ItPP2cyyTlcLhBKMJgRnWWooDg7O6GuWx4/esx8OkOEkftN\\nx6RIWK8rvvzyBbPZjMPDA5CeYezBD3jrSZOC66sVk8mE5XIBwhPCgFQe5xybdU2SFFgBCMe0zJBK\\nUTc7slzTj1v6vuI7v/GEzz674cWrW0JQhMFjQuwk88HF6VD+9qOLR2NBN8aR2DxJOFqWTMsp3lnM\\n6GgaS99btnUXM7YiEB07OJwXLBcZy2kM3B9NEgZj6W2DIMT+jf0VIMpae03bWvP1vfJfsY73xrAU\\nKkLPx8iaUDL5Wq4TMhCN5NilFQvyNMFbXPBfuw9BSFA9xgqk1UidIqSk6zdcXC75gz/8Laxd893f\\nfYYPA82wppwVMf9NzMAGC6nOmRQzNnc7mqZnMTuKunIYeVivMdZTZL/GRXWrzY5ZuSTNMtabmkcX\\np9zerVhXNdZ5nI+OX4A9QSm6h9FGDPQqkOiMYASj8YhERVfSO/IgKBNB7wxJMBxPcky1IeBYDwNN\\nofCmQOiMYWioxxpFIFOxDTRVMa1vXKCXZh/eBYInSxOm2RQvHV1fQ7D0Q8/ycMHJSUnoHfNZTtu2\\nSJUwupE8V1xeHkeu5P09hIK6N1gT6OqG+XwRNR1nY6+NzGI+NAS8CwTrMdaSaUXwgSAC09Hy/sUp\\nR8ritysYBuwg6EdFb0ALzSJ4/vjtcya55WyecVSA8CuC6hnsnGS+4MkHP4KTd6grj6oq5FAjhyaW\\ngEmN9ArNGLnZQiBkGneG3kCSUA2GoRuRAUohGIVDzAAT0IkCCrrBMZkCssV5Sz4pwMSJJS/+9sH/\\nu1fYm3ZjiMMNQUTdTfg4gKClQshA7TxKQZZOCd5T7xqqdc28PGQ+X2JCz/3NHXp2SNM1zPIpB4sl\\nVTswn8/JKWi6hryYMJ2VjNZinWc6K2irlnbo0anmyZNLEpWxXq9JM813P/wdrq+vqaqOg3LB2cU5\\nWks2uzVCgvee7faOtm0oipTdbs20zCnLCV988Sl5lpBnJctFQd85pOzQWaAoc07Pjnh4uGcwPYdH\\nh8gkY/2wBXXA4yeH/Pgv/4Z1G0dtUbF+3IV9UsTHbb3Scm/oxKmi3o48O33KD3/4uzRVzd3Ln1M1\\nI/cPDXf3FV0/4Pe9WLnSHCwWzKeadlNxeHJIkc/5659+DIBFxGO3BE9Ah5ia0DpF6tiW6YxFqsgA\\n3d/R/T0NCB8NLal0dH3YTxSJ+LRbG0d8nQOdOJyMCRaQKJHjfAaiIggYbM2kLJDacHw55b/64W9y\\ncpqx3ULdbPE+ULcV1zf3HB4exU60UaHTCfPZIZttQ90PnJxd8PrqirPTU3xwPLo8oyxL3Fcg6r/n\\n+tUW1ZmeZnONJiHLFN71nJ4copTi9mFDkCF6sQoSleKF30eJophuvKQJjkCswxjHiKrL0iJSeWSE\\n2078wKJIaKsHzGAZR4UIKWkyxWEIoY+DSFrgnQWrkINHBM/gDC5JUNMUO7aEvifROYtpQXJo2D1U\\nzBdzvCrjwuAgdTnzZUZvevq+Z7o4YDnPKMsCYwyTSUnfCm5vrmmbFu/iHLgxcVrEjoFsEsdMg3NY\\n7xjGASkj+k1IUFJQmIbfePpNxHaLrTvCCGbwGCMISoC1HE80zzLDQdqjTYVOBHoKqsgR2SPyaUnz\\n8X/CP7So5QXU90yrK0SzBe9iPa6Q0QGK23KCjHquNwUPVcMoFdN5GQvLXErwEh+6uHuw+99XBLpu\\nQ5YSFxgCWkRJJvrAX6Xa4oO270TDipjLdUjCXsZwpgM0zts9ICPuVgSCYjpjV1X8px//lN4+543H\\nhwgE5bzEuoFimvNwt+KNi0tcMIx2ZLfbkaYJKlHstjVZltH1LUlS4EKMGPXtwHq74fb6Fik1zlhu\\n7zq0ljx/9ian56dcX19zfb1isThAK8GmeuD87AKlY5tlkk2ZzVPW61sOj5aY4SsNL6NpdpSLnGKi\\nkYnkdh0734NI2VY9VX3FbDbh4tGMNJny4sXHdJ3F7inVSikmSYnZVxqH/WvJ2hGNisxeHD/76FM2\\nDxUffPgBf/SPf5eqbrld7fg3//Yvublr6FvPMECaaryH21VNtd2x62GxXND7QGyKTxC4/cjt/h4I\\nhdYJUsWdow8OETSjGVEyIrrkXp6KEkAa269tDzrWRCc6wXuBVtkekhynBuN4a0rfR1lPqVgplJeC\\np8+ecPn0kKTwLJYF6/U195spr1++hACL+QKtCggKrXKapqOuBr68e0GqNYnSPHl8yd16w3q35fjk\\nEK1hOi14ffWCk7NfY0300TfOqTYVwsHmfosMCWKAd54/I7hPuFmtcEJigovMSqEROo70OTzCKLyS\\ndLYnVylpIgleMTjwaYoXisT3KK3JUkW/sziZ0TWWlCkjHVIKxsHi/N5NFDDLE6xpyZMElWfsrMEM\\nnozYcjgrAxfHU+p8TTGZMSlSnPA8bLdcnj6h8JplOaHrR3Z1x8HJCUO3RoTZvrdpivcDq9t7sjxH\\nprDd7rDGonSCzpIIfsg0rY3ZTO98hNMK0EIhCVwuLOdThe863J7r2Y8e4wRaSzLlKdOBiZAkocEB\\nnYdkFCQoDFCohkJaZPVz6F5AV8P2BYwbsAMqEHcLRU4Y+khLFyBQ3Ox68nLB6ckBQ99iraAzimZT\\nkQmBFNANgWGocUA5iw2iVklG60mRIDRBWoKPRHMBIOMRPwiwUlEbj9EpHtBEM8M7EXt5rCVVaTTc\\nUkUIgrod2d6umB/NWRxMyIvAcjHnbnvHOI7oNOXl1SvK+QFtv2O0HSEItFdkRc7t7Q2PHz2hqlum\\nxQShUrI8xmqCl2w2G9z+BZOkBZvdjqrdUJYz5ouS1foBgLKck2WaXfXAtMyZTHLqekff9yRJyvHx\\ncXzhW4tMLG23ZdcaJuUUFyzWw2BGxiqmArQeefTogIe7O377t77J7/3ggl3V8tFHv+D6+oEs0/h6\\nZAwWa/eFiSKW31lroyzmBFdX99zf/ynblxN+53e/z/M3n3P7UPHq5Z/TtDHDvFiW1G1D2xhcSNm2\\njtZv4zQZmuAUWtqozyJJtEYKgdZRDzXOolWUb9Ik3f+cw+wjUInS+JDhXcTUBGtj35oX4DUocMRB\\nHOnBWoE1EknAsMWz47vffZuj0wXzpaLqbpkfLvjy5c8gRKiO1BnNtmU6UaTphM2mpiganLMcH5+g\\nZlPMMLKYTXDWkBUpF5eXzMoF83KGGUeUkgzdr3E9SH6oSaczPvv4C0Y/UkiwxvOwuufp5WNG49js\\ndmitGZzDGEOWZBjrkYkmdzEmIxJFUIHRjdFuEhrjMlAJyvQsFjmLyYJ7cUcrHJUxWBGQesCh6AbD\\ndD6jHyuWiym5ViRS0+1qcq3wfU+eF3zvw2/z+HTOqxefcfl4wUevV/T9QD90nD9+BNueqtoi9Zxk\\nmfHp568wNjrws+khzvaIPCPPc1Z2h0404zCymM3o+3tUmsTdlzUsDue4IDCNxZnYdKkgjpjq6NZ/\\n4xhOc8fw0NEbTeMUrY2THUo48sRQ5AlKO6wEG+cZUE6RWIWyLcFlBJHAsIVmTeh3uH4FIepoSu0l\\nMmPjZjTJCKLk5q5idnzG8mhOt7mja2u8sWiVcZgKmmogOFBSkyjLvExjhE3G1k2hA3Tma0pRDN7L\\n+JbYP2jWx6rk+36EbBbJ6tZEzY2AwTI68N6RCYX2MJvOWG1W9Bb+6q8/ZnaY894758yXM+4fbrBm\\nJM+mLGbHGGdjL73em1ZE/NuTJ8/ouo4kSblbrUiSHCEE5XzBzd09pxfncWfnBNY6Pv/8s8hsEJKD\\nwyVSC7bbHTe3L5lOp5jRolRGomPra9uPHJUlw9Dx2WefsDxcMpnkPD59zGazIQhJmhc8rHcIJXDO\\nxZpsVfLRX/+U6STn8vIRq82OflhzeTnjww/fxRjBn/3Zv6c3PYkWJE7RW0uqcqyLAy15InDGcnZ2\\nwr/76Zd8dvev+OHv/5Crmw3bqgelKBcFk3nJ/d09TgaM8/RtwzxdMJ0UbDdtBPUIsTePPN47kjQD\\nIbBmz6BQar94xh2xUjFoL6SMbaZaRaPIKZRKGHpDnmeoJGEYW3QiI0nLCLTM6YcRnY28//45z986\\n5Y1nR+x2Owbb4ULgxZdXeKnxITCOhiRT6FzRdhVVVXF5ecnhcgFAVW8RNpAoSdP0ZInm9v6Ok8US\\nOzqWixlXV6/I0py++zVu+zx+tGS92vDWe0+4+vyG+1cbEnLaxiGl5PRwQZpKblcrlAzITEc3EYF3\\nkHuLDBov4hvbOkOi4hHCYQiDRFjDYX5EpuPxfmMDtRD0yqJCT9s6UIIkTylnhxwsc9586w2k8ly9\\n/BIdUuyLGy7fOOb11S84efQub33whLHrmE4nzGdTHtYrut6wPFqSoUmcgpBgBuh6wzAYFtOU5XLC\\nwfKIrvVUVYXpx8hmFPG4ZY3HWMdkNiPLUtbbGmtMfAC8R8iAFqB8wFjP+0so7Ya26+mlZmctfZAI\\nlRDcQKYgS/e68t7hlihSkZCqHMQWI5aMPkcCeugIYxt7xff3aBL4Sq5CS43IZ9xvFH7+lOUbM3b3\\n91ihEFpzONHIoQepKdyUVzc16TQ2NsrgyXTCaL8KhhqQCVJJQhDEjESswRD7f9146ETCQ9vhsiSO\\nAzvABcxXMlUISCRai/0YBnSDJZBR9wOff3bFG48O0KljXi54efWKWXmA9wGlYDqdxaoJ5/AOsiwB\\nH80EIRRmdLx6/TrqZA6Wh8fc3FxzdHTMrEyQVvHk+WOUSql2DTf3N+x2G4zpmc5LrHGgNLtqAKkZ\\nho7ziwv6oWYYBx49fkTXddzdrWiHkdlsRtu3dIOhnMWxVJHEe5gWAiUSRICPPvqIyXzJwVHBYrHg\\n6sUVD5uKd9454rk74eNPXnN7M6AV2LHHWABL8IJEKu7ur+mc5sWV4V/+yb+JPfQOHp3POLs45v5u\\nTWd6hNZMpxOqXcXV9Q1axugdrifeShVjUCKaWFonWDugdcIwtES1O/ydJIEDGe/W1y7vAAAgAElE\\nQVSw6zuUjvP+1lrKcolWKYPpMcaAUFFPFZZsEjg7mPPtDx+zOPRkk5HV5nPW2xZrBMvlKf0YGPsO\\nIT1G9EwmBbN5QpFOQIwILHWzww4D19dX3O1qzk5PKMsZQ1PTVTWTs3PyLEMhECEwKxf82b/9f37p\\nOvYrXUQ3D2u8dwy2Z3E6Iy1yXn9+gyAwho5sOuUgUaRJwrrasKlatIzAB+c9fQJahn1GEJKkQASL\\nGQbsPuRrR8vRIqFvVwyuZ9P31NYwaNB2pDceIRVdsyNfJjysVkxnjvM3Tnnr/Se41vDo8ohu6BFF\\nxsNwS7NTJCgOTjPabct8ntH0a0gEWVKidE7TNFR1xaQouL+/58mjt3DOUVUVdeXou5E0TZjkBc2u\\npq4qAgIpUqSQWOtpqgpjovsPXy2CQIg8qfemkNUVlRmwQOscXmrEngKVakmaKLSwEeLi9qESGXAh\\noEKD8Amuj5W4susIXUuQgtFBKqMLr4xDyCQK8oPitna8/6M/gNd/ziAE2dE5Ymxpbl9QWovrLcbk\\nkJe0I2TKkxUZ1hnyLEckEmshyAgTIRCZoHvzCPZ6aIDWJeycwKgEpQTKeOLAYNzBKgRponFuoJjk\\ndH2DMX+bHX71ckXfBsqZotpUlJM5Wmqcc8ynM6qqYuwHQoDz83NCENxc33FxccHt7T0+BCbTfJ/R\\nrUmSDKQgyRKEyqh26+jmOsu6WTF2PZeXj6nrhvv7FUfLI6RUlLPJHieX4YOJo4yZpuk7tC5IM4X0\\nCjNaJIGjgxltbzg6XKKTOPq8nE8xQ87mvuby8pLOBBIJXbNlcZAzmSaMo+Pg8CJSqPQt9/dNLHmL\\nW0e0VDg7Yo1FkONcYOyjrb9cplw+Pufq6ob1Jo5UhhCoqi0IjdY51noQPmZIpcJ5S3CKIME7i9oj\\n8Zyz+wU1biLEV1xUAtgINyn2CD9jW45PjmP1Sjfw6OKML77oCc4xmJq3333M2+9ckk8co7/n6fP3\\nqJstt6vAxfkxH//iY65vXiG0YlrmnJwcsrq7odruSJSkPFgyKxNUSLi9vuPo6IRyMuXs/Ji6a0hV\\nIC2m9NWG3W7DNE/BWaSUDMPAxeWjX7qO/UoX0furFcfHx1RNzTgOHB4e8zR/zM//5jOk1FycPaLe\\n7GiqgdPjY+Yzw3q9pTUe52FIM3zfo4SIxpOPzqRkglYFwTu07Dg5LOmaDYPp2dY9dR/raI0d0UKD\\nGzlYznj25iFFfoTSnrG7Y1Iecb+7ZpItCQk0/YYiTUh8jkxydrsrTo4u+PnPb5idljxsb7ASqhqO\\nL54zGMNgPMcnM4Z2oJhp+qFFiJxhsCQqIQRB0zYAJEmKkgnbaotoWlozxKme/ZFIeZBKgncUWcpZ\\nmSGNJViBGT0hSIIUWCfIk5RMjWQKpIxMVulACAcoeh+nVJLgSIcdqVAwjoQ9zTzxKUrL/fE5null\\nUnC33VEuzkB27O5uyeeHNGbk/OQ89vN0hjA6BuKGszMOmZdsnOM4UUhpAY3yKgJEZaynFSRIKXFf\\nLagBkIqqN7QBrNQo1H4RcHgk2km8gDHEh1rmCRaPEJJM5wxDjw2WP//zv+Sf/NEPECrHmZ71asXT\\nN57QDiPeQ5YULJdLzGDw3rNczCjylCxVGGMx1lI3PYvlAcMwsDhY4PG0vUOnBalyaBWBqEql1LuG\\n6WzB0eEZdbMhSQRZIdjttvHE4UdGO9KNA2Ve0o8DR0fH1LsVIkhSldC1DYlKkVrEBtm+YYejyAoO\\nDg4wxiOsJc+nBAx921JOc26bO3720V/R954nj485OT7mF5+8ousseVrQd+PXUaREWpSC4Eakhrod\\n+fhnH1NVjmwSq0+MHRhGSzmL5q3zlpFY+Znt2Q7WRXdrMc2YZDlt0+CDRypJP/RotaezEc3DPM/J\\n0hw/eozpOT9fxupvM/CbH36bv/rxT+iHLTqF7//ee/z2D77FYO45PpmRZo/55NPPybMpbz35NiIJ\\n+zK9nqqtMcaw2a5JdAa5pN5uSXXKbvOAEoqzkwOm04K2SkkSmKscITxdX1FMc+bzGWmacnt7S5CR\\ndZyXs1+6jv1KF9H2wfLl5hXFImU6V4TMRlLOm8d8/jcvEK8F54fnzOcz7m9XJFnOs6dPeNhsafuB\\nqhtwCCbFFKFSmqYjEJNIvYmu5DLPOShm+O2aQEJje1KpcVaSlxneCAyOs7M5J49mPHlywJPTM15+\\n/hmfXb9k8A19bynSnCLTLPIpXTUip5qmqfH9PceHj3iob5EqHssFOU094h2kRay50yrdU9ENeMF6\\ntSEkikk+jflPofaTTJZUp3T9uD+mKnozRoLPfpfmCczKknTS03VjpM0PHuE8nuieS+nIhEULcIx0\\nMqCDQ0JskBQO53O0BRliJjUEiRMJYnSo4BmNQSgokmjYCCUJQ8fFmeb2r/8VuZNkwSKCoX39GX6w\\nDORI7fFdR2JBJzkrn/Affr7ij3/0lFxsEXbEixzF/rgmw9cNbMITM7YeEJr7TcuARmY5wRtECDhv\\nsV6S7KMnw9AzLRN0Cv3YMQxjnMhRE+zQ0/WBu1VMewQvyHROvdrRE1mZeZ6z21V7CtJAWc7YrleM\\nYzSc0kwjVcCHkXboKMspD9sVF4/e4PrqhjRNkAqyIuf+/p5JXiJVoDcdSRZ3x1IqjAlfI/eKokCm\\nOeMw0A81m2rg6GBJojLqumYxmWKcYX4wox8MfT/SVAHhQEqPThRqjJlqCYymZ+gbDg/mnJ6est7U\\nrNY1QTk++OA5bWd59cVtROZZwWhC5MPGoR/CXvvetQ4hYWxHlHQR4mGge6gRCsoyp6r3couzMXmh\\nIFGSNEuYziZU7Y5h8Jhx3+a515rtPoz/zW+9T5Hn/PQnf0E2Sfjwu++TpilSav7kf/8TNlvL+bng\\nn/zT3+f4YopOKiazCdZ6rl5fk6op8/kBm+0tozN88fJT0lQhtOLu7o7LyycsyyU3V7d88933aZsd\\n1XrD8cGSp8+est1uOT6eoYqMz758wePLNyh9YOhGvBO03cjdasPT50+5vb8laMUvu36li6hpHMZ3\\nTJYZUguSiaaqW/JFzpvfehs1pHzx2eeEFo6Pj9lud7z+4kuMCCyWB1wuz+iGmtZZ7qsOEyyF/KqR\\n0yNGx0lZkLnoYSBznO+Yz0ucgVGNKAtnF2e8/c4bPIwveH27o7l9zXtvvkk+1byqNvzss8+xaHI0\\n83RKf9tzeHBIszinXgEhYZIfk0wXpGNKWixpG0eqS7yMWVatU5bLgk21palGynlJO450XYeScUJp\\ntB6dJvG3F5AkSUS7NQ7t9wCb4JA+MMkLbAJj5WPlQYjD5h4QCQRrSVTcMRgRGPyeiBSgCA4ceKkw\\nfYhsTjSoGDmRwwYVwCfglcKMYwzWty2ZhNRsyJt7prN3wA5M3A7b1qQBenLM6MgB6WFHzyd3G356\\nAxefvuIfvHcIbiTolOD7aCaFOL8N0WAKIcacXHCs6xoTZsgkgcFA8HgfsM6gArRDj9IKlaQUsxnb\\nq1eREOQcxkdtvW56Vg87zi+X1NWA846H3T1iuoxpCWGYlgVKCdJ0zurhFq0TJnlOPw5sNiuSJCVJ\\nUw6Pltze3qKThLq9xfiKRM6ZTmcYY5lOC7JUMfQdZjCk6YQ8m7LZNZTlIcb0uDCQT6eMtQHZM5un\\nWFPzsOpYlCeM/YDEozNFcCNd2zH0EVB3e9swm2VMpgopA8Y2jP3ItCg4Oo4jxbuqRmnL2fmMM5Fx\\nt6rIpxnfeOcHXF+t+PRnX5BkOZtthfUj77z3LuXskH/9p3/B0Nt9j1XAjQ6B58Nvfodnzx9R91uC\\nHPjF519ye78CSnbbmiTRKK2o6orDo0Pmszkbt6GpG6x1DIOLI9wZWAuLRcnDwwMXlwvyPOe73/sO\\n3in+xb/4X9Ey45//839AOqk5OrUcngTa1rDbDmTJkll5gpCWPE35+Sc/pulHHl08ohsMQiW8+40z\\nxq6n6zrOT48jBNoGkmWKVoLDgyOCH6l2N9hEcnJ6yqbeUeQzkjQnjI6A5M2336GqKsr5gqr/NXbn\\nx7KL6H+f0e86xrFBaTgoc+rQsR5uKJ8E+nZg1VxxP/YU5SFd3XP34gW5vefkbMmT54849Ibd5v9j\\n7j16ZcvONL1nr7W23+Hj+GvypmFmkcmqapbvVqEBCdIf0FTD/mEC1IKkiQYaCdBEVYAEqYyKRSbJ\\ndDfz2mPDx/bL9WAfsiclTrNieHFwBxHnfLH2+t73ebaMRYwwjlfv3tJQMTst0KJH24Cq7xGZJI0U\\nxhomwTk7ccfe33K/7Ti5WlBVJW9Xd7zZH3j65IJJnvPByRLdGfCKu/WOdF5wYM/h2EDgObY7ZvMp\\nSZ5iVgaB5lCv0UrTty3KFKTO4nVEoArCIiAuNsjeE8Yhu6PEdRKQWA/W9ShpCD30ZYOyDAT4QJBg\\nKdoDP0nGjE3LsTP0BhoiGpFgfTQ8tnsznLREgux7pB18jWRDgDnyAWlgqR3YaPDN572hO3Y4l1Da\\ngVUQuI4oURgNopXkTmEOBi8SxKjhWDVIB7b2OBtSGXDJGNuUONFya3L+5m1FGSb83cuYv3j+Ialc\\n0YUtmU9QbYsioA8z9vTQt4QWeqe4Vkt+Xt7CeExsPJgQTU5p14iwoxy6hSRBwCyOUaanLksC4TGy\\nRUqJQGJdgmkyRB+SxAIHJMUS37WMi5yyrDgeLVJKnOtI0ohABbR9R1bk1J0mK6aD60dIZKLo+gbR\\ne2bL5YC/C4efl7Gg7itGoxHhNMM5T9e0nJ2m9H1LpEAEOfX+iDcDK7S2gixb0tuObdmSpimEEXXb\\ns9lt0VrTdS1nZ+fkeULV1IguIQ1CmkaTj6aoSHH9sGE8HXN32CNEOCDm+pbZKKWtGkzzjtNpwLO/\\nfsJht2d9CFkuLvjRR0/oO8fdS8nrdy2GmLYNsEoRq56b6lvScsv5eUGSx5w8v2K9SvmnX7VoygFE\\n3iqCQBI7gQhBjBOu73pkCJcfTslHQ7vp/ct7hOx49nTB9ftf8td//V+RFpr/+D/+D0RTw5//9AlX\\nnyiy9IRRnrJ+WLG+X+GlITvpB5h23/Obl7/C5oqTaUbXbIjjkNE0wld7Prp8xt2+5M3DhrpxXGUL\\nLA1/94t/5OmPPiHJZkzUju9ev2WxWHI5GrM77FFZQno64fb+AV1ZrDGENqLT3e+dYz/oEAVI0wjv\\ne4LAkSUJdVOy2+0QwZCVxAWczE84iJ5xvmC7qlienRCrM3wTcH19w9/8zd+RzhWTYgJK87PPf0o2\\nzbh7eMXzD84pioLV9XtEEvLkRU4bjri7XbO622PQ/PGPP6aYDG/GKMkZPZuyXm9Yr9fctBXz+RSp\\nQnTncN4zmU3ZbnY4Z5hNpxyqPW3bcnJ+ynF3GARqMqfXhiRNkZHEWEvXdZRNRW8GnF4URcOJ5ljS\\ndR6ZhDj72NowHu0M/aPvJAjEoIZ4rEgmUYKzId4ZDBIXCBwC13ukGvzwQlmM7SnUcH8mVABmwNBF\\nNkD3miga6DzOwb6HTg9LKf9olfQGrLN4IVDekEiPshbRtLz7vuRiElHfraED7YZ7L6UaDk2LDcd8\\ntbLcW9DCcLPrWLWeZ4uMJNK4NkSEFhFoAhxK+8frBTg6wZ2GHWo4tfqWSHiMNQReDD3+YNCwCBUh\\nw0Gm1jYdgYoI8FjnEEpQlge22xXTpcXRkuZD62icpGy3G4piRBiGaD1kJNM04ViXOOMxxhLHEc70\\nHKojo/GE+XhO3/d0tkHrwbm1rjcoJSnyjOl0yn6zJcpy+r5FKclms6HrWq4unnA8PrqrnCBJQrJs\\nSl1WzGdThBhoWKvVmr4f0hvj8Zi2TWialqqqSdOMpuqxYlABZ+Oc+/Vq+HyrivFkwuFQESrJbr/n\\n8vwJ2hrub2+Jw5goCinygpGMOFQ1X3/3EufgJ3/4GTJ5x+1DiVTD8uv0bME4l7S2oRhfcr++I5AC\\nE8BHz0/YFLBd7fDG8+/+8k95+d1XfPXyPR+8mPIHn58yXU74+NMXbLZ3rO9XyBdTZjNJmgouLv+K\\n8WROfawRznIxH/Fv/+SnnF7O+Pk//wPv6p58NCIZFQSBYzo9oW8b2n1L5ELWmxKnDJ998hFSBtzd\\n3XI2P+O7N2952O45ND3Pf3xFEkZY4Tg9mRG4lv1xz7dvXuLzFB8r3t7fUNUVQRXR391yv92ge8Ny\\nvODJ+VOkiv//Bxg/dE40iYhigXOWYjShLA+kYT5sLqWiuCro6pa6bpnNcj784CO22y1pmPLq9Xeo\\nIuFCFmh/4OLpc16/es/doeQfv/gn/ujffMx4esbJPON4OGCFoJMt4+UIbwym31N2LXHiyfKY6WTQ\\np65XG6zXTIsJxTjn1zc3WDxpmqJkTDFOKcs9WR6T2oi2rUiSBJEo3r27pjAZUgh6awiVIpCe+WI2\\nxC60ZjZb8Osvv+d4qJmOQvb7HdZaZBzjjEOEAqfNIIvS9pEPBx5JIAOc10ggixTORGiv0YGnl57O\\nW7QLkMai4mHjqrB4bQcGaxhDVlD3LeM4IVSGrikRwmCsp+7ABSldY4g8hCIY6DvOYqVDhWC8xfYB\\nroPNUdG8u+dJAb4HbyyhEuiuhVDxzuT843rHjU/JBByd4eg8OpSDD4kLZGiwgcZZS+wCws6gNVRB\\nxNdHWAVTbJwgvEZi6awGAoQfACtKDvGa+XzBodxj3FARVnE66ETQoGC2LJCSQTbY9cxmE6QVzOcL\\nnDNU9YE4Gaq2dV3T1xrjHWenE5KkY73dUKQJXdty3JeMxyNs57nf3JHnBXGskEGIUiG67X4H2W6a\\nhlCGhMlwN24cTMZzttsto2LQ0Thr0Kbj5mYI7HvvyfOCMFQUxYjNZkeWZRwOJZPJbMBAqgDrWsaz\\nMffbFcWkYH/Y0zqDlBIVhmR5zrGsuL2/YZSPObu6Yv2worU9u9t3NFYNGQclCaVkvX/P6UWGiD11\\n25EkCVJ4FosRfXvk3e01VV3SW0+SpkSi4cMP5hSfP+H84im/+s3XrLv3PPlE8eLTE/JRgZBA8IBS\\nB5YnEaMi4NMfnw1/91pxdnpB1zR8+qMXfPDBOZNRxJuXX3EynVFFPXWnOT09ReuO19+8YTGf4jpP\\nKiKeLS754IPnHI9HMI7Ix1RVy+ZwJIwSorJnked89+1LLi/Oubw8Y5bmHDb3iFFEKwJq07O8PKfo\\nOrblgePhwOXlJaa3ZConS1P6QP/eOfaDDlHnewh6pPDUxwPb9Z7Li0tMr0mKEI8hiENm0wm7zYbb\\n+5dkcYSlZTRR4D1hlFGMn+MDSf6TD6gOHbGKqPojRegYjWLq7YFOCYqzBc00xraKptH0znMyTQYa\\nkgppyobQD5i1clvirOf58w8J44A0i+k7jekd2+2O2WxGWR6Yj2c44HgsCQLBobKchlO8tzhrmU3n\\nVNWR02zCerPieL+mqTVhGBOGIdN4jFBrtHEDYMEPrY++tUghQMnfcSKBga5jB1KOsxaHxUiP1gE9\\noAOPVAzvjbYkQU6v4JBP+OfNnq++XdFqOJ/3/DiEj06m5P0WFQwQ5M61WASlcbjOkEYSiR8Yn1NF\\nL0G7ECFj0vGI8mbNqpZkjzg60fYIFbFyKX93e+SLbcsuyQk9GA11f8SHGYHKsU1CELQMWghLjCfo\\nDK6DRub8Zqs5FktQMbHpwGl6Z/GPUODGukESmA1Ais32ONwny+Axs+8QWIppxGiaMFvmvH+/xQeS\\nsjySBBlJYgjE8CgPMJlMeP/ulqIYczweef/+hsViRhINiD17HPz1WMdoPmW5OH8M6VfkqQTr6PuW\\nosjou47ZbEYcxqzXW9I0w1mPCTyjyZyuPTwCOwKiKEZKRSgkeV7g3NDSM33PbDxBSklxltIZR1VV\\nOOdJ8+R3yuO6Hv6tb+uhdqokD6t7mqbG+4AiKGi6inScUmQ5fd+zOWi8M4g4ZDwZYR6jS6fnGUGQ\\nU1U11jq2u1tGo4JWa6IkZZIP/NXMSkToyKcp3735NbtmzU9/9ilpESOlp2l3XJ1cEkqHEDnr+x1F\\npqjbNSIMmaRX6PZIFCo++/EL2r7k7fu3jEY5t9e3/MGPfoJ3EmMM376+IYtjZKAIEMRJxmfPP+S7\\n96/QWpOqCGE8RjvCvGB7v2Ycp7i2xwdQ9T3L5Smbuw0iiAknC/arO6LFEmsNDw8PaGdQXuC6Hjpo\\n7AEtE04W5793jv2gQzQIJJNRwW63RfeeNE6oyoqT+Zy23ZNnOYeqIg4jilFCWx+QoSBLE1Q45lhq\\nptOUzWpD39QslufsUoUME54/P2X18tdDtjdJEOMxOpRor/jHf/iS/dZweh7zkx9/TNPuqI+a5WJG\\nGFRUtSVUCUme40OLCTq6Vg9SPR8wmuZo1xNHijCUtGZYYKRphtdQ1Q1NY3DeY0yPtQLnDVmWoRuP\\nMx1945CTnEYPvWCLIAiCxxrc8BLBYxsEj8MPAr5gIP1HgLDDEs374RSIBxtKrDQ406GMompiVvmU\\n/+kX3/F/vPPsAKkgWvX8NxF8erfiz88iPpxGODtYI7WzHKxBM+xyCicJsRgl8HmE8YqqMuTJA9lk\\nzt2uY5bE4Foap1i1CV/plJ+vN+xUjAkU3nSEEoytgQwRpPg4QtgEgcaaht5VqIGWxqYNeFtaOJ9B\\nwEDRt4ZusOUQGI9CgRi268fqyMN6PxCdBBhnCMMcsHz00Tna17Q9zB/vMLXraI4tdm9I05DDbjsM\\nvn6AZHddR5omVFVJU1WoUOKMY5Rl5C8+4uuvvxl0w3HI8XggL3JMZyAdFoLOWoqioDxWxGFMHKeP\\nDxeem/c3TIoJzlqiKCKfjhmPZjRNQ5FmeCxa948b/eH3LgoijHXESULbDhElISRpmlI3NVVVMx6P\\nOT1/SpKkvH93Q56mRCqiPNZEoUSHkul0iu01WTbGixqtDePxlIeHB6y3JHH8KPvzJKlCiJBRcT5E\\nosIB67ffrFHek6YFX3/7BbOzCVpbRkVB3Xa8uXnDbDalGOX85stvEF5zujzFOU8Yx9zeXvNHF5/R\\n7u6JpnOa1vLm5g193/LRxy847vb89X/xX3Pc7Pn6N18zHY9YjCaU3ZHdbs98cUJejHl49xpTt7x4\\n8YK2rGhkhMtTNm2H1hqpchaLBbe7NW9vr/nso7/mmy++4K7e02RisEtYgwsEy9mM3eHApEjpup6q\\nqnl29oRROuHF1dPfO8d+2CHqM1b3JWEskULjlSZPU4KgQ/ctN9sdRb4gDDIQIZU9EMcxUoF0jsls\\nSte0TBcjQqY4BJtjSdOX1F3O6fKcrraUnUUWM8q+4+9/8RW3Ny3L8YKPPhzjXMsoS1FKcH39nuXs\\nHBFAko7YVXu2D2vmZzOKccbLVxvaruPs7IzJZMZonFAfK87Olnzz5hVtKwj6gFRNBtSaFNzf3vN0\\n+YxDWRJFGaPRmGjdUtmKzWbH7lhhf0spwhOJAG8HWbQDtBv4kE4Mi6HgkQgnBahHfbGwELpB/ZHI\\nABkMg7UxipUa89///CX/6z1s8wJrQxSaOIHfBAqpEuztA8fK8mIxBq1pnKUXASWeqg/orCJyASGO\\nQkEaO7p9CT1kqWdrLG92nrXueF0Z3uqWr/Y77lWBCRXGO1rd4DJACFQwwHhdGiGaFBkEiE7TmgYX\\nQClSXq5aKq8IkxhtarABrQYtBFY6gs6CH/iPs+mMfTlQiFQWPaLhhrhSVgQU05S8kLS6QfiAMElR\\nNkKNhgB4FIXMlgucc6RJRtc0ZFmKUhKlJKPxcHKrymZo3kjJJx99yMPmSDaeMCkKilHG8bhHCYWM\\nBsbpcDeuCMOQPBesVzvG4ylJnJEkGU1Z07Yt5bHl+vqa2XzC7e0dn3zyMdV2j1QBSRLTWw3CkSYJ\\nUiqiJBj+/xYm0xEBHiFgPB5jmm6owvaaMAyJ4pjAOEzXMhuPUCKg7hrAMR9lZMWIt+9vUJFkOT3h\\n7u4Obx1pEnJxfoUQgt1uTxTF7DdbvO754OqSyWjE19/c8uKTP6Bujzy8uiVJC7TXTPM5oYio94a6\\nDpjNJnhC1ps9TaL5k599jjUBMoNd9cBmvSeKBZPJCbfv7vnpT37KerWjrVrGsymT2Zib2wP5qOD0\\n4pyq7vn++9dQN+RFwcnikq3fUDYPfPXld2yrI7GQGGf4h5//f1jl2R/WhLEgLhL2q9c0TjJWCmMs\\nh+09k8kUJUP2+wNpnFGkOc553r59g/D/EmPsP79+2O185wm8HegtoSMLJVkh8K6lyHNG+ZRETtms\\nj3R9hXWe6/d3jMYpRTEiigKiOOP2+g7bOObTKbNlwaE50usDk+IEs+uxMsHFOd/++j137xsipTg9\\nH/Ps4hQlDGW1IY4nKClQUYgMBXEUEnWC5WRGGiXMx3OOsxKHJclTAhzzyRTpYb/bMhmNKY81tjN0\\ntFxePiE8dLx+9y1SRAQB1HUNYch2u8e5gHLfIMMYH0i07okfF0tKDkFna4fOvGN4pP+tQ2M4eRpE\\n6FDWD+0kH5I4SYJFPuqHy3jM//nqhv/9HlZJAEGMQhE7TWAqfuVjbOmJkhHx7giu53yS03QVlfbs\\ntUW3hrUdQv6h1pwELS/GkmUMdzvY3FQcPPziFr4zsC4k9z6gTyR4RSoVreuxBmo9ZBGtz7AiRAUW\\nF0ikiwm0RRpLC7wzCV88VKjiGdJ1BNYN96Qe9FBSH1TagScKB1r89+/eDidIbX5HFSIwQ60w9Bzr\\nHYt5gQgilJIEgSdKIo7HI7tDSZ7nGOvYbDZEUUgytEyZzsaDaO3R7OV9QODs0IQpMqrjkTSLCXCc\\nnZ6y2azwHmbTBYfDniBw9EajjUdFIdrqoU/eQ9M0A3QD+OTTH3Fzc40xll/+8pePIjvP2fkpQSBo\\nmoqma/ktozNOEmQQsdvtGI3GJEmMEAFtqynbijzNCOOI6XTOer2i7zVKKVrdM5nPKMsjyzTEuY7A\\n9wRAGEouLi6w2vBwt6Lretq25bvvvufP/uzP8LojDQV5JNDHLZWtef/qPSGn8A4AACAASURBVFV1\\npOsc+JYnTy8pxhn7Q0UbeHoZEMdjvnn5Lcv5iMuLc1rdsNloOtfx9vUbvPF88OwD8jjik+cfsdvu\\nqeuW2/sbwjhkVd0hhOcvf/Zvebjf8vr1a6qjpjmWPB/N+fqLbynGEw6HHucEZ/Nz9rsHpqcnTKYF\\n28OaP/z8M27u3rNuNoxmI5Rw9McW3WlOT8+5vb2l6zWIYFgSL045PTnH9Ib399e/d479sIulzKME\\nZFmKs5oiz4dMpZAoodisS47lLXFc8OrNDX/0s8+J4oDDYUsYjTB9Sf8o6XHOE4aK9njAmZowniGj\\nEKIA22u+v7nl62/f0Wn4+OM5p1cJ81FCbzqm0yccqwPWgXGWNI3x9AOdyUr6quObX35J0zc8//gF\\n2mqcdUQixegtTdMwPztBd5rLjz/geN3y/ZvvaHREHA+Unmgyou9q+qan6zumkxlBBzebgQgklECI\\nAKc91vQEQuLtcA8qVIB7lJB5a7Fu6JU70Q/8YmdAeoLQEulBORyIhLdG8Ld3LZsYiGPoNYnpUJRI\\noEwl79uSn2ZDRs62LbWosIEk8AqhDcYYDsZS9Ya+h+8aw95JPpwv8eM5kewInOHDzxfcvDpwfb1j\\n25eMAsuIFtFLUI4shqmC2WgO4wUPpuW0u8MINZQNmobCwrVRfN1n/KZrkecjVN9g8VTeYLzFe4Mg\\nxFpFHFviMKE81pRlSactKoppO4MKJb3r+OSTH5GmEU3TA57TsxO61nB9fUuWC1QcUvY15f2KNE0f\\n4b+GqIvYVBUnyxOcBiUTAgaHehQppAxIHPhouLOL45jb2xv6Xg8JikdM/1CYiPBeUxQZ+/2BOE64\\nuX3HyfJiAHBrw/awoepKyuNhGPJdQBB4dvvDADOWAc54JpPJ4z0qwx2rCEAJVqsH0jSl73ustURR\\niO/h/e07dtvjY7hfUYxHvHnzmjwvmOQJq90OvMbjefX6W4SKiWTIZDZmt9uCCLi4Omc2H3H96lum\\nyQl9VfH+9WtuqhrnDC4A5zpMrzk/HdIqr77/mjieglRsd2s+/uQDTk6nrG6vwbfUwmN8RJqMubw8\\nZzIqSJKEL778OX3nuLp6yu6w4+LijIunT/n+9Sv+4//8v9B1Fmclk/Gc04tTwijis48/5eXb9/zB\\n5z/h4vCE0ajg+u6ah80NhAHH/X5oVzlPEMXYvqN8ODDLR0zyMcJCGkSkWUI+KvCBJERx9+6ak8WS\\n7X73e+fYDzpE87HFtA5rHWk8pusfM6EPD+RZzvPnz7i31yzPUkxwiveG9erxspuaycgzKlKqumNy\\nOjD/0jhGpbBer3h6dU6Yhnir+ObtV+RjyflkzB/8+BJUzfW71xRFgdEhQaBIk5iHh1tOTuYUxYi6\\n2Q9YLeOojg2Xlxf41rDbrrm6usQ0Bt0ZxnmObjsmeU7gNdq0pElMa0E6BWKIMxmzxxGju5YwlkQy\\nx95t8M7jxEAEUmJoyD8mm/Bi+IIw2hCHioAQJxpqbamlxwSPaDplB/2N1aQoOpFwbeF7DeQSZYcQ\\ntVEO44YP3qJoe8vZIuHH45xie4fvWxwJwiviQGGkx+A5GkvZw50M+NUbQ/VyxaJoyZYFNvLsD2+4\\neWjRvWeaKlLXEfeWKMpJhWAC/PhqyrOrZzy0hk2a86TzdMJQ93vGbYXeQymn/F9vS7bTSxKlCHWN\\ntprWGbTVpErSHBq8jAmCYXgdq5q2NQQqwHiDCCQBliyDxTIniS15vkApwX6/xmgIRQjCU2QjCBSt\\n6oiiiFjlVHWJsZYsz9lsduTZBOuHDa3RBiGgaUo64zg9PWW/37PdbDgcdiyXQwc8STKstWy3G5qu\\nG9BrUnI8HghDyenpAoce8H/KEYqAk7MFYTj8rhRFTtu2QyrjsYxR7vcQNByPB7IsJx93aG04ViVe\\nSJyQFNMJVVUhlELIoRo7P50TRQk+CLh5uCMIFZOTBSoKKeuSs4sTat1T9JbNZsdkMqZrGoxviVXM\\nJ598xG7/wOXTU55cXFHvtqRFxuV8ynI+HRTLLqCrG777/tegLJdPZnifMF+eU9U7AmH45ptfM8lH\\nLE8W9H2Fa1KCNAcL692G7/Y7JpMpu82ew9c1T58+5XR5wvZhTVe2zOdLDAGr9YYmaNFEvHr9Nbpv\\nibKcrqkpkoTvvvySeJyyPD/n7u6aIs5QhIhH4M20iJGNYDYuOBkvuLu5IZUxaZ5jjGW1uefDZx/x\\n7MNP2azWvHuz/71z7IcdoqkiSBL6LkCKmIf7W6zWTMeLR0Kag6BlMovJ8it+/k+/QciU8WhCgATf\\nsTvsiPOQwA9ytzRNOZ2dsXn/QOc60nHCzbt3nJxPeTIesZwtGM8zjpUlUzH5eII1nnfX75lMRgRB\\nQNs1OK9BeCIZIpOEgIi6bJA+oZAxkyhnc+wYpwU+djS65/nz59TrkutuRdsquiYgThPiKKXXlqwY\\ngyjIspTDYc9IxqhYEgzK+kHiZTx5klBWLcb7R02IRUpBIAKcE2ig0lArECGogCHJIAShsEhnceGI\\nu0ZTB4ALyLzAKbAqwhqHMQasQjpQ7siHV1coGdI0sOodTa2JZEAgPWkgyQzI0rI3ES+Dgl9ag7rb\\nk65LIgMzCfOi4CQB6w0iHEOokFhOTMt5AH/2k8+ZXF1h2pIRAb5ph7JSoKmNQcqEL3eCr2pBdzHD\\nY4hsj7HQaY0CVNciARM8oqV8wHa3I1ADYs94CIPByX5+OmUxz4kTKKs11luKuKDvWmSoqJqKQ3mH\\nECFFng33tAFMZgsC5zkeD5jeESeOMLB4EdDqjjCJaXrDfD6l6wYwc9N0XFxcYe2wZLy9vef8/JyT\\nk1NWqxXH44E4jkizCG0aWt1hnOX+4Uia5AgRkCUFp+dL2ranbltEoEiSBOeg6zRpNoEApEroekvi\\nPb3RpOnACSjGI+q6RqmQpmlZnMwwZiBU9UazfRxSznnavmcfSJLxiJPLC7bHLXZ/5PmLp/Stpmlq\\ninGK9560iHnY3FKkOe9XN+iyZT5bUBhLHEYQGK7f37I/bJmdzRlPsoFIZgVdWxEIzX6zZzFbIpDc\\n3D5wPO6YqBMWpwOP4O3Na+aLJWXVcPX0BXlSMM0H/u53L19T1iXFrCAZpUyXGWEck8cR99cNbd/S\\n6I63b9/zwdNn2K6nawIOh5I8zUhCh2k7RumI9d0t5faA1PDQban2JRen51RVxfX1NUmWMpsM9+O/\\n/uJXfPTiBVcX/4oBJLiUPJ8gvOarr74kDgOSJCQfS3DDPdZ0PuXd9VuiMCEfZYQqx9qWUDi6vscC\\nbX/ECDX0sQNJHKaMZxOcNJA6VBGySGaMxjne9rx7vaKzcD6JiK0BL5lPl4BhMZmR5I+ZTDd08Zuu\\nJc3TgT14HGRdoncctyV36xtmlzPGk4L9Zku7r5lPRzgtabTF60Fz3EcKawMCZ2jbBhGEjMKUKIqQ\\nbYP2gycqVgqlQpxvhgomYBmMjAJB7x2hhIeqwdoE8Simlz4i8j0hQ93SKsFde6BTgBBIa3FG0xtD\\niCRHsLfhQAFqK0RsSSYxpDHc7cliSRIqyrYnihWnKE6TiLCW/GZT0qKggMjAPMyZRSnetwRYkjCh\\n9hE+jJj4ltO+5S8/WvL555+w71pc1XCmOyQWc1jjvcFPznnjIv7v2wNluiCIQrQe8pbtIJYkQRDo\\nDikUEkGaDJzPQzlg3Lwyg2rXW6IQnj09xdkGa4ZTfhhF9KZHyIDN3RaVK7S2LBcTAgFN3ZKEMQTi\\nUZgXgxgWREEc4jCEYYRzHrzEWk3bDm0WpST7/Z4sSx85m4qHhweMGaqgWhv6vsU597srgTCIMcYO\\ncA7j8YEdrk8OB9q2YzZdPBoPLN474mQ4nY7HYyaTCW/ff0NRFOje8OzpBxz2O3AgZUiaQtdoLi4u\\nKOuK9+/fE6nokcvQIbzgZr9HyIBX76/J85xAqiFjqjwn52fYvqdqW/bHI1GSIJKQN9/fMB1NKb1F\\naMXmbkWlj2hjyGcTVJ5xu13hnGc2WuDpsbqlKEb0rcMj8H74QvAOXr76Fms7nj57wp/8mz9jNlny\\n7u0N37z8jn+6/2dOTmaMT6as3+woJDRNhbU9KrD0pPzRn/w59zd3nMyWlNs37NcbFvMpb1Y3xEVK\\nFiqkN3gZ8Ob199xvVpwvzuj2NeFkggjg/cMD69U9k+kUGSeEacLDekV7fKx7iuBfGF7/+fWDDlHb\\nRbxfr+i6jrOTGcuTAgKNEBZvPVr3eB8xGc84HI4IIVmeTNG6pdfVsL3ue+I4HqAijaFpW8bzOZ2u\\n2XQ7wlwwW84ob1bUZYXwoIIYFY/xsiTNR9THdmiqRCHalmRJyna/Yzya0vaOTjc4IB8XzMdjhHOY\\nznBY77k4vSAdx+yPB0bZmEjFiGLw2xdJOGT9bEfbdSThiPV6y2g0ZlPtsLGmezR4OmsRQhInKdba\\nAcb7WykbfqjwObAIrIq4qxtkC1iBRw1/OFrgMGgMWloOpqWT4JxGPa72A2cJvCfQFqOG7Ob5xZjx\\nLMc0O4SDOJRIa0F4wkyiYokyHRdFyui04K1b8e5dxy6Hy6TglBjpPV4kw92sl4ylwJVrTmn4qw9T\\n/su/+Iw0MmyaPUlfUrQNdCWiLKmDkHr6lF8cBH9f7lFXC5TTeK/pgdb4QXFhLdaCDTQqlkynS8q2\\nGeAp8jFLKyWYnsvzU/JMUFZ7FsmE6XROVe3RUlI3HUIF5PmYOI54eLgjjCRpnHCoSkKVUlctSZwS\\nqghjNcYZurYly0Y0TUteTOn7Eu8H6HZd18wnc6QUGGMZZTnOOVrdPjrtb2j7juVyAcBuvyYfL0mj\\nlLKskImibzus6Hn27Bn3t/ePUsOIVnQD/T4wZHmClAFNe+RkcUJT1YxHI5qyARcMYrwkIvAQhRHr\\nhwfevXvHb/GrSZiiu5ZIRMTjMdvtFucMq82OIAiIVYvWhsPuSBAEPH/xAcVoCiqiLEtGyyUijHm9\\nuiOrc6ICur6jsRpnejZ1TZJKFvMJRTZGBEdOFjPWD1u+f3NDno+ZnUw51iWh16T5iLZVOCv58lff\\nUte/5nDY87B+4PRiyeRkRN1W/OzP/5jqWFLXFdbEBM6QZDmtGbLD2vZIFbBa3XOSnHNxccG7969J\\ngzFCKuq24VBX5HGCCDxhFlHrjo9efAjW8eT5M8q6YnfYs9psOVksWd2vWa1WXPxrPol2tcX2jlAK\\nwkeKdVYM7moTWEzXUjcd09kYIQR5nuKcGT7McQ6ypzaGtrUDZstAlGZUTYX2LSK0aGFQacJsccbt\\nu7dIPGE8oSprVGj48utvKNIC0w1U/CwLKcvjMMB8TJxkiEAPedC2JilGmNZzd3fHk7Mr7vbvuNvd\\ncn55jq56JIqu6QlFiAz80INXkjgLMc1QK/ytTWg40bgh/ymHx/q+17RNPzSDAofD4KzFIAgIcIHC\\nhimbzkLbIkWECzXCKWRvUMLj1CASa83gvzEOjDcYLCiJCwbKvaLhZAw/fnGFokMqh/WaBIuKJMZ4\\nRJLQ0w3+cBqWoeDPlwnfvSt5sAlFFBNLUF6TKEFAQtAZpmbPj6Ydf/HplE8//oBsGdFt35H7FmFa\\nWquJ9mvoPF2ccy2W/G/ffcVmOicJLKKtIXDUlmFhhMQ4hwa0t6RRgIoj1jc3tKYduKQqxNmeNJE8\\ne36Bc4N8sKoqoiQmLSYcjztkqFBh8JiRHHF5ecH+sKXve/CCqqpp6o66bBlPCuTjvTRCMB6PCRgU\\nNVE0QkqF1kN5omkaxuPxIM2LY7TuaHo/eOzzlGI8IgwVZVmSpSNMZ9Bao0REEieEgaJtW7brLZFU\\nmE5T24YoinBWowOLMTVhGHJyckK53Q0KGyTV4YAxfoAbpzl5nnE47Giamg+efoAXAbvdAZxnOT0h\\nkII3q9shXiZCjoc93nsWswRtA6yAoshpOk3bO969veHs4oIodXz/6iUyVCSjBCc68smIoDds9ke6\\nriGQOa++f0ueZEyKESpQtF3P+cUlTe/YHiruH27IZcjTp0+Yzc/QCP75y0GCF8WSxeWcfBRRVg9k\\nWc7D3S3WQp6NsWEPwL5e0+01QgQY0ZNNEoLIc7e+5cPlJ3z84kMebm9xwuODmCdXZ9yv7ikbTVnX\\nTOYzvvnyK7w2FMVQcBhNJ1x9fMV+teXD5y8G+amx//IAe3z9oEM0khAkEuc9Skim4ylhFNDpBpWo\\nof6Wjbi9uR9+2VSMNZr5dEHT1MiRJIwi0jDG9Y7bh3vOL8+w3rA4XWL7jkNdUxQFM5lQHyfsVmvy\\nHI6uAh9zeXmB7R3rpkQJSZIkaG1QIgQrWd3tkArSWU48nmG05dg1xKMRgXWUhyPTiylZPGJ/PNCV\\ne7yJ0DrAaI+2LYHIieKEXjsODwcApIxIsphUZxxX3XA5j6fvO7RzdE4/mjJBeg/GDc4hKdBCsO8t\\nqw5OxgKhO5RnoPorO+imLTQ1BHGMEhaMwQEmACMHp/jJcc+ffJrw2dUpYv8aLz3OarJQ4ntLkkT0\\naAgscRoM1tGg5cfzGf/djwz/sEs4OM1B1ySBYQSg4SRL+KsXM/703JNHLUo14DW2q1H6iIw9D/2R\\nSdvTmBR78pz/992RX6wr8osXON0jfU/3qLVFDwuYzvY4qZCBJI9yej0AvT0WHyi8HcSRJ2dT8lQS\\npTFhZDmUe5RJSF1AXkxp24a0SOi15+HhniRJ6OqhtaR1x8PtGy7On1DXFWU51JNjFeK9YbVe450f\\nBqkTTKcFUoTDRlxKmqbGWoPWLVIF5Gn8+Ng/dOg7Z4eTbF5gtaHIcpq6pq0bcI44jAZRXjn08ueT\\nCWVd0Tct2ahAdw2nyxOsNnRdhzEeKSP6ftBtCCG4vr5lPC4wZoh7tbqnLI9DfTQdsXrYDdcM5yPq\\nsqU+bmmbnjwdrgtc4Lm4On0skETDXWGS0veaTjecXZ4RJSEPLx9IcomzsNntB22PDAmJmCwu8Qa8\\nk9w9rPFIDscd+6ojUAKUYDE7IU5SOu/Y7Q4UZ0uKIqfXFcbWWKHJ8hFtXeOsZz47ozcWFSmarkTm\\nkDjFYXvg2EpkJCjLI0fT8O7mHZcnF7y/vuXk7BypYm7vNhyqlkprxss525sVAZbPfvQZr159j7WO\\nq6sn/P3/83d4bfjw2YdkYcq3b1/+3jn2w+ZE25IoVRireXJ1hVCSqjrikQgF3gnqShNHOUbXmF6T\\nzUM2mx1ShFSN+R0CTrfdgLjzPbtjSaAWpFFB2x4h2FLkYwLZ8+T5FUoIRmPJalex2+2IohiHJytS\\nnFCoKKJvLEk24e3DLfNlzvGwJz6dYZzhbrtmMT/HHxtOlwuiLKGrO5SICDOFNZL16kinLWBwzuK9\\n5ng8olRO3xqCIMCYjkiFgwMbiIQa9A1RhDEg5TCIPf53vm3roXWC1vb88gD/bpaTeIO1HVYMjq8h\\nzDP87PAtOqgwIglOKOgsmYd/H8N/+4cfc55lYKbIfEb78Bs6a0hjCFSPcgKFwHd2YGYKiETDv/9w\\nzNXesu89tZvQtAYhLFenBc/Pck4yg2z3yCiFMKU7lBivCQV0+wNJV6G7njZd8KqW/O0X3zFeXqK9\\nRgT9kFbQPPp6LJ3WtN4MDqAkZZxO2R33qDBk0B0pjIXFdMqz55c43+GcHbTTDO9DWdbsDxWjIh4k\\ngE3HyWLBt99+T1O3nJyc0Hea8XjCaJyzP2yJQoUxjnK/oet65vP5wK4MLFo77u9Xjwi9iCyJkDKg\\n6xu6ruNYtsxmc5bz2UAG0o7RZIx3CuccSmqKPMb1HVVVkcYZcRwBASeLORAMm3YkpreoQDEdTakO\\n1RCbSxNSGdF2HSqKOB5LjHMQCHrnWZ6e4L1Hm5ZADMH7uq3xCIrRiDxJaPYlT88vESLEe0/nGmQa\\nkI8SVtsHpA349tVXPLv8AK01o2nB++tXTJcTppcFh8Oe6WTJ+dUL2spS1yV1deS47ditD0gpmJ2M\\n0bqlMR35KAcpGE/PmSQj3t68wwWGbDRic9yi0VTljlEek/iQzbEmUillVxN1PVmeUDV7kizg0NrH\\nss2E/bYkSRJ8FjIb5awfNkyKCZPlgs4atqsVoYxZ73dk8wm17wl0izOG9XrNYjbDBvDFF18QBHB6\\nes5uf6AJO2T4rxhAslqtWCzHTJcjmvY4kJJ0j5DDSWq3PfLs6hPW6x26D8jzdKD4BBYlJDLMqKst\\n+rBhWowHfWukiBTUtSZSUzbbGzIN1tWMZgl92dJ3Pb0+YvqIUEb0fUcgh1qh71qkV5g+4O3rN8wm\\nM6bjjED13N5e41GoNOZ2teajdIFKMrS3HI5HTqYXrO/uybMpznqaqiZMBIfDjsUUhBggxEIKymNJ\\nhsdHMVLJYbHgIPA8Ds0A54fNqhgESSDABgLx6Kn56gB/TEruKxJtsBLaQQWOc6DkMECsNSQMqiRv\\nO8Y+4pNizH/4PORPr84p1wfSfI6MQvb2S7JE4oLhTtRjEVaSRTmEAVJZRrFC0LOcQ7nq2B96yniM\\nmGRM5z2ReEvbacLxU2R6Aa1FCEMgFZXziKonr0p2Guyk4G9/8TUHrQilBG9wODr3aIbsDZEMKHWL\\nkRYlQ7KkII0Kvt++pnM9JrAESQjWM5pMmC2n2O7+URui8TjSJMY4iTeeY1UxDWOkeISRTGfgDxyP\\nJYvFf2LuTUJt29Y8r98Yc8x6zlXu6lS3enWUFmRoYvRsKYna0IYKgiCCYENs2JRoKgiCiC1BIU1t\\nGGom0ZDIlBRMNSA1SVLT5MV779577rnnnF2setbFKGyM/SKx8V62kuvqnM5mn82ea39rjO/7f7/f\\nFRJNVV1Yr1cM3UBTt0RBzGKRsd1uqeoTQajY7y8I6QjDkDCcsDr08aCp5/Xr13z48J4gkMyzZrlc\\n+Ov2pFEqIE2XjN0JZ2bKRUqaRAzDRPB8I+m6Dq0146BJ05Qf//g30Frz+PhIPw7EUcqlO7DdXBMm\\nCdY6Hvd7rDXkeU4/doSxbzXsdk+8fPmK7fUtRns5dRiG7E7v2SzXzMPM65d3vH33NfEiIggN52ZH\\n1Z6IVcTnn3/CWA9U3UDbnQnDgFAKejswS8fTcc/9h4q+mVjmXk3dnFvqegQpKNYLNJZeT0RFyTTO\\nfHj/kUMas1h4gHVZ5MgW+rbn9es3xHEAwqcKEAGjhZ999SXbVcF6FdEONeHyFqOFP2gVBf08MjqH\\ns4bluvTqlTTkdDzz6pPXtFXN68ULplDy8bQjGQe26w1N1/pcrcAfINKcqmuIRISZJlSW/No69p0W\\n0fXNkvXV2muD45B+6qnHFiEEZb5gsVgzzT3j1LC92npH9q4lyQuOXUs0SGJSROzI10tPHu9a1qsV\\n+/2ed18/sVptqc8docsYu54kzujGiWEISTJFnAaM/chPfvR9Pny4J1IJQztTFgVNe4ZA4YT1Jy1R\\nME6aqW4Zmp6nWLNKrkjCEju0dPWROBxQqmV5HfFwAhGFBKQkwRqRzEgkRa749rGmz5fkYeJzNcbj\\n5hz+Sh1gMbMjkDHaGRQghCaUXsouRcyfnhq+sg6VR4SzIJgzAjeSJAOb6czvho7xbKkRlMAL4DdT\\n+Cc/Mfz2a82LzxWx+QWuG4hEzun//oob5xD4mm2cQIQgCwHh/LwGGaNFgBQKE8UUL1KK64mBgV6O\\noBIi8YIMwEzo4RGrFlgN0dTihgP9eOYkoJZb/taD5v/YW4a7NwgVIoYdShv62TEgIIkZOt8CUUax\\nSGJeb0qaw3sGN6CCFG0dmJFkodm+PjOnIFNobIh0AbHa0J81SaK42eRo0xBFjr5NGceArFjSND3C\\nabqmojpfuL17QZwWHE4NUkmSIkJEksNwoZ160iBldhqMI4glo5lJgoiH4xEwcDkhY8fD8R1RnBBH\\nJb02WBNzvJwp5plFJKk6P9SM04xQpbRVRRImpEqhwoyRkXKxRsiIrx7esSqv0fqMNgGL1Uu0cTzt\\nHpHCsihCkqQgjhPyvKBpWqyTJFGKEAFFllLVZ4zRCBGidcRoICwVH6p3RNuQpukZKs00aOLohrEN\\nUYGl7k+kechmU2Jx6HlEUnBVxoxTzaAqkgKaZo92isEJoqQkDFMePx7JS3h9c835UJPHKZ+++ZTq\\nPGNbjQoVbd/5oXHUUz3uSLOQOA4I0wg9NUSJZqliXAiPdUeclpiPjyzWK8I086kHIVgvc7qmpa9a\\nlJxRImSZLTDtSFN1fPLpF7z78IHNlEGyQKmCc1UjpWGaeqyGqemQEpxxyAC+//3v/9o69p0W0TTz\\nx+RpGqnahjTPiMKctm2pdE8aRegZtptbBIKuG4jjmN3T3jvI3URRZkgpqaqK9XpJmjrGcWKeLKvV\\nCgAVKYah5+HpkTSKuL29YxwHZtuzCDOMiXn77iPLomT3eEAFgtEItlu/HdI2PSDQbkZKiTOaq+2K\\nPI8Yup5jX5ElKdebFXXle49FkRFHFU4IpmlmGi2Lcsk0tWw2a6J3Xu0qhPAkdniWe/lHYuzzZF78\\nkt8E8P+NWryb4OePDZ9vBYtoZtBnZBIinCIeNJ8VCZUq+Ijjs9clf/4m57ejjmtz5s11jlIGOw24\\naabfHRhGhwogjBKEVAQCv0kVQvC8USWE13jgZ2KgAoQKSYSPSyEUQsCMRIoSzETiWpwzdPOImT1G\\nT/Xwd0TK//h/fQ1X30epiEmPCA2MhsA6Au0YtWUeZpQUFLni+nbJFFq+3H1EihgtNdYMZIniH/u9\\nH5MvDGaePLtASvp2IAwCkjQhz2MMFgLF0/6RcxPy4vaGtq1ZrgqmvsUayxff+5Sm7emHijiW7I5H\\npqlHBBBGfk2hbo4sM5+5nKy3ty42W2bbcTrvcawJQ0WWrZHPvXYZGozVrMoFw6Q5tQatR06njvVq\\nSZGnuADyMiewknmcSbKCcZiZ7cDrl3dUXYsSA904UMg3BBLSOPOK5EgQKa+oudS1z4sOE1VVE8Yx\\nxhiUChEChkFTFhnDNJAHMQSK9x/fU1UNV9d3uNCBsKRpSl0d+NGPECDkdQAAIABJREFUfkJVHz0w\\npfT91tO5oq4NWZZhTE8YKtarK8Y+JBKWp8cj2vokzXSaUSG8eH3D/fsj797uGPXonU3TwGLhW283\\nt1coFVI1HWoUpHNCmqdEUcJ2WzJMo2/xqJDJSuYJzuczWZb6VoYZqKuWMsnAeqZAFEvmYfbP33YI\\nN5Kkiqu7F9zf3xPGEhVK0qLAGMv19TV932GtJ2a9e3j/a+vYr9+s/4f8stby/sN774eXMbiIttbs\\nHiuq8wguZn+o6dqZ/e6E0TCNM/NsyfMS7SxV07E/nTlXDXXXUi6XBIFku91QLBYMw+BRY4ni5csX\\nTGYiTBTlImexzGmHDqkU1klEkPDy9SuMMyAs2SIhzRL2+yNaO4p0QZ7kfO/zzzBzj9OO7faa9Xrt\\nC7Z0xHHsIysBxEmANZr94UzV9Iyz74VGYUAcKqZx9EsDz05jrQ3aOc9tspZnFj2O53155/fp7fPX\\nfIiW/PShhyABp1GpwQYD0mpiGxDMM9dXCf/47/yQqG2wT9/yJpd8dhMTi4pg6v2E30LXDgRhTJAu\\nkXGBixKirCCIE4Iw8muo/HJz2x+ehZu9+10KZqGe+Z0GKzRO+EhWJAJMf0CMR1xbM7WGcY7pNPxX\\nbyvul1eo7RpnR4w2jIPFoZgGTSQC9DhgjCaNFbfrFasi4Rdf/4JaAUqglOPmruB3/tEv+N4Xr7ja\\nbDGDQRjJzfqaIkko8xxjJrI8xpiJfpiZpoAggKatiZ/XOF+9fsnV1Zo4DimKDCkdTVuTZQlBGIBw\\nTNPAPE+M40A9VMhYYgTU/cDhfGIwI0ma0k8zdd0DimGYuFwubJZLrJlwdiaUivOlR9uAdhip25pz\\ndSItU7q54+m0I8lSLNBPo3d3OcvQnlgUCT/54WcEBPTtgLSWIsso0owsSaiqijgMMUZzfe3fn4EM\\nGceRtu3JiyVdP3I87n27wzm+/PJrfxoXkrqqOJ/PPk5kNFfbO5I45+bqFXXVU51rplHTtf7/mXrD\\n3fUrmqqhvjTM04Rj5pPPbthsc8I4RAUJcZTRdxNplhJnOQRQdzXlsmDSA4fqzP1uBzLg1etPiOKC\\nWYPRIEUICIbOqz8OhwPVpaPtZpSK6McZYxxV1YCTBEHAOEw8PT1xOp09nrAsmKcJFUqKIqVuj1gG\\nJt3QdhcO5z3tUHOuj1R9zdPpkckNNHPza+tY8Ad/8Ad/8A+nRP6DX//1H/7HHE8XnFM0bYcgwBiB\\nChI2mysup5o4Srm6vqZpfDN90hatLf0w8vHDe6QUfPbpZ+SF366Q0lPkBQHDMHl4Q9eRpgnrzQql\\nJOv1gq5vyMuCrh+IoxikZBx72q5lu10zjSPjMOKcQAqoqorb62tOpwNxFDEOM8vVkt1+z+l0JE4i\\n5qkjjmPfd5IRbTfRtj191yOtZL3akmQxCDgc9zS9Zr1aoyefb7U4nPM9KyeE/2R9ltc56/ui7plE\\nIhxcoiWL85E/dxWShwNTAMJCoi1TWPK/73reaYE+nbg5nflzV2uWYiYPR0JbETqBsA4c9L1GiphA\\npd61pHxeAOFwaJz7ZczD+aIvHIG0fgDkfIxqFmAC//tKnEOZAaMrUDC1F2Q7YSfFB7fgj79t+avi\\nlvA53jKNPXrskVLhnMA5ST9OnKsTSRpTpCHb5QJtLd/c30OcY+cRqWa+95Mbrm5ijB34xU9/xqIo\\nWJVLAuB8OhEqyXazRNuRqmmJkpR59jBwFYQIBFM/kuc5bdMRyIhLVTMbiOMEGUhmrZlnTZIX9MOA\\nCLxpVARwqSvSIkWbCUFAlhXgoGlqyiInz3OiKKauW9IkRRtD39cYB7v9PYESxGlMGIcgHMMwcTqd\\nMcYhpEQ+IxL7viNLM/+hoA1v331gGhpWyxVRGJBnKc5BUzcoFbNZX3O51NzevUQbQxwlNH1LGId+\\nkJrF3NzeebOlECyWK4/emybSNOHm5tpT52XAu3cfMNr3f6UMeHx6JAmX6Nnw+PCIcY4oSri9veF4\\n2hMEoIKYxWLD0M/0/UQgQ/pu8ojA9kSxzAnDAIchTlLCWLHZbhkmzdPTDoRgGv3fkLXW60eimEAq\\n+r4lSSLPSxXO216lIFQBXdtRnSsCIUmimDhKWJRLlqs1zkGSZJxPvmgiQQbw+pPXVNWZtqsJowBr\\nNUPfk+U5ZbHgX/zn/+1fWce+05PopB3IkIeHB8IwZrc70jb98/6xJSsz8jzly69+zldffc0nbz7j\\n8XHPNELbalbrFcvlyoNHhpmuHZhGwzDMfPhwT995z05ZLnDOcTjuuL7dolTAJ5++xtiAq6srokSw\\nXEeEqSMrQ+4fdwyjoSg27PcHVusFi0VAP564uVpzOdRcrW6JVEwWpywWfpgwG8PpXCOCgFBKlosE\\na0ZUmBClSz7cP9E0DXoacL+k+QCLpVeyBjLAGOtPfNb6Y5/wj8j5w+rzJo3ASdByZjfDn3x9pkqu\\nGCykDlIBKlHMkeJ0urBqO343S+m+uufbt/cesPBs/1TOoruRwHrIibV///kYq3HWm0alEEjh//VK\\nY1/wpRFIBwQGG3gYhbACMc8wVTgGqu7C0IEdoXIR/+sJ/vs6J1rcYYOEcRhRwhEGFsdMPY5MIqAe\\ne1AGGVniPCNISt69O8IcY08aGRl+9Juf8vkXt6SJY7VI+fSTN8QyYmx7pLMs8oxVWbBerWiaFqUC\\n/wcdJmRZyTT5Xfu27fjqq7d07cD5fHk++QvqtsNaqOsOJ3zGs647QpVyfXOHCGBzvURITblaEEYp\\nYZRhUcRpQlqkEEA3jHTDjLZwqc8EkePFqxU3dys++fQFw9gyjBPjbDmcz1y/vKPqK6zUuGAmXyS8\\nfPWCNE1pm4HmMrBeZpR5jJl7kjCkrVqEFazXVwztRHVpicKcy9kPzISAokxJkogggM1mg7OWadLU\\nVUtzaVguV3zyyWumeeS43xPHCU9PB6Iw5XRscDbg3Tf32BnmSdA0A9Y56nPD5djw5c/fcnu3pelq\\n3r79hsO+whhI4ozzeSCNV0zTTJxaggCurrbc3t4yzCPnquFSd2gr6EfD8VBTN4O/OYyaYfDbWwB5\\nWuAwJGnI9c0G57w5QkrJcrkiTXKU8kMlPTvG2dA0A/Ps6PuJcrlmsfberNV2C9KvaGdFjpCKm5s7\\nrq6uQVuac/1r69h32hMNw5gkTvh4fOBHiyVxnKC1xjEhA0OaRbT1mcUip6pCHP4X2DQtUZygYsU0\\nTURRTDQPxLGizAqeHu7J0hytfTDfaM1ms6YoF2g9QhgwDf579eOAChx5GWPMSHXpkEpyqTuurxXr\\n7RrtJpbrBXV1IosTTwXfXwhSrxWO8oQwCgmE9LvVIuLx8SNWeBrUPMH+cOYHX7xBW4uSlkxFGDtQ\\ntzVpnGGxSHzOz78cUgTIQKBlCNjnAb2HNwOk9FxKxV87a15XIb+XbonaA5MDIQ0/WuUszMA//Ruf\\n8lk8UkZb0twg7AEXAbMEK5mmERlkHnYhBAKDsxrBjMQgrfQNUBFgpUM8r8GZ2Z+chOiRaCIESisi\\nE2CMYbSCcRoIRrAa7m3B36jgr3x7oX3z22RI3GTJkhQZOJ6ezowzhOmKx8cds+5QyiGCiXyTcRon\\ndlUPOiAVhuVNyotXC6LEYmYwemZZLCiznCyLOezuCQNHURT87Gc/Y3W14XQ5M1vF1dWGaW5Ik5I4\\njrmcds9rpFBdLixWS5xzxHHIpb6w2azQznA+NyRpjLWGvrsghUQ4uL29AwNGOlQoyPOE9dJrLZq2\\nYp4NSZqwvxyYzMwiX1GdL4SBQk+WzfKaKIpJkoQkTNjtduRJyKU9EUpF1Zy4vX7BZDQ3r2749ptv\\nSBKYJhBYjJ7IssyDWGSICjIEMVGUEgfQtx1RHBIrxaU6EkTSszJFzOl84Xp745XcxnE6nFkvll49\\nDWRxxtCNdNOEOAjSJKfrawQDbTuQxKVXTgtBURSMreT1y8/YqTNNeyGQKXU3oGTC8XgiKwVZHjJN\\nM13nD01XV9eczxVV3RKqkTiO0MawO+yQAvrOg5a3V1vKPKUZW5y/KnF4OmGRdE1DGCS4aaYsF1wO\\nB+KsoBs6rDW0fesPKVIwzzPFzRYbhozGIOYZGScs8oLrq1uGrmPWljAtSLL/H/NEg1AShILbuxuy\\nPCZJQx4fH5nmABUItJlZbjwx/PWbO755/5Y0janrgc16RRz5DSA9jdjZEMcx33zzlkW5oiwL6rpj\\nGkau767QWmOtY55ntBGAd2pXF398L4oCISOkHFmtc+rmwv58T57E9P1AliRsN7ckSc7v/iMv+NOf\\n/uL5ijXSTgNhHCKQXE41WZixXC15eHpkuUzZDZpL3bI/nnl5u0AAi0VJfDEMdcMiywlVxDCMBEGA\\neb7Sy0AQSIUKNO6XhQz8aiOQzA2XuOD/cT1//W3FT74oKAGnIBMzv39d8qG+8L2oJkpbwkiTKEcc\\nzowanPXZytkqpJA4Efj8opJI4RDPR99f9maRHvYs8NdY5RSCHhgRFqRVRAac0fQIegMMAjk7jqbg\\nb3Q5f/Htge76e4QC5GgZ3QQo6kuFc37DamgbP9QKAqI44HpVYq3hZ99+iQ5hWUaUEfzwd25YrxKE\\nG2iqikFMJFHCT374A477e4oyocDDXtIkI3jmtFo3P4NDPFquuVwYxp48S7DWkOUh6/WS3XFPUSZE\\nqaLrWsIwYr0piKKYYRhIIkkUZdxcv2C3O9DWFdc3a8CQxBEGhxQRo/Z6lXq80I+j73MOM3aEcdQI\\n6w2fkVJ0TUMSqWe62EASxUzjyGa7ohm8BLHf1Syuc5qq9gOixQonHPf39wgVomdLPxjm05mbF3f0\\nfculPpLkEet1Qd/3nO8PKAqq5sIiX+CcIBCCMInoe98bVUHMcbfHWoHWEmsMDT2hEgyDwbkzcZTy\\ncH9guVoRqghnQh4+DiBm3ry5pi8GHj7W4DzwZbGMCVXENBicMBRZxuPjjuvra7Qx3N3ePp/2K6bZ\\nh+03ywXGjByPZx8TdKC1JY5jnIW266jrmihKqE4NAYL904EiTiny1CudcRAEhKFCBJ6lcGhbhIBz\\nVVM4CJOUAME3335D349sNlsQkm789bbP77Qn+j//yV/COYMK/ST16uqKb755S1lkvpmvBHmeMY0d\\ngZKMQ89yvfYA2gDM7Ak6zoLRE9ZY9GyQQnDYn7DGIqXkRz/6IVprPn58T5pEGO0FZ21/xDnng/iE\\n7B4PPl61ypnGCphJs4y+HaguPXe3r0mSlG6siVJB22qquiKKU05n38PSk8Q5CU6zWGVIGdI2HnKS\\nxBFJAmaeWJRLTu3oPUybFePQ07QNMgixz9d8EYRIJX2P99kbb/GwCwClLQ0SHaXMl4rbMOTlMiYQ\\nI8wThXSs1ExI59mbz6ZOO86+ZzdFDBoQKU48D46cD+YLYbwmQoCQEiECj4wSAQiBcxDaESH8J7sj\\nxrkYayRmtJihg3linkOOYs3/clT8N19WnK++IF9vCMaecRTMzjK6maarMRb/c1UNVvcEUlOmIcvl\\nmvunPYemJkotty8WvPp0wxc/WLO9WnA+nSmzFXla8Du/9Tv89E//LofTniRLyYuSuumI0xyQpElG\\nkiRM88himZPFCU9PT2RJStN0nM+ePh9GfkJ8Ol+Io5gsy9FGowJFlhUoFaKwrBYr4ijCGkP6fE0W\\nwjGOI1IIkM4nQfQACL8umRUY6zDtRBRHZJlv+5zPe6yZaOrq+TmEhEHMer1l1o5hGpGhJE5jJma0\\ndr5QBwFd37Lcrj2lyVmur6/oh5amu3B7d4N87qcXZUnXdJwvNZdjTxKnvg9tLSpUZEmGCgIC4Zm+\\nWlucE1xOF8pFQds0hFHEcrEhzUKsFf6EmyRoY9BWkCcLptHDVrS2dJ0mCmIf5u8byjJBCMPp1NC1\\nfiYxjBMqUNSX2hf0QHqRZRQzjz1pmlGWJbe3tzgDeZ6zyHOKRUEURjjr0y8Yy2qxZuhHqqpGa+1Z\\nuU7QDz3dODLNxgeytUOPE2PXI6whcBIpJUM/IIBASrqu5XKp+Nf/1X/vV9ax7/Qk+nh4z2effY+x\\n9Z8yw9Dxm7/xY+7v74lj5S2YQc+5rknCECEdcejIrnLv1XY5YRgyjgPnU02eF5RFgXOO1vaY2RBH\\nIR++/cgwtGxWa87nEzc318SxYph8qL+pOl69vGEcPqKKCKUkt6+uCWVAWw84QEURH5+eSJOI733x\\nii+/+ohUMWGcAhKjJe00s17dEuCo2x1VNxDHK4wbiOLUB4TDNakS9O2AQJMkEc4aXr2643A+oWc/\\nJTfaEmBAC783zox1zgMuniNRzsYkziAVPIYZ/927E9eL1/xuaMhswxC2iI3CzAZ3Bh1HDFKiAkEW\\nGiYVY63FOb8IoAQI6RMAz2dhBBJsADxDhpVEPG8FSDkwCIWRCdqEKBchnMGMDbGdmUfNLij44wP8\\n0YcJ++YnFGEMRjNoy4ChmzuM6dH4td666nBCY5go0ozt5hY9GLrLQKrgxeuC5TZicVdyOX8gDF4y\\n1AMqT/j+j77gUl8AQ93WfP69L5imiWGa6C81y/WGMAwp0owVOdYFnI41UZh56iIjn7z5vteExAvq\\n0zuWmzVSKNp2oKoaXr58SSglTdeS5anXvcQB2gScTg3jZEnCiKFtWS0yTqc9RZZyqTWT1kRxwnq5\\n4sPDR9brzBsP2iPr1Zo4KbmczizykjQpaZqOumqYJ99rllJgjGRsPPsUETLqgWKZMzlLlMUI4Sg3\\nHjLy8pNrnp72fLz/hkW5Qsy+rTIOFrRiVS5oh86rWpOEsR+o68a32ZKEPM18bnKaub7e0E8jZVFw\\n2J8xFqIoZrUuCMKaadJMkxff5TcrsmLLw/0TgUoIZUCYRURxyLK8ox8PtN0JZVOM1uhhJkkCZKhY\\nbUu6oScIIn/6V4q4LD1Jy8HPf/4L0jghSVI2a8Vmc02oLG9e3WGMowsEQSDIkgQlFFEUU9XeumoF\\nCCG4ur5CiYQ0mjnt938mAhQC9DRyvVo+k7gCtMlYFdmvrWPf7XT+L/9HhKGivjTEccLY9/7qnGUk\\nYUQgfaQhChVxHBGGinHsubm54Xw+MA0Tp9MJrTXmWdqWJgVxFFNVFVobbm5v8GuPAVVVsd1uiOOI\\nedbPit+EpqpZLJcI6bDWUDdnNusNZbGg70eKsqTpGuZ5oihT+rFn1pauG9hstgQq5nypGXqDFBHr\\n9ZLVKseZnqIokCLheKz57NNPiCJFGsVMw4QIFMZqzKy5ubmlrRuqpiZQAVIGhCr8sz1s54T3rFvL\\nPE8Y64P4yo6YeUCnGScL3aXhs0XJMpzRgUGHfs9b6QRnUlyYIYMQjGVW3pwohCBAIKRFYBHC+rCx\\ne47dO/H8NSCxCGcQxmAwTEFENVvsZIj0jJxHZj1ymQUf5Zq/8rbjf3g/0r76AVbFRG5mHAaGQDIa\\nx2RajBwJk5Cu6TGjZppHoixkuVqRF2vuPz6yLDOKRcBnX9ywvV7Sjw3KXbCz5Hr7mn/i9/48fd9Q\\nt0f6oadcLjidGmbrJX/92LHZbJ/jMXuc1pTLFUIIPnz7gSAIWBYLzGxZrtbs9weKcoF10A8d2+ch\\nTD/4Ynpzc+ujQ4Gkqs/87Gd/ilLe1JmlKVEsCYSj71u6tiMKYuIwZRxHwtAH363occJhrMVqy9D5\\nyNvV5prVasNiscCYGWOttzfg2x2IEJCIIERbQ9XWhGnk89Bzz2KRs9s9kKYhUgqiQHI6nlCBYpoM\\nn376BX03kSQFzjrCKORqu6VcLtmst2zWW7AC89zaubraEkYSrCVNM5SKfG8+CJnmjiyPqaoTcRzy\\n8uUd/VBTV2f6fmJRLlAKEBo9TQghuL7Z8OLFFW/uvkccJQx9T9d1COF5ZVZ7LoCzlqfdjqurLUnk\\nsYFJkhL/kq41NTzcP1BdLjR1g3DePaVHzTzZ5552gghC6qYhShK/zlnXZHnB0F5YrVYoFXoFtrGI\\n50I7zzNm0vRty2a15C/8M//mr6xj32kR/ct//J/TNgNSSKx1xFFErBRNVWGMIU0TfAEMOZ1O3N6+\\nIEkSlAyoq4pISsq8pMhyFkUJVtA2DW9evyaOQvque14lhOm58a717JFzcYSSGXm+wBhNFEo26wVI\\nwTgYzueWOM5ZLVfEScQ0tRg7e0/OpPn2/SPjPGOerzt9N5KmJeMwoJTk+nrF3d0WREAY+b7PNM4M\\nXYuzzlN74oj9foeQ8ObTN5SLJZe6Yp5mr1OyME8z2tpn8V3gJ/TSFzWpLEGgCOKESVtEGNF0A23T\\ncbtekQcTobWeOaq8BVO6CRjRjPiolMafMw3S2udhEn4aj7/1SIFfPTUaZzTC+o2qTgf0s8YaR2wM\\nrr5g+oGLDPm7ZsV/+dOGv9kv4cXnBFFCICzaGCZnGcYWpR2jbtFuJktSunNFaANkIMkWBXlZcv/4\\nxNQ3/NZvfZ/VNqJcBginSWTAZ5/e8Obl5yyKLT//8hdU1QFjRyyOMM45nWu6wcOJrbMEz7/DaRj8\\nid7NfyZ6K4oCJQMOhyeiMGB/fCJUAVpPaDPirOFS+VB3GifPrQ7NOA58/fU7NtstSRyS5zHOzcSh\\n4vB0RLiA1WKDCgKut1sEDjdbAhnycPxAXpYIFPMscEaxXl7hDMyz5vHxHhlYxnmgLDOcsDTPcruy\\nXNKNrV85bmpGPTHMPUWeM04D0zQyjhNZFJEkKWPvb0NKKpqmZb3asH88I/CO+1kP9J2P4w3dyOVU\\n8fjwwHaz5fWrF74fLz3ouGt6tLZMpme1WiKlF+pFkWKe9Z9ZGeJYEEaORZmwXK1YLguKMsFox/HQ\\nUJ0aijz3Eb/OI/iEgLbpfNtKBmRZzuV8IYkT9Oz9WkY7irykzDOiKCXPSqIow2nL5dzQ9wNtW3N3\\n+4LFekmgBGmesL3a8v7+PcbM5HlG03V+NTSOCaOENC88itI6ojDGOOctrw7+hb/wb/3KOvadFtH/\\n7L/4D/x0eJhJ4hg7TxiraZsLty9u/mxr4JcDB5/hC6jrmkBIFqU/hk/TTNN0TNNEEnuPzYuXL8iy\\njKenR7Is9sVxHNFmZppGuq7j9upT9vs93377liyPmOcJFUYkSUlddcRxisBRVUeyPCJOY6QIOZ87\\nmnbg5u6K/W5PnhXsn3YkcUaaxzihgZnt1QYza5pmwMzQ9iN1VfHq5QvyLCOJFZfjiXGecM5xfXNF\\n1/bUjQ8zO6+PQj5r0nyG1GKdj7yPrsdIhbWSEEugZ2YZ8NCOVP3Ei0VJzvgsXdMEbkSaEetmTGgJ\\n5glhZoTVCDuB0whnCaT1zFHnEM76S73TOGtxRmONBmNxMmERxmSAGWdaDUeR8TcPgr/00xN/R95i\\nbz4lDBTh5CekjZ4wGEI7Ml46RCRwkeK4PxCMjqtiSSAVxdozJ9vzjt/48ae8fF2yvE0plhmv7m75\\n4tVrurHhm7cfqOsWo0eiNGC3eyBQinE0fusqDInT8DmuZRgGf7NwxkAAl9MRpRRlXtB2LUEgybKM\\n0/GAkNJbBYQgTmKSOCJLE9I0YZpm6u7M0+6IkJL1as04+WFVEitOBw/J2a5uGNqRLE1IkpC+7Uji\\nFIwgXhZAyDTOpFFOmmaMw8A3777hq6+/ZrVZcTgfCZSk6zvKxdJvsEkfPyOGYeoxTjPpiTTLGKYJ\\nozVBEFHmJVY7T6rvBoy2FHmBMYbL6UwU5/R9z+3NjfczjRNt1+OsR/ndXN2QxBFdWzGMHtH37YeP\\nNHVHnpfU45EsLQB/KOn7miTOuL5+gTUzl2qHEzNOgJn1szhQ8vbtB/b7luvNkuVySZ7ndH2HFJIo\\niojCkKEfcFaQpjlm9gaD1XLDolxQXWou54px7EnSnGnU7J52HPZHsiylLEuSJOWzLz7ncHxEBtIr\\nXaaWeR5IEkUY+YSOc56fYKzlsD/y8PjI8XSmrmrCKKIoV0ip+Of+2X/jV9ax77SI/of/yb9Pkfk3\\ntAoCsjRhHDqKMiMIBF3bYh0kSUpTtygZMs+ay/niQ7+oZ/7miBCBB0VEke+Djb1fP5wnng47iiLn\\n6nrDOI6M80gUR0yj4FLVREnEZnPjyfP4Ico8aeZxJMt8fGkYRspygTEQBDFZntGODZv1mjLPcVbg\\nrCGKFC9eXXN//453776hyHI26w3a+E9JgcIZy8vXdyzyzNsgZ6/W3Ww2PDw+stvtCZRCBep5FC6e\\nwSSecu9FZYJZQYBAakMupT9xhiFzUvBYzXw4NxR5wTqWRL0msX6wb4Q3WYaeMYKwFucsAj9IwjmP\\ngLIGM8/oaUJbP7gzzmGsv4rreWZsBvracRIFf0+v+MNfVPzRNwP19jOi7Q3GzcQ4mLUHvEiLNgNR\\nrAhG6Kym0xPKSV5urwmdYL1dkRYxh8NHfvKTV/z4R3e8/GTDHIxEhR/oTG3Dua69uA2vRxmHljhJ\\naFu/W621JS9z3r3/BqWUV60IxzTOvH7zhmkeaeqOLCsJhOJ0vDANGmMdWvstoDjxpPskSpjHiTTJ\\nWC6WTMNE07YsFwtCJYniAGc163JN34w47disthjjmMaJslgwdBPr9Zbj4ej1N4lnhrZNDcLR1hV9\\n17HebhnniWGYCZOUrtdMs6XrBxCBL9jjiBETxlmiOEKFEdM8IVBEUQJGsF1dERBwOV1Io5QkSqia\\nCjMbVCTRk8PMM7OZGYeJadbgBHVdIRBEkeJ4POKA3dMjaVpwc3VLmuVcXV0RxzkqCNisV7z75mtW\\nyxV6Hlitymc6/0zXTtSVfy77wxFrBUKElIsFoXAsliXTNFKWS4wxDP2A1s+pFBkxTxNYSRxFJFFK\\nlhdYC6vVhiRXGK2xzqMdpRLEYYhzljdvXvO0f6Cua4zTnC8neIaT3N7cEihFZL0hoW9ajk97Nss1\\neZJR5gXLxYJAKu4fHjifa/61f/nf/ZV17DsdLDV1h7vzPTeAQAnWGx+MD8PIMxsNnE8XVos1xhgW\\nZc6izNHTQKQy7o/3fn95mijLkqZpkRKG3mcV4yxmE6552j2d0VocAAAgAElEQVQQxgFXN74vZozh\\n6eHJe41mx/tvdxyPe169ekXbtrx+eUfXNRyPR8JIMQ4Tznb0/chyufb64wCcsOx2j0RKEQahr0xi\\n5Opmw9xr2rrjtG+wxKhAMU+adhg5VydWL7zl8OnpiafH9yw3a773xef0vYclhFFK3w0M84zBemSe\\n+/s79aAItCNxgmkYCYuMSRsCKTnkJf+niTl8XXF/Db+/LdgAykriWIBuiMQzXg/3Z6ul0npYtHAT\\nSgQI6dFqxnqClCZEE6CdJ+9PMqBSOX/yruavvd9zn90RfHqLijTKHEgkGFlQ3m6p79+DHUiikFPV\\nsi5XpM6v/8YyRKWCfuhIg4Q0V/xTv/9brBcx37z7U0T+hvNYU7icfjZECIIwI0pSlOpxxAyDA6mQ\\n/UyZZ1hb0bQ1y+WGrqsJAolzliSO+ebjO1bFyk/dZ8vudCTLFoiUZ9o7KBVhhWW7XtC2LctyxTSN\\nBCLkdDizWK0QwpLmz7R0qXh6PDGPGiWhli0IQ5JkrNbXzLOhXBacLidO5x1KZBRZTrXXnOs9P/j+\\nDzjszyR5ghGgnSNSMUHgqfJ1X1NMltVmQ5ymtLO/Ud3d3XkwzqSfKU4LtosV1fFMe7mQpglOQ56X\\nnKoLi3KFxWGNods3HmrsHIvFkrbvePPmE8Iw4LDfESqFJCCOCpSMsE6gp4mP9x9YFD6zOY89SZig\\nB8dkZ37xi5+S5wtev/oBHz4+AJbD6cJquca6kHGumfsGqxRyJ0jijHGcWSxWBDLmeDxRFAuOZ2/Z\\nDCPF44cT42B59+49r1+/BOO8mDEKcUZi3UyeL30dETCMLfv9jvV67VUr641vgcmS/X5H1w6UIuHF\\nizuu1iV9N1HXNXGSeLts09J2HoD9D9DOf7cn0b/43/6npEmMFIZIwauXL3DG0ncD1jjWm2uiZyXu\\nzc01QloO+z1pLGm7C11jWS6XlMWSLM3Z7fYkiY9SFEVOlPm1sHmeQHhidts2WGvJioTjvuNwOJCm\\nBXXTk8YpQaC4XE5kacR6syIKI5qm53ismCYPPmjbhtu7awY7EQaSOFDcbK5Zrkvq7sQwtkRRTJYU\\nXK1vCIKA4+HEanPH5dQ+S+UMLzcbqqahbioOxxPaOlbrNXXTMM/m2a+jsdr6N701PrH5HLaPjSQw\\nEucCrFJYFdCPvX/wDrQLqJF8WU28bS06XhLGKcLOCCxydlghcUJicFgnsM7Hl5x1WOe8ntk4OgO9\\nCxhESudSGhPydy4hf/2+5Y8eWv62TbksXuDyNSIJiDKBSCxZGbN5cc2H3Uec8n3vzdWW+/t7okVB\\nXAgWC8nV3YKoiImXKed+zxc/vEWokWaomZ0jzjPiSHI+Hf06oDZYGzD0LU7OLMucOE6pzg0Iv+65\\n3CxIkwxkwNBPZMUvg9ca6zRzP/p8ZhSiJ41wjjiOsNaQJjFhFLBeL+m7lm5oUCJ4PqFAnnovfKgg\\nTxKEgzCICVXsYzbPfqRx1BTFCqT/gHjc31N3tQd/xBlJmIB23Gxv2e0qmqajnzT5omQyEyoJscKS\\n5jHt2DEMPSKQtF2PsRN6tjRNS1EWpGnGixcvaOua6nxEiQApBHM/IoSH9MyjRgYKIQK/jSYFWmtU\\nGBNHKVmS0Xctl8uR8/nIer1ht3tiudzw8PCIMdYDdJRiGnumcSSQEUpGjJNBALv9ia7TSBkzDZa3\\n796SphlB6DU2UZSyWm0wc8849ZwuFYtlST/MHPcnpkmjJ4ckpGtbhnEGBNM8+u05KTHWcLjsieOM\\nYRyZJk0gAwIpkEFAU58pFjlpljKODXGkUEpQFgXgGIaWaR7ZnXZoO3OsjkRpzGxnL8VbFISRYrPZ\\n0vUt/8q/9O/8yjr2nRbR/+l/+0OSJCAKJX1bkyQxeZbSNr1ngwYhh8OFqvIh4ySNCQLL5XxgHDsO\\nh5GP9w9oa3l8eODVq1fMkyaIlXcaJSFhGJIVCUka8+rVa2YzEijPeDweWvph5JM3n/L0uEMGIavl\\nkuWqwBrN8XTgcqkIw4ih91sQfTdwPB0Zx55Oj7hZ8/LmlqHpsMYQRIIw8Z4dO0vs7Ck3XTeyKK/R\\nWtD1DeUi4fMXL5n1jDaWph/8zx5GmOfT9zT7N4YKQg8WNp5u76+vjmQyGJUyCIUVApTGhZJZzyTG\\nkQeSKUp4Sla8NZKH3Z7+sSboB6Q0JJ4Jj5MSIyT2OdgEAmGlXz3F0/CNFEwi4qme+enbM3/r7zX8\\n1fcNf1sHfLm5Rr/+nDjKiIYK6S5UtmNIIlSeEQjN8fiAynJ2dUORpkTGcvXFp6xWirZ+YHNTUg09\\nt5+9IkgMKhrJMsU4zyT5hiJf4IxGD743WA8ToYxQESSJYBx7nJOsV9foSVMsc+7v35MXBVGSczhe\\nUCogSSMu/297Z+5r2ZKl9V9E7Hk44x0z62VmvVevqrq6qFZL4GCAgYeDQyOB1IAYHJCwwMFHCGG2\\ngYRAAoHAQIAD7cC/AI2qadFdVL05M2/ee4a9z56HiMCIU69wqiWUxmuk80svlUrp6u69IvZa6/u+\\n8sjheGTqa25ub5jGgUWeYY3GWMM8D+4QDj2sdQceVpOkIdXpRN+3xHFAUTyxzBeMg2aZr5mnkcB3\\nuuu6qvFkRN9prm9vKYoDT8cHxrkHT/L8+UvyIMZXPnm65pNPXvP4ds84gedHxGlC3Tfga/xQcCj2\\nhJFimAa01mR5ziJfYrRlGCfCKKZpGqIo4unxAas1dtZYPbuWzKzP8RoZyouIkxTPE0ihuLm9Zx4N\\nXT9SlgVBoMjzjL7vCAKf5WJDFEaUZc3Dwxuednu22zXXNxl9N4HxmSZDFAbUTYc2AU3VcywO3N5u\\niOOUw75AeBble3z1+oGhV9zdOoml7/s0dUfT9IR+fF6r8/B8nzhK0dOM8BS+r1ivN0yzG5pZX5LG\\nGZ70icKItnFzEYDVZkkYBlg7U54KlILFImG5yhjaE+tVzuR5aGVZbNcYJUCBkRY/cqIdfR6mhVHA\\nb/y5v/1L69g3+jl/fPyK7XZLmi9Jg5jTaaSsTiyWEfMEXT8zjG63zg8Vx6JgHA1SZqTLa/xQ8tlX\\nn5NeZVR9wbv9Ay9ffZvX7x5BQD+MTHNDmqe8efcORcgmvyJJQz7/8mdcb69QRHTtxKmoiUKPrq/Q\\no+b25p620SSJRxAqNtsFRguUjAijFVXT8dEH36Vujnz18I5lHjlTiha6ErQWXK0zpqlld3zDYiWZ\\n59f84Ae3/Pf/9hWPXz3wk/UKTEQzhKxWz3g6vqE6PZEvF1xdB8yzpO/gWPT0/QzivDuKj7SSLphA\\nuAhhAHqJLwRSecyeoFNOmZUZF33xZXLFl8byHwaBfFT8moLM99nGIdtEsfImUmHxEBg8Bms56JHd\\nPPJF0/O6g4fO0BIjthGZiciWCd+KFLHuiTYRb3rDqZdILUjDiVg0HE+PvPjoisd3J263Kcduxw/+\\n5A/x/ZqyHCi6mo8XS/bHJyJRsH2x4fHhDTr2yHOfaToxzc44W/s+fpyy8XySyGN/eEe5m3j16kOM\\nVZRjy/LZiq7pydIN+7d7bm/hdhFTNi1elhMnV6h4iSkrdkXBarPm4bgniVccj0fQDXLqCbTPIl0D\\nOX7g0bQ1Us3UXcehOpL7EaeqoLcG0zmrwL4fmAfNR9/+Dk1dIxiZpoaiOJAt3Q6zBwSD5jAohlPp\\nbrGRT7KNkAEov6e3MyMtSseI0SMaFUm0JLu9YrYwC0U1l2h/xMqJU7nn9vqO0/HA/d1zqupE13d4\\nUrK8WSGNoipq2rol8A3TaOiqisAPOB2eWKQpV+sYFaxZZil+4KF0RxhEvHnzhsVixYcf3JLFgJgx\\nQ8Wn/+tAkqRU4x6NJl8vEJ4iijyiMKc4Hnn3dsf9/R3RBwFfvX7LKgtYrWLCpKNoFP3QsF6vqLqe\\nkYlsLXm2veLp7ZGyaEjTlDwQNM2A0QH7pw6tRwZzYrmI6WRHFIUc65LVagFiwmjYPZ0w04CeZ1ar\\nJetsRXc40c4Bq2jFMIxcYRhDxeHLN9w9u8EK50ayPxTcXW2RMqQtGxar7R9ax77Rm+i/+Df/mLu7\\nG3w/YBwGtDZ4HpxOJUVRcnf3jCiKKconZj2ilKQsTySx0+reXN+R5BHTOJGlMV3TIqVH3bbESYyw\\nmqvrDZ99/hlxkmBm62RswvC4fyTwF+wPe8AipeG73/2YL7/8kiR1fVetZ/q+JU0S3r175+ziAp+2\\nbZFCofVIFPkkacA8zQihkEKxXl7RdxNGzwSBf75BS+I4du7lfkh5qnh6e8TzXD6PEArlBXR9zfZ6\\nxd3tPQ8PBcdjS9cPKF84c4XFxtn7SRcXIb5eiXe3SCGEUxhJ+Yt7pRQoob521hfCgrUU1RNPbcXr\\n8sAXuz0/fSj4g3cFv/9U8AdPB3734cCP35Q8jA1vm55OeCSLLV4QEoc+m03KepPSDgeiDL7zvW+x\\nK97iRxLLSL7yyHJBkkqC0CNLU6ydEGrk6jYniSPs+YaX5TH5ImGaR5LERwpLkgRgXe6U1rNTxgQB\\nypN8+eWXIDV+6GOZWSxXdF1PUe65ubmmaxsCPyaOIvq+Y7lasd8fKcqaMAowGLTWX3vUtu3IMl/j\\nC0VZHOm7hizPKYrG+asq5WwUA2cL6Hshdp4I45hBz4RRDMA8TrS18yXFWqLIrffUTYPFMs8T0zAy\\nDT2z8JwuvjyRJDFRFiGlJIxCiqokShKyLHV9bD9gsVxwLAvapiVJEoydiIKQ1WLFqSzBCsIgJopc\\nSF1RlqzXS+rSLdBPs6apG6IoJk0Slsuc5WpFlmXkqyUGS9tWTHrmUOw5VSeeP3tOtlwRRpFTUXmK\\nYeiZreH2+hlRFhJEEiEtRXlku7kGLLPuSdOIoih4fNxzfb1FKuMymdCuXaS1E8oUBVmW8ezZPUPf\\n0bY1GNCzpe1abm6vePniBZ4f0bY909yyWCakcUzbunadPbuNCZw/8Xhe91qulhwPR5LErS5hLUVZ\\nEUUxN3fPKU4FUZYQpwvKuqJuOsI4oShrum7i9ZtHlFT8lT+qg6X7Z9f4geTTTz7han1NVdUoTyOk\\nJstSjsc9nheAmPH9kKapziomZ3P36ac/o5t7gkDywf0dreex2z+yurrm6eEteR5Sf7EjiiJubm6Z\\nuhmUz2Qm4ixFKY9haJ2Ddqjoz/uDWs80w4koC8BLGGcIY3eLWCwT4iSkaweMmQkTnyjw0WHA7t07\\n4mBBa1xe+mwsWbagHyqGYaKoam6u70F6PD4q6kLQNB1JlmFmD09F9P1MWZ743nd/yE9/8gC2w1eS\\nYR7wVICxBi+QWKMRCIQVzibvfB+VyvVLrTEopc5GpGCEddET4uzfZi39KqPXTpOv9IzCnAPzQpT0\\nGaeJ2w+vaeeGcRhIsyVSBKySBGstRg0MpiReWDqzQ4stH353Q9VMPO0n8kwRZx5Ge256Kg03dxlW\\nRtT1l1izJYwUqtEYOwAT2vQ87Woi30Mbt1q0Wl8D8LTfE/gRyrN8+NEHHIo9s5kZz4onGUCYhByL\\nPcYakiRlkS358Y9/h6IoeHZ7z1cPT0yDdisuXgh25nRqiVWMT0CU+oT3LxjmipvbZ7yxO/Z1QxxF\\n4AWMY8cqXVFXDTLzONUVaZ6hlKTvOgS44LthwJqZ5fqWp6cn+mkkUgH3989oSpe6OU0Gzw/YrJeo\\nUHFsK4ZhIIozlnnOhMWXiij18SKPfVmitWachnP6gU9djbS4AUicpCgvoO+cb6jn+URRxGFXcDx8\\nTp6uyBYrkLA7vmO1yJibE8oPYHD6c9/3OTUlp1NBmua0Y89sDGEU0w0966st6TKl61qYJFZqwlDS\\nj4Y8X1BVFVEa0Q2apqpZ5UusVfze7/0+v/rHvkfdHdk/7YnTDN9ThGFInmcM/YCUkCSRU2YNkq4v\\nuV6umKaBn336v2nrkShacH1374yWp4nD4UDV9KRZzDha4jhysSiDQPoBUiiCMOJpd3RZZ+f6obXl\\n8djQNB2znfns9QPd0LFYLIlmgfIilJCuFXEo/tA69o3eRP/9f/otpBQUZck0aJTyGacesMRxStcN\\nTnERqnP0sMdquWXoJ7IsJ0sSiuJA3VXkSUYchiwWK6IoQsiZZ3e3xFHIaDRpliOFQEjXoJaBQs4x\\np9OB2QzkixRj3IRSKEOShlg0TTNgjUApjyyP8HxJU7f4QUCaehg7c6pPDP3ANM6Up5brqxuwAmM0\\nx/KAUILleokxmnmemGf3sxwONUXZslxsmcYZIVy+/DgammbA9wLarnduOtIVyao5gYUg8NGT/dol\\nWUiBlL9wvnceJm6/VAqBFfb/8j10t9VeGrT0sX6I9kOmIGBUIZ0X0KmAMQixiU96tcYLPfww4MNv\\nvyJLI+rqwGA1Lz98BWpmmCt2x9fsyz1JEiOEpGlbpBS0Xc/V1R1RnNMPHePU4vmu2MzzRF2XrDc5\\nvi8JI49FnmLNTByHBIHiafdE37dM04xSgnEe2G43tH1DOzTc3N1QN61rY8wjs3a3weJQUhwLXrx4\\ncQ6PmwnDmIe3bwFDsFgzjTPH3YFVumZsOoSVvHzxAW8f3nCoTqgoQfoR2TIniiPqomK9WBEHMcXp\\nwDRPIAVp5gzAN6s1RVli9Uw/dDx79oxjUSCkZJpGF5ltnE9o042kcUQSxShfkqSud2/0jLHWucjH\\nMZEXoBBYY9AWsixnkaYcDhVZliKw+L7H/d1z6rrlabd3N2Zh6IYGX4VoC6v1FaeqdAdX4LYK2qFl\\nmke6sedYujhpgztk4iQ5t8Q0x6Jk1hptNU3bcjge2D8dePvukcCPGUZNEMQg4OnxicDLXDrvWeeO\\ngeOxJEnWxHGGnjVRpFguV9R1yzSO7PePSGEZR03XjGg94/sCi0EqQT+MtG1NEEo8H+ZJEwTB+dnH\\nJWKco5/HaabrOw6HAqGcZ0JTtbRtj9aGpukYjWDWllPbUXcuQhkpidOM5XKDtZbN5posWfCX/vzf\\n+qV17Jv9nP+3/8h9lhjASLTW5HnKapW7lEZj2GxWaD0ipGGxWDEMM1GUMs8aT0qyZebchWZD6PtE\\nccwwDURRgO+5mA4/Cnh82uF5bocMTxIvUnTrPm2vb7a8evXS9ZBCt4hrhWW332GtZLlY0fUtMJMk\\nCWDO00bBJ59+ytV2yzhOKOWDgVNVEUUR17dbdk+PJEmMMU5ZIs4GHvkyJUkWlGXN7qnk/v6GWQ9n\\nw9iWw6FESkhT5wauB8s4d/iBOBuueD8fC7k/P7edFz+/iVqscTI2qSQu3s78YngkcK5VBCirnCpJ\\nCISyKKEQEuLYJ0whzwI+eHVHEHn87NOfYJVGeAbhJ3zy2Se0o3uwkzxls77i8enAcrHleDzhqYDD\\nvqIsWqzxAMnhuCfPckDz/PlzhrFDSoPnK7quJopChrHHk5K+H0iShLpuyPOU5XKNHwQ8PT2hQp/V\\nZsGsXXG0RmCsoalLFosFq8WSzfbayUGrksCPybKc2+trjJkpuhFhLPMwE3khp/2JH/7gV2i6iqar\\n6bV267K4giaEIE1ixq5HSdDMbnAVxMRZSt93hEGI0QartRN03N6x3+8RSrLZbKlPJdpoBJbJ4IQI\\nShElEUVVslouWOQ5VVVhcAdfKN0+ZNu1LNcrurZDWBAqYp4HkjhkmgcOuwNV3eApHz+QxEmIsZpj\\nWXJ9fUfT1ASxz/3za7LMp6pOtF2NUB55viCMArqpc+9OGFI3bkskSVP8IEQq5eTZ0+AkocojiXI8\\nL0Uqj2keztHQEZGf0DUDQgjaumJ7fc3QzYy94ep6S1WeSDKPrhlctPg0EEc+u92BabSEfoRFsNms\\nCcOAwI9I0wRjNNPcEYY+w+yCFI11PmNCCGYzI5RkHkameWY2huvtLU3bOVXUbAijBBDsyoZu7On6\\nliRJMVjG2XB1dcM8zwjpcapcIvDf+M2/+0vr2DdaRP/Zv/qHZwORkapuuLm6BjTLVY7vO4cYa6Ef\\nOtc3HWeMgSRN2RcHjDYM80gUheh55P72Dotg0qPTgJuJcZqdN6W29EPPrCcMM7PRJDKjPB2xaMap\\np6pP3NxcYQTESczDu0eXizTNSCEpiiPzNFHXFctlRhD4bDYbdvsDebaka8avf/FdXxNHIVESYKzG\\nD3yMcTuDfd+BlEjcJLdqGo7FgSRKz446UBRHtHG3NYFgNIPLALWCcTL4foS1TtVk7M8d8S3WmrPS\\nyRVTd0q7ALyf31qllO7vcTuAwgiE0PgWpLB4QqCExTCwWoXkK49pblisEp5/+zkPh7c8lQ8oArSc\\nWG0WTGbE4nKtrLUsl2uwcDgeibOM3e5AcaqdW5AUDH2H5ws8z3mSTtN4PjRS+q5zCQGT82s1Grwg\\nPOumXfKi1oZ2HNFau56x52ONYJpmAl+hkAzdxLP7ZwgJ4zTyu//zx6RJ6qz+MOyrhq5tCZSHtBAG\\nPipQxGmAFoZu7AAnwQRLVR5ZLTKGviPLM3bHHdM0IqSLevEDn2GamIcR3/PxlMJYQz+N3N3dYYzh\\nVJzYbFaM08Tp1LNaLDgVBW1fM8zORLw4Htyq0H6HtZZAeoxdD1LRDaPLF+p7giBhu1kw6w7Pg7Zt\\nCQIfX/kEgSCMfPq+xWJYb7acmpp+aFksI4r6Cc8P0AimeSJMUt7tnlCeoh8HwihESInnKYwReH5A\\n1w30/eA8LKYJX0qMhYeHN0jPtZWWyyXjOFIWJQjB1dWWpq6JwgB7Xi3SZzcsYweG3jCNoOeZOErY\\nLrfMgzNJsUaz3+9QyoldrOUc61E59ZxQZzFO4J55CVEYY6x1X3Dt6AzMcbfWadbMsyGJE4Zh5tQ0\\njNOEtprleuX2iI3hWBzR2lCWJWHkVuB+8zf+zi+tY99oEf3t//qvQRhWqzXr9RpfeeR5jDETfT/Q\\ntj3L5Zqu64jimLpqOZY1URzhBzj1j7CEsUdbt0RRRJal7nPEFzRVTRhExFmOQRAFIb7vkWU5o53p\\ny+6sEnpgtVqwWKWUTQkI2m5ks3GBVRaD1jOff/o5m+2WLIvJ8ohhnKmbmsPuRJotCIMITymEMlgz\\nsTs8cn1zxePTI8djiTaWcdJsr64JggCLYbmMybKI4ljT9xAGEWGkCAKfth5ACNI8AAzWWKbRQ8nA\\nucvjbppur9MZLriwZfjFkOls6qCdXNQNnM7/wiqwAmsN0rhCbKzFGIs2ljgOiRJJP1bEecAPf/R9\\nDuU7tHEvohcpvv3Rc6wyJFnA5mrFrGf6tmO3f+T+/orZDoxjx839HQ/v3nJztUEpRdu6W8DLFy/x\\nlEd5cgbHWhuMNs5dXsM0WoZuZJw0ngqomg7PC3h83OH5MdOszymkMUYLyuOBoetI4pSr7TVlcaLr\\nGsIkJIkTLIJFnqKkYTau2AaeR3kq8AMfL/DwQkXbVlxt19zd31Mej0zjQOAJPCURnmCcehaLFV07\\nME8TAJOZSdP0POhzO4lSKobpbJjcNNR1jRSK4nTCC1P0MDgZ6dRTtw16msnOJh9e6NN3LVVxYpxG\\n0ixhmEbatsdD0vU1H330iqYrUJ7AGKd8833p+oxDyzQ5v4ckiTFWE8QeaebRjzWeihinidV6Q1nX\\nNE2LH4SEcUSWplT1CeX5dP1AXVVEcUzTtyxXK4IgZJ5m5rnD2JF51iyXayTOKMfaHt+XKOEMbmY7\\nk+ceCGeU7imf9TYhSzbME1xvtkjh8pTMrFAiIE0S0iTksDsyDAYpBE3bON9SKymLEk8qPOXRNR2H\\n48Gpy8KI1WrN9dUV0zSz2WzZ7feEQehMo8eJ/d5F+iAMUkiquuLu9pY0S1zbJXRKtcd3b0HCX/+L\\nf++X1rFv1sXp3/2We6gUeMqnOpWAOTeXFdZI8mxJ23VIIYiznOOxZNYTWk9IFeIFglEbojBi6maO\\n5YFskVIUj04r3fTEyRI/CBEChs4F06EUcnS3DKk8hILJDHRdTRBGzLNwp9GpxvMEbdNydXXLZr1m\\n1j3Ks0yTxRpJkuZ0zcA4Ta6Im/nrQrrIc5bLFUp6pOkCKSVt33OqKuJYgjRcba8Ig5gvv3jN0Ddk\\nWUIcJ0zjSHUqUIHi/v6Oum4YhxGsPH/Euz1OKVwKp3WZFudiCpxLqhDnyb38uSu+ZZ7dypQxTgVl\\nzvJSLRWGACucEfH6akGcCL7z0Utev/2COPIIAss41vS6o5ta2r4iiANOpxMPj+9oqhN5nmDMwHK9\\nYFfsubu7Ic8TjscCT0o2yy3t0IIV+IF//uLo6fuBU1nRtiNpnHMqG/bHgixd4Hkhabbkd/7H74Jw\\nxsBKSnw/xFMBb98+EHkuT36VLxF4fPX2DbOd+MlP/4BvvXhFGme8ffOGx8cHPnz5MW+++ookSlBK\\nMpoJFQikL9B6pO8afvTDX0XoGeaZ7XZDVZ9Yb1cID5pmIA4jpnFkGkeCMCSM3EFqtSEIQoSn6Iae\\nuqrAGNqmRvo+k545Ht1ep+8rPv/qM5arFX3XkSU5QikMgmEc8c5pBxo4HAue3z/nan3F0+EtUlpm\\n7QZNWZZhzEiWhPhKMk8T2hqEVAgl8QKJ1i1ZniKEdbJPcHZ1fkTVuI2Efhhou4ah6+mHHqxktdnS\\ndh3TNFGWBVEcujZEFLPeXuN5IVJ4INzBHkUhgnPrSTtxRxT7eEqihIeeQYiZZb5B4nM47Om7mnEw\\n6FEy9QY9jbRtS9+6vqzbmVZnn2AfT/nnNAxNGAYo6TKYzOwGpOMw0bYt7x4eCcMIffYb9n2FUIqb\\n2yukkMRxyPZq44aN5zZAP/RMY0+eO6erv/ZHtYj+k3/+D8jzjCxzC7Z6MpyqgmmaaZoWo11eCsKw\\n3+/ZH0rSNCeKQrbbNVXTczwVhHHE0A1YDUHgTrssS/EQCBGQpEvGUWPNhNYj17e3KD9gbnuquqau\\nG+7urxHKMkwDh6LG8yOGYWIcepTyiOPo/EsLUMri+ZJxcmVq6FyCpBSSRZ7x7vEtRmtu729o6w5r\\nce4448w4TczzTJomPD19xeFQsF3fkOUJYSR5+/BAV5JChFMAAAifSURBVI8kceqGW2LmeCgIgpTV\\nckHbVFih0fPs9trO5VJrjTjHBCME6jxkkkJ+HefBWe0hhEQohWAGIZg1509+F9VstGWcRsapI818\\n/tSf/hPMpuVUHlgtnd5f6554ucAPPZphcDcgL8T3nA/sqTzQ9T1BGPLy1QuqpqPtWyQeabSgKlue\\nfesOpTz2u51rd2hnrNvUbtqsZIAUbmDi+xFCePzsk09RUpLlSwIvJE9TNtstX3z2BQJJ6Pl8+OoF\\netI8Pe3JlyuejjtW2yumCaq6o607qtOJeXA6+rqquL675dScCKOA65srQl85i7ay4jsffshut2O3\\n27Fcr9whjgEtOZUl29WaMIpQvsAiyNOMoetp25Z8uUBISZqkmGkmCALavqObBk7VSBT4PLx7g+cH\\nhElEXVZEQQzGgnIO92kW03c9CIizjIeHt9xsbohiJzv2fHc4bq/W3GzX5FmGQOCrEISHVArhSbQZ\\nUZ4g8DyyJKOqBwQeXTviBzFt21FVDXXd4AcBUipefPABSnpo7WKht5srEJYoCkniGAh591AwTYDV\\nBH4AFvp2pq5aZj0RBJIkCZkGF5k9jxNKCPrhRBSmSHyatgY9c3N1R1UO9E1PlsVI6b7erjbXBL7P\\nPA3u4JVu6DoNmjRJCIOIcRiRwiMIA4bz0r3v+efUCUucJKyW7iLTnJWCCIEXeGRZyv7whOd57p2X\\nEikkvu9mGH/1L/wR7Yn+5//yLzFWM00DQnjM48Q4uEa2s4Gbv/ZUfLd74unpQHg2ZO2GhsVizZvH\\nB+6e3dF1PatsQd1WqECxXS95fvcMaT32+4p3j09sNis8pTgWJae6gcm4SbICjWGaJ05lzTQbZzXW\\n9GT5grZpCYOIYWgwZuT27gajZ9q+o+8nbm+e8fi4I/Ajuqbl8fHROe0bSxBFLgisdq5Q1hrXL41j\\nVssl2/UdnD08l8sMhKCqe9quIwwDVqsVUZByKivubm/44INbvvvxK/q2oe7Hc7Cc+3S3nEPsLOcb\\nqER5LifeWqeR19YyG402bldPCvW1plzrgcBXJLHPeplye7Pg1379Y4a55M3DZ3z4vQ/5/M2XzEKD\\nLzAI4ixjnEZA8vLVK7IkZr3IefXyA+7v751DlVBMxhB4AYtsSeRHPLx+4ubZFUJYXr/+ijTNkFI6\\n1604xmho697dPlPXI3/aHwHL93/wA2cBKCRRHPL5Z58SBj5JlLJaZBz2O8zs7OYORYkWAqE83rx9\\nZOgsSZxwe31Hc6xY5kvqpmOaJ66ubjgWOzwliSMn3yyLI2VROvd0K9DnnVCDpu8GFqmbjm82a54O\\nexf9aIyLxJ4G+qGn6zsCP2ToXNyH9D32xZFxcv+f1hNRGlGWR169fIXQsD8UBHEMQtP3HdJ362mn\\n04nN+go7GaTq6bsOKZ2/6NC36Hkg8nzXT+4NT09HFusN0hMUpTM+kVahZ4jCFM8LeHi3Y54ND293\\njLPzTNV6Zp4m8ixjOK/dzcNInqUs8xw9zRxPBxA+zWmiqmr6rkF57rmbJtf/T/OYxTIhCCSzHvG9\\nAHX20X3x4h4lfD756ecoKVjmOXVV07au1+0UR5okjQl912IQUuJ7ASCQ0iOJYoQVzNPErMEazTRO\\nbk1qdi2v0A/wlKJra5qmBmFYLDOsdCq9OEnY7fcsFkvqpsX3A9erN2C0pasa/uZv/v1fWse+0SL6\\nH3/7n+L78usiOg2G06k5yz8ztw4iNOPYOaNi4eOpEHP+HLVCogLFOA5k8YKyLJFKEkaSJPYZ2h49\\nCoSM2BcFTVPyg1/5PkVZ0I+aOHC5Tkke0zQ1/TASRBnL5Yrd7oljccT3Q7JkwWa9wuiRNI2RUpxf\\nvIEkTVEqoCxOSDzqpmORpywXK5IkRkpFmqZEUULbnX+2NGEYesQcU1Ul4+hiTqqqQgjJZr1mmmba\\ndmDsZ9brFUHo8frtlwSe4kc/+i5Cdnz6ZYHg54XTnAsnXw+WhLDu1il+oYU/x1iijcYIwThpxmlk\\nnp0UNEtCpJoQcubX//j38ZOJd/vPsZ7msdwxeYJ4vSTZrKjLEmMmFssFVsLYd5zKI7c3a7I04eHt\\nG65vb5HK483TA9fXG+7v7ujrkePugPQ0UgmiODibTw/UTX1OJxD03cA4TqRJzn5/ZDYzH7z8gHl2\\nZtyeEnzxxad4vuI73/kui2zBF59+Sux7CCxeEIP0OFYlu2PBOAnmEQ67kiSO8YXnsnSubvnqyzdo\\nMxEnIXEQuBdV4J4za+iHCWsUYRTz7t1bkijGO68exYEz+Q7TiH1ZsDoXmTAMkUpydX3N0Hes8xVD\\n27HYrDk1FVq7mOM8c9nsfuBTFRUff/gx1kDbNQil6MeGaR4JohArFdMws1muWW+ic2EXdH3P0A+s\\nFjlm1vzk939Gnm6pmgkVBHRj7aKZg4hif0JYHyEkWJd+2jYjBqiqiiRJ0fPIerVGWLdaZI1FIt07\\nJgVN09CPLYtF5jxSrUVJyWK5JIo9tBnJFyGzHkFostyZyljresAfffgxk66dPV+WEXiKMPKJwhg9\\nuWdZ65EgVLx68YJpdvHnbdu4ry1Ajxbf8xmHEWMNgeeBFc4K0PfPSaajc0HDpUL4oeciq4eBKE/x\\nwwBtDNM8E0aRa4tpQxwmrJcrnt3e8/LFK/7sn/nLv7SOCfu1LdCFCxcuXPh/5RvNnb9w4cKF/9+5\\nFNELFy5ceA8uRfTChQsX3oNLEb1w4cKF9+BSRC9cuHDhPbgU0QsXLlx4Dy5F9MKFCxfeg0sRvXDh\\nwoX34FJEL1y4cOE9uBTRCxcuXHgPLkX0woULF96DSxG9cOHChffgUkQvXLhw4T24FNELFy5ceA8u\\nRfTChQsX3oNLEb1w4cKF9+BSRC9cuHDhPbgU0QsXLlx4Dy5F9MKFCxfeg0sRvXDhwoX34FJEL1y4\\ncOE9uBTRCxcuXHgPLkX0woULF96D/wNXrqfKnuuOLwAAAABJRU5ErkJggg==\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7fd172887150>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Example true image:\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\nAAAASUVORK5CYII=\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7fd172835d50>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"5CpeX6o_HC-R\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## Patch Transformations\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"888RmSmVFKCJ\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 715\n        },\n        \"outputId\": \"8ad26246-ea0a-4a67-9aeb-081dcdb89f86\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517598007997,\n          \"user_tz\": 480,\n          \"elapsed\": 1124,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"def _transform_vector(width, x_shift, y_shift, im_scale, rot_in_degrees):\\n\",\n        \"  \\\"\\\"\\\"\\n\",\n        \"   If one row of transforms is [a0, a1, a2, b0, b1, b2, c0, c1], \\n\",\n        \"   then it maps the output point (x, y) to a transformed input point \\n\",\n        \"   (x', y') = ((a0 x + a1 y + a2) / k, (b0 x + b1 y + b2) / k), \\n\",\n        \"   where k = c0 x + c1 y + 1. \\n\",\n        \"   The transforms are inverted compared to the transform mapping input points to output points.\\n\",\n        \"  \\\"\\\"\\\"\\n\",\n        \"\\n\",\n        \"  rot = float(rot_in_degrees) / 90. * (math.pi/2)\\n\",\n        \"  \\n\",\n        \"  # Standard rotation matrix\\n\",\n        \"  # (use negative rot because tf.contrib.image.transform will do the inverse)\\n\",\n        \"  rot_matrix = np.array(\\n\",\n        \"      [[math.cos(-rot), -math.sin(-rot)],\\n\",\n        \"      [math.sin(-rot), math.cos(-rot)]]\\n\",\n        \"  )\\n\",\n        \"  \\n\",\n        \"  # Scale it\\n\",\n        \"  # (use inverse scale because tf.contrib.image.transform will do the inverse)\\n\",\n        \"  inv_scale = 1. / im_scale \\n\",\n        \"  xform_matrix = rot_matrix * inv_scale\\n\",\n        \"  a0, a1 = xform_matrix[0]\\n\",\n        \"  b0, b1 = xform_matrix[1]\\n\",\n        \"  \\n\",\n        \"  # At this point, the image will have been rotated around the top left corner,\\n\",\n        \"  # rather than around the center of the image. \\n\",\n        \"  #\\n\",\n        \"  # To fix this, we will see where the center of the image got sent by our transform,\\n\",\n        \"  # and then undo that as part of the translation we apply.\\n\",\n        \"  x_origin = float(width) / 2\\n\",\n        \"  y_origin = float(width) / 2\\n\",\n        \"  \\n\",\n        \"  x_origin_shifted, y_origin_shifted = np.matmul(\\n\",\n        \"      xform_matrix,\\n\",\n        \"      np.array([x_origin, y_origin]),\\n\",\n        \"  )\\n\",\n        \"\\n\",\n        \"  x_origin_delta = x_origin - x_origin_shifted\\n\",\n        \"  y_origin_delta = y_origin - y_origin_shifted\\n\",\n        \"  \\n\",\n        \"  # Combine our desired shifts with the rotation-induced undesirable shift\\n\",\n        \"  a2 = x_origin_delta - (x_shift/(2*im_scale))\\n\",\n        \"  b2 = y_origin_delta - (y_shift/(2*im_scale))\\n\",\n        \"    \\n\",\n        \"  # Return these values in the order that tf.contrib.image.transform expects\\n\",\n        \"  return np.array([a0, a1, a2, b0, b1, b2, 0, 0]).astype(np.float32)\\n\",\n        \"\\n\",\n        \"def test_random_transform(min_scale=0.5, max_scale=1.0,  max_rotation=22.5):\\n\",\n        \"  \\\"\\\"\\\"\\n\",\n        \"  Scales the image between min_scale and max_scale\\n\",\n        \"  \\\"\\\"\\\"\\n\",\n        \"  img_shape = [100,100,3]\\n\",\n        \"  img = np.ones(img_shape)\\n\",\n        \"  \\n\",\n        \"  sess = tf.Session()\\n\",\n        \"  image_in = tf.placeholder(dtype=tf.float32, shape=img_shape)\\n\",\n        \"  width = img_shape[0]\\n\",\n        \"  \\n\",\n        \"  def _random_transformation():\\n\",\n        \"    im_scale = np.random.uniform(low=min_scale, high=1.0)\\n\",\n        \"    \\n\",\n        \"    padding_after_scaling = (1-im_scale) * width\\n\",\n        \"    x_delta = np.random.uniform(-padding_after_scaling, padding_after_scaling)\\n\",\n        \"    y_delta = np.random.uniform(-padding_after_scaling, padding_after_scaling)\\n\",\n        \"    \\n\",\n        \"    \\n\",\n        \"    rot = np.random.uniform(-max_rotation, max_rotation)\\n\",\n        \"    \\n\",\n        \"    return _transform_vector(width, \\n\",\n        \"                                     x_shift=x_delta,\\n\",\n        \"                                     y_shift=y_delta,\\n\",\n        \"                                     im_scale=im_scale, \\n\",\n        \"                                     rot_in_degrees=rot)\\n\",\n        \"\\n\",\n        \"  random_xform_vector = tf.py_func(_random_transformation, [], tf.float32)\\n\",\n        \"  random_xform_vector.set_shape([8])\\n\",\n        \"\\n\",\n        \"  output = tf.contrib.image.transform(image_in, random_xform_vector , \\\"BILINEAR\\\")\\n\",\n        \"  \\n\",\n        \"  xformed_img = sess.run(output, feed_dict={\\n\",\n        \"      image_in: img\\n\",\n        \"  })\\n\",\n        \"  \\n\",\n        \"  show(xformed_img)\\n\",\n        \"\\n\",\n        \"for i in range(2):\\n\",\n        \"  print(\\\"Test image with random transform: %s\\\" % (i+1))\\n\",\n        \"  test_random_transform(min_scale=0.25, max_scale=2.0, max_rotation=22.5)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Test image with random transform: 1\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7fd1aa414250>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Test image with random transform: 2\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAUsAAAFMCAYAAABCsp4mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAACORJREFUeJzt3T9PFesaxmHQHaSAAiykUAsp1IA2\\nNlY2VjY2+oEo/Rp+AG20sLKxsrHCKCZKohiVBDFKgSS6TuOZM9lnxnXrgplZa66rerMj8iY7+fk8\\nmfVnejAYDKYA+K1jbV8AYByIJUBALAECYgkQEEuAgFgCBMQSICCWAIF/mvgla2trTfwagJH8rlUm\\nS4CAWAIExBIgIJYAAbEECIglQEAsAQJiCRAQS4CAWAIExBIgIJYAAbEECIglQEAsAQJiCRAQS4CA\\nWAIExBIgIJYAAbEECIglQEAsAQJiCRAQS4CAWAIExBIgIJYAAbEECIglQEAsAQJiCRAQS4CAWAIE\\nxBIgIJYAAbEECIglQEAsAQJiCRAQS4CAWAIExBIgIJYAAbEECIglQEAsAQJiCRAQS4CAWAIExBIg\\nIJYAAbEECIglQEAsAQJiCRAQS4CAWAIExBIgIJYAAbEECIglQEAsAQJiCRAQS4CAWAIExBIgIJYA\\nAbEECIglQEAsAQJiCRAQS4CAWAIExBIgIJYAAbEECIglQEAsAQJiCRAQS4CAWAIExBIgIJYAAbEE\\nCIglQEAsAQJiCRAQS4DAP21fYJi1tbXi/ObNm+K8vr5enJ8/f16cv3//3si9gH4xWQIExBIg0Mk1\\nfHp6uvK/nzt3rvJ88+bNoX/ny5cvi3N5bS+v84PB4I/uCfSHyRIgIJYAgU6u4SsrK4f+d164cKHy\\nfOvWrco///Pnz+Jct7ZvbGwc5hWBDjNZAgTEEiDQyTV8dXW17StMHTv2v39HLl26VHmuU35hfN2L\\n58svsAe6z2QJEBBLgEAn1/Dy0+pxdOLEieJ85cqVynOdb9++Fee6p/BbW1ujXhH4QyZLgIBYAgQ6\\nuYb32fz8fHG+evVq5bnO58+fi3PdU/hPnz6NekXoJZMlQEAsAQKdWcNnZmbavsLYW1xcLM7Xrl2r\\nPNf5+PFjca57Cr+7uzvqFWFsmSwBAmIJEOjMGt6F94P32dLSUuX5+vXrQ3/23bt3xbnuKfze3t6o\\nV4RWmSwBAmIJEOjMGn4Un45OM86cOVN5vnHjxtCfff36dXGuewp/cHAw6hVhZCZLgIBYAgQ6s4Yv\\nLy+3fQVaUP7/Xj4P+y748vfA1z2B9z3wHCaTJUBALAECnVnD4U/UfQ/87du3K/98+Xvg69Z23wPP\\n75gsAQJiCRBodQ2fm5tr89fTI+Xvgb98+XLluc7+/n5xrnvh/Obm5qhXpONMlgABsQQItLqGez84\\n42B2drY4130PfHlVv3PnTjMXo1EmS4CAWAIEWl3DfTo6k6L8lJzJZLIECIglQKDVNbz8qdowzsov\\nUGcymSwBAmIJEPARbXAIvDd88pksAQJiCRBofA1fWFho+lcCjMxkCRAQS4BA42u494MzKb59+9b2\\nFWiQyRIgIJYAgcbXcJ+OzqTwfvB+MVkCBMQSIND4Gr60tNT0r4Qj4dPR+8VkCRDwqUPwl7a2ttq+\\nAg0yWQIExBIg0MgafurUqSZ+DcCRMVkCBMQSINDIGu4tjkyKnZ2dtq9AS0yWAAGxBAg0sob7wF8m\\nhbc49pfJEiAglgCBRtbwxcXFJn4NHDkf+NtfJkuAgFgCBHxEG/yB7e3ttq9AS0yWAAGxBAiIJUBA\\nLAECYgkQ8DQchvj48WPbV6ADTJYAAbEECFjDYQjvB2dqymQJEBFLgIA1HIbw6ehMTZksASJiCRCw\\nhsMQu7u7bV+BDjBZAgTEEiAglgABsQQIiCVAwNNwqPD27du2r0DHmCwBAmIJELCGQwXvB+ffTJYA\\nAbEECFjDoYI1nH8zWQIExBIgYA2HCnt7e21fgY4xWQIExBIgIJYAAbEECIglQMDTcPjl9evXbV+B\\nDjNZAgTEEiBgDYdf1tfX274CHWayBAiIJUDAGg6/+Fg2fsdkCRAQS4CANRx+OTg4aPsKdJjJEiAg\\nlgABsQQIiCVAQCwBAp6G02svXrxo+wqMCZMlQEAsAQLWcHrN+8FJmSwBAmIJELCG02vWcFImS4CA\\nWAIErOH02mAwaPsKjAmTJUBALAEC1nB658ePH21fgTFksgQIiCVAwBpO73ghOn/DZAkQEEuAgDWc\\n3llfX2/7CowhkyVAQCwBAtZweufVq1dtX4ExZLIECIglQEAsAQJiCRAQS4CAp+H0wv7+fttXYMyZ\\nLAECYgkQsIbTC94PzqhMlgABsQQIWMPpBZ+OzqhMlgABsQQIWMPphc3NzbavwJgzWQIExBIgIJYA\\nAbEECIglQMDTcCbW169f274CE8RkCRAQS4CANZyJ5f3gHCaTJUBALAEC1nAmlk9H5zCZLAECYgkQ\\naGQNv3v3bnFeWVkpzqurq8V5dna2iavQI+/fv2/7CkwQkyVAQCwBAo2s4eVPqS6fHz58OPRnz58/\\nX5zLK3z5fPz48VGvCPBbJkuAgFgCBDr/ovSNjY3K8/379yv//PT0dHGuW9svXrx4mFekQ3Z2dtq+\\nAhPKZAkQEEuAQOfX8D81GAyKc/m9wcn7hGdmZopz+QXz5RV+eXl51CtyhLwfnKNisgQIiCVAYOLW\\n8FEcHBwU52fPnlWe68zNzRXnuqfwZ8+eHfWKDOHT0TkqJkuAgFgCBKzhh2Rvb684P336tPJcZ2Fh\\noTjXPYVfWloa9Yq9sL293fYVmFAmS4CAWAIErOEdsLu7W5yfPHlSea5z6tSp4lz3FP7kyZOjXhF6\\nz2QJEBBLgIA1fMx9+vSp8vz48eOhP3v69OniXPcUfn5+ftQrHrkPHz60fQV6wGQJEBBLgIA1vMe2\\ntrYqz48ePRr6s+fOnSvOdU/hm/oueO8HpwkmS4CAWAIErOH8lTdv3lSeHzx4MPRny98FX/cU/tix\\n/N9xn45OE0yWAAGxBAhYw2lc3XfB37t3r/LPl78L/r9re3ll//Lly2FfEf6PyRIgIJYAgelB+Yu2\\nAahksgQIiCVAQCwBAmIJEBBLgIBYAgTEEiAglgABsQQIiCVAQCwBAmIJEBBLgIBYAgTEEiAglgAB\\nsQQIiCVAQCwBAmIJEBBLgIBYAgTEEiDwH5argwFpL/pdAAAAAElFTkSuQmCC\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7fd164cf01d0>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"-pdqHnwkA0mN\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## ModelState\\n\",\n        \"\\n\",\n        \"This code handles loading different Imagenet models, running them, and storing their state.\\n\",\n        \"\\n\",\n        \"It defines `M`, a `ModelState` instance.\\n\",\n        \"\\n\",\n        \"### Available models:\\n\",\n        \"* xception\\n\",\n        \"* vgg16\\n\",\n        \"* vgg19\\n\",\n        \"* resnet50\\n\",\n        \"* inceptionv3\\n\",\n        \"* mobilenet\\n\",\n        \"\\n\",\n        \"## API\\n\",\n        \"\\n\",\n        \"###`M.load_model(model_name)` \\n\",\n        \"###`M.patch(new_patch)`\\n\",\n        \"###`M.patch()`\\n\",\n        \"###`M.reset_patch()`\\n\",\n        \"###`M.train_step(images?, target_ys?, learning_rate?)`\\n\",\n        \"###`M.inference_batch(images?, target_ys?)`\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"TDQD2R6QA00p\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"#@title class ModelState()\\n\",\n        \"\\n\",\n        \"def get_peace_mask(shape):\\n\",\n        \"  path = osp.join(DATA_DIR, \\\"peace_sign.png\\\")\\n\",\n        \"  pic = PIL.Image.open(path)\\n\",\n        \"  pic = pic.resize(shape[:2], PIL.Image.ANTIALIAS)\\n\",\n        \"  if path.endswith('.png'):\\n\",\n        \"    ch = 4\\n\",\n        \"  else:\\n\",\n        \"    ch = 3\\n\",\n        \"  pic = np.array(pic.getdata()).reshape(pic.size[0], pic.size[1], ch)\\n\",\n        \"  pic = pic / 127.5 - 1\\n\",\n        \"  pic = pic[:,:,3]\\n\",\n        \"\\n\",\n        \"  peace_mask = (pic + 1.0) / 2\\n\",\n        \"  peace_mask = np.expand_dims(peace_mask, 2)\\n\",\n        \"  peace_mask = np.broadcast_to(peace_mask, shape)\\n\",\n        \"  return peace_mask\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"def _circle_mask(shape, sharpness = 40):\\n\",\n        \"  \\\"\\\"\\\"Return a circular mask of a given shape\\\"\\\"\\\"\\n\",\n        \"  assert shape[0] == shape[1], \\\"circle_mask received a bad shape: \\\" + shape\\n\",\n        \"\\n\",\n        \"  diameter = shape[0]  \\n\",\n        \"  x = np.linspace(-1, 1, diameter)\\n\",\n        \"  y = np.linspace(-1, 1, diameter)\\n\",\n        \"  xx, yy = np.meshgrid(x, y, sparse=True)\\n\",\n        \"  z = (xx**2 + yy**2) ** sharpness\\n\",\n        \"\\n\",\n        \"  mask = 1 - np.clip(z, -1, 1)\\n\",\n        \"  mask = np.expand_dims(mask, axis=2)\\n\",\n        \"  mask = np.broadcast_to(mask, shape).astype(np.float32)\\n\",\n        \"  return mask\\n\",\n        \"\\n\",\n        \"def _gen_target_ys():\\n\",\n        \"  label = TARGET_LABEL\\n\",\n        \"  y_one_hot = np.zeros(1000)\\n\",\n        \"  y_one_hot[label] = 1.0\\n\",\n        \"  y_one_hot = np.tile(y_one_hot, (BATCH_SIZE, 1))\\n\",\n        \"  return y_one_hot\\n\",\n        \"\\n\",\n        \"TARGET_ONEHOT = _gen_target_ys()\\n\",\n        \"      \\n\",\n        \"class ModelContainer():\\n\",\n        \"  \\\"\\\"\\\"Encapsulates an Imagenet model, and methods for interacting with it.\\\"\\\"\\\"\\n\",\n        \"  \\n\",\n        \"  def __init__(self, model_name, verbose=True, peace_mask=None, peace_mask_overlay=0.0):\\n\",\n        \"    # Peace Mask: None, \\\"Forward\\\", \\\"Backward\\\"\\n\",\n        \"    self.model_name = model_name\\n\",\n        \"    self.graph = tf.Graph()\\n\",\n        \"    self.sess = tf.Session(graph=self.graph)\\n\",\n        \"    self.peace_mask = peace_mask\\n\",\n        \"    self.patch_shape = PATCH_SHAPE\\n\",\n        \"    self._peace_mask_overlay = peace_mask_overlay\\n\",\n        \"    self.load_model(verbose=verbose)\\n\",\n        \"\\n\",\n        \"    \\n\",\n        \"  def patch(self, new_patch=None):\\n\",\n        \"    \\\"\\\"\\\"Retrieve or set the adversarial patch.\\n\",\n        \"    \\n\",\n        \"    new_patch: The new patch to set, or None to get current patch.\\n\",\n        \"    \\n\",\n        \"    Returns: Itself if it set a new patch, or the current patch.\\\"\\\"\\\"\\n\",\n        \"    if new_patch is None:\\n\",\n        \"      return self._run(self._clipped_patch)\\n\",\n        \"      \\n\",\n        \"    self._run(self._assign_patch, {self._patch_placeholder: new_patch})\\n\",\n        \"    return self\\n\",\n        \"  \\n\",\n        \"  \\n\",\n        \"  def reset_patch(self):\\n\",\n        \"    \\\"\\\"\\\"Reset the adversarial patch to all zeros.\\\"\\\"\\\"\\n\",\n        \"    self.patch(np.zeros(self.patch_shape))\\n\",\n        \"    \\n\",\n        \"  def train_step(self, images=None, target_ys=None, learning_rate=5.0, scale=(0.1, 1.0), dropout=None, patch_disguise=None, disguise_alpha=None):\\n\",\n        \"    \\\"\\\"\\\"Train the model for one step.\\n\",\n        \"    \\n\",\n        \"    Args:\\n\",\n        \"      images: A batch of images to train on, it loads one if not present.\\n\",\n        \"      target_ys: Onehot target vector, defaults to TARGET_ONEHOT\\n\",\n        \"      learning_rate: Learning rate for this train step.\\n\",\n        \"      scale: Either a scalar value for the exact scale, or a (min, max) tuple for the scale range.\\n\",\n        \"\\n\",\n        \"    Returns: Loss on the target ys.\\\"\\\"\\\"\\n\",\n        \"    if images is None:\\n\",\n        \"      images = image_loader.get_images()\\n\",\n        \"    if target_ys is None:\\n\",\n        \"      target_ys = TARGET_ONEHOT\\n\",\n        \"    \\n\",\n        \"    feed_dict =  {self._image_input: images, \\n\",\n        \"                        self._target_ys: target_ys,\\n\",\n        \"                        self._learning_rate: learning_rate}\\n\",\n        \"    \\n\",\n        \"    if patch_disguise is not None:\\n\",\n        \"      if disguise_alpha is None:\\n\",\n        \"        raise ValueError(\\\"You need disguise_alpha\\\")\\n\",\n        \"      feed_dict[self.patch_disguise] = patch_disguise\\n\",\n        \"      feed_dict[self.disguise_alpha] = disguise_alpha\\n\",\n        \"    \\n\",\n        \"\\n\",\n        \"    loss, _ = self._run([self._loss, self._train_op], feed_dict, scale=scale, dropout=dropout) \\n\",\n        \"    return loss\\n\",\n        \"  \\n\",\n        \"  def inference_batch(self, images=None, target_ys=None, scale=None):\\n\",\n        \"    \\\"\\\"\\\"Report loss and label probabilities, and patched images for a batch.\\n\",\n        \"    \\n\",\n        \"    Args:\\n\",\n        \"      images: A batch of images to train on, it loads if not present.\\n\",\n        \"      target_ys: The target_ys for loss calculation, TARGET_ONEHOT if not present.\\\"\\\"\\\"\\n\",\n        \"    if images is None:\\n\",\n        \"      images = image_loader.get_images()\\n\",\n        \"    if target_ys is None:\\n\",\n        \"      target_ys = TARGET_ONEHOT\\n\",\n        \"      \\n\",\n        \"    feed_dict = {self._image_input: images, self._target_ys: target_ys}\\n\",\n        \"\\n\",\n        \"    loss_per_example, ps, ims = self._run([self._loss_per_example, self._probabilities, self._patched_input],\\n\",\n        \"                            feed_dict, scale=scale)\\n\",\n        \"    return loss_per_example, ps, ims\\n\",\n        \"  \\n\",\n        \"  def load_model(self, verbose=True):\\n\",\n        \"   \\n\",\n        \"    model = NAME_TO_MODEL[self.model_name]\\n\",\n        \"    if self.model_name in ['xception', 'inceptionv3', 'mobilenet']:\\n\",\n        \"      keras_mode = False\\n\",\n        \"    else:\\n\",\n        \"      keras_mode = True\\n\",\n        \"    patch = None\\n\",\n        \"\\n\",\n        \"    self._make_model_and_ops(model, keras_mode, patch, verbose)\\n\",\n        \"            \\n\",\n        \"  def _run(self, target, feed_dict=None, scale=None, dropout=None):\\n\",\n        \"    K.set_session(self.sess)\\n\",\n        \"    if feed_dict is None:\\n\",\n        \"      feed_dict = {}\\n\",\n        \"    feed_dict[self.learning_phase] = False\\n\",\n        \"    \\n\",\n        \"    if scale is not None:\\n\",\n        \"      if isinstance(scale, (tuple, list)):\\n\",\n        \"        scale_min, scale_max = scale\\n\",\n        \"      else:\\n\",\n        \"        scale_min, scale_max = (scale, scale)\\n\",\n        \"      feed_dict[self.scale_min] = scale_min\\n\",\n        \"      feed_dict[self.scale_max] = scale_max\\n\",\n        \"         \\n\",\n        \"    if dropout is not None:\\n\",\n        \"      feed_dict[self.dropout] = dropout\\n\",\n        \"    return self.sess.run(target, feed_dict=feed_dict)\\n\",\n        \"  \\n\",\n        \"  \\n\",\n        \"  def _make_model_and_ops(self, M, keras_mode, patch_val, verbose):\\n\",\n        \"    start = time.time()\\n\",\n        \"    K.set_session(self.sess)\\n\",\n        \"    with self.sess.graph.as_default():\\n\",\n        \"      self.learning_phase = K.learning_phase()\\n\",\n        \"\\n\",\n        \"      image_shape = (299, 299, 3)\\n\",\n        \"      self._image_input = keras.layers.Input(shape=image_shape)\\n\",\n        \"      \\n\",\n        \"      self.scale_min = tf.placeholder_with_default(SCALE_MIN, [])\\n\",\n        \"      self.scale_max = tf.placeholder_with_default(SCALE_MAX, [])\\n\",\n        \"      self._scales = tf.random_uniform([BATCH_SIZE], minval=self.scale_min, maxval=self.scale_max)\\n\",\n        \"\\n\",\n        \"      image_input = self._image_input\\n\",\n        \"      self.patch_disguise = tf.placeholder_with_default(tf.zeros(self.patch_shape), shape=self.patch_shape)\\n\",\n        \"      self.disguise_alpha = tf.placeholder_with_default(0.0, [])\\n\",\n        \"      patch = tf.get_variable(\\\"patch\\\", self.patch_shape, dtype=tf.float32, initializer=tf.zeros_initializer)\\n\",\n        \"      self._patch_placeholder = tf.placeholder(dtype=tf.float32, shape=self.patch_shape)\\n\",\n        \"      self._assign_patch = tf.assign(patch, self._patch_placeholder)\\n\",\n        \"\\n\",\n        \"      modified_patch = patch\\n\",\n        \"\\n\",\n        \"      def clip_to_valid_image(x):    \\n\",\n        \"        return tf.clip_by_value(x, clip_value_min=-1.,clip_value_max=1.)\\n\",\n        \"\\n\",\n        \"      if self.peace_mask == 'forward':\\n\",\n        \"        mask = get_peace_mask(self.patch_shape)\\n\",\n        \"        modified_patch = patch * (1 - mask) - np.ones(self.patch_shape) * mask + (1+patch) * mask * self._peace_mask_overlay\\n\",\n        \"\\n\",\n        \"      self._clipped_patch = clip_to_valid_image(modified_patch)\\n\",\n        \"      \\n\",\n        \"      if keras_mode:\\n\",\n        \"        image_input = tf.image.resize_images(image_input, (224, 224))\\n\",\n        \"        image_shape = (224, 224, 3)\\n\",\n        \"        modified_patch = tf.image.resize_images(patch, (224, 224))\\n\",\n        \"      \\n\",\n        \"      self.dropout = tf.placeholder_with_default(1.0, [])\\n\",\n        \"      patch_with_dropout = tf.nn.dropout(modified_patch, keep_prob=self.dropout)\\n\",\n        \"      patched_input = clip_to_valid_image(self._random_overlay(image_input, patch_with_dropout, image_shape))\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"      def to_keras(x):\\n\",\n        \"        x = (x + 1) * 127.5\\n\",\n        \"        R,G,B = tf.split(x, 3, 3)\\n\",\n        \"        R -= 123.68\\n\",\n        \"        G -= 116.779\\n\",\n        \"        B -= 103.939\\n\",\n        \"        x = tf.concat([B,G,R], 3)\\n\",\n        \"\\n\",\n        \"        return x\\n\",\n        \"\\n\",\n        \"      # Since this is a return point, we do it before the Keras color shifts\\n\",\n        \"      # (but after the resize, so we can see what is really going on)\\n\",\n        \"      self._patched_input = patched_input\\n\",\n        \"\\n\",\n        \"      if keras_mode:\\n\",\n        \"        patched_input = to_keras(patched_input)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"      # Labels for our attack (e.g. always a toaster)\\n\",\n        \"      self._target_ys = tf.placeholder(tf.float32, shape=(None, 1000))\\n\",\n        \"\\n\",\n        \"      model = M(input_tensor=patched_input, weights='imagenet')\\n\",\n        \"\\n\",\n        \"      # Pre-softmax logits of our pretrained model\\n\",\n        \"      logits = model.outputs[0].op.inputs[0]\\n\",\n        \"\\n\",\n        \"      self._loss_per_example = tf.nn.softmax_cross_entropy_with_logits(\\n\",\n        \"          labels=self._target_ys, \\n\",\n        \"          logits=logits\\n\",\n        \"      )\\n\",\n        \"      self._target_loss = tf.reduce_mean(self._loss_per_example)\\n\",\n        \"      \\n\",\n        \"      self._patch_loss = tf.nn.l2_loss(patch - self.patch_disguise) * self.disguise_alpha\\n\",\n        \"      \\n\",\n        \"      \\n\",\n        \"      \\n\",\n        \"      self._loss = self._target_loss + self._patch_loss\\n\",\n        \"\\n\",\n        \"      # Train our attack by only training on the patch variable\\n\",\n        \"      self._learning_rate = tf.placeholder(tf.float32)\\n\",\n        \"      self._train_op = tf.train.GradientDescentOptimizer(self._learning_rate)\\\\\\n\",\n        \"                               .minimize(self._loss, var_list=[patch])\\n\",\n        \"\\n\",\n        \"      self._probabilities = model.outputs[0]\\n\",\n        \"\\n\",\n        \"      if patch_val is not None:\\n\",\n        \"        self.patch(patch_val)\\n\",\n        \"      else:\\n\",\n        \"        self.reset_patch()\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"      elapsed = time.time() - start\\n\",\n        \"      if verbose:\\n\",\n        \"        print(\\\"Finished loading {}, took {:.0f}s\\\".format(self.model_name, elapsed))       \\n\",\n        \"\\n\",\n        \"\\n\",\n        \"  def _pad_and_tile_patch(self, patch, image_shape):\\n\",\n        \"    # Calculate the exact padding\\n\",\n        \"    # Image shape req'd because it is sometimes 299 sometimes 224\\n\",\n        \"    \\n\",\n        \"    # padding is the amount of space available on either side of the centered patch\\n\",\n        \"    # WARNING: This has been integer-rounded and could be off by one. \\n\",\n        \"    #          See _pad_and_tile_patch for usage\\n\",\n        \"    return tf.stack([patch] * BATCH_SIZE)\\n\",\n        \"\\n\",\n        \"  def _random_overlay(self, imgs, patch, image_shape):\\n\",\n        \"    \\\"\\\"\\\"Augment images with random rotation, transformation.\\n\",\n        \"\\n\",\n        \"    Image: BATCHx299x299x3\\n\",\n        \"    Patch: 50x50x3\\n\",\n        \"\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"    # Add padding\\n\",\n        \"    \\n\",\n        \"    image_mask = _circle_mask(image_shape)\\n\",\n        \"\\n\",\n        \"    if self.peace_mask == 'backward':\\n\",\n        \"      peace_mask = get_peace_mask(image_shape)\\n\",\n        \"      image_mask = (image_mask * peace_mask).astype(np.float32)\\n\",\n        \"    image_mask = tf.stack([image_mask] * BATCH_SIZE)\\n\",\n        \"    padded_patch = tf.stack([patch] * BATCH_SIZE)\\n\",\n        \"\\n\",\n        \"    transform_vecs = []    \\n\",\n        \"    \\n\",\n        \"    def _random_transformation(scale_min, scale_max, width):\\n\",\n        \"      im_scale = np.random.uniform(low=scale_min, high=scale_max)\\n\",\n        \"\\n\",\n        \"      padding_after_scaling = (1-im_scale) * width\\n\",\n        \"      x_delta = np.random.uniform(-padding_after_scaling, padding_after_scaling)\\n\",\n        \"      y_delta = np.random.uniform(-padding_after_scaling, padding_after_scaling)\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"      rot = np.random.uniform(-MAX_ROTATION, MAX_ROTATION)\\n\",\n        \"\\n\",\n        \"      return _transform_vector(width, \\n\",\n        \"                                       x_shift=x_delta,\\n\",\n        \"                                       y_shift=y_delta,\\n\",\n        \"                                       im_scale=im_scale, \\n\",\n        \"                                       rot_in_degrees=rot)    \\n\",\n        \"\\n\",\n        \"    for i in range(BATCH_SIZE):\\n\",\n        \"      # Shift and scale the patch for each image in the batch\\n\",\n        \"      random_xform_vector = tf.py_func(_random_transformation, [self.scale_min, self.scale_max, image_shape[0]], tf.float32)\\n\",\n        \"      random_xform_vector.set_shape([8])\\n\",\n        \"\\n\",\n        \"      transform_vecs.append(random_xform_vector)\\n\",\n        \"\\n\",\n        \"    image_mask = tf.contrib.image.transform(image_mask, transform_vecs, \\\"BILINEAR\\\")\\n\",\n        \"    padded_patch = tf.contrib.image.transform(padded_patch, transform_vecs, \\\"BILINEAR\\\")\\n\",\n        \"\\n\",\n        \"    inverted_mask = (1 - image_mask)\\n\",\n        \"    return imgs * inverted_mask + padded_patch * image_mask\\n\",\n        \"  \"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"0VmOv_gEA-9z\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 119\n        },\n        \"outputId\": \"6f52e14f-f951-4790-da19-8aa241a90bca\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517598047735,\n          \"user_tz\": 480,\n          \"elapsed\": 34835,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"#@ MetaModel\\n\",\n        \"\\n\",\n        \"class MetaModel():\\n\",\n        \"  def __init__(self, verbose=True, peace_mask=None, peace_mask_overlay=0.0):\\n\",\n        \"    self.nc = {m: ModelContainer(m, verbose=verbose, peace_mask=peace_mask, peace_mask_overlay=peace_mask_overlay) for m in MODEL_NAMES}\\n\",\n        \"    self._patch = np.zeros(PATCH_SHAPE)\\n\",\n        \"    self.patch_shape = PATCH_SHAPE\\n\",\n        \"        \\n\",\n        \"  def patch(self, new_patch=None):\\n\",\n        \"    \\\"\\\"\\\"Retrieve or set the adversarial patch.\\n\",\n        \"    \\n\",\n        \"    new_patch: The new patch to set, or None to get current patch.\\n\",\n        \"    \\n\",\n        \"    Returns: Itself if it set a new patch, or the current patch.\\\"\\\"\\\"\\n\",\n        \"    if new_patch is None:\\n\",\n        \"      return self._patch\\n\",\n        \"    \\n\",\n        \"    self._patch = new_patch\\n\",\n        \"    return self\\n\",\n        \"  \\n\",\n        \"  def reset_patch(self):\\n\",\n        \"    \\\"\\\"\\\"Reset the adversarial patch to all zeros.\\\"\\\"\\\"\\n\",\n        \"    self.patch(np.zeros(self.patch_shape))\\n\",\n        \"    \\n\",\n        \"  def train_step(self, model=None, steps=1, images=None, target_ys=None, learning_rate=5.0, scale=None, **kwargs):\\n\",\n        \"    \\\"\\\"\\\"Train the model for `steps` steps.\\n\",\n        \"    \\n\",\n        \"    Args:\\n\",\n        \"      images: A batch of images to train on, it loads one if not present.\\n\",\n        \"      target_ys: Onehot target vector, defaults to TARGET_ONEHOT\\n\",\n        \"      learning_rate: Learning rate for this train step.\\n\",\n        \"      scale: Either a scalar value for the exact scale, or a (min, max) tuple for the scale range.\\n\",\n        \"      \\n\",\n        \"    Returns: Loss on the target ys.\\\"\\\"\\\"\\n\",\n        \"    \\n\",\n        \"    \\n\",\n        \"    if model is not None:\\n\",\n        \"      to_train = [self.nc[model]]\\n\",\n        \"    else:\\n\",\n        \"      to_train = self.nc.values()\\n\",\n        \"      \\n\",\n        \"    losses = []\\n\",\n        \"    for mc in to_train:\\n\",\n        \"      mc.patch(self.patch())\\n\",\n        \"      for i in xrange(steps): \\n\",\n        \"        loss = mc.train_step(images, target_ys, learning_rate, scale=scale, **kwargs)\\n\",\n        \"        losses.append(loss)\\n\",\n        \"      self.patch(mc.patch())\\n\",\n        \"    return np.mean(losses)\\n\",\n        \"  \\n\",\n        \"  def inference_batch(self, model, images=None, target_ys=None, scale=None):\\n\",\n        \"    \\\"\\\"\\\"Report loss and label probabilities, and patched images for a batch.\\n\",\n        \"    \\n\",\n        \"    Args:\\n\",\n        \"      images: A batch of images to train on, it loads if not present.\\n\",\n        \"      target_ys: The target_ys for loss calculation, TARGET_ONEHOT if not present.\\n\",\n        \"      scale: Either a scalar value for the exact scale, or a (min, max) tuple for the scale range.\\n\",\n        \"    \\\"\\\"\\\"\\n\",\n        \"\\n\",\n        \"    mc = self.nc[model]\\n\",\n        \"    mc.patch(self.patch())\\n\",\n        \"    return mc.inference_batch(images, target_ys, scale=scale)\\n\",\n        \"  \\n\",\n        \"print(\\\"Creating MetaModel...\\\")\\n\",\n        \"MM = MetaModel()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Creating MetaModel...\\n\",\n            \"Finished loading resnet50, took 9s\\n\",\n            \"Finished loading xception, took 7s\\n\",\n            \"Finished loading inceptionv3, took 14s\\n\",\n            \"Finished loading vgg16, took 3s\\n\",\n            \"Finished loading vgg19, took 2s\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"zIVtueEZGlOe\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## Display Utils\\n\",\n        \"\\n\",\n        \"### APIs:\\n\",\n        \"\\n\",\n        \"#### `show(image)`\\n\",\n        \"#### `show_patch(patch)`\\n\",\n        \"#### `report(step=None, show_images=False)`\\n\",\n        \"#### `cross_model_report()`\\n\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"xtFDYHWaGxLP\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"def _convert(im):\\n\",\n        \"  return ((im + 1) * 127.5).astype(np.uint8)\\n\",\n        \"\\n\",\n        \"def show(im):\\n\",\n        \"  plt.axis('off')\\n\",\n        \"  plt.imshow(_convert(im), interpolation=\\\"nearest\\\")\\n\",\n        \"  plt.show()\\n\",\n        \"  \\n\",\n        \"def show_patch(patch):\\n\",\n        \"  circle = _circle_mask((299, 299, 3))\\n\",\n        \"  show(circle * patch + (1-circle))\\n\",\n        \"  \\n\",\n        \"def report(model, step=None, show_images=False, n=400, verbose=True, scale=(0.1, 1.0)):\\n\",\n        \"  \\\"\\\"\\\"Prints a report on how well the model is doing.\\n\",\n        \"  If you want to see multiple samples, pass a positive int to show_images\\n\",\n        \"  \\n\",\n        \"  Model can be a ModelContainer instance, or a string. If it's a string, we\\n\",\n        \"  lookup that model name in the MultiModel\\n\",\n        \"  \\\"\\\"\\\"\\n\",\n        \"  start = time.time()\\n\",\n        \"  # n examples where target was in top 5\\n\",\n        \"  top_5 = 0\\n\",\n        \"  # n examples where target was top 1\\n\",\n        \"  wins = 0\\n\",\n        \"  # n examples in total\\n\",\n        \"  n_batches = int(math.ceil(float(n) / BATCH_SIZE))\\n\",\n        \"  total = BATCH_SIZE * n_batches\\n\",\n        \"  \\n\",\n        \"  loss = 0\\n\",\n        \"  \\n\",\n        \"  for b in xrange(n_batches):\\n\",\n        \"    if isinstance(model, str):\\n\",\n        \"      loss_per_example, probs, patched_imgs = M.inference_batch(model, scale=scale)\\n\",\n        \"    else:\\n\",\n        \"      loss_per_example, probs, patched_imgs = model.inference_batch(scale=scale)\\n\",\n        \"    \\n\",\n        \"    loss += np.mean(loss_per_example)\\n\",\n        \"    for i in xrange(BATCH_SIZE):\\n\",\n        \"      top_labels = np.argsort(-probs[i])[:5]\\n\",\n        \"      if TARGET_LABEL in top_labels:\\n\",\n        \"        top_5 += 1\\n\",\n        \"        if top_labels[0] == TARGET_LABEL:\\n\",\n        \"          wins += 1\\n\",\n        \"  loss = loss / n_batches\\n\",\n        \"  top_5p = int(100 * float(top_5) / total)\\n\",\n        \"  winp = int(100 * float(wins) / total)\\n\",\n        \"  \\n\",\n        \"  if step is not None:\\n\",\n        \"    r = 'Step: {} \\\\t'.format(step)\\n\",\n        \"  else:\\n\",\n        \"    r = ''\\n\",\n        \"  r += 'LogLoss: {:.1f} \\\\tWin Rate: {}%\\\\t Top5: {}%\\\\tn: {}'.format(math.log(loss), winp, top_5p, total)\\n\",\n        \"  if verbose:\\n\",\n        \"    print(r)\\n\",\n        \"  \\n\",\n        \"  if show_images:\\n\",\n        \"    if show_images is True:\\n\",\n        \"      show_images = 1\\n\",\n        \"    _visualize_example(patched_imgs, probs, loss_per_example, show_images)\\n\",\n        \"  elapsed = time.time() - start\\n\",\n        \"  return {'logloss': math.log(loss), 'win': winp, 'top5': top_5p, 'time': elapsed, 'loss': loss}\\n\",\n        \"  \\n\",\n        \"def _visualize_example(patched_imgs, probs, loss_per_example, n_reports=1):\\n\",\n        \"  for i in xrange(n_reports):\\n\",\n        \"    show(patched_imgs[i])\\n\",\n        \"    \\n\",\n        \"    predictions_str = ''\\n\",\n        \"    top_label_ids = np.argsort(-probs[i])[:5]\\n\",\n        \"    for label in top_label_ids:\\n\",\n        \"      p = probs[i][label]\\n\",\n        \"      name = label_to_name(label)\\n\",\n        \"      if len(name) > 30:\\n\",\n        \"        name = name[:27] + \\\"...\\\"\\n\",\n        \"      if name == \\\"toaster\\\":\\n\",\n        \"        predictions_str += \\\"\\\\033[1m\\\"\\n\",\n        \"      name = name.ljust(30, \\\" \\\")\\n\",\n        \"      predictions_str += \\\"{} {:.2f}\\\".format(name, p)\\n\",\n        \"      if name.startswith(\\\"toaster\\\"):\\n\",\n        \"        predictions_str += \\\"\\\\033[0m\\\"\\n\",\n        \"      predictions_str += \\\"\\\\n\\\"\\n\",\n        \"    #predictions_str += \\\"\\\\033[1mLogLoss: {:.1f}\\\\033[0m\\\\n\\\".format(math.log(loss_per_example[i]))\\n\",\n        \"  \\n\",\n        \"    print(predictions_str)\\n\",\n        \"    \\n\",\n        \"\\n\",\n        \"def cross_model_report(meta_model, n=100, verbose=True, scale=None):\\n\",\n        \"  results = {}\\n\",\n        \"  \\n\",\n        \"  print('{:15s}\\\\t Loss\\\\t Win%\\\\t Top5%\\\\t Time'.format('Model Name'))\\n\",\n        \"\\n\",\n        \"  out_start = time.time()\\n\",\n        \"  for model_name in MODEL_NAMES:\\n\",\n        \"    model = meta_model.name_to_container[model_name]\\n\",\n        \"    r = report(model, n=n, verbose=False, scale=scale)\\n\",\n        \"    results[model_name] = r\\n\",\n        \"    print('{:15s}\\\\t {:.1f}\\\\t {:.0f}%\\\\t {:.0f}%\\\\t {:.0f}s'.format(model_name, r['loss'], r['win'], r['top5'], r['time']))\\n\",\n        \"  \\n\",\n        \"  def _avg(name):\\n\",\n        \"    xs = [r[name] for r in results.values()]\\n\",\n        \"    return sum(xs) / len(xs)\\n\",\n        \"      \\n\",\n        \"  \\n\",\n        \"  elapsed = time.time() - out_start\\n\",\n        \"  print('{:15s}\\\\t {:.1f}\\\\t {:.0f}%\\\\t {:.0f}%\\\\t {:.0f}s'.format('Average/Total', _avg('loss'), _avg('win'), _avg('top5'), elapsed))\\n\",\n        \"\\n\",\n        \"  return results\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"pa3x4VU2HDPD\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## Serialization / Deserialization\\n\",\n        \"\\n\",\n        \"## API\\n\",\n        \"\\n\",\n        \"### `save_patch(experiment_name)`\\n\",\n        \"### `load_patch(experiment_name_or_patch_file, dontshow=False)`\\n\",\n        \"###\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"Pg2jx3tJG4Dx\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"import pickle\\n\",\n        \"import os.path as osp\\n\",\n        \"from datetime import datetime\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"def save_obj(obj, file_name):\\n\",\n        \"  serialized = pickle.dumps(obj, protocol=0)\\n\",\n        \"  dest_file = osp.join(DATA_DIR, file_name)\\n\",\n        \"  with open(dest_file, 'w') as f:\\n\",\n        \"    f.write(serialized)\\n\",\n        \"    \\n\",\n        \"def load_obj(file_name):\\n\",\n        \"  dest_file = osp.join(DATA_DIR, file_name)\\n\",\n        \"  with open(dest_file, 'r') as f:\\n\",\n        \"    pkl = f.read()\\n\",\n        \"  return pickle.loads(pkl)    \\n\",\n        \"\\n\",\n        \"def _latest_snapshot_path(experiment_name):\\n\",\n        \"  \\\"\\\"\\\"Return the latest pkl file\\\"\\\"\\\"\\n\",\n        \"  return osp.join(DATA_DIR, \\\"%s.latest\\\" % (experiment_name))\\n\",\n        \"\\n\",\n        \"def _timestamped_snapshot_path(experiment_name):\\n\",\n        \"  \\\"\\\"\\\"Return a timestamped pkl file\\\"\\\"\\\"\\n\",\n        \"  timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')\\n\",\n        \"  return osp.join(DATA_DIR, \\\"%s.%s\\\" % (experiment_name, timestamp))\\n\",\n        \"\\n\",\n        \"def save_patch(experiment_name, model):\\n\",\n        \"  \\\"\\\"\\\"Save a snapshot for the given experiment\\\"\\\"\\\"  \\n\",\n        \"  def _serialize_patch(dest_file):\\n\",\n        \"    patch = model.patch()\\n\",\n        \"    serialized = pickle.dumps(patch, protocol=0) # protocol 0 is printable ASCII\\n\",\n        \"\\n\",\n        \"    with open(dest_file + \\\".pkl\\\", 'w') as f:\\n\",\n        \"      f.write(serialized)\\n\",\n        \"      print(\\\"Wrote patch to %s\\\" % dest_file)\\n\",\n        \"    with open(dest_file + \\\".jpg\\\", 'w') as f:\\n\",\n        \"      PIL.Image.fromarray(_convert(model.patch())).save(f, \\\"JPEG\\\")\\n\",\n        \"  \\n\",\n        \"  _serialize_patch(_latest_snapshot_path(experiment_name))\\n\",\n        \"  _serialize_patch(_timestamped_snapshot_path(experiment_name))\\n\",\n        \"    \\n\",\n        \"def load_patch(experiment_name_or_patch_file, model, dontshow=False):\\n\",\n        \"  if experiment_name_or_patch_file.startswith(DATA_DIR):\\n\",\n        \"    patch_file = experiment_name_or_patch_file\\n\",\n        \"  else:\\n\",\n        \"    patch_file = _latest_snapshot_path(experiment_name_or_patch_file)\\n\",\n        \"  with open(patch_file + '.pkl', 'r') as f:\\n\",\n        \"    pkl = f.read()\\n\",\n        \"  patch = pickle.loads(pkl)\\n\",\n        \"  model.patch(patch)\\n\",\n        \"  if not dontshow:\\n\",\n        \"    show_patch(patch)\\n\",\n        \"    \\n\",\n        \"def get_im(path):\\n\",\n        \"  with open(osp.join(DATA_DIR, path), \\\"r\\\") as f:\\n\",\n        \"    pic = PIL.Image.open(f)\\n\",\n        \"    pic = pic.resize((299, 299), PIL.Image.ANTIALIAS)\\n\",\n        \"    if path.endswith('.png'):\\n\",\n        \"      ch = 4\\n\",\n        \"    else:\\n\",\n        \"      ch = 3\\n\",\n        \"    pic = np.array(pic.getdata()).reshape(pic.size[0], pic.size[1], ch)[:,:,:3]\\n\",\n        \"    pic = pic / 127.5 - 1\\n\",\n        \"  return pic\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"tHxkTVjRG43F\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"areas_to_report = list(np.linspace(0.01, 0.10, 10)) + [0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50]\\n\",\n        \"\\n\",\n        \"def calculate_win_rates(models, eval_samples_per_scale=100):\\n\",\n        \"  start = time.time()\\n\",\n        \"  rows = len(models)\\n\",\n        \"  results = np.zeros((rows, len(areas_to_report)))\\n\",\n        \"  for (i, model) in enumerate(models):\\n\",\n        \"    print(\\\"Evaluating %s\\\" % model.model_name)\\n\",\n        \"    for (j, a) in enumerate(areas_to_report):\\n\",\n        \"      sc = 2 * math.sqrt(a / math.pi)\\n\",\n        \"      win = report(model, scale=sc, verbose=False, \\n\",\n        \"                   n=eval_samples_per_scale)['win']\\n\",\n        \"      results[i,j] = win\\n\",\n        \"  print('Calculated wins in {:.0f}s'.format(time.time()-start))\\n\",\n        \"  return results\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"def plot_win_rates(wins, labels, title):\\n\",\n        \"  assert wins.shape[0] == len(labels)\\n\",\n        \"  for (i, l) in enumerate(labels):\\n\",\n        \"    plt.plot([a * 100.0 for a in areas_to_report], wins[i], label=l)\\n\",\n        \"  plt.title(title)\\n\",\n        \"  plt.legend()\\n\",\n        \"  plt.xlabel(\\\"Attack as % of image size\\\")\\n\",\n        \"  plt.ylabel(\\\"Attack success rate\\\")\\n\",\n        \"  \\n\",\n        \"  plt.show()\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"bMz7G_MjH8Cl\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"# Experiments\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"kFWZi57amziK\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## Whitebox Single Model Attack\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"gXwuxoYem21m\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 952\n        },\n        \"outputId\": \"439df092-3ac8-4166-8ae6-9b64aa87d3a0\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517444196847,\n          \"user_tz\": 480,\n          \"elapsed\": 1886154,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"model_targets = MODEL_NAMES\\n\",\n        \"STEPS = 500\\n\",\n        \"\\n\",\n        \"regular_training_model_to_patch = {}\\n\",\n        \"x = 0\\n\",\n        \"for m in model_targets:\\n\",\n        \"  print(\\\"Training %s\\\" % m)\\n\",\n        \"  M = MM.nc[m]\\n\",\n        \"  M.reset_patch()\\n\",\n        \"  for i in xrange(STEPS):\\n\",\n        \"    x +=1 \\n\",\n        \"    loss = M.train_step(scale=(0.1, 1.0))\\n\",\n        \"    if i % int(STEPS/10) == 0:\\n\",\n        \"      print(\\\"[%s] loss: %s\\\" % (i, loss))\\n\",\n        \"    \\n\",\n        \"  \\n\",\n        \"  regular_training_model_to_patch[m] = M.patch()  \\n\",\n        \"\\n\",\n        \"save_obj(regular_training_model_to_patch, \\\"regular_training_model_to_patch\\\")\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Training resnet50\\n\",\n            \"[0] loss: 15.848367\\n\",\n            \"[50] loss: 6.62066\\n\",\n            \"[100] loss: 4.2461815\\n\",\n            \"[150] loss: 4.9246216\\n\",\n            \"[200] loss: 5.3818893\\n\",\n            \"[250] loss: 2.673112\\n\",\n            \"[300] loss: 2.516276\\n\",\n            \"[350] loss: 5.628107\\n\",\n            \"[400] loss: 3.3912237\\n\",\n            \"[450] loss: 3.2927089\\n\",\n            \"Training xception\\n\",\n            \"[0] loss: 10.044142\\n\",\n            \"[50] loss: 1.9359984\\n\",\n            \"[100] loss: 3.404768\\n\",\n            \"[150] loss: 1.4373296\\n\",\n            \"[200] loss: 0.84405035\\n\",\n            \"[250] loss: 1.297935\\n\",\n            \"[300] loss: 1.2224761\\n\",\n            \"[350] loss: 2.5895066\\n\",\n            \"[400] loss: 0.7304306\\n\",\n            \"[450] loss: 2.3524048\\n\",\n            \"Training inceptionv3\\n\",\n            \"[0] loss: 10.15593\\n\",\n            \"[50] loss: 6.7058516\\n\",\n            \"[100] loss: 6.0991573\\n\",\n            \"[150] loss: 4.8568587\\n\",\n            \"[200] loss: 4.0369062\\n\",\n            \"[250] loss: 5.3691416\\n\",\n            \"[300] loss: 4.1206374\\n\",\n            \"[350] loss: 2.1025534\\n\",\n            \"[400] loss: 0.13320415\\n\",\n            \"[450] loss: 2.4082727\\n\",\n            \"Training vgg16\\n\",\n            \"[0] loss: 13.917677\\n\",\n            \"[50] loss: 6.105081\\n\",\n            \"[100] loss: 3.397616\\n\",\n            \"[150] loss: 2.1753328\\n\",\n            \"[200] loss: 3.5649805\\n\",\n            \"[250] loss: 5.422268\\n\",\n            \"[300] loss: 3.606423\\n\",\n            \"[350] loss: 1.4018068\\n\",\n            \"[400] loss: 5.21554\\n\",\n            \"[450] loss: 3.955655\\n\",\n            \"Training vgg19\\n\",\n            \"[0] loss: 13.522253\\n\",\n            \"[50] loss: 11.481941\\n\",\n            \"[100] loss: 3.2137012\\n\",\n            \"[150] loss: 6.9497967\\n\",\n            \"[200] loss: 5.9846754\\n\",\n            \"[250] loss: 6.001512\\n\",\n            \"[300] loss: 4.7060533\\n\",\n            \"[350] loss: 3.9285967\\n\",\n            \"[400] loss: 1.4345224\\n\",\n            \"[450] loss: 2.9930954\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"YjuFKAwe0LnP\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 1424\n        },\n        \"outputId\": \"086146f2-d1dd-4278-8f7d-502738fc306b\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517444199325,\n          \"user_tz\": 480,\n          \"elapsed\": 2444,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"m = MM.nc['xception']\\n\",\n        \"m.patch(regular_training_model_to_patch['xception'])\\n\",\n        \"report(m, n=16, show_images=3, scale=0.5)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"LogLoss: -1.7 \\tWin Rate: 93%\\t Top5: 100%\\tn: 16\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\nIOpwOBxX8N+KEYxZc8vPcAAAAABJRU5ErkJggg==\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7f4125d82b50>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\u001b[1mtoaster                        1.00\\u001b[0m\\n\",\n            \"mailbox, letter box            0.00\\n\",\n            \"radio, wireless                0.00\\n\",\n            \"parking meter                  0.00\\n\",\n            \"padlock                        0.00\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\nAAAASUVORK5CYII=\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7f410d4e8a90>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\u001b[1mtoaster                        1.00\\u001b[0m\\n\",\n            \"manhole cover                  0.00\\n\",\n            \"parking meter                  0.00\\n\",\n            \"stove                          0.00\\n\",\n            \"combination lock               0.00\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\nGHIKQAAAAABJRU5ErkJggg==\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7f4124f78e50>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\u001b[1mtoaster                        1.00\\u001b[0m\\n\",\n            \"mountain bike, all-terrain ... 0.00\\n\",\n            \"crash helmet                   0.00\\n\",\n            \"parking meter                  0.00\\n\",\n            \"unicycle, monocycle            0.00\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"{'logloss': -1.7488509155993057,\\n\",\n              \" 'loss': 0.17397373914718628,\\n\",\n              \" 'time': 1.0763728618621826,\\n\",\n              \" 'top5': 100,\\n\",\n              \" 'win': 93}\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 31\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"Nt_3I_0em8ht\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 119\n        },\n        \"outputId\": \"7b317044-eddf-4d32-a732-3835427d6197\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517444760863,\n          \"user_tz\": 480,\n          \"elapsed\": 561084,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"regular_training_model_to_patch = load_obj(\\\"regular_training_model_to_patch\\\")\\n\",\n        \"\\n\",\n        \"# Load models\\n\",\n        \"models = []\\n\",\n        \"for m in model_targets:\\n\",\n        \"  M = MM.nc[m]\\n\",\n        \"  M.patch(regular_training_model_to_patch[m])\\n\",\n        \"  models.append(M)\\n\",\n        \"\\n\",\n        \"regular_training_win_rates = calculate_win_rates(models)\\n\",\n        \"\\n\",\n        \"save_obj(regular_training_win_rates, \\\"regular_training_win_rates\\\")\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Evaluating resnet50\\n\",\n            \"Evaluating xception\\n\",\n            \"Evaluating inceptionv3\\n\",\n            \"Evaluating vgg16\\n\",\n            \"Evaluating vgg19\\n\",\n            \"Calculated wins in 560s\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"DgJL6iGJnZvn\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 376\n        },\n        \"outputId\": \"1f159de5-eb59-4625-ae57-d0ac7cf5df6d\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517444761483,\n          \"user_tz\": 480,\n          \"elapsed\": 518,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"regular_training_win_rates = load_obj(\\\"regular_training_win_rates\\\")\\n\",\n        \"plot_win_rates(regular_training_win_rates, model_targets, \\\"Single-model attack success rates\\\")\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAfIAAAFnCAYAAABdOssgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xl8VOWh//HP7HsyyWQjAUICEpYA\\nsoissggEFPelXitaaqveUtfe1qW2xdqXXe791VZLvV6r1qW2brgWATdEEcGwyRa2JCRkXyaZfT3P\\n748JAxFCWCYbPO/XK6+ZOTlzzpNDyHee5TyPSgghkCRJkiSpT1L3dAEkSZIkSTp9MsglSZIkqQ+T\\nQS5JkiRJfZgMckmSJEnqw2SQS5IkSVIfJoNckiRJkvowGeTSWWHHjh3ccsstzJ8/n6KiIr7zne9Q\\nXFwMwIcffsiDDz542sdevnw53/ve9xJU0tP385//nCeffPKE+5xOWRsbG/n444/jr1977bXTKR4A\\nhw4dYsSIEaf9/rPNmVxLSTpZMsilPk8IwR133MHixYtZuXIlq1at4tZbb2XJkiX4/X7mzp3Lb3/7\\n254uZq+1YcMGPvnkEwCi0Sh/+MMferhEZwd5LaXuIoNc6vOcTicNDQ2MGTMmvm3evHm88847mEym\\ndrXUBx54gCeeeILFixcza9YsFi9ejN/vB+Dzzz9nxowZLFiwgFdffZVx48Zx6NChdudyuVz89Kc/\\npaioiIsvvpg333zzuGU6dOgQ06ZN45lnnqGoqIiioiK2bt3KbbfdxvTp09u1EHzwwQcsXLiQ+fPn\\nc/PNN1NRURH/ub7//e8ze/ZsbrvtNtxud/w9+/fv56abbqKoqIjLLruM7du3d3qdli1bRlFREXPm\\nzOH222/H5XKxc+dOfv3rX7Nq1SruvfdeFi9ejNvtZv78+VRWVlJaWsp//Md/sGDBAubOncv7778f\\nP97atWu59NJLKSoq4vbbb6elpeWYc/7Xf/0Xjz766DHbN27cyFVXXcUll1zCggUL+OCDDwBYtGgR\\n77zzTny/o193dL6Otm/atIlrrrmGuXPncv3111NZWQlAXV0dt9xyC5dccglz5szh8ccfP+H2byso\\nKODpp5+mqKiIaDTKli1buPrqq5k/fz6XXHIJX375JcAx17K2tpY77rgj/vvw2WefARCJRPj5z39O\\n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\\ntm0AVFZW8tOf/hQhBL/85S9Zt24dAAMHDiQtLQ2VStXh9hNpbm7GbDaTn59PJBLh1VdfBcDr9ba7\\nllqtlhkzZsR/d/x+Pw8++CA1NTW8+eab8Wtnt9vJz88/4Tkl6dtkjVzq88aOHcujjz7K0qVLcbvd\\nKIpCWloajz/+ODk5OSd1DL1ez9KlS3nwwQex2WwsXrwYtVp9zB/ye+65h0ceeSRe65o+fToFBQWn\\nXfasrCx+85vf8KMf/YhwOEz//v3jo7xvv/127r33XmbPns3gwYPj/f0qlYo//vGPLF26lD/96U+o\\n1WoWL17crun+22644QbuuusuioqKKCgo4IEHHuDOO+/k73//O1OnTuX555/nmmuu4fXXX2f8+PHM\\nmjWLp59+mh/84AdceeWVOBwO/vM//5M5c+Zwxx138P777/Pkk0/G+6Rzc3P53e9+1+7DxKBBg1iy\\nZAn3338///rXv+LdETqdjmuvvTZeU1er1Tz88MOYTCYWL17Mfffdx9q1a5k4cWK8NmwymY57vo62\\nG41GnnjiCR599NF4qN59992oVCpuuOEGfvnLX/Loo48ihGD27NlMnjwZu91+3O0nMmzYMC666CKK\\niopwOBw88MADbN68mUWLFvHGG2+0u5ZLly7lV7/6Fa+//joAl19+Of369ePiiy/moYceYt68eWg0\\nmvjPIEknSyWO16EjSec4n8/H2LFjKS4ubtdPLUmS1NvIpnVJanPNNdewYsUKAFasWMHgwYNliEuS\\n1OvJGrkktSkuLubXv/41wWAQi8XC0qVL44O7JEmSeisZ5JIkSZLUh8mmdUmSJEnqw2SQS5IkSVIf\\n1idvP2tocHe+01FSUsw4nR3fYyudPHktE0dey8SR1zIx5HVMnERfy/T0jgfenhM1cq322LmepdMj\\nr2XiyGuZOPJaJoa8jonTndfynAhySZIkSTpbySCXJEmSpD5MBrkkSZIk9WEyyCVJkiSpD5NBLkmS\\nJEl9mAxySZIkSerDZJBLkiRJUh8mg1ySJEmS+rAuDfK9e/cyZ84cXn75ZQBqampYtGgRN954I3ff\\nfTehUAiAd999l2uuuYbrrruO119/vSuLJEmSJElnlS4Lcp/Px6OPPsrkyZPj25544gluvPFGXnnl\\nFXJzc3njjTfw+XwsW7aMv//977z00ku88MILtLS0dFWxJEmSJOms0mVzrev1ep555hmeeeaZ+LYN\\n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\\nkiuvvDJqfdntq5899dRTbNy4EY1Gw8MPP8zgwYM7u0ldxvbt23nyyScpLi5Gr9eTkZHBU089xezZ\\ns/F4PGRlZTF//nwMBkNnN/WEt3TpUl588UX69u0bem/BggXMmTNH+rIN3G43Dz30EIcPH8btdjNz\\n5kyGDx/N+gQxAAAJb0lEQVTOrFmzpB874MUXX6Rnz55MnDhR+rIdHA4H9957L3V1dfh8PmbOnMmQ\\nIUOi1pfdPpALIYQQ3Vm3nloXQgghujsJ5EIIIUQXJoFcCCGE6MIkkAshhBBdmARyIYQQoguTQC5E\\nO5WVlTF06FBee+21Ju9v3ryZoqIioCFt444dO9p1/0GDBuH3+zvczubMnj2ba6+9lueeey70XnV1\\nNddffz1er7dN93r77be54IIL+Prrr5u8/4c//AGbzaZKe9VUXl7O73//+85uhhCqkUAuRDt9+umn\\n5Obm8vHHHzd5/+OPPw4F8i+//JKdO3d2RvNaVFBQAMD777/Pli1b8Pl8ACxatIi77rqrzaUWv/rq\\nKx588EGmTJnS5P1nn32WjIwMdRqtIqvVygsvvNDZzRBCNd06RasQkfTRRx/xyCOPMHv2bDZv3szp\\np5/Ol19+yeeff87WrVu56KKLePfdd7FYLMTExDB06FAefvhhdDodDoeDu+66i0mTJuF2u3nggQc4\\nfPgwAHfffTdjxowJPcfhcHDjjTdy9913M2HChND7FRUV3H///fj9fhwOBzfccANXXHEFe/fu5Y9/\\n/CMGgwG3283tt98eqm4FUFVVFQqwqamp1NbWcvDgQbRaLWeccUaL33fZsmV88MEHxMbGkpqayuOP\\nP86nn37Kjh07ePrpp/H7/aFqTwDnnHMOb775Jps2bWLVqlUoisLOnTu57LLL8Pl8rF+/HkVRePPN\\nNzGbzTz//POhClGZmZksWrQIg8HAsmXLePvtt0lJSeGMM85gzZo1vP/++5SUlPDoo4/icrlwOp3c\\nfffdjB8/vkmbly9fzhtvvIHZbEZRFObPn49Go2H69On897//ZebMmdTW1gKwb98+brrpJm655RaW\\nL1/Ou+++i6IopKSk8PjjjzcpwCTECUURQrTZhg0blHPOOUcJBoPKM888ozz00EOhv7v++uuV1atX\\nK4qiKLNmzVI+/PBDRVEUZd26dcqGDRsURVGUzZs3K1OnTlUURVFeeuklZcGCBYqiKMrBgweVe++9\\n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\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7f41250e1410>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"rzBPR3vtxUoI\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## Transfer Attack (AKA Blackbox)\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"iibw1L5NxVK6\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"LR = 5.0\\n\",\n        \"\\n\",\n        \"STEPS = 500\\n\",\n        \"transfer_ensemble_model_names = ['resnet50', 'xception', 'inceptionv3', 'vgg16']\\n\",\n        \"transfer_target_model =  'vgg19'\\n\",\n        \"\\n\",\n        \"\\n\",\n        \"print(\\\"Beginning blackbox experiment with ensemble: %s and target %s\\\" % (\\n\",\n        \"    transfer_ensemble_model_names, transfer_target_model))\\n\",\n        \"MM.reset_patch()\\n\",\n        \"\\n\",\n        \"for i in range(STEPS):\\n\",\n        \"  for mm in transfer_ensemble_model_names:\\n\",\n        \"    loss = MM.train_step(mm, steps=1, learning_rate=LR)\\n\",\n        \"\\n\",\n        \"  if i % int(STEPS/10) == 0:\\n\",\n        \"    print(\\\"[%s] loss: %s\\\" % (i, loss))\\n\",\n        \"\\n\",\n        \"transfer_patch = MM.patch()\\n\",\n        \"save_obj(transfer_patch, \\\"transfer_patch\\\")\\n\",\n        \"  \"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"n58wsOFdx-XB\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 1339\n        },\n        \"outputId\": \"85302a68-8bd6-4947-dc75-dcf80fcb3474\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517536335092,\n          \"user_tz\": 480,\n          \"elapsed\": 2786,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"m = MM.nc[transfer_target_model]\\n\",\n        \"m.patch(transfer_patch)\\n\",\n        \"\\n\",\n        \"_ = report(m, n=16, show_images=3, scale=0.5)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"LogLoss: -0.4 \\tWin Rate: 87%\\t Top5: 93%\\tn: 16\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7f3c41abbfd0>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\u001b[1mtoaster                        1.00\\u001b[0m\\n\",\n            \"piggy bank, penny bank         0.00\\n\",\n            \"balloon                        0.00\\n\",\n            \"soccer ball                    0.00\\n\",\n            \"pencil sharpener               0.00\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAVEAAAFNCAYAAAC5YlyiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvfnPZsd15/epqnvvs71r99s7u9lc\\ntJAUZcmWJcvL2NBoPDOewPHEmQS2M0gGyACZ/yB/RoIA+SHAwAFiIzMe24k9HhuJZcuWZEoyJUvi\\nIi4i2exmb2/3uz/rXaoqP5yquvd5KdFBiEE7wHMIsvn0c5+71K06dc73fM85ynvvWclKVrKSlfx/\\nEv2ob2AlK1nJSv7/LCslupKVrGQlH0JWSnQlK1nJSj6ErJToSlaykpV8CFkp0ZWsZCUr+RCyUqIr\\nWclKVvIhZKVEV7KSlazkQ8hKia5kJStZyYeQlRJdyUpWspIPIdmjvPj//Fu/xeTEArCzc5Usy1Ha\\nAeC9QxsLSj7jNMoXKGUA0MaRG1BKAfKn1hoVzq3waN3uEUqpdKycX1HhiAlbzjmstUv3p5ZyuTRa\\n63S89x5vS8CEYzNQGkz8UQMoVBxilYGS54rfG9XDqVm6mLc9jO7JR+3QygEuPE8Ovod1JQCL+iED\\nt05vJM9Y9HpYqzk8fgDA+sYaRT5CK/k+zz04RZH1ATC6wXsN+HB+h9aeOIBZZshMvjRmcRwBtNb0\\nC7M0/kqppfEBcOFP6z3WtuNtrQXr0/fxzzh6Hr90baPCu+0k2J26NXn/3b80Os2B5edw4R6W7zVe\\nPM6asiyXntu5zr0DPpyzaSwOqCv5+9paUGC96xyv8F6O904eo8GfOr8c71wYJ63CZzln07hwvQbv\\nPao5NdbpfAqlNOFwjNYYpTGZnC/LZJyM0WncAPSpMYqfjFZorciycBwq/Mam3+V5Tp7ncn6jyYx+\\n39zQOp7R472nrm16Pu/asXDyCHSTKZcTK2V8mvRlnLbtetdKpedRCnAeY8J3WsZ4XskZ6sZRVg1l\\nLd9b1zlxkF/9xc/yo+SRKtE3f/AGTz3x6fApl8mhKgCU0qimABUUm6pQ1GglL0q7nKZx6UWZ8JK6\\n80D5jpLVCoXC0y5W69JoiVLsviiv6L42pTxOObpinSK+PoUHbzuL3NOdiOFmiAsYPJYK7+R50Arv\\nLRZZuEZD4yaU4c2ujc6iaFBavn+wu8ta/pBBKUq3rD0XL15nOFgLp89wzqG0TXdT5D1U2Bm0zsPz\\nhvtRWhRpZ2GdVkre+87CkInY3ai6Y+g7ylPGyuOcw9moKDzeufQOogLx7YCFxRfHX0Y6bZJK4X07\\nzU9/9gqUc0sLuX2/ncUVvlO0m2Y8riiK9D0sKzmHKDMAY2Rmuay9tkeUZTyfc6S54b38a+LQefk3\\nKmWtND48D8jcVibDBKVldBaUSBN+7lAoTHyg8LtCZ+F4jTEqvVujWVKKSim5oa7S86I85fk0WpGU\\nrlIKk2mUb9eD1oYsfN9VoPJd/NxRlN13g1w7jrtSamkT7c47+SzzIr6v05upQmF0u4FqPDpTGNN5\\n794TTSatoaptx8BZGo6/VVbu/EpWspKVfAh5pJbo/ft7XL8WXKCmwvkGk4Xd2mkUOrnzCodXDuXj\\n7qVA+2SyawUosQjkBD7sJNH9jHZMuxu2zn9rbSw5lF3DFOhuTEqBXTresrxxxV213d2UXj5CKUsT\\nLFHvDHjQwRJVucPZmnI+B2AwqMlyg7difZSzKcezm/T7AwAWC8/W9gaTsViuW9vn0GRg5PqZ0yya\\nGb1iGJ49E0skWR8apdrd2yj9Puvce49K1pPGOZOeU3dcz3is9x2X1nmcbSETd8oChWAT++7vXbIG\\nLC5YjHKA0Rq0aS1R79GKZGkrpUApLPZ914nf685c8K6FFLqQRTgaay1NtJa9x1qb3HuUQnnVXluD\\ns5Zoo3jv8N4RD4/X0bb9vVcKHY8HrKdjlgfXVAfoSInJrfrRq5K5l6ALPKpjvRljyI0mM/G5QGkv\\na0huEFCYcH5jZF7kwf9VWqE1FCZCU14s92iZhnOctvrj+XX0IcLlElwR/+KUJSyHKpZd+Fa63md8\\nH13R4ZSZbtd+lplkWcdJ1ovHa49ZVJBs0wj9xffzwTWaHqkSPTg+xPTkRdV2gVIaV8cXq1HKpYnp\\nMThn0otR3uJU6xIAYRG15xe3Ik5Y1fqEQboTjfjbDjanTinVriilus460SfrvtBld9ShvSFqIec9\\n3lW48OK8G4DXlOUxAA92b7Nz9hJ1LUrTuYZy7tJEPtx7yPH4XYwWJfzOjXd46+2Xmc/l+1/55d/g\\n7M4lbCM3UAO9XkFjRSkrXYDNljBDrVu8zynXwZrSgKVNzHuP6eJ8/oe7862yjIonfpZnilfwcUzC\\n75ro7kWF01mgIBNfqWV3vQs/KOVlkXWUetwAWny86162m2bcULu4bt20G0B8zohBKlm2NAkzddTW\\ndvBfh3Mt/us9Mr8TlCJK0gUlagMcgJJ3aaMyjRscESoJSh0nUEyCakD7dswKo8kzQ5YHd1sHeCtO\\nTrc8b7XWaDx5cPez3GCM4Kpy/w7wKNOqD/l9iy3L6eLGJQ+0DI+1cIUCXMfAUJyGjk771Q55Pyz9\\npnsB7dsNVStFpjUm68RI8Jhc4Jqq9iiVk+diwEwXVcDDl5Xuj5JHqkTLZp+TkyMARv0rKKWo7Vi+\\nVCVFtkbCr3R4eQF48uilHUIpQC+Dyb6Dosmwq6Xx8KeCTWHmyv+mSdEdwO5EEfC+xUTjf/3y0T4q\\nKQ1k6VuHA6/x5OGzR6mGphFL8nB/j/t3b1JZedFndi6hVcbewxsAfPMbf461d6jrMFG1B0pu35bx\\n/OsXL/KpT30O7+T3j197mqaxEjwCam9xhmUlqjSnp2vaBMJ46GTNGJQnBa4Sdt3F/WAJ87R2GQOV\\nYzqKzPvO9/4UjhkeM96XVqhgOcn9aIyyySLWWuOUSsBkd1EarTFaUft2kS9Z3ICzXgJExA3AJaXp\\nfXeOgPcNHo3tBJ4a11Gi8VmTQpfN1UbdqBROZ/iopJQEN5xrLdGuJ5RQ9fRyDIpWKSucBIOS7lVk\\nRhF1iDHyXfw+4q8mbVCCSWZheHt5RpYZvItehczn7rtTS/Peg2o3pTRO8dhTgSaHQ/u4Xt+PgbaS\\nziCbeLREO+eV8RQ8NwuWdGY0WabJ0lyXXy1C5M1ZS1mWLBYLAOoqhaz+X8kKE13JSlaykg8hj9QS\\nnc/GSeu7PGNRTphXB/LdYsrFC0+gVaD8eBvM87hDaZTWtDa9x3XcT4XC+dYSiRHYJTkd9TtlRdK5\\nmli2y1Zp5ru4lz71A8F4VLTUdIHXuViggPUN2q8l995T4d2CqhJ3+/hon/3Dd9k5/7R87xrQnv3D\\ndwHI8xOsbSgKoSxNplMUsLYmlucPfvAd3nzre1x//FkABoMBGxvb9PsynlpleF+n+xNIyiTrQCFR\\nzXbQxE7QLkbvZZC6mO+yf6VCVDrQcoIVuhzhVona4gKGmt5m+G03YtsVrRRa2/fRaKJ1kiKxHRc9\\nQpxOKZzWKRprA8aZZojSNNYmypINeF18PBdvNJzPWofCECFOay3es2S5+s4PPIIXprFHB+aIXN+i\\ncVq1v+eHzF3nE2aaaS2ufHKP45id/lEcXBKuGY9TWmGC5SZjqNNnrYL7mzBQH5gfHctRd2xRJ57A\\nafije0Na64Sfa+EcdSzWZY8u3XTHu/anH66zvo0WfLdXiJdnjA74d2d9e4sLL2w+n3NyMqaKnDBl\\nPsAafr88UiW6ObyADVyxk6P7rK0PODiaAKAzKKsTIs+y11sDlaVFq/Qc77KliaLgFO70fswsHRsG\\n/bQb1xXfUZwJOUgYp8ItUZoUCkMCp5X4b9pEXMugVI6PSlR7fDNA60hp8izmc+bzfQC+99IL1M2C\\no8CjffKJ5zm/c5FvfuOrAEznd5hPPUXwuXIz4MbbN9na3pbvZwfM51PO71wAYDw+RuucwVACS3Xt\\naHyTFopw9SxZCl6o4LrH53fkWc5iIXCDMYa6qciyLB1/Gg/2XqWFJC7usovXNOL2xs9Amtg/zJWX\\nvw9/aiXc0aX324YGdB0x0vBZwTIdq3XZnHNBicfJZHEo6kDHqpsmYKbxfuS6LR1Lg7cpcNSldUG8\\nruqcX4n7HZWe1+Kjx/tTRjasrD2eECwKdwxGYcLDxudM7r6F2jYt5ug9lWqS0s5MjtYmYahpA4pQ\\nTYDBkhLNNM53MF0FvkMnjOMa3X2Bsn36fdM04RqnDI20yfil+EE8aPn9dxe66v4Bp9ZolmVkWZbW\\nRhuXiIdHeEV+MJ1NaZoGHeILFp1gr/dd+4fII1WizcLy8N4tABZVRTFQzBaiRC9feYLFfM7m5jkg\\n7Ma+3Z0FOO+cLOBrcWBCaGDpetbatHsqr9C+nXk/dO8LO6wcEAEk+cN5j1cNKmCaAM7WZHn7W5RK\\nEwttcF6lHdQrg84tSoXFbGfs3v8Bew/eBOD45CHra9u8+85NAP78S1/i537mZ5iNJfDU1J6mMSxm\\nguM0tiEvNE1dhvur2dvb52BfMNJyUdI/30cF7NLkFjDE/AIVFnlUHEqBdq1F5/FUi7Idh8aCqlEq\\nKFUtmGo7Tj4svPRRcNGEq3ls4xLX0nsflFK0JFtlHu+nG/FVzuM7EeYULOq8T6VcYmAYrVJgKfJT\\n46K2P8RS8l5I2PKofolTTMTL09xwKGVaTC/82/j0dQhatnNJY8hVjHZrJImkxXgVS2EZloOi4oGZ\\nCFqqwFONWK0Cr6GJXphXApmn8+uwSXbxcNUGpgJLI1mm2sjaSoGy5Y1veVyC/dB+TBuic3GydUzK\\nD5DuBikeTLspddFQHTyoLuadmWWDSWud4iXC+mh1QZ4XKFWnd+xDYLGdDh+sRFeY6EpWspKVfAh5\\ntJjodJ/J5I580JYbb7xJ1chu1dSWJ5/8KZQXzE8bjfOOuJs6V6B0k3afiDO1pojgp/7UbtLujrJD\\ntziYQvkO6vk+9yKeo7N76jyliCkcyqiWduJ9wH3C7mycQBHJfDZYFsyOxFJc69e88tLXuH3r9fB8\\nnuPxMbOpnO/alcuUi0OOjncB6PXXGE+OhF8K4GA6XVAFHC/PM/AZNtzg7v336A369NeuAZLW6WzR\\nsRQ9tnYp+u6cRSu3FHRXaGwTMUxQqkkYp1JgspaC5r2X9MZkwHuc9a177xy19a2ljmqtSUCH6Hyk\\n1ejwnY8uKApsF645jUmzhNFqZRIUJFaRJyYOOh89h/Yc3tO6504w7yVkUgmWKf+rAY0P0XQX6U8q\\nWtNioavEbMgw2mDo3LNu564msDW6UW3fWmby1y3FznkfLNdAn1MZSmt8sPwsXqyrmMGjNcboDufX\\nL429uPbmfd5AIqZ45MWe5k921qKwVz7YguvS1ZYk4PNtBpHH6A4lKqytrJNdZ7SRGAnRC/EdpoY6\\nBeWA8yod3yt6aLOg6QTlT1PgPkgeqRLd2iiwzR4A9x68w/H4AGPOApCbHtp76jqQzYs1NH0cLeFY\\n+U6wR/lAWQof0xh0XBzoLAOF7ZDLYyAkuSRKycSP4DlxsbTSoFE6ujgVzjXkRgI3ed7H+U5qnZb8\\nau8DzoShaixHJ/L8J7t7zMcTdu/fl5NniqaGYX8TgFde+ho33i6oq5AWawzWOeZzcee9y1jrbzE9\\nkfFyfs68WvDGm68CsCjnfPPb3+CXfumfAvCRjzwjG1OCP4ws/piPjcUqh63FXT86OmFzYyvhRt5p\\nrGuWeaHlMjWkS3C3niVc0XuflFB8Xwrfvr/AE7VhfI3RGLoL0+N05/hwjgSXhFEmHc3Sova0lB25\\nl8Ta7MQwgpJShveDQ6RF6JWRoJzpuOM/hOeoO0pMKEKdm+tIJKLH+2tVSatUfRtXEpgo/AMB3/aK\\nLNVtEIw3KRkNGpfw5zZhZfk+o5J13qVNsR3MU2PRUcLetfBLV3SHwiU4aPx7gzlVlyJ8E57HLdWt\\nAMiLjF7WKvnTm8Dpa3c5zMLbdakWgfUIXU631/1he8SPkkeqRG+98xrT6ToAtZsyLIbYRnK/r156\\nko31IXd33wZgbWOHjY2L9IcjAEzmhAPZXQi+jTh6WCYUs6RTQWmc0ombp5YWX4ujxImnjQGtW8vJ\\ne6h7PNy7DUBRWJqqZGMkgZ08X0MrxXQqvNd5NWZtc4t+X75fzBvuH+yivWDAf/nlP2L88C4mKFnr\\nFI21eCdK8/j4Pg93bcpauX3wAG97ZIEw7K1YJvN5xBgt/cGaWKTA0fF9antIryeWfVN7qvkkfSZY\\nZ3XAVOfljPWNIbP5FIDD4wOUyegVMv7OKryypxTA8uryvrUefLLyI44Xspw6v+9msSgfcLT0ncOq\\n1pDXSssxadMM+HW8HmrJuutyhqPEYjb+1IKP2KqJysRJIZjlQiUKlbWYphDjW2Uklm07LB4vvFVi\\ndN91vKR2827P31GawXJynWfzEDyzwALQJl1f/l6lIKbEEjrPHU4alWbMje+KxreVOLzHOtvx0lh+\\n7x0sO915h5kRx3RpU9Htu8yyDKOz9Dy2sUvvI3K20/HG0C96GN3dVFrLE9QSsyNtSjGeEQKcZTBI\\nZrN5yOVvMeblx1thoitZyUpW8h9NHm103o4xbABQN32qKuPxx68DsLm+yWuvvcrDA3Fvn/vkJ0Gv\\n0+sLRUdpwA06WRShCkvXoljaXhVGdSN+Gttxv3ygy3TdRa80Lrr7Wos7En/iJe1x68wOAPPFQ3KV\\nMQtZD6NBBl4lXGo2O8bkiuFgC4BeMWAw8ty4dQOAw8P3qOcH+MDDXFQOMsvxWChPs6OCxy8/weFE\\nLFvbDMnMkMEgumSeo4MxZYA/cpNR1zCbhGg9Fb1+zsGBnG99bQfrLSam7gWea21ldy7rEj9puHv3\\nTji/IctMiqYrshANTra70GYSdzBk4riO++47Boz4lMna04nn1wHePMmnOp314vAYnbXR+WB1+g73\\nksB3lPer0jNGCzBm8EQs/DTnNIpWjtaXja6owgWvwEc6ToyOE5gGp93BLv0OT5OmX8h1bz+iidaz\\nuPOWjlUerGpL9MKEGdE9XtGW2ssQyzquh1hjIMIPxugIDKfx6JYtBPDW4TvrqYsha9e6/vG7bllJ\\nY8ySix2ZAdkpd9zbeLzAHfF+cmOwtoWKiqKQcxLnolj3KQPr1D2IRdzCAaliWBivuq4Fw+3ER5as\\naD5YHqkSvXLtHNZJPU2T9VjrP8ba+nkAXvr+KxyOS3qjMwBsn7/G+tZFTC7up6eUyduEcl+qj3VV\\nQraU6oExNMEdlnzkQcIkU6DHR4qSxpvOrA8FJTId3GPl8K5FRTWWpr/HfCrfD/s9vv/dr3Dh4sfl\\nejsfF4UbcuEpH1KNB9hNcb/zouD6+nX2sq/L/ec1dw9KBrnAG6NBw/7JEY0NqWuFZd8/YNacAFDk\\nCmrNwX0Zv7X1DUajPlUtgaoL57epyob+WlypPT7zqX/Ezo4Ell554wWuPvV5+lrux9UNudbMxnL+\\nN19/Ec+Ul15+DYDnnvsprj/2DA1tEQqna0zYVcyi4fjBPY6C0m+ykul0wqAvz3Pl8ScpNjaxOsAJ\\naohjiO8U1chNg3KhvByWShsmRuCD2ho21YLBTO5voAqcn2Iip0xpUKalsIGonY4PGt1ppUXBah/w\\nY53hVJ6ezaFR3qJj6Tml8MpgY247GV4Z4qq3CY/sapJOiqoSd7T1J8PiTtuGkfPRagHtHSacX7mG\\njI6SVYKJRwzP6YxZ01DH/cfkeKfIgnvqlKdRDh/gh9o0YBS9lCgiAGDc8JyVJAbvWsUlHnjcIAPZ\\nPnznTikdvIS4Irba1rCI8IEo1RgYslZgocQYy0TB+k6Q1lqTrqGVRSvdgXrkx12MPc/zVK+0cR5r\\n2yBoDPrGBBmtDPg61RsV46CrOj/YYX+kSrToeQ72xHJzznF8fIPDUIVoY/sqzzz/PFeufQSAM2eu\\nggLn4+4zoFYOnUkgp7Eek7dcQGc1XmWxhgMaKdOQJnJMvY/zNlgOPqHJGnyn+AMKpbKEUykF2HVO\\nDu4CMPeHvPvODd588yEAP/P3zpH3GyYHwvu8f/Mm157MmAcMWOlLGLPGuyHX/eHhHJ1ril4Av5sF\\no34PZaRK0+bmNuViClaUUC/PKeuWQH0ynjBaL3jiyesytiZnMikZDkVJTmYl1s0ZjWS83n77be7v\\na37xi/8AgOl4zKif8+5Nud/X3niJRXnCZCoT8dyFazjdS9xCpxuUylOg6cUX/4p//T/9D2xtyP2d\\nObfNwcE+44koqr//T36FX/+v/wX5XJT++vweZ6evUweFopRHOU2WD8MLLPFuFo1HUAXQY9K/DMD+\\n8BqzfITVraXpO9ZL/G+bX66X/h90yjByKJzTiagvkRGxsACqUzxSq8QuVEtWskrWarS6Un1QIq4W\\njlcyt2LZgxgUSplG3oO3RDVhvCXvVCxTyqOVp4qWtXX0MInJ4BBiuw5rRbsaZUEHJkfmFAZN41tr\\nEbqYoqcLomolQSnXJf36FpON0q0apbWiCEWajRYlejr7LH6OhWOW2QFtckJkC3Qty6Zp0FnrSUJ7\\nP4plpW4bG76Lm4ZsAlnwwobDPvW4btkAXgV2wPL9/ihZYaIrWclKVvIh5JFaotUc6kq0/WKxYH1r\\nxOWrEp3P+xkezc7ZxwGwjWbRTNrcbxS6UPgm7mbCA2yr/AiqZEJ02vsGayt8qPatNThvU6Uc741k\\nwHRpGA582P2U0UvRX1DkjLi4JZjoV/78z7h75y51I+6ndsdMjm/z9lvfBcDN4e3Xv8EP3vobAJ56\\n5u/xxFM/z7PPfw6Ae3fe4H7zNltbozQ2elpRhdKAB7sHDAZDMhdz3z1ZrhiMxHKbzRYMB/1EqRqP\\nx9SlYmtbLN/nnn2C3d1b/Omf/gcA3nvvPX7p0/+QIvgwe9NjFpOK739f7vfB3l3Kas71688DsHX2\\nAirr4WLWj/bkjSbvhU4DA7B+mkrlYcFQkIf6qPV8wWav4NxD4cGuf+ePuXj0DXwWcxc9Kt9Eb12V\\n8VpMUZN7UE/CaCsWzTo3R8/J4Z/4T7jx5E+nVMSIhy5FkDv/IxS3YKl5wcOsl7H0wgnqUExDNFjH\\n5SEYZ1uJXTya9srB/esYLF0M0AZ8uMtDRbWYrHOBk5q8nlBqLlVlChYRraWlgDyYyrnO8EqldiBS\\nB6AiD7V5hzmMCk0/dDlQTY3DYaOb5uUaXbpf1xTVOsJY0W0Tfm8cMa2XnV+lFL1+L+HdmTb4JauX\\ndB75fZuemy7PMiUs/huf7/3Rd9I1vGutVfnsyLIsVf2q6zoweeT4osjoFRmNbT0FG98JLUviR8kj\\nVaK7dytUeJGb6xs4C17JohnPGs7aj1KV4u7Pm2OmiwUXLlwCoLJTerai1xMepfR5MTQhMGKMBusp\\nQv6xMoAjKRljNOPKUwclbK0F7RNZvmksSmv294XHORz2GQw3EvjsXY02kHmhAO3dfYd7t9/j0uWP\\nAfDmq39Nbe/y3s2bAFw+d43Z0UNu7b4HwK337rP1a9dxAZf73Oc+x4PL53nndcEg5wtLXSkWc7mf\\nWVlydvMCRxO5n4qSo9kxawEzHg4HDIY5ZShgsr+/T1NmFD0Z38lszP5+xWQq4/Pk9ae5fP4Cg/D9\\naKj4m29/mzfffFmuNzvGelh7XgJ/ZVPy8GiPjW25ntZ9BpkjCy7bxmAIrkQpcedL53FkqfBt1jQM\\nnKN+60UAzr72f9BnDnmYoAXQQHNbeK1G5xjV9tjyjcU0mt4dgT+quiD/6M91CiUTcLE2POV9h5bj\\nwcZFJlEkvJF7Vd6ifZ3c5+R+J/dfKnjGlGLvGpQnBZbakwYlFRGjjmaQYE+Hk4wncyFlVukAN8Rz\\nCX2LsME3QX22ylSjMYwyeZd5rsGr1DOKXBTEWl/ebT+DTHtUI8c716BQqRRfzFtPiRN+2YWNBbJT\\njryPefRxPGTMYh2F9jj5vbjhLS80YqLLxKvlwF73z0Rf7MAF0NZTTfcUg8yNT9eU8ckpioI4G6y1\\nAgeEF2WUY200oI7jh2a6WNAkzvQHu/OPVIk6q1OWQJZZikHOxvAKAA8OFnzlK39CjSiFZ575DFtr\\nZ6jnkUxeou2EMgRCtrfP0esNyROu1KAzTR7Ad+UseIsJUT7jFRQGG/OnjcYpn3CyWgk3bl0gRYaZ\\nx5cn9HqiFo5PDrh9/y3++Hf/HQC7773OmTObVPNDAL737a+xuZkxm8gmwBnP7t37HB9KlaqGu3z7\\na/+evX3BIH09Qduch3sSiKrqCpX1OP+YYIBNZdl9+BDC/Y8GPc7ubMQYBf2eoaoXZEEpnT9/icO9\\nOQ8fiNJd2xzy2Z/8PLOZTIhePuB4f5dL50WRfOtbf8E3X/gqhwdyf1ppRhsb3LghPN3Hn77F2pZj\\nLShR5QomQK+OBUjWUL6XkiFcoVF9jToRRZGVDU2VMzsWTLSaW056A/pRifo5zpCyeox1uArmRl5A\\nrR0eizOitJtpI7hZmOA2EsJjxDpOslS42LeV40P1bu9D4oJ3aGfRxKCW4J+KyCOVJoQtPisFQlol\\nGrKLEtzulxWoX7ZlHFJTICUMxcCUj9H1gN3HjCdvggcQMTrhL5tQsLvxoL1NxJFeoSlMTpHYBw7l\\nSEFVjxasf6mqjqbtOuRDHCxYiuiQrn/K8uvkwitj2mi7hqauU2V8G3ijbe1aUYTOtxtglzMclWFU\\nllGJnu7n1RXvfVoL0UpNFclCl4bIKdehYlVj6/BbS5FlacN2XodkiXZ0PkhWmOhKVrKSlXwIeaSW\\n6HR6yDC4o03j0bXj5Egst2GxzWOX+rz1urh31699hCevX+X2bXGHF4sxW6Mew1HMYKqYzRuKkFHj\\nvSfDppYNGtAq67SI8BjboFXsiKiw3nZ6OGmc9vQCrpTrhslkRq5CKbnyiNnJLgRr5swZoWuVTbA0\\nq5q9hzXPfEwoT0f7D6hKh/JiWR3vPeAH334BqySaPxjk+Gad0UjcZ1/WlLakJpz/3AWGow32dyV3\\nvpzPGK3nbb6vbigKQ1XJ7rqYzanrhsEgUITKhjde+wH/1T//lwB87OPPUtZz/vIv/hiAv/76Vzl/\\n7izziViKWdbn7NkdFiHt8xs8I9JaAAAgAElEQVQv/AVPffRTEO7/8evPUuYbbQi7P8RnebKUB0pT\\nQcJQJ80Ci6UJpfTyBnpZRVYn8w2nSX2HVC0R5V4wLwoPjZOKO3I9yQiLfXNsIxZFW6VLDJv3VVxH\\nLDFFm7OtvWDoqZNssG+1jm4jeO9wCS9XgcLk2uOVT5SoWN8zWkLWxopWbZqh8w4bmA0udJZtKTtC\\nqVpqYazkzuV7h8JTha4Ftkai95HyZCtBVbOY/Ya031hq5ULiWbZgQ+s+W2eTpRrz1m2w3MRSbOl+\\nWZFTFHlbOo/YC6u1XL23HThErPG6aaPtxphk8tmmxlnXni9E7yNcAFJer+vOn267LBQmlc5vrW3T\\nZANm6m0LX1jbtGs/Wcqxm+rfYXd+fWuTxTzyHHfQpuCllwUzu3btOf7bf/nf89KrEoi4uH2BYeGp\\nZsJDfPedV3j+kz/BwXHoSXRwh8HgDFcufxQApRWVr8ljWqc3eKvxqRGb4Foqujhe2ju0hFwvSjVM\\n7en0hKauePBAlOR4csDZjS1+/df/G/l8eMQrL32N7738NQAee/wS793co4mpZZMjTk4mlOG9N3bB\\n3vgWmztyvfGi5uT4iJ2LElhZnDQ45dg7FCW7vn6W3YcPOTmS5x32M6bTRQd8z5nPm4ShYgu2tjbx\\nyMSfzxzPPvtcep6ds1t888Vv8Yf/578FYDKecP3qYzx1/ToAb731Lp987hMUIXC1u3fAF3/+59jc\\nEnjBOjgqFxS9UPBkJMkBOkQ3elVD5jLGQVFM9QLHCUXo8WRqTzFsaAnwGY4CvFC6tGlo9CJpFmPF\\n5cyCO28yy8B4qrCwQdIodaceqlIqpbU6ZxOlyFpHYy3WxDoAEecj3IssjFRf0zVSGzQc0AT3N/ct\\n2dvgUqCoyHwokhzcVeNTMEtEOIqz8OzWScGSGNiwHrTJl1t6d+amEn5RouRk2tHLIM/CZ4TzGIvT\\nOK8g5NOnG1ZQdMn3ieuKcKKxFGHDkjnWKahtpQ1LFlpKF0UeRiSe3i9hrESKmGkxSWttel4JANXv\\nI8PrsEGbUJYvns65RpRit898J/AUxaX3bbF4bNNi4n6pjoPEQCIlzSHJKhFjbqzng+SRKlHosb4l\\nt1A2U5ppxc4ZWaTPPfssZ7eHfO4nfhyAwaBP4+a8+t2/ll/2NC++8BdgZCJvbm3xiU98PkUsPQpt\\n2t1TOQVeUwcwvzE1mck74HfIDIm7JWKpfOvFbwBwePiAjz79FBsbYtnNp/tc2rnIYiED/8abN5ic\\nTNnakIwkY3KGoz63b0vGz9b6GrrXYxgm7nwMvdGIRSWYbp7nFL0iWYJn1y+yd7RHL0SI+0XGc88+\\nx2wqSvTWrVdxtp+qjS/mC4RIGyrdTxbYpmYUKt2vra+ze+8ua+uB1/mtr/I7v/PbKdCWafj+q6+k\\nohTPPvtJrj9+HRtMycnJgo1+Tk+HjKiBgvKAtcDrnAw0uelhw/g3SrqzxontFg3K9LndfwyA/eoy\\n9++cYBuJ3i/KBbWtpNA1spCtaSAo4TUzZC0f4rfk8/mLfZ4eKdwgT+9baZNwrBSICIpGZxlFHjqj\\nVhXHJyfsyaVpguVnO7xOp2zqfpkpqRNgg2XmMLjw9yB93DNtUndJlTLnOkqwEziKyirvWDqN95QB\\nk1vUVjyKWNAbIzhpqgolNnYevCBpLOdSLnmuldxz6iKgAws1RsN94G2GoslimiX2gGCGWUeptUEa\\nEAMFpVIBb5wo4JTN1mEyhJcRON4t28B7Rx02EWfbtIP4R1cpeoLlGK+P8Dh/dCM7FZ43PH9k2sRk\\ngqBAU4ZXqC8byfdeS9HmtmfTByvRFSa6kpWsZCUfQh6pJWqtZ3oglCaTaa5fe5qr154BxJx+9fWv\\nMA/R5B97/nPcufcuN94W9/4jTz7Pme2Ck4lEw48e7KIbyyDmMyuNRZFpiaY7b0IHxRgCVDT1gixk\\nBAkGBDGVzyjN0ckBN9+R6Pn45AEP77zFpUtSaf/unRtsjDb4lf/sXwDw5FOP8eLu9/GhG+nD3SPK\\nsqLXk/Pv759ATywsAG89tcrJM8FA+6Meo7Wc2VjMo8O9Q8pphc4EI969c4utjTKlsaqsoZ+PmEym\\naSzruiE0C8VbD33Y2pKqUcfHE9544zV+7/fEfbfeUs4tZSilt74+ZDjs08vj/R7wh3/wJ3zqU58G\\nYHJ8yJ/8+9/lF77wBQAuXb7KzTe/w4VzkqZ7brCNxlCG3b3KPKgqufem0bhig+1/8BsA1M99nnxR\\nkZViiX/zj36P733j66jgYlvnUJni2c98FoBf/E//S9ZH6+wE3uvGmTP0fN3mg2cZJtOJ5yvWjqVJ\\nlfo9OqQYF72MjZ0NzETe9dFkhsVgY96/k7oIKox1L1MUuUrp89Y7attIuiDgcRilUytjaRvTto4R\\nO8ul6HGsIxDx2swY4T1HZoLKMFYxT33pAzyZ+lkJ5qhDPD7zDu19+tp7hfWkrgXR8kq1JDKP1m3l\\n++huxwws54VjnW6YyAXt8jalylh8V1pJi3MZ69hlwKfzL9mKAROOGDM+1jNto/exunx7vXBPYfwk\\nvz0+n5RkTKUIleQnthlO4sqntNbY9yt2Z/VS69Z1PAfX4YgvpbT+EHm0aZ95n6NQlPhTP/YpDg/H\\nvPzqXwFw9fHLvP1exsXzkvb5xBN7/NZv/y889fSTAGysbXP2bMY7N94CYGfnEjtnL6TSb85LXrz3\\ngWyvFUbXLU7SaB48fMDZbelBlBcD8DYRdhWO7fU1rl2R779+8xWaesH06B4Ah4e7VOe3+PMv/S4A\\nD/YOMJnlmWeFDH7z5h1qO2f3rhRQmVUli0nJcCRKYntji9HWeW7ffgeA4XCNqppRVrLQB/2c3Kwz\\nmQkGOznepSpn2EDu6w16aG8ZDETped8HFPOZPOBkPGE2m3H5srjP89kthsOGd2/K9XpFH+UyqoU8\\nb7+XczI+xhhRqufOrOOdoaxEqV++ssPrb77M7/zvUvrvi1/8xywWjlvvyXg8/2MXyTPhXALousaX\\nNT4s9EYZVM8zuCi83o3zn+KsyRPF6e7NN3jvu98iD7URTDHEW8fT1+V9f+Yf/n2y/hBCgRdvFIWr\\nW5xRKSnp1mkB7ZpuuTfTFkNRHqU1FzZCHQNfMm8sVfi+dg7nHSpqISOtJdIaxeMN1JFe1YTASScw\\nI2UAo5MqtO6YGGCt/H9SGqEeaAo8hQBo1hJHMcolpaxC3/cINyjtwLuE+YENmGn45ARCSEWgrcc5\\n1ZZ+I6AeSenVoe9UVIpiVLRcfOlnlTDVgFkuu9VtwQ9p3HeqKWTId4/nk35ZtnN+TUAbQuvmDmXM\\nObx3CXqrGzGATCdN0znfcd9dCi6l94MnDpezPuT/h/lh47NH5fl3WInOFiesrwvG+ODhfc5f2Gb/\\nRJTG8fiQ69d+knt3BQP8/d//Q6zNuP6EkNkvnDvDbLFHry9KaevMFovFlPu7NwAo64rzF6+ymIfd\\nvjCYvOYo9LkfH9ecPX8OFQjXFQHL6QQbdu/f4/ZdyY3f2j7DYnZCVYrlVwXi8huvSQbSZDzDKbhz\\nR5SMwaCNZbQhM2Ew2uDooEpTYf9on8lizvqaWMqZUai8hzeCOSoF2xs7XL4mSnwyv8einGNUyGiq\\nPF6dsLEulvHe/jGz2YI8E6Va5IoLF65w/64E4uoKtM5Y3xRLzjaKk8OjpOTu3jtgUc3Y3JLvP/Xj\\nlzk6nHP3obAhsoOGk+MDdu/JpvDC175C7Q0/9fmflvs1lsKADYGtzCpyMpqQsbTwC3p6wkDF/G2P\\ndgoXcL9PXNjgsD7g2ih8P9zkuOzxsXX5fFbPqRYVeZj5U+VRqp/6DEllc5UCS8YovO5g4qrNlXYB\\no1OhdurZYca0tExC9ty4sVgLdYzGNxqrFL0YzXcNCptq+CrlQ8Ht1lJqHG33T+9xtD2YnApBrAi1\\nhWh5cpLwNErRJCUcMF/i9RQajw/9rZyXazQ2cmZF5aRAUAgaRSUr0KVLBoZwZiXinu6no3QkWq06\\nQcyg5AIRNcsUjXcJj3bO0S2o1jTNkjUnlf5DzVJAh80vkfGDEnXBIGqsxuimPWEY40iej5ZvW2Dk\\ndOBIyPfdrhNAh1y/LKk+RtwkvPqhx0VZYaIrWclKVvIh5NFmLPk5eSYu1WBUMqvuYrREe89uf5TH\\nrj7OlauyK7z+2k0++dwXWSxkN/k3v/+bnN0acOXSEwAcHT7kwe4tfIgOzxczer2c0UjajVTVCb6Z\\n8NprLwFw7bFnUb0BZRN3GROqpccIpmLn8hV+9hcEA/z+yy9y99a7vPOO8DQ9msW86WSF1HhluHNP\\nLNFzm5usrw9wCObrtMGoPjqU3jte7HH2jMYGys/ewzmKPos6pOZ5i6NktCn3nxWasxsFkxOxnsbH\\nDRcu5WysieV4//4e1lZsbYm7vHX5PJsbG+w9kPqjo+Emvf4asyrcjzVsbAw5PBT4wDYFm5vrbJ8R\\nS/eNt19nf++QrU3h8V69fJGiP2I2C7nwtuLB8bvUtXgGo0wz1H2Og7VTOY3TFhOsJV/P8XWNCxlf\\ncz2gsJ5JwKyHWxf4wscu81Png3U1GPLmeINqSzDjxowwukcWLFuKCt1Y+qEUXtHLgnXXuqBONwmn\\n9HiMjhkpgCJRZIRCk2PygOe6BSrPmYZSapV1VJWnCu5urjy51uQ+WrlaLMkwk5zSOFSyRBsPFpU4\\nyU6JNWpcjGYrVKZTxTBrnfw+Ya7Rig1zE4f2Ll3fhvOrBNpKGqcNTBQXcvGT6dtYvLU0Kbpvlqoo\\neS80ppSxpIQr2u2XYYzGhzKNRbGclhlrkUb4omms1PsNtxdXXC9rMVal2gpsWWbItKFp4vgKXqw6\\ntWmdc0KLoHX/U/sRzxIc4TopofH38s6WLcy2f5f8twsNfZA82gIktaG/JhO1dFP0Yo06ECnf+sGL\\nfP2r/4HPffYXALjxzk16gwqdy6JfLMYcNls8dVV4oR977kkePnyJgyNRYg93Zwx1jyuPCe/ytXf/\\nmndvv8y1a58B4MLZq4ynU6wNgZXBkNz1U5/4hobKwxMflQIhn/jkT/O1L/8BL3/vWwDsbI44mRxz\\ndCRKqdAb1JXj7NZFeThV8t79ewxH4l6X85rNzcvs7UkapnWeo8OM9TWhRE2nB1T2LmfOSKBmbX2L\\nupmgQz1Nbc9y9+YdQv0VhsOc6aSmWoi77q1lY7QJYWLvnLnEuzduUQYK1XANnM7QSjYt5TyThWVe\\nykTd2h6yfWZEVcnC3rt7zNr6BtNjud/ssbMc7B1w/ZpsWj/+6Z/gZHaFSUi7/c4r36LJ5jS6VbJC\\nTww4n/XUlcJkcaGWKLUgs/L8V4oZw+1DdooAhOUGvbbLeBjGNy9QBWyEhZXnO7jFnCy19VVo3/Z8\\nEnpTW4XTWYd1EcOTS7giBL2sZdBYsoDJZSPPtPYJkzy2YFXOJBL/jZZATihgYhxkOEws6+csxrtU\\nwMR74V3GXHUUWCxVWvQe7bIWk8OERnVByYaatiknP+jDWIC6AWYdsjw6uP6RQtRUYC0m1hetpV9S\\nSEiWrURFRRvGxrW8VonpuBQvyJQnMyZxngvbSFAqkenFl4+Bp7qx2I4r7hAu7loorqONtGSO45Vp\\nG95nGC61nPJpvQelU73VLBMOaazjgDYheWGZlxrPEUn8WccP13hSl+VA94pprH9LXOnRKtEsp81P\\n9tC4GVkILNhGUdUz3g7R+OOjBdX9Eh8yeNY3RsxOpqkq0ZmzG+RZTp6JZTYZO/7qhRcYbMnI3Nl9\\nixrY3JaB3Ts6Ids8T9YTy7fUCqt7Kb8aGhbTI3IjGOiDW7d5583v0M8jL7OEXoMPK+NkcsC58+dY\\nWxOlaVSf/iBP1cDXhj3KsmQ0EiVW1T3msykmVpUyiq21M2m3Pjw4ROGoN2QB1U3JYDhgMReMOM9y\\ntIYsWE/rGwO0znEhGn3n7i22z4w4HsumU9sp9WzKesgQM7mmGVsp7gz0Bznz2YLDEOhzzqKNpZqL\\n0nrl5XdYWxumIh6/9/u/S1ZYisATnY0bFvOyo8SkH1VrndR4RwqGeBQ908fGmpPGsNQjS4VK+eH3\\n/X4PZzxFyCpqcoPWPWzgJjaNFe5iJ6tFssEDT1S1kJoL9xezr4z2kAnhG6DIGyrvGQalU9qaRdMk\\nXqSvG5x3lLHbpFch1zryODO81jQxOq+h8W3RY7kHRZ4gSLXMW4y1SJMB5Dv/BRcrwXfqmUo/qnYD\\nMfi24paSCHoZcHytFCYzuGBp15Lu1WKI4TqR2RBB28iXzLQn0zZls+WmFkvSL99PHO+6qaVfWOJ1\\nCiYa74/wWYXxNyHjK3kVSGHn2F8s7RWd59VaU8TGe9oEu73luXrv0lxyxpDlGc61bAA63FZtjNQn\\n+JE81GVZYaIrWclKVvIh5JFaoqPBkNk4YHRNTr9vmJViOY1PSvq9EYtFiIbXc/KiYBowOZONyEab\\neBe6UzYK54acO38dgJ3zGQ8OdlnLJHr95BOfZji6yMeDe761vSYZIcG9rIGKLJn0xjfMJg94+UVJ\\n49y79y63bn6fXi9azhlVVVOVsrsPRz3WNjLGx+Jeb25uorVmGrpvzqcnDNZ6DEK7jul0jZqTVLpv\\nPp/h3ICiCN05D08YDAse7oo77ZxjtNbHhsr2o9GQui6ZTAVTnS1KtHKc2RY44Jd/+Zf5m7/5G/YD\\nJSvv9Th3/jIHe4KRZsYwmx7ig8v4cHdKkY/oFaEy/dkRJsvwa8IzvX9vD+cUTcidzPMhs9k+jz39\\nNACTfsmtm/cg5WNLpZwY4bR1I5QTH3d7RVH0qAJ80usXYjOmSjoWOtXapUWHSjibc44sc5hgeVrr\\nmEzm6OD6jkZDsqzbRljRRMurlnbBRXhWlYnFG3maeeYxVUkRLK/1nidXPsEAVmlxnl3MrlI0TlGm\\nKkxaKiXF9EUjllG01BTBSlZtFSRs+JMOZkd7fvldp4oRChvHumu00qZwJl5okeGcpQql3XKtQbeY\\nbWrqGSFVZ6Uve8cydq61RK2SKmcqPF9posexHD2PXpHtWKXyuA6vFHUktoYMrJYn6sDbtq6o8mjt\\nWh5q7OIbMVuj0cqR2/b9SWeAOB4Oo9u7Uz7cbx6rZHmUbr0kE87fdHL7P0geqRKdnCzY3BRMbDZb\\nMDkumU1jLv0QlMcE93nnwoDGjrn0uBRtHo0y3r17RC+XwMMXfuG/4OpjT/K//m//IwB7B7e5euVj\\n/ORP/CMAzp67RpZvYYqImyzIaFg0wSUzQzByDQClprx947t873uS9rk9GjEcbXCyEKV/Mj3hwvpF\\nCPnJ/X7O9HiCC2D/cJTx4MEJg0EoHcccnTUU4fpPPf0EJ+MDjg8lWWA0vEiWFRyHWgDKawozpAkF\\nOoajAXmWM7Vyv+Pxgl7R5/BAjrfOszZcYxxK7/3pl77M3t59ev2gdNf6ZGYNQmBmb++Ix66eIdBA\\nmYxrnDOsjQQO2b1/nyzz6f0MRxnz+ZxeIeP/YHqMyft8+tOyKX3h57/Iv/pX/x1vvPF2eLsKrbO0\\nuJ2zXe42Gk9TN7hQKLjX6zH3Ni0kY0A33eZmnqa21NF9NzXGlpjQI2o2K5mMZ6nFdVU3mIw03o13\\nnITEhKp0OAdF4MTmRUZe5Alfdc7gLahAjxrqjEG/dc99LimmGyGxoXawcIpZ0GmVawIvVBZf4Q1G\\ntYs08haPIj0LBbpttCabiU8YaNtALaqBUEAlNeWTNMpWSXfBU5lL2hjpywSpJ1LbItjhOj2IbOCQ\\n1jEwE/Luo86vvQUc8e1qK65vUlJK0ak8R1TxXQoSKOG3hvtHndoJvE09mIxWIQkmtDuJVKuIr9de\\nGjMGpZ2ZBuVcqn2Qa4XPFFlMQfaKxkMe4RUdYMUIrwQ4Iga27N/l3Hlr58wC2TvL+2ysX+C4EEzu\\n/IV1ptMxVRULz+Z89JknODoSS8/Wmp6zzIMS+oN/92+5evUae7tCvh9tDcjzPnsHohSnzU2cvsfl\\nKxKI0lmBKQw+cNFqm+OcTj2D7uw+4DuvvEoTFunRvOH4aJyshe2tNWwp5XtBumqWi4ozOxJsyAvh\\n1h2G+qFHx/t87ONPcnwiSnjn7AWGowuMA281yzKmkwXVQp7XW8vacMRgFHtILTg5KZnNW96jyQbk\\nIdo9zHOyLCMP0er+MEfnDhdwpsm0ZrGoklLMMoNyC9ZHohTP72zw1g/epB8q1TtrmC4WbGzK+9nc\\nGlDuVnz1q2KZf+SjH6FpLC5GaHujsChjcEGitTF/u2kamqbGxInqGqqmYRYm6Fq9CEWVbXp+vKIJ\\nuNubb7yJzTVPbIVGhfk6GMWiDGyFyQRlssQTXSxqnG/Iem2Et24ib1IWUtmIEq2dIWssJjBFbCPR\\n+KjQdbCcUrRXKZq6RMXAjZJatLGKUq48GZ4sVp5XDZluM3oa66kqS5EydgBsKohllKCbKVqeOnm2\\n5HsJRrXkdKXaItAmBJa6LZCU6VheSPJAHeaGNjlN5anrdsPqYogoE7i1HV5mJxCjjZHe8UWWPtPB\\nEW3TUFYV1aIMny3eWXSwjB0xSBbxa0ls8LZlL2RapUQao3VgHsjxvX6P4XCYsveqxQyNwsYAYpZj\\nncZGpauUBBoDRpxnGvIWk1ZIMDAGWf82JbrCRFeykpWs5EPII7VEH7u+jQkZQoqCo/1pKue193BX\\nzPzAq5zPPO/dfIAOlmE50/iqTx4oNeVin3t3F2xviWW1c2GHX/+1f8bdUNn9Gy/+Ec//2GfRSniX\\nru5RrO3gnFgjhaqxVuFCe43p4SEf++jzXPy8YKp/9Zdf5vBolyY2sqlqyslhsk6asmE6meMDceT8\\nhW22t7eoarGUe70c28AkWKIPH95lY2OHnXNyP/sPj8DB5qZEuze3zjEarRFbTuzuHdLvrydL6/Dw\\ngNm4ZjM8r7MNk/mYjzwlVbCK3HD+3DZHAaMtij7l3NFUEaOd8rkf/2le/LZQtrTR/PhnnuXTnxYK\\n2G/+5m/TK/osZjEiC+fPn2M2k+cbDAzObvC5z34ekKpVg8EgWW8+WC5tdL7BNoLbApT1jIHJmM/F\\nUzg+PmTo21Q9QgWoMpRKPDzcozKa3jy4oHNHZku2ts6G2SRpn9EC0irD1o5yEawZo5fdy059Teeh\\nbDw+uG/OWpz1ZFnHMrEtTaf2UDtPGfIShRPa8iK18vS1TxziQoXK7eHeaqdRRtGPGUEu4H3B0iuy\\nHKVgUaVisXhlEq4o9B1HbPadGYPJlMACAN7ibJOqGCmlMVqTZy0TJssK6MlaamzDlJDvD2ReLF8X\\neauOgG/G5zMYrYhECG0MJssSVKazZUvUOQsL0yKmZSl5/U2L72jVZgjlxtDLVUorHfQ0o2GPrXWZ\\n60VuKMsFRbCsh6MRvf6AgwNZa4fHJxwdn6S5CI6qbtNErVeoSqUqWnme4XxBTsRIQ5poLH34dxkT\\nVcoxPhETfDaZMJ/UDIfirs0X0vt60JcHm4wnKIYpzW98vODh8YL1kFa5tj7C+iI9kLc1v/tv/jWz\\nhSzSsjqkOdxl7x3B7J544hrnr3yE648/DkAvH5KbEZOpLKQX3vguR+MJB7eFXP/sx55n7/572BD4\\nKoqccb1PGcj/xhg2t0dMp3K927cOuPLYDttnQgtgrahKR68QCtThwQnWKgahD05dzxgM1tjaDhQp\\n4yh6ntlMlO6Fi2d4772HZJlMpDNnzlCeGIJHynS+4B//0j8Jihe+890Xqeop45PAgx32cLXGhpX9\\nn//qr3HrnXtJUVy5ssPe/h5f/os/AyAvNEU+YG9P4IbF3DJcy/hICCT97M/+PN/77huyGMPz66xt\\nM2syBV333jqapuStt74fXn7Fx68/wXu3bwLwzf/7T/hnWQaBIK69R3vY33sAwHe/8yIfef7HWDsn\\nm9qXvvl1nrj8GJtbEkjLcwnXdFhEQjWKDdJcTG0MH73FxFJwHrxyVE1sFxGwtQ7Z2npF6MZB7QyN\\nV8xD00C0BLxUIM/3C8Mo1xSBzJ5hpaZArE+KD2wdubfhqI9RHtdRKllWMAlKtfEwny9QkVKVih+H\\nP5VDNT4pQWdrMqUTJui9xeSKmk79UleneIPCM+znbVHpLMdjqJoIPwiGnNJSjCI3WfJjHR6MTu68\\nV0p4rqodv/7QkAetW5U9mqqiCQXEZU/TqbHdoJdRZIpBWMyDAvqZZmcjQFeDHt4P6eVxPKSV+dpF\\niT+c21rnZLpNHYKglbXMFyVHJzHRpMZ2NgVjNI21uDLUfQhFqFN6aP1Dmux15JEq0fFJzclRxEkk\\n2h3rSY6CMl0Pfcz9uCbLDIsQnT85HrOxsc7FSxI9PnvmHIcPTyji9u88d2/fpalkILc215kfVrz4\\n7pcBeOv7GetnLnJmS3LT+/k2m5uXE2HXVxNGPcV3viOV9e2i5vzORV69fwOAyjTkhWZ9XTKEjIFz\\n57d4sCuBnrJsOD6eUodGdhcvXmExU9y9GyrZ94dUi5KTY9k9Nzc3uHLpCk0T6nXmcPvOvbSgR2tD\\nyrImDwtjY32LJz72ca5eE8vzG998Ad80NKX8vpcbZpMFO9vbYbzmjE9KtrZkoh0fHXE8uc/Va6KE\\nympOWTaMA1sCZen1Mz77kz8pvx9PeP2Nl/hssDx/49f/Ob/6Tz0HAZNelFMGg0HLMXQ2VFJqeaKT\\n8T433pWqWHfv38L83M+ydxg2nds3UdtthFyqtzvq4Blsbg7Z2l7nwUNRqtPZlEF/vc2CUQprm7Yg\\nCYq6rpPnoI1JgRidKWhcitajDNZ7qoDBOefIjaZJVZmgrBrqgP9Wzos10ykyDG1PHu8juVs+50aj\\ncGTh+NHAIOVKYt0EjbMWG+61biy1XbARaqWWjQdrEw/UuYbUlwkJminvMJHHaRR5C9fLI3qFj51t\\nkdx2QhA0U4reoGB9GCueKcqqbrsGeBM2pxZzNVqnjCrrXOhb1fI4dSfQJAVaPcHppKcNeVG09Tu9\\nRyuX8PJcO3rKcSZ4ZZJebZUAACAASURBVNvrffqGxIzJdOw8EANnjZDvw+X1IKPIRimDrKws3m9w\\n4exWGt/xZIwO6s86S91UKdBmrWwAyRJf5c6vZCUrWcl/PHmkluh86tJmubbWw/Z6lMGSWlvPGY7y\\n1KIA1aPIM86dE8tqfX2bwQCqkAuuqoJLO2tkIYNmPB5z9cpTvHtDKsuPJxa1qTl3WbqJzsoHVI2h\\nDCG8yjoOp/up5cHN927jvGN9Xdzr9269zYO9W+iY4TMc4WrLImB6a/0BZTljHjC8zIzY25tSDMS6\\nube4xf6DEo3cn61hOimT5avJuHL5MQ4OBcN9++032dg4y/lQr/PWrVtUM8txgCfGRzOG5hbPPCOl\\n4p579hmmszGDkQ7jk3Ey9inajXKU1YSjI7Hk/uxL/xc6byhDdLvfG9If9Ik8lrouOXtmm+c+IfVd\\nb757lzPb23z8o88CcHK8T15sYkyIkPZ06ITaupCxJBmI+3x/9yZ37gp7Yv/gAS+99E1mA6GoGePx\\nti1hqVFo71O3Vu1rXn3lu1wIea8mM6yvbSZLUylPXdeJ/tJYh3VNh1ZjyQLzQCuFVopeL7i3KKp5\\nndxLrQ2Ng7LtehTy7WPZQB0qJ7VMCaXBBfpVVTuUld5DIAk5vUwlS2w01MJ1bLJ4dhrlUgZPpTR4\\nlzKCGksolRfvRrDmOj6bs2jc/8Pee8T6ltz5fZ+qOvmfbr4vdffr8Do32eRwGCZ4JE3CaMawDUgG\\nxkGADQGGtbANeGdAgLyzAAdA1kILa2NJDmONPBoOyRlySM2QTTabzc79OrzQL9930//+88mnyouq\\nc+4jMOSGMFqLd3YX95/OOXWqfvX9fUMnU4yiEOVUSuA8dLXGqFaBo1AIQlcZKynxlNdxbouiom5q\\nZBf+2fIy23vjGEmO46uU+1cXYOZe8CA5tKUR4SpIz3QuVdYbVSNbG0VdIAQM+vZZGfQiAqXx2l2K\\nru25tewFTqW89nw0MlDUbmfhxwqMJFAtB1nQCwbdzqJx0drtWMnywkJBtHBEwc86Pl2y/bBPurQU\\noKgH06MS37Pb96qsKLzTLc5ysWRnd0gQWJxpazvh9u17SHeni/KI8+cSDg+tlruqS8Ynt1Chwyw9\\nQdSTGOUuiGyY7E9QupX2TfDDLdbWtwBI4j77+3sMXBDeanWAUgWhk4mmeUWIZM2ZBEslUH6A77Yc\\nceAjxBbLld2+b2z1eOHZz/PlL/46AG+88WOuf/Jh5wd69+5t0mzFZ1+2cSiNkawPRxwe2saQkn3O\\nn32Mids+J0mPF55/joN9i9leu/oJZZVixFkA5vMZeZ4jpfPnlB7D4YjUmTCfO3eWyWyPjQ2r9Te6\\nIc2nbSIF586d57/8e/8VJ2P7fc89+yIvf+bzXL9hc+n/nz/833n+uV/hwiN2kn/1h+/x4YcfdTiY\\n1jXKV52sVRj43ne/hR/ZgX3+/Fnu7F1lJu35x7MT6J0yonVdI0RAljvT5h99F9Hf5BcvWcOT5z73\\nJcIoIHf+or7vUVXVT0j0Qk8iHG5W13Vn0CE0rA+HGNVKRu1GuSpbk+H2YXWNDt/HiIrIia39UFGW\\nJaZ05yptU6ZxC9ade3d4/LGL3XZbquAnDDqkUEjdoOQDFCUEdd0qPTSVNkwXjrJjFLWRmE7cbWEP\\nTct7bFAPNII0AqMbdGsqbAxVc2rCbOlEpybTouWvOipPVdtc+lZjbjWap9tzI0yXVQZt00x2/3/A\\n9M59vnDn336A/VdrTdiunr57QRzF9ENJ0EXXiM5+z36hhzSnmVTWvER13yyN5a22FnZ13VA1ZScW\\nCHyPOPQo3PXWGJRSVK6RFwY+RaUpOoz0Z2/YP9VJdDw+YWvLTlJFnmOMQXm20pDS4mJJ4lydNrdY\\nreZkTgF0++ZH1GKNzE0Kw2HItRt38Z2BRV3l5PmCQdvRkzFZumR5bCelJFFUacViZi/U5s4ueTmh\\nLuz7fVESKY1o7KTbDwPytKbpCMaKRlRkjufaNBVFYJCqrW5K0vm8MzRZLkrSbMqPXv+OO58znD2/\\nwZ3b1q/U8w0ffPweN+/YRosUAUnS4+Zt97fxeP6Fp9m/b/09y6LmjTde56lLNk30d37nb/LoxXP8\\nm+9+A4CPrp0wXFvvJtGi1AyGA7LM+XvmJaPROUpX7ZSl5aC2D/p8fsTf//v/HZEj6z/5xOO8+sNv\\nM53YSXtre8it5Abvf2Azrz788CPqujzN5THaJjI6LiCBoNEFq6ldVI7HewxC6D9qebu9XoTWJXSr\\nv0RgqJ0aQKsSXWUcHdn3P+LI0K2qpCgEQeC7PCDY2lpHm4o8dxhz4Fn7JPfZURBSd5VdwyBOuiTS\\n+SonCKz3AYDv21LLFXpEgYQwJHZNxcPDQ+7v3+PmTdu03NjcJBZniF1IntE1RkiE8+8ss4bAkx3Z\\nXLnudqVbLXtDWtbUziegkZ7Ndep4m4bmATI+eNYApDUkqRqE0Z0BiCsNu1BGm9ckqBxP0hhQWnbe\\nq3lZ2glatJWy9TI5zXqXIGVXeLaNmC4dFNE5ZdnrbVDCPKD1dx/TuVgZlJJdZTzqhyTeqdihqSH0\\nPELXuBJSUtf1KafYMSO6Odr+mG6i11KDPmUn2MacIWgzmIxG61NnfyUkdZF3k6p+yBN9eDw8Hh4P\\nj///jk+1EvW9kNnMVpLCVPihYHunxTQnSClYLmzlOJ3MqUuforCrwmrhUzQFa+uWJ9jUBatywpmh\\ny7HXGj/qMZk6nIuGtfUevu8q0yAm2FHsHVqM0MQ9RsMzLDK7fdy7d4e6rFgf2M9/5NyjTI/H3eq/\\nvb7Jopmd8hCdp2TrIrRaLSxPz6VvnoyX1M0VNjctpnsyPUHrBb6zYxv5EbWpmC/s9rnIGq5dv8L2\\npt0uf+aFlzg5uY8fuAwoCaPRAOV4tS+88AwfXn2Pe/dvAraynS8nnVNR4EUIpckri6mqDJS3w7Gr\\n7FbpkuFgrdvKJr0AaWpGI/v77+5d4f6Bpirs+X74YcMHH+yzyi2G2+JmbbVS1xVe4HVbQttRrlms\\nLGUqCmLu39+nmNlK8a/5Ct00p9txY+MyjLT3bzYZc+f6XeSj9vWf+w1Dr5ew55IHoighCAKGQ8uW\\nSLMV8/kJxlGmzp0/37n+15XlLtbOyb6uGjzPI3aYadPUREnQUYCkq/r8BxRJ165+DC4/a//eDcbH\\n93nt+38GwIVHHmV7s89gZJkfu7vnETKkaHmoWiA91WnPkZaX2RY8lYasqqla/1EZoKV3uk0WGo0m\\n7ARPbbS3vXZlWSMfiDgWUtrEy9P9OFrQWeNVjaZ+IE7DoJDS6zKQlBOetu8Xwm1xVSf0xGjT/T4p\\nreK0o/yeAgHd+0F0MleMwTMav+WF+gppyg4g96RP4Hmdj8Lp97Td/eYBrgJ0VLdOQuw7bby7npaf\\ngHBevmhtvRA6SlNhMX33aar7oX/18alOosVsRuMmmVL7FCwIYvuQhyZkfD+ndNvjrFkhjOGio/QU\\n/gqzXLIxdLLF3V3yZki+cNZxqWI2nrOsXRBe32c+MTy2a9+/FW5zmOdcetz+XdUrZpP7HSbb7yWQ\\nCCq3nV8Uxwy2Eg4P7KTeMxX9OGF2YuMyMBIvilm0OFZpWF9fZ76wk0aap9QnPlFiH9TF6oRazztu\\n3O7WLmVRcffIft5imVPVgkNt33/99k32D/Z46gnLax1P7jMSKaW7vz/++C1uX7nK7St2u19IwdqZ\\n84wPHaUqFOTZjDCxtzynRC6W3YO0tb5DkZcoz16/PE157rkXSF3jrG5qtI7As/DL7f2PGc8qpHuQ\\n4jhmtag63KuuGmqlaXPvta6pSg/TWAx5Okk5P9piMXL382QPQ9U1F2oJsunjF3YRmO3n6MAjdRjp\\naryHPnOB2cSeb3Jhl6IoaByZc744Jhk09Hq2cdXUAa//6DUALj72CKPRFqUj2ZYVyCaicQuO52t8\\nT57KGoXFvNPUXovJouHe8ZIrV/4YgPX1Da5evc6+i05ZX9tGNpL9W7ft0Mgqnnrqqe5eW3igoc0U\\nMo6D6rxsSAswxHgOmqpo8Kg6aAhtbfziwBlqN4KmkdSu0aWlpq4MorHQWBBESBqktOcrjUY3AiXt\\nF9aM0CJAhXasezqlkSGVo/MbUSOaFX7rRYtPg4dyQX6VLzFeJ9XH1wZfa4TbbheewUhBkLfX0yOT\\nAuPgCo+GQJcM3OmpqiT06DjPfhgi/ODUiMU0iEaDcI0j5VmhTNVq8S1E0to2CunyslrZqjaIRlPp\\nU1mn9E4bUUJZ31vlVgHZyRr+6uPTJdsHfWIXVLaeeKRp1PpjMF2uWBY1odN6B0hUnVMt7J2Imoi1\\nnbCFbTiZHlPmKcLYSfBoOqZGECf2oUVC6FUkgcMApc/W2qjLqWlkw/79vdPubmXIsrzLZR+t9SnK\\n3BqjAFm2IErWLKgOZFlJmVcdz7Lf7yHEqd53fX2Dzc3NTvUym84QoUC37t3NnNUypXSV9vraNvNF\\n2ul2b1y/yfb2OrXT1ofSY143PJbYSeJXX/4yh9sXuPzW2/b3TCek9w7pd0a1EhXGSGfS0Ati8mVD\\nHNtJcXNzyDI96SrJ4WCbNJ13aaWTQjFfHDPasPdjNOoxny5JnLa/aWq0bmjcQDTG4Hneqf4bQZZl\\n5G6mKMqKslCkK3vDZ7MctkKMsdWB9WlVBE5Vs7U9IC+yDtNdpQVFseTG7Y/t/V/cZjQacnBw1P2e\\nIIh54qLFjO/vvcWrP7QhiL//+/8xvV6PE7fgFVmDEFlXacWxD5jOr9KTEl9JMlfZvfaD7+L7CW+/\\n/a77Lk2eFaxS+3lVVRIEPu+++wMAnnuuQgjDk088bq99P0RgaAVJpjZUjewcyqxTVoNqye/KOkIJ\\n3fI6PaQ09LyWmeDbZlGHmWrKWrCY2c8Txris+ZapIfHjgMCtEkVjSIsMnIJHCWsQ7cm2MVWjhEfg\\nuuvaNEjR4Dv1mV/V1Mp03rnSKCoUVbsKmRpZNlTO16Eylowv3b3WaKTS4By4/CBkOOwROV8I2/2v\\nu8YZxoAE5fB+rRuLhbdppdpgmtPKuGlsVa5dagRoDvb3u9o18BP8oI9UdqyZRrvwPfvqomzf91cf\\nDzHRh8fD4+Hx8Pg5jk+1ElVByNa2LdmbakE6bajc+pGVhrxq0M4v09QVsa+RrmM3jEK0yigrW5mu\\nDXqMogGpWzSSdR8jBGXaruYem4OIdG4rlY+Ocp587AUCR0lKFwWeCshdpVeVDVVVd04uUhnqpiJy\\nlVlT1+zv73eVF2iqqiF0lVOWpdR1RdKzq2UUxrz44st88UtfBuCrX/0a77//Dn5gK8HZsmSVVkRO\\nForwiYOExq2eAs3OxiaRk8FOZ2NK49O4iIWP3/+Id99/h6WrNAvAZFm3PT6Zplw8e47SyWxprBv+\\nyYmLZM4sY6FVGJ1MjhmOelx4xEYuTycrprNpd++KvKFuKvp9i0H3en1MvSJbtR1fm2vzYDxHUdYd\\nZaquS9ZUyFFuP/N8rmlqhdYOt9JWe984v9XFYsWjT12iOLLsgPHJhG/++bd49UdWphr3NGtrQ6r2\\neomQ+aRB/HV7/V/5wfeZTuwuoSgMQkk+uWm32x9//AmPPfYkT1x0EuDYR8nTCkMaC/+VToJ7vH+H\\n+XJJ7hy1jk+OkdKjdhjeZH7Ct/78T1m5sbu5OSKMVdftf/31Vzk6OuTlX/yKO1cfpWKWrio3Evpx\\ngPJaupimqQWR4zB7yuKAA4fhKhFgELjdLFobMtPQ+A9yZGWnKDLGJiIo5xvhy4IkkDSO8tM0CoE8\\nlckqj6aWlK22XEJlarQI3bXWlvbURiRLRS0FjYN6fK3wTJdcg8EgjbAx0NioY61L+o4XatMWmk5R\\nJZW03FbZMm9qkKCblor2QDVqf5FNB+jUcpZDPF/YsV5WKTdvfcLYjcXd7Qs8/sQLRI5NUZYNZZlb\\n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\\nBQsWfAL+L3BKuVKANsKdAAAAAElFTkSuQmCC\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7f3c41a646d0>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\u001b[1mtoaster                        0.69\\u001b[0m\\n\",\n            \"tractor                        0.30\\n\",\n            \"pickup, pickup truck           0.00\\n\",\n            \"harvester, reaper              0.00\\n\",\n            \"thresher, thrasher, threshi... 0.00\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\nRU5ErkJggg==\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7f3c405cdf50>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\u001b[1mtoaster                        0.96\\u001b[0m\\n\",\n            \"cellular telephone, cellula... 0.03\\n\",\n            \"mouse, computer mouse          0.00\\n\",\n            \"printer                        0.00\\n\",\n            \"iPod                           0.00\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"ds2GeStmPXLP\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"transfer_patch = load_obj(\\\"transfer_patch\\\")\\n\",\n        \"\\n\",\n        \"m = MM.nc[transfer_target_model]\\n\",\n        \"m.patch(transfer_patch)\\n\",\n        \"  \\n\",\n        \"transfer_attack_win_rates = calculate_win_rates([m])\\n\",\n        \"\\n\",\n        \"save_obj(transfer_attack_win_rates, \\\"transfer_attack_win_rates\\\")\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    },\n    {\n      \"metadata\": {\n        \"id\": \"hC6A3yHnyHgD\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 376\n        },\n        \"outputId\": \"2b4ee8a2-a17d-4575-c7a6-f36b19a0a2bb\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517536422707,\n          \"user_tz\": 480,\n          \"elapsed\": 595,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"transfer_attack_win_rates = load_obj(\\\"transfer_attack_win_rates\\\")\\n\",\n        \"plot_win_rates(transfer_attack_win_rates, ['vgg19 - Blackbox transfer attack'], \\\"blackbox model attack success rates\\\")\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAfIAAAFnCAYAAABdOssgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xd4U2X/x/F3uumgi7bsLVCGUGTv\\nXQqoKAqIIi5cgIiKIA8oQ8GFA0FcgD4qgkwXS2QIKAiykT1bKN2L7jbn9weSnzxQ0mKbdHxe1+Vl\\nc5Kc882dkE/OuO/bZBiGgYiIiJRIDvYuQERERG6eglxERKQEU5CLiIiUYApyERGREkxBLiIiUoIp\\nyEVEREowBbmUCDt27KBnz57XvW/8+PF8+OGHhbreG22vOGrYsCERERE3fMzQoUP57rvvCrTeLVu2\\ncOHCBQBiY2P55ZdfbrrGDz74gP/85z83/fzS5N+2pcg/KchFJE+ff/65Jch37NjBhg0b7FxR6aC2\\nlMKkIJcS5Y033iA0NJTevXuze/fua+7fs2cPd999N71796ZPnz789ttvlvtWrlxJaGgooaGhjB07\\nlqysrKuem52dzdChQ5k/f/4Nt5eZmcnLL79MaGgoYWFhvP766+Tm5rJ//366dOlCamoqAB999BHP\\nPPPMNTV+8MEHvPLKKzzxxBN06NCBsWPHsnHjRu6++246dOjAxo0bb7gdgM2bN9OzZ0/CwsL47LPP\\nrlr/4sWL6d27N926deO5554jIyPjhm0aGxvLo48+annOggULAHjvvffYvn07Y8eO5ZNPPmHq1Kms\\nXbuWMWPGALBkyRLCwsLo1asX999/P+fPnwfAMAxmzJhBt27dCA0NvaY+gIsXL9KtW7frvofvvvuu\\n5X168MEHiYqKIiIigoYNG1oe88/beW3vRstnz55NaGgoXbt25dVXX7W06+rVq+nXrx9hYWHcfvvt\\n7Nix44bL/2n58uWMHDmSYcOG8eabbwIwZ84cQkND6dGjB0888QTJyckcOnTomrZcv349t99+O927\\nd+eRRx4hPj4egGPHjjFo0CD69u1Lr169+Oqrr274XkoZZYiUANu3bzeCg4ONH3/80TAMw1i8eLFx\\n5513GoZhGOPGjTPmzJljGIZh9OvXz/KYFStWGD169DAMwzDCw8ONNm3aGBcvXjTMZrMxYsQI49NP\\nPzW2b99ueczLL79sTJo0yer2Pv74Y2P48OFGdna2kZ6ebgwYMMBYuXKlYRiGMW3aNGPmzJnGxYsX\\njY4dOxpRUVHXvJZZs2YZnTp1MmJjY434+HijcePGxuTJkw3DMIwvv/zSuO+++264nZycHKN9+/bG\\nli1bDMMwjHnz5hn16tUzwsPDjZ07dxpt27Y1Ll68aBiGYUyaNMl4/fXXDcMwjAceeMBS5z9NnTrV\\nePnllw3DMIxz584ZjRo1Mi5cuGAYhmF07drV2Llzp6XuCRMmGIZhGLGxsUbjxo2NyMhIwzAMY/z4\\n8Zb7Vq5caQwePNjIysoyUlJSjM6dOxv79u2zPD89Pd246667jO+///6aWo4dO2b06tXLyMrKMgzD\\nMP773/8aK1asMMLDw43g4GDL4/55O6/t5bV8xYoVRt++fY3k5GQjOzvbePzxx40vv/zSMAzDaN26\\ntREREWEYhmHs3LnTmD59+g2X/9OyZcuMZs2aGadPnzYMwzAOHDhgtG3b1khJSTFyc3ONhx56yPI5\\n/Wdbnjt3zggJCTGOHj1qGIZhfPTRR8aoUaMMwzCMUaNGGcuXLzcMwzDi4uKMp556ysjMzLxm21K2\\naY9cSgxXV1fCwsIACAsL4/Dhw2RmZl71mJUrV1oec9tttxEeHg7Atm3bCAkJISgoCJPJxMyZM3no\\noYcsz1u4cCHnzp3j5Zdftrq9TZs2MXDgQJycnHBzc+P2229n27ZtAIwZM4Y1a9bw0ksv8fTTTxMY\\nGHjd1xISEoK/vz++vr4EBATQqVMnAOrVq0d0dDRAnts5c+YMWVlZdOjQAYC77rrLst4NGzbQp08f\\ngoKCALjvvvtYt27dDdt14sSJTJo0CYBq1aoREBBg9Xy7v78/f/75JxUrVgSgRYsWlrb+9ddfCQ0N\\nxdnZGU9PT1atWkWTJk0sz50wYQLdunXj9ttvv2a95cuXJz4+nh9++IGkpCSGDh1K//79b1hLXtvL\\na/nGjRsZMGAAXl5eODk5ce+991rayN/fn0WLFnH+/HlatGjBSy+9dMPl/6tmzZrUrFkTgMaNG7Np\\n0yY8PT1xcHAgJCTE0kb/W3+rVq2oV68eAIMHD2bDhg3k5ubi7+/P2rVrOXToEL6+vnz44Ye4uLjc\\nsD2k7HGydwEi+eXj44ODw+Xfnp6engAkJSVd9ZgffviB//73v6SmpmI2mzH+nkogISGB8uXLWx7n\\n6upq+Ts2NpaZM2fSrVs3nJz+/59EXtuLj4/H29vb8jhvb2/i4uIA8PDwICwsjM8//5wPPvggz9fi\\n4eFh+dvR0RF3d3cAHBwcMJvNAHluJykpyVLPleVXpKSk8PPPP7N161bg8mHk7OzsPOsAOHDgADNn\\nziQyMhIHBwdiYmIsNeQlNzeXWbNmWQInNTWVWrVqAde29ZXXBrBu3TqysrJo27btddcbFBTEBx98\\nwPz585k2bRotW7ZkypQpN6wlr+3ltTwlJYV58+axePFiy2vx8/MDYO7cucydO5e7776bSpUqMWHC\\nBFq1apXn8v/1z/ciPT2dGTNmWA7DJyUl0aVLl2uek5KSwq5du+jdu7dlmaenJ4mJibzwwgt8/PHH\\nPPvss2RmZvLEE09w//3337A9pOxRkEuJ8c/QTk5OBi6H7RVRUVFMnDiRJUuWEBwczJkzZwgNDQXA\\n19eXPXv2WB576dIly7ljFxcXVqxYwbBhw/j5558tV6vntb0KFSqQmJhouS8xMZEKFSpYavjhhx/o\\n27cvs2fPZty4cTf9evPajre3N5cuXbIsv3I+FSAwMJC77rqrQNsdO3Ysw4YN47777sNkMtGxY0er\\nz1m1ahUbNmzgq6++ws/Pj2+//ZYffvgBuNzWCQkJlsfGxsbi5uYGXL66fvz48Tz88MO0a9eOKlWq\\nXLPuNm3a0KZNG9LS0njjjTd4++23eeGFFyw/zEwmk+X9uNH28loeGBhIt27deOCBB67ZdvXq1Zkx\\nYwZms5mVK1fy/PPPs2XLljyX38gXX3zBmTNnWL58OR4eHrz77rtERUVd87jAwEDatWvHrFmzrrue\\n5557jueee479+/czfPhw2rVrZ/nRJAK62E1KkIyMDH7++WcA1q5dS5MmTa46zBgfH4+7uzu1a9cm\\nJyfHsseVmppK586d2b17NxERERiGwSuvvMLSpUuBy4dzK1euzIwZM5gyZYolGPPaXpcuXVi6dCm5\\nubmkpaXx3Xff0blzZwBee+01HnvsMSZMmMDq1as5fPjwTb/evLZTvXp1HB0dLXt6y5cvx2QyAdCt\\nWzfWrVtneQ3r16/nk08+ueF24uLiaNy4MSaTiRUrVpCenk5aWhoATk5OpKSkXPN3XFwcVapUwc/P\\nj4SEBFavXm25yK9bt2789NNPZGVlkZaWxpAhQzh27BgAVatWJTg4mGHDhjFhwgTLEZMrtm7dypQp\\nUzCbzbi7u9OgQQNMJhO+vr44Ojpy9OhR4PIplCvy2l5ey7t37853331Heno6AIsWLWLFihXEx8fz\\n8MMPc+nSJRwcHGjatCkmkynP5dbExcVRu3ZtPDw8OH/+PJs3b75uu3bo0IFdu3ZZDrvv37+fV199\\nFYAnn3yS48ePA5dPu3h6euZr21K2aI9cSozatWuzZ88eZs6ciYODA6+//vpV9zdo0IBOnToRGhqK\\nv78/48ePZ/fu3QwdOpTly5czdepUhg0bhqOjI02aNOHhhx9m7969lue3aNGCvn37MnnyZO6///48\\ntzd06FDCw8Pp27cvJpOJ3r17ExYWxqZNm4iIiGDw4ME4ODgwZswYJk6cyLfffoujo2OBX29e2zGZ\\nTEybNo0JEybg4uLC3XffbTls3KhRI5588kmGDh2K2WzG39/f6qHp0aNHM2LECHx8fBg8eDCDBg1i\\n0qRJLFy4kNDQUJ577jmeeeYZ2rdvz4IFCxgwYAAff/wxP/30Ez179qRatWo8++yzPPXUU7z++uuM\\nGzeOo0eP0qtXL1xdXbnnnnto3ry55ToCgMcff5xffvmFr776iqFDh1qWt2zZkp9++onQ0FBcXFzw\\n8/Nj+vTpuLm5MWrUKB577DECAwOvek6fPn2uuz3DMPJcfvz4ccu1BdWrV+e1117Dz8+Pjh07MmDA\\nABwdHXF2dr7hcmsGDx7MM888Q2hoKPXr12f8+PGMGjWKzz///Kq2XLZsGdOmTWPEiBFkZ2fj4eHB\\nhAkTAHjggQd4/vnnLadHhgwZYjkHL3KFyfjfn8QiIiJSYujQuoiISAmmIBcRESnBFOQiIiIlmIJc\\nRESkBFOQi4iIlGAlsvtZTExKgR7v6+tOQkJaEVVTtqgtC4/asvCoLQuH2rHwFHZbBgR45Xlfmdgj\\nd3IqeB9euT61ZeFRWxYetWXhUDsWHlu2ZZkIchERkdJKQS4iIlKCKchFRERKMAW5iIhICaYgFxER\\nKcEU5CIiIiWYglxERKQEU5AXI6dOnWDgwDtZtmyxZdnZs2cYMWI4I0c+zhtvvEpOTk6+19e5c2tG\\njnyckSMfZ/jwB9m8eSMA8+Z9fNU28mPkyMc5deqE1WU3a+vWzZY5lwvTunVruO++u9m3b0+hrG/v\\n3t0kJMQDN1fza69NZtu2LYVSi4gIFHGQHzt2jB49evDVV18BEBkZydChQxkyZAijR48mKysLgO+/\\n/54BAwZw7733smTJkqIsqdhKT0/n3Xff4rbbWl21fO7cWTzwwEPMnv0JQUEV2bBhfb7X6enpyezZ\\nnzB79idMm/YmH330QWGXXWgWLfq6SIJ8164dPPXUMzRtGlIo6/vpp+8tQV5UNYuIFESRDdGalpbG\\ntGnTaNu2rWXZrFmzGDJkCGFhYbzzzjssXbqU/v37M2fOHJYuXYqzszP33HMPPXv2xMfHp6hKKxKP\\nPHI/06fPpGLFily8GMmECWOZNesjJk58kczMTNq2bc8PP6xkyZLvWbPmJxYu/C+BgUF4e/tw220t\\n6dUrjLfffp+vvvriqvVGRITTsGEjAFq1asOKFUvp1at3getLSIgjICDwqmU5OTm89tpkYmKiSU9P\\n55FHHqd9+44cO3aEmTPfwMHBROPGTRkxYrTlOZcuXWL48GG89NLLAPz443ccO3aUzMwMpk17g4oV\\nK/Hhh+9z4MA+cnJyGTBgIN279+KJJx5mxoy38fevwOOPD2PatDeoUqUqAGvW/MRffx3khReeYfz4\\nScyYMZVy5dwZMGAgqamXWLp0MY6ODtSsWYdx4/7DqlU/sH//XhITEzh37ixDhgylX7/+fPXV52ze\\nvBEHBwfat+9IcHBDtm//jSNH/sLLy4vk5CQWLfoKR0cn6tcPZtSoMaxa9QPbt/9GbGwMU6ZMt7RR\\nauolpkyZSHp6OhkZGYwZM5bU1Ets2bKJ06dPMWDAQEvN778/l48++oC//jpEVlYW/fsP4Pbb+3Px\\nYiSvvvoKZrOZihUr8Z//TL6q7R966CHuu28YzZu3KPD7KSJyRZEFuYuLC59++imffvqpZdmOHTuY\\nMmUKAF27dmX+/PnUqlWLJk2a4OV1eRzZ5s2bs3v3brp163bT2/52wwl2Hom23HZ0NJGba9z0+gBa\\nNghkYLe6ed7fqVNXtm37lQEDBrJly2a6dOnGmjU/UrNmbZ599gWWL1+CYRiYzWY+/ngO8+Z9Sbly\\n7jz44CBuu60lTk5OODld+3bUrl2X337bSlhYP/74Yzvx8fH5rvnSpUuMHPk4ubk5REREMGXK9Kvu\\nT0lJplWrNoSF9eP8+QgmTRpP+/Ydee+9txk7dgJ1697CtGkvc/FiJACGAePGjeORRx6ndu06APj6\\n+jN79icsW7aYJUsW0bFjZ06dOsncufNJT09n2LDBdOrUhZEjn+WTT+YQHNyILl26W0IcoHfvvnz2\\n2Ue8/fYskpISOX78KMuW/Yi3tw/ffbecmTM/wMvLixEjhnPy5OVD+SdPnuCjj+YTERHOK69MoF+/\\n/ixa9BUrV67B0dGRlSuX0bJlG1q3bkuXLt2pXz+YkSOH89FHC3BxcWHSpPHs378XgKioi3z00XxM\\nJpOlpri4OPr160+nTl3488+dfP31F7z22lvUrVuP5557kdq16zJv3se8/fasv4O6MqNGPUdmZgYD\\nB/bn9tv788knHzJ48P106NCZDz98nyNHDlvWP2vWTMLCwhTiZcSRswmciky2dxlWeXi4kpqaae8y\\nSoUGtfypHeRpk20VWZBfL5jS09NxcXEBwN/fn5iYGGJjY/Hz87M8xs/Pj5iYmBuu29fX/Ybj2JZz\\nd8HR0XTVsv+9XVDl3F1uOGh9//79eP3113nyyUfZsWMrkydP5osvvqB9+9YEBHhx5519WLz4K5yc\\ncihf3ov69WsC0L59O7y83Czr9vBwxdPz/2+//PJ/mDx5MuvXr6ZVq1Y4OzvcsI5/8vLyYvHibwCI\\niYnhoYce4uuvv7Zso1atyixadJxRo4bj4OBAamoKAQFeRESco23b5gDMmvUuAC4uTixcuIBKlSpx\\nxx29Lcu6d+9EQIAX7dq1Ys6cOUREnKJ9+7Z/1+hF/fr1uHQpjtDQrvzyy2o2bFjHwoULcXZ2vqpW\\nR0cHKlTwxNExm+rVq1O3bjUAqlYN4uWXXwTg3LkzmExZeHm50bLlbVSs6IOXlzPp6akEBHjRu3dv\\nXnzxGfr168eQIffi6emJm5sz3t7lSEy8SHR0FOPHPwtASkoKaWmJeHm50bx5MwIDy19Vj5tbDRYt\\n+oKlSxeSlZWFu7s7AQFeuLg44evrQUCAl6VmDw8PcnMzGDVqOM7OziQlJRIQ4MXJk8eYOvUVfH29\\neOWViQCsWfMdGzasISsri0GDBuXrfZT8ye+/C1vb9Gc47yzag/Hv9iWkhCn3+1m+ebUPjg7/Lnvy\\nw26znxl5fKrzWv5P1maUub1NdW5vU91yOyDAq8Azpl3Pjdbh41ORyMiLHDx4nPj4RDw9K5CensWl\\nS5nExKQQH59Kbq6Z2NgUzGbDsq7MzBxSUjIst1NTM3F2/v/bTk6evPrq2wDs2PE7586dv6qOFSuW\\n8ssv6/Dx8eXVV9+4qibDMP7xWDeqVavJjh17LNv45pulREXF8v77H5OcnMxjjw39+/Gma15rVlYO\\nLi7l2LZtGydOhOPt7UNWVg6JiWnExKSQkJBKVlYuqamZZGVl/+P1pJOUlE5MTArR0bFkZGQRHh5j\\nOQJzxeW2uURSUiomkyMxMSlkZ2czefIUPv98If7+FXjxxWdJTEwjJSWDrCwzMTEppKWlkZt7+e+R\\nI1/g7NkzbNjwM/fdN4RPPvmCjIxskpLScXHJol69Brzzzuyrtrtq1Q9kZxvXvN758z/By8uXWbNe\\n5siRv5g9+z1iYlLIysohISGVmJgUS83btu1ky5ZtvP/+XJycnOjZsyMxMSkYxuXPTE7O//8zy8jI\\nJiMji3PnznLmzBk8PPzz/ExJ/hXWv/HC9ufRGOauPEg5FyeGhtannGvxnnDS27scSUnp9i6jVKhf\\n25/4uEuFtr4b/VC16afK3d2djIwM3NzciIqKIjAwkMDAQGJjYy2PiY6OplmzZrYsq9C0bduBTz75\\nkI4dOwNQuXJVjhw5TNeuPdi+/TcAypf3Jjk5ieTkZFxdXdiz50+aNGma5zrnzfuY4OBGtGvXgVWr\\nvic0tO9V99911z3cddc9VmvLysri1KkTVKlSlT17/gQgMTGRSpUq4+DgwObNGywXbtWsWYtDhw7S\\nqFFjZsyYyn33DQXg3nsH07ZtK957721eeeVVAPbt20vDho05dOggNWvWpEGDRnzxxTyGDn2ItLQ0\\nzp+PoGrV6qxfv5YaNWoRFnY7H388mxdeeOmq+kwmB3Jzc69alpaWiqOjI/7+FYiKusiRI4fzvGr/\\n0qVLLFnyDQ8/PJyHHx7O3r17SEtLtdxfvXpNzpw5TUJCPL6+fsyb9zF33HFXnu2VlJRInTq3ALB5\\n80bLdh0c/r/OKzUnJSUSGBiEk5MTW7duJjfXTHZ2Ng0aNGT37p10796Lzz77yHLBXZ8+d+Dm5sZ/\\n/vMf3n137lWH9KX0OHgqjo++O4izkwNjBjalThVve5dkVXH9QVQS2bItbdr9rF27dqxduxaAdevW\\n0bFjR5o2bcqBAwdITk4mNTWV3bt306JFyTxv2LlzV9avX0uXLt0B6NPndvbv38PIkY8THx+Hg4MD\\nTk5ODBv2GCNGPMbkyROpXz8YBwcHjhw5zMiRj7N69Y8sWbKIkSMfJzk5iZ49Q1mw4BMee+xBKlQI\\noF27Dvmu58o58pEjH2fEiMcYOHAIQUEVLfd36dKN337bwujRT1GuXDkCAwNZsOBTRo9+gdmz3+Wp\\npx7Fy6s8NWvWsjxnwIABJCcns3XrZgASEuJ5/vln+PnnNdxzz2CaNm1G/foNGDFiOGPGjODJJ0di\\nNufy1Vdf8NBDj9GtWw/Onj3DX38dvKrWkJDmPP30oyQlJVqWeXv70LJlax577EEWLPiUIUOGMmvW\\nO9cNc09PTxITExg+/EGeeeZJGjVqTPny///F6ebmxujRz/PCC6N56qlHSEpKpEKFgDzbrnfvvixe\\n/DVjxoygUaPGxMXF8dNP39OsWXMmThzHqVMnLTU3aNCQiIhzjBz5OOfPR9CuXQfefnsGjz76BN9/\\nv5KRIx8nMvL8VefDb7utJXXq1GHJkkX5fj+l5Dh6LoHZyw/g4GDimXtuLREhLiWXycjPseybcPDg\\nQd544w3Onz+Pk5MTQUFBvP3224wfP57MzEwqV67MjBkzcHZ2Zs2aNcybNw+TycQDDzzAHXfcccN1\\nF/RXjr1+ZV68GMnZs2do3botBw/uZ968j3n33Tls3Lie225rSfny3jz33Egefnj4DffKixP9Yi88\\nasvCU5za8tSFZN5etIfsHDOjBjTh1joV7F1SvhWndizpCrstb3RovciCvCiVlCBPSUnhlVdeIj09\\nDcOAZ599gQYNGrJ69Y8sXryQcuXcqFu3Ps8/P87mtd0s/UMvPGrLwlNc2jI8+hJvLtxNWmYOT93Z\\nmBYNAq0/qRgpLu1YGijIrSgpQV4aqS0Lj9qy8BSHtoyMS+WNr3eTnJbNo32Dad+kkl3ruRnFoR1L\\nC1sGuYZoFRH5l2IT03l70V6S07J5oFe9EhniUnIpyEVE/oWElEzeWrSHhJRM7u1ah27Nq1p/kkgh\\nUpCLiNyk5LQs3l60h5jEDO5oX5Ow1jXsXZKUQQpyEZGbkJaRzTuL9hIZl0avltW4s0Mt608SKQIK\\nchGRAsrIyuHdJfs4F32JLs0qM6hbXQ3sI3ajIBcRKYCs7FxmLd3PyfPJtGkUxAOh9RXiYlcKchGR\\nfMrJNfPhyoMcOZdI83oBPNo3GAeFuNiZglxEJB9yzWY++eEv9p+Mo3EtP564oxGODvoKFfvTp1BE\\nxAqzYfD5qiPsOhJNvWo+jLi7Cc5O+vqU4kGfRBGRGzAMg4U/H2PbwYvUquTF6HtuxdXZ0d5liVgo\\nyEVE8mAYBks3nWTD7vNUDfBgzMBmxX5OcSl7FOQiInn48bczrN5xjiA/d54fHIJnOWd7lyRyDQW5\\niMh1rNsZzootp6ng7cbYwc3w9nCxd0ki16UgFxH5H5v3nmfRL8fx8XThhcHN8CvvZu+SRPKkIBcR\\n+Yfthy7y3zVH8SznzAuDQwj0dbd3SSI3pCAXEfnb7mMxfPbjYdxcnXh+UDMqV/Cwd0kiVinIRUSA\\ng6fj+Oi7gzg7OTBmYFNqVPSyd0ki+aIgF5Ey71h4IrOXHcBkMvHMPbdSt4q3vUsSyTcFuYiUaacj\\nk3lvyT5yzQYj7mpMcA1fe5ckUiAKchG5ruS0LC7EpmIYhr1LKTLh0Zd4Z/FeMrNzeeKORtxap4K9\\nSxIpMA1RJCJXyc4xs27nOX787SyZ2blUC/SkU9PKtG0UhLtb6RkQ5WJ8GjMX7SE1I4dH+wbTokGg\\nvUsSuSkKchGx2H8yjm/WHyMqIR3Pcs40qO7DwdPxfP3zMb7deIIW9QPp3Kwyt1T1LtFzcMcmpvPW\\nN3tITsvmgV71aN+kkr1LErlpCnIRITohjUW/nGDviVhMJuh+W1X6d6yFh5szSZcy2XbwIr/uu8Dv\\nhy7y+6GLVPRzp1PTyrRrUpHy7iVrxLOElEzeXrSXhJRM7u1ah27Nq9q7JJF/RUEuUoZlZufy0+9n\\nWbPjHDm5ZupV8+H+nvWoFuhpeYy3pyt92tQgrHV1jpxLZMu+C+w6GsO3G0+wbPNJQuoF0LlpZYJr\\n+uJQzPfSk9OymLl4L9GJ6dzeriZhrWvYuySRf01BLlIGGYbBrqMxLN5wnPjkTHy9XBnYtS6tggPz\\nPGRuMpkIruFLcA1fhqRn8/vfe+m7jkSz60g0Fbzd6Ni0Mh2aVMLXy9XGr8i6tIxs3lm8lwuxqfRq\\nWY3+HWvZuySRQqEgFyljzsdcYuH64xw+m4CTo4m+bWvQt20N3Fzy/3XgWc6Zni2r0aNFVU5dSGbz\\nvgv8cTiKFb+eYuWWUzStU4FOTSvTpI4fjg727xyTkZXDe0v2cy7qEp2bVWZQt7ol+hy/yD8pyEXK\\niLSMHL7beppf/ozAbBjcWsef+7rfQpDfzY8lbjKZqFPFmzpVvLmv+y3s+CuKzfsusPdELHtPxOLj\\n6UKHWyvT6dZKVPApV4ivJv+yc3L5YNkBTpxPok2jIIb2qq8Ql1JFQS5SypkNg20HIlm26STJadkE\\n+pRjcI9baFa3cPtMl3N1oktIFbqEVOHsxRR+3X+B7Ycu8uNvZ/jptzM0rOlLp2ZVCLmlAk6OttlL\\nz8k1M2fFQQ6fTaB5vQAe7RuMg4NCXEoXBblIKXY6Mpmvfz7GqQvJuDg7cHen2oS2qoazk2ORbrdG\\nRS+GVqzPwK512XUkms37LnDoTAKHziTgWc6Z9k0q0qlpZSr5F92kJGazwSc//MX+k3E0ruXHE3c0\\nKhaH+UUKm4JcpBRKTsti+eY7RPqlAAAgAElEQVSTbNkXiQG0bBDIoG51bT6vtquzI+2bVKJ9k0pc\\niE3l130X+O3gRdb+Ec7aP8KpV9WbTs0q06J+IC7OhffjwmwYLFh9mF1HoqlX1ZsRdzfB2UkhLqWT\\nglykFMk1m9m05wIrfj1FWmYOVQI8GNKjXrEYP7xyBQ8Gd7+FAZ3rsOd4DJv3XuDw2QSORSSx8Ofj\\ntG1UkY5NK1E96N/NOmYYBt/8fJxtBy5Sq5IXo+9timsh/kgQKW4U5CKlxNFzCXz98zEiYlIp5+rE\\nfT1uoVvzKsXucLKzkwOtgoNoFRxEdGI6W/ZdYOuBSH7ZHcEvuyOoVcmLTk0r0yo4iHKuBfuKMgyD\\npZtP8svuCKoGeDBmYLMCr0OkpNEnXKSEi0/O4NuNJ/jjcDQAHW6txD2d61Deo/iPuBboU44BnevQ\\nv2Mt9p+IY/O+Cxw4FcfpyKMs+uUErRsG0qlpFWpV8srXleY//n6W1dvPEeTnzvODQ/AsV3rGhhfJ\\ni4JcpIT638lNalXy4v6e9alduby9SyswRwcHQuoFEFIvgPjkDLYeiGTLvkh+/fu/qgEelyduaVwR\\njzwmblm3M5wVv57Cv7wbYwc3w7sE/JARKQwmowTOURgTk1KgxwcEeBX4OXJ9asvC82/acv/JWL5Z\\nf5yohHS83J0Z0LkOHW6tVOyHSC0Is9ngrzPxl/ulH48l12zg5OhAiwaXh4StV83Hspe++2Q8s5fs\\nxdvThZfub06g7833jS/L9O+78BR2WwYE5H3tiPbIRUqQ6IQ0vll/nH0n43Awmejx9+QmpWl60Ssc\\nHEw0ru1P49r+JKdmse1gJL/uvcD2Q1FsPxRFkJ87nZpWopyLE1+uO4pnOWdeGByiEJcyR0EuUgJk\\nZuXy0/Yzf09uYtCgug9DetSj6j8mNynNynu4ENa6Br1bVedYeCKb911g15EYlmw8CYCHmxPPD2pG\\nlQpF1y9dpLhSkIsUY4ZhsPNINN9uPGGZ3GRQt7q0bJD35Calmclkon51X+pX9+X+npcnbjl4Op4H\\n+zbEz730HZUQyQ8FuUgxFRFziYU/H+PIuUTL5Cb92tbE1UV9ogE83Jzp0aIaPVpU07ldKdMU5CLF\\nTFpGNiu3nmbDn+cxGwZN6/gzuMctBOncr4hch4JcpJgwGwbb9keybPPfk5v4luO+7rfQtJAnNxGR\\n0kVBLlIMnI5M5qt1xzgdeXlykwGda9OrZXWNDy4iVinIRewoOS2LZZtOsnX/5clNWgUHMrCr7Sc3\\nEZGSS0EuYge5ZjPfbznJV6uPkP735Cb396hHg2IwuYmIlCw2DfLU1FTGjRtHUlIS2dnZjBgxgoCA\\nACZPngxA/fr1mTJlii1LErG5UxeS+Xz1YSJiUnF3dWJIj1voWgwnNxGRksGmQb5ixQpq1arF888/\\nT1RUFMOGDSMgIIAJEyZw66238vzzz7N582Y6d+5sy7JEbCIrO5eVW0+z9o9zGAb0bFWdvm2qU95d\\nY4KLyM2zaZD7+vpy9OhRAJKTk/Hx8eH8+fPceuutAHTt2pXff/9dQS6lzrHwRBasOkxUQjoBPm48\\nHBZMxxbV1fdZRP41mwZ53759Wb58OT179iQ5OZm5c+cydepUy/3+/v7ExMTYsiSRIpWRlcOyzafY\\n8GcEAL1aVuOujrU1qIuIFBqbBvl3331H5cqVmTdvHkeOHGHEiBF4ef3/jC75nYjN19cdJ6eCfRHe\\naOYYKRi1Zf7sOxbDrCV7iY5Po2qgJ6MHhdCgpt9Vj1FbFh61ZeFQOxYeW7WlTYN89+7ddOjQAYAG\\nDRqQmZlJTk6O5f6oqCgCAwOtrichIa1A29XwjYVHbWldWkYOSzadYPPeCziYLg+tekf7mjg7OV7V\\ndmrLwqO2LBxqx8Jjy2lMbXqZbI0aNdi3bx8A58+fx8PDgzp16rBr1y4A1q1bR8eOHW1Zkkih2n8y\\nlknzdrB57wWqBngycdhtDOhcB+cCHkESEckvm+6RDxo0iAkTJvDAAw+Qk5PD5MmTCQgI4OWXX8Zs\\nNtO0aVPatWtny5JECsWl9Gy+WX+c3w9dxNHBRP8OtejTtgZOjupSJiJFy6ZB7uHhwfvvv3/N8oUL\\nF9qyDJFC9efRaL5cd4zk1CxqVvTikT7BZWaecBGxP43sJnKTklOz+OrnY+w6Eo2TowP3dqlDr1bV\\nNLCLiNiUglykgAzDYMdfUSxcf5xL6dnUreLNw30aUMnfw96liUgZpCAXKYCElEy+XHuUvSdicXF2\\n4L4et9C9eVUcHEz2Lk1EyigFuUg+GIbB1v2RLNpwgvTMHBpU9+GhPsEE+pSzd2kiUsYpyEWsiE1K\\n54vVRzh0JgE3F0ceDK1Pp2aVcTBpL1xE7E9BLpIHs2Gwac95lmw6SWZWLo1r+zEstAH+3porXESK\\nDwW5yHVEJaTx+aojHA1PxN3ViUf7BtOucUVM2gsXkWJGQS7yD2azwfpd4Sz/9RRZOWZCbqnA0ND6\\n+Hi62rs0EZHrUpCL/O1CbCoLVh3m5IVkPMs580jfYFo2CNReuIgUawpyKfNycs2s/eMc3209TU6u\\nQavgQIb0rEd5dxd7lyYiYpWCXMq0c1EpLFh1hLNRKXh7uDA0tD7N6wXYuywRkXxTkEuZlJNr5sff\\nzvDT72fJNRu0b1KRwd1vwcPN2d6liYgUiIJcypzTkcnMX3WY8zGp+JV3ZVjvBjSp7W/vskREboqC\\nXMqMrOxcvtt6mjV/nMMwoEtIFe7tUodyrvpnICIll77BpEw4HpHI/FVHiIpPI8DHjYfCggmu4Wvv\\nskRE/jUFuZRqmVm5LNt8kl/+jACgZ4tq3N2pNq4ujnauTESkcCjIpdQ6fCaeBauPEJuUQUU/dx7p\\nE0zdqt72LktEpFApyKXUScvIYcmmE2zeewGTCfq0qcGdHWri7KS9cBEpfRTkUqqcvZjCrGX7SUjJ\\npGqABw/3CaZWpfL2LktEpMgoyKVUWbrpBAkpmdzRvib92tXEydHB3iWJiBQpBbmUGnFJGfx1JoG6\\nVb3p37G2vcsREbEJ7a5IqbHtYCQG0KFJJXuXIiJiMwpyKRXMhsHW/ZG4ODvQskGgvcsREbEZBbmU\\nCsfOJRKblEHL+oEaqU1EyhQFuZQKW/ZHAtDhVh1WF5GyRUEuJV56Zg5/Ho0m0Kcc9ar52LscERGb\\nUpBLiffH4Siycsy0v7USJpPJ3uWIiNiUglxKvK0HIjEB7RtXtHcpIiI2pyCXEu1CbConzyfTqJYf\\nfuXd7F2OiIjNKcilRNt2QBe5iUjZlq8gN5vNxMTEFHUtIgWSazbz28GLeLg5EXJLBXuXIyJiF1aD\\n/Pfff6dHjx4MHToUgOnTp7Nx48YiL0zEmgOn4klKzaJ1wyDNbCYiZZbVIH/33Xf59ttvCQgIAODJ\\nJ59k7ty5RV6YiDVb/+473vHWynauRETEfqwGubu7OxUq/P9hSz8/P5ydnYu0KBFrktOy2HcilqoB\\nnlQP8rR3OSIidmN1LEs3Nzf++OMPAJKSkvjpp59wdXUt8sJEbmT7wYvkmg06qu+4iJRxVvfIX3nl\\nFebNm8eBAwfo1asXW7ZsYdq0abaoTeS6DMNg64FIHB1MtGkUZO9yRETsyuoe+blz5/j444+vWrZ+\\n/XqqVKlSZEWJ3MiZiylExKRyW/0AvNxd7F2OiIhd5RnkERERhIeH88YbbzB+/HgMwwAgJyeH6dOn\\n06NHD5sVKfJPW6/0Hde84yIieQd5TEwMq1at4vz588yZM8ey3MHBgcGDB9ukOJH/lZ2Ty45DUXh7\\nutC4tp+9yxERsbs8gzwkJISQkBA6d+58zd737t27i7wwkevZfSyWtMwcwkKq4+iggQlFRKyeI2/T\\npg1ff/01CQkJAGRnZ7Ns2TK2bt1a5MWJ/K+t+y8AOqwuInKF1V2aZ599lqNHj7J8+XJSU1PZuHEj\\nkydPtkFpIleLS8rgrzMJ1K3iTSV/D3uXIyJSLFgN8szMTKZOnUqVKlUYN24c//3vf1m9erUtahO5\\nyraDkRhoghQRkX+yGuTZ2dmkpaVhNptJSEjAx8eH8PBwW9QmYmE2DLYdiMTF2YGWDQLtXY6ISLFh\\n9Rz5nXfeybfffsu9995Lnz598PPzo0aNGraoTcTi2LlEYhIzaN+4IuVcrX5sRUTKDKvfiIMHD7YM\\ngdm2bVvi4uIIDg4u8sJE/mmr5h0XEbkuq4fWH3zwQcvfQUFBNGzY8F+Nbf39999zxx13cPfdd7Np\\n0yYiIyMZOnQoQ4YMYfTo0WRlZd30uqV0Ss/MYdeRaAJ9ylGvmo+9yxERKVas7pEHBwfz/vvvExIS\\nctWsZ23bti3wxhISEpgzZw7Lli0jLS2NDz74gLVr1zJkyBDCwsJ45513WLp0KUOGDCnwuqX02nkk\\nmqwcM+2bVNQEKSIi/8NqkB8+fBiAXbt2WZaZTKabCvLff/+dtm3b4unpiaenJ9OmTaNbt25MmTIF\\ngK5duzJ//nwFuVxly/4LmID26jsuInINq0H+5ZdfFtrGIiIiyMjI4MknnyQ5OZlRo0aRnp6Oi8vl\\niS/8/f2JiYmxuh5fX3ecnBwLtO2AAK+bqlmuZcu2DI9K4eT5ZELqBVC/ToDNtmsr+lwWHrVl4VA7\\nFh5btaXNL/9NTExk9uzZXLhwgQcffNAyGQtw1d83kpCQVqBtBgR4EROTUqDnyPXZui1/2HwCgNbB\\ngaXuPdTnsvCoLQuH2rHwFHZb3uhHgU0Hq/b39yckJAQnJyeqV6+Oh4cHHh4eZGRkABAVFUVgoPoI\\ny2W5ZjO/HbyIu6sTIbdUsHc5IiLFUoGD3Gw23/TGOnTowPbt2y2Dy6SlpdGuXTvWrl0LwLp16+jY\\nseNNr19KlwOn4klKzaJNoyCcC3gqRUSkrLB6aH358uWkp6czaNAghg4dysWLFxk+fPhNXZAWFBRE\\naGgoAwcOBGDixIk0adKEcePGsXjxYipXrkz//v0L/iqkVNq2X33HRUSssRrkixcv5ssvv2T9+vXc\\ncsstfP311wwbNuymrywfPHjwNfOZL1iw4KbWJaVXcloWe0/EUjXAkxpBuvhGRCQvVg+tu7q64uLi\\nwubNmwkLC8NBc0CLDWw/FEWu2aDDrZXUd1xE5AbylcpTpkxh9+7dtGrVij179mj0NSlShmGwdf8F\\nHB1MtGkUZO9yRESKNatB/vbbb1OjRg3mzp2Lo6Mj58+ftwzgIlIUzkalEBGTSrO6FSjv7mLvckRE\\nirV8HVpv3749tWvXZsuWLZw9exZ/f39b1CZl1BZd5CYikm9Wg3zs2LFER0dz5swZXn/9dXx8fPjP\\nf/5ji9qkDMrOyWXHoSi8PV1oXNvP3uWIiBR7VoM8PT2d9u3bs2bNGh544AHuv/9+srOzbVGblEG7\\nj8WSlplDu8YVcdSFlSIiVuUryOPj41m7di1dunTBMAySkpJsUZuUQZZ5xzVBiohIvlgN8ttvv51e\\nvXrRpk0bKlWqxJw5c2jdurUtapMyJi4pg79Ox1O3ijeV/D3sXY6ISIlgdUCYYcOGMWzYMMvtBx98\\nkPLlyxdpUVI2/XYwEgNd5CYiUhBW98iPHDnC3XffTe/evYHL05ru27evyAuTssVsGGw9EImLswMt\\nG2jiHBGR/LIa5FOnTmX69OkEBFyeC7pPnz7MmDGjyAuTsuXYuURiEjNoUT+Qcq42n11XRKTEshrk\\nTk5ONGjQwHK7Vq1aODnpi1YK15WL3DrqsLqISIHkK8jDw8Mt411v3rwZwzCKvDApO9Izc9h1JJoA\\nHzfqVfOxdzkiIiWK1V3rcePG8fTTT3P69Gluu+02qlSpwhtvvGGL2qSM2HkkmqwcMx2aaIIUEZGC\\nshrk9evX57vvviMxMREXFxdcXV1xdna2RW1SRmzZfwET0F59x0VECszqofU1a9bw9NNP4+fnh6en\\nJ/fffz9r1qyxRW1SBkTGpXLyfDINa/nhV97N3uWIiJQ4VoP8888/56233rLcnj9/PgsWLCjSoqTs\\n2LpfI7mJiPwbVoPcMAy8vLwstz09PXUeUwpFrtnMbwcv4u7qRPN6FexdjohIiWT1HHnjxo159tln\\nadWqFYZhsGXLFho3bmyL2qSUO3AqnqTULLo2r4Kzk6O9yxERKZGsBvnEiRP5/vvv2b9/PyaTiTvu\\nuMMyypvIv7Ftv/qOi4j8W1aDPD09HWdnZyZNmgTAN998Q3p6Oh4emtRCbl5yWhZ7T8RSNcCDGkFe\\n1p8gIiLXZfUc+bhx44iNjbXczsjI4MUXXyzSoqT0234oilyzQYdbK+uaCxGRf8FqkCcmJvLggw9a\\nbj/88MMkJycXaVFSuhmGwdb9F3B0MNGmUZC9yxERKdGsBnl2djYnT5603D548CDZ2dlFWpSUbmej\\nUoiISaVZ3QqUd3exdzkiIiWa1XPkL730Ek8//TQpKSnk5ubi5+enIVrlX9ny90Vu7XWRm4jIv2Y1\\nyJs2bcratWtJSEjAZDLh46NJLeTmZefksuNQFN4eLjSp7WfvckRESjyrQT527NjrXoz05ptvFklB\\nUrrtPhZLWmYOYc2q4+hg9cyOiIhYYTXI27VrZ/k7OzubHTt2ULVq1SItSkqvK/OOd9BhdRGRQmE1\\nyO+6666rbg8cOJAnnniiyAqS0isuKYO/TsdTt4o3lfw1DoGISGGwGuRms/mq25GRkZw5c6ao6pFS\\n7LeDkRhob1xEpDBZDfKGDRtazpFfmUBl+PDhRV6YlC5mw2DrgUhcnB1o2SDQ3uWIiJQaVoP8yJEj\\ntqhDSrnj4YnEJGbQrnFFyrla/diJiEg+Wb1s+ODBg2zcuBGAd999l2HDhrFr164iL0xKly2aIEVE\\npEhYDfJXX32VWrVqsWvXLg4cOMCkSZOYNWuWLWqTUiI9M4ddR6MJ8HGjXjWNQyAiUpisBrmrqys1\\na9bkl19+YeDAgdStWxcH9f+VAth5JJqsbDMdmlTSBCkiIoXMaiKnp6ezevVq1q9fT4cOHUhMTNSk\\nKVIgW/dHYgLaN9FhdRGRwmY1yJ9//nl++OEHxowZg6enJ19++SUPPfSQDUqT0iAyLpUT55NoWMsP\\nv/Ju9i5HRKTUsXr5cOvWrWndurXl9qhRo4q0ICldLCO5aW9cRKRI6GS3FJlcs5nfDlzE3dWJ5vUq\\n2LscEZFSSUEuRebgqXiSUrNo3SgIZydHe5cjIlIqWQ3y33///Zpln332WZEUI6XLVvUdFxEpclaD\\nfObMmaxduxaAuLg4Hn30UQ4cOFDkhUnJlpyWxd4TsVQN8KBGkJe9yxERKbWsXuz2+eefM3r0aPbs\\n2cP69et54oknuPfee21Rm5Rg2w9FkWs26HBrZfUdFxEpQnnukZvNZsxmM+7u7nz44YfExcXRu3dv\\nBgwYcM2MaCL/ZBgGW/dfwNHBRJtGQfYuR0SkVMtzj/zKrGeGYVj+D5fPj5tMJg4fPmyzIqVkORuV\\nQkRMKrfVC6C8u4u9yxERKdXyDPKinPUsIyODfv368fTTT9O2bVtefPFFcnNzCQgI4K233sLFRV/+\\nJdmVi9za6yI3EZEiZ/Vit127djFu3DjL7YcffpidO3f+q43OnTsXb29vAGbNmsWQIUNYuHAhNWrU\\nYOnSpf9q3WJf2Tm5bD8UhbeHC01q+9m7HBGRUi9fV60//fTTltvTpk3jnXfeuekNnjx5khMnTtCl\\nSxcAduzYQffu3QHo2rXrdbu7Scmx53gsaZk5tGtcEUdNriMiUuSsXrVuGAY1atSw3K5ateq/mv3s\\njTfeYNKkSaxcuRK4PCnLlUPp/v7+xMTEWF2Hr687TgUcYCQgQF2gCsuN2nLH8stdE2/vXFdtng9q\\no8KjtiwcasfCY6u2tBrklStX5q233qJVq1YYhsGWLVuoWLHiTW1s5cqVNGvWjGrVql33/isX1FmT\\nkJBWoO0GBHgRE5NSoOfI9d2oLeOTM9h7LIY6Vcrj5oDa3Ap9LguP2rJwqB0LT2G35Y1+FFgN8hkz\\nZjBv3jy++eYbAJo3b87YsWNvqpBNmzYRHh7Opk2buHjxIi4uLri7u5ORkYGbmxtRUVEEBgbe1LrF\\n/rYdiMQAOt5a2d6liIiUGVaD3NXV9apz5HD58Pg/L4DLr/fee8/y9wcffECVKlXYs2cPa9eu5c47\\n72TdunV07NixwOsV+zMbBlsPROLi5EDLBvoxJiJiK1aDfOvWrbz77rskJiYCkJWVhY+Pz00F+fWM\\nGjWKcePGsXjxYipXrkz//v0LZb1iW8fDE4lJzKBd44qUc7X6sRIRkUJi9Rv3/fffZ9KkSUyfPp3X\\nXnuNVatW0aJFi3+94X/Oa75gwYJ/vT6xryt9xzXvuIiIbVm9/NzT05NmzZrh7OzMLbfcwujRoxW8\\ncpX0zBx2Ho0mwMeNetV97F2OiEiZYnWPPCcnh127dlG+fHlWrFhBnTp1iIiIsEVtUkLsPBJNVraZ\\n9k0q4aAJUkREbMpqkE+ZMoXY2FhefPFFpk2bRlxcHE8++aQtapMSYuv+SExA+8Y6rC4iYmtWg/zw\\n4cP07dsXgPnz5wNYuqKJRMalcuJ8Eo1q+uLv7WbvckREypw8g/yvv/7i0KFDzJ8/n/T0dMvynJwc\\n5syZw3333WeTAqV423rg74vc1HdcRMQu8gxyV1dX4uLiSElJ4c8//7QsN5lMvPjiizYpToq3XLOZ\\n3w5exN3Vieb1Kti7HBGRMinPIK9Tpw516tQBuOac+Pr164u2KikRDp6KJ+lSFl2bV8G5gGPfi4hI\\n4cgzyCMiIggPD2fNmjU0a9bMMg56Tk4O06dPp0ePHjYrUoony2F19R0XEbGbPIM8JiaGVatWcf78\\neebMmWNZ7uDgwODBg21SnBRfKWlZ7D0eS9UAD2pW1GxJIiL2kmeQh4SEEBISQufOna/Z+75w4UKR\\nFybF2/ZDUeSaDTo0qYRJfcdFROzGavezKyGemZnJ2rVrWbZsGSdPnmTr1q1FXpwUT4ZhsGV/JI4O\\nJto0vrkpbUVEpHBYDfK9e/eybNkyVq9ejdlsZurUqYSGhtqiNimmzkVdIiLmEs3rBVDe3cXe5YiI\\nlGl5jrX+6aef0qdPH8aMGYO/vz/Lli2jevXq9OvXD2dnZ1vWKMXMlv2XT610uFUXuYmI2Fuee+Tv\\nvfcedevW5eWXX6ZNmzYAOhcqZGXnsuOvKLw9XGhS28/e5YiIlHl5BvmmTZtYsWIFr7zyCmazmbvu\\nuovs7Gxb1ibF0I6DF0nNyCGsdXUcHaxOniciIkUsz2/igIAAHn/8cdauXcv06dM5d+4c58+f58kn\\nn2Tz5s22rFGKkZ//OAvosLqISHGRr12qli1b8vrrr7Nlyxa6dOlyVb9yKTvikzPYezyGOlXKU8nf\\nw97liIgI+QzyKzw9PRk8eDDffvttUdUjxdi2A5EYhkZyExEpTnSSU/Ltt4MXcXF2pFVwkL1LERGR\\nvynIJV/SMnKISkincR1/yrlaHX5ARERsREEu+RKTeHlO+so6Ny4iUqwoyCVfov8O8koVFOQiIsWJ\\nglzyJTohDYCKCnIRkWJFQS75Ep3w9x65Dq2LiBQrCnLJl+iEdExARX93e5ciIiL/oCCXfIlOTMev\\nvCvOTo72LkVERP5BQS5WZWXnkpCSSYBPOXuXIiIi/0NBLlbFJGUAEOirw+oiIsWNglysunLFeqCv\\n9shFRIobBblYFfP3FeuBOrQuIlLsKMjFqqi/B4PRHrmISPGjIBerruyR62I3EZHiR0EuVkUnpFPe\\n3VmTpYiIFEMKcrmhXLOZuOQMAnRYXUSkWFKQyw3FJWeSazYI9FHXMxGR4khBLjekrmciIsWbglxu\\nyNL1TEEuIlIsKcjlhqLUh1xEpFhTkMsNxagPuYhIsaYglxuKTkinnKsjnuWc7V2KiIhch4Jc8mQ2\\nDGIS0wn0ccdkMtm7HBERuQ4FueQp6VIWWTlm9SEXESnGFOSSpytdz4IU5CIixZaCXPIUrTHWRUSK\\nPQW55Ck6UV3PRESKO5vPgvHmm2/y559/kpOTwxNPPEGTJk148cUXyc3NJSAggLfeegsXFxdblyXX\\nEa3BYEREij2bBvn27ds5fvw4ixcvJiEhgbvuuou2bdsyZMgQwsLCeOedd1i6dClDhgyxZVmSh+jE\\ndJwcHfDxcrV3KSIikgebHlpv2bIl77//PgDly5cnPT2dHTt20L17dwC6du3K77//bsuSJA+GYRCd\\nkE6gbzkc1PVMRKTYsmmQOzo64u5+eRatpUuX0qlTJ9LT0y2H0v39/YmJibFlSZKH1Iwc0jNzdH5c\\nRKSYs/k5coD169ezdOlS5s+fT69evSzLDcPI1/N9fd1xcnIs0DYDArwK9PiyLv5sPAA1Kntf03Zq\\ny8Kjtiw8asvCoXYsPLZqS5sH+ZYtW/joo4/47LPP8PLywt3dnYyMDNzc3IiKiiIwMNDqOhL+7t+c\\nXwEBXsTEpNxsyWXSsdNxAHi6Ol7VdmrLwqO2LDxqy8Khdiw8hd2WN/pRYNND6ykpKbz55pt8/PHH\\n+Pj4ANCuXTvWrl0LwLp16+jYsaMtS5I8XOl6psFgRESKN5vuka9atYqEhASeffZZy7LXX3+diRMn\\nsnjxYipXrkz//v1tWZLkwTIYjIJcRKRYs2mQDxo0iEGDBl2zfMGCBbYsQ/IhOjEdB5MJ//Ju9i5F\\nRERuQCO7yXVFJ6Tj7+2Kk6M+IiIixZm+peUaGVk5JKdmEejrbu9SRETECgW5XMMyNKv6kIuIFHsK\\ncrlGTKJmPRMRKSkU5HKNK3vk6nomIlL8KcjlGlf6kKvrmYhI8acgl2tY+pDr0LqISLGnIJdrRCek\\n4+PpgqtzwcazFxER21OQy1Wyc8zEJ2eo65mISAmhIJerxCalY6CuZyIiJYWCXK5i6UOuC91EREoE\\nBblc5coV6wpyEZGSQUEuV4nRHrmISImiIJerWPbIdY5cRKREUJDLVaIT0vEs54y7m7O9SxERkXxQ\\nkIuF2WwQk5iugWBERNy0EG0AABEqSURBVEoQBblYxKdkkGs2NMa6iEgJoiAXCw3NKiJS8ijIxUJd\\nz0RESh4FuVhoMBgRkZJHQS4Wlj7kOrQuIlJiKMjFIiohHVdnR8p7uNi7FBERyScFuQBgGP/f9cxk\\nMtm7HBERyScFuQCQnJpFZnauup6JiJQwCnIBIDIuDYAABbmISImiIBcA9hyPBaBBdR87VyIiIgWh\\nIBfMhsGuo9F4uDnRsKafvcsREZECUJALJyKSSEjJJKReAE6O+kiIiJQk+tYWdh6OBqBVcKCdKxER\\nkYJSkJdxZvPlw+qe5ZwJruFr73JERKSAFORl3NHwRJJSs7itfgCODvo4iIiUNPrmLuN2Ho7i/9q7\\n06CornUNwG8zHUQcAGkUNSaXQlFwCCqJopYYC6LRKERTQHAIiYqIQ4BoCwo5IoLggBIrQRG1tKIY\\nMOh1Qiy1JIoS9eKAOdchqAgI3YQQWqaGXveHlb5yHI4MoWl4n1/0avbe3/5KfNlrb3oBgJMdp9WJ\\niHQRg7wDq1erceV/5ehqYogBb3FanYhIFzHIO7B/PfwDyioVhttJoafHj2UlItJFDPIOLJvT6kRE\\nOo9B3kHV1atx7Y4c3UyNYNuXn+ZGRKSrGOQd1O0HZXhaXYeRA6TQ42pnREQ6i0HeQWmeVh9opeVK\\niIioORjkHZCqTo1rdxUw7/oP/Ffvrtouh4iImoFB3gHl5v2Oqpo6jOC0OhGRzmOQd0DZ/+K0OhFR\\ne8Eg72BqVfX4n7sK9OhmjHd6ddF2OURE1EwM8g7m5m+/o6a2HiPtpJBwWp2ISOcxyDuYXzitTkTU\\nrjDIO5AaVT1y7ikgNeuEt6xMtV0OERG1AAZ5B3LjfilqVWpOqxMRtSMG2i7gL+vWrcP169chkUgQ\\nEhKCIUOGaLukdiebHwJDRNTutIkgz87OxsOHD5GcnIz79+8jJCQEycnJ2i6rXamurcON+6XoZWGC\\nPpadtV0OERG1kDYR5FlZWZg4cSIAwMbGBuXl5VAqlTA1/fvv4xaVPsV/X3yAunrxtx9Lm5SVtVDV\\ncVqdiKi9aRNBrlAoYG9vr3ltbm4OuVz+yiA3MzOBgYF+o45hafnyv5m+nV+OS7nFjdqXrjIy0MNH\\nY21gadm8X5Be1UtqPPay5bCXLYN9bDmt1cs2EeT/TojXXx2XlVU2an+Wll0gl1e89L1BfbshftlY\\n1LfzK3IA+IehPgwhXtmLN/G6XlLjsJcth71sGexjy2npXr7ul4I2EeRSqRQKhULzuqSkBJaWlq12\\n/M7Ghq12LCIiopbUJv78zNnZGenp6QCA3NxcSKXSVrk/TkREpOvaxBW5o6Mj7O3t4enpCYlEgvDw\\ncG2XREREpBPaRJADQHBwsLZLICIi0jltYmqdiIiImoZBTkREpMMY5ERERDqMQU5ERKTDGOREREQ6\\njEFORESkwxjkREREOoxBTkREpMMk4j+tUEJERERtFq/IiYiIdBiDnIiISIcxyImIiHQYg5yIiEiH\\nMciJiIh0GIOciIhIh7WZ9cj/LuvWrcP169chkUgQEhKCIUOGaLsknXLnzh34+/tj7ty58PHxQVFR\\nEZYvX476+npYWloiNjYWRkZG2i5TJ8TExODq1auoq6vDggULMHjwYPaykaqqqiCTyVBaWoqamhr4\\n+/vDzs6OfWyG6upqTJkyBf7+/hg1ahR72QSXL1/G0qVLYWtrCwDo378/vvzyy1brZbu+Is/OzsbD\\nhw+RnJyMyMhIREZGarsknVJZWYmIiAiMGjVKM7Z161Z4e3vjhx9+QL9+/ZCSkqLFCnXHpUuXcPfu\\nXSQnJyMxMRHr1q1jL5vg7NmzcHBwwL59+xAXF4fo6Gj2sZm+++47dOvWDQB/vpvDyckJe/fuxd69\\ne7F69epW7WW7DvKsrCxMnDgRAGBjY4Py8nIolUotV6U7jIyMsGPHDkilUs3Y5cuX8cEHHwAAXFxc\\nkJWVpa3ydMrIkSOxZcsWAEDXrl1RVVXFXjbB5MmTMW/ePABAUVERrKys2MdmuH//Pu7du4fx48cD\\n4M93S2rNXrbrIFcoFDAzM9O8Njc3h1wu12JFusXAwADGxsYNxqqqqjTTQxYWFuznG9LX14eJiQkA\\nICUlBePGjWMvm8HT0xPBwcEICQlhH5th/fr1kMlkmtfsZdPdu3cPfn5+8PLywoULF1q1l+3+Hvnz\\n+Gm0LYv9bLzTp08jJSUFSUlJcHV11Yyzl41z4MAB/Prrr/j6668b9I59fHNpaWkYNmwY+vbt+9L3\\n2cs39/bbbyMgIACTJk1Cfn4+Zs+ejfr6es37f3cv23WQS6VSKBQKzeuSkhJYWlpqsSLdZ2Jigurq\\nahgbG6O4uLjBtDu9XmZmJr7//nskJiaiS5cu7GUT3Lp1CxYWFujVqxcGDhyI+vp6dO7cmX1sgnPn\\nziE/Px/nzp3DkydPYGRkxH+TTWRlZYXJkycDAN566y306NEDN2/ebLVetuupdWdnZ6SnpwMAcnNz\\nIZVKYWpqquWqdNvo0aM1PT116hTGjh2r5Yp0Q0VFBWJiYpCQkIDu3bsDYC+b4sqVK0hKSgLw7NZZ\\nZWUl+9hEcXFxSE1NxcGDBzFz5kz4+/uzl0105MgR7Ny5EwAgl8tRWloKDw+PVutlu1/9bMOGDbhy\\n5QokEgnCw8NhZ2en7ZJ0xq1bt7B+/XoUFBTAwMAAVlZW2LBhA2QyGWpqamBtbY2oqCgYGhpqu9Q2\\nLzk5GfHx8XjnnXc0Y9HR0Vi1ahV72QjV1dUIDQ1FUVERqqurERAQAAcHB6xYsYJ9bIb4+Hj07t0b\\nY8aMYS+bQKlUIjg4GH/++SdUKhUCAgIwcODAVutluw9yIiKi9qxdT60TERG1dwxyIiIiHcYgJyIi\\n0mEMciIiIh3GICciItJhDHKiJiopKcGgQYOwffv2BuPXrl1Dfn4+gGcf25ibm9uk/Q8YMAB1dXXN\\nrvNlZDIZvLy8EBcXpxkrKyuDj48PamtrG7WvPXv2wM3NDWfPnm0w/tVXX6G4uLhF6m1JcrkcS5Ys\\n0XYZRC2GQU7URGlpabCxscGhQ4cajB86dEgT5BkZGbh9+7Y2ynulhw8fAgD279+PnJwcqFQqAEBs\\nbCyWLVvW6KUWz5w5g5CQELi4uDQY37x5M6ysrFqm6BZkaWmJrVu3arsMohbTrj+ilejvlJqaim++\\n+QYymQzXrl2Do6MjMjIycPLkSdy4cQOTJk3Cvn37YGpqCmNjYwwaNAjh4eHQ19eHUqnEsmXLMHbs\\nWFRXV2PlypUoKioCAAQGBsLJyUlzHKVSiTlz5iAwMBDOzs6acYVCgeXLl6Ourg5KpRKzZ8/G9OnT\\ncefOHYSFhcHQ0BDV1dVYtGiRZnUrAPj99981AWthYYHy8nLk5eVBT08PI0aMeOX5pqSk4MCBA+jU\\nqRMsLCywdu1apKWlITc3Fxs3bkRdXZ1mtScAmDBhAnbt2oWrV68iMzMTQgjcvn0bH3/8MVQqFS5f\\nvgwhBHbt2gUTExNs2bJFs0JUz549ERsbC0NDQ6SkpGDPnj0wNzfHiBEjcPHiRezfvx+FhYX45z//\\niaqqKlRWViIwMBCjR49uUPPx48exc+dOmJiYQAiBqKgoSCQSeHt74/z58wgICEB5eTkA4O7du/D1\\n9cX8+fNx/Phx7Nu3D0IImJubY+3atQ0WYCJqUwQRNVp2draYMGGCUKvVYtOmTSI0NFTzno+Pj7hw\\n4YIQQogVK1aIgwcPCiGEuHTpksjOzhZCCHHt2jXh7u4uhBDi22+/FdHR0UIIIfLy8kRwcLAQQoj+\\n/fuLqqoq4evrK44dO/ZCDbm5ueL06dNCCCGKi4uFk5OTEEKIiIgIkZCQIIQQQqFQiJ9++qnBdk+e\\nPBFLliwRarVa+Pj4iOrqavHZZ5+JBw8eiFWrVgmZTCYKCgoabFNQUCDGjRsnKioqhBBCREdHi/j4\\n+BfO93kuLi7iwYMHIjU1VUycOFHU1NSI/Px8YWdnJy5duqTZNiMjQ6hUKpGQkCDq6+uFEEL4+vqK\\nM2fOiIqKCuHk5CTkcrkQQojAwEDh6ekphBBi3rx5IisrSwghRElJiXBxcREqlapBDVOnThU5OTlC\\nCCFycnLEL7/8IvLz88XYsWMbfN/NmzfFtGnTREVFhSgsLBRTp04VNTU1Qgghdu/eLaKiol44P6K2\\nglfkRE2QkpICd3d3SCQSeHh4wMPDA6GhoejUqdMrt7G0tERMTAw2b94MlUqFP/74AwBw48YNeHl5\\nAXi2ilJsbKxmm1WrVsHGxkazIMPzpFIpEhMTkZiYCH19fc3+3NzcIJPJUFhYCBcXF0ybNq3BdlZW\\nVrC1tcWsWbPg7u6OpKQkzJgxA+np6XBzc0OvXr2QmJiIsLAwzTa3b9+Gvb29Zq0CJycnHDhw4I37\\n5eDgACMjI/Ts2RNqtRrDhw/X1FJRUQEDAwPo6enB29sbBgYG+O2331BWVoa8vDxYW1ujR48eAABX\\nV1fs3r0bwLP1np8+fYpt27YBeLbsbmlpaYPpfA8PD8hkMri6usLV1RVDhw7F48ePG9RWVlaGlStX\\nIi4uDqampjh//jzkcjm++OILAEBtbS369OnzxudK1NoY5ESNpFQqcerUKfTq1QsZGRkAALVajfT0\\ndEyfPv2V20VEROCjjz7CjBkzcOfOHfj5+QEAJBIJ1Gr1S7eRSqU4efIk5s2b98LKfXFxcejXrx82\\nbdqEp0+fwtHREQAwcuRIHD16FFlZWTh06BCOHDmCjRs3Ntg2ICAAAQEBePToEdauXYuFCxciLCwM\\nbm5usLa2xqNHj17bAyEEJBLJ6xv1HH19/QavDQz+/78eIQSuXr2K1NRUpKamwsTERPMw2r8f5/n9\\nGBkZIT4+Hubm5q887ty5czFlyhRkZmYiLCwMM2fOxJgxYzTvq9VqBAcHY9GiRbCxsdHsd8iQIUhI\\nSHjj8yPSJj7sRtRIR48exciRI3H8+HEcPnwYhw8fxpo1azQPvUkkEs0DZM9/rVAoYGtrC+DZvdu/\\nng5/9913kZmZCQB4/Pgx5syZozlWYGAg/Pz8sGLFihfWNH5+f0ePHoWenh5qa2uxd+9ePHnyBBMm\\nTEBkZCSuX7/+ynOJiorCypUrAQBmZmYoKipCUVGR5gr4Lw4ODsjNzYVSqQQAXLx4EUOHDm1C916u\\ntLQUvXv3homJCQoKCpCTk4Pa2lr07dsX+fn5mvvYf/3iBADDhw/HiRMnADy77x8ZGdlgn/X19diw\\nYQO6dOkCd3d3LF68+IVexMXFYcCAAfjwww81Y4MHD8aNGzcgl8sBACdOnMDp06db7FyJWhqvyIka\\nKSUlBYsWLWow5ubmhujoaDx+/BjOzs4IDw9HSEgI3n//fcTExEAIAV9fXyxfvhx9+vTB3LlzkZGR\\ngejoaCxZsgSrV6+Gt7c31Go1li1b1mDfn376KX7++Wfs2LED8+fP14z7+PggIiICP/74Iz755BOM\\nGjUKQUFB8PT0RFBQEDp37gy1Wo2goKCXnsexY8dgb2+vWZFtxowZCA4OhlqtRnh4eIPv7dmzJ5Yu\\nXYrPP/9cM0UeGBjYEu0E8GzJ4aSkJHh5ecHW1haLFy/Gtm3b8N5778HPzw9eXl6wtraGvb09CgsL\\nAQChoaEICwvDsWPHUFtbi4ULFzbYp76+PszMzODp6YmuXbsCeHar4i/FxcXYvn07HB0dMWvWLADA\\nsGHDEBQUhNDQUCxYsACdOnWCsbEx1q9f32LnStTSuPoZEbVpaWlpGD9+PLp3745du3YhLy8Pa9as\\n0XZZRG0Gr8iJqE2rrKzEnDlz0KVLFxgYGCAqKkrbJRG1KbwiJyIi0mF82I2IiEiHMciJiIh0GIOc\\niIhIhzHIiYiIdBiDnIiISIcxyImIiHTY/wFkC6hFm/HfEAAAAABJRU5ErkJggg==\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7f3c6464fcd0>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"fqxh12d4yeK7\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## Whitebox Ensemble Attack\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"9JRiHUrDypcn\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 374\n        },\n        \"outputId\": \"42d0e9af-4e7c-4f00-ca6f-8b15a1065923\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517433869970,\n          \"user_tz\": 480,\n          \"elapsed\": 3784518,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"# Cross Model Attack\\n\",\n        \"STEPS = 1000\\n\",\n        \"\\n\",\n        \"start = time.time()\\n\",\n        \"MM.reset_patch()\\n\",\n        \"\\n\",\n        \"for i in range(STEPS):\\n\",\n        \"  loss = MM.train_step()\\n\",\n        \"  if i % int(STEPS/20) == 0:\\n\",\n        \"    print(\\\"[%s] loss: %s\\\" % (i, loss))\\n\",\n        \"  \\n\",\n        \"cross_model_patch = MM.patch()\\n\",\n        \"\\n\",\n        \"end = time.time()\\n\",\n        \"mins = (end - start) / 60.0\\n\",\n        \"\\n\",\n        \"print('Finished in {:.0f}m'.format(mins))\\n\",\n        \"save_obj(cross_model_patch, \\\"cross_model_patch\\\")\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"[0] loss: None\\n\",\n            \"[50] loss: None\\n\",\n            \"[100] loss: None\\n\",\n            \"[150] loss: None\\n\",\n            \"[200] loss: None\\n\",\n            \"[250] loss: None\\n\",\n            \"[300] loss: None\\n\",\n            \"[350] loss: None\\n\",\n            \"[400] loss: None\\n\",\n            \"[450] loss: None\\n\",\n            \"[500] loss: None\\n\",\n            \"[550] loss: None\\n\",\n            \"[600] loss: None\\n\",\n            \"[650] loss: None\\n\",\n            \"[700] loss: None\\n\",\n            \"[750] loss: None\\n\",\n            \"[800] loss: None\\n\",\n            \"[850] loss: None\\n\",\n            \"[900] loss: None\\n\",\n            \"[950] loss: None\\n\",\n            \"Finished in 63m\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"BmXd9EQ8zLEN\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 351\n        },\n        \"outputId\": \"c47ac528-705b-453d-ea2d-c074702ced19\",\n        \"executionInfo\": {\n          \"status\": \"error\",\n          \"timestamp\": 1517537661444,\n          \"user_tz\": 480,\n          \"elapsed\": 510,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cross_model_patch = load_obj(\\\"cross_model_patch\\\")\\n\",\n        \"\\n\",\n        \"m = MM.nc['inceptionv3']\\n\",\n        \"m.patch(cross_model_patch)\\n\",\n        \"\\n\",\n        \"report(m, n=16, show_images=3, scale=0.3)\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"error\",\n          \"ename\": \"IOError\",\n          \"evalue\": \"ignored\",\n          \"traceback\": [\n            \"\\u001b[0;31m\\u001b[0m\",\n            \"\\u001b[0;31mIOError\\u001b[0mTraceback (most recent call last)\",\n            \"\\u001b[0;32m<ipython-input-31-2deb2af350d0>\\u001b[0m in \\u001b[0;36m<module>\\u001b[0;34m()\\u001b[0m\\n\\u001b[0;32m----> 1\\u001b[0;31m \\u001b[0mcross_model_patch\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mload_obj\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m\\\"cross_model_patch\\\"\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m      2\\u001b[0m \\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m      3\\u001b[0m \\u001b[0mm\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mMM\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mnc\\u001b[0m\\u001b[0;34m[\\u001b[0m\\u001b[0;34m'inceptionv3'\\u001b[0m\\u001b[0;34m]\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m      4\\u001b[0m \\u001b[0mm\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mpatch\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mcross_model_patch\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m      5\\u001b[0m \\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n            \"\\u001b[0;32m<ipython-input-10-88c29100ec8d>\\u001b[0m in \\u001b[0;36mload_obj\\u001b[0;34m(file_name)\\u001b[0m\\n\\u001b[1;32m     12\\u001b[0m \\u001b[0;32mdef\\u001b[0m \\u001b[0mload_obj\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mfile_name\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m     13\\u001b[0m   \\u001b[0mdest_file\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mosp\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mjoin\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mDATA_DIR\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mfile_name\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m---> 14\\u001b[0;31m   \\u001b[0;32mwith\\u001b[0m \\u001b[0mopen\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mdest_file\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0;34m'r'\\u001b[0m\\u001b[0;34m)\\u001b[0m \\u001b[0;32mas\\u001b[0m \\u001b[0mf\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m     15\\u001b[0m     \\u001b[0mpkl\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mf\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mread\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m     16\\u001b[0m   \\u001b[0;32mreturn\\u001b[0m \\u001b[0mpickle\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mloads\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mpkl\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n            \"\\u001b[0;31mIOError\\u001b[0m: [Errno 2] No such file or directory: '/content/adversarial_patch/cross_model_patch'\"\n          ]\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"v6KF8wyPzRxb\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 119\n        },\n        \"outputId\": \"d413023d-425b-4d36-b687-14f1976988d8\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517434432186,\n          \"user_tz\": 480,\n          \"elapsed\": 559174,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cross_model_patch = load_obj(\\\"cross_model_patch\\\")\\n\",\n        \"\\n\",\n        \"models = []\\n\",\n        \"for m in MODEL_NAMES:\\n\",\n        \"  M = MM.nc[m]\\n\",\n        \"  M.patch(cross_model_patch)\\n\",\n        \"  models.append(M)\\n\",\n        \"  \\n\",\n        \"cross_model_win_rates = calculate_win_rates(models)\\n\",\n        \"\\n\",\n        \"save_obj(cross_model_win_rates, \\\"cross_model_win_rates\\\")\\n\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Evaluating resnet50\\n\",\n            \"Evaluating xception\\n\",\n            \"Evaluating inceptionv3\\n\",\n            \"Evaluating vgg16\\n\",\n            \"Evaluating vgg19\\n\",\n            \"Calculated wins in 559s\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"cyizEs0rzTo4\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 376\n        },\n        \"outputId\": \"9b776dd8-fec4-4a58-d572-5d3a52509af5\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517434432827,\n          \"user_tz\": 480,\n          \"elapsed\": 624,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cross_model_win_rates = load_obj(\\\"cross_model_win_rates\\\")\\n\",\n        \"plot_win_rates(cross_model_win_rates, MODEL_NAMES, \\\"Cross-model attack success rates\\\")\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7f414865ccd0>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"Q62RjnzozZoy\",\n        \"colab_type\": \"text\"\n      },\n      \"cell_type\": \"markdown\",\n      \"source\": [\n        \"## True Toaster\"\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"jyz1ibVVzbsA\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 1424\n        },\n        \"outputId\": \"9c0b9b06-fedd-4e21-b4bd-84f622e36623\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517598053101,\n          \"user_tz\": 480,\n          \"elapsed\": 3564,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"toaster = load_image('/content/adversarial_patch/toaster.png')\\n\",\n        \"\\n\",\n        \"models = []\\n\",\n        \"for m in MODEL_NAMES:\\n\",\n        \"  M = MM.nc[m]\\n\",\n        \"  M.patch(toaster)\\n\",\n        \"  models.append(M)\\n\",\n        \"  \\n\",\n        \"m = MM.nc['inceptionv3']\\n\",\n        \"report(m, n=16, show_images=3, scale=0.5)\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"LogLoss: 1.8 \\tWin Rate: 6%\\t Top5: 37%\\tn: 16\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\nBP4HELuQrosRCRcAAAAASUVORK5CYII=\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7fd17290d990>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"unicycle, monocycle            0.94\\n\",\n            \"mountain bike, all-terrain ... 0.00\\n\",\n            \"groenendael                    0.00\\n\",\n            \"crash helmet                   0.00\\n\",\n            \"knee pad                       0.00\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\njsdms+Kmd40owXQ6JkszDMPg0ZMHeJ6H6ziEcUgqChiWhajcDjD43m27Yhj6nJ69Y+Wuubo+56J3\\nQbFcYrKaYdaLPPvpZ9x9/ADf8/nl3/0dN5MJU2dFc3cLs6BRKZewyhaVVpNQkSjWqwiqyOPHjxAR\\nMHWDKPDp92/HUl98/Y+8Pz9jNLlB0mRanSaD4TUvX33D9bDPxtvw93//Ky5PLknjmHLZotEscnjQ\\nRVVVvvrHb1jMHV5/e8xyuebtu1P8LKQ37qEXdTZ+QIpGKojU6i36/T5JGiFIApPpnPlyxfX1FYZh\\n0hv0uBmOMfQCne4WrU7zdn3h8Qn1aoPHj5/S3uri+T4Xl9eYloWqqhzdu0eaZdyMR6zXa+xykWLZ\\nJk5j1us1z59/irf2GQ1G1BttslTmqz++otvaQUFhs9qw1d7m/r0n7O4eMLwZoik6vhsioDIcLvG9\\nEElSePbxM7b2GgxnZ7x48QfWawfHjfDTlP5swu9fvMD1PYbDK7rbFRxvTYbMdDai37umd9Pj+P0J\\npmVQLJcJ44QgCCgWbZaLGWKWMZlMaLc6vH75LaPBDVkYI6YJ09GEgm4QeCHu2uPs9IzQ92h3mty9\\nu89N7xrTMLi+7rG3d0Cj0WJ4M+Tq+pLlfIVhGEiywNpxqFSrgIip3+4C8H2f6+s+08WCMIjxwxBR\\nkjh+95bxaEypVELVVHRdR5Il7O+eLyZxxny+5Ks/fM31VZ9Go/Vnc0zIsuzPT9fncrlc7k/6Xr9E\\nc7lc7v93eYjmcrncB8hDNJfL5T5AHqK5XC73AfIQzeVyuQ+Qh2gul8t9gDxEc7lc7gPkIZrL5XIf\\nIA/RXC6X+wB5iOZyudwHyEM0l8vlPkAeorlcLvcB8hDN5XK5D5CHaC6Xy32APERzuVzuA+Qhmsvl\\nch8gD9FcLpf7AHmI5nK53AfIQzSXy+U+QB6iuVwu9wHyEM3lcrkPkIdoLpfLfYA8RHO5XO4D/D9c\\nxqy3qUfHIAAAAABJRU5ErkJggg==\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7fd14ddf4290>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"gazelle                        0.92\\n\",\n            \"\\u001b[1mtoaster                        0.06\\u001b[0m\\n\",\n            \"hare                           0.00\\n\",\n            \"car mirror                     0.00\\n\",\n            \"crash helmet                   0.00\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAVEAAAFNCAYAAAC5YlyiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvXmUZkd1J/i7Ee/LtbJKtaqkEiqp\\ntC8gISQkCxAGBIKDARubBm+0D9h4vLTtxm2D3W33uMc23tvjpd0eu912e9zgre2hAUMjG7EbkAQS\\nSGhXSdSiUu1VuX7fe3Hnj4gbcSNefFnycM6kfE7GOXky8/vei+XGjbvfG8TMjPW23tbbeltv/5+a\\nWesJrLf1tt7W2z/ntk5E19t6W2/r7eto60R0va239bbevo62TkTX23pbb+vt62jrRHS9rbf1tt6+\\njrZORNfbeltv6+3raOtEdL2tt/W23r6Otk5E19t6W2/r7eto60R0va239bbevo7WrOXgL3zX3bBE\\nICL/gWMwMxj+f0eAJFQRAUQEZgZJkhUTyoQrZo4/sV8AzrnQD6XnTHoHIPSbCe+2sNbGPpgZxhhY\\n5/t18HNgY0FEcM5l4xsG2Ej//jumNDYFGBDr9VIch5lVn1atoQMzw1qLzsm8GjjnYBR7ZHS+T05r\\nYmZQeBZwGVxI/a/h4Ndi4hw7AgzC/lGCjbQM/qzgLmssxmFmsCPAUFy/H53yfQufM6U9zeY7Jgkv\\n9hH6MZTvuf88jWOMARyHuVCAq0FDBs45dOji2HpeAGCJ0HUdrLUgSp9r3HQw2fsaRym8r9dGxXyd\\n0/AzGe7U1q7Hcc5hYEPfYU9dOGMm4KEN6wTg8ZACvhP8ulqXzQUm4abrAvzIr9UEhGy5jeu3sHEN\\ngufynQHFv/Xneg1N08RzYYwBDGUw0H1p+AP+THaBAJRjZ3AN5/bu37q6j1ChrSkRLQ+QRn6/GI1E\\nafNtAHrXpYMbCVEF4UqCKt8zEsHVfRhjQGTRtm1vrgJk5xwM+Y0jRkRA9g+BkDaHgPiM9EEAHPJ5\\nsV9mNm9B4vgeMfwrJoLLE3GCJnblmmXMOrNA8ZwmSrmy4tivT2DmyCNkNnE1B9Vzj+HJwUpE1QK2\\nPx/ffYU4j9ljTXDL5jgnaNl8wyyyPgggGAB1HMrmX3zvCSjBOQYRB7yiKkOvvW8UJxxHGMOTvWfK\\n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\\nAABJRU5ErkJggg==\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7fd14dcb0c50>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        },\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"\\u001b[1mtoaster                        1.00\\u001b[0m\\n\",\n            \"crash helmet                   0.00\\n\",\n            \"flagpole, flagstaff            0.00\\n\",\n            \"soap dispenser                 0.00\\n\",\n            \"car mirror                     0.00\\n\",\n            \"\\n\"\n          ],\n          \"name\": \"stdout\"\n        },\n        {\n          \"output_type\": \"execute_result\",\n          \"data\": {\n            \"text/plain\": [\n              \"{'logloss': 1.7816668368635848,\\n\",\n              \" 'loss': 5.939748764038086,\\n\",\n              \" 'time': 2.4360480308532715,\\n\",\n              \" 'top5': 37,\\n\",\n              \" 'win': 6}\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          },\n          \"execution_count\": 13\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"G9wNyg27zg05\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 119\n        },\n        \"outputId\": \"e526f99b-18d1-4e89-f326-b9ecc22f0a17\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517598213789,\n          \"user_tz\": 480,\n          \"elapsed\": 160581,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"toaster_win_rates = calculate_win_rates(models)\\n\",\n        \"save_obj(toaster_win_rates, \\\"toaster_win_rates\\\")\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"stream\",\n          \"text\": [\n            \"Evaluating resnet50\\n\",\n            \"Evaluating xception\\n\",\n            \"Evaluating inceptionv3\\n\",\n            \"Evaluating vgg16\\n\",\n            \"Evaluating vgg19\\n\",\n            \"Calculated wins in 160s\\n\"\n          ],\n          \"name\": \"stdout\"\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"YWPlQzpFPLqe\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          },\n          \"base_uri\": \"https://localhost:8080/\",\n          \"height\": 376\n        },\n        \"outputId\": \"71db796d-8070-4732-8996-38081108d2a3\",\n        \"executionInfo\": {\n          \"status\": \"ok\",\n          \"timestamp\": 1517598214344,\n          \"user_tz\": 480,\n          \"elapsed\": 513,\n          \"user\": {\n            \"displayName\": \"Tom Brown\",\n            \"photoUrl\": \"//lh5.googleusercontent.com/-Y4gez5cVqdg/AAAAAAAAAAI/AAAAAAAAACU/bkVejmhnr1w/s50-c-k-no/photo.jpg\",\n            \"userId\": \"100174716380421537647\"\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"cross_model_win_rates = load_obj(\\\"toaster_win_rates\\\")\\n\",\n        \"plot_win_rates(toaster_win_rates, MODEL_NAMES, \\\"Real toaster success rate\\\")\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": [\n        {\n          \"output_type\": \"display_data\",\n          \"data\": {\n            \"image/png\": \"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\\nTkSuQmCC\\n\",\n            \"text/plain\": [\n              \"<matplotlib.figure.Figure at 0x7fd17290dc50>\"\n            ]\n          },\n          \"metadata\": {\n            \"tags\": []\n          }\n        }\n      ]\n    },\n    {\n      \"metadata\": {\n        \"id\": \"qZzMx_n5PNYL\",\n        \"colab_type\": \"code\",\n        \"colab\": {\n          \"autoexec\": {\n            \"startup\": false,\n            \"wait_interval\": 0\n          }\n        }\n      },\n      \"cell_type\": \"code\",\n      \"source\": [\n        \"\"\n      ],\n      \"execution_count\": 0,\n      \"outputs\": []\n    }\n  ]\n}"
  },
  {
    "path": "cleverhans_v3.1.0/examples/adversarial_patch/README.md",
    "content": "# Adversarial Patch\n\nCode from [Adversarial Patch (Tom B. Brown, Dandelion Mané, Aurko Roy, Martín Abadi, Justin Gilmer)](https://arxiv.org/abs/1712.09665)\n\n> We present a method to create universal, robust, targeted adversarial image patches in the real world. The patches are universal because they can be used to attack any scene, robust because they work under a wide variety of transformations, and targeted because they can cause a classifier to output any target class. These adversarial patches can be printed, added to any scene, photographed, and presented to image classifiers; even when the patches are small, they cause the classifiers to ignore the other items in the scene and report a chosen target class.\n\nWe recommend using Colab to host this notebook. You can run it at the following URL:\n\nhttps://colab.research.google.com/drive/1hSq_D5s9FWs2MH6BNyf6cTRBXEGcYO_D"
  },
  {
    "path": "cleverhans_v3.1.0/examples/facenet_adversarial_faces/README.md",
    "content": "# FGSM against Facenet\r\nThis directory contains an implementation of the FGSM attack against one of the face recognition CNNs of the Facenet library. You can find a detailed article [here](https://brunolopezgarcia.github.io/2018/05/09/Crafting-adversarial-faces.html).\r\n\r\n## How to run\r\n\r\nIn order to run this example you need to do the following:\r\n\r\n1. Install the Facenet library, download and align the LFW faces and download a pretrained Facenet model. You can do that following the next Facenet tutorial: https://github.com/davidsandberg/facenet/wiki/Validate-on-LFW\r\n(Running the validate_on_lfw script is not necessary). The datasets and the models folders must be in the folder of this example.\r\n\r\n2. Install Pillow: https://pillow.readthedocs.io/en/stable/\r\n\r\n3. Change the following line in the facenet_fgsm.py script with the name of the .pb file of the model you downloaded:\r\n    ```\r\n    model_path = \"models/facenet/20180402-114759/20180402-114759.pb\"\r\n    ```\r\n\r\n4. Run the script:\r\n    ```\r\n    python facenet_fgsm.py\r\n    ```\r\n\t\r\n5. The Facenet models dimensions are sometimes changed by its developer, so if the script gives you an error regarding the dimensions of the input shapes, you must change this line to use the proper number:\r\n    ```\r\n\tself.victim_embedding_input = tf.placeholder(\r\n        tf.float32,\r\n        shape=(None, 512))\r\n\t```"
  },
  {
    "path": "cleverhans_v3.1.0/examples/facenet_adversarial_faces/facenet_fgsm.py",
    "content": "import facenet\r\n\r\nimport tensorflow as tf\r\nimport numpy as np\r\nfrom cleverhans.model import Model\r\nfrom cleverhans.attacks import FastGradientMethod\r\n\r\nimport set_loader\r\n\r\n\r\nclass InceptionResnetV1Model(Model):\r\n    model_path = \"models/facenet/20180402-114759/20180402-114759.pb\"\r\n\r\n    def __init__(self):\r\n        super(InceptionResnetV1Model, self).__init__(scope=\"model\")\r\n\r\n        # Load Facenet CNN\r\n        facenet.load_model(self.model_path)\r\n        # Save input and output tensors references\r\n        graph = tf.get_default_graph()\r\n        self.face_input = graph.get_tensor_by_name(\"input:0\")\r\n        self.embedding_output = graph.get_tensor_by_name(\"embeddings:0\")\r\n\r\n    def convert_to_classifier(self):\r\n        # Create victim_embedding placeholder\r\n        self.victim_embedding_input = tf.placeholder(tf.float32, shape=(None, 512))\r\n\r\n        # Squared Euclidean Distance between embeddings\r\n        distance = tf.reduce_sum(\r\n            tf.square(self.embedding_output - self.victim_embedding_input), axis=1\r\n        )\r\n\r\n        # Convert distance to a softmax vector\r\n        # 0.99 out of 4 is the distance threshold for the Facenet CNN\r\n        threshold = 0.99\r\n        score = tf.where(\r\n            distance > threshold,\r\n            0.5 + ((distance - threshold) * 0.5) / (4.0 - threshold),\r\n            0.5 * distance / threshold,\r\n        )\r\n        reverse_score = 1.0 - score\r\n        self.softmax_output = tf.transpose(tf.stack([reverse_score, score]))\r\n\r\n        # Save softmax layer\r\n        self.layer_names = []\r\n        self.layers = []\r\n        self.layers.append(self.softmax_output)\r\n        self.layer_names.append(\"logits\")\r\n\r\n    def fprop(self, x, set_ref=False):\r\n        return dict(zip(self.layer_names, self.layers))\r\n\r\n\r\nwith tf.Graph().as_default():\r\n    with tf.Session() as sess:\r\n        # Load model\r\n        model = InceptionResnetV1Model()\r\n        # Convert to classifier\r\n        model.convert_to_classifier()\r\n\r\n        # Load pairs of faces and their labels in one-hot encoding\r\n        size = 100\r\n        faces1, faces2, labels = set_loader.load_testset(size)\r\n\r\n        # Create victims' embeddings using Facenet itself\r\n        graph = tf.get_default_graph()\r\n        phase_train_placeholder = graph.get_tensor_by_name(\"phase_train:0\")\r\n        feed_dict = {model.face_input: faces2, phase_train_placeholder: False}\r\n        victims_embeddings = sess.run(model.embedding_output, feed_dict=feed_dict)\r\n\r\n        # Define FGSM for the model\r\n        steps = 1\r\n        eps = 0.01\r\n        alpha = eps / steps\r\n        fgsm = FastGradientMethod(model)\r\n        fgsm_params = {\"eps\": alpha, \"clip_min\": 0.0, \"clip_max\": 1.0}\r\n        adv_x = fgsm.generate(model.face_input, **fgsm_params)\r\n\r\n        # Run FGSM\r\n        adv = faces1\r\n        for i in range(steps):\r\n            print(\"FGSM step \" + str(i + 1))\r\n            feed_dict = {\r\n                model.face_input: adv,\r\n                model.victim_embedding_input: victims_embeddings,\r\n                phase_train_placeholder: False,\r\n            }\r\n            adv = sess.run(adv_x, feed_dict=feed_dict)\r\n\r\n        # Test accuracy of the model\r\n        batch_size = graph.get_tensor_by_name(\"batch_size:0\")\r\n\r\n        feed_dict = {\r\n            model.face_input: faces1,\r\n            model.victim_embedding_input: victims_embeddings,\r\n            phase_train_placeholder: False,\r\n            batch_size: 64,\r\n        }\r\n        real_labels = sess.run(model.softmax_output, feed_dict=feed_dict)\r\n\r\n        accuracy = np.mean(\r\n            (np.argmax(labels, axis=-1)) == (np.argmax(real_labels, axis=-1))\r\n        )\r\n        print(\"Accuracy: \" + str(accuracy * 100) + \"%\")\r\n\r\n        # Test accuracy against adversarial examples\r\n        feed_dict = {\r\n            model.face_input: adv,\r\n            model.victim_embedding_input: victims_embeddings,\r\n            phase_train_placeholder: False,\r\n            batch_size: 64,\r\n        }\r\n        adversarial_labels = sess.run(model.softmax_output, feed_dict=feed_dict)\r\n\r\n        same_faces_index = np.where((np.argmax(labels, axis=-1) == 0))\r\n        different_faces_index = np.where((np.argmax(labels, axis=-1) == 1))\r\n\r\n        accuracy = np.mean(\r\n            (np.argmax(labels[same_faces_index], axis=-1))\r\n            == (np.argmax(adversarial_labels[same_faces_index], axis=-1))\r\n        )\r\n        print(\r\n            \"Accuracy against adversarial examples for \"\r\n            + \"same person faces (dodging): \"\r\n            + str(accuracy * 100)\r\n            + \"%\"\r\n        )\r\n\r\n        accuracy = np.mean(\r\n            (np.argmax(labels[different_faces_index], axis=-1))\r\n            == (np.argmax(adversarial_labels[different_faces_index], axis=-1))\r\n        )\r\n        print(\r\n            \"Accuracy against adversarial examples for \"\r\n            + \"different people faces (impersonation): \"\r\n            + str(accuracy * 100)\r\n            + \"%\"\r\n        )\r\n\r\n        # Save images to folder\r\n        set_loader.save_images(adv, faces1, faces2, size)\r\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/facenet_adversarial_faces/set_loader.py",
    "content": "import shutil\r\nimport os\r\n\r\nimport lfw\r\nimport facenet\r\n\r\nimport numpy as np\r\n\r\nfrom PIL import Image\r\n\r\n\r\npairs_path = \"datasets/lfw/pairs.txt\"\r\ntestset_path = \"datasets/lfw/lfw_mtcnnpy_160\"\r\nimage_size = 160\r\n\r\n\r\ndef save_images(adv, faces1, faces2, size):\r\n    save_images_to_folder(adv, size, \"images/adversarial/\")\r\n    save_images_to_folder(0.5 + (adv - faces1), size, \"images/noise/\")\r\n    save_images_to_folder(faces1, size, \"images/faces1/\")\r\n    save_images_to_folder(faces2, size, \"images/faces2/\")\r\n\r\n\r\ndef save_images_to_folder(images, size, path):\r\n    if os.path.isdir(path):\r\n        shutil.rmtree(path)\r\n    os.makedirs(path)\r\n\r\n    for index in range(images.shape[0]):\r\n        if index < size:\r\n            image_array = (np.reshape(images[index], (160, 160, 3)) * 255).astype(\r\n                np.uint8\r\n            )\r\n            Image.fromarray(image_array, \"RGB\").save(path + str(index) + \".png\")\r\n\r\n\r\ndef load_testset(size):\r\n    # Load images paths and labels\r\n    pairs = lfw.read_pairs(pairs_path)\r\n    paths, labels = lfw.get_paths(testset_path, pairs)\r\n\r\n    # Random choice\r\n    permutation = np.random.choice(len(labels), size, replace=False)\r\n    paths_batch_1 = []\r\n    paths_batch_2 = []\r\n\r\n    for index in permutation:\r\n        paths_batch_1.append(paths[index * 2])\r\n        paths_batch_2.append(paths[index * 2 + 1])\r\n\r\n    labels = np.asarray(labels)[permutation]\r\n    paths_batch_1 = np.asarray(paths_batch_1)\r\n    paths_batch_2 = np.asarray(paths_batch_2)\r\n\r\n    # Load images\r\n    faces1 = facenet.load_data(paths_batch_1, False, False, image_size)\r\n    faces2 = facenet.load_data(paths_batch_2, False, False, image_size)\r\n\r\n    # Change pixel values to 0 to 1 values\r\n    min_pixel = min(np.min(faces1), np.min(faces2))\r\n    max_pixel = max(np.max(faces1), np.max(faces2))\r\n    faces1 = (faces1 - min_pixel) / (max_pixel - min_pixel)\r\n    faces2 = (faces2 - min_pixel) / (max_pixel - min_pixel)\r\n\r\n    # Convert labels to one-hot vectors\r\n    onehot_labels = []\r\n    for index in range(len(labels)):\r\n        if labels[index]:\r\n            onehot_labels.append([1, 0])\r\n        else:\r\n            onehot_labels.append([0, 1])\r\n\r\n    return faces1, faces2, np.array(onehot_labels)\r\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/imagenet_featadvs/model.py",
    "content": "# pylint: disable=missing-docstring\nimport functools\nimport tensorflow as tf\n\nfrom cleverhans.initializers import HeReLuNormalInitializer\nfrom cleverhans.model import Model\n\n\nclass ModelImageNetCNN(Model):\n    def __init__(self, scope, nb_classes=1000, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        my_conv = functools.partial(\n            tf.layers.conv2d,\n            kernel_size=3,\n            strides=2,\n            padding=\"valid\",\n            activation=tf.nn.relu,\n            kernel_initializer=HeReLuNormalInitializer,\n        )\n        my_dense = functools.partial(\n            tf.layers.dense, kernel_initializer=HeReLuNormalInitializer\n        )\n\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            for depth in [96, 256, 384, 384, 256]:\n                x = my_conv(x, depth)\n            y = tf.layers.flatten(x)\n            y = my_dense(y, 4096, tf.nn.relu)\n            y = fc7 = my_dense(y, 4096, tf.nn.relu)\n            y = my_dense(y, 1000)\n            return {\"fc7\": fc7, self.O_LOGITS: y, self.O_PROBS: tf.nn.softmax(logits=y)}\n\n\ndef make_imagenet_cnn(input_shape=(None, 224, 224, 3)):\n    return ModelImageNetCNN(\"imagenet\")\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/madry_lab_challenges/LICENSE",
    "content": "Note:\n\nSome files in this directory are derivative works of the Madry Lab's\nMNIST challenge, which has the following copyright:\n\nCopyright (c) 2017 Aleksander Madry, Aleksandar Makelov, Ludwig Schmidt,\nDimitris Tsipras, and Adrian Vladu.\n\nThe MNIST challenge is released under the MIT License, as is CleverHans.\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/madry_lab_challenges/README",
    "content": "This example provides a CleverHans wrapper for the Madry Lab challenges.\n\nTo run the attack on MNIST:\n\n1. Clone the MNIST challenge repository from:\nhttps://github.com/MadryLab/mnist_challenge\n\n2. Obtain some weights for the Madry Lab model, following the readme\nfrom their project (either download their presupplied weights or train\nyour own).\n\n3. Set your MNIST_CHALLENGE_DIR environment variable to point to\nthe repository you cloned in step 1\n\n4. Run\n\n`python mnist/attack_model.py`\n\nTo run the attack on CIFAR-10\n\n1. Clone the CIFAR-10 challenge repository from:\nhttps://github.com/MadryLab/cifar10_challenge\n\n2. Same as for MNIST\n\n3. Set your CIFAR10_CHALLENGE_DIR environment variable to point to \nrepository from step 1. \n\n4. Run\n\n`python cifar10/attack_model.py`\n\n\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/madry_lab_challenges/cifar10/attack_model.py",
    "content": "\"\"\"Runs CleverHans attacks on the Madry Lab CIFAR-10 challenge model\n\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport sys\nimport time\nimport numpy as np\nimport logging\n\nimport tensorflow as tf\nfrom tensorflow.python.platform import app, flags\nfrom cleverhans.utils import set_log_level, to_categorical\nfrom cleverhans.utils_tf import model_eval\nimport cifar10_input\n\n\nFLAGS = flags.FLAGS\n\n\ndef main(argv):\n\n    model_file = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)\n\n    if model_file is None:\n        print(\"No model found\")\n        sys.exit()\n\n    cifar = cifar10_input.CIFAR10Data(FLAGS.dataset_dir)\n\n    nb_classes = 10\n    X_test = cifar.eval_data.xs\n    Y_test = to_categorical(cifar.eval_data.ys, nb_classes)\n    assert Y_test.shape[1] == 10.0\n\n    set_log_level(logging.DEBUG)\n\n    with tf.Session() as sess:\n\n        x = tf.placeholder(tf.float32, shape=(None, 32, 32, 3))\n        y = tf.placeholder(tf.float32, shape=(None, 10))\n\n        from cleverhans.model_zoo.madry_lab_challenges.cifar10_model import make_wresnet\n\n        model = make_wresnet()\n\n        saver = tf.train.Saver()\n\n        # Restore the checkpoint\n        saver.restore(sess, model_file)\n\n        nb_samples = FLAGS.nb_samples\n\n        attack_params = {\n            \"batch_size\": FLAGS.batch_size,\n            \"clip_min\": 0.0,\n            \"clip_max\": 255.0,\n        }\n\n        if FLAGS.attack_type == \"cwl2\":\n            from cleverhans.attacks import CarliniWagnerL2\n\n            attacker = CarliniWagnerL2(model, sess=sess)\n            attack_params.update(\n                {\n                    \"binary_search_steps\": 1,\n                    \"max_iterations\": 100,\n                    \"learning_rate\": 0.1,\n                    \"initial_const\": 10,\n                    \"batch_size\": 10,\n                }\n            )\n\n        else:  # eps and eps_iter in range 0-255\n            attack_params.update({\"eps\": 8, \"ord\": np.inf})\n            if FLAGS.attack_type == \"fgsm\":\n                from cleverhans.attacks import FastGradientMethod\n\n                attacker = FastGradientMethod(model, sess=sess)\n\n            elif FLAGS.attack_type == \"pgd\":\n                attack_params.update({\"eps_iter\": 2, \"nb_iter\": 20})\n                from cleverhans.attacks import MadryEtAl\n\n                attacker = MadryEtAl(model, sess=sess)\n\n        eval_par = {\"batch_size\": FLAGS.batch_size}\n\n        if FLAGS.sweep:\n            max_eps = 16\n            epsilons = np.linspace(1, max_eps, max_eps)\n            for e in epsilons:\n                t1 = time.time()\n                attack_params.update({\"eps\": e})\n                x_adv = attacker.generate(x, **attack_params)\n                preds_adv = model.get_probs(x_adv)\n                acc = model_eval(\n                    sess,\n                    x,\n                    y,\n                    preds_adv,\n                    X_test[:nb_samples],\n                    Y_test[:nb_samples],\n                    args=eval_par,\n                )\n                print(\n                    \"Epsilon %.2f, accuracy on adversarial\" % e,\n                    \"examples %0.4f\\n\" % acc,\n                )\n            t2 = time.time()\n        else:\n            t1 = time.time()\n            x_adv = attacker.generate(x, **attack_params)\n            preds_adv = model.get_probs(x_adv)\n            acc = model_eval(\n                sess,\n                x,\n                y,\n                preds_adv,\n                X_test[:nb_samples],\n                Y_test[:nb_samples],\n                args=eval_par,\n            )\n            t2 = time.time()\n            print(\"Test accuracy on adversarial examples %0.4f\\n\" % acc)\n        print(\"Took\", t2 - t1, \"seconds\")\n\n\nif __name__ == \"__main__\":\n\n    if \"CIFAR10_CHALLENGE_DIR\" in os.environ:\n        cifar10_root = os.environ[\"CIFAR10_CHALLENGE_DIR\"]\n    default_ckpt_dir = os.path.join(cifar10_root, \"models/adv_trained\")\n    default_data_dir = os.path.join(cifar10_root, \"cifar10_data\")\n\n    flags.DEFINE_integer(\"batch_size\", 100, \"Batch size\")\n\n    flags.DEFINE_integer(\"nb_samples\", 1000, \"Number of samples to test\")\n\n    flags.DEFINE_string(\n        \"attack_type\",\n        \"fgsm\",\n        (\n            \"Attack type: 'fgsm'->'fast \"\n            \"gradient sign method', \"\n            \"'pgd'->'projected \"\n            \"gradient descent', 'cwl2'->\"\n            \"'Carlini & Wagner L2'\"\n        ),\n    )\n    flags.DEFINE_string(\n        \"checkpoint_dir\", default_ckpt_dir, \"Checkpoint directory to load\"\n    )\n\n    flags.DEFINE_string(\"dataset_dir\", default_data_dir, \"Dataset directory\")\n\n    flags.DEFINE_bool(\"sweep\", False, \"Sweep epsilon or single epsilon?\")\n\n    app.run(main)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/madry_lab_challenges/mnist/attack_model.py",
    "content": "\"\"\"Runs CleverHans attacks on the Madry Lab MNIST challenge model\n\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport time\n\nimport tensorflow as tf\nfrom tensorflow.examples.tutorials.mnist import input_data\nfrom tensorflow.python.platform import app\nfrom tensorflow.python.platform import flags\nfrom madry_mnist_model import MadryMNIST\nfrom cleverhans.utils_tf import model_eval\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.attacks import BasicIterativeMethod\nfrom cleverhans.utils_mnist import data_mnist\n\n\nFLAGS = flags.FLAGS\n\n\ndef main(argv):\n    checkpoint = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)\n\n    if checkpoint is None:\n        raise ValueError(\"Couldn't find latest checkpoint in \" + FLAGS.checkpoint_dir)\n\n    train_start = 0\n    train_end = 60000\n    test_start = 0\n    test_end = 10000\n    X_train, Y_train, X_test, Y_test = data_mnist(\n        train_start=train_start,\n        train_end=train_end,\n        test_start=test_start,\n        test_end=test_end,\n    )\n\n    assert Y_train.shape[1] == 10\n\n    # NOTE: for compatibility with Madry Lab downloadable checkpoints,\n    # we cannot enclose this in a scope or do anything else that would\n    # change the automatic naming of the variables.\n    model = MadryMNIST()\n\n    x_input = tf.placeholder(tf.float32, shape=[None, 784])\n    x_image = tf.placeholder(tf.float32, shape=[None, 28, 28, 1])\n    y = tf.placeholder(tf.float32, shape=[None, 10])\n\n    if FLAGS.attack_type == \"fgsm\":\n        fgsm = FastGradientMethod(model)\n        fgsm_params = {\"eps\": 0.3, \"clip_min\": 0.0, \"clip_max\": 1.0}\n        adv_x = fgsm.generate(x_image, **fgsm_params)\n    elif FLAGS.attack_type == \"bim\":\n        bim = BasicIterativeMethod(model)\n        bim_params = {\n            \"eps\": 0.3,\n            \"clip_min\": 0.0,\n            \"clip_max\": 1.0,\n            \"nb_iter\": 50,\n            \"eps_iter\": 0.01,\n        }\n        adv_x = bim.generate(x_image, **bim_params)\n    else:\n        raise ValueError(FLAGS.attack_type)\n    preds_adv = model.get_probs(adv_x)\n\n    saver = tf.train.Saver()\n\n    with tf.Session() as sess:\n        # Restore the checkpoint\n        saver.restore(sess, checkpoint)\n\n        # Evaluate the accuracy of the MNIST model on adversarial examples\n        eval_par = {\"batch_size\": FLAGS.batch_size}\n        t1 = time.time()\n        acc = model_eval(sess, x_image, y, preds_adv, X_test, Y_test, args=eval_par)\n        t2 = time.time()\n        print(\"Took\", t2 - t1, \"seconds\")\n        print(\"Test accuracy on adversarial examples: %0.4f\\n\" % acc)\n\n\nif __name__ == \"__main__\":\n\n    dirs = [\"models\", \"adv_trained\"]\n    if \"MNIST_CHALLENGE_DIR\" in os.environ:\n        dirs.insert(0, os.environ[\"MNIST_CHALLENGE_DIR\"])\n    default_checkpoint_dir = os.path.join(*dirs)\n\n    flags.DEFINE_integer(\"batch_size\", 128, \"batch size\")\n    flags.DEFINE_float(\n        \"label_smooth\",\n        0.1,\n        (\"Amount to subtract from correct label \" \"and distribute among other labels\"),\n    )\n    flags.DEFINE_string(\n        \"attack_type\",\n        \"fgsm\",\n        (\n            \"Attack type: 'fgsm'->fast gradient sign\"\n            \"method, 'bim'->'basic iterative method'\"\n        ),\n    )\n    flags.DEFINE_string(\n        \"checkpoint_dir\", default_checkpoint_dir, \"Checkpoint directory to load\"\n    )\n    app.run(main)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/madry_lab_challenges/mnist/madry_mnist_model.py",
    "content": "\"\"\"cleverhans.model.Model implementation of mnist_challenge.model.Model\n\nThis re-implementation factors variable creation apart from forward\npropagation so it is possible to run forward propagation more than once\nin the same model.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nfrom collections import OrderedDict\nimport tensorflow as tf\nfrom cleverhans.model import Model\nfrom cleverhans.utils import deterministic_dict\nfrom cleverhans.dataset import Factory, MNIST\n\n\nclass MadryMNIST(Model):\n    def __init__(self, nb_classes=10):\n        # NOTE: for compatibility with Madry Lab downloadable checkpoints,\n        # we cannot use scopes, give these variables names, etc.\n        self.W_conv1 = self._weight_variable([5, 5, 1, 32])\n        self.b_conv1 = self._bias_variable([32])\n        self.W_conv2 = self._weight_variable([5, 5, 32, 64])\n        self.b_conv2 = self._bias_variable([64])\n        self.W_fc1 = self._weight_variable([7 * 7 * 64, 1024])\n        self.b_fc1 = self._bias_variable([1024])\n        self.W_fc2 = self._weight_variable([1024, nb_classes])\n        self.b_fc2 = self._bias_variable([nb_classes])\n        Model.__init__(self, \"\", nb_classes, {})\n        self.dataset_factory = Factory(MNIST, {\"center\": False})\n\n    def get_params(self):\n        return [\n            self.W_conv1,\n            self.b_conv1,\n            self.W_conv2,\n            self.b_conv2,\n            self.W_fc1,\n            self.b_fc1,\n            self.W_fc2,\n            self.b_fc2,\n        ]\n\n    def fprop(self, x):\n\n        output = OrderedDict()\n        # first convolutional layer\n        h_conv1 = tf.nn.relu(self._conv2d(x, self.W_conv1) + self.b_conv1)\n        h_pool1 = self._max_pool_2x2(h_conv1)\n\n        # second convolutional layer\n        h_conv2 = tf.nn.relu(self._conv2d(h_pool1, self.W_conv2) + self.b_conv2)\n        h_pool2 = self._max_pool_2x2(h_conv2)\n\n        # first fully connected layer\n\n        h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])\n        h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, self.W_fc1) + self.b_fc1)\n\n        # output layer\n        logits = tf.matmul(h_fc1, self.W_fc2) + self.b_fc2\n\n        output = deterministic_dict(locals())\n        del output[\"self\"]\n        output[self.O_PROBS] = tf.nn.softmax(logits=logits)\n\n        return output\n\n    @staticmethod\n    def _weight_variable(shape):\n        initial = tf.truncated_normal(shape, stddev=0.1)\n        return tf.Variable(initial)\n\n    @staticmethod\n    def _bias_variable(shape):\n        initial = tf.constant(0.1, shape=shape)\n        return tf.Variable(initial)\n\n    @staticmethod\n    def _conv2d(x, W):\n        return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding=\"SAME\")\n\n    @staticmethod\n    def _max_pool_2x2(x):\n        return tf.nn.max_pool(\n            x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=\"SAME\"\n        )\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/README.md",
    "content": "# MultiGPU Adversarial Training\n\nThis directory includes scripts to train a model using a multi-GPU \nimplementation of [\"Madry et al.  (2017)\"](https://arxiv.org/abs/1706.06083) \nattack.\n\n## MNIST Adversarial Training\n\nTrain a model using a single GPU on MNIST.\n\n```python\nCUDA_VISIBLE_DEVICES=0 python run_multigpu.py --attack_type_train FGSM --attack_type_test FGSM --adv_train\n```\n\nTrain using `MadryEtal_y` attack. The default number of steps on MNIST is set to 40 for this attack.\n\n```python\nCUDA_VISIBLE_DEVICES=0 python run_multigpu.py --attack_type_train MadryEtAl_y --attack_type_test FGSM,MadryEtAl_y --adv_train --save_dir runs/mnist_madry_advtrain --nb_epochs 200 --model_type madry\n```\n\nHere is the output after 200 iterations.\n\n```text\nClean accuracy, subsampled train (train_accuracy_subsampled): 1.0000\nClean accuracy, natural test (test_accuracy_natural): 0.9870\nTest accuracy on adversarial examples (test_accuracy_FGSM): 0.9633\nTest accuracy on adversarial examples (test_accuracy_MadryEtAl_y): 0.9483\n```\n\nThe same training can be done on 2 GPUs by setting `--ngpu 2` and \n`--attack_type_train MadryEtAl_y_multigpu`. Set the number iterations for the \nattack at training time via the flag `--attack_nb_iter_train`.\n\n## CIFAR10 Adversarial Training\n\nThis command trains a ResNet32 model on CIFAR10 using multi-GPU adversarial \ntraining.\n\n```python\nCUDA_VISIBLE_DEVICES=0,1 python run_multigpu.py --attack_type_train MadryEtAl_y_multigpu --attack_type_test FGSM,MadryEtAl_y --ngpu 2 --save_dir runs/cifar10_advtrain --nb_epochs 200 --model_type resnet_tf --attack_nb_iter_train 7 --adv_train --dataset cifar10 --eval_iters 5\n```\n\nHere is an example of the output of the command above at epoch 200.\n\n```text\nClean accuracy, subsampled train (train_accuracy_subsampled): 0.9560\nClean accuracy, natural test (test_accuracy_natural): 0.8989\nTest accuracy on adversarial examples (test_accuracy_FGSM): 0.7986\nTest accuracy on adversarial examples (test_accuracy_MadryEtAl_y): 0.7803\n```\n\n## Testing\n\nRun tests using the following commands:\n\n```python\nCUDA_VISIBLE_DEVICES=0,1 python test_run_multigpu.py\nCUDA_VISIBLE_DEVICES=0,1 python test_runner.py\nCUDA_VISIBLE_DEVICES=0,1 python test_attack_multigpu.py\n```\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/attacks_multigpu.py",
    "content": "# pylint: disable=missing-docstring\nfrom collections import OrderedDict\n\nimport tensorflow as tf\n\nfrom cleverhans.attacks import MadryEtAl\nfrom cleverhans.utils_tf import clip_eta\n\nfrom model import clone_variable\n\n\nclass MadryEtAlMultiGPU(MadryEtAl):\n\n    \"\"\"\n    A multi-GPU version of the Projected Gradient Descent Attack\n    (Madry et al. 2017).\n    Paper link: https://arxiv.org/pdf/1706.06083.pdf\n\n    This attack is designed to run on multiple GPUs for generating adversarial\n    examples.\n    Comparing to data parallelism, using this parallelization we can get\n    very close to optimal n times speed up using n GPUs. The current\n    implementation gets close to 6x speed up on 8 GPUs.\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        \"\"\"\n        Create a MadryEtAlMultiGPU instance.\n        \"\"\"\n        super(MadryEtAlMultiGPU, self).__init__(*args, **kwargs)\n        self.structural_kwargs += [\"ngpu\"]\n\n    def get_or_guess_labels(self, x, kwargs):\n        device_name = \"/gpu:0\"\n        self.model.set_device(device_name)\n        with tf.device(device_name):\n            with tf.variable_scope(\"model_pred\"):\n                ret = super(MadryEtAlMultiGPU, self).get_or_guess_labels(x, kwargs)\n        return ret\n\n    def attack(self, x, y_p, **kwargs):\n        \"\"\"\n        This method creates a symoblic graph of the MadryEtAl attack on\n        multiple GPUs. The graph is created on the first n GPUs.\n\n        Stop gradient is needed to get the speed-up. This prevents us from\n        being able to back-prop through the attack.\n\n        :param x: A tensor with the input image.\n        :param y_p: Ground truth label or predicted label.\n        :return: Two lists containing the input and output tensors of each GPU.\n        \"\"\"\n        inputs = []\n        outputs = []\n\n        # Create the initial random perturbation\n        device_name = \"/gpu:0\"\n        self.model.set_device(device_name)\n        with tf.device(device_name):\n            with tf.variable_scope(\"init_rand\"):\n                if self.rand_init:\n                    eta = tf.random_uniform(tf.shape(x), -self.eps, self.eps)\n                    eta = clip_eta(eta, self.ord, self.eps)\n                    eta = tf.stop_gradient(eta)\n                else:\n                    eta = tf.zeros_like(x)\n\n        # TODO: Break the graph only nGPU times instead of nb_iter times.\n        # The current implementation by the time an adversarial example is\n        # used for training, the weights of the model have changed nb_iter\n        # times. This can cause slower convergence compared to the single GPU\n        # adversarial training.\n        for i in range(self.nb_iter):\n            # Create the graph for i'th step of attack\n            inputs += [OrderedDict()]\n            outputs += [OrderedDict()]\n            device_name = x.device\n            self.model.set_device(device_name)\n            with tf.device(device_name):\n                with tf.variable_scope(\"step%d\" % i):\n                    if i > 0:\n                        # Clone the variables to separate the graph of 2 GPUs\n                        x = clone_variable(\"x\", x)\n                        y_p = clone_variable(\"y_p\", y_p)\n                        eta = clone_variable(\"eta\", eta)\n\n                    inputs[i][\"x\"] = x\n                    inputs[i][\"y_p\"] = y_p\n                    outputs[i][\"x\"] = x\n                    outputs[i][\"y_p\"] = y_p\n                    inputs[i][\"eta\"] = eta\n\n                    eta = self.attack_single_step(x, eta, y_p)\n\n                    if i < self.nb_iter - 1:\n                        outputs[i][\"eta\"] = eta\n                    else:\n                        # adv_x, not eta is the output of the last step\n                        adv_x = x + eta\n                        if self.clip_min is not None and self.clip_max is not None:\n                            adv_x = tf.clip_by_value(\n                                adv_x, self.clip_min, self.clip_max\n                            )\n                        adv_x = tf.stop_gradient(adv_x, name=\"adv_x\")\n                        outputs[i][\"adv_x\"] = adv_x\n\n        return inputs, outputs\n\n    def generate_np(self, x_val, **kwargs):\n        \"\"\"\n        Facilitates testing this attack.\n        \"\"\"\n        _, feedable, _feedable_types, hash_key = self.construct_variables(kwargs)\n\n        if hash_key not in self.graphs:\n            with tf.variable_scope(None, \"attack_%d\" % len(self.graphs)):\n                # x is a special placeholder we always want to have\n                with tf.device(\"/gpu:0\"):\n                    x = tf.placeholder(tf.float32, shape=x_val.shape, name=\"x\")\n\n                inputs, outputs = self.generate(x, **kwargs)\n\n                from runner import RunnerMultiGPU\n\n                runner = RunnerMultiGPU(inputs, outputs, sess=self.sess)\n                self.graphs[hash_key] = runner\n\n        runner = self.graphs[hash_key]\n        feed_dict = {\"x\": x_val}\n        for name in feedable:\n            feed_dict[name] = feedable[name]\n        fvals = runner.run(feed_dict)\n        while not runner.is_finished():\n            fvals = runner.run()\n\n        return fvals[\"adv_x\"]\n\n    def parse_params(self, ngpu=1, **kwargs):\n        \"\"\"\n        Take in a dictionary of parameters and applies attack-specific checks\n        before saving them as attributes.\n\n        Attack-specific parameters:\n        :param ngpu: (required int) the number of GPUs available.\n        :param kwargs: A dictionary of parameters for MadryEtAl attack.\n        \"\"\"\n\n        return_status = super(MadryEtAlMultiGPU, self).parse_params(**kwargs)\n        self.ngpu = ngpu\n\n        return return_status\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/evaluator.py",
    "content": "\"\"\"\nSimplifying the evaluation of a model. Multiple attacks are initialized and\nrun against a model at every evaluation step.\n\"\"\"\nimport logging\n\nimport tensorflow as tf\n\nfrom cleverhans.utils_tf import model_eval\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.attacks import MadryEtAl\n\nfrom attacks_multigpu import MadryEtAlMultiGPU\n\n\ndef create_adv_by_name(model, x, attack_type, sess, dataset, y=None, **kwargs):\n    \"\"\"\n    Creates the symbolic graph of an adversarial example given the name of\n    an attack. Simplifies creating the symbolic graph of an attack by defining\n    dataset-specific parameters.\n    Dataset-specific default parameters are used unless a different value is\n    given in kwargs.\n\n    :param model: an object of Model class\n    :param x: Symbolic input to the attack.\n    :param attack_type: A string that is the name of an attack.\n    :param sess: Tensorflow session.\n    :param dataset: The name of the dataset as a string to use for default\n                   params.\n    :param y: (optional) a symbolic variable for the labels.\n    :param kwargs: (optional) additional parameters to be passed to the attack.\n    \"\"\"\n    # TODO: black box attacks\n    attack_names = {\n        \"FGSM\": FastGradientMethod,\n        \"MadryEtAl\": MadryEtAl,\n        \"MadryEtAl_y\": MadryEtAl,\n        \"MadryEtAl_multigpu\": MadryEtAlMultiGPU,\n        \"MadryEtAl_y_multigpu\": MadryEtAlMultiGPU,\n    }\n\n    if attack_type not in attack_names:\n        raise Exception(\"Attack %s not defined.\" % attack_type)\n\n    attack_params_shared = {\n        \"mnist\": {\n            \"eps\": 0.3,\n            \"eps_iter\": 0.01,\n            \"clip_min\": 0.0,\n            \"clip_max\": 1.0,\n            \"nb_iter\": 40,\n        },\n        \"cifar10\": {\n            \"eps\": 8.0 / 255,\n            \"eps_iter\": 0.01,\n            \"clip_min\": 0.0,\n            \"clip_max\": 1.0,\n            \"nb_iter\": 20,\n        },\n    }\n\n    with tf.variable_scope(attack_type):\n        attack_class = attack_names[attack_type]\n        attack = attack_class(model, sess=sess)\n\n        # Extract feedable and structural keyword arguments from kwargs\n        fd_kwargs = attack.feedable_kwargs.keys() + attack.structural_kwargs\n        params = attack_params_shared[dataset].copy()\n        params.update({k: v for k, v in kwargs.items() if v is not None})\n        params = {k: v for k, v in params.items() if k in fd_kwargs}\n\n        if \"_y\" in attack_type:\n            params[\"y\"] = y\n        logging.info(params)\n        adv_x = attack.generate(x, **params)\n\n    return adv_x\n\n\nclass Evaluator(object):\n    \"\"\"\n    This class evaluates a model against multiple attacks.\n    \"\"\"\n\n    def __init__(\n        self, sess, model, batch_size, x_pre, x, y, data, writer, hparams=None\n    ):\n        \"\"\"\n        :param sess: Tensorflow session.\n        :param model: an object of Model class\n        :param batch_size: batch_size for evaluation.\n        :param x_pre: placeholder for input before preprocessing.\n        :param x: symbolic input to model.\n        :param y: symbolic variable for the label.\n        :param data: a tuple with training and test data in the form\n                     (X_train, Y_train, X_test, Y_test).\n        :param writer: Tensorflow summary writer.\n        :param hparams: Flags to control the evaluation.\n        \"\"\"\n        if hparams is None:\n            hparams = {}\n        model.set_training(False)\n        self.preds = model.get_probs(x)\n        self.sess = sess\n        self.batch_size = batch_size\n        self.x_pre = x_pre\n        self.x = x\n        self.y = y\n        self.X_train, self.Y_train, self.X_test, self.Y_test = data\n        self.writer = writer\n        self.hparams = hparams\n\n        # Evaluate on a fixed subsampled set of the train data\n        self.eval_params = {\"batch_size\": batch_size}\n\n        self.epoch = 0\n\n        self.attack_type_train = hparams.attack_type_train\n        self.attack_type_test = []\n        for att_type in hparams.attack_type_test.split(\",\"):\n            if att_type == \"\":\n                continue\n            self.attack_type_test += [att_type]\n        self.attacks = {}\n\n        # Initialize the attack object and graph\n        for att_type in self.attack_type_test:\n            logging.info(\"Intializing attack %s\" % att_type)\n            adv_x = create_adv_by_name(\n                model, x, att_type, sess, dataset=hparams.dataset, y=y\n            )\n\n            model.set_training(False)\n            preds_adv = model.get_probs(adv_x)\n            self.attacks[att_type] = (adv_x, preds_adv)\n            # visualize adversarial image\n            tf.summary.image(att_type, adv_x, max_outputs=10)\n        self.sum_op = tf.summary.merge_all()\n\n    def log_value(self, tag, val, desc=\"\"):\n        \"\"\"\n        Log values to standard output and Tensorflow summary.\n\n        :param tag: summary tag.\n        :param val: (required float or numpy array) value to be logged.\n        :param desc: (optional) additional description to be printed.\n        \"\"\"\n        logging.info(\"%s (%s): %.4f\" % (desc, tag, val))\n        self.summary.value.add(tag=tag, simple_value=val)\n\n    def eval_advs(self, x, y, preds_adv, X_test, Y_test, att_type):\n        \"\"\"\n        Evaluate the accuracy of the model on adversarial examples\n\n        :param x: symbolic input to model.\n        :param y: symbolic variable for the label.\n        :param preds_adv: symbolic variable for the prediction on an\n                          adversarial example.\n        :param X_test: NumPy array of test set inputs.\n        :param Y_test: NumPy array of test set labels.\n        :param att_type: name of the attack.\n        \"\"\"\n        end = (len(X_test) // self.batch_size) * self.batch_size\n\n        if self.hparams.fast_tests:\n            end = 10 * self.batch_size\n\n        acc = model_eval(\n            self.sess,\n            x,\n            y,\n            preds_adv,\n            X_test[:end],\n            Y_test[:end],\n            args=self.eval_params,\n        )\n        self.log_value(\n            \"test_accuracy_%s\" % att_type, acc, \"Test accuracy on adversarial examples\"\n        )\n        return acc\n\n    def eval_multi(self, inc_epoch=True):\n        \"\"\"\n        Run the evaluation on multiple attacks.\n        \"\"\"\n        sess = self.sess\n        preds = self.preds\n        x = self.x_pre\n        y = self.y\n        X_train = self.X_train\n        Y_train = self.Y_train\n        X_test = self.X_test\n        Y_test = self.Y_test\n        writer = self.writer\n\n        self.summary = tf.Summary()\n        report = {}\n\n        # Evaluate on train set\n        subsample_factor = 100\n        X_train_subsampled = X_train[::subsample_factor]\n        Y_train_subsampled = Y_train[::subsample_factor]\n        acc_train = model_eval(\n            sess,\n            x,\n            y,\n            preds,\n            X_train_subsampled,\n            Y_train_subsampled,\n            args=self.eval_params,\n        )\n        self.log_value(\n            \"train_accuracy_subsampled\", acc_train, \"Clean accuracy, subsampled train\"\n        )\n        report[\"train\"] = acc_train\n\n        # Evaluate on the test set\n        acc = model_eval(sess, x, y, preds, X_test, Y_test, args=self.eval_params)\n        self.log_value(\"test_accuracy_natural\", acc, \"Clean accuracy, natural test\")\n        report[\"test\"] = acc\n\n        # Evaluate against adversarial attacks\n        if self.epoch % self.hparams.eval_iters == 0:\n            for att_type in self.attack_type_test:\n                _, preds_adv = self.attacks[att_type]\n                acc = self.eval_advs(x, y, preds_adv, X_test, Y_test, att_type)\n                report[att_type] = acc\n\n        if self.writer:\n            writer.add_summary(self.summary, self.epoch)\n\n        # Add examples of adversarial examples to the summary\n        if self.writer and self.epoch % 20 == 0 and self.sum_op is not None:\n            sm_val = self.sess.run(\n                self.sum_op,\n                feed_dict={x: X_test[: self.batch_size], y: Y_test[: self.batch_size]},\n            )\n            if self.writer:\n                writer.add_summary(sm_val)\n\n        self.epoch += 1 if inc_epoch else 0\n\n        return report\n\n    def __call__(self, **kwargs):\n        return self.eval_multi(**kwargs)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/make_model.py",
    "content": "# pylint: disable=missing-docstring\nfrom model import Conv2D, ReLU, Flatten, Linear, Softmax, MLP\nfrom model import MLPnGPU\nfrom model import Conv2DnGPU\nfrom model import LinearnGPU\nfrom model import MaxPool\n\nfrom resnet_tf import ResNetTF\n\n\ndef make_basic_cnn(nb_filters=64, nb_classes=10, input_shape=(None, 28, 28, 1)):\n    layers = [\n        Conv2D(nb_filters, (8, 8), (2, 2), \"SAME\"),\n        ReLU(),\n        Conv2D(nb_filters * 2, (6, 6), (2, 2), \"VALID\"),\n        ReLU(),\n        Conv2D(nb_filters * 2, (5, 5), (1, 1), \"VALID\"),\n        ReLU(),\n        Flatten(),\n        Linear(nb_classes),\n        Softmax(),\n    ]\n\n    model = MLP(nb_classes, layers, input_shape)\n    return model\n\n\ndef make_basic_ngpu(nb_classes=10, input_shape=(None, 28, 28, 1), **kwargs):\n    \"\"\"\n    Create a multi-GPU model similar to the basic cnn in the tutorials.\n    \"\"\"\n    model = make_basic_cnn()\n    layers = model.layers\n\n    model = MLPnGPU(nb_classes, layers, input_shape)\n    return model\n\n\ndef make_madry_ngpu(nb_classes=10, input_shape=(None, 28, 28, 1), **kwargs):\n    \"\"\"\n    Create a multi-GPU model similar to Madry et al. (arXiv:1706.06083).\n    \"\"\"\n    layers = [\n        Conv2DnGPU(32, (5, 5), (1, 1), \"SAME\"),\n        ReLU(),\n        MaxPool((2, 2), (2, 2), \"SAME\"),\n        Conv2DnGPU(64, (5, 5), (1, 1), \"SAME\"),\n        ReLU(),\n        MaxPool((2, 2), (2, 2), \"SAME\"),\n        Flatten(),\n        LinearnGPU(1024),\n        ReLU(),\n        LinearnGPU(nb_classes),\n        Softmax(),\n    ]\n\n    model = MLPnGPU(nb_classes, layers, input_shape)\n    return model\n\n\ndef make_model(model_type=\"madry\", **kwargs):\n    if model_type == \"basic\":\n        return make_basic_ngpu(**kwargs)\n    elif model_type == \"madry\":\n        return make_madry_ngpu(**kwargs)\n    elif model_type == \"resnet_tf\":\n        return ResNetTF(**kwargs)\n    else:\n        raise Exception(\"model type not defined.\")\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/model.py",
    "content": "\"\"\"\nMultiGPU model similar to the one used in model tutorials. The model keeps\none copy of the weights on each device and handles syncing the parameters\nacross devices.\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.model import Model\n\n\ndef clone_variable(name, x, trainable=False):\n    return tf.get_variable(name, shape=x.shape, dtype=x.dtype, trainable=trainable)\n\n\ndef unify_device_name(dname):\n    \"\"\"Converts TensorFlow device names in the format /Device:GPU0 to /gpu:0.\"\"\"\n    if dname is None:\n        return None\n    return dname.lower().replace(\"device:\", \"\")\n\n\nclass MLP(Model):\n    \"\"\"\n    An example of a bare bones multilayer perceptron (MLP) class.\n    \"\"\"\n\n    def __init__(self, nb_classes, layers, input_shape):\n        super(MLP, self).__init__(\"MLP\", nb_classes=nb_classes, hparams={})\n\n        self.layer_names = []\n        self.layers = layers\n        self.input_shape = input_shape\n        if isinstance(layers[-1], Softmax):\n            layers[-1].name = \"probs\"\n            layers[-2].name = \"logits\"\n        else:\n            layers[-1].name = \"logits\"\n        for i, layer in enumerate(self.layers):\n            if hasattr(layer, \"name\"):\n                name = layer.name\n            else:\n                name = layer.__class__.__name__ + str(i)\n                layer.name = name\n            self.layer_names.append(name)\n\n            layer.set_input_shape(input_shape)\n            input_shape = layer.get_output_shape()\n\n    def fprop(self, x, set_ref=False):\n        states = []\n        for layer in self.layers:\n            if set_ref:\n                layer.ref = x\n            x = layer.fprop(x)\n            assert x is not None\n            states.append(x)\n        states = dict(zip(self.layer_names, states))\n        return states\n\n    def get_params(self):\n        out = []\n        for layer in self.layers:\n            for param in layer.get_params():\n                if param not in out:\n                    out.append(param)\n        return out\n\n\nclass Layer(object):\n    def get_output_shape(self):\n        return self.output_shape\n\n\nclass Linear(Layer):\n    def __init__(self, num_hid):\n        self.num_hid = num_hid\n\n    def set_input_shape(self, input_shape):\n        batch_size, dim = input_shape\n        self.input_shape = [batch_size, dim]\n        self.output_shape = [batch_size, self.num_hid]\n        init = tf.random_normal([dim, self.num_hid], dtype=tf.float32)\n        init = init / tf.sqrt(\n            1e-7 + tf.reduce_sum(tf.square(init), axis=0, keep_dims=True)\n        )\n        self.W = tf.Variable(init)\n        self.b = tf.Variable(np.zeros((self.num_hid,)).astype(\"float32\"))\n\n    def fprop(self, x):\n        return tf.matmul(x, self.W) + self.b\n\n    def get_params(self):\n        return [self.W, self.b]\n\n\nclass Conv2D(Layer):\n    def __init__(self, output_channels, kernel_shape, strides, padding):\n        self.__dict__.update(locals())\n        del self.self\n\n    def set_input_shape(self, input_shape):\n        batch_size, _, __, input_channels = input_shape\n        kernel_shape = tuple(self.kernel_shape) + (input_channels, self.output_channels)\n        assert len(kernel_shape) == 4\n        assert all(isinstance(e, int) for e in kernel_shape), kernel_shape\n        init = tf.random_normal(kernel_shape, dtype=tf.float32)\n        init = init / tf.sqrt(1e-7 + tf.reduce_sum(tf.square(init), axis=(0, 1, 2)))\n        self.kernels = tf.Variable(init)\n        self.b = tf.Variable(np.zeros((self.output_channels,)).astype(\"float32\"))\n        input_shape = list(input_shape)\n        input_shape[0] = 1\n        dummy_batch = tf.zeros(input_shape)\n        dummy_output = self.fprop(dummy_batch)\n        output_shape = [int(e) for e in dummy_output.get_shape()]\n        output_shape[0] = batch_size\n        self.output_shape = tuple(output_shape)\n\n    def fprop(self, x):\n        return (\n            tf.nn.conv2d(\n                x, self.kernels, (1,) + tuple(self.strides) + (1,), self.padding\n            )\n            + self.b\n        )\n\n    def get_params(self):\n        return [self.kernels, self.b]\n\n\nclass ReLU(Layer):\n    def __init__(self):\n        pass\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def fprop(self, x):\n        return tf.nn.relu(x)\n\n    def get_params(self):\n        return []\n\n\nclass Softmax(Layer):\n    def __init__(self):\n        pass\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        self.output_shape = shape\n\n    def fprop(self, x):\n        return tf.nn.softmax(x)\n\n    def get_params(self):\n        return []\n\n\nclass Flatten(Layer):\n    def __init__(self):\n        pass\n\n    def set_input_shape(self, shape):\n        self.input_shape = shape\n        output_width = 1\n        for factor in shape[1:]:\n            output_width *= factor\n        self.output_width = output_width\n        self.output_shape = [shape[0], output_width]\n\n    def fprop(self, x):\n        return tf.reshape(x, [-1, self.output_width])\n\n    def get_params(self):\n        return []\n\n\nclass MLPnGPU(MLP):\n    \"\"\"\n    A multi layer perceptron that can be copied over multiple GPUs. Only one\n    copy of the weights is created on each device.\n    \"\"\"\n\n    def __init__(self, nb_classes, layers, input_shape):\n        super(MLPnGPU, self).__init__(nb_classes, layers, input_shape)\n        self.scope = \"MLPnGPU\"\n\n    def fprop(self, x):\n        with tf.variable_scope(self.scope):\n            states = super(MLPnGPU, self).fprop(x)\n        return states\n\n    def set_device(self, device_name):\n        \"\"\"\n        Set the device before the next fprop to create a new graph on the\n        specified device.\n        \"\"\"\n        device_name = unify_device_name(device_name)\n        self.device_name = device_name\n        for layer in self.layers:\n            layer.device_name = device_name\n\n    def create_sync_ops(self, host_device):\n        \"\"\"\n        Return a list of assignment operations that syncs the parameters\n        of all model copies with the one on host_device.\n        :param host_device: (required str) the name of the device with latest\n                            parameters\n        \"\"\"\n        host_device = unify_device_name(host_device)\n        sync_ops = []\n        for layer in self.layers:\n            if isinstance(layer, LayernGPU):\n                sync_ops += layer.create_sync_ops(host_device)\n        return sync_ops\n\n    def set_training(self, training=False):\n        for layer in self.layers:\n            if isinstance(layer, LayernGPU):\n                layer.set_training(training)\n\n\nclass LayernGPU(Layer):\n    \"\"\"\n    A layer that has separate copies of model parameters on each GPU.\n    \"\"\"\n\n    def __init__(self):\n        \"\"\"\n        :param input_shape: a tuple or list as the input shape to layer\n        \"\"\"\n        self.input_shape = None\n        self.params_device = {}\n        self.params_names = None\n        self.device_name = \"/gpu:0\"\n        self.training = True\n\n    def set_training(self, training=False):\n        self.training = training\n\n    def get_variable(self, name, initializer):\n        \"\"\"\n        Create and initialize a variable using a numpy array and set trainable.\n        :param name: (required str) name of the variable\n        :param initializer: a numpy array or a tensor\n        \"\"\"\n        v = tf.get_variable(\n            name,\n            shape=initializer.shape,\n            initializer=(lambda shape, dtype, partition_info: initializer),\n            trainable=self.training,\n        )\n        return v\n\n    def set_input_shape_ngpu(self, new_input_shape):\n        \"\"\"\n        Create and initialize layer parameters on the device previously set\n        in self.device_name.\n\n        :param new_input_shape: a list or tuple for the shape of the input.\n        \"\"\"\n        assert self.device_name, \"Device name has not been set.\"\n\n        device_name = self.device_name\n        if self.input_shape is None:\n            # First time setting the input shape\n            self.input_shape = [None] + [int(d) for d in list(new_input_shape)]\n\n        if device_name in self.params_device:\n            # There is a copy of weights on this device\n            self.__dict__.update(self.params_device[device_name])\n            return\n\n        # Stop recursion\n        self.params_device[device_name] = {}\n\n        # Initialize weights on this device\n        with tf.device(device_name):\n            self.set_input_shape(self.input_shape)\n            keys_after = self.__dict__.keys()\n            if self.params_names is None:\n                # Prevent overriding training\n                self.params_names = [\n                    k for k in keys_after if isinstance(self.__dict__[k], tf.Variable)\n                ]\n            params = {k: self.__dict__[k] for k in self.params_names}\n            self.params_device[device_name] = params\n\n    def create_sync_ops(self, host_device):\n        \"\"\"Create an assignment operation for each weight on all devices. The\n        weight is assigned the value of the copy on the `host_device'.\n        \"\"\"\n        sync_ops = []\n        host_params = self.params_device[host_device]\n        for device, params in (self.params_device).iteritems():\n            if device == host_device:\n                continue\n            for k in self.params_names:\n                if isinstance(params[k], tf.Variable):\n                    sync_ops += [tf.assign(params[k], host_params[k])]\n        return sync_ops\n\n    def fprop(self, x):\n        if self.name is None:\n            self.set_input_shape_ngpu(x.shape[1:])\n            return self.fprop_noscope(x)\n        else:\n            with tf.variable_scope(self.name):\n                self.set_input_shape_ngpu(x.shape[1:])\n                return self.fprop_noscope(x)\n\n\nclass LinearnGPU(LayernGPU):\n    def __init__(self, num_hid, w_name=\"W\"):\n        super(LinearnGPU, self).__init__()\n        self.num_hid = num_hid\n        self.w_name = w_name\n\n    def set_input_shape(self, input_shape):\n        batch_size, dim = input_shape\n        self.input_shape = [batch_size, dim]\n        self.output_shape = [batch_size, self.num_hid]\n        shape = [dim, self.num_hid]\n        with tf.variable_scope(self.name):\n            init = tf.truncated_normal(shape, stddev=0.1)\n            self.W = self.get_variable(self.w_name, init)\n            self.b = self.get_variable(\n                \"b\", 0.1 + np.zeros((self.num_hid,)).astype(\"float32\")\n            )\n\n    def fprop_noscope(self, x):\n        return tf.matmul(x, self.W) + self.b\n\n\nclass Conv2DnGPU(LayernGPU):\n    def __init__(\n        self, output_channels, kernel_shape, strides, padding, w_name=\"kernels\"\n    ):\n        super(Conv2DnGPU, self).__init__()\n        self.__dict__.update(locals())\n        del self.self\n        self.w_name = w_name\n\n    def set_input_shape(self, input_shape):\n        assert len(input_shape) == 4\n        input_channels = input_shape[3]\n        kernel_shape = tuple(self.kernel_shape) + (input_channels, self.output_channels)\n        assert len(kernel_shape) == 4\n        assert all(isinstance(e, int) for e in kernel_shape), kernel_shape\n        with tf.variable_scope(self.name):\n            init = tf.truncated_normal(kernel_shape, stddev=0.1)\n            self.kernels = self.get_variable(self.w_name, init)\n            self.b = self.get_variable(\n                \"b\", 0.1 + np.zeros((self.output_channels,)).astype(\"float32\")\n            )\n        input_shape = list(input_shape)\n        self.input_shape = input_shape\n        input_shape[0] = 1\n        dummy_batch = tf.zeros(input_shape)\n        dummy_output = self.fprop(dummy_batch)\n        output_shape = [int(e) for e in dummy_output.get_shape()]\n        output_shape[0] = 1\n        self.output_shape = tuple(output_shape)\n\n    def fprop_noscope(self, x):\n        return (\n            tf.nn.conv2d(\n                x, self.kernels, (1,) + tuple(self.strides) + (1,), self.padding\n            )\n            + self.b\n        )\n\n\nclass MaxPool(LayernGPU):\n    def __init__(self, ksize, strides, padding):\n        super(MaxPool, self).__init__()\n        self.__dict__.update(locals())\n        del self.self\n\n    def set_input_shape(self, input_shape):\n        input_shape = list(input_shape)\n        input_shape[0] = 1\n        dummy_batch = tf.zeros(input_shape)\n        dummy_output = self.fprop(dummy_batch)\n        output_shape = [int(e) for e in dummy_output.get_shape()]\n        output_shape[0] = 1\n        self.output_shape = tuple(output_shape)\n\n    def fprop_noscope(self, x):\n        return tf.nn.max_pool(\n            x,\n            ksize=(1,) + tuple(self.ksize) + (1,),\n            strides=(1,) + tuple(self.strides) + (1,),\n            padding=self.padding,\n        )\n\n\nclass LayerNorm(LayernGPU):\n    def set_input_shape(self, input_shape):\n        self.input_shape = list(input_shape)\n        params_shape = [input_shape[-1]]\n        self.params_shape = params_shape\n\n        self.beta = tf.get_variable(\n            \"beta\",\n            params_shape,\n            tf.float32,\n            initializer=tf.constant_initializer(0.0, tf.float32),\n            trainable=self.training,\n        )\n        self.gamma = tf.get_variable(\n            \"gamma\",\n            params_shape,\n            tf.float32,\n            initializer=tf.constant_initializer(1.0, tf.float32),\n            trainable=self.training,\n        )\n\n    def fprop_noscope(self, x):\n        mean = tf.reduce_mean(x, (1, 2), keep_dims=True)\n        x = x - mean\n        std = tf.sqrt(1e-7 + tf.reduce_mean(tf.square(x), (1, 2), keep_dims=True))\n        x = x / std\n        return x * self.gamma + self.beta\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/resnet_tf.py",
    "content": "# https://github.com/tensorflow/models/blob/master/research/resnet/resnet_model.py\n#\n# Copyright 2016 The TensorFlow Authors. All Rights Reserved.\n#\n# 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#     http://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.\n# ==============================================================================\n\n\"\"\"ResNet model.\n\nRelated papers:\nhttps://arxiv.org/pdf/1603.05027v2.pdf\nhttps://arxiv.org/pdf/1512.03385v1.pdf\nhttps://arxiv.org/pdf/1605.07146v1.pdf\n\"\"\"\nfrom collections import namedtuple\n\nimport tensorflow as tf\nimport six\n\nfrom model import MLPnGPU\nfrom model import Conv2DnGPU\nfrom model import LinearnGPU\nfrom model import LayerNorm\n\nHParams = namedtuple(\n    \"HParams\",\n    \"batch_size, nb_classes, min_lrn_rate, lrn_rate, \"\n    \"num_residual_units, use_bottleneck, weight_decay_rate, \"\n    \"relu_leakiness, momentum\",\n)\n\n\nclass ResNetTF(MLPnGPU):\n    \"\"\"ResNet model.\"\"\"\n\n    def __init__(self, batch_size=None, name=None, **kwargs):\n        NB_CLASSES = 10\n        super(ResNetTF, self).__init__(\n            nb_classes=NB_CLASSES, layers=[], input_shape=None\n        )\n        self.global_step = tf.contrib.framework.get_or_create_global_step()\n        self.hps = HParams(\n            batch_size=batch_size,\n            nb_classes=NB_CLASSES,\n            min_lrn_rate=0.0001,\n            lrn_rate=0.1,\n            num_residual_units=5,\n            use_bottleneck=False,\n            weight_decay_rate=0.0002,\n            relu_leakiness=0.1,\n            momentum=0.9,\n        )\n        self.layers = []\n        self.layer_idx = 0\n        self.init_layers = True\n        self.decay_cost = None\n        self.training = None\n        self.device_name = None\n\n    def set_training(self, training=False):\n        super(ResNetTF, self).set_training(training)\n        self.training = training\n\n    def fprop(self, x):\n        self.layer_idx = 0\n        with tf.variable_scope(\"Resnet\"):\n            logits, probs = self._build_model(x)\n        self.init_layers = False\n        states = {\"logits\": logits, \"probs\": probs}\n        return states\n\n    def _stride_arr(self, stride):\n        \"\"\"Map a stride scalar to the stride array for tf.nn.conv2d.\"\"\"\n        return [1, stride, stride, 1]\n\n    def _build_model(self, x):\n        \"\"\"Build the core model within the graph.\"\"\"\n        with tf.variable_scope(\"init\"):\n            x = self._conv(\"init_conv\", x, 3, x.shape[3], 16, self._stride_arr(1))\n\n        strides = [1, 2, 2]\n        activate_before_residual = [True, False, False]\n        if self.hps.use_bottleneck:\n            res_func = self._bottleneck_residual\n            filters = [16, 64, 128, 256]\n        else:\n            res_func = self._residual\n            filters = [16, 16, 32, 64]\n            # Uncomment the following codes to use w28-10 wide residual\n            # network.\n            # It is more memory efficient than very deep residual network and\n            # has\n            # comparably good performance.\n            # https://arxiv.org/pdf/1605.07146v1.pdf\n            # filters = [16, 160, 320, 640]\n            # Update hps.num_residual_units to 4\n\n        with tf.variable_scope(\"unit_1_0\"):\n            x = res_func(\n                x,\n                filters[0],\n                filters[1],\n                self._stride_arr(strides[0]),\n                activate_before_residual[0],\n            )\n        for i in six.moves.range(1, self.hps.num_residual_units):\n            with tf.variable_scope(\"unit_1_%d\" % i):\n                x = res_func(x, filters[1], filters[1], self._stride_arr(1), False)\n\n        with tf.variable_scope(\"unit_2_0\"):\n            x = res_func(\n                x,\n                filters[1],\n                filters[2],\n                self._stride_arr(strides[1]),\n                activate_before_residual[1],\n            )\n        for i in six.moves.range(1, self.hps.num_residual_units):\n            with tf.variable_scope(\"unit_2_%d\" % i):\n                x = res_func(x, filters[2], filters[2], self._stride_arr(1), False)\n\n        with tf.variable_scope(\"unit_3_0\"):\n            x = res_func(\n                x,\n                filters[2],\n                filters[3],\n                self._stride_arr(strides[2]),\n                activate_before_residual[2],\n            )\n        for i in six.moves.range(1, self.hps.num_residual_units):\n            with tf.variable_scope(\"unit_3_%d\" % i):\n                x = res_func(x, filters[3], filters[3], self._stride_arr(1), False)\n\n        with tf.variable_scope(\"unit_last\"):\n            x = self._layer_norm(\"final_bn\", x)\n            x = self._relu(x, self.hps.relu_leakiness)\n            x = self._global_avg_pool(x)\n\n        with tf.variable_scope(\"logit\"):\n            logits = self._fully_connected(x, self.hps.nb_classes)\n            predictions = tf.nn.softmax(logits)\n\n        return logits, predictions\n\n    def build_cost(self, labels, logits):\n        \"\"\"\n        Build the graph for cost from the logits if logits are provided.\n        If predictions are provided, logits are extracted from the operation.\n        \"\"\"\n        op = logits.op\n        if \"softmax\" in str(op).lower():\n            (logits,) = op.inputs\n\n        with tf.variable_scope(\"costs\"):\n            xent = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels)\n            cost = tf.reduce_mean(xent, name=\"xent\")\n            cost += self._decay()\n            cost = cost\n\n        return cost\n\n    def build_train_op_from_cost(self, cost):\n        \"\"\"Build training specific ops for the graph.\"\"\"\n        self.lrn_rate = tf.constant(self.hps.lrn_rate, tf.float32, name=\"learning_rate\")\n        self.momentum = tf.constant(self.hps.momentum, tf.float32, name=\"momentum\")\n\n        trainable_variables = tf.trainable_variables()\n        grads = tf.gradients(cost, trainable_variables)\n        devs = {v.device for v in trainable_variables}\n        assert len(devs) == 1, (\n            \"There should be no trainable variables\"\n            \" on any device other than the last GPU.\"\n        )\n\n        optimizer = tf.train.MomentumOptimizer(self.lrn_rate, self.momentum)\n\n        gv_pairs = zip(grads, trainable_variables)\n        gv_pairs = [gv for gv in gv_pairs if gv[0] is not None]\n        devs = {gv[1].device for gv in gv_pairs}\n        assert len(devs) == 1, \"There should be no gradients wrt\" \" vars on other GPUs.\"\n\n        apply_op = optimizer.apply_gradients(\n            gv_pairs, global_step=self.global_step, name=\"train_step\"\n        )\n\n        train_ops = [apply_op]\n        train_op = tf.group(*train_ops)\n        return train_op\n\n    def _layer_norm(self, name, x):\n        \"\"\"Layer normalization.\"\"\"\n        if self.init_layers:\n            bn = LayerNorm()\n            bn.name = name\n            self.layers += [bn]\n        else:\n            bn = self.layers[self.layer_idx]\n            self.layer_idx += 1\n        bn.device_name = self.device_name\n        bn.set_training(self.training)\n        x = bn.fprop(x)\n        return x\n\n    def _residual(\n        self, x, in_filter, out_filter, stride, activate_before_residual=False\n    ):\n        \"\"\"Residual unit with 2 sub layers.\"\"\"\n        if activate_before_residual:\n            with tf.variable_scope(\"shared_activation\"):\n                x = self._layer_norm(\"init_bn\", x)\n                x = self._relu(x, self.hps.relu_leakiness)\n                orig_x = x\n        else:\n            with tf.variable_scope(\"residual_only_activation\"):\n                orig_x = x\n                x = self._layer_norm(\"init_bn\", x)\n                x = self._relu(x, self.hps.relu_leakiness)\n\n        with tf.variable_scope(\"sub1\"):\n            x = self._conv(\"conv1\", x, 3, in_filter, out_filter, stride)\n\n        with tf.variable_scope(\"sub2\"):\n            x = self._layer_norm(\"bn2\", x)\n            x = self._relu(x, self.hps.relu_leakiness)\n            x = self._conv(\"conv2\", x, 3, out_filter, out_filter, [1, 1, 1, 1])\n\n        with tf.variable_scope(\"sub_add\"):\n            if in_filter != out_filter:\n                orig_x = tf.nn.avg_pool(orig_x, stride, stride, \"VALID\")\n                orig_x = tf.pad(\n                    orig_x,\n                    [\n                        [0, 0],\n                        [0, 0],\n                        [0, 0],\n                        [(out_filter - in_filter) // 2, (out_filter - in_filter) // 2],\n                    ],\n                )\n            x += orig_x\n\n        return x\n\n    def _bottleneck_residual(\n        self, x, in_filter, out_filter, stride, activate_before_residual=False\n    ):\n        \"\"\"Bottleneck residual unit with 3 sub layers.\"\"\"\n        if activate_before_residual:\n            with tf.variable_scope(\"common_bn_relu\"):\n                x = self._layer_norm(\"init_bn\", x)\n                x = self._relu(x, self.hps.relu_leakiness)\n                orig_x = x\n        else:\n            with tf.variable_scope(\"residual_bn_relu\"):\n                orig_x = x\n                x = self._layer_norm(\"init_bn\", x)\n                x = self._relu(x, self.hps.relu_leakiness)\n\n        with tf.variable_scope(\"sub1\"):\n            x = self._conv(\"conv1\", x, 1, in_filter, out_filter / 4, stride)\n\n        with tf.variable_scope(\"sub2\"):\n            x = self._layer_norm(\"bn2\", x)\n            x = self._relu(x, self.hps.relu_leakiness)\n            x = self._conv(\"conv2\", x, 3, out_filter / 4, out_filter / 4, [1, 1, 1, 1])\n\n        with tf.variable_scope(\"sub3\"):\n            x = self._layer_norm(\"bn3\", x)\n            x = self._relu(x, self.hps.relu_leakiness)\n            x = self._conv(\"conv3\", x, 1, out_filter / 4, out_filter, [1, 1, 1, 1])\n\n        with tf.variable_scope(\"sub_add\"):\n            if in_filter != out_filter:\n                orig_x = self._conv(\"project\", orig_x, 1, in_filter, out_filter, stride)\n            x += orig_x\n\n        return x\n\n    def _decay(self):\n        \"\"\"L2 weight decay loss.\"\"\"\n        if self.decay_cost is not None:\n            return self.decay_cost\n\n        costs = []\n        if self.device_name is None:\n            for var in tf.trainable_variables():\n                if var.op.name.find(r\"DW\") > 0:\n                    costs.append(tf.nn.l2_loss(var))\n        else:\n            for layer in self.layers:\n                for var in layer.params_device[self.device_name].values():\n                    if isinstance(var, tf.Variable) and var.op.name.find(r\"DW\") > 0:\n                        costs.append(tf.nn.l2_loss(var))\n\n        self.decay_cost = tf.multiply(self.hps.weight_decay_rate, tf.add_n(costs))\n        return self.decay_cost\n\n    def _conv(self, name, x, filter_size, in_filters, out_filters, strides):\n        \"\"\"Convolution.\"\"\"\n        if self.init_layers:\n            conv = Conv2DnGPU(\n                out_filters,\n                (filter_size, filter_size),\n                strides[1:3],\n                \"SAME\",\n                w_name=\"DW\",\n            )\n            conv.name = name\n            self.layers += [conv]\n        else:\n            conv = self.layers[self.layer_idx]\n            self.layer_idx += 1\n        conv.device_name = self.device_name\n        conv.set_training(self.training)\n        return conv.fprop(x)\n\n    def _relu(self, x, leakiness=0.0):\n        \"\"\"Relu, with optional leaky support.\"\"\"\n        return tf.where(tf.less(x, 0.0), leakiness * x, x, name=\"leaky_relu\")\n\n    def _fully_connected(self, x, out_dim):\n        \"\"\"FullyConnected layer for final output.\"\"\"\n        if self.init_layers:\n            fc = LinearnGPU(out_dim, w_name=\"DW\")\n            fc.name = \"logits\"\n            self.layers += [fc]\n        else:\n            fc = self.layers[self.layer_idx]\n            self.layer_idx += 1\n        fc.device_name = self.device_name\n        fc.set_training(self.training)\n        return fc.fprop(x)\n\n    def _global_avg_pool(self, x):\n        assert x.get_shape().ndims == 4\n        return tf.reduce_mean(x, [1, 2])\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/run_multigpu.py",
    "content": "\"\"\"\nThis script adversarially trains a model using iterative attacks on multiple\nGPUs.\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nfrom collections import namedtuple\n\nfrom cleverhans.compat import app, flags\n\nfrom trainer import TrainerMultiGPU\nfrom trainer import TrainerSingleGPU\n\n\ndef run_trainer(hparams):\n    logging.basicConfig(format=\"%(asctime)s %(message)s\", level=logging.INFO)\n\n    if \"multigpu\" in hparams.attack_type_train:\n        logging.info(\"Multi GPU Trainer.\")\n        trainer = TrainerMultiGPU(hparams)\n    else:\n        logging.info(\"Single GPU Trainer.\")\n        trainer = TrainerSingleGPU(hparams)\n    trainer.model_train()\n    trainer.eval(inc_epoch=False)\n\n    return trainer.finish()\n\n\ndef main(argv=None):\n    f = {x: flags.FLAGS[x].value for x in dir(flags.FLAGS)}\n    HParams = namedtuple(\"HParams\", f.keys())\n    hparams = HParams(**f)\n    run_trainer(hparams)\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"train_start\", 0, \"Index of first training set example.\")\n    flags.DEFINE_integer(\"train_end\", 60000, \"Index of last training set example.\")\n    flags.DEFINE_integer(\"test_start\", 0, \"Index of first test set example.\")\n    flags.DEFINE_integer(\"test_end\", 10000, \"Index of last test set example.\")\n    flags.DEFINE_integer(\"nb_epochs\", 6, \"Number of epochs to train model.\")\n    flags.DEFINE_integer(\"batch_size\", 128, \"Size of training batches.\")\n    flags.DEFINE_boolean(\"adv_train\", False, \"Whether to do adversarial training.\")\n    flags.DEFINE_boolean(\"save\", True, \"Whether to save from a checkpoint.\")\n    flags.DEFINE_string(\"save_dir\", \"runs/X\", \"Location to store logs/model.\")\n    flags.DEFINE_string(\"model_type\", \"madry\", \"Model type: basic|madry|resnet_tf.\")\n    flags.DEFINE_string(\n        \"attack_type_train\",\n        \"MadryEtAl_y_multigpu\",\n        \"Attack type for adversarial training:\\\n                        FGSM|MadryEtAl{,_y}{,_multigpu}.\",\n    )\n    flags.DEFINE_string(\n        \"attack_type_test\", \"FGSM\", \"Attack type for test: FGSM|MadryEtAl{,_y}.\"\n    )\n    flags.DEFINE_string(\"dataset\", \"mnist\", \"Dataset mnist|cifar10.\")\n    flags.DEFINE_boolean(\n        \"only_adv_train\", False, \"Do not train with clean examples when adv training.\"\n    )\n    flags.DEFINE_integer(\"save_steps\", 50, \"Save model per X steps.\")\n    flags.DEFINE_integer(\n        \"attack_nb_iter_train\", None, \"Number of iterations of training attack.\"\n    )\n    flags.DEFINE_integer(\"eval_iters\", 1, \"Evaluate every X steps.\")\n    flags.DEFINE_integer(\n        \"lrn_step\", 30000, \"Step to decrease learning rate\" \"for ResNet.\"\n    )\n    flags.DEFINE_float(\"adam_lrn\", 0.001, \"Learning rate for Adam Optimizer.\")\n    flags.DEFINE_float(\"mom_lrn\", 0.1, \"Learning rate for Momentum Optimizer.\")\n    flags.DEFINE_integer(\"ngpu\", 1, \"Number of gpus.\")\n    flags.DEFINE_integer(\"sync_step\", 1, \"Sync params frequency.\")\n    flags.DEFINE_boolean(\"fast_tests\", False, \"Fast tests against attacks.\")\n    flags.DEFINE_string(\n        \"data_path\",\n        \"./datasets/\",\n        \"Path to datasets.\" \"Each dataset should be in a subdirectory.\",\n    )\n\n    app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/runner.py",
    "content": "\"\"\"Wrappers to TensorFlow Session.run().\n\"\"\"\n# pylint: disable=missing-docstring\nfrom collections import OrderedDict\n\n\nclass Runner(object):\n    \"\"\"\n    Wrap TensorFlow Session.run() by adding preprocessing and postprocessing\n    steps.\n    \"\"\"\n\n    def __init__(self, inputs, outputs, sess=None):\n        self.sess = sess\n        self.inputs = inputs\n        self.outputs = outputs\n        self.feed_dict = {}\n\n    def run(self, X_batch=None):\n        fetches, feed_dict = self.set_input(X_batch)\n        fvals = self.sess.run(fetches, feed_dict=feed_dict)\n        return self.proc_fvals(fvals)\n\n    def set_input(self, X_batch=None):\n        raise NotImplementedError(\"set_input not implemented.\")\n\n    def proc_fvals(self, fvals):\n        raise NotImplementedError(\"proc_fvals not implemented.\")\n\n    def is_finished(self):\n        raise NotImplementedError(\"is_finished not implemented.\")\n\n\nclass RunnerMultiGPU(Runner):\n    \"\"\"\n    Runs a graph with sub-graphs that need to run sequentially. Each sub-graph\n    takes its inputs from the outputs of the previous sub-graph.\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        super(RunnerMultiGPU, self).__init__(*args, **kwargs)\n        self.assert_inputs_outputs()\n        self.next_vals = [None] * len(self.inputs)\n\n    def assert_inputs_outputs(self):\n        inputs = self.inputs\n        outputs = self.outputs\n        assert len(inputs) == len(outputs), \"Inputs and Outputs should match in length.\"\n        for i in range(len(inputs)):\n            device = inputs[i].values()[0].device\n            for _k, v in inputs[i].iteritems():\n                assert v.device == device, \"Inputs should be on the same device.\"\n            for _k, v in outputs[i].iteritems():\n                assert v.device == device, \"Outputs should be on the same device.\"\n            if i > 0:\n                ikeys = inputs[i].keys()\n                okeys = outputs[i - 1].keys()\n                # The actual requirement is looser, only the last output keys\n                # should always be returned in the same order.\n                assert all(\n                    ikeys[j] == okeys[j] for j in range(len(ikeys))\n                ), \"Inputs and outputs keys should be in the same order.\"\n\n    def set_input(self, X_batch=None):\n        \"\"\"\n        Preprocessing the inputs before calling session.run()\n\n        :param X_batch: A dictionary of inputs to the first sub-graph\n        :return: A tuple, `(fetches, fd)`, with `fetches` being a list of\n                 Tensors to be fetches and `fd` the feed dictionary.\n        \"\"\"\n        inputs = self.inputs\n        outputs = self.outputs\n\n        # data for first gpu\n        fd = {}\n        if X_batch is not None:\n            self.next_vals[0] = OrderedDict()\n            for i, vname in enumerate(self.inputs[0]):\n                if vname in X_batch:\n                    self.next_vals[0][vname] = X_batch[vname]\n                else:\n                    self.next_vals[0][vname] = None\n        else:\n            self.next_vals[0] = None\n\n        # Set `feed_dict` for each GPU. If there is something to run for that\n        # GPU, collect outputs to be fetched.\n        fetches = []\n        self.active_gpus = []\n        for i in range(len(outputs)):\n            if self.next_vals[i] is None:\n                self.active_gpus += [False]\n                continue\n            self.active_gpus += [True]\n            for k in inputs[i]:\n                if self.next_vals[i][k] is not None:\n                    fd[inputs[i][k]] = self.next_vals[i][k]\n            for k, v in outputs[i].iteritems():\n                fetches += [v]\n\n        fd.update(self.feed_dict)\n\n        return fetches, fd\n\n    def proc_fvals(self, fvals):\n        \"\"\"\n        Postprocess the outputs of the Session.run(). Move the outputs of\n        sub-graphs to next ones and return the output of the last sub-graph.\n\n        :param fvals: A list of fetched values returned by Session.run()\n        :return: A dictionary of fetched values returned by the last sub-graph.\n        \"\"\"\n        inputs = self.inputs\n        outputs = self.outputs\n\n        # Move data to the next sub-graph for the next step\n        cur = 0\n        for i in range(len(inputs) - 1):\n            if not self.active_gpus[i]:\n                self.next_vals[i + 1] = None\n                continue\n            self.next_vals[i + 1] = OrderedDict()\n            for k in outputs[i]:\n                self.next_vals[i + 1][k] = fvals[cur]\n                cur += 1\n            if i == 0:\n                self.next_vals[0] = None\n\n        # Return the output of the last sub-graph\n        last_fvals = OrderedDict()\n        if self.active_gpus[-1]:\n            assert cur + len(outputs[-1]) == len(fvals)\n            for k in outputs[-1]:\n                last_fvals[k] = fvals[cur]\n                cur += 1\n        return last_fvals\n\n    def is_finished(self):\n        return all(v is None for v in self.next_vals)\n\n\nclass RunnerSingleGPU(Runner):\n    def __init__(self, *args, **kwargs):\n        super(RunnerSingleGPU, self).__init__(*args, **kwargs)\n\n    def set_input(self, X_batch=None):\n        fd = {}\n        for vname, v in self.inputs[0].iteritems():\n            if vname in X_batch:\n                fd[v] = X_batch[vname]\n        fetches = self.outputs\n        return fetches, fd\n\n    def proc_fvals(self, fvals):\n        \"\"\"\n        Nothing to post-process on single GPU.\n        \"\"\"\n        return True\n\n    def is_finished(self):\n        \"\"\"\n        Single GPU trainer has no cache.\n        \"\"\"\n        return True\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/test_attack_multigpu.py",
    "content": "from __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport unittest\nimport numpy as np\nimport tensorflow as tf\n\nfrom attacks_multigpu import MadryEtAlMultiGPU\nfrom model import MLPnGPU\nfrom model import LayernGPU\n\n\nimport sys\nimport os\n\nsys.path.insert(0, os.path.abspath(\"../../tests_tf/\"))\nfrom test_attacks import TestMadryEtAl  # NOQA\n\n\nclass TestMadryEtAlMultiGPU(TestMadryEtAl):\n    \"\"\"\n    By inherting from `TestMadryEtAl`, the attack `MadryEtAlMultiGPU` can be\n    tested against all tests of the base attack.\n    \"\"\"\n\n    def setUp(self):\n        super(TestMadryEtAlMultiGPU, self).setUp()\n\n        class SimpleLayer(LayernGPU):\n            def set_input_shape(self, input_shape):\n                self.input_shape = input_shape\n                self.output_shape = input_shape\n                self.W1 = tf.constant([[1.5, 0.3], [-2, 0.3]], dtype=tf.float32)\n                self.W2 = tf.constant([[-2.4, 1.2], [0.5, -2.3]], dtype=tf.float32)\n\n            def fprop_noscope(self, x):\n                h1 = tf.nn.sigmoid(tf.matmul(x, self.W1))\n                res = tf.matmul(h1, self.W2)\n                return res\n\n        input_shape = (None, 2)\n        self.model_ngpu = MLPnGPU([SimpleLayer()], input_shape)\n\n        self.attack_single_gpu = self.attack\n        self.attack_multi_gpu = MadryEtAlMultiGPU(self.model_ngpu, sess=self.sess)\n        self.attack = self.attack_multi_gpu\n\n    def test_single_vs_multi_gpu(self):\n        \"\"\"\n        Compare the strength of the single GPU and multi-GPU implementations.\n        \"\"\"\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        def multi_attack(attack):\n            flags = {\n                \"ngpu\": 1,\n                \"eps\": 1.0,\n                \"eps_iter\": 0.01,\n                \"clip_min\": 0.5,\n                \"clip_max\": 0.7,\n                \"nb_iter\": 2,\n                \"rand_init\": True,\n            }\n\n            orig_labs = np.argmax(self.sess.run(self.model(x_val)), axis=1)\n            new_labs_multi = orig_labs.copy()\n            # Generate multiple adversarial examples\n            for i in range(40):\n                x_adv = attack.generate_np(x_val, **flags)\n                new_labs = np.argmax(self.sess.run(self.model(x_adv)), axis=1)\n\n                # Examples for which we have not found adversarial examples\n                indices = orig_labs == new_labs_multi\n                new_labs_multi[indices] = new_labs[indices]\n\n            return np.mean(orig_labs == new_labs_multi)\n\n        acc_s = multi_attack(self.attack_single_gpu)\n        acc_m = multi_attack(self.attack_multi_gpu)\n\n        self.assertClose(acc_s, acc_m, atol=1e-2)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/test_run_multigpu.py",
    "content": "# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nfrom collections import namedtuple\nimport unittest\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.utils import AccuracyReport\nfrom cleverhans.devtools.checks import CleverHansTest\nfrom run_multigpu import run_trainer\n\n\nclass TestRunMultiGPU(CleverHansTest):\n    def helper_run_multi_gpu_madryetal(self, extra_flags=None):\n        \"\"\"\n        Compare the single GPU performance to multiGPU performance.\n        \"\"\"\n        # Run the trainers on a dataset of reduced size\n        flags = {\n            \"train_start\": 0,\n            \"train_end\": 5000,\n            \"test_start\": 0,\n            \"test_end\": 333,\n            \"nb_epochs\": 5,\n            \"testing\": True,\n        }\n\n        # Run the multi-gpu trainer for adversarial training\n        flags.update(\n            {\n                \"batch_size\": 128,\n                \"adam_lrn\": 0.001,\n                \"dataset\": \"mnist\",\n                \"only_adv_train\": False,\n                \"eval_iters\": 1,\n                \"fast_tests\": True,\n                \"save_dir\": None,\n                \"save_steps\": 10000,\n                \"attack_nb_iter_train\": 10,\n                \"sync_step\": None,\n                \"adv_train\": True,\n                \"save\": False,\n                \"model_type\": \"basic\",\n                \"attack_type_test\": \"MadryEtAl_y\",\n            }\n        )\n        if extra_flags is not None:\n            flags.update(extra_flags)\n\n        # Run the multi-gpu trainer for adversarial training using 2 gpus\n        # trainer_multigpu by default sets `allow_soft_placement=True`\n        flags.update(\n            {\"ngpu\": 2, \"attack_type_train\": \"MadryEtAl_y_multigpu\", \"sync_step\": 1}\n        )\n        HParams = namedtuple(\"HParams\", flags.keys())\n\n        hparams = HParams(**flags)\n        np.random.seed(42)\n        tf.set_random_seed(42)\n        with tf.variable_scope(None, \"runner\"):\n            report_dict = run_trainer(hparams)\n        report_m = AccuracyReport()\n        report_m.train_adv_train_clean_eval = report_dict[\"train\"]\n        report_m.adv_train_clean_eval = report_dict[\"test\"]\n        report_m.adv_train_adv_eval = report_dict[\"MadryEtAl_y\"]\n\n        flags.update({\"ngpu\": 1, \"attack_type_train\": \"MadryEtAl_y\"})\n        hparams = HParams(**flags)\n        np.random.seed(42)\n        tf.set_random_seed(42)\n        with tf.variable_scope(None, \"runner\"):\n            report_dict = run_trainer(hparams)\n        report_s = AccuracyReport()\n        report_s.train_adv_train_clean_eval = report_dict[\"train\"]\n        report_s.adv_train_clean_eval = report_dict[\"test\"]\n        report_s.adv_train_adv_eval = report_dict[\"MadryEtAl_y\"]\n\n        self.assertClose(\n            report_s.train_adv_train_clean_eval,\n            report_m.train_adv_train_clean_eval,\n            atol=5e-2,\n        )\n        self.assertClose(\n            report_s.adv_train_clean_eval, report_m.adv_train_clean_eval, atol=2e-2\n        )\n        self.assertClose(\n            report_s.adv_train_adv_eval, report_m.adv_train_adv_eval, atol=5e-2\n        )\n\n    def test_run_single_gpu_fgsm(self):\n        \"\"\"\n        Test the basic single GPU performance by comparing to the FGSM\n        tutorial.\n        \"\"\"\n        from cleverhans_tutorials import mnist_tutorial_tf\n\n        # Run the MNIST tutorial on a dataset of reduced size\n        flags = {\n            \"train_start\": 0,\n            \"train_end\": 5000,\n            \"test_start\": 0,\n            \"test_end\": 333,\n            \"nb_epochs\": 5,\n            \"testing\": True,\n        }\n        report = mnist_tutorial_tf.mnist_tutorial(**flags)\n\n        # Run the multi-gpu trainer for clean training\n        flags.update(\n            {\n                \"batch_size\": 128,\n                \"adam_lrn\": 0.001,\n                \"dataset\": \"mnist\",\n                \"only_adv_train\": False,\n                \"eval_iters\": 1,\n                \"ngpu\": 1,\n                \"fast_tests\": False,\n                \"attack_type_train\": \"\",\n                \"save_dir\": None,\n                \"save_steps\": 10000,\n                \"attack_nb_iter_train\": None,\n                \"save\": False,\n                \"model_type\": \"basic\",\n                \"attack_type_test\": \"FGSM\",\n            }\n        )\n\n        flags.update({\"adv_train\": False})\n        HParams = namedtuple(\"HParams\", flags.keys())\n\n        hparams = HParams(**flags)\n        np.random.seed(42)\n        tf.set_random_seed(42)\n        with tf.variable_scope(None, \"runner\"):\n            report_dict = run_trainer(hparams)\n        report_2 = AccuracyReport()\n        report_2.train_clean_train_clean_eval = report_dict[\"train\"]\n        report_2.clean_train_clean_eval = report_dict[\"test\"]\n        report_2.clean_train_adv_eval = report_dict[\"FGSM\"]\n\n        # Run the multi-gpu trainer for adversarial training\n        flags.update({\"adv_train\": True, \"attack_type_train\": \"FGSM\"})\n        HParams = namedtuple(\"HParams\", flags.keys())\n\n        hparams = HParams(**flags)\n        np.random.seed(42)\n        tf.set_random_seed(42)\n        with tf.variable_scope(None, \"runner\"):\n            report_dict = run_trainer(hparams)\n        report_2.train_adv_train_clean_eval = report_dict[\"train\"]\n        report_2.adv_train_clean_eval = report_dict[\"test\"]\n        report_2.adv_train_adv_eval = report_dict[\"FGSM\"]\n\n        self.assertClose(\n            report.train_clean_train_clean_eval,\n            report_2.train_clean_train_clean_eval,\n            atol=5e-2,\n        )\n        self.assertClose(\n            report.clean_train_clean_eval, report_2.clean_train_clean_eval, atol=2e-2\n        )\n        self.assertClose(\n            report.clean_train_adv_eval, report_2.clean_train_adv_eval, atol=5e-2\n        )\n        self.assertClose(\n            report.train_adv_train_clean_eval,\n            report_2.train_adv_train_clean_eval,\n            atol=1e-1,\n        )\n        self.assertClose(\n            report.adv_train_clean_eval, report_2.adv_train_clean_eval, atol=2e-2\n        )\n        self.assertClose(\n            report.adv_train_adv_eval, report_2.adv_train_adv_eval, atol=1e-1\n        )\n\n    def test_run_multi_gpu_madryetal(self):\n        self.helper_run_multi_gpu_madryetal()\n\n    def test_run_multi_gpu_naive(self):\n        self.helper_run_multi_gpu_madryetal({\"adv_train\": False})\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/test_runner.py",
    "content": "# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport unittest\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.devtools.checks import CleverHansTest\n\nfrom runner import RunnerMultiGPU\n\n\nclass TestRunnerMultiGPU(CleverHansTest):\n    def setUp(self):\n        super(TestRunnerMultiGPU, self).setUp()\n        self.sess = tf.Session()\n\n        inputs = []\n        outputs = []\n        self.niter = 10\n        niter = self.niter\n        # A Simple graph with `niter` sub-graphs.\n        with tf.variable_scope(None, \"runner\"):\n            for i in range(niter):\n                v = tf.get_variable(\"v%d\" % i, shape=(100, 10))\n                w = tf.get_variable(\"w%d\" % i, shape=(100, 1))\n\n                inputs += [{\"v\": v, \"w\": w}]\n                outputs += [{\"v\": v, \"w\": w}]\n\n        self.runner = RunnerMultiGPU(inputs, outputs, sess=self.sess)\n\n    def help_test_runner(self, ninputs, niter):\n        \"\"\"\n        Tests the MultiGPU runner by feeding in random Tensors for `ninputs`\n        steps. Then validating the output after `niter-1` steps.\n        \"\"\"\n        v_val = []\n        w_val = []\n        for i in range(ninputs):\n            v_val += [np.random.rand(100, 10)]\n            w_val += [np.random.rand(100, 1)]\n            fvals = self.runner.run({\"v\": v_val[i], \"w\": w_val[i]})\n            self.assertTrue(len(fvals) == 0)\n            self.assertFalse(self.runner.is_finished())\n\n        for i in range(niter - ninputs - 1):\n            self.assertFalse(self.runner.is_finished())\n            fvals = self.runner.run()\n            self.assertTrue(len(fvals) == 0)\n            self.assertFalse(self.runner.is_finished())\n\n        for i in range(ninputs):\n            self.assertFalse(self.runner.is_finished())\n            fvals = self.runner.run()\n            self.assertTrue(\"v\" in fvals and \"w\" in fvals)\n            self.assertTrue(np.allclose(fvals[\"v\"], v_val[i]))\n            self.assertTrue(np.allclose(fvals[\"w\"], w_val[i]))\n\n        self.assertTrue(self.runner.is_finished())\n\n    def test_queue_full(self):\n        self.help_test_runner(self.niter - 1, self.niter)\n\n    def test_queue_half(self):\n        self.help_test_runner(self.niter // 2, self.niter)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/trainer.py",
    "content": "\"\"\"\nThis module provides Trainer classes that given a set of flags, create,\ninitialize and train a model. These classes use Runner objects to handle\nmultigpu/singlegpu training.\n\"\"\"\n# pylint: disable=missing-docstring\nfrom collections import OrderedDict\nimport logging\nimport math\nimport time\nimport os\n\nimport numpy as np\nimport six\nimport tensorflow as tf\n\nfrom cleverhans.utils_tf import batch_indices\nfrom cleverhans.utils_mnist import data_mnist\nimport utils_cifar as cifar_input\nimport utils_svhn as svhn_input\nfrom utils import preprocess_batch\n\nfrom make_model import make_model\nfrom evaluator import Evaluator\nfrom evaluator import create_adv_by_name\nfrom model import clone_variable\n\n\nclass TrainManager(object):\n    \"\"\"\n    The base trainer class. Given an object of `hparams`, a trainer\n    creates and initializes a model. After initialization, the method\n    `model_train` can be used to train the model.\n    \"\"\"\n\n    def __init__(self, hparams):\n        \"\"\"\n        :param hparams: An instance of collections.namedtuple specifying the\n                        model type and training configs. The parameters are\n                        documented in `run_multigpu.py`.\n        \"\"\"\n        self.hparams = hparams\n        self.batch_size = hparams.batch_size\n        self.evaluate = None\n        self.step_num = 0\n        self.report = None\n        self._init_session()\n        self._init_data()\n        self._init_inputs()\n        self._init_model()\n        self._create_train_graph()\n        self._init_eval()\n        self.runner = None\n\n    def _init_session(self):\n        # Set TF random seed to improve reproducibility\n        self.rng = np.random.RandomState([2017, 8, 30])\n        tf.set_random_seed(1234)\n\n        # Create TF session\n        self.sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True))\n\n        # Object used to keep track of (and return) key accuracies\n        if self.hparams.save:\n            self.writer = tf.summary.FileWriter(self.hparams.save_dir, flush_secs=10)\n        else:\n            self.writer = None\n\n    def _init_data(self):\n        hparams = self.hparams\n        batch_size = hparams.batch_size\n        if hparams.dataset == \"mnist\":\n            # Get MNIST test data\n            X_train, Y_train, X_test, Y_test = data_mnist(\n                train_start=hparams.train_start,\n                train_end=hparams.train_end,\n                test_start=hparams.test_start,\n                test_end=hparams.test_end,\n            )\n            input_shape = (batch_size, 28, 28, 1)\n            preproc_func = None\n        elif hparams.dataset == \"cifar10\":\n            X_train, Y_train, X_test, Y_test = cifar_input.read_CIFAR10(\n                os.path.join(hparams.data_path, hparams.dataset)\n            )\n            input_shape = (batch_size, 32, 32, 3)\n            preproc_func = cifar_input.cifar_tf_preprocess\n        elif hparams.dataset == \"svhn\":\n            X_train, Y_train, X_test, Y_test = svhn_input.read_SVHN(\n                os.path.join(hparams.data_path, hparams.dataset)\n            )\n            input_shape = (batch_size, 32, 32, 3)\n            preproc_func = svhn_input.svhn_tf_preprocess\n\n        # Use label smoothing\n        assert Y_train.shape[1] == 10.0\n        label_smooth = 0.1\n        Y_train = Y_train.clip(label_smooth / 9.0, 1.0 - label_smooth)\n\n        self.X_train = X_train\n        self.Y_train = Y_train\n        self.X_test = X_test\n        self.Y_test = Y_test\n        self.data = (X_train, Y_train, X_test, Y_test)\n        self.input_shape = input_shape\n        self.preproc_func = preproc_func\n\n    def _init_inputs(self):\n        preproc_func = self.preproc_func\n        input_shape = self.input_shape\n        # Define input TF placeholder\n        with tf.device(\"/gpu:0\"):\n            x_pre = tf.placeholder(tf.float32, shape=input_shape, name=\"x\")\n            x = preprocess_batch(x_pre, preproc_func)\n            y = tf.placeholder(tf.float32, shape=(self.batch_size, 10), name=\"y\")\n\n        self.g0_inputs = {\"x_pre\": x_pre, \"x\": x, \"y\": y}\n\n    def _init_model(self):\n        flags = self.hparams.__dict__\n        # Define TF model graph\n        model = make_model(input_shape=self.input_shape, **flags)\n        model.set_device(None)\n        self.model = model\n\n    def _init_eval(self):\n        logging.info(\"Init eval\")\n        x_pre, x, y = [self.g0_inputs[k] for k in [\"x_pre\", \"x\", \"y\"]]\n        self.model.set_device(\"/gpu:0\")\n        self.evaluate = Evaluator(\n            self.sess,\n            self.model,\n            self.batch_size,\n            x_pre,\n            x,\n            y,\n            self.data,\n            self.writer,\n            self.hparams,\n        )\n\n    def eval(self, **kwargs):\n        if self.evaluate is not None:\n            self.report = self.evaluate.eval_multi()\n\n    def finish(self):\n        if self.writer:\n            self.writer.close()\n        return self.report\n\n    def _update_learning_params(self):\n        model = self.model\n        hparams = self.hparams\n        fd = self.runner.feed_dict\n        step_num = self.step_num\n\n        if hparams.model_type == \"resnet_tf\":\n            if step_num < hparams.lrn_step:\n                lrn_rate = hparams.mom_lrn\n            elif step_num < 30000:\n                lrn_rate = hparams.mom_lrn / 10\n            elif step_num < 35000:\n                lrn_rate = hparams.mom_lrn / 100\n            else:\n                lrn_rate = hparams.mom_lrn / 1000\n\n            fd[model.lrn_rate] = lrn_rate\n\n    def _build_train_op(self, predictions, y, predictions_adv):\n        model = self.model\n        hparams = self.hparams\n        if hparams.model_type == \"resnet_tf\":\n            build_train_op = model.build_cost\n        else:\n            raise NotImplementedError(\n                \"this configuration of this example is no longer maintained\"\n            )\n\n        # Define loss\n        with tf.variable_scope(\"train_loss\"):\n            if predictions_adv is not None:\n                if hparams.only_adv_train:\n                    loss = build_train_op(y, predictions_adv)\n                else:\n                    loss = build_train_op(y, predictions)\n                    adv_loss = build_train_op(y, predictions_adv)\n                    loss = (loss + adv_loss) / 2\n            else:\n                loss = build_train_op(y, predictions)\n\n        if hparams.model_type == \"resnet_tf\":\n            train_step = model.build_train_op_from_cost(loss)\n        else:\n            optim = tf.train.AdamOptimizer(learning_rate=hparams.adam_lrn)\n            train_step = optim.minimize(loss)\n\n        return train_step\n\n    def model_train(self):\n        \"\"\"\n        Train a TF graph\n        :param sess: TF session to use when training the graph\n        :param x: input placeholder\n        :param y: output placeholder (for labels)\n        :param predictions: model output predictions\n        :param X_train: numpy array with training inputs\n        :param Y_train: numpy array with training outputs\n        :param hparams.save: boolean controlling the save operation\n        :param predictions_adv: if set with the adversarial example tensor,\n                                will run adversarial training\n        :param evaluate: function that is run after each training iteration\n                        (typically to display the test/validation accuracy).\n        \"\"\"\n\n        assert (\n            self.runner is not None\n        ), \"\"\"Runner is not initialized. TrainerSingleGPU or TrainerMultiGPU\n            instantiate a Runner object at initialization time.\"\"\"\n        hparams = self.hparams\n        batch_size = hparams.batch_size\n        nb_epochs = hparams.nb_epochs\n        train_dir = hparams.save_dir\n        filename = \"model.ckpt\"\n        X_train = self.X_train\n        Y_train = self.Y_train\n\n        sess = self.sess\n\n        with sess.as_default():\n            X_batch = X_train[:batch_size]\n            Y_batch = Y_train[:batch_size]\n            self._init_tf(X_batch, Y_batch)\n\n            for epoch in six.moves.xrange(nb_epochs):\n                logging.info(\"Epoch \" + str(epoch))\n\n                # Compute number of batches\n                nb_batches = int(math.ceil(float(len(X_train)) / batch_size))\n                assert nb_batches * batch_size >= len(X_train)\n\n                # Indices to shuffle training set\n                index_shuf = list(range(len(X_train)))\n                self.rng.shuffle(index_shuf)\n\n                prev = time.time()\n                for batch in range(nb_batches):\n                    # Compute batch start and end indices\n                    start, end = batch_indices(batch, len(X_train), batch_size)\n\n                    # Perform one training step\n                    self._update_learning_params()\n\n                    # Train step\n                    X_batch = X_train[index_shuf[start:end]]\n                    Y_batch = Y_train[index_shuf[start:end]]\n\n                    self._run({\"x_pre\": X_batch, \"y\": Y_batch})\n                    self._sync_params()\n\n                # Clean up the queue\n                while not self.runner.is_finished():\n                    self._run()\n\n                self._sync_params(forced=True)\n\n                assert end >= len(X_train), \"Not all training examples are used.\"\n                cur = time.time()\n                logging.info(\"\\tEpoch took \" + str(cur - prev) + \" seconds\")\n                prev = cur\n\n                self.eval()\n\n                # Save model\n                cond = (epoch + 1) % hparams.save_steps == 0 or epoch == nb_epochs\n                if hparams.save and cond:\n                    save_path = os.path.join(train_dir, filename)\n                    saver = tf.train.Saver()\n                    saver.save(sess, save_path)\n                    logging.info(\"Model saved at: \" + str(save_path))\n        logging.info(\"Completed model training.\")\n\n    def _init_tf(self, X_batch, Y_batch):\n        x_pre = self.g0_inputs[\"x_pre\"]\n        y = self.g0_inputs[\"y\"]\n        fd = {x_pre: X_batch, y: Y_batch}\n        init_op = tf.global_variables_initializer()\n        self.sess.run(init_op, feed_dict=fd)\n\n    def _run(self, X_batch=None):\n        last_fvals = self.runner.run(X_batch)\n        self.step_num += 1\n        return last_fvals\n\n    def _sync_params(self, forced=False):\n        raise NotImplementedError(\"sync_params should be implemented.\")\n\n    def _create_train_graph(self):\n        \"\"\"\n        The evaluation graph must be initialized after the train graph is\n        fully initialized, otherwise, some of the variables will be created\n        untrainable.\n        \"\"\"\n        assert (\n            self.evaluate is None\n        ), \"\"\"Evaluation graph should be initialzed\n                                       after the train graph\"\"\"\n\n\nclass TrainerMultiGPU(TrainManager):\n    \"\"\"\n    This class uses a `RunnerMultiGPU` object to train a model on multiple\n    GPUs. It mainly overrides the `_create_train_graph` to create a graph\n    for adversarial training on multiple GPUs.\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        super(TrainerMultiGPU, self).__init__(*args, **kwargs)\n        from runner import RunnerMultiGPU\n\n        self.runner = RunnerMultiGPU(self.inputs, self.outputs, sess=self.sess)\n\n    def clone_g0_inputs_on_ngpus(self, inputs, outputs, g0_inputs):\n        \"\"\"\n        Clone variables unused by the attack on all GPUs. Specifically, the\n        ground-truth label, y, has to be preserved until the training step.\n\n        :param inputs: A list of dictionaries as the inputs to each step.\n        :param outputs: A list of dictionaries as the outputs of each step.\n        :param g0_inputs: Initial variables to be cloned.\n        :return: Updated inputs and outputs.\n        \"\"\"\n        assert len(inputs) == len(\n            outputs\n        ), \"Inputs and outputs should have the same number of elements.\"\n\n        inputs[0].update(g0_inputs)\n        outputs[0].update(g0_inputs)\n\n        # Copy g0_inputs forward\n        for i in range(1, len(inputs)):\n            # Create the graph for i'th step of attack\n            device_name = inputs[i][\"x\"].device\n            with tf.device(device_name):\n                with tf.variable_scope(\"step%d\" % i):\n                    for k, v in g0_inputs.iteritems():\n                        if k not in inputs[i]:\n                            v_copy = clone_variable(k, v)\n                            inputs[i][k] = v_copy\n                            outputs[i][k] = v_copy\n\n        return inputs, outputs\n\n    def _create_train_graph(self):\n        super(TrainerMultiGPU, self)._create_train_graph()\n        assert \"_multigpu\" in self.hparams.attack_type_train\n\n        hparams = self.hparams\n        model = self.model\n        sess = self.sess\n\n        # Create trainable variables on last gpu.\n        # Variables are set to trainable or non-trainable first time they are\n        # created. This caused a bug when the last gpu is used both for attack\n        # generation and training. With this bug the result of naive training\n        # was affected by the length of the unused adversarial generation\n        # graph.\n        device_name = \"/gpu:%d\" % (hparams.ngpu - 1)\n        model.set_device(device_name)\n        with tf.device(device_name):\n            x = clone_variable(\"x\", self.g0_inputs[\"x\"])\n            model.set_training(training=True)\n            preds = model.get_probs(x)\n\n        # Generates steps on gpus\n        model.set_training(training=False)\n        logging.info(\"Initializing train attack %s\" % hparams.attack_type_train)\n        inputs, outputs = create_adv_by_name(\n            model,\n            self.g0_inputs[\"x\"],\n            hparams.attack_type_train,\n            sess,\n            y=self.g0_inputs[\"y\"],\n            nb_iter=hparams.attack_nb_iter_train,\n            dataset=hparams.dataset,\n            ngpu=hparams.ngpu,\n        )\n\n        inputs, outputs = self.clone_g0_inputs_on_ngpus(inputs, outputs, self.g0_inputs)\n\n        # Train step on last gpu\n        device_name = \"/gpu:%d\" % (hparams.ngpu - 1)\n        model.set_device(device_name)\n        with tf.device(device_name):\n            with tf.variable_scope(\"last\"):\n                inputs += [OrderedDict()]\n                for k, v in outputs[-1].iteritems():\n                    v_copy = clone_variable(k, v)\n                    inputs[-1][k] = v_copy\n                x = inputs[-1][\"x\"]\n                adv_x = inputs[-1][\"adv_x\"]\n                y = inputs[-1][\"y\"]\n                if not hparams.adv_train:\n                    model.set_training(training=True)\n                    preds = model.get_probs(x)\n                    preds_adv = None\n                elif not hparams.only_adv_train:\n                    model.set_training(training=True)\n                    preds = model.get_probs(x)\n                    model.set_training(training=True)\n                    preds_adv = model.get_probs(adv_x)\n                else:\n                    preds = None\n                    model.set_training(training=True)\n                    preds_adv = model.get_probs(adv_x)\n                train_fetches = self._build_train_op(preds, y, preds_adv)\n\n        outputs += [{\"fetches\": train_fetches}]\n\n        # Create the sync operation\n        device_name = \"/gpu:%d\" % (hparams.ngpu - 1)\n        model.set_device(device_name)\n        with tf.device(device_name):\n            sync_ops = model.create_sync_ops(host_device=device_name)\n\n        self.inputs = inputs\n        self.outputs = outputs\n        self.sync_ops = sync_ops\n\n    def _sync_params(self, forced=False):\n        if forced or (self.step_num % self.hparams.sync_step == 0):\n            self.sess.run(self.sync_ops)\n\n\nclass TrainerSingleGPU(TrainManager):\n    \"\"\"\n    This class uses a `RunnerSingleGPU` object to train a model on a single\n    GPU.\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        super(TrainerSingleGPU, self).__init__(*args, **kwargs)\n        from runner import RunnerSingleGPU\n\n        self.runner = RunnerSingleGPU(self.inputs, self.outputs, sess=self.sess)\n\n    def _create_train_graph(self):\n        super(TrainerSingleGPU, self)._create_train_graph()\n        self.model.set_device(\"/gpu:0\")\n        hparams = self.hparams\n        model = self.model\n        x = self.g0_inputs[\"x\"]\n        y = self.g0_inputs[\"y\"]\n        sess = self.sess\n\n        # Create trainable variables.\n        model.set_training(training=True)\n        preds = model.get_probs(x)\n\n        if not hparams.adv_train:\n            logging.info(\"Naive training\")\n\n            model.set_training(training=True)\n            preds = model.get_probs(x)\n            preds_adv = None\n        else:\n            logging.info(\"Adversarial training\")\n            logging.info(\"Initializing train attack %s\" % hparams.attack_type_train)\n\n            model.set_training(training=False)\n            adv_x = create_adv_by_name(\n                model,\n                x,\n                hparams.attack_type_train,\n                sess,\n                y=y,\n                nb_iter=hparams.attack_nb_iter_train,\n                dataset=hparams.dataset,\n            )\n            if hparams.only_adv_train:\n                preds = None\n                model.set_training(training=True)\n                preds_adv = model.get_probs(adv_x)\n            else:\n                model.set_training(training=True)\n                preds = model.get_probs(x)\n                model.set_training(training=True)\n                preds_adv = model.get_probs(adv_x)\n        train_fetches = self._build_train_op(preds, y, preds_adv)\n\n        self.inputs = [self.g0_inputs]\n        self.outputs = [train_fetches]\n\n    def _sync_params(self, forced=False):\n        \"\"\"\n        Nothing to sync on single GPU.\n        \"\"\"\n        return True\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/utils.py",
    "content": "# pylint: disable=missing-docstring\nimport tensorflow as tf\n\n\ndef preprocess_batch(images_batch, preproc_func=None):\n    \"\"\"\n    Creates a preprocessing graph for a batch given a function that processes\n    a single image.\n\n    :param images_batch: A tensor for an image batch.\n    :param preproc_func: (optional function) A function that takes in a\n        tensor and returns a preprocessed input.\n    \"\"\"\n    if preproc_func is None:\n        return images_batch\n\n    with tf.variable_scope(\"preprocess\"):\n        images_list = tf.split(images_batch, int(images_batch.shape[0]))\n        result_list = []\n        for img in images_list:\n            reshaped_img = tf.reshape(img, img.shape[1:])\n            processed_img = preproc_func(reshaped_img)\n            result_list.append(tf.expand_dims(processed_img, axis=0))\n        result_images = tf.concat(result_list, axis=0)\n    return result_images\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/utils_cifar.py",
    "content": "\"\"\"\nhttps://github.com/renmengye/revnet-public/blob/master/resnet/data/cifar_input.py\n\nMIT License\n\nCopyright (c) 2017 Mengye Ren\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport os\nimport cPickle as pkl\n\nimport numpy as np\nfrom six.moves import range\nimport tensorflow as tf\n\n# Global constants describing the CIFAR-10 data set.\nIMAGE_HEIGHT = 32\nIMAGE_WIDTH = 32\nNUM_CLASSES = 10\nNUM_CHANNEL = 3\nNUM_TRAIN_IMG = 50000\nNUM_TEST_IMG = 10000\n\n\ndef unpickle(file):\n    fo = open(file, \"rb\")\n    dict = pkl.load(fo)\n    fo.close()\n    return dict\n\n\ndef read_CIFAR10(data_folder):\n    \"\"\" Reads and parses examples from CIFAR10 data files \"\"\"\n\n    train_img = []\n    train_label = []\n    test_img = []\n    test_label = []\n\n    train_file_list = [\n        \"data_batch_1\",\n        \"data_batch_2\",\n        \"data_batch_3\",\n        \"data_batch_4\",\n        \"data_batch_5\",\n    ]\n    test_file_list = [\"test_batch\"]\n\n    if \"CIFAR10_PATH\" in os.environ:\n        cifar10_path = os.environ[\"CIFAR10_PATH\"]\n    else:\n        cifar10_path = \"cifar-10-batches-py\"\n\n    for i in range(len(train_file_list)):\n        tmp_dict = unpickle(os.path.join(data_folder, cifar10_path, train_file_list[i]))\n\n        train_img.append(tmp_dict[\"data\"])\n        train_label.append(tmp_dict[\"labels\"])\n\n    tmp_dict = unpickle(os.path.join(data_folder, cifar10_path, test_file_list[0]))\n    test_img.append(tmp_dict[\"data\"])\n    test_label.append(tmp_dict[\"labels\"])\n\n    train_img = np.concatenate(train_img)\n    train_label = np.concatenate(train_label)\n    test_img = np.concatenate(test_img)\n    test_label = np.concatenate(test_label)\n\n    train_img = np.reshape(\n        train_img, [NUM_TRAIN_IMG, NUM_CHANNEL, IMAGE_HEIGHT, IMAGE_WIDTH]\n    )\n    test_img = np.reshape(\n        test_img, [NUM_TEST_IMG, NUM_CHANNEL, IMAGE_HEIGHT, IMAGE_WIDTH]\n    )\n\n    # change format from [B, C, H, W] to [B, H, W, C] for feeding to Tensorflow\n    train_img = np.transpose(train_img, [0, 2, 3, 1])\n    test_img = np.transpose(test_img, [0, 2, 3, 1])\n\n    mean_img = np.mean(np.concatenate([train_img, test_img]), axis=0)\n\n    CIFAR10_data = {}\n    CIFAR10_data[\"train_img\"] = train_img - mean_img\n    CIFAR10_data[\"test_img\"] = test_img - mean_img\n    CIFAR10_data[\"train_label\"] = train_label\n    CIFAR10_data[\"test_label\"] = test_label\n\n    train_img = train_img - mean_img\n    test_img = test_img - mean_img\n    train_label = train_label\n    test_label = test_label\n\n    train_label = np.eye(10)[train_label]\n    test_label = np.eye(10)[test_label]\n\n    return train_img, train_label, test_img, test_label\n\n\ndef read_CIFAR100(data_folder):\n    \"\"\" Reads and parses examples from CIFAR100 python data files \"\"\"\n\n    train_img = []\n    train_label = []\n    test_img = []\n    test_label = []\n\n    train_file_list = [\"cifar-100-python/train\"]\n    test_file_list = [\"cifar-100-python/test\"]\n\n    tmp_dict = unpickle(os.path.join(data_folder, train_file_list[0]))\n    train_img.append(tmp_dict[\"data\"])\n    train_label.append(tmp_dict[\"fine_labels\"])\n\n    tmp_dict = unpickle(os.path.join(data_folder, test_file_list[0]))\n    test_img.append(tmp_dict[\"data\"])\n    test_label.append(tmp_dict[\"fine_labels\"])\n\n    train_img = np.concatenate(train_img)\n    train_label = np.concatenate(train_label)\n    test_img = np.concatenate(test_img)\n    test_label = np.concatenate(test_label)\n\n    train_img = np.reshape(\n        train_img, [NUM_TRAIN_IMG, NUM_CHANNEL, IMAGE_HEIGHT, IMAGE_WIDTH]\n    )\n    test_img = np.reshape(\n        test_img, [NUM_TEST_IMG, NUM_CHANNEL, IMAGE_HEIGHT, IMAGE_WIDTH]\n    )\n\n    # change format from [B, C, H, W] to [B, H, W, C] for feeding to Tensorflow\n    train_img = np.transpose(train_img, [0, 2, 3, 1])\n    test_img = np.transpose(test_img, [0, 2, 3, 1])\n    mean_img = np.mean(np.concatenate([train_img, test_img]), axis=0)\n\n    CIFAR100_data = {}\n    CIFAR100_data[\"train_img\"] = train_img - mean_img\n    CIFAR100_data[\"test_img\"] = test_img - mean_img\n    CIFAR100_data[\"train_label\"] = train_label\n    CIFAR100_data[\"test_label\"] = test_label\n\n    return CIFAR100_data\n\n\ndef cifar_tf_preprocess(\n    inp, random_crop=True, random_flip=True, whiten=True, br_sat_con=False\n):\n    image_size = 32\n    image = inp\n    if random_crop:\n        image = tf.image.resize_image_with_crop_or_pad(\n            inp, image_size + 4, image_size + 4\n        )\n        image = tf.random_crop(image, [image_size, image_size, 3])\n    if random_flip:\n        image = tf.image.random_flip_left_right(image)\n    # Brightness/saturation/constrast provides small gains .2%~.5% on cifar.\n    if br_sat_con:\n        image = tf.image.random_brightness(image, max_delta=63.0 / 255.0)\n        image = tf.image.random_saturation(image, lower=0.5, upper=1.5)\n        image = tf.image.random_contrast(image, lower=0.2, upper=1.8)\n    if whiten:\n        image = tf.image.per_image_standardization(image)\n    return image\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/multigpu_advtrain/utils_svhn.py",
    "content": "\"\"\"\nReading the SVHN dataset. It is derived from CIFAR10 scripts in RevNets code.\n\nhttps://github.com/renmengye/revnet-public/blob/master/resnet/data/cifar_input.py\n\nMIT License\n\nCopyright (c) 2017 Mengye Ren\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport os\n\nimport numpy as np\nfrom six.moves import range\nimport tensorflow as tf\nimport scipy.io as sio\n\n# Global constants describing the SVHN data set.\nIMAGE_HEIGHT = 32\nIMAGE_WIDTH = 32\nNUM_CLASSES = 10\nNUM_CHANNEL = 3\nNUM_TRAIN_IMG = 73257 + 531131\nNUM_TEST_IMG = 26032\n\n\ndef read_SVHN(data_folder):\n    \"\"\" Reads and parses examples from SVHN data files \"\"\"\n\n    train_img = []\n    train_label = []\n    test_img = []\n    test_label = []\n\n    train_file_list = [\"train_32x32.mat\", \"extra_32x32.mat\"]\n    test_file_list = [\"test_32x32.mat\"]\n\n    for i in range(len(train_file_list)):\n        tmp_dict = sio.loadmat(os.path.join(data_folder, train_file_list[i]))\n        train_img.append(tmp_dict[\"X\"])\n        train_label.append(tmp_dict[\"y\"])\n\n    tmp_dict = sio.loadmat(os.path.join(data_folder, test_file_list[0]))\n    test_img.append(tmp_dict[\"X\"])\n    test_label.append(tmp_dict[\"y\"])\n\n    train_img = np.concatenate(train_img, axis=-1)\n    train_label = np.concatenate(train_label).flatten()\n    test_img = np.concatenate(test_img, axis=-1)\n    test_label = np.concatenate(test_label).flatten()\n\n    # change format from [H, W, C, B] to [B, H, W, C] for feeding to Tensorflow\n    train_img = np.transpose(train_img, [3, 0, 1, 2])\n    test_img = np.transpose(test_img, [3, 0, 1, 2])\n\n    mean_img = np.mean(np.concatenate([train_img, test_img]), axis=0)\n\n    train_img = train_img - mean_img\n    test_img = test_img - mean_img\n    train_y = train_label - 1  # 0-based label\n    test_y = test_label - 1  # 0-based label\n\n    train_label = np.eye(10)[train_y]\n    test_label = np.eye(10)[test_y]\n\n    return train_img, train_label, test_img, test_label\n\n\ndef svhn_tf_preprocess(inp, random_crop=True):\n    image_size = 32\n    image = inp\n    if random_crop:\n        print(\"Apply random cropping\")\n        image = tf.image.resize_image_with_crop_or_pad(\n            inp, image_size + 4, image_size + 4\n        )\n        image = tf.random_crop(image, [image_size, image_size, 3])\n    return inp, image\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/.gitignore",
    "content": "# ignore Tensorflow checkpoints\n*.ckpt\n# ignore dataset images\ndataset/images\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/README.md",
    "content": "# NIPS17 Adversarial Attacks and Defenses Competition\n\nThis directory includes all code which was used to run\nadversarial attacks and defenses competition which was conducted as a part of\n[NIPS17 competition track](https://nips.cc/Conferences/2017/CompetitionTrack).\n\nDirectory has following structure:\n\n* `dataset/` - directory with datasets.\n* `dev_toolkit/` - development toolkit which was shared with participants during the competition.\n* `eval_infra/` - code of evaluation infrastructure which was used to run the competition.\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dataset/README.md",
    "content": "\n# Dataset for adversarial competition.\n\nTwo datasets were used for the competition:\n\n* **DEV** dataset which was available for the development and experimenting\n  during the competition.\n* **FINAL** dataset which was kept secret until after the competition\n  and was used for final scoring.\n\nBoth datasets are composed from publicly available images which were posted\nonline under CC-BY license.\n\n## Dataset format\n\nEach dataset is described by\n[CSV](https://en.wikipedia.org/wiki/Comma-separated_values)\nfile with URLs of the images, their bounding boxes,\nclassification labels and some other metadata.\n\n`dev_dataset.csv` contains description of DEV dataset and\n`final_dataset.csv` contains description of FINAL dataset.\n\nFile with the dataset description contains following columns:\n\n* **ImageId** - id of the image.\n* **URL** - URL of the image.\n* **x1**, **y1**, **x2**, **y2** - bounding box of the area of interest in\n  the image. Bounding box is relative, which means that all coordinates are\n  between 0 and 1.\n* **TrueLabel** - true label of the image.\n* **TargetClass** - label for targeted adversarial attack.\n* **OriginalLandingURL** - original landing page where this image was found.\n* **License** - licence under which image was distributed by author.\n* **Author** - author of the image.\n* **AuthorProfileURL** - URL of the author's profile.\n\nDataset is labelled with\n[ImageNet](http://www.image-net.org/challenges/LSVRC/2012/) labels.\nSpecific values of labels are compatible with pre-trained Inception models,\nwhich are available as a part of\n[TF-Slim](https://github.com/tensorflow/models/tree/master/slim).\nIn particular pre-trained Inception v3 and InceptionResnet v2\ncould be used to classify dataset with high accuracy.\nNote that TF-Slim ImageNet labels are from 1 to 1000 and label 0 is unused.\n\n## Downloading images\n\nFile with the dataset description contains only URLs of the images.\nActual images have to be downloaded before being used for experiments.\n\n`download_images.py` is a Python program which downloads images for all\nrecords in the dataset file. Usage:\n\n```\n# Replace CSV_FILE with path to dev_dataset.csv or final_dataset.csv\nCSV_FILE=dev_dataset.csv\n# Replace OUTPUT_DIR with path to directory where all images should be stored\nOUTPUT_DIR=images\n# Download images\npython download_images.py --input_file=${CSV_FILE} --output_dir=${OUTPUT_DIR}\n```\nTo accelerate the image downloading, multiple threads are spawned (the default is CPU_COUNT + 1).\nYou can change this setting using --threads flag to any other positive value.\n\nAll downloaded images will be cropped according to the bounding boxes specified in\nthe dataset file and resized to 299x299 pixels.\nEach image will be saved in PNG format with filename `IMAGE_ID.png`\nwhere `IMAGE_ID` is the id of the image from the dataset file.\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dataset/dev_dataset.csv",
    "content": "ImageId,URL,x1,y1,x2,y2,TrueLabel,TargetClass,OriginalLandingURL,License,Author,AuthorProfileURL\n0c7ac4a8c9dfa802,https://c1.staticflickr.com/9/8540/28821627444_0524012bdd_o.jpg,0.0,0.0,0.871838111298,1.0,306,779,https://www.flickr.com/photos/gails_pictures/28821627444,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nf43fbfe8a9ea876c,https://c1.staticflickr.com/9/8066/28892033183_6f675dcc03_o.jpg,0.25,0.0,1.0,0.599757673667,884,378,https://www.flickr.com/photos/barty/28892033183,https://creativecommons.org/licenses/by/2.0/,Barry Badcock,https://www.flickr.com/people/barty/\n4fc263d35a3ad3ee,https://c1.staticflickr.com/8/7378/27465801596_a9dd11e5e2_o.jpg,0.333333333333,0.0,1.0,1.0,244,123,https://www.flickr.com/photos/foxcroftacademy/27465801596,https://creativecommons.org/licenses/by/2.0/,Foxcroft Academy,https://www.flickr.com/people/foxcroftacademy/\ncc13c2bc5cdd1f44,https://c1.staticflickr.com/9/8864/28546467522_56229f2bef_o.jpg,0.0,0.0,0.5,0.75,560,741,https://www.flickr.com/photos/o_0/28546467522/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n73a52afd2f818ed5,https://c1.staticflickr.com/6/5607/31066602702_382b13646e_o.jpg,0.489195230999,0.0,1.0,0.75,439,696,https://www.flickr.com/photos/chemiebw/31066602702/,https://creativecommons.org/licenses/by/2.0/,Chemie-Verb\\303\\244nde Baden-W\\303\\274rttemberg,https://www.flickr.com/people/chemiebw/\n58f0fd17c4a0e25a,https://c1.staticflickr.com/9/8262/29250758112_3147698dd2_o.jpg,0.0,0.0,0.5625,0.75,991,100,https://www.flickr.com/photos/zongo/29250758112,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n90e11aa7c36c64f2,https://c1.staticflickr.com/8/7528/26850127330_56022d63f7_o.jpg,0.0,0.25,0.5625,1.0,950,1,https://www.flickr.com/photos/cogdog/26850127330,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n696f0f6bea562bf8,https://c1.staticflickr.com/6/5605/30947139580_468ba7e513_o.jpg,0.0,0.0,0.5,0.75,854,267,https://www.flickr.com/photos/jamesbradley/30947139580/,https://creativecommons.org/licenses/by/2.0/,Fr James Bradley,https://www.flickr.com/people/jamesbradley/\ndf58f94361c6d105,https://c1.staticflickr.com/8/7248/27047266920_8363816754_o.jpg,0.200627476882,0.0,0.601882430647,0.75,610,13,https://www.flickr.com/photos/roberthaandrikman/27047266920,https://creativecommons.org/licenses/by/2.0/,Robert Haandrikman,https://www.flickr.com/people/roberthaandrikman/\n1394faa319bd353c,https://c1.staticflickr.com/1/542/31667350163_b6906e0d48_o.jpg,0.333333333333,0.0,1.0,1.0,610,507,https://www.flickr.com/photos/landrovermena/31667350163,https://creativecommons.org/licenses/by/2.0/,Land Rover MENA,https://www.flickr.com/people/landrovermena/\n6cae4a23623d142b,https://c1.staticflickr.com/8/7404/27305101801_5b422e51fe_o.jpg,0.28125,0.0,0.84375,0.75,583,440,https://flickr.com/39309480@N05/27305101801,https://creativecommons.org/licenses/by/2.0/,Embajada de EEUU en la Argentina,https://www.flickr.com/people/embajadaeeuubuenosaires/\nd02adcb9140880a1,https://c1.staticflickr.com/1/404/31746323273_467fb30873_o.jpg,0.0,0.0,0.714503816794,1.0,916,783,https://www.flickr.com/photos/ruthanddave/31746323273/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n71080285ad6cb4e9,https://c1.staticflickr.com/9/8444/29355103331_45d4b77595_o.jpg,0.0,0.25,0.75,1.0,456,478,https://www.flickr.com/photos/themarmot/29355103331,https://creativecommons.org/licenses/by/2.0/,The Marmot,https://www.flickr.com/people/themarmot/\n137ab6ca314e9e35,https://c1.staticflickr.com/9/8681/28102039640_11703a03f5_o.jpg,0.0,0.311985172982,0.75,0.935955518946,620,556,https://www.flickr.com/photos/130468093@N03/28102039640,https://creativecommons.org/licenses/by/2.0/,~ladyyoruichi~,https://www.flickr.com/people/130468093@N03/\nc819099fed6f0d73,https://c1.staticflickr.com/1/126/31638424475_3b36f926b1_o.jpg,0.32991202346,0.0,0.989736070381,1.0,962,777,https://www.flickr.com/photos/djackmanson/31638424475,https://creativecommons.org/licenses/by/2.0/,David Jackmanson,https://www.flickr.com/people/djackmanson/\n4b384c8247b56c0a,https://c1.staticflickr.com/9/8526/28626152335_955398ef80_o.jpg,0.0,0.25,0.5,1.0,542,925,https://www.flickr.com/photos/virtualpainter/28626152335,https://creativecommons.org/licenses/by/2.0/,Taka Umemura,https://www.flickr.com/people/virtualpainter/\n62ebd5f7ce015380,https://c1.staticflickr.com/9/8832/28846755931_9e77600319_o.jpg,0.0,0.0,0.662261380323,1.0,631,692,https://www.flickr.com/photos/spera-designerschuhe/28846755931,https://creativecommons.org/licenses/by/2.0/,\"SPERA.de Designerschuhe, Taschen und Accessoires\",https://www.flickr.com/people/spera-designerschuhe/\nf24817d66024dfb6,https://c1.staticflickr.com/8/7286/28064769996_6bf78b5810_o.jpg,0.0,0.0,0.5,0.75,742,740,https://www.flickr.com/photos/jdlasica/28064769996,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\n1b57d7bbd673c771,https://c1.staticflickr.com/9/8024/29035810873_9be68318c4_o.jpg,0.5,0.25,1.0,1.0,423,927,https://www.flickr.com/photos/fotosagenciabrasil/29035810873/,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/\na2de1f4f2c1021fa,https://c1.staticflickr.com/9/8598/29005552090_ee38f841ac_o.jpg,0.25,0.25,1.0,1.0,456,185,https://www.flickr.com/photos/sillygwailo/29005552090/,https://creativecommons.org/licenses/by/2.0/,Richard Eriksson,https://www.flickr.com/people/sillygwailo/\n3e7b01ba495f15f9,https://c1.staticflickr.com/8/7366/26897189910_049b6377e0_o.jpg,0.0,0.0,0.75,0.601503759398,708,410,https://www.flickr.com/photos/darioalvarez/26897189910,https://creativecommons.org/licenses/by/2.0/,Dario Alvarez,https://www.flickr.com/people/darioalvarez/\n1a264165276e3c85,https://c1.staticflickr.com/8/7327/27500591886_a1b257229e_o.jpg,0.5,0.0,1.0,0.75,855,759,https://www.flickr.com/photos/presidentialoffice/27500591886,https://creativecommons.org/licenses/by/2.0/,\\347\\270\\275\\347\\265\\261\\345\\272\\234,https://www.flickr.com/people/presidentialoffice/\nbc9a5e01c02e759e,https://c1.staticflickr.com/8/7575/27719847416_e231168ac1_o.jpg,0.0,0.28125,0.75,0.84375,923,18,https://www.flickr.com/photos/jimg944/27719847416/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n01bdc0cfe670f708,https://c1.staticflickr.com/1/457/31837933011_3e57f56dc9_o.jpg,0.0,0.0,0.5,0.75,472,541,https://www.flickr.com/photos/quinet/31837933011,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n6af829a442e2e0e7,https://c1.staticflickr.com/6/5827/30663702381_910aca914a_o.jpg,0.25,0.0,1.0,1.0,130,231,https://www.flickr.com/photos/rusty_clark/30663702381,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n493694833dc23399,https://c1.staticflickr.com/1/691/33087466756_27fcc6e909_o.jpg,0.25,0.25,0.75,1.0,538,835,https://www.flickr.com/photos/denalinps/33087466756/,https://creativecommons.org/licenses/by/2.0/,Denali National Park and Preserve,https://www.flickr.com/people/denalinps/\n6ac94c9244f84aa3,https://c1.staticflickr.com/9/8887/27621832723_abe5df1bf6_o.jpg,0.28125,0.0,0.84375,0.75,673,336,https://www.flickr.com/photos/sedoglia/27621832723,https://creativecommons.org/licenses/by/2.0/,Sergio,https://www.flickr.com/people/sedoglia/\n7529b42e71769777,https://c1.staticflickr.com/6/5573/30447660301_21f03bc832_o.jpg,0.28125,0.0,0.84375,0.75,477,618,https://www.flickr.com/photos/archiefalkmaar/30447660301/,https://creativecommons.org/licenses/by/2.0/,Regionaal Archief Alkmaar,https://www.flickr.com/people/archiefalkmaar/\nd204464fcf15ad99,https://c1.staticflickr.com/9/8735/28293562656_b6754b6f76_o.jpg,0.25,0.249079528719,1.0,0.747238586156,300,269,https://www.flickr.com/photos/zigazou76/28293562656,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n7fd7ce3eb2bf9944,https://c1.staticflickr.com/8/7060/26682014410_e1ae9f3f68_o.jpg,0.25,0.0,1.0,1.0,100,113,https://www.flickr.com/photos/starr-environmental/26682014410/,https://creativecommons.org/licenses/by/2.0/,Forest and Kim Starr,https://www.flickr.com/people/starr-environmental/\n303781188f1b3b27,https://c1.staticflickr.com/8/7196/27632686515_7c9e105ab4_o.jpg,0.57825203252,0.0,1.0,0.75,477,339,https://www.flickr.com/photos/tomhilton/27632686515,https://creativecommons.org/licenses/by/2.0/,Tom Hilton,https://www.flickr.com/people/tomhilton/\n67967c9db11151e0,https://c1.staticflickr.com/6/5699/30482545566_9bb69e3a2c_o.jpg,0.5,0.25,1.0,1.0,252,820,https://www.flickr.com/photos/blumenbiene/30482545566,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\nfa2a7d600b62174e,https://c1.staticflickr.com/9/8135/29796651083_af3421402e_o.jpg,0.25,0.0,1.0,0.729946524064,521,572,https://www.flickr.com/photos/familymwr/29796651083,https://creativecommons.org/licenses/by/2.0/,U.S. Army,https://www.flickr.com/people/familymwr/\ncd2d2889ef7ac51c,https://c1.staticflickr.com/8/7108/27445698401_622147f593_o.jpg,0.0,0.0,0.666666666667,1.0,924,607,https://www.flickr.com/photos/janitors/27445698401,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n11954d93a7051cb5,https://c1.staticflickr.com/9/8598/30096731475_f2050e80f0_o.jpg,0.5,0.0,1.0,0.75,23,503,https://www.flickr.com/photos/andymorffew/30096731475,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\n03f90f7138f761e8,https://c1.staticflickr.com/8/7358/27496838730_a300e17377_o.jpg,0.25,0.25,1.0,1.0,664,490,https://www.flickr.com/photos/pasa/27496838730,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n19935b1c0a4d305d,https://c1.staticflickr.com/8/7560/28230694205_599d4915f1_o.jpg,0.30421686747,0.0,1.0,1.0,761,642,https://www.flickr.com/photos/lge/28230694205,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n9cf861a657c27cec,https://c1.staticflickr.com/1/737/31554472305_631b37cd13_o.jpg,0.28125,0.25,0.84375,1.0,583,897,https://www.flickr.com/photos/rusty_clark/31554472305/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n05817a675e7506d1,https://c1.staticflickr.com/8/7530/27222000794_49d44c7533_o.jpg,0.246522693997,0.0,0.739568081991,0.75,673,754,https://www.flickr.com/photos/trocaire/27222000794,https://creativecommons.org/licenses/by/2.0/,Trocaire,https://www.flickr.com/people/trocaire/\ne1c702ed9842dd1c,https://c1.staticflickr.com/8/7538/26750212822_874e61f2f5_o.jpg,0.0,0.25,0.75,1.0,693,757,https://www.flickr.com/photos/mcleod/26750212822,https://creativecommons.org/licenses/by/2.0/,Scott McLeod,https://www.flickr.com/people/mcleod/\ne7cafac174e90143,https://c1.staticflickr.com/8/7064/26911748774_e91c741c13_o.jpg,0.25,0.25,0.75,1.0,526,116,https://www.flickr.com/photos/tabor-roeder/26911748774,https://creativecommons.org/licenses/by/2.0/,Phil Roeder,https://www.flickr.com/people/tabor-roeder/\n1a680f33500acb4b,https://c1.staticflickr.com/6/5623/30353092243_549ce05481_o.jpg,0.0,0.0,0.5625,0.75,932,73,https://www.flickr.com/photos/londonmatt/30353092243,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n81ddbe14219e9dcf,https://c1.staticflickr.com/1/599/32603915941_1f3f02a21f_o.jpg,0.43661971831,0.0,1.0,0.75,318,672,http://www.flickr.com/photos/treegrow/32603915941/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n04cb9de291399d15,https://c1.staticflickr.com/9/8671/28725010671_e060588a1b_o.jpg,0.25,0.25,0.75,1.0,465,451,https://www.flickr.com/photos/photo-digest/28725010671,https://creativecommons.org/licenses/by/2.0/,media.digest,https://www.flickr.com/people/photo-digest/\n23f9d18d531eb148,https://c1.staticflickr.com/8/7545/28289771271_d972c53c03_o.jpg,0.249079528719,0.0,0.747238586156,0.75,479,851,https://www.flickr.com/photos/londonmatt/28289771271/,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n63f2e14ab6be82cf,https://c1.staticflickr.com/8/7360/27324993991_9e7547e472_o.jpg,0.330871491876,0.0,1.0,1.0,668,694,https://www.flickr.com/photos/mdgovpics/27324993991,https://creativecommons.org/licenses/by/2.0/,Maryland GovPics,https://www.flickr.com/people/mdgovpics/\n0dffbfa7ba43cb90,https://c1.staticflickr.com/1/599/31842595896_6c327628ee_o.jpg,0.28125,0.0,0.84375,0.75,962,95,https://flickr.com/10581108@N00/31842595896,https://creativecommons.org/licenses/by/2.0/,jencu,https://www.flickr.com/people/jennycu/\na97274c7e80a1764,https://c1.staticflickr.com/9/8770/28603315541_10de82290f_o.jpg,0.0,0.25,0.5625,1.0,866,926,https://flickr.com/10069023@N00/28603315541,https://creativecommons.org/licenses/by/2.0/,Charles Kremenak,https://www.flickr.com/people/charleskremenak/\n85e2eea48d912d31,https://c1.staticflickr.com/6/5728/30827582556_27a03b94b4_o.jpg,0.501840942563,0.25,1.0,1.0,806,136,https://www.flickr.com/photos/eaglebrook/30827582556/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/\nff5182599937c1ec,https://c1.staticflickr.com/9/8088/29255908970_542c7fcc99_o.jpg,0.25,0.0,1.0,0.75,325,210,https://www.flickr.com/photos/orangeaurochs/29255908970/,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/\n4bb12984b41d0834,https://c1.staticflickr.com/8/7155/26715421772_322982abb8_o.jpg,0.280784844384,0.0,0.842354533153,1.0,34,8,https://www.flickr.com/photos/lwpkommunikacio/26715421772,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\n150249123e81930d,https://c1.staticflickr.com/8/7637/27864748826_3611a80685_o.jpg,0.25,0.0,1.0,1.0,923,485,https://www.flickr.com/photos/36668466@N05/27864748826,https://creativecommons.org/licenses/by/2.0/,Fernando Medina,https://www.flickr.com/people/36668466@N05/\nf963957ccfa82f6b,https://c1.staticflickr.com/8/7321/27811646942_6af16e2c20_o.jpg,0.217675378267,0.0,0.653026134801,0.75,143,8,https://www.flickr.com/photos/bamyers4az/27811646942,https://creativecommons.org/licenses/by/2.0/,Brent Myers,https://www.flickr.com/people/bamyers4az/\n890fdaf4e1892e00,https://c1.staticflickr.com/9/8079/29641887231_ac78f6acb2_o.jpg,0.0,0.0,0.75786163522,1.0,313,692,https://www.flickr.com/photos/gails_pictures/29641887231,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n9a1c67f467b9beea,https://c1.staticflickr.com/8/7313/26933714923_dae58c7fa8_o.jpg,0.0,0.25,0.70913884007,1.0,303,90,https://www.flickr.com/photos/gails_pictures/26933714923,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n217597258ac12258,https://c1.staticflickr.com/8/7326/27290987603_52008d9de0_o.jpg,0.25,0.25,1.0,1.0,583,805,https://www.flickr.com/photos/iwashitashoichi/27290987603,https://creativecommons.org/licenses/by/2.0/,Shoichi Iwashita,https://www.flickr.com/people/iwashitashoichi/\n346c5575b60194c3,https://c1.staticflickr.com/6/5753/31338370671_675f18f5a9_o.jpg,0.25,0.0,0.75,0.75,949,625,https://flickr.com/77742560@N06/31338370671,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n296033c3a5910845,https://c1.staticflickr.com/8/7659/27497141411_2fdd591428_o.jpg,0.0,0.0,0.675074183976,1.0,361,797,https://www.flickr.com/photos/100915417@N07/27497141411,https://creativecommons.org/licenses/by/2.0/,Charlie Marshall,https://www.flickr.com/people/100915417@N07/\n3a7d9bd310202e93,https://c1.staticflickr.com/6/5751/30906474272_60f5035a81_o.jpg,0.0,0.0,0.5,0.75,790,660,https://www.flickr.com/photos/sansebastian2016/30906474272,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/\n56e9d5f63cfc507e,https://c1.staticflickr.com/6/5767/31254643081_606fefaeef_o.jpg,0.0,0.0,1.0,1.0,441,624,https://flickr.com/31424626@N05/31254643081,https://creativecommons.org/licenses/by/2.0/,Pulencio,https://www.flickr.com/people/pulencio/\n602f2c3749d6021e,https://c1.staticflickr.com/6/5488/30010578363_ae1a2b5fc4_o.jpg,0.25,0.0,1.0,0.75,747,106,https://flickr.com/88307459@N08/30010578363,https://creativecommons.org/licenses/by/2.0/,Alessandro,https://www.flickr.com/people/88307459@N08/\n7c754696067fdfa9,https://c1.staticflickr.com/8/7322/26952063895_0d0990098b_o.jpg,0.534850640114,0.0,1.0,0.75,765,469,https://www.flickr.com/photos/zachievenor/26952063895,https://creativecommons.org/licenses/by/2.0/,Zachi Evenor,https://www.flickr.com/people/zachievenor/\n8f5eda0b6a910b43,https://c1.staticflickr.com/1/525/31526646220_dbd7c0df37_o.jpg,0.5,0.0,1.0,0.75,950,918,https://www.flickr.com/photos/129816626@N04/31526646220/,https://creativecommons.org/licenses/by/2.0/,Elusive Muse,https://www.flickr.com/people/129816626@N04/\n89119361e9d9e02d,https://c1.staticflickr.com/9/8064/30107504355_f5a2453191_o.jpg,0.0,0.0,0.669128508124,1.0,481,473,http://www.flickr.com/photos/79157069@N03/30107504355,https://creativecommons.org/licenses/by/2.0/,Matthew Paul  Argall,https://www.flickr.com/people/79157069@N03/\nda63f2acf683c0a7,https://c1.staticflickr.com/3/2626/32878464786_81b7b5f560_o.jpg,0.25,0.25,0.75,1.0,134,617,https://www.flickr.com/photos/steve_childs/32878464786/,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/\n741fc1a3fc08731d,https://c1.staticflickr.com/1/333/30878601253_6a06af38ce_o.jpg,0.226157082749,0.25,0.678471248247,1.0,793,400,https://www.flickr.com/photos/ufv/30878601253,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/\nd77af00930283f4b,https://c1.staticflickr.com/6/5686/30135548405_290ce24c79_o.jpg,0.0,0.28125,0.75,0.84375,901,649,https://flickr.com/131810676@N03/30135548405,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/\n97151fe7a0a6e2e3,https://c1.staticflickr.com/9/8108/28266576044_fe196cd052_o.jpg,0.0,0.0,1.0,1.0,734,228,https://www.flickr.com/photos/paulstudio/28266576044,https://creativecommons.org/licenses/by/2.0/,Paul Chan,https://www.flickr.com/people/paulstudio/\n393d40f3a6a79400,https://c1.staticflickr.com/8/7641/27798795492_12f1e08a40_o.jpg,0.0,0.25,0.496696035242,1.0,328,846,https://www.flickr.com/photos/shankaronline/27798795492/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n8f5e0855ca8de8ea,https://c1.staticflickr.com/1/594/31875644290_a507a79ca7_o.jpg,0.4375,0.25,1.0,1.0,468,716,https://www.flickr.com/photos/briansolis/31875644290,https://creativecommons.org/licenses/by/2.0/,Brian Solis,https://www.flickr.com/people/briansolis/\nd72f34526e12fd83,https://c1.staticflickr.com/9/8787/28375652543_039a76200f_o.jpg,0.0,0.2806640625,0.75,0.8419921875,442,325,https://www.flickr.com/photos/cogdog/28375652543,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n957529a2abaa0581,https://c1.staticflickr.com/6/5493/31215689672_90fdc524c1_o.jpg,0.337738619677,0.0,1.0,1.0,883,648,https://www.flickr.com/photos/yourbestdigs/31215689672/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\n3bd1ba0432603b28,https://c1.staticflickr.com/9/8041/29388312836_4151756518_o.jpg,0.0,0.0,0.5625,0.75,921,89,https://www.flickr.com/photos/a_peach/29388312836,https://creativecommons.org/licenses/by/2.0/,A_Peach,https://www.flickr.com/people/a_peach/\n3228a465697fb2cf,https://c1.staticflickr.com/1/699/32034140530_62059de5a0_o.jpg,0.0,0.0,0.75,0.5625,840,922,https://www.flickr.com/photos/ufv/32034140530,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/\n871c99d5658c3189,https://c1.staticflickr.com/1/593/31013399073_e0c80204ed_o.jpg,0.5,0.0,1.0,0.75,956,587,https://flickr.com/64586261@N02/31013399073,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n1733cbc68a2ae05d,https://c1.staticflickr.com/1/465/32838931536_2e1b56309c_o.jpg,0.0,0.0,0.666666666667,1.0,556,892,https://www.flickr.com/photos/147079914@N03/32838931536/in/pool-44124304756@N01,https://creativecommons.org/licenses/by/2.0/,sponki25,https://www.flickr.com/people/147079914@N03/\n69a3493d13953e1f,https://c1.staticflickr.com/1/486/31850894154_77cd0b743d_o.jpg,0.4375,0.25,1.0,1.0,520,407,https://www.flickr.com/photos/byzantiumbooks/31850894154,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/\n8a82ddd7ab76efbb,https://c1.staticflickr.com/9/8073/29273707766_84a5a2321f_o.jpg,0.0,0.0,0.663235294118,1.0,511,908,https://www.flickr.com/photos/shankaronline/29273707766,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\ne95ef0aeeab7b496,https://c1.staticflickr.com/3/2892/32904176405_735232107b_o.jpg,0.710762331839,0.0,1.0,0.75,889,860,https://www.flickr.com/photos/arg_flickr/32904176405/,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/\n8555611998ea426a,https://c1.staticflickr.com/6/5600/30019858070_5049f5d386_o.jpg,0.0,0.0,0.75,1.0,991,497,https://www.flickr.com/photos/eamoncurry/30019858070,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/\n1cc2caf8e5db27c3,https://c1.staticflickr.com/1/598/32069226561_2e29df4dce_o.jpg,0.25,0.0,1.0,0.5,431,607,https://flickr.com/21841998@N06/32069226561,https://creativecommons.org/licenses/by/2.0/,The People&#x27;s Tribune,https://www.flickr.com/people/21841998@N06/\na00c8d22e63497c4,https://c1.staticflickr.com/8/7019/26876163625_b5ebe36eaf_o.jpg,0.278188180404,0.25,0.834564541213,1.0,431,892,https://www.flickr.com/photos/timmccune/26876163625,https://creativecommons.org/licenses/by/2.0/,Tim McCune,https://www.flickr.com/people/timmccune/\n4f553b721705d008,https://c1.staticflickr.com/8/7417/28111852685_716c19bcb5_o.jpg,0.0,0.0,0.75,1.0,397,3,https://www.flickr.com/photos/noaaphotolib/28111852685/in/photolist-hCZ5zh-7RqcE6-7Rtsyb-JQ9Apg/,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\nf1ce339a44d7a118,https://c1.staticflickr.com/9/8867/28838922156_09d615d6f5_o.jpg,0.333333333333,0.0,1.0,1.0,98,702,https://www.flickr.com/photos/132033298@N04/28838922156,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/\n2153d9869fb5a9ef,https://c1.staticflickr.com/9/8892/28233397700_b175333ccc_o.jpg,0.452546296296,0.25,1.0,1.0,645,942,https://www.flickr.com/photos/katerha/28233397700,https://creativecommons.org/licenses/by/2.0/,Kate Ter Haar,https://www.flickr.com/people/katerha/\n7506caf0a49c3951,https://c1.staticflickr.com/8/7410/27688687271_a42aee521a_o.jpg,0.0,0.0,1.0,0.900181488203,79,724,https://www.flickr.com/photos/136941790@N03/27688687271/,https://creativecommons.org/licenses/by/2.0/,laboratorio diagnostica ancona IZSUM,https://www.flickr.com/people/136941790@N03/\n1d4133f5bc7af193,https://c1.staticflickr.com/9/8584/28442098602_ed99e31eda_o.jpg,0.259962406015,0.25,0.779887218045,1.0,141,911,https://www.flickr.com/photos/25553993@N02/28442098602/,https://creativecommons.org/licenses/by/2.0/,Kev Chapman,https://www.flickr.com/people/25553993@N02/\nfd26c4733822dfcc,https://c1.staticflickr.com/9/8649/28250885435_30ea68123c_o.jpg,0.2806640625,0.25,0.8419921875,1.0,363,451,https://www.flickr.com/photos/usfwsmtnprairie/28250885435,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n60f5900a00d94b25,https://c1.staticflickr.com/6/5732/31328633496_995b71567c_o.jpg,0.28125,0.0,0.84375,0.75,706,558,https://www.flickr.com/photos/davidwilson1949/31328633496,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n79f953be91aa8ce2,https://c1.staticflickr.com/8/7570/27808063061_740fc61f0c_o.jpg,0.28125,0.25,0.84375,1.0,660,588,https://flickr.com/70724896@N08/27808063061,https://creativecommons.org/licenses/by/2.0/,Betta Tryptophan,https://www.flickr.com/people/nagasakiosada/\nd9da4e5ef53d5e8b,https://c1.staticflickr.com/1/537/32179264340_6ea9260e9f_o.jpg,0.0,0.24882629108,1.0,1.0,641,487,https://www.flickr.com/photos/ruthanddave/32179264340/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n0411ca972e637297,https://c1.staticflickr.com/8/7761/26268791474_72626e9e6a_o.jpg,0.25,0.25,0.75,1.0,968,697,https://www.flickr.com/photos/nanpalmero/26268791474,https://creativecommons.org/licenses/by/2.0/,Nan Palmero,https://www.flickr.com/people/nanpalmero/\n92dbb18dd447fd75,https://c1.staticflickr.com/8/7127/27711989146_46b6ca79f6_o.jpg,0.0,0.25,0.56338028169,1.0,490,194,https://www.flickr.com/photos/southbeachcars/27711989146,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n65251969959ce0e6,https://c1.staticflickr.com/8/7623/28435254025_3c40331a75_o.jpg,0.0,0.0,1.0,1.0,938,837,https://www.flickr.com/photos/mcleod/28435254025,https://creativecommons.org/licenses/by/2.0/,Scott McLeod,https://www.flickr.com/people/mcleod/\nb76e552d4b3ec0c3,https://c1.staticflickr.com/6/5662/30119560842_26f15fba19_o.jpg,0.462155963303,0.0,1.0,0.75,992,191,https://www.flickr.com/photos/127338544@N06/30119560842,https://creativecommons.org/licenses/by/2.0/,Sarah Ward,https://www.flickr.com/people/127338544@N06/\n828ade8df2d14c45,https://c1.staticflickr.com/6/5649/30456484724_643e11a460_o.jpg,0.5,0.25,1.0,1.0,888,988,https://www.flickr.com/photos/johnragai/30456484724,https://creativecommons.org/licenses/by/2.0/,John Ragai,https://www.flickr.com/people/johnragai/\n3dc0e8f854bdc9b3,https://c1.staticflickr.com/6/5682/31432432235_54a615c355_o.jpg,0.25,0.25,0.75,1.0,604,921,https://www.flickr.com/photos/lwpkommunikacio/31432432235,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\n6bb6cf032c1286c5,https://c1.staticflickr.com/8/7172/26559644113_e1c454ef1c_o.jpg,0.25,0.25,1.0,0.75,468,367,https://www.flickr.com/photos/quinet/26559644113,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n2e9b377877f64b3d,https://c1.staticflickr.com/9/8503/29411674165_57521acbf9_o.jpg,0.0,0.25,0.75,1.0,499,706,https://www.flickr.com/photos/clairity/29411674165/,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\n2842a69bf5b14526,https://c1.staticflickr.com/9/8612/28790928395_77327e1c83_o.jpg,0.267530487805,0.25,0.802591463415,1.0,880,757,https://www.flickr.com/photos/ruthanddave/28790928395/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\na74f197288b10a0d,https://c1.staticflickr.com/9/8532/29057660090_67701b5197_o.jpg,0.25,0.0,0.75,0.75,808,748,https://www.flickr.com/photos/usacehq/29057660090,https://creativecommons.org/licenses/by/2.0/,U.S. Army Corps of Engineers,https://www.flickr.com/people/usacehq/\n7a85f42383ec2f81,https://c1.staticflickr.com/9/8604/29022121774_c82af166b6_o.jpg,0.0,0.25,0.75,0.75,709,802,https://www.flickr.com/photos/greg_men/29022121774/,https://creativecommons.org/licenses/by/2.0/,Greg_Men,https://www.flickr.com/people/greg_men/\n55e85d7b58024966,https://c1.staticflickr.com/9/8611/28176653474_ef1665d13b_o.jpg,0.0,0.0,1.0,1.0,968,615,https://www.flickr.com/photos/ultrakml/28176653474,https://creativecommons.org/licenses/by/2.0/,Katherine Lim,https://www.flickr.com/people/ultrakml/\nd6d192c5786f29f5,https://c1.staticflickr.com/9/8094/29208873373_f929c21796_o.jpg,0.392682926829,0.25,1.0,1.0,473,830,https://www.flickr.com/photos/vastateparksstaff/29208873373,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\nf533740a8d4618ce,https://c1.staticflickr.com/1/671/32497563865_bdd560906f_o.jpg,0.0,0.0,0.5,0.75,288,563,https://www.flickr.com/photos/30478819@N08/32497563865,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n5292f5b36a0789fa,https://c1.staticflickr.com/9/8761/28372171573_06dbf9a8d4_o.jpg,0.249079528719,0.0,0.747238586156,0.75,854,795,https://www.flickr.com/photos/63363807@N03/28372171573,https://creativecommons.org/licenses/by/2.0/,Didit Putra,https://www.flickr.com/people/63363807@N03/\nba4b978112a20be1,https://c1.staticflickr.com/9/8245/29288650164_e95f3a9c80_o.jpg,0.0,0.25,0.5,1.0,972,16,https://www.flickr.com/photos/pahudson/29288650164/,https://creativecommons.org/licenses/by/2.0/,Paul Hudson,https://www.flickr.com/people/pahudson/\n3692f6967c632fee,https://c1.staticflickr.com/9/8729/28628001341_0ff5c44db3_o.jpg,0.499263622975,0.0,0.99852724595,0.75,806,569,https://www.flickr.com/photos/agenciabrasilia/28628001341,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\nfae551840c1690fa,https://c1.staticflickr.com/9/8166/29643263176_aa56d7230d_o.jpg,0.333333333333,0.0,1.0,1.0,720,424,https://www.flickr.com/photos/rusty_clark/29643263176,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n8020698d79dc39f2,https://c1.staticflickr.com/3/2823/33351553831_7498912a81_o.jpg,0.25,0.25,0.75,1.0,855,954,https://www.flickr.com/photos/thejointstaff/33351553831/,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/\nd392f0639c17f396,https://c1.staticflickr.com/8/7448/27262568354_6e93ef7b68_o.jpg,0.500736377025,0.25,1.0,1.0,808,590,https://www.flickr.com/photos/inra_dist/27262568354/,https://creativecommons.org/licenses/by/2.0/,INRA DIST,https://www.flickr.com/people/inra_dist/\n8f97e3fface13e4d,https://c1.staticflickr.com/8/7108/27051340785_a3c9ab8b6d_o.jpg,0.333333333333,0.0,1.0,1.0,472,548,https://www.flickr.com/photos/quinet/27051340785,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\na920691cf2d50f79,https://c1.staticflickr.com/9/8512/29944466315_4dabc1230d_o.jpg,0.25,0.0,0.75,0.75,947,952,https://www.flickr.com/photos/pellesten/29944466315/,https://creativecommons.org/licenses/by/2.0/,Pelle Sten,https://www.flickr.com/people/pellesten/\na482985ca1e77960,https://c1.staticflickr.com/9/8751/28431687365_edb15100b0_o.jpg,0.0,0.25,0.601941747573,1.0,891,470,https://www.flickr.com/photos/janitors/28431687365,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n362e4ac62cf888f4,https://c1.staticflickr.com/1/531/32477078836_371e833f56_o.jpg,0.0,0.0,1.0,1.0,573,36,https://www.flickr.com/photos/freedomiiphotography/32477078836,https://creativecommons.org/licenses/by/2.0/,Freedom II Andres,https://www.flickr.com/people/freedomiiphotography/\n694e7617a4878041,https://c1.staticflickr.com/8/7087/27847654031_e4003bcdca_o.jpg,0.0,0.0,1.0,0.827586206897,884,720,https://flickr.com/41383869@N07/27847654031,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/\nfa5484e61e455eb2,https://c1.staticflickr.com/1/141/30799508623_1c015153fb_o.jpg,0.333333333333,0.0,1.0,1.0,477,769,https://www.flickr.com/photos/scubabix/30799508623,https://creativecommons.org/licenses/by/2.0/,Rob Bixby,https://www.flickr.com/people/scubabix/\nab42aa5e9745c214,https://c1.staticflickr.com/1/439/30759196054_5d7ae31471_o.jpg,0.524100719424,0.0,1.0,0.75,582,591,https://www.flickr.com/photos/andreboeni/30759196054,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\ne6e677a28e3bd6d7,https://c1.staticflickr.com/9/8774/28104802823_5748e74f68_o.jpg,0.334315169367,0.0,1.0,1.0,604,160,https://www.flickr.com/photos/sierragoddess/28104802823,https://creativecommons.org/licenses/by/2.0/,Darla \\330\\257\\330\\247\\330\\261\\331\\204\\330\\247 Hueske,https://www.flickr.com/people/sierragoddess/\n2e541180b2323a5d,https://c1.staticflickr.com/6/5538/29704744484_7fee6ebbc3_o.jpg,0.0,0.0,0.75,0.75,24,905,https://www.flickr.com/photos/sarahmstewart/29704744484,https://creativecommons.org/licenses/by/2.0/,Sarah Stewart,https://www.flickr.com/people/sarahmstewart/\n01f824264783f58d,https://c1.staticflickr.com/6/5734/30178450721_1b2b4033a5_o.jpg,0.0,0.0,0.75,0.75,968,678,https://www.flickr.com/photos/naotakem/30178450721,https://creativecommons.org/licenses/by/2.0/,Naotake Murayama,https://www.flickr.com/people/naotakem/\n335e604bbe3eec78,https://c1.staticflickr.com/6/5615/30719295680_945ac30a0b_o.jpg,0.5,0.0,1.0,0.75,312,687,http://www.flickr.com/photos/52450054@N04/30719295680/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n4e1bdcb677f21fb4,https://c1.staticflickr.com/8/7646/27898036952_dc65e0387a_o.jpg,0.5,0.0,1.0,0.75,874,779,https://www.flickr.com/photos/64084569@N02/27898036952,https://creativecommons.org/licenses/by/2.0/,Singa Hitam,https://www.flickr.com/people/64084569@N02/\nc6b5f6c1d79dffc6,https://c1.staticflickr.com/9/8472/28615394904_41ea2d98ce_o.jpg,0.0,0.25,0.5,1.0,583,652,https://flickr.com/44440670@N04/28615394904,https://creativecommons.org/licenses/by/2.0/,Bilboko Konpartsak,https://www.flickr.com/people/bilbokokonpartsak/\n8f9c1e4fd9f4cb2e,https://c1.staticflickr.com/6/5511/30235489014_5fc7ff19a1_o.jpg,0.278188180404,0.0,0.834564541213,0.75,17,498,https://www.flickr.com/photos/taylar/30235489014,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/\nf54616f2af588fd8,https://c1.staticflickr.com/9/8190/28571086580_2995522f6a_o.jpg,0.5,0.25,1.0,1.0,673,113,https://www.flickr.com/photos/41406729@N05/28571086580/,https://creativecommons.org/licenses/by/2.0/,Ben Fitzgerald-O&#x27;Connor,https://www.flickr.com/people/onega/\nf20911d36a287dce,https://c1.staticflickr.com/8/7010/26825773645_bb695521b3_o.jpg,0.249631811487,0.25,0.748895434462,1.0,781,492,https://www.flickr.com/photos/glynlowe/26825773645,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/\n81a7637c67f4f777,https://c1.staticflickr.com/8/7331/27680526741_b962934a0e_o.jpg,0.333333333333,0.0,1.0,1.0,490,836,https://www.flickr.com/photos/144110575@N07/27680526741,https://creativecommons.org/licenses/by/2.0/,Jobs For Felons Hub,https://www.flickr.com/people/144110575@N07/\n65c1808390bd18c5,https://c1.staticflickr.com/9/8832/28094440470_78960e7877_o.jpg,0.0,0.0,0.5625,0.75,686,587,https://www.flickr.com/photos/faircompanies/28094440470,https://creativecommons.org/licenses/by/2.0/,Nicol\\303\\241s Boullosa,https://www.flickr.com/people/faircompanies/\ne570258f1bef4ade,https://c1.staticflickr.com/8/7479/27454174925_9950df0ff9_o.jpg,0.0,0.0,0.75,0.75,367,461,https://www.flickr.com/photos/rjbailey/27454174925,https://creativecommons.org/licenses/by/2.0/,Ron Bailey,https://www.flickr.com/people/rjbailey/\n58bbaa0c5ab520d5,https://c1.staticflickr.com/8/7361/26646332780_6916622aa8_o.jpg,0.25,0.25,1.0,1.0,488,716,https://www.flickr.com/photos/kattis_j/26646332780,https://creativecommons.org/licenses/by/2.0/,Katarina Jardenberg,https://www.flickr.com/people/kattis_j/\n556d8b457b94c285,https://c1.staticflickr.com/6/5584/30780053951_156743ba04_o.jpg,0.0,0.0,0.666666666667,1.0,747,378,https://www.flickr.com/photos/usarak/30780053951/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/\n38546e7d7136c2ab,https://c1.staticflickr.com/6/5495/30613441041_60e2db1f58_o.jpg,0.28125,0.0,0.84375,0.75,600,114,https://flickr.com/17157315@N00/30613441041,https://creativecommons.org/licenses/by/2.0/,thekirbster,https://www.flickr.com/people/kirbyurner/\n9876fe92d003c9d4,https://c1.staticflickr.com/8/7426/27451221106_7d02f7a3b2_o.jpg,0.28125,0.0,0.84375,0.75,913,357,https://www.flickr.com/photos/10413717@N08/27451221106,https://creativecommons.org/licenses/by/2.0/,Smabs Sputzer,https://www.flickr.com/people/10413717@N08/\n8df3dc0c3fef1824,https://c1.staticflickr.com/9/8509/29548650262_4dba7e8039_o.jpg,0.333333333333,0.0,1.0,1.0,951,843,https://flickr.com/143363015@N06/29548650262,https://creativecommons.org/licenses/by/2.0/,Tobias Begemann,https://www.flickr.com/people/tobiasbegemann/\n938ada2f2bfa2b68,https://c1.staticflickr.com/9/8149/29352102754_7ac0f1c311_o.jpg,0.25,0.25,0.75,1.0,844,918,https://www.flickr.com/photos/amslerpix/29352102754/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n61131df39f19a4a0,https://c1.staticflickr.com/6/5497/31308303502_0e6f130313_o.jpg,0.0,0.25,0.5625,1.0,615,867,https://www.flickr.com/photos/davidstanleytravel/31308303502,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n7278c2b63080f08c,https://c1.staticflickr.com/1/338/32818896976_e770e081a2_o.jpg,0.0,0.0,0.666666666667,1.0,349,287,http://www.flickr.com/photos/noortjvdb/32818896976/,https://creativecommons.org/licenses/by/2.0/,noortjevdB,https://www.flickr.com/people/noortjvdb/\nf734e87286835196,https://c1.staticflickr.com/6/5618/29467877973_f53d845cd7_o.jpg,0.249079528719,0.25,0.747238586156,1.0,324,660,https://www.flickr.com/photos/usfwsmtnprairie/29467877973/,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n06a0e36c443746b5,https://c1.staticflickr.com/1/689/31497463186_001b31fa44_o.jpg,0.5,0.0,1.0,0.75,354,232,https://www.flickr.com/photos/dkeats/31497463186,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\nd7d8fc1442a82a8e,https://c1.staticflickr.com/8/7041/26864593362_503898424a_o.jpg,0.0,0.25,0.599757673667,1.0,22,846,https://www.flickr.com/photos/andymorffew/26864593362,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\nf9937696f421f4e4,https://c1.staticflickr.com/1/688/32401990166_57c8cdae3d_o.jpg,0.333333333333,0.0,1.0,1.0,85,491,https://www.flickr.com/photos/kkoshy/32401990166,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/\n9429f0d1ad2283df,https://c1.staticflickr.com/6/5034/30184154626_f341307e8a_o.jpg,0.0,0.200323101777,1.0,1.0,438,464,https://www.flickr.com/photos/janitors/30184154626,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n7524a7ef9de8edc3,https://c1.staticflickr.com/9/8825/28821400601_33e22535e7_o.jpg,0.135906040268,0.0,1.0,1.0,947,307,https://www.flickr.com/photos/oceanyamaha/28821400601,https://creativecommons.org/licenses/by/2.0/,ocean yamaha,https://www.flickr.com/people/oceanyamaha/\nc98a8640dcfaa5e0,https://c1.staticflickr.com/1/656/32592379656_ef2d01af55_o.jpg,0.0,0.0,0.56338028169,0.75,747,847,https://www.flickr.com/photos/mark6mauno/32592379656/,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/\nd34c51d7523e9c0f,https://c1.staticflickr.com/9/8861/28145818093_4c661cab2c_o.jpg,0.0,0.0,0.663235294118,1.0,647,655,https://www.flickr.com/photos/shankaronline/28145818093,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n24726d9054e9d78f,https://c1.staticflickr.com/9/8205/28857614150_fc34c1c771_o.jpg,0.421177266576,0.0,0.842354533153,0.75,545,455,https://www.flickr.com/photos/wittcogmbh/28857614150/,https://creativecommons.org/licenses/by/2.0/,wittco.gmbh,https://www.flickr.com/people/wittcogmbh/\n66aa56675136bbab,https://c1.staticflickr.com/8/7237/27131945991_c25202b461_o.jpg,0.0,0.331617647059,1.0,0.994852941176,470,607,https://www.flickr.com/photos/sterlingcollege/27131945991/,https://creativecommons.org/licenses/by/2.0/,Sterling College,https://www.flickr.com/people/sterlingcollege/\na8fe76c687b00e33,https://c1.staticflickr.com/1/538/31501305733_eba5c35a04_o.jpg,0.438671875,0.25,1.0,1.0,598,119,https://flickr.com/25187162@N03/31501305733,https://creativecommons.org/licenses/by/2.0/,BRUCE GIBSON,https://www.flickr.com/people/gibsongunleather/\n411c5d79017077f4,https://c1.staticflickr.com/8/7357/27945593082_c5faf86d90_o.jpg,0.0,0.0,0.744548286604,1.0,82,677,https://www.flickr.com/photos/jkirkhart35/27945593082,https://creativecommons.org/licenses/by/2.0/,Jerry Kirkhart,https://www.flickr.com/people/jkirkhart35/\nbb6fcb4a52b4fc0f,https://c1.staticflickr.com/8/7796/26996485435_ce0ae48ae9_o.jpg,0.333333333333,0.0,1.0,1.0,735,510,https://www.flickr.com/photos/transitomedellin/26996485435,https://creativecommons.org/licenses/by/2.0/,Secretar\\303\\255a de Movilidad de Medell\\303\\255n,https://www.flickr.com/people/transitomedellin/\n84640859ee739095,https://c1.staticflickr.com/9/8484/29052403164_26fb76527d_o.jpg,0.28125,0.25,0.84375,1.0,720,580,https://www.flickr.com/photos/rusty_clark/29052403164,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n6d2d82bc1ba0a956,https://c1.staticflickr.com/1/642/31650552204_c0eed2f414_o.jpg,0.0,0.0,0.75,0.713028169014,52,664,https://www.flickr.com/photos/jsjgeology/31650552204,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n3e1e47f5af2a3f16,https://c1.staticflickr.com/8/7515/27308980890_45a4af4039_o.jpg,0.251294378698,0.25,0.753883136095,1.0,294,357,https://www.flickr.com/photos/dkeats/27308980890,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n1ac44ddb6a2d497a,https://c1.staticflickr.com/6/5782/31278384662_150be3d19e_o.jpg,0.333333333333,0.0,1.0,1.0,898,27,https://www.flickr.com/photos/lge/31278384662,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n7a291389e67a8a07,https://c1.staticflickr.com/9/8164/29763489606_b506759ed9_o.jpg,0.0,0.333333333333,1.0,1.0,417,637,https://www.flickr.com/photos/rickmccharles/29763489606/,https://creativecommons.org/licenses/by/2.0/,Rick McCharles,https://www.flickr.com/people/rickmccharles/\nafa0f88aaab03427,https://c1.staticflickr.com/9/8284/29065395243_e0aa5811b3_o.jpg,0.0,0.25,0.5625,1.0,545,3,https://flickr.com/16813029@N08/29065395243,https://creativecommons.org/licenses/by/2.0/,wittco.gmbh,https://www.flickr.com/people/wittcogmbh/\n1e26772fc8c493bb,https://c1.staticflickr.com/6/5725/30011753244_385c391182_o.jpg,0.0,0.0,0.5,0.75,416,14,http://www.flickr.com/photos/147860906@N07/30011753244/,https://creativecommons.org/licenses/by/2.0/,DYKT Mohigan,https://www.flickr.com/people/147860906@N07/\n4d1237ccbd9a5b4b,https://c1.staticflickr.com/9/8015/29404892510_e505843f23_o.jpg,0.353159851301,0.25,0.706319702602,1.0,815,423,https://www.flickr.com/photos/yamahawatercraft/29404892510/,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/\nc3f452167c39302f,https://c1.staticflickr.com/8/7571/27007736911_797f24353c_o.jpg,0.350800582242,0.0,1.0,1.0,296,922,https://www.flickr.com/photos/usdagov/27007736911,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n6841e385fe79177f,https://c1.staticflickr.com/1/689/31896146460_9cd904330e_o.jpg,0.255395683453,0.25,1.0,1.0,830,833,https://flickr.com/45131642@N00/31896146460,https://creativecommons.org/licenses/by/2.0/,Phil Parker,https://www.flickr.com/people/45131642@N00/\nb48febf2b989205b,https://c1.staticflickr.com/8/7537/26855046792_36c804efd2_o.jpg,0.25,0.25,0.75,1.0,760,635,https://www.flickr.com/photos/barnimages/26855046792,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\nbaeb1300832574aa,https://c1.staticflickr.com/9/8775/29342994144_a7e3326c12_o.jpg,0.454002808989,0.0,0.908005617978,0.75,972,660,https://www.flickr.com/photos/hisgett/29342994144/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n7b6cc934fda859fa,https://c1.staticflickr.com/9/8752/28029665143_654198da68_o.jpg,0.25,0.28125,1.0,0.84375,307,653,https://www.flickr.com/photos/yto/28029665143/,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/\n39f82c728c956125,https://c1.staticflickr.com/1/400/32155857566_fb6080d6f9_o.jpg,0.296147672552,0.0,0.888443017657,0.75,638,762,http://www.flickr.com/photos/mark-gunn/32155857566/,https://creativecommons.org/licenses/by/2.0/,Mark  Gunn,https://www.flickr.com/people/mark-gunn/\nc8231978dc765004,https://c1.staticflickr.com/8/7787/28887518643_2e0a3954f5_o.jpg,0.248348017621,0.25,0.745044052863,1.0,472,741,https://flickr.com/51434786@N06/28887518643,https://creativecommons.org/licenses/by/2.0/,crudmucosa,https://www.flickr.com/people/crudmucosa/\n823f8eae0df2d5c1,https://c1.staticflickr.com/8/7482/27862170094_b1b7c6a698_o.jpg,0.0,0.25,0.531155015198,1.0,95,570,https://www.flickr.com/photos/usfwsmtnprairie/27862170094,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n038fd7a750733bb5,https://c1.staticflickr.com/1/654/31793584681_74a2ac4e3a_o.jpg,0.0,0.0,0.490510948905,0.75,18,103,https://www.flickr.com/photos/kkoshy/31793584681,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/\n6d6078c60e59e9f4,https://c1.staticflickr.com/9/8136/30193749621_f4b1f30016_o.jpg,0.0,0.0,0.5625,0.75,985,797,https://www.flickr.com/photos/usfwsmidwest/30193749621/,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n1f71668ab3dbe81b,https://c1.staticflickr.com/1/452/31908949435_f7e5ec059c_o.jpg,0.0,0.0,1.0,0.75,709,967,https://www.flickr.com/photos/londonmatt/31908949435,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n70b3b833463d20b9,https://c1.staticflickr.com/8/7052/27277805330_6ee69eaf87_o.jpg,0.0,0.28125,0.75,0.84375,864,857,https://www.flickr.com/photos/crondeau/27277805330,https://creativecommons.org/licenses/by/2.0/,Christine Rondeau,https://www.flickr.com/people/crondeau/\ndd4d033a9a45552d,https://c1.staticflickr.com/9/8580/29739921130_3c98d8504c_o.jpg,0.282719435737,0.0,0.84815830721,0.75,392,126,https://www.flickr.com/photos/taylar/29739921130,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/\n8800cff23fade16a,https://c1.staticflickr.com/8/7448/26655153174_a2122e0682_o.jpg,0.25,0.215753424658,1.0,0.647260273973,532,314,https://www.flickr.com/photos/51764518@N02/26655153174,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\naf2ac1705dc19a5f,https://c1.staticflickr.com/9/8870/27676047423_1399759e15_o.jpg,0.333333333333,0.0,1.0,1.0,384,99,https://www.flickr.com/photos/30802095@N04/27676047423,https://creativecommons.org/licenses/by/2.0/,Liam  Lysaght,https://www.flickr.com/people/30802095@N04/\n87937b805302f958,https://c1.staticflickr.com/1/737/32203735982_b50d7c2ca2_o.jpg,0.0,0.25,0.421177266576,1.0,418,873,https://www.flickr.com/photos/indigoskye/32203735982/in/photolist-R4JyKh-Q1hbGP-R1Gh67-HJixCL-QAEACy-QZmsqR-PTxYKd-PW9vX2-R7jm25-R7hjwW-QAqSgq-R7hhzu-R7hgyb-RazyPk-PSDtLK-PRt1D4-R5An1t-R2dxoq-PQYSyx-PQVJLV-Qv1VKs-QQAfjx-QPtAQH-QV1feS-QZUFDW-QiHqud-Qipyb1-QP34Gf-QF3Y5K-QCsidg-QzgK6Z-QGhQVL-QFLXCt-Pw4Qzr-QKAPYa-Ptjweh-Pw4AiR-QGhLiE-Qbw8CG-QKA5zr-QKzZVM-QKzUwk-QwtoyG-Pw3Y58-PtiNHS-PtiF79-Qbvq49-QGgLtS-Qbvg2m-PtioRJ,https://creativecommons.org/licenses/by/2.0/,John Frost,https://www.flickr.com/people/indigoskye/\nf33087679c5e7799,https://c1.staticflickr.com/6/5571/31004412114_2bbb2ce701_o.jpg,0.25,0.0,1.0,0.641068447412,443,588,https://www.flickr.com/photos/duncanh1/31004412114,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\n6374e7e35ad90f50,https://c1.staticflickr.com/6/5513/31121388731_7eecd1eea3_o.jpg,0.0,0.0,0.666666666667,1.0,39,771,https://www.flickr.com/photos/silkebaron/31121388731/,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/\n92c73d668e2cd3ce,https://c1.staticflickr.com/6/5444/29773329694_58d4166f7b_o.jpg,0.0,0.0,0.75,1.0,859,582,https://www.flickr.com/photos/togawanderings/29773329694,https://creativecommons.org/licenses/by/2.0/,Thomas Galvez,https://www.flickr.com/people/togawanderings/\ne8d5809ee6888f8f,https://c1.staticflickr.com/8/7742/26192609743_0b09bc425e_o.jpg,0.0,0.25,0.502588757396,1.0,717,641,https://www.flickr.com/photos/riversdale_estate/26192609743,https://creativecommons.org/licenses/by/2.0/,Riversdale Estate,https://www.flickr.com/people/riversdale_estate/\n45da32a1cf073a4f,https://c1.staticflickr.com/8/7362/27048969652_bf3a3854f1_o.jpg,0.0,0.25,0.544615384615,1.0,100,897,https://www.flickr.com/photos/brighton/27048969652,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/\nfe94909a2fad4ffe,https://c1.staticflickr.com/8/7434/27542851474_00e37a272d_o.jpg,0.0,0.187296416938,1.0,1.0,547,965,https://www.flickr.com/photos/haywirecustomguitars/27542851474,https://creativecommons.org/licenses/by/2.0/,Rick Mariner,https://www.flickr.com/people/haywirecustomguitars/\n00c3cd597f1ee96f,https://c1.staticflickr.com/6/5615/31076781681_e0a951dd43_o.jpg,0.0,0.464122137405,0.75,1.0,138,96,https://flickr.com/143049688@N08/31076781681,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/\na5949b0719d3ea77,https://c1.staticflickr.com/9/8667/28605783432_909eee5361_o.jpg,0.25,0.25,0.75,1.0,981,473,https://www.flickr.com/photos/amslerpix/28605783432/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\nd7984e6e1a51b3c4,https://c1.staticflickr.com/9/8883/28628911182_0982dd70ae_o.jpg,0.4375,0.0,1.0,0.75,518,937,https://flickr.com/32916425@N04/28628911182,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/\n979757e16b67ac7e,https://c1.staticflickr.com/6/5590/31340775762_a825141a4d_o.jpg,0.0,0.25,0.636439267887,1.0,323,798,https://www.flickr.com/photos/gails_pictures/31340775762/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n60ab0fb53634bc3c,https://c1.staticflickr.com/9/8410/28986276455_81071dc27d_o.jpg,0.0,0.25,0.504444444444,1.0,766,552,https://flickr.com/22711505@N05/28986276455,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\nad333e5d6953cbbf,https://c1.staticflickr.com/6/5788/30472796174_6eec033c0e_o.jpg,0.25,0.0,0.75,0.75,633,297,https://flickr.com/21178495@N06/30472796174,https://creativecommons.org/licenses/by/2.0/,Tiago Cassol  Schvarstzhaupt,https://www.flickr.com/people/eletrosonico/\n2b7e6f0d6f73fa1f,https://c1.staticflickr.com/3/2649/32280811454_5755bb1af9_o.jpg,0.0,0.0,0.75,0.732589285714,638,235,https://flickr.com/56041749@N02/32280811454,https://creativecommons.org/licenses/by/2.0/,Denise Krebs,https://www.flickr.com/people/mrsdkrebs/\n4063377442ea93d3,https://c1.staticflickr.com/1/653/32223796996_304c6b269d_o.jpg,0.25,0.0,0.75,0.75,596,814,https://www.flickr.com/photos/grimmegroup/32223796996/,https://creativecommons.org/licenses/by/2.0/,Grimme Group,https://www.flickr.com/people/grimmegroup/\n60ed157b21d49c4c,https://c1.staticflickr.com/3/2843/32866501816_486e532c1a_o.jpg,0.0,0.25,0.606331168831,1.0,755,960,https://www.flickr.com/photos/51764518@N02/32866501816,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n8f07c92f0af97807,https://c1.staticflickr.com/8/7366/26918793702_778d2226ac_o.jpg,0.5,0.25,1.0,1.0,806,108,https://www.flickr.com/photos/claude_wians/26918793702,https://creativecommons.org/licenses/by/2.0/,Claude Wians,https://www.flickr.com/people/claude_wians/\nd67b326ef48bb7b7,https://c1.staticflickr.com/6/5350/29991729355_5ab8b027df_o.jpg,0.333333333333,0.0,1.0,1.0,874,546,https://www.flickr.com/photos/bholl7510/29991729355/,https://creativecommons.org/licenses/by/2.0/,Brian Holland,https://www.flickr.com/people/bholl7510/\n9f3afb58c061c290,https://c1.staticflickr.com/9/8629/27671691554_a8bbdda66f_o.jpg,0.264204545455,0.25,0.792613636364,1.0,981,754,https://www.flickr.com/photos/noaaphotolib/27671691554,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\n1f7c25207bc3e303,https://c1.staticflickr.com/9/8605/29961048043_fe10e305d4_o.jpg,0.25,0.0,0.75,0.75,476,979,https://flickr.com/56537760@N03/29961048043,https://creativecommons.org/licenses/by/2.0/,Th\\303\\251o Paul,https://www.flickr.com/people/theopaul/\n70d812d368e3e828,https://c1.staticflickr.com/9/8261/29319398451_2005584856_o.jpg,0.0,0.0,0.75,0.75,456,202,https://www.flickr.com/photos/markmorgantrinidad/29319398451,https://creativecommons.org/licenses/by/2.0/,Mark Morgan,https://www.flickr.com/people/markmorgantrinidad/\ne19a59ad09d18497,https://c1.staticflickr.com/8/7300/27213625016_61cc784152_o.jpg,0.0,0.25,0.559282371295,1.0,443,915,https://www.flickr.com/photos/rutiful/27213625016,https://creativecommons.org/licenses/by/2.0/,Ruth Hara,https://www.flickr.com/people/rutiful/\ndde33b51c8c152d2,https://c1.staticflickr.com/4/3784/32757850161_333a586b05_o.jpg,0.0,0.0,0.75,1.0,735,969,https://www.flickr.com/photos/27665395@N05/32757850161,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\na33af1b9f8b8a81b,https://c1.staticflickr.com/6/5592/29999027335_510c67fbc7_o.jpg,0.28125,0.25,0.84375,1.0,880,667,https://www.flickr.com/photos/31029865@N06/29999027335,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/\n1c924877ccc60129,https://c1.staticflickr.com/3/2002/32192998414_890b5b84db_o.jpg,0.4375,0.25,1.0,1.0,410,567,https://www.flickr.com/photos/stevendepolo/32192998414,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n74dbbe535861d709,https://c1.staticflickr.com/8/7687/27703779525_8a8baaaae3_o.jpg,0.0,0.0,0.666666666667,1.0,702,194,https://www.flickr.com/photos/7armyjmtc/27703779525,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n858ec91996beb034,https://c1.staticflickr.com/9/8746/28705196386_80e810df65_o.jpg,0.0,0.0,0.75,0.75,686,962,https://www.flickr.com/photos/moto_club4ag/28705196386,https://creativecommons.org/licenses/by/2.0/,Moto &quot;Club4AG&quot; Miwa,https://www.flickr.com/people/moto_club4ag/\ne5cf220f8144c192,https://c1.staticflickr.com/8/7554/27328391223_6883936624_o.jpg,0.280784844384,0.0,0.842354533153,1.0,706,441,https://www.flickr.com/photos/abhinavnfr/27328391223,https://creativecommons.org/licenses/by/2.0/,Abhinav Phangcho Choudhury,https://www.flickr.com/people/abhinavnfr/\n34a39905ce228160,https://c1.staticflickr.com/8/7461/26512655533_d5fe870fbb_o.jpg,0.0,0.5,0.75,1.0,769,752,https://www.flickr.com/photos/30478819@N08/26512655533,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n9455bd672cb9e4bd,https://c1.staticflickr.com/8/7442/27892201106_9c907e9c26_o.jpg,0.25,0.0,1.0,1.0,522,582,https://flickr.com/39160147@N03/27892201106,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n9c509bfb75167fb0,https://c1.staticflickr.com/1/558/32052180035_f042256367_o.jpg,0.0,0.0,1.0,0.831960461285,641,748,https://flickr.com/44093058@N06/32052180035,https://creativecommons.org/licenses/by/2.0/,Blondinrikard Fr\\303\\266berg,https://www.flickr.com/people/blondinrikard/\n37e7dc99bf2704c7,https://c1.staticflickr.com/8/7278/26737658351_041174fc0e_o.jpg,0.25,0.25,1.0,0.75,664,610,https://www.flickr.com/photos/97199236@N04/26737658351,https://creativecommons.org/licenses/by/2.0/,Andrey Gaverdovsky,https://www.flickr.com/people/97199236@N04/\nf2bfa7a95e787fe1,https://c1.staticflickr.com/4/3918/33459563545_763a160b5a_o.jpg,0.248348017621,0.0,0.745044052863,0.75,721,218,https://www.flickr.com/photos/yourbestdigs/33459563545/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\n0f9d8c86a9f38020,https://c1.staticflickr.com/9/8556/29567784475_4f78605d50_o.jpg,0.333333333333,0.0,1.0,1.0,760,118,https://www.flickr.com/photos/markusspiske/29567784475/,https://creativecommons.org/licenses/by/2.0/,Markus Spiske,https://www.flickr.com/people/markusspiske/\nce05236afebb173d,https://c1.staticflickr.com/1/515/30802275984_2565161d0f_o.jpg,0.0,0.25,0.710456942004,1.0,536,510,https://www.flickr.com/photos/glorycycles/30802275984,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n12fb008451be82d4,https://c1.staticflickr.com/1/339/31842507145_e9db35db2b_o.jpg,0.28125,0.0,0.84375,0.75,583,555,https://www.flickr.com/photos/southbeachcars/31842507145,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n1a7425e8f990e04a,https://c1.staticflickr.com/6/5635/30586945602_29b323c620_o.jpg,0.25,0.25,1.0,1.0,608,676,https://www.flickr.com/photos/powellburns/30586945602,https://creativecommons.org/licenses/by/2.0/,Powell Burns,https://www.flickr.com/people/powellburns/\n1ba816dc6937b62d,https://c1.staticflickr.com/9/8538/29489317193_4ea10616ea_o.jpg,0.496696035242,0.25,0.993392070485,1.0,860,768,https://www.flickr.com/photos/yourbestdigs/29489317193,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\na92e49d8bbdc2aae,https://c1.staticflickr.com/8/7292/28045564580_52c7cf78b1_o.jpg,0.0,0.0,0.684603886398,1.0,533,564,https://www.flickr.com/photos/regnatarajan/28045564580,https://creativecommons.org/licenses/by/2.0/,Reg Natarajan,https://www.flickr.com/people/regnatarajan/\n0e0f1fd2ed183781,https://c1.staticflickr.com/6/5785/29863538926_4b27fc8b6a_o.jpg,0.0,0.0,0.804207119741,1.0,114,988,https://www.flickr.com/photos/gails_pictures/29863538926,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nc83cfca4bc9dd3c7,https://c1.staticflickr.com/8/7338/26885484975_11ac869fe2_o.jpg,0.421177266576,0.25,0.842354533153,1.0,696,730,https://flickr.com/65811939@N00/26885484975,https://creativecommons.org/licenses/by/2.0/,Radarsmum67,https://www.flickr.com/people/radarsmum67/\n172f992e1a0ebbc3,https://c1.staticflickr.com/6/5598/31398988035_25b2ca9970_o.jpg,0.306930693069,0.0,0.920792079208,1.0,566,492,https://www.flickr.com/photos/kansasscanner/31398988035/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\n565c67fd230f18cc,https://c1.staticflickr.com/9/8783/28325823061_8c659541be_o.jpg,0.0,0.0,0.5,0.75,555,854,https://www.flickr.com/photos/115391424@N05/28325823061,https://creativecommons.org/licenses/by/2.0/,lasta29,https://www.flickr.com/people/115391424@N05/\nb8596bba57a73794,https://c1.staticflickr.com/8/7380/26874457623_c0dc46b3fa_o.jpg,0.475215517241,0.25,0.950431034483,1.0,352,41,https://www.flickr.com/photos/dkeats/26874457623,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\nd94940216544b2c5,https://c1.staticflickr.com/4/3684/32889855711_216843d54b_o.jpg,0.0,0.0,0.745709828393,1.0,312,622,https://www.flickr.com/photos/gails_pictures/32889855711,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n9f55ac35ce9703e5,https://c1.staticflickr.com/8/7326/26785585893_a25ac89a89_o.jpg,0.226157082749,0.25,0.678471248247,1.0,9,194,https://www.flickr.com/photos/94066540@N08/26785585893,https://creativecommons.org/licenses/by/2.0/,Stuart Mckiggan,https://www.flickr.com/people/94066540@N08/\n55323ce1ff485412,https://c1.staticflickr.com/1/772/32544267962_4093028c88_o.jpg,0.0,0.0,0.5,0.75,386,571,https://www.flickr.com/photos/30478819@N08/32544267962,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n526f322d78bd5b44,https://c1.staticflickr.com/6/5674/30963905825_0ff9253d66_o.jpg,0.271186440678,0.0,1.0,1.0,571,288,https://www.flickr.com/photos/taymtaym/30963905825/,https://creativecommons.org/licenses/by/2.0/,taymtaym,https://www.flickr.com/people/taymtaym/\n229fbe790098d2e5,https://c1.staticflickr.com/9/8366/29338309226_66c4557833_o.jpg,0.0,0.0,0.56338028169,0.75,481,576,https://www.flickr.com/photos/jeepersmedia/29338309226,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\ne0c0f412d78571dc,https://c1.staticflickr.com/8/7079/27237503592_028a10898b_o.jpg,0.25,0.0,1.0,0.748646209386,734,409,https://www.flickr.com/photos/alvy/27237503592,https://creativecommons.org/licenses/by/2.0/,\\303\\201lvaro Ib\\303\\241\\303\\261ez,https://www.flickr.com/people/alvy/\nd12aad0d18252b40,https://c1.staticflickr.com/9/8155/29394215765_0a9fb71d55_o.jpg,0.5,0.0,1.0,0.75,325,39,https://www.flickr.com/photos/yutakaseki/29394215765,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/\n22712d0324d43ef2,https://c1.staticflickr.com/8/7783/29065239841_856237083c_o.jpg,0.0,0.25,0.75,1.0,898,847,https://www.flickr.com/photos/lge/29065239841,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n3201d10ec4dca056,https://c1.staticflickr.com/9/8335/28756723693_0d013b2d23_o.jpg,0.25,0.0,0.75,0.75,739,605,https://www.flickr.com/photos/wuipdesign/28756723693,https://creativecommons.org/licenses/by/2.0/,Wuipdesign,https://www.flickr.com/people/wuipdesign/\n62c7958e7cd80cca,https://c1.staticflickr.com/9/8422/29506847095_d1d503ca6e_o.jpg,0.0,0.32332761578,0.75,1.0,402,757,https://www.flickr.com/photos/atoach/29506847095/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n12cf4de43c70273e,https://c1.staticflickr.com/9/8107/29584374652_9e00ea0c4c_o.jpg,0.608865710561,0.25,1.0,1.0,815,833,https://flickr.com/42219086@N05/29584374652,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/\n56dbd7d814ef5c58,https://c1.staticflickr.com/8/7633/27183091666_8c5fc3c63a_o.jpg,0.0,0.0,0.669128508124,1.0,254,277,https://www.flickr.com/photos/70253321@N00/27183091666,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/\ne91abe0f1a7a30f4,https://c1.staticflickr.com/9/8428/29430666931_e770d94da0_o.jpg,0.480130057803,0.0,0.960260115607,0.75,752,495,https://www.flickr.com/photos/omnious100/29430666931,https://creativecommons.org/licenses/by/2.0/,Arturo Hurtado,https://www.flickr.com/people/omnious100/\n641d03527848417f,https://c1.staticflickr.com/6/5341/30230914936_690327db34_o.jpg,0.0,0.25,0.551470588235,1.0,341,450,https://www.flickr.com/photos/happymillerman/30230914936,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\nde282cea97167923,https://c1.staticflickr.com/9/8491/28883167640_a8d08d7c53_o.jpg,0.0,0.330871491876,1.0,1.0,305,656,https://www.flickr.com/photos/52450054@N04/28883167640,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n088560551b91ceb0,https://c1.staticflickr.com/8/7287/26823150326_c79c4cf404_o.jpg,0.25,0.4375,1.0,1.0,983,797,https://www.flickr.com/photos/ewolivera/26823150326,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/\na70b1cda0776cba6,https://c1.staticflickr.com/1/527/32735802985_cf85631809_o.jpg,0.0,0.25,0.5,1.0,143,119,https://www.flickr.com/photos/ddebold/32735802985/,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/\nc036b20afde859b7,https://c1.staticflickr.com/9/8254/28443278150_007ab658ba_o.jpg,0.0,0.0,0.5625,0.75,281,508,https://www.flickr.com/photos/californiadfg/28443278150/,https://creativecommons.org/licenses/by/2.0/,California Department of Fish and Wildlife,https://www.flickr.com/people/californiadfg/\n5d6c4759c26bae8c,https://c1.staticflickr.com/9/8174/28972300461_1d85484b62_o.jpg,0.25,0.25,0.75,1.0,547,746,https://www.flickr.com/photos/30478819@N08/28972300461,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n3eded0a8d5f16059,https://c1.staticflickr.com/8/7448/27356260545_152e77a25a_o.jpg,0.23937007874,0.0,1.0,1.0,100,457,https://www.flickr.com/photos/brighton/27356260545,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/\n9db1070b1b9f03d2,https://c1.staticflickr.com/4/3818/33059801071_2681885776_o.jpg,0.0,0.0,0.522624434389,0.75,324,870,https://www.flickr.com/photos/132033298@N04/33059801071,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/\ne3c3f8889ac99aec,https://c1.staticflickr.com/9/8786/28331257953_f5d077c2c1_o.jpg,0.0,0.248713235294,0.75,0.746139705882,536,897,https://www.flickr.com/photos/boostsamurai/28331257953,https://creativecommons.org/licenses/by/2.0/,JAK SIE MASZ,https://www.flickr.com/people/boostsamurai/\nd6d42f8a1f6b4460,https://c1.staticflickr.com/9/8230/29839990905_33b2231132_o.jpg,0.564649243466,0.0,1.0,0.75,666,374,https://www.flickr.com/photos/pedrosimoes7/29839990905,https://creativecommons.org/licenses/by/2.0/,Pedro Ribeiro Sim\\303\\265es,https://www.flickr.com/people/pedrosimoes7/\n517dc655edeaf344,https://c1.staticflickr.com/8/7309/26590993833_7b17146eda_o.jpg,0.0,0.0,0.5,0.75,430,920,https://www.flickr.com/photos/slgc/26590993833,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\n10db986bad48a9d5,https://c1.staticflickr.com/8/7092/26592880754_0af21a54f5_o.jpg,0.25,0.0,1.0,0.75,894,134,https://www.flickr.com/photos/vertstone/26592880754,https://creativecommons.org/licenses/by/2.0/,Sunil Dass,https://www.flickr.com/people/vertstone/\n17cfccd62451a233,https://c1.staticflickr.com/8/7005/27391093362_0c39bc1805_o.jpg,0.25,0.25,1.0,1.0,966,571,https://www.flickr.com/photos/rjbailey/27391093362/,https://creativecommons.org/licenses/by/2.0/,Ron Bailey,https://www.flickr.com/people/rjbailey/\n212476b1b58a0cfe,https://c1.staticflickr.com/6/5349/29372567534_c17516e486_o.jpg,0.255402384501,0.25,0.766207153502,1.0,512,697,http://www.flickr.com/photos/andreboeni/29372567534/,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n919a6f1d23c6d05e,https://c1.staticflickr.com/6/5348/31279804625_839baf7892_o.jpg,0.0,0.25,0.5,1.0,145,983,https://www.flickr.com/photos/ddebold/31279804625,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/\nda4f4d6944d93ae0,https://c1.staticflickr.com/6/5260/29956436271_478885e6f4_o.jpg,0.0,0.0,0.75,1.0,735,779,https://www.flickr.com/photos/27665395@N05/29956436271,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n1461ed9402248ddc,https://c1.staticflickr.com/8/7699/27042345425_591120613f_o.jpg,0.25,0.25,0.75,1.0,514,725,https://www.flickr.com/photos/jimfischer/27042345425/,https://creativecommons.org/licenses/by/2.0/,Jim Fischer,https://www.flickr.com/people/jimfischer/\nf0dcd519b5499d48,https://c1.staticflickr.com/6/5218/29421210913_9b476c8d85_o.jpg,0.23052407932,0.25,0.69157223796,1.0,664,231,https://www.flickr.com/photos/eltb/29421210913,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n9a5913e0fb6d0866,https://c1.staticflickr.com/9/8795/28922147966_1362994487_o.jpg,0.0,0.0,0.5625,0.75,767,204,https://www.flickr.com/photos/londonmatt/28922147966/,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\ncfab8f880da31ad8,https://c1.staticflickr.com/1/35/31390789132_d7ab56b8eb_o.jpg,0.28125,0.0,0.84375,0.75,541,308,https://www.flickr.com/photos/jsjgeology/31390789132,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n17df043d369008f5,https://c1.staticflickr.com/9/8249/28958829961_fe65fb3bb9_o.jpg,0.281690140845,0.25,0.845070422535,1.0,991,802,https://www.flickr.com/photos/scotnelson/28958829961,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n95d6a4087f394d8b,https://c1.staticflickr.com/9/8129/28719483854_d03b5d7da2_o.jpg,0.333333333333,0.0,1.0,1.0,750,541,https://flickr.com/96541566@N06/28719483854,https://creativecommons.org/licenses/by/2.0/,Jan Helebrant,https://www.flickr.com/people/96541566@N06/\n0be391239ccba0f2,https://c1.staticflickr.com/4/3905/32853501241_fc35720ce1_o.jpg,0.0,0.0,0.7484375,1.0,719,996,https://www.flickr.com/photos/feeney1982/32853501241,https://creativecommons.org/licenses/by/2.0/,MK Feeney,https://www.flickr.com/people/feeney1982/\n8d68931ba23fdeb7,https://c1.staticflickr.com/8/7102/27075766490_313dd1d866_o.jpg,0.0,0.267530487805,0.75,0.802591463415,842,800,https://www.flickr.com/photos/spreadshirt/27075766490,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/\n6bff4ecb94f1f84e,https://c1.staticflickr.com/9/8347/28860027516_8f8d9bee70_o.jpg,0.257672155689,0.0,0.773016467066,0.75,859,866,https://www.flickr.com/photos/governosp/28860027516,https://creativecommons.org/licenses/by/2.0/,Governo do Estado de S\\303\\243o Paulo,https://www.flickr.com/people/governosp/\n96fcb76927274db6,https://c1.staticflickr.com/9/8705/28851545335_aa85baa5f3_o.jpg,0.5,0.25,1.0,1.0,472,316,https://www.flickr.com/photos/quinet/28851545335,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n4de063bd5b838f11,https://c1.staticflickr.com/6/5669/30863954931_bc7e58710c_o.jpg,0.28125,0.0,0.84375,0.75,2,289,https://www.flickr.com/photos/tamakisono/30863954931/,https://creativecommons.org/licenses/by/2.0/,Tamaki Sono,https://www.flickr.com/people/tamakisono/\n55b85f4336d9603a,https://c1.staticflickr.com/8/7245/27089308192_03759b12c3_o.jpg,0.0,0.0,1.0,1.0,880,30,https://www.flickr.com/photos/10459174@N03/27089308192/,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/\nf6437ed4f1b8fe23,https://c1.staticflickr.com/6/5695/31218448105_c5d0e22fd3_o.jpg,0.160367170626,0.0,0.481101511879,1.0,302,843,http://www.flickr.com/photos/131914450@N06/31218448105,https://creativecommons.org/licenses/by/2.0/,burgerking1975,https://www.flickr.com/people/131914450@N06/\na90d9627e2145090,https://c1.staticflickr.com/9/8059/29463573752_e27f82a1e6_o.jpg,0.510583941606,0.25,1.0,1.0,426,722,https://www.flickr.com/photos/60712129@N06/29463573752/,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/\nf4bde5facfdca0c6,https://c1.staticflickr.com/1/405/32476678205_491d504f85_o.jpg,0.0,0.0,1.0,1.0,788,194,https://flickr.com/14385354@N00/32476678205,https://creativecommons.org/licenses/by/2.0/,Ungry Young Man,https://www.flickr.com/people/markusunger/\n803450d936b35ebb,https://c1.staticflickr.com/8/7476/29073407732_3a52be689b_o.jpg,0.249631811487,0.0,0.748895434462,0.75,934,258,https://www.flickr.com/photos/comedynose/29073407732/,https://creativecommons.org/licenses/by/2.0/,Pete,https://www.flickr.com/people/comedynose/\nfff35cdcce3cde43,https://c1.staticflickr.com/9/8463/29106205880_18aa360993_o.jpg,0.0,0.0,0.5,0.75,913,409,https://www.flickr.com/photos/davebloggs007/29106205880,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\nb58e8d136aff5a50,https://c1.staticflickr.com/9/8188/29745896581_ff26e547ca_o.jpg,0.25,0.25,0.75,1.0,625,565,https://www.flickr.com/photos/fst_oeb_nrw/29745896581,https://creativecommons.org/licenses/by/2.0/,Fachstelle f\\303\\274r \\303\\226ffentliche Bibliotheken NRW,https://www.flickr.com/people/fst_oeb_nrw/\n76d7e2d1bf3a31fe,https://c1.staticflickr.com/9/8072/29787724155_f733ca9146_o.jpg,0.421177266576,0.25,0.842354533153,1.0,312,732,https://www.flickr.com/photos/31031835@N08/29787724155,https://creativecommons.org/licenses/by/2.0/,John Tann,https://www.flickr.com/people/31031835@N08/\na777db736ecdfb65,https://c1.staticflickr.com/8/7324/27415463920_2958a226d7_o.jpg,0.0,0.128161888702,1.0,1.0,326,56,https://www.flickr.com/photos/wildreturn/27415463920,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\nf1a6fdadaa132225,https://c1.staticflickr.com/6/5455/30574341260_ec628a854c_o.jpg,0.25,0.0,1.0,0.75,990,18,https://www.flickr.com/photos/hills_alive/30574341260,https://creativecommons.org/licenses/by/2.0/,Caroline,https://www.flickr.com/people/hills_alive/\n6bea02f26beef50d,https://c1.staticflickr.com/6/5700/29664825844_e3a32c8217_o.jpg,0.249079528719,0.0,0.747238586156,0.75,709,267,https://www.flickr.com/photos/londonmatt/29664825844,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n7b6a9bf5b175e3b2,https://c1.staticflickr.com/9/8270/30005296161_6f99755f62_o.jpg,0.372611464968,0.0,0.745222929936,0.75,558,599,https://www.flickr.com/photos/imo-un/30005296161,https://creativecommons.org/licenses/by/2.0/,International Maritime Organization,https://www.flickr.com/people/imo-un/\n7c249a944594a62e,https://c1.staticflickr.com/6/5810/30483710105_e24bbc2699_o.jpg,0.0,0.0,0.5625,0.75,990,620,https://www.flickr.com/photos/verzo/30483710105,https://creativecommons.org/licenses/by/2.0/,Roberto Verzo,https://www.flickr.com/people/verzo/\n5c2d823a4d30e3d5,https://c1.staticflickr.com/6/5613/30328326823_cd02f11183_o.jpg,0.248348017621,0.25,0.745044052863,1.0,718,894,https://www.flickr.com/photos/thartz00/30328326823,https://creativecommons.org/licenses/by/2.0/,likeaduck,https://www.flickr.com/people/thartz00/\nfc94d8ed9eca8c51,https://c1.staticflickr.com/2/1478/26763589175_4f80c5497b_o.jpg,0.0,0.0,0.666666666667,1.0,390,584,https://www.flickr.com/photos/stevendepolo/26763589175,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n73728c249317ccb9,https://c1.staticflickr.com/1/623/31659729526_41139a4893_o.jpg,0.28125,0.0,0.84375,0.75,848,145,http://www.flickr.com/photos/mohit_s/31659729526/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/\n0b1d45bd9ab1064e,https://c1.staticflickr.com/9/8272/29868746026_7a9165f2d9_o.jpg,0.0,0.0,0.666666666667,1.0,561,563,https://www.flickr.com/photos/jill_carlson/29868746026,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\n4b52fd42977215b9,https://c1.staticflickr.com/8/7555/27346942261_e7b059637c_o.jpg,0.0,0.0,0.5625,0.75,901,627,https://www.flickr.com/photos/rusty_clark/27346942261,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\nc27e3bde18fba21b,https://c1.staticflickr.com/6/5127/30107077575_dce955ff33_o.jpg,0.0,0.25,0.492324561404,1.0,323,128,https://www.flickr.com/photos/postmanpetecoluk/30107077575,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\n5dbfff56258cf9e6,https://c1.staticflickr.com/1/613/31473791884_176af43beb_o.jpg,0.0,0.262273413897,0.75,0.786820241692,318,385,https://flickr.com/52450054@N04/31473791884,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\nc47ca11294a9aefe,https://c1.staticflickr.com/9/8724/28243588105_0e8673ea4b_o.jpg,0.25,0.25,1.0,0.75,547,119,https://www.flickr.com/photos/80037792@N03/28243588105/,https://creativecommons.org/licenses/by/2.0/,Adri\\303\\241n  Castillo Rivera,https://www.flickr.com/people/80037792@N03/\n97917829607b6189,https://c1.staticflickr.com/1/435/31542814264_1481334d51_o.jpg,0.25,0.0,0.75,0.75,859,660,https://www.flickr.com/photos/72821066@N04/31542814264,https://creativecommons.org/licenses/by/2.0/,Kathleen,https://www.flickr.com/people/72821066@N04/\nd386396825739960,https://c1.staticflickr.com/6/5671/31045268386_89505e1441_o.jpg,0.514898255814,0.0,1.0,0.75,854,227,https://www.flickr.com/photos/13476480@N07/31045268386,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n44fa09bc5f8e69a5,https://c1.staticflickr.com/8/7556/27540902503_548da9039e_o.jpg,0.4108,0.0,1.0,0.75,304,990,https://www.flickr.com/photos/gails_pictures/27540902503,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n70db5a1689f89129,https://c1.staticflickr.com/8/7368/28008608932_93cb96fee0_o.jpg,0.238832853026,0.0,0.716498559078,0.75,434,472,https://www.flickr.com/photos/familymwr/28008608932/,https://creativecommons.org/licenses/by/2.0/,U.S. Army,https://www.flickr.com/people/familymwr/\n89d60f53d478c4f7,https://c1.staticflickr.com/8/7303/26926132240_65cf222cf4_o.jpg,0.0,0.25,0.5,1.0,668,435,https://www.flickr.com/photos/codnewsroom/26926132240,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\nd531a31add433f46,https://c1.staticflickr.com/9/8621/28763062545_b79f4f72ff_o.jpg,0.5,0.25,1.0,1.0,764,769,https://www.flickr.com/photos/rusty_clark/28763062545,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n4d0c0f35a0c00bdc,https://c1.staticflickr.com/8/7262/26732253551_7b396172cf_o.jpg,0.0,0.0,0.75,0.636439267887,680,432,https://www.flickr.com/photos/kayadams/26732253551,https://creativecommons.org/licenses/by/2.0/,Kay Adams,https://www.flickr.com/people/kayadams/\n33197fa6ae88508a,https://c1.staticflickr.com/9/8032/29583923580_143f4756d0_o.jpg,0.398058252427,0.25,1.0,1.0,848,30,https://www.flickr.com/photos/zachievenor/29583923580,https://creativecommons.org/licenses/by/2.0/,Zachi Evenor,https://www.flickr.com/people/zachievenor/\n78059d1afd7b9fea,https://c1.staticflickr.com/9/8268/28771428103_98f31c968c_o.jpg,0.0,0.0,1.0,1.0,58,248,https://www.flickr.com/photos/brutchersp/28771428103,https://creativecommons.org/licenses/by/2.0/,Sam Brutcher,https://www.flickr.com/people/brutchersp/\n542c07e8bf8e283c,https://c1.staticflickr.com/1/530/32275825531_4a40f15002_o.jpg,0.0,0.0,0.5625,0.75,145,706,https://flickr.com/77110886@N07/32275825531,https://creativecommons.org/licenses/by/2.0/,AmishRob,https://www.flickr.com/people/77110886@N07/\ne8c99e0220ab46d2,https://c1.staticflickr.com/8/7408/27465191295_e5f6865548_o.jpg,0.0,0.244318181818,1.0,0.732954545455,591,535,https://www.flickr.com/photos/50019407@N03/27465191295,https://creativecommons.org/licenses/by/2.0/,striegel,https://www.flickr.com/people/50019407@N03/\nc755f3b0f89028fc,https://c1.staticflickr.com/6/5656/30912005906_eeb50d4284_o.jpg,0.4375,0.0,1.0,0.75,566,827,https://www.flickr.com/photos/railwayofaustralia/30912005906/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/\n76db169867bf2e9d,https://c1.staticflickr.com/6/5759/30161761356_e4053ff3fb_o.jpg,0.25,0.0,1.0,0.75,964,908,https://flickr.com/93362968@N00/30161761356,https://creativecommons.org/licenses/by/2.0/,Ruben,https://www.flickr.com/people/surfzone/\n784232355d49601b,https://c1.staticflickr.com/1/624/31694410765_dea6857dfb_o.jpg,0.321273516643,0.0,0.963820549928,1.0,327,161,https://www.flickr.com/photos/42244964@N03/31694410765,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/\ne99ceff3e420ef95,https://c1.staticflickr.com/8/7381/27954856402_191862c411_o.jpg,0.278188180404,0.25,0.834564541213,1.0,831,768,https://www.flickr.com/photos/photographingtravis/27954856402/,https://creativecommons.org/licenses/by/2.0/,Travis Wise,https://www.flickr.com/people/photographingtravis/\n23955512cd0e1191,https://c1.staticflickr.com/8/7578/30160381445_b3e6087902_o.jpg,0.0,0.25,0.497426470588,1.0,476,742,https://www.flickr.com/photos/kylemcdonald/30160381445,https://creativecommons.org/licenses/by/2.0/,Kyle McDonald,https://www.flickr.com/people/kylemcdonald/\nd6eac6858474111c,https://c1.staticflickr.com/8/7320/27399110256_d3fe95b790_o.jpg,0.24882629108,0.0,1.0,1.0,323,250,https://www.flickr.com/photos/j_benson/27399110256/,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/\n8d90c523b27410a7,https://c1.staticflickr.com/8/7364/27529300064_90409b557b_o.jpg,0.0,0.491827637444,0.75,1.0,321,563,https://www.flickr.com/photos/postmanpetecoluk/27529300064,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\n5cf72b48fdf5e419,https://c1.staticflickr.com/6/5718/30045803555_c7a2fba567_o.jpg,0.495552731893,0.0,0.991105463787,1.0,630,744,https://www.flickr.com/photos/135366503@N05/30045803555,https://creativecommons.org/licenses/by/2.0/,CLAUDIA DEA,https://www.flickr.com/people/135366503@N05/\n228fec6cab5f560d,https://c1.staticflickr.com/1/668/31760002531_3b7716366a_o.jpg,0.333333333333,0.0,1.0,1.0,974,931,https://flickr.com/39136124@N00/31760002531,https://creativecommons.org/licenses/by/2.0/,Paul Asman and Jill Lenoble,https://www.flickr.com/people/pauljill/\ne7b61bec5e4ca40e,https://c1.staticflickr.com/6/5663/30514982830_d4031e75fe_o.jpg,0.0,0.333049403748,0.75,1.0,324,674,https://flickr.com/44465748@N00/30514982830,https://creativecommons.org/licenses/by/2.0/,benet2006,https://www.flickr.com/people/benetd/\nd3551db0b83c8fc0,https://c1.staticflickr.com/9/8310/29174628816_300ec9d85c_o.jpg,0.5,0.25,1.0,1.0,618,324,https://www.flickr.com/photos/dccentralkitchen/29174628816,https://creativecommons.org/licenses/by/2.0/,DC Central Kitchen,https://www.flickr.com/people/dccentralkitchen/\nc7d0c73d636300f5,https://c1.staticflickr.com/4/3390/3194974577_b7573f6c32_o.jpg,0.489195230999,0.25,1.0,1.0,830,801,https://www.flickr.com/photos/davidwilson1949/3194974577,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n61ed2594a0524631,https://c1.staticflickr.com/8/7456/27590651131_7c9941b3ce_o.jpg,0.0,0.25,0.5,1.0,472,996,https://www.flickr.com/photos/prayitnophotography/27590651131,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\n89f48bcf97aa6600,https://c1.staticflickr.com/9/8478/29134440636_664709aa0b_o.jpg,0.25,0.25,0.75,1.0,418,70,https://www.flickr.com/photos/pavdw/29134440636,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/\ned786d792c4309a4,https://c1.staticflickr.com/8/7630/27108493571_721c8b15ac_o.jpg,0.25,0.0,1.0,0.75,499,962,https://www.flickr.com/photos/jjeff/27108493571,https://creativecommons.org/licenses/by/2.0/,Jeff Robbins,https://www.flickr.com/people/jjeff/\n9fe19d5c6dab83a3,https://c1.staticflickr.com/8/7507/29079497195_c97c2f18c1_o.jpg,0.5,0.0,1.0,0.75,455,805,https://www.flickr.com/photos/stevendepolo/29079497195,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nd5d5f843f100328c,https://c1.staticflickr.com/8/7366/26927066371_055fb093dc_o.jpg,0.25,0.25,1.0,1.0,886,538,https://www.flickr.com/photos/garlandcannon/26927066371,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/\n789417c091011f53,https://c1.staticflickr.com/6/5632/30859118166_ac1328ed72_o.jpg,0.5,0.25,1.0,1.0,345,177,https://flickr.com/145232592@N06/30859118166,https://creativecommons.org/licenses/by/2.0/,Martin7d2,https://www.flickr.com/people/martin7d2/\ne648427e38e80ff8,https://c1.staticflickr.com/8/7440/27289001152_11922d530c_o.jpg,0.466894977169,0.25,1.0,1.0,888,617,https://www.flickr.com/photos/marinelson/27289001152,https://creativecommons.org/licenses/by/2.0/,Marinelson Almeida - Traveling through Brazil,https://www.flickr.com/people/marinelson/\n1478a0fc99a988db,https://c1.staticflickr.com/8/7775/29139964033_0509a1d34c_o.jpg,0.25,0.28125,1.0,0.84375,776,928,https://www.flickr.com/photos/juggernautco/29139964033,https://creativecommons.org/licenses/by/2.0/,Daniel X. O&#x27;Neil,https://www.flickr.com/people/juggernautco/\ne758de2cbb3d10a0,https://c1.staticflickr.com/6/5341/30948537862_3f3461e1a1_o.jpg,0.0,0.25,0.63875,1.0,305,905,https://www.flickr.com/photos/gails_pictures/30948537862,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n8af30e5c3fa48a08,https://c1.staticflickr.com/8/7646/29079347226_a8454b4835_o.jpg,0.249079528719,0.25,0.747238586156,1.0,696,71,https://www.flickr.com/photos/brandedbulltank/29079347226/,https://creativecommons.org/licenses/by/2.0/,Tank,https://www.flickr.com/people/brandedbulltank/\n38287d2e5a4a9a57,https://c1.staticflickr.com/9/8518/28286972964_4a723a160a_o.jpg,0.25,0.25,1.0,1.0,960,798,https://www.flickr.com/photos/g4gti/28286972964/,https://creativecommons.org/licenses/by/2.0/,Ryohei Noda,https://www.flickr.com/people/g4gti/\nc6e0d2ab3bbf4a3e,https://c1.staticflickr.com/8/7053/27295097944_149d29443d_o.jpg,0.28125,0.0,0.84375,0.75,706,838,https://www.flickr.com/photos/davidwilson1949/27295097944,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n4cccb215bd60b3c3,https://c1.staticflickr.com/2/1476/26151802513_eba98c8b71_o.jpg,0.333333333333,0.0,1.0,1.0,33,341,https://www.flickr.com/photos/briangratwicke/26151802513,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/\n9a49001b63903f72,https://c1.staticflickr.com/9/8320/29938183125_fbbd772391_o.jpg,0.333333333333,0.0,1.0,1.0,769,804,https://www.flickr.com/photos/abaecherliphotography/29938183125/,https://creativecommons.org/licenses/by/2.0/,Samuel Ab\\303\\244cherli,https://www.flickr.com/people/abaecherliphotography/\n1cbae41091a750dc,https://c1.staticflickr.com/8/7437/27918206525_1045d33569_o.jpg,0.0,0.25,0.561328125,1.0,473,814,http://www.flickr.com/16915761@N08/27918206525,https://creativecommons.org/licenses/by/2.0/,Gordon Watt,https://www.flickr.com/people/gordon_watt/\nde40907c1e2c5515,https://c1.staticflickr.com/8/7717/26258443973_8a326bac94_o.jpg,0.0,0.0,1.0,0.75,629,486,https://www.flickr.com/photos/yutakaseki/26258443973,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/\n446f75fdea0e1da0,https://c1.staticflickr.com/9/8197/28459775774_861c11bd49_o.jpg,0.28125,0.0,0.84375,0.75,922,201,https://www.flickr.com/photos/pussreboots/28459775774/,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/\n059da9a174262427,https://c1.staticflickr.com/8/7529/26612408253_d5156925ff_o.jpg,0.0,0.25,0.521428571429,1.0,254,630,https://www.flickr.com/photos/70253321@N00/26612408253/,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/\n35c344ca0584ba14,https://c1.staticflickr.com/6/5759/31004746922_f545e4c9e3_o.jpg,0.504405286344,0.0,1.0,0.75,688,831,https://www.flickr.com/photos/eltb/31004746922,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nc335ce88293384f2,https://c1.staticflickr.com/8/7345/27701978545_2cf121bede_o.jpg,0.0,0.0,0.75,1.0,735,629,https://www.flickr.com/photos/27665395@N05/27701978545,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\ndaa6404780b1af27,https://c1.staticflickr.com/6/5785/29921098450_5016da1899_o.jpg,0.25,0.25,0.75,1.0,638,999,https://www.flickr.com/photos/bazzadarambler/29921098450,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\n446b24f903b488fc,https://c1.staticflickr.com/6/5521/31389531466_ba559c04c8_o.jpg,0.0,0.0,0.435350756534,0.75,144,839,https://www.flickr.com/photos/winnu/31389531466/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/\nd7ffed8f21024a14,https://c1.staticflickr.com/9/8728/28249502800_8a99581af4_o.jpg,0.25,0.25,0.75,1.0,752,922,https://www.flickr.com/photos/42220226@N07/28249502800,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\n5efeca6c4c233f01,https://c1.staticflickr.com/6/5500/31284538395_f1ef2882f9_o.jpg,0.486191860465,0.0,0.97238372093,0.75,761,464,https://www.flickr.com/photos/lge/31284538395,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n7d599306068f4594,https://c1.staticflickr.com/8/7715/27614734306_5cd65c4100_o.jpg,0.4375,0.25,1.0,1.0,717,514,https://www.flickr.com/photos/142136365@N08/27614734306,https://creativecommons.org/licenses/by/2.0/,Sery Content Development MT,https://www.flickr.com/people/142136365@N08/\n67a52d9155241752,https://c1.staticflickr.com/9/8571/27757091954_a8b6697969_o.jpg,0.0,0.25,0.5625,1.0,830,420,https://www.flickr.com/photos/raver_mikey/27757091954,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/\ndc12a25cc85ee9cf,https://c1.staticflickr.com/6/5220/29764054890_0309cd8fb8_o.jpg,0.0,0.0,0.374521072797,0.75,647,896,http://www.flickr.com/photos/vitroids/29764054890/,https://creativecommons.org/licenses/by/2.0/,Masakazu Matsumoto,https://www.flickr.com/people/vitroids/\n0d6463e9a7ef6185,https://c1.staticflickr.com/9/8147/28957674191_b862ba9c0c_o.jpg,0.0,0.0,0.662261380323,1.0,771,786,https://www.flickr.com/photos/spera-designerschuhe/28957674191,https://creativecommons.org/licenses/by/2.0/,\"SPERA.de Designerschuhe, Taschen und Accessoires\",https://www.flickr.com/people/spera-designerschuhe/\naf543b5f19ed1b1d,https://c1.staticflickr.com/2/1659/26658174432_76a1fc6cd7_o.jpg,0.28125,0.0,0.84375,0.75,40,391,https://www.flickr.com/photos/briangratwicke/26658174432,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/\na7151de51c2f1d0b,https://c1.staticflickr.com/9/8622/27804271193_73fe11b408_o.jpg,0.25,0.340254237288,1.0,1.0,345,214,https://www.flickr.com/photos/jared422/27804271193,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/\nc5c9d17672ff88ce,https://c1.staticflickr.com/8/7654/27071795905_8908bd10e9_o.jpg,0.25,0.0,1.0,0.561328125,458,266,https://www.flickr.com/photos/140473922@N07/27071795905/,https://creativecommons.org/licenses/by/2.0/,malnasfalu,https://www.flickr.com/people/140473922@N07/\n5bdb8268eadf57d8,https://c1.staticflickr.com/6/5765/30333126152_38071946f0_o.jpg,0.0,0.0,0.666666666667,1.0,852,968,https://www.flickr.com/photos/37491467@N07/30333126152,https://creativecommons.org/licenses/by/2.0/,Say_No_To_Turtles,https://www.flickr.com/people/37491467@N07/\n80177288cda51d95,https://c1.staticflickr.com/1/712/32401234622_f7ec1efbe5_o.jpg,0.0,0.0,0.75,1.0,641,605,https://flickr.com/57868312@N00/32401234622,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n5b60477a29c7ef81,https://c1.staticflickr.com/1/648/32597389405_80e847a182_o.jpg,0.333333333333,0.0,1.0,1.0,416,700,http://www.flickr.com/photos/bexwalton/32597389405/,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/\nda7e65bc80814f37,https://c1.staticflickr.com/6/5337/30469224383_6aa5c4a26b_o.jpg,0.5,0.0,1.0,0.75,788,603,https://www.flickr.com/photos/aloha75/30469224383/,https://creativecommons.org/licenses/by/2.0/,Sam Howzit,https://www.flickr.com/people/aloha75/\n4aeb33c9e565a201,https://c1.staticflickr.com/8/7631/27704602521_784d784312_o.jpg,0.0,0.0,0.735294117647,1.0,98,840,https://www.flickr.com/photos/7326810@N08/27704602521,https://creativecommons.org/licenses/by/2.0/,Jean,https://www.flickr.com/people/7326810@N08/\n19d43f8204d3183d,https://c1.staticflickr.com/8/7100/27097357596_2e5f7f8ddb_o.jpg,0.0,0.0,0.75,0.646812080537,985,378,https://www.flickr.com/photos/atoach/27097357596,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n2b741c5c635a7295,https://c1.staticflickr.com/9/8870/28112675323_f9aa3a3600_o.jpg,0.0,0.0,0.681073025335,1.0,108,634,https://www.flickr.com/photos/flowcomm/28112675323,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\n398720b8f19d5b84,https://c1.staticflickr.com/1/502/32384871825_3a1708f568_o.jpg,0.5,0.25,1.0,1.0,697,700,https://flickr.com/146625745@N08/32384871825,https://creativecommons.org/licenses/by/2.0/,home thods,https://www.flickr.com/people/146625745@N08/\nab8329c28d8538c3,https://c1.staticflickr.com/6/5507/31042117711_9b835b691b_o.jpg,0.481981981982,0.25,1.0,1.0,469,13,https://www.flickr.com/photos/fernando680411/31042117711,https://creativecommons.org/licenses/by/2.0/,Nelson Fernando  Sotelo Castro,https://www.flickr.com/people/fernando680411/\n348618ddbde3a39c,https://c1.staticflickr.com/9/8604/27892878974_931dc78b34_o.jpg,0.0,0.0,0.75,0.535877862595,386,460,https://www.flickr.com/photos/bvi4092/27892878974,https://creativecommons.org/licenses/by/2.0/,bvi4092,https://www.flickr.com/people/bvi4092/\nd0029b3675b792ae,https://c1.staticflickr.com/9/8739/28789525922_b9ea40444c_o.jpg,0.322236180905,0.0,0.966708542714,0.75,790,902,https://www.flickr.com/photos/84906483@N08/28789525922/,https://creativecommons.org/licenses/by/2.0/,spinster cardigan,https://www.flickr.com/people/84906483@N08/\n69854b68476d5068,https://c1.staticflickr.com/9/8239/29052269695_ba56b1b270_o.jpg,0.498159057437,0.0,0.996318114875,0.75,893,733,https://www.flickr.com/photos/zigazou76/29052269695,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n4bdb561770b52424,https://c1.staticflickr.com/8/7429/27735562062_14d90e477c_o.jpg,0.25,0.25,0.75,1.0,147,184,https://www.flickr.com/photos/blachswan/27735562062,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\na92ab9e5fb9c5d64,https://c1.staticflickr.com/9/8121/29350360356_21b52b834f_o.jpg,0.500736377025,0.25,1.0,1.0,629,457,https://www.flickr.com/photos/glynlowe/29350360356,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/\n8c6edf1ddfb61102,https://c1.staticflickr.com/8/7310/27095263593_6c217dcf2d_o.jpg,0.503303964758,0.0,1.0,0.75,889,123,https://www.flickr.com/photos/sybarite48/27095263593,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nc135b139d293f7f2,https://c1.staticflickr.com/6/5511/31483820115_746e4778f1_o.jpg,0.324925816024,0.0,1.0,1.0,347,491,https://www.flickr.com/photos/13476480@N07/31483820115,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n7d2e9b03ec1b630b,https://c1.staticflickr.com/8/7391/27341486272_663d67f419_o.jpg,0.25,0.0,0.75,0.75,401,535,https://www.flickr.com/photos/joi/27341486272,https://creativecommons.org/licenses/by/2.0/,Joi Ito,https://www.flickr.com/people/joi/\n29fe8d653950a631,https://c1.staticflickr.com/8/7694/26743914583_5a94c79b35_o.jpg,0.0,0.0,0.5,0.75,80,542,https://www.flickr.com/photos/quinet/26743914583/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nd4c817db6be62b71,https://c1.staticflickr.com/1/611/32446502452_f6b691f7cc_o.jpg,0.37517831669,0.0,1.0,1.0,95,164,https://www.flickr.com/photos/tdlucas5000/32446502452,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/\n1e77361718213a43,https://c1.staticflickr.com/1/606/32230247896_6f7d356e7e_o.jpg,0.0,0.0,1.0,1.0,440,435,https://flickr.com/73833659@N00/32230247896,https://creativecommons.org/licenses/by/2.0/,MK Feeney,https://www.flickr.com/people/feeney1982/\n6711e27733cfd050,https://c1.staticflickr.com/6/5510/31404867966_99715bd367_o.jpg,0.435350756534,0.25,0.870701513067,1.0,718,733,https://www.flickr.com/photos/dok1/31404867966,https://creativecommons.org/licenses/by/2.0/,Don O&#x27;Brien,https://www.flickr.com/people/dok1/\ndf874264566c58a9,https://c1.staticflickr.com/8/7319/27496297684_111a2f5a16_o.jpg,0.25,0.25,1.0,1.0,742,152,https://flickr.com/60944636@N00/27496297684,https://creativecommons.org/licenses/by/2.0/,el cajon yacht club,https://www.flickr.com/people/el_cajon_yacht_club/\n67c0339b1dfda5f6,https://c1.staticflickr.com/6/5196/29898630576_fceec38d6a_o.jpg,0.0,0.25,0.499263622975,1.0,558,496,https://www.flickr.com/photos/thejointstaff/29898630576,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/\nabd121ef53a69ef8,https://c1.staticflickr.com/8/7724/27965730726_4baf0c6722_o.jpg,0.0,0.0,0.658629441624,0.75,240,335,https://www.flickr.com/photos/megs_pics/27965730726/,https://creativecommons.org/licenses/by/2.0/,Megan Cole,https://www.flickr.com/people/megs_pics/\n5021e7da00bf43b2,https://c1.staticflickr.com/6/5500/31195547582_09c4533c1c_o.jpg,0.25,0.25,1.0,1.0,480,937,https://flickr.com/96774554@N03/31195547582,https://creativecommons.org/licenses/by/2.0/,Wheels ON,https://www.flickr.com/people/96774554@N03/\nebdfdcba5dc3b72a,https://c1.staticflickr.com/1/422/32445585326_8074f13658_o.jpg,0.0,0.0,0.5,0.75,868,600,https://www.flickr.com/photos/greggjerdingen/32445585326/,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n68274b8293271807,https://c1.staticflickr.com/8/7281/27344963241_0feb45e01d_o.jpg,0.0,0.25,0.499263622975,1.0,834,579,https://www.flickr.com/photos/ministreiodadefesa/27344963241,https://creativecommons.org/licenses/by/2.0/,Minist\\303\\251rio da Defesa,https://www.flickr.com/people/ministreiodadefesa/\na84ead15406596ce,https://c1.staticflickr.com/9/8300/29557884001_05493785a6_o.jpg,0.0,0.25,0.5,1.0,480,937,https://www.flickr.com/photos/concavowheels/29557884001,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/\n5d1df4748743d42e,https://c1.staticflickr.com/8/7368/27924672426_3fde6b8850_o.jpg,0.25,0.43661971831,1.0,1.0,964,322,https://www.flickr.com/photos/dalecruse/27924672426,https://creativecommons.org/licenses/by/2.0/,Dale Cruse,https://www.flickr.com/people/dalecruse/\n16ff75228179469c,https://c1.staticflickr.com/6/5564/29957754894_f57a1c39f2_o.jpg,0.502573529412,0.25,1.0,1.0,228,386,https://flickr.com/32234827@N03/29957754894,https://creativecommons.org/licenses/by/2.0/,Dick Thompson,https://www.flickr.com/people/dick-thompson-sandian/\n6e840c209f5733d5,https://c1.staticflickr.com/9/8596/28375656583_c817d204c3_o.jpg,0.0,0.0,0.75,0.561328125,442,750,https://www.flickr.com/photos/cogdog/28375656583,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n16bbe588e0ecc6ab,https://c1.staticflickr.com/8/7078/26813986145_f515146bfa_o.jpg,0.482608695652,0.0,0.965217391304,0.75,142,168,https://www.flickr.com/photos/79452129@N02/26813986145,https://creativecommons.org/licenses/by/2.0/,Fyn Kynd Photography,https://www.flickr.com/people/79452129@N02/\n46b657df12fd7c26,https://c1.staticflickr.com/8/7129/27258007632_658fac681c_o.jpg,0.0,0.25,0.5625,1.0,284,724,https://www.flickr.com/photos/akras/27258007632/,https://creativecommons.org/licenses/by/2.0/,Andrey,https://www.flickr.com/people/akras/\nbc7dff0960bb3335,https://c1.staticflickr.com/8/7616/28648009596_6e65ac7ace_o.jpg,0.0,0.260752688172,0.75,1.0,443,765,https://www.flickr.com/photos/atoach/28648009596/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n128fca690a11f68c,https://c1.staticflickr.com/8/7369/26875470084_43357ac827_o.jpg,0.250923190547,0.25,0.75276957164,1.0,98,785,https://www.flickr.com/photos/quinet/26875470084,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\ned9b2813b9245e52,https://c1.staticflickr.com/9/8770/29809879405_c8cf2a2b31_o.jpg,0.0,0.0,0.5,0.75,880,676,https://www.flickr.com/photos/konstantinti/29809879405,https://creativecommons.org/licenses/by/2.0/,Konstantin Tilberg,https://www.flickr.com/people/konstantinti/\na187afb98f295057,https://c1.staticflickr.com/1/319/31741319460_db1f31d4b9_o.jpg,0.0,0.0,0.5625,0.75,121,755,https://www.flickr.com/photos/jsjgeology/31741319460,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nd2d2b255935f0aae,https://c1.staticflickr.com/6/5563/30545415915_150b5097e6_o.jpg,0.0,0.0,0.75,1.0,948,432,https://www.flickr.com/photos/torsten-behrens/30545415915/in/photostream/,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/\n4d008626b4b68665,https://c1.staticflickr.com/1/296/32309427086_5dcd538057_o.jpg,0.4375,0.25,1.0,1.0,108,780,https://flickr.com/21203533@N00/32309427086,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n10bc8784a5eb8843,https://c1.staticflickr.com/6/5582/30724498173_0e082b8ff0_o.jpg,0.488702623907,0.0,0.977405247813,0.75,744,210,https://www.flickr.com/photos/13476480@N07/30724498173,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n77ac8bf95825dfcc,https://c1.staticflickr.com/8/7259/26898012321_a3265271dd_o.jpg,0.248713235294,0.0,0.746139705882,0.75,635,728,https://www.flickr.com/photos/shankaronline/26898012321,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n5c8bcfa0dbb246ab,https://c1.staticflickr.com/8/7728/26215432693_2ee23efc4d_o.jpg,0.234375,0.25,0.703125,1.0,818,581,https://flickr.com/123760891@N03/26215432693,https://creativecommons.org/licenses/by/2.0/,Automobile Italia,https://www.flickr.com/people/automobileitalia/\nafb0233b2e0545c4,https://c1.staticflickr.com/9/8439/29240681086_52945bd07d_o.jpg,0.333333333333,0.0,1.0,1.0,581,959,https://www.flickr.com/photos/dalbera/29240681086,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n1bb5f1337dfb1edd,https://c1.staticflickr.com/1/589/32214674481_5a087370d6_o.jpg,0.25,0.405546623794,1.0,1.0,641,293,https://flickr.com/13194817@N00/32214674481,https://creativecommons.org/licenses/by/2.0/,F Delventhal,https://www.flickr.com/people/krossbow/\na3c4dd88edacb575,https://c1.staticflickr.com/1/561/31438357361_6a749db0f2_o.jpg,0.0,0.25,0.75,1.0,400,351,http://www.flickr.com/photos/condominiocriativo/31438357361/,https://creativecommons.org/licenses/by/2.0/,Condom\\303\\255nio Criativo,https://www.flickr.com/people/condominiocriativo/\n64ed3f0e8a2dc320,https://c1.staticflickr.com/1/323/31117919653_3c5225af88_o.jpg,0.555632823366,0.0,1.0,0.75,653,410,https://flickr.com/42310076@N04/31117919653,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/\nd25df1a8259d3fdf,https://c1.staticflickr.com/6/5676/30846111770_bc0995d221_o.jpg,0.24882629108,0.0,1.0,1.0,161,833,https://www.flickr.com/photos/adactio/30846111770,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/\n184a160b32ff4c72,https://c1.staticflickr.com/8/7111/26820702803_77558c6aba_o.jpg,0.328216374269,0.0,0.984649122807,1.0,518,717,https://www.flickr.com/photos/paytonc/26820702803,https://creativecommons.org/licenses/by/2.0/,Payton Chung,https://www.flickr.com/people/paytonc/\n4f722cab5573a5fb,https://c1.staticflickr.com/8/7567/28064754896_4c6440e3e0_o.jpg,0.28125,0.0,0.84375,0.75,885,392,https://www.flickr.com/photos/jdlasica/28064754896/,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\n1b546695167d3f6e,https://c1.staticflickr.com/6/5768/30206052140_ae3086703e_o.jpg,0.43661971831,0.0,1.0,0.75,960,837,https://www.flickr.com/photos/kudumomo/30206052140/,https://creativecommons.org/licenses/by/2.0/,momo,https://www.flickr.com/people/kudumomo/\n6a940d1bf69f1d10,https://c1.staticflickr.com/9/8122/29786339486_cf9f752823_o.jpg,0.0,0.187296416938,1.0,1.0,558,433,https://www.flickr.com/photos/southbeachcars/29786339486/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\nf4902a569fa12171,https://c1.staticflickr.com/8/7448/27323270341_7fc97564c7_o.jpg,0.5,0.0,1.0,0.75,950,992,https://flickr.com/141397992@N02/27323270341,https://creativecommons.org/licenses/by/2.0/,Vegan Photo,https://www.flickr.com/people/141397992@N02/\n54a6b2cd7f89220e,https://c1.staticflickr.com/2/1462/26144464314_ae66e3b1da_o.jpg,0.28125,0.0,0.84375,0.75,918,171,https://www.flickr.com/photos/londonmatt/26144464314,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n7b71925e989ee1d8,https://c1.staticflickr.com/1/348/31544121611_8bf40c6800_o.jpg,0.21087398374,0.25,0.63262195122,1.0,934,35,https://www.flickr.com/photos/hile/31544121611,https://creativecommons.org/licenses/by/2.0/,Helen Penjam,https://www.flickr.com/people/hile/\neae13c52554a7783,https://c1.staticflickr.com/1/283/31571942652_56aeae1bf8_o.jpg,0.245614035088,0.25,0.736842105263,1.0,781,848,https://flickr.com/149503105@N07/31571942652,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/\nb1e69e9c3d740f4c,https://c1.staticflickr.com/9/8733/28200514302_2f59d09947_o.jpg,0.0,0.25,0.5625,1.0,4,833,https://www.flickr.com/photos/noaaphotolib/28200514302,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\n493e327b171ab0c3,https://c1.staticflickr.com/6/5475/30311997820_5114dcc89a_o.jpg,0.0,0.0,0.672592592593,1.0,831,856,https://www.flickr.com/photos/13476480@N07/30311997820,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n2efe4916e679e875,https://c1.staticflickr.com/1/166/30669575014_c1861446e4_o.jpg,0.21087398374,0.0,0.63262195122,0.75,866,926,https://www.flickr.com/photos/franganillo/30669575014,https://creativecommons.org/licenses/by/2.0/,Jorge Franganillo,https://www.flickr.com/people/franganillo/\n588bd41c9aa5a81b,https://c1.staticflickr.com/8/7138/26571751464_519eeae08c_o.jpg,0.25,0.0,1.0,0.75,534,154,https://www.flickr.com/photos/annethelibrarian/26571751464,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/\n49b1adfeb8ffcabd,https://c1.staticflickr.com/8/7556/27284219884_84e1fbcaeb_o.jpg,0.4375,0.0,1.0,0.75,932,671,https://www.flickr.com/photos/55229469@N07/27284219884,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\n225e06c2dfa68a62,https://c1.staticflickr.com/9/8055/28952537693_18d3e06407_o.jpg,0.25,0.0,0.75,0.75,882,945,https://www.flickr.com/photos/barnimages/28952537693/,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\nd7d5b34ea0a0ffcf,https://c1.staticflickr.com/9/8066/29898270981_73e0076c26_o.jpg,0.500736377025,0.25,1.0,1.0,878,970,https://www.flickr.com/photos/presidentialoffice/29898270981,https://creativecommons.org/licenses/by/2.0/,\\347\\270\\275\\347\\265\\261\\345\\272\\234,https://www.flickr.com/people/presidentialoffice/\n0212aa8aa912ee45,https://c1.staticflickr.com/6/5466/30266928545_e63bcb8041_o.jpg,0.327407407407,0.0,1.0,1.0,327,416,https://www.flickr.com/photos/dany13/30266928545,https://creativecommons.org/licenses/by/2.0/,dany13,https://www.flickr.com/people/dany13/\nd7de327bbf412965,https://c1.staticflickr.com/8/7568/28879744260_7f6ee27057_o.jpg,0.0,0.25,0.556376360809,1.0,490,660,https://www.flickr.com/photos/stevensnodgrass/28879744260,https://creativecommons.org/licenses/by/2.0/,Steve Snodgrass,https://www.flickr.com/people/stevensnodgrass/\n2200794c59b1808e,https://c1.staticflickr.com/1/508/32766800345_d32328469f_o.jpg,0.363560732113,0.0,1.0,0.75,311,214,https://www.flickr.com/photos/gails_pictures/32766800345,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n83896b9fb7e9c2f8,https://c1.staticflickr.com/9/8537/29037936543_0f751d4cdc_o.jpg,0.25,0.0,0.75,0.75,537,547,https://www.flickr.com/photos/elsie/29037936543/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\nf9f36f7774d73820,https://c1.staticflickr.com/3/2013/32659953892_0199b33b51_o.jpg,0.0,0.0,0.56338028169,0.75,305,723,https://www.flickr.com/photos/treegrow/32659953892,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n796e23f8dbf9a7a2,https://c1.staticflickr.com/8/7421/27680391126_32219fb627_o.jpg,0.0,0.0,0.666666666667,1.0,607,835,https://www.flickr.com/photos/quinet/27680391126,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\ndad40e355e4e8e96,https://c1.staticflickr.com/9/8027/29028347661_d9a3dc8d21_o.jpg,0.25,0.0,0.75,0.75,655,848,https://www.flickr.com/photos/karen_roe/29028347661,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/\n064e1cc405062c85,https://c1.staticflickr.com/1/645/31869882565_e6c7e4558a_o.jpg,0.0,0.25,0.5625,1.0,108,135,https://www.flickr.com/photos/jimg944/31869882565,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n1484479b7630af0a,https://c1.staticflickr.com/8/7520/27703755495_e5dd0273c4_o.jpg,0.25,0.0,0.75,0.75,702,904,https://www.flickr.com/photos/7armyjmtc/27703755495,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n18d5f99fe237a306,https://c1.staticflickr.com/9/8496/29071092183_9562a5b8dc_o.jpg,0.246827411168,0.0,0.740482233503,1.0,815,77,https://www.flickr.com/photos/yamahawatercraft/29071092183/,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/\nd0c6c29954f0380b,https://c1.staticflickr.com/1/517/32675860980_0c40361cf8_o.jpg,0.25,0.0,1.0,0.5,431,96,https://www.flickr.com/photos/tjspix/32675860980,https://creativecommons.org/licenses/by/2.0/,Teresa Johns,https://www.flickr.com/people/tjspix/\nc777da68bec01dcd,https://c1.staticflickr.com/9/8562/28193582220_b2580f280c_o.jpg,0.249631811487,0.25,0.748895434462,1.0,487,584,https://www.flickr.com/photos/mtaphotos/28193582220,https://creativecommons.org/licenses/by/2.0/,Metropolitan Transportation Authority of the State of New York,https://www.flickr.com/people/mtaphotos/\n5cd8864b6e35df82,https://c1.staticflickr.com/8/7105/27793628895_a1d2e5e492_o.jpg,0.0,0.0,0.75,1.0,866,898,https://www.flickr.com/photos/jeepersmedia/27793628895,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n444109f3ccfacc7b,https://c1.staticflickr.com/9/8064/29945301806_292581209b_o.jpg,0.25,0.0,0.75,0.75,336,221,https://www.flickr.com/photos/amslerpix/29945301806,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\nb722c809657aecee,https://c1.staticflickr.com/1/356/30881368874_ed2a887e15_o.jpg,0.0,0.5,0.75,1.0,777,640,https://www.flickr.com/photos/eebeephoto/30881368874/,https://creativecommons.org/licenses/by/2.0/,Ed Berger,https://www.flickr.com/people/eebeephoto/\na193f7ae7d550a82,https://c1.staticflickr.com/8/7285/27193523532_37b77df506_o.jpg,0.4375,0.25,1.0,1.0,738,631,https://www.flickr.com/photos/jeepersmedia/27193523532,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n97025d82ec9860dc,https://c1.staticflickr.com/9/8123/28630695394_9e536782e6_o.jpg,0.264605462822,0.0,0.793816388467,0.75,676,574,https://www.flickr.com/photos/jeepersmedia/28630695394,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n23f39187c0d00e30,https://c1.staticflickr.com/6/5581/30083343153_3e32030455_o.jpg,0.0,0.0,0.663235294118,1.0,972,658,https://flickr.com/14642507@N08/30083343153,https://creativecommons.org/licenses/by/2.0/,sasastro,https://www.flickr.com/people/sasastro/\n515c6586db87bbd8,https://c1.staticflickr.com/6/5590/30456955046_3073b879aa_o.jpg,0.0,0.0,0.665684830633,1.0,874,218,https://www.flickr.com/photos/bikashdas/30456955046,https://creativecommons.org/licenses/by/2.0/,Bikash Das,https://www.flickr.com/people/bikashdas/\n42e9b41ce96dbf0a,https://c1.staticflickr.com/9/8058/29670008630_bd1bfc6c1a_o.jpg,0.0,0.0,0.75,0.5625,851,647,https://www.flickr.com/photos/stellahyc/29670008630,https://creativecommons.org/licenses/by/2.0/,stellahyc910,https://www.flickr.com/people/stellahyc/\n126175abfdcb1a21,https://c1.staticflickr.com/1/386/32014236205_a98a5d344a_o.jpg,0.25,0.25,0.75,1.0,471,486,https://flickr.com/14771153@N04/32014236205,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\n4b0c9bf2584b35d3,https://c1.staticflickr.com/9/8394/29489318570_f677a927e0_o.jpg,0.0,0.25,0.75,1.0,960,79,https://www.flickr.com/photos/naotakem/29489318570/,https://creativecommons.org/licenses/by/2.0/,Naotake Murayama,https://www.flickr.com/people/naotakem/\n19b5bea9a7608a92,https://c1.staticflickr.com/3/2598/32087920803_43b48bab4b_o.jpg,0.28125,0.25,0.84375,1.0,778,435,https://www.flickr.com/photos/capcase/32087920803,https://creativecommons.org/licenses/by/2.0/,James Case,https://www.flickr.com/people/capcase/\n1a94dc47fdd84a95,https://c1.staticflickr.com/6/5761/30269979564_df6e9df309_o.jpg,0.0,0.277925531915,0.75,1.0,870,830,https://www.flickr.com/photos/ringkong/30269979564,https://creativecommons.org/licenses/by/2.0/,typexnick,https://www.flickr.com/people/ringkong/\nc35cd0d5673ec1db,https://c1.staticflickr.com/8/7531/29226165661_4d4c2264c7_o.jpg,0.0,0.25,0.5625,1.0,963,367,https://www.flickr.com/photos/stevendepolo/29226165661,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nb239b5b3e1642f3b,https://c1.staticflickr.com/6/5494/25330616759_529bdf9b94_o.jpg,0.512008733624,0.0,1.0,0.75,914,746,https://www.flickr.com/photos/sidelong/25330616759,https://creativecommons.org/licenses/by/2.0/,DaveBleasdale,https://www.flickr.com/people/sidelong/\ne22a1c8dab22f256,https://c1.staticflickr.com/8/7453/27575870760_ab7aeb3fe9_o.jpg,0.0,0.25,0.63875,1.0,311,11,https://www.flickr.com/photos/gails_pictures/27575870760,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nd959fd91192d5717,https://c1.staticflickr.com/6/5459/22848076308_16f2d07763_o.jpg,0.0,0.0,0.5,0.75,629,596,https://www.flickr.com/photos/prayitnophotography/22848076308,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\n692016122b9e07a6,https://c1.staticflickr.com/6/5489/29804286543_9cba22e186_o.jpg,0.25,0.25,0.75,1.0,960,123,https://www.flickr.com/photos/39419174@N00/29804286543/,https://creativecommons.org/licenses/by/2.0/,danieleloreto,https://www.flickr.com/people/39419174@N00/\n8749fd2540a0cb01,https://c1.staticflickr.com/8/7491/26781987183_ff723c7a40_o.jpg,0.0,0.578822733424,0.75,1.0,833,448,https://www.flickr.com/photos/ankurp/26781987183,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\n8e9e976fc98e3cfa,https://c1.staticflickr.com/8/7702/27224046005_eaa4681fee_o.jpg,0.28125,0.25,0.84375,1.0,666,740,https://www.flickr.com/photos/65542891@N05/27224046005,https://creativecommons.org/licenses/by/2.0/,bsa rwd 10hp,https://www.flickr.com/people/65542891@N05/\nd7c8008bf74f2324,https://c1.staticflickr.com/9/8691/28869458692_b60ba5200d_o.jpg,0.439189189189,0.0,1.0,1.0,815,672,https://www.flickr.com/photos/watts_photos/28869458692,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/\n330b9cb3cd80c88b,https://c1.staticflickr.com/8/7658/27109056921_f299a6739a_o.jpg,0.280784844384,0.0,0.842354533153,1.0,534,431,https://www.flickr.com/photos/annethelibrarian/27109056921,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/\n1ef172b89f4a39cf,https://c1.staticflickr.com/6/5508/31450600235_a463d20bb6_o.jpg,0.333333333333,0.0,1.0,1.0,51,536,https://www.flickr.com/photos/52450054@N04/31450600235/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\nb02b553998809e17,https://c1.staticflickr.com/8/7614/26966736165_2a6493858a_o.jpg,0.5,0.25,1.0,1.0,704,847,https://www.flickr.com/photos/30845197@N00/26966736165/,https://creativecommons.org/licenses/by/2.0/,TLV and more,https://www.flickr.com/people/30845197@N00/\n74b2e35cda75fe27,https://c1.staticflickr.com/1/316/32602465092_4522030924_o.jpg,0.0,0.25,0.576740506329,1.0,629,466,https://www.flickr.com/photos/archivesnz/32602465092/,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/\nf5a2cf5c66d313fa,https://c1.staticflickr.com/8/7090/27455698002_a951356516_o.jpg,0.25,0.0,1.0,1.0,977,656,https://www.flickr.com/photos/crondeau/27455698002,https://creativecommons.org/licenses/by/2.0/,Christine Rondeau,https://www.flickr.com/people/crondeau/\n5ceb9f2e8405b0de,https://c1.staticflickr.com/6/5666/30835439000_59b2871139_o.jpg,0.400242326333,0.25,1.0,1.0,412,64,https://www.flickr.com/photos/mdgovpics/30835439000/,https://creativecommons.org/licenses/by/2.0/,Maryland GovPics,https://www.flickr.com/people/mdgovpics/\n114c98c078c5aab0,https://c1.staticflickr.com/9/8705/28272303681_3f64c45d57_o.jpg,0.25,0.0,1.0,0.75,50,108,https://www.flickr.com/photos/austinevan/28272303681,https://creativecommons.org/licenses/by/2.0/,Evan Bench,https://www.flickr.com/people/austinevan/\nd741b583a123562b,https://c1.staticflickr.com/9/8728/29612129273_477bf62411_o.jpg,0.254086181278,0.25,0.762258543834,1.0,321,792,https://flickr.com/24025807@N06/29612129273,https://creativecommons.org/licenses/by/2.0/,CLUBE TREKKING SANTA MARIA RS BRASIL,https://www.flickr.com/people/hikingsantamaria/\n324278ff7f22b4eb,https://c1.staticflickr.com/4/3747/32487584933_83dbbe0cb8_o.jpg,0.25,0.25,1.0,1.0,498,303,https://flickr.com/25633870@N00/32487584933,https://creativecommons.org/licenses/by/2.0/,Dave Haygarth,https://www.flickr.com/people/minnellium/\n1f4227ce24232867,https://c1.staticflickr.com/8/7229/27970534102_43ed025ff3_o.jpg,0.4375,0.0,1.0,0.75,34,942,https://www.flickr.com/photos/hockeyholic/27970534102/,https://creativecommons.org/licenses/by/2.0/,Andy Blackledge,https://www.flickr.com/people/hockeyholic/\n5973419efd52f783,https://c1.staticflickr.com/6/5508/31120625660_9594495e7d_o.jpg,0.348396501458,0.0,1.0,1.0,625,795,https://www.flickr.com/photos/usnavalwarcollegeri/31120625660,https://creativecommons.org/licenses/by/2.0/,U.S. Naval War College,https://www.flickr.com/people/usnavalwarcollegeri/\nfdedd06cdf58084e,https://c1.staticflickr.com/8/7718/27331217545_3b853360be_o.jpg,0.0,0.200323101777,1.0,1.0,982,428,https://www.flickr.com/photos/slgc/27331217545,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\n911aebf30626ce02,https://c1.staticflickr.com/3/2430/32287607674_b11095a2e5_o.jpg,0.521645021645,0.25,1.0,1.0,875,731,https://www.flickr.com/photos/didbygraham/32287607674/,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n55599050147071cc,https://c1.staticflickr.com/8/7412/27512988611_20873a4f90_o.jpg,0.246522693997,0.25,0.739568081991,1.0,473,962,https://www.flickr.com/photos/vastateparksstaff/27512988611/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\neee6f4bcc8468f77,https://c1.staticflickr.com/1/652/31882765966_b27b4fcf19_o.jpg,0.0,0.0,1.0,0.666666666667,964,714,https://www.flickr.com/photos/oikeuttaelaimille/31882765966/,https://creativecommons.org/licenses/by/2.0/,Oikeutta el\\303\\244imille,https://www.flickr.com/people/oikeuttaelaimille/\n7f3c20f487834846,https://c1.staticflickr.com/8/7448/26824382232_3b4a0eddcd_o.jpg,0.0,0.0,0.678571428571,1.0,408,883,https://www.flickr.com/photos/zongo/26824382232,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n8c8bc30a62a1ee23,https://c1.staticflickr.com/1/431/30989283343_7cae478677_o.jpg,0.0,0.25,0.713028169014,1.0,304,2,https://www.flickr.com/photos/33398884@N03/30989283343/,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\n7e0fb7f80ffa514b,https://c1.staticflickr.com/1/717/31662466562_b2b1553c3d_o.jpg,0.25,0.0,1.0,1.0,655,405,https://www.flickr.com/photos/didbygraham/31662466562,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\nc02ff39fe5832f4b,https://c1.staticflickr.com/6/5597/30495370923_f689e3460c_o.jpg,0.25,0.25,0.75,1.0,905,675,https://www.flickr.com/photos/o_0/30495370923/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n891fe6baf8896b77,https://c1.staticflickr.com/8/7795/28741196845_ca00f0104f_o.jpg,0.25,0.0,1.0,0.75,325,535,https://www.flickr.com/photos/kellymcpherson/28741196845/,https://creativecommons.org/licenses/by/2.0/,Kelly Parker McPherson,https://www.flickr.com/people/kellymcpherson/\ne96d52f9fbe3ca0b,https://c1.staticflickr.com/3/2540/32722690932_52ea2c48f3_o.jpg,0.0,0.0,0.660792951542,1.0,631,435,https://flickr.com/29971610@N02/32722690932,https://creativecommons.org/licenses/by/2.0/,Esther Max,https://www.flickr.com/people/esthermax/\n29279d12ed3e29ff,https://c1.staticflickr.com/1/502/32144969220_9f0703dc8e_o.jpg,0.5,0.25,1.0,1.0,458,328,https://www.flickr.com/photos/foreignoffice/32144969220/,https://creativecommons.org/licenses/by/2.0/,Foreign and Commonwealth Office,https://www.flickr.com/people/foreignoffice/\nac295a63ac9d2cd7,https://c1.staticflickr.com/8/7292/27671965670_4d9e6a72c8_o.jpg,0.280784844384,0.0,0.842354533153,1.0,693,864,https://www.flickr.com/photos/shoppeolina/27671965670,https://creativecommons.org/licenses/by/2.0/,owlin aolin,https://www.flickr.com/people/shoppeolina/\n5d23b04cc45bc37b,https://c1.staticflickr.com/9/8178/29212985530_24749869f4_o.jpg,0.4375,0.25,1.0,1.0,518,737,https://www.flickr.com/photos/zongo/29212985530/,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n11c53fe6feb856c6,https://c1.staticflickr.com/8/7162/26707259244_e47c43b2b7_o.jpg,0.0,0.299878836834,0.75,0.899636510501,477,766,https://www.flickr.com/photos/edenpictures/26707259244,https://creativecommons.org/licenses/by/2.0/,\"Eden, Janine and Jim\",https://www.flickr.com/people/edenpictures/\ncbcb7444cc827812,https://c1.staticflickr.com/8/7549/26276389703_ecd645cc3e_o.jpg,0.333333333333,0.0,1.0,1.0,763,786,https://www.flickr.com/photos/agenciabrasilia/26276389703,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\nfe1314dd6f75551d,https://c1.staticflickr.com/8/7144/26370391824_3159ca42b2_o.jpg,0.0,0.25,0.75,1.0,921,565,https://www.flickr.com/photos/brendanadkins/26370391824,https://creativecommons.org/licenses/by/2.0/,Brendan Adkins,https://www.flickr.com/people/brendanadkins/\na8fca010774a1187,https://c1.staticflickr.com/1/425/31809450395_45b02082bb_o.jpg,0.4375,0.0,1.0,0.75,829,810,https://www.flickr.com/photos/fdecomite/31809450395/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\n5ec826683757ffae,https://c1.staticflickr.com/6/5731/30742412415_c35c2ff310_o.jpg,0.0,0.0,0.599757673667,0.75,23,369,https://www.flickr.com/photos/andymorffew/30742412415,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\nb9310b9080c06e4f,https://c1.staticflickr.com/8/7398/27330948851_cd9be2c204_o.jpg,0.25,0.318416523236,1.0,1.0,867,269,https://www.flickr.com/photos/60900612@N08/27330948851,https://creativecommons.org/licenses/by/2.0/,Thomas&#x27;s Pics,https://www.flickr.com/people/60900612@N08/\n4f9f0b75f5b04524,https://c1.staticflickr.com/8/7587/26933811080_cf8040335a_o.jpg,0.0,0.25,0.5,1.0,58,897,https://www.flickr.com/photos/gregthebusker/26933811080,https://creativecommons.org/licenses/by/2.0/,Greg Schechter,https://www.flickr.com/people/gregthebusker/\n4abadb721e74b99b,https://c1.staticflickr.com/8/7612/26811635786_e5a333566f_o.jpg,0.0,0.0,0.666666666667,1.0,945,781,https://www.flickr.com/photos/mwf2005/26811635786/,https://creativecommons.org/licenses/by/2.0/,muffinn,https://www.flickr.com/people/mwf2005/\na3c651cf20ee2d34,https://c1.staticflickr.com/8/7710/26294912563_ba1be3ec95_o.jpg,0.0,0.0,0.75,0.75,641,561,https://www.flickr.com/photos/49889874@N05/26294912563,https://creativecommons.org/licenses/by/2.0/,marc falardeau,https://www.flickr.com/people/49889874@N05/\n5c4eec952ca114a1,https://c1.staticflickr.com/1/528/31431409824_729b5c64d9_o.jpg,0.25,0.25,0.75,1.0,348,525,https://flickr.com/51986662@N05/31431409824,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n7f045354f4577c16,https://c1.staticflickr.com/9/8268/30074145430_c1afafabc2_o.jpg,0.25,0.0,1.0,0.75,558,970,https://www.flickr.com/photos/rodrigoparedes/30074145430,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/\n53211f8a1b131de6,https://c1.staticflickr.com/9/8732/28580034102_984ce9d944_o.jpg,0.22009569378,0.0,1.0,1.0,946,578,https://www.flickr.com/photos/elzey/28580034102,https://creativecommons.org/licenses/by/2.0/,Richard Elzey,https://www.flickr.com/people/elzey/\n9c0e25e2f72438e8,https://c1.staticflickr.com/6/5607/31102907732_def8083c3f_o.jpg,0.0,0.0,0.747269890796,1.0,512,506,https://www.flickr.com/photos/andreboeni/31102907732,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n55512a6c2a45e2e8,https://c1.staticflickr.com/8/7340/28096885425_4c07a3cf83_o.jpg,0.0,0.320512820513,0.75,0.961538461538,928,387,https://www.flickr.com/photos/uwlideas/28096885425/,https://creativecommons.org/licenses/by/2.0/,Med Coolman,https://www.flickr.com/people/uwlideas/\n869adfbad4e38261,https://c1.staticflickr.com/6/5697/30241927150_b62ec0df8a_o.jpg,0.25,0.0,1.0,0.75,592,866,https://www.flickr.com/photos/sonyanews/30241927150/,https://creativecommons.org/licenses/by/2.0/,sonyanews,https://www.flickr.com/people/sonyanews/\nadcf48b42266309d,https://c1.staticflickr.com/9/8057/29233160570_87ebbbc643_o.jpg,0.248713235294,0.25,0.746139705882,1.0,505,589,https://www.flickr.com/photos/mdpettitt/29233160570,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/\n3b67bec3793efcb4,https://c1.staticflickr.com/6/5682/30920421081_33e27f1675_o.jpg,0.548319327731,0.0,1.0,0.75,822,746,https://www.flickr.com/photos/gaby1/30920421081,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\n67a08d685abf7fb6,https://c1.staticflickr.com/8/7793/27924211143_79cef8b65a_o.jpg,0.25,0.0,0.75,0.75,739,710,https://www.flickr.com/photos/blondinrikard/27924211143,https://creativecommons.org/licenses/by/2.0/,Blondinrikard Fr\\303\\266berg,https://www.flickr.com/people/blondinrikard/\n22a313cc9fc2b4f1,https://c1.staticflickr.com/9/8612/28340861743_d50c5784e8_o.jpg,0.24882629108,0.0,1.0,1.0,310,940,https://www.flickr.com/photos/pamas/28340861743,https://creativecommons.org/licenses/by/2.0/,Esin \\303\\234st\\303\\274n,https://www.flickr.com/people/pamas/\n0d85e0103989c850,https://c1.staticflickr.com/9/8124/28994100466_472d225974_o.jpg,0.272727272727,0.0,1.0,1.0,324,722,https://www.flickr.com/photos/usfwsmtnprairie/28994100466,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\nc3cf76709c87255b,https://c1.staticflickr.com/9/8340/29178027716_ed24cc96f2_o.jpg,0.0,0.0,0.75,0.75,676,224,https://www.flickr.com/photos/soulhammer/29178027716/,https://creativecommons.org/licenses/by/2.0/,Nathaniel Bruno,https://www.flickr.com/people/soulhammer/\n74355a8c878b6814,https://c1.staticflickr.com/1/408/31898209835_867bd3b167_o.jpg,0.0,0.0,0.75,1.0,875,622,https://flickr.com/69203347@N03/31898209835,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n6efed50f84ec5e01,https://c1.staticflickr.com/6/5168/29928350415_8935e09ba7_o.jpg,0.5,0.0,1.0,0.75,947,602,https://www.flickr.com/photos/lsmith2010/29928350415,https://creativecommons.org/licenses/by/2.0/,Larry Smith,https://www.flickr.com/people/lsmith2010/\nd6887e8d19a06139,https://c1.staticflickr.com/6/5753/30992363516_d62f652ef9_o.jpg,0.25,0.0,1.0,1.0,563,45,https://www.flickr.com/photos/rbowen/30992363516/,https://creativecommons.org/licenses/by/2.0/,Rich Bowen,https://www.flickr.com/people/rbowen/\n21fef4d9b3dce49a,https://c1.staticflickr.com/9/8126/28295230322_8c45fd586e_o.jpg,0.0,0.25,0.411096256684,1.0,975,460,https://www.flickr.com/photos/jsjgeology/28295230322,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n0d65cb9d26de4d37,https://c1.staticflickr.com/8/7605/28137606406_e04b692957_o.jpg,0.25,0.0,0.75,0.75,571,336,https://www.flickr.com/photos/chrisdag/28137606406,https://creativecommons.org/licenses/by/2.0/,ChrisDag,https://www.flickr.com/people/chrisdag/\n3df888fc3b1df464,https://c1.staticflickr.com/8/7574/26519073574_355cd52e23_o.jpg,0.25,0.0,1.0,0.75,955,383,https://www.flickr.com/photos/vincentteeuwen/26519073574,https://creativecommons.org/licenses/by/2.0/,Vincent Teeuwen,https://www.flickr.com/people/vincentteeuwen/\n5ab3f1edd2f0cb06,https://c1.staticflickr.com/8/7716/27804279183_27b9180bda_o.jpg,0.0,0.0797227036395,1.0,1.0,387,116,https://www.flickr.com/photos/jared422/27804279183,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/\n51b390bb124a6d9d,https://c1.staticflickr.com/9/8037/29219102264_ded8d317fa_o.jpg,0.0,0.0,0.75,0.657142857143,968,422,https://www.flickr.com/photos/141897087@N06/29219102264,https://creativecommons.org/licenses/by/2.0/,JV Santore,https://www.flickr.com/people/141897087@N06/\n5bf502c4a4b7d04d,https://c1.staticflickr.com/6/5590/31190125660_b80ecdcb10_o.jpg,0.5,0.0,1.0,0.75,10,350,https://flickr.com/65847397@N05/31190125660,https://creativecommons.org/licenses/by/2.0/,Paul Balfe,https://www.flickr.com/people/paul_e_balfe/\n6ad1230d612d7eb7,https://c1.staticflickr.com/3/2413/31980917214_4992777b36_o.jpg,0.25,0.498159057437,1.0,0.996318114875,438,680,https://www.flickr.com/photos/davehamster/31980917214/,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n76a5715019fe11c7,https://c1.staticflickr.com/9/8223/28686786171_cee3ce47f5_o.jpg,0.0,0.0,0.690690690691,1.0,821,768,https://www.flickr.com/photos/grassrootsgroundswell/28686786171,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/\n207fd3b5def218d1,https://c1.staticflickr.com/8/7223/27019150086_7ba8c473c7_o.jpg,0.25,0.4375,1.0,1.0,991,279,https://www.flickr.com/photos/ndrwfgg/27019150086,https://creativecommons.org/licenses/by/2.0/,Andy / Andrew Fogg,https://www.flickr.com/people/ndrwfgg/\nad43e858c614db4d,https://c1.staticflickr.com/9/8263/28394550932_d93637d26b_o.jpg,0.0,0.25,0.5625,1.0,968,71,https://flickr.com/7831824@N04/28394550932,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/\nb3ba6f0352a29b2d,https://c1.staticflickr.com/6/5459/30102051053_1c9c298a3c_o.jpg,0.0,0.0,0.498159057437,0.75,752,563,https://www.flickr.com/photos/davehamster/30102051053/,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n95185508805329aa,https://c1.staticflickr.com/9/8354/29365580064_0e6908f14d_o.jpg,0.299878836834,0.25,0.899636510501,1.0,653,721,https://www.flickr.com/photos/ocarchives/29365580064,https://creativecommons.org/licenses/by/2.0/,Orange County Archives,https://www.flickr.com/people/ocarchives/\n73ee2cc19ef92e50,https://c1.staticflickr.com/8/7189/27594432472_dfaf365016_o.jpg,0.0,0.25,0.501846381093,1.0,982,686,https://www.flickr.com/photos/jorge-11/27594432472,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/\nbe1c43056c5d0085,https://c1.staticflickr.com/6/5525/30762478116_b134a3ee51_o.jpg,0.28125,0.0,0.84375,0.75,145,436,https://www.flickr.com/photos/usfwsmtnprairie/30762478116,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n84a5f6ee2af29208,https://c1.staticflickr.com/8/7421/26497262564_8dc1a3b161_o.jpg,0.331617647059,0.0,0.994852941176,1.0,321,513,https://www.flickr.com/photos/ilouque/26497262564/,https://creativecommons.org/licenses/by/2.0/,ilouque,https://www.flickr.com/people/ilouque/\n50b9e11ae686ae32,https://c1.staticflickr.com/6/5591/31118494856_52df471331_o.jpg,0.0,0.0,0.991007194245,1.0,321,34,https://www.flickr.com/photos/gails_pictures/31118494856,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nfe2edb6cad72d2d2,https://c1.staticflickr.com/8/7468/26505971443_c1368c14e0_o.jpg,0.25,0.0,1.0,1.0,918,488,https://www.flickr.com/photos/jeepersmedia/26505971443,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n58420b727fcab02b,https://c1.staticflickr.com/6/5768/30823764900_d486a3f904_o.jpg,0.0,0.0,0.714503816794,1.0,138,168,https://flickr.com/143049688@N08/30823764900,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/\n47b087263b33728b,https://c1.staticflickr.com/9/8228/29000044324_0eb54060d7_o.jpg,0.298790322581,0.25,0.896370967742,1.0,318,152,https://flickr.com/33398884@N03/29000044324,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\n0e0299d6352a3fb8,https://c1.staticflickr.com/1/636/31002720224_411dc0a03f_o.jpg,0.25,0.25,0.75,1.0,539,4,https://flickr.com/22539273@N00/31002720224,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n2ee4c1b2b9bcc6c8,https://c1.staticflickr.com/9/8354/29761961012_02ecff90a4_o.jpg,0.25,0.0,0.75,0.75,763,785,https://www.flickr.com/photos/deltanewshub/29761961012,https://creativecommons.org/licenses/by/2.0/,Delta News Hub,https://www.flickr.com/people/deltanewshub/\n24312de5c34473c0,https://c1.staticflickr.com/6/5584/29688881533_e0c64dc987_o.jpg,0.25,0.438671875,1.0,1.0,874,820,https://www.flickr.com/photos/marsupilami92/29688881533/,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\nbb748281da5e8681,https://c1.staticflickr.com/6/5281/29946906871_845417f8ac_o.jpg,0.210588633288,0.0,0.631765899865,0.75,348,694,https://www.flickr.com/photos/39090590@N02/29946906871,https://creativecommons.org/licenses/by/2.0/,Cyril Fluck,https://www.flickr.com/people/39090590@N02/\nb648e8dfcb4fbc99,https://c1.staticflickr.com/1/679/31918129032_23e9a7057b_o.jpg,0.0,0.0,0.666666666667,1.0,982,572,https://flickr.com/148488209@N08/31918129032,https://creativecommons.org/licenses/by/2.0/,makaiyla willis,https://www.flickr.com/people/makaiylaw/\nd2cc2eabfc7bf54a,https://c1.staticflickr.com/6/5509/31244583052_a8416401f1_o.jpg,0.25,0.0,0.75,0.75,556,721,https://www.flickr.com/photos/rpavich/31244583052,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/\nda4b3e38b069d735,https://c1.staticflickr.com/9/8206/28992945534_a0fcc6e623_o.jpg,0.25,0.25,1.0,1.0,777,691,https://www.flickr.com/photos/wwworks/28992945534,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/\nb0bb1ea9bcc45800,https://c1.staticflickr.com/9/8433/28813586781_49bed3bfb8_o.jpg,0.0,0.0,0.5625,0.75,845,456,https://www.flickr.com/photos/renaissancechambara/28813586781/,https://creativecommons.org/licenses/by/2.0/,Ged Carroll,https://www.flickr.com/people/renaissancechambara/\nac668c13ccfd4b79,https://c1.staticflickr.com/1/538/31770839465_f1c3beb91e_o.jpg,0.0,0.0,0.666666666667,1.0,598,751,https://www.flickr.com/photos/quinet/31770839465,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nb6c6a5b7829fbc9b,https://c1.staticflickr.com/9/8290/28794830561_2c903f75c1_o.jpg,0.336764705882,0.0,1.0,1.0,473,506,https://www.flickr.com/photos/shankaronline/28794830561,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n014f0024918a7b6f,https://c1.staticflickr.com/8/7564/27345252166_6948b71ff3_o.jpg,0.28125,0.0,0.84375,0.75,10,885,https://www.flickr.com/photos/amanderson/27345252166,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n93114736f072d6d3,https://c1.staticflickr.com/8/7396/26691839134_a072ec1162_o.jpg,0.25,0.0,0.75,0.75,617,763,https://www.flickr.com/photos/cogdog/26691839134,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nc9ddfb1043177de8,https://c1.staticflickr.com/6/5517/31689316216_b954ab5538_o.jpg,0.5,0.25,1.0,1.0,975,117,http://www.flickr.com/photos/richardmoross/31689316216/,https://creativecommons.org/licenses/by/2.0/,Richard Moross,https://www.flickr.com/people/richardmoross/\n7e4c41563370bed1,https://c1.staticflickr.com/9/8497/29201470542_e661660313_o.jpg,0.0,0.0,0.666666666667,1.0,719,945,https://www.flickr.com/photos/herdie/29201470542,https://creativecommons.org/licenses/by/2.0/,herdiephoto,https://www.flickr.com/people/herdie/\n328d99215b19c8c7,https://c1.staticflickr.com/1/662/32533031665_e6c123d8eb_o.jpg,0.5,0.0,1.0,0.75,806,926,https://www.flickr.com/photos/30478819@N08/32533031665,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n2a1a60df9a58bb7c,https://c1.staticflickr.com/8/7780/26705680280_a7f5f24425_o.jpg,0.0,0.333333333333,1.0,1.0,650,19,https://www.flickr.com/photos/travelnevada/26705680280,https://creativecommons.org/licenses/by/2.0/,Travel Nevada,https://www.flickr.com/people/travelnevada/\n263c7bcd59502625,https://c1.staticflickr.com/9/8092/29347734850_29561b6ec6_o.jpg,0.5,0.0,1.0,0.75,480,651,https://www.flickr.com/photos/concavowheels/29347734850,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/\nd05076189b7fd185,https://c1.staticflickr.com/1/727/32381120905_712248f38a_o.jpg,0.25,0.0,1.0,0.646812080537,708,765,https://www.flickr.com/photos/jdlasica/32381120905,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\nfe193683db61ac2d,https://c1.staticflickr.com/6/5669/30159267186_7663a5ba9c_o.jpg,0.4375,0.0,1.0,0.75,744,1,https://www.flickr.com/photos/meemainseen/30159267186,https://creativecommons.org/licenses/by/2.0/,Muhammad Imran Saeed,https://www.flickr.com/people/meemainseen/\nd8b0101e2459882a,https://c1.staticflickr.com/8/7451/27873714556_8452970117_o.jpg,0.0,0.25,0.5,1.0,655,88,https://www.flickr.com/photos/impulse_2016/27873714556/,https://creativecommons.org/licenses/by/2.0/,Impulse Theater Festival 2016,https://www.flickr.com/people/impulse_2016/\n3841b33c9797cbf1,https://c1.staticflickr.com/6/5563/30857323591_f9687379e7_o.jpg,0.0,0.0,0.5625,0.75,909,953,https://www.flickr.com/photos/brownpau/30857323591,https://creativecommons.org/licenses/by/2.0/,brownpau,https://www.flickr.com/people/brownpau/\n232c22314e21f764,https://c1.staticflickr.com/6/5505/30587416664_22b14394ec_o.jpg,0.560165975104,0.0,1.0,0.75,115,904,https://www.flickr.com/photos/gails_pictures/30587416664,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n30b62313af2b5d74,https://c1.staticflickr.com/8/7570/30228833946_9b000a7dbd_o.jpg,0.0,0.0,0.561328125,0.75,316,795,https://www.flickr.com/photos/pamas/30228833946,https://creativecommons.org/licenses/by/2.0/,Esin \\303\\234st\\303\\274n,https://www.flickr.com/people/pamas/\n2c54b60a2851b8ed,https://c1.staticflickr.com/9/8523/29243698212_6d465d0527_o.jpg,0.0,0.0,0.5625,0.75,657,577,https://www.flickr.com/photos/zombieite/29243698212,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/\nc96c3eab644075d3,https://c1.staticflickr.com/8/7790/26778459800_6328b3ac5d_o.jpg,0.0,0.0,0.932055749129,1.0,348,300,https://www.flickr.com/photos/lac-bac/26778459800,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/\n060dfe239abfd547,https://c1.staticflickr.com/8/7475/28717385362_9e5d05dfe7_o.jpg,0.473457675753,0.25,0.946915351506,1.0,704,396,https://www.flickr.com/photos/alan-light/28717385362/,https://creativecommons.org/licenses/by/2.0/,Alan Light,https://www.flickr.com/people/alan-light/\n0bd5123017590e39,https://c1.staticflickr.com/6/5553/30409656042_0a59691936_o.jpg,0.4375,0.25,1.0,1.0,566,430,https://www.flickr.com/photos/davidwilson1949/30409656042,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\nbd3617fcc985fe31,https://c1.staticflickr.com/6/5624/30871247636_63a2a6a4fa_o.jpg,0.0,0.25,0.75,0.75,833,61,https://www.flickr.com/photos/xiquinho/30871247636/,https://creativecommons.org/licenses/by/2.0/,xiquinhosilva,https://www.flickr.com/people/xiquinho/\n54666421b4a6998f,https://c1.staticflickr.com/8/7701/26783338114_ced2a4e55f_o.jpg,0.5,0.0,1.0,0.75,920,759,https://www.flickr.com/photos/zeevveez/26783338114,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/\n4e34df87968bd882,https://c1.staticflickr.com/1/621/31058803964_6d583c4eea_o.jpg,0.438671875,0.25,1.0,1.0,339,379,https://flickr.com/30139045@N00/31058803964,https://creativecommons.org/licenses/by/2.0/,Tim Walker,https://www.flickr.com/people/timjoyfamily/\n3f48b1e74589d310,https://c1.staticflickr.com/9/8038/28644165984_de12eb6b3e_o.jpg,0.0,0.0,0.666666666667,1.0,653,508,https://www.flickr.com/photos/secdef/28644165984,https://creativecommons.org/licenses/by/2.0/,Jim Mattis,https://www.flickr.com/people/secdef/\n96e77c20bf94ecb1,https://c1.staticflickr.com/9/8342/28986701940_8aa08f43c6_o.jpg,0.4108,0.25,1.0,1.0,818,518,https://www.flickr.com/photos/autohistorian/28986701940,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n4edeacef9fb8ec90,https://c1.staticflickr.com/6/5579/31278004155_6f6d083d49_o.jpg,0.0,0.0,0.5625,0.75,719,997,https://www.flickr.com/photos/cambodia4kidsorg/31278004155/,https://creativecommons.org/licenses/by/2.0/,Cambodia4kids.org Beth Kanter,https://www.flickr.com/people/cambodia4kidsorg/\nc9302f3b2b0452e4,https://c1.staticflickr.com/8/7413/27864002812_f3fc0a7878_o.jpg,0.0,0.0,0.875,1.0,884,892,https://www.flickr.com/photos/hisgett/27864002812?rb=1,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n0af0a5dfee6b84ff,https://c1.staticflickr.com/8/7382/26663873503_fc70ec8c08_o.jpg,0.280226209048,0.0,0.840678627145,0.75,484,808,https://www.flickr.com/photos/65344061@N06/26663873503/,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n02dbe78a73db2808,https://c1.staticflickr.com/9/8089/27862798673_b874427662_o.jpg,0.369771863118,0.25,0.739543726236,1.0,975,255,https://flickr.com/47445767@N05/27862798673,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n592c7424f13b2d29,https://c1.staticflickr.com/9/8639/28634730405_a12dd81623_o.jpg,0.419316375199,0.25,1.0,1.0,604,517,https://www.flickr.com/photos/lac-bac/28634730405,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/\nf5b0ed0fbb3b5f74,https://c1.staticflickr.com/1/131/30836327244_86e3f6cee9_o.jpg,0.5,0.25,1.0,1.0,567,645,https://www.flickr.com/photos/nationalassemblyforwales/30836327244,https://creativecommons.org/licenses/by/2.0/,National Assembly for Wales,https://www.flickr.com/people/nationalassemblyforwales/\n1b1ffd7000d0749f,https://c1.staticflickr.com/6/5763/30233213804_63bd4007fd_o.jpg,0.0,0.0,0.75,0.75,960,991,https://www.flickr.com/photos/ilove9and23/30233213804/,https://creativecommons.org/licenses/by/2.0/,Debbie Tingzon,https://www.flickr.com/people/ilove9and23/\n70a2529a6b2c0d46,https://c1.staticflickr.com/9/8631/29164479153_b29b11670b_o.jpg,0.5,0.25,1.0,1.0,580,550,https://www.flickr.com/photos/usarmyband/29164479153/,https://creativecommons.org/licenses/by/2.0/,The United States Army Band,https://www.flickr.com/people/usarmyband/\nbba5c56cc3eb07c9,https://c1.staticflickr.com/1/546/31014776813_b295235e55_o.jpg,0.267938931298,0.25,0.803816793893,1.0,921,594,https://www.flickr.com/photos/thomasrousing/31014776813,https://creativecommons.org/licenses/by/2.0/,Thomas Rousing,https://www.flickr.com/people/thomasrousing/\n000b7d55b6184b08,https://c1.staticflickr.com/8/7450/27510795501_46c2084b6c_o.jpg,0.0,0.0,0.5625,0.75,389,963,https://www.flickr.com/photos/40205555@N06/27510795501,https://creativecommons.org/licenses/by/2.0/,mrho101,https://www.flickr.com/people/40205555@N06/\n8a02b6196885c394,https://c1.staticflickr.com/8/7296/27350770975_3f596317b8_o.jpg,0.0,0.0,1.0,1.0,760,447,https://www.flickr.com/photos/graficmedia/27350770975,https://creativecommons.org/licenses/by/2.0/,[-_-] JORGE,https://www.flickr.com/people/graficmedia/\n582663fe666aac9c,https://c1.staticflickr.com/6/5592/29610060673_fe4f7b8d01_o.jpg,0.0,0.0,0.56375,0.75,923,928,https://www.flickr.com/photos/kelvynskee/29610060673,https://creativecommons.org/licenses/by/2.0/,Kelvyn Skee,https://www.flickr.com/people/kelvynskee/\nf6515f31b750a573,https://c1.staticflickr.com/1/719/32474210662_fa858156a3_o.jpg,0.0,0.0,0.666666666667,1.0,477,723,https://www.flickr.com/photos/quinet/32474210662,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nacd99e9b7128395a,https://c1.staticflickr.com/1/445/32794739211_d6f5324607_o.jpg,0.0,0.0,0.75,1.0,859,753,http://www.flickr.com/photos/callmewhatever/32794739211/,https://creativecommons.org/licenses/by/2.0/,Daniel Zimmermann,https://www.flickr.com/people/callmewhatever/\n83d35591dfff99ac,https://c1.staticflickr.com/8/7232/27285496573_d5bdd3aa87_o.jpg,0.0,0.0,0.75,1.0,581,857,https://www.flickr.com/photos/juggernautco/27285496573,https://creativecommons.org/licenses/by/2.0/,Daniel X. O&#x27;Neil,https://www.flickr.com/people/juggernautco/\n3dfbdd066af9ca1e,https://c1.staticflickr.com/9/8816/28135299942_b870fd0ab6_o.jpg,0.25,0.0,0.75,0.75,821,5,https://www.flickr.com/photos/ben_salter/28135299942/,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/\n59204d6bb0c234eb,https://c1.staticflickr.com/9/8752/28207273334_3d05b11ea6_o.jpg,0.0,0.421177266576,0.75,0.842354533153,418,703,https://www.flickr.com/photos/oatsy40/28207273334/,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/\nd740663eeccdcecd,https://c1.staticflickr.com/9/8130/29191810554_9f08be9c5f_o.jpg,0.0,0.0,0.75,0.5625,438,762,https://www.flickr.com/photos/simon2207/29191810554/,https://creativecommons.org/licenses/by/2.0/,Simon220771,https://www.flickr.com/people/simon2207/\n9226b783cfb770bd,https://c1.staticflickr.com/9/8637/28516867321_5b709d78c7_o.jpg,0.0,0.25,0.5625,1.0,826,34,https://www.flickr.com/photos/jsjgeology/28516867321,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n01dd15caa1b2c7b4,https://c1.staticflickr.com/8/7767/26780389003_e95a6d7cee_o.jpg,0.0,0.25,0.561328125,1.0,304,551,https://www.flickr.com/photos/treegrow/26780389003,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nb97f4b95ae696316,https://c1.staticflickr.com/8/7186/26690393874_7d7f8dafc9_o.jpg,0.0,0.333333333333,1.0,1.0,518,399,http://www.flickr.com/photos/n28307/26690393874/,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/\nc42c88890b5fc86d,https://c1.staticflickr.com/6/5755/30476251310_f45f8b81b7_o.jpg,0.4375,0.25,1.0,1.0,671,112,https://www.flickr.com/photos/paulmiller/30476251310/,https://creativecommons.org/licenses/by/2.0/,Paul Miller,https://www.flickr.com/people/paulmiller/\nd158837db31ed892,https://c1.staticflickr.com/1/445/31796400213_c6e650f7d5_o.jpg,0.5,0.0,1.0,0.75,519,804,https://www.flickr.com/photos/box_repsol/31796400213,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n4a1a40a116088962,https://c1.staticflickr.com/9/8587/28162416971_8e105a5657_o.jpg,0.0,0.0,0.75,1.0,598,624,https://www.flickr.com/photos/gibsongunleather/28162416971,https://creativecommons.org/licenses/by/2.0/,BRUCE GIBSON,https://www.flickr.com/people/gibsongunleather/\nba4508962af69d90,https://c1.staticflickr.com/9/8202/29005733052_a9f711f4bf_o.jpg,0.248348017621,0.0,0.745044052863,0.75,673,827,https://flickr.com/37922399@N05/29005733052,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n7069a117c92d27a4,https://c1.staticflickr.com/8/7605/26251509774_96c84ae16f_o.jpg,0.42174796748,0.25,0.843495934959,1.0,546,186,https://www.flickr.com/photos/psychlist1972/26251509774/,https://creativecommons.org/licenses/by/2.0/,Pete Brown,https://www.flickr.com/people/psychlist1972/\n79fa9855119ffeea,https://c1.staticflickr.com/9/8090/28857580530_b7ba1ea2f1_o.jpg,0.0,0.0,1.0,1.0,479,506,https://www.flickr.com/photos/wwworks/28857580530,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/\n82e2334925339ef8,https://c1.staticflickr.com/6/5632/31268100236_4975f1a2db_o.jpg,0.25,0.0,1.0,0.75,818,769,https://www.flickr.com/photos/96774554@N03/31268100236,https://creativecommons.org/licenses/by/2.0/,Wheels ON,https://www.flickr.com/people/96774554@N03/\n4f5464b7d4682441,https://c1.staticflickr.com/3/2859/32842901716_635c080982_o.jpg,0.0,0.25,0.472779369628,1.0,976,607,https://www.flickr.com/photos/blmoregon/32842901716/,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\n72f96c6dc5df2de8,https://c1.staticflickr.com/4/3869/32108968233_aa2d42d481_o.jpg,0.5,0.25,1.0,1.0,885,784,https://www.flickr.com/photos/jlascar/32108968233/,https://creativecommons.org/licenses/by/2.0/,Jorge L\\303\\241scar,https://www.flickr.com/people/jlascar/\n6609c25b3314b5b3,https://c1.staticflickr.com/9/8031/29690105171_f0e16e643e_o.jpg,0.333333333333,0.0,1.0,1.0,512,878,https://www.flickr.com/photos/8782469@N05/29690105171,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/\n52d8515abbfaa8ac,https://c1.staticflickr.com/6/5629/30139827383_2b90e9254e_o.jpg,0.496696035242,0.0,0.993392070485,0.75,230,634,https://www.flickr.com/photos/vastateparksstaff/30139827383,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\na7f9b28e30d19d85,https://c1.staticflickr.com/6/5712/30477407072_911714e259_o.jpg,0.0,0.0,0.504444444444,0.75,662,699,https://www.flickr.com/photos/andreboeni/30477407072,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n8b7a5446dae48ac1,https://c1.staticflickr.com/1/316/31908704910_2c6375f0ef_o.jpg,0.266552511416,0.0,0.799657534247,0.75,309,363,https://www.flickr.com/photos/gails_pictures/31908704910,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nb2a7e558f1a3ff16,https://c1.staticflickr.com/9/8730/28819631221_819c793b59_o.jpg,0.303165584416,0.25,0.909496753247,1.0,620,536,https://www.flickr.com/photos/raveejaya/28819631221,https://creativecommons.org/licenses/by/2.0/,Raveendra Jayashantha,https://www.flickr.com/people/raveejaya/\n1a95932427129cda,https://c1.staticflickr.com/8/7124/27017461135_e00ed6ac0d_o.jpg,0.0,0.25,0.5,1.0,657,465,https://www.flickr.com/photos/antoniseb/27017461135/,https://creativecommons.org/licenses/by/2.0/,Jay Cross,https://www.flickr.com/people/antoniseb/\nd4579363596fbf21,https://c1.staticflickr.com/1/520/31675116444_127982bddf_o.jpg,0.287322274882,0.0,0.861966824645,0.75,833,889,https://www.flickr.com/photos/fran001/31675116444/,https://creativecommons.org/licenses/by/2.0/,Francisco Anzola,https://www.flickr.com/people/fran001/\nf7dd570a0cfe1dcc,https://c1.staticflickr.com/9/8264/29543383031_e6d047580a_o.jpg,0.0,0.0,0.75,0.75,669,55,https://www.flickr.com/photos/alazaat/29543383031,https://creativecommons.org/licenses/by/2.0/,Hussein Alazaat,https://www.flickr.com/people/alazaat/\n2d23b1dab7e3e9c0,https://c1.staticflickr.com/1/456/31638318370_25bb9334d8_o.jpg,0.0,0.25,0.5,1.0,511,971,https://www.flickr.com/photos/45958601@N02/31638318370,https://creativecommons.org/licenses/by/2.0/,joey  zanotti,https://www.flickr.com/people/45958601@N02/\nb7d9e1d8cf1d7912,https://c1.staticflickr.com/6/5697/30316954084_6b364b382d_o.jpg,0.0,0.0,0.666666666667,1.0,519,485,https://www.flickr.com/photos/box_repsol/30316954084,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n6b27728f0f816dc6,https://c1.staticflickr.com/1/483/32823130292_df26e1cd49_o.jpg,0.0,0.25,0.499263622975,1.0,638,874,https://www.flickr.com/photos/rpavich/32823130292/,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/\nc96358fe7b8eaf28,https://c1.staticflickr.com/8/7262/27455525114_9b1d3ed1ac_o.jpg,0.578822733424,0.25,1.0,1.0,706,492,https://www.flickr.com/photos/12216515@N00/27455525114,https://creativecommons.org/licenses/by/2.0/,Charles Fulton,https://www.flickr.com/people/12216515@N00/\n9b4cab2ffb0c0754,https://c1.staticflickr.com/9/8256/30009146415_d412513e5f_o.jpg,0.0,0.0,1.0,0.75,975,963,https://www.flickr.com/photos/jsjgeology/30009146415,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n1685d066f8070081,https://c1.staticflickr.com/6/5684/29941070052_c4c12092e6_o.jpg,0.0,0.0,0.42174796748,0.75,979,361,https://www.flickr.com/photos/scotnelson/29941070052,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\ne071bf346787d971,https://c1.staticflickr.com/8/7244/27006991522_4a72303846_o.jpg,0.57825203252,0.25,1.0,1.0,563,990,https://www.flickr.com/photos/respres/27006991522,https://creativecommons.org/licenses/by/2.0/,Jeff Turner,https://www.flickr.com/people/respres/\ne66d732354c6baf0,https://c1.staticflickr.com/9/8349/29382034812_b8cca8606d_o.jpg,0.0,0.0,0.5,0.75,301,72,https://www.flickr.com/photos/52450054@N04/29382034812,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n33adbc27fdcadd65,https://c1.staticflickr.com/8/7130/26834523912_fb0b3fe3ed_o.jpg,0.28125,0.25,0.84375,1.0,924,716,https://www.flickr.com/photos/68147320@N02/26834523912,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\neb53098ebcf05e64,https://c1.staticflickr.com/6/5591/30938192751_f6a6fb1739_o.jpg,0.0,0.0,0.641099855282,1.0,564,601,https://www.flickr.com/photos/68704638@N04/30938192751,https://creativecommons.org/licenses/by/2.0/,M Dreibelbis,https://www.flickr.com/people/68704638@N04/\n8c609b06a60af060,https://c1.staticflickr.com/8/7199/27864572096_73f40f5d09_o.jpg,0.0,0.0,0.5625,0.75,499,291,https://flickr.com/77742560@N06/27864572096,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nc66310d8b709d6d5,https://c1.staticflickr.com/9/8371/29266955473_d24ddfa05c_o.jpg,0.0,0.0,1.0,1.0,763,106,https://www.flickr.com/photos/alper/29266955473,https://creativecommons.org/licenses/by/2.0/,Alper \\303\\207u\\304\\237un,https://www.flickr.com/people/alper/\n740981d161a38bad,https://c1.staticflickr.com/1/578/32214662255_3bc38af004_o.jpg,0.5,0.0,1.0,0.75,572,149,http://www.flickr.com/photos/batcula/32214662255/,https://creativecommons.org/licenses/by/2.0/,Jim,https://www.flickr.com/people/batcula/\n4c8a4414419ab0bb,https://c1.staticflickr.com/9/8377/30076813705_00b7bc68ff_o.jpg,0.25,0.0,0.75,0.75,662,848,https://www.flickr.com/photos/greggjerdingen/30076813705,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\necaf98c8ce9f04c3,https://c1.staticflickr.com/9/8547/29609780616_f9dac2244e_o.jpg,0.5,0.25,1.0,1.0,561,697,https://www.flickr.com/photos/foran_hs_football/29609780616,https://creativecommons.org/licenses/by/2.0/,Foran Lions Football,https://www.flickr.com/people/foran_hs_football/\n093402dc35f59027,https://c1.staticflickr.com/9/8708/28528193204_59181c883b_o.jpg,0.4375,0.0,1.0,0.75,734,113,https://www.flickr.com/photos/kdghantous/28528193204,https://creativecommons.org/licenses/by/2.0/,Karim D. Ghantous,https://www.flickr.com/people/kdghantous/\n8bb7d10e97694eb5,https://c1.staticflickr.com/1/625/31772996983_1b99ed5012_o.jpg,0.425355450237,0.0,1.0,0.75,143,393,https://www.flickr.com/photos/taylar/31772996983,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/\n820ae900a943d605,https://c1.staticflickr.com/6/5486/30611700582_b302428c5d_o.jpg,0.0,0.267938931298,0.75,0.803816793893,888,701,http://www.flickr.com/photos/ecdq/30611700582/,https://creativecommons.org/licenses/by/2.0/,ECDQ,https://www.flickr.com/people/ecdq/\n8859efd46fab37ff,https://c1.staticflickr.com/6/5646/30929275820_fc732d7ae6_o.jpg,0.25,0.0,1.0,0.75,923,599,https://flickr.com/145862860@N07/30929275820,https://creativecommons.org/licenses/by/2.0/,Ky\\305\\215to B\\305\\215ken,https://www.flickr.com/people/kyotoboken/\ndde9f0aadcb02874,https://c1.staticflickr.com/9/8544/29151973710_8ab6e884c9_o.jpg,0.497426470588,0.0,0.994852941176,0.75,981,640,https://www.flickr.com/photos/n28307/29151973710,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/\n13810fcac72f12ba,https://c1.staticflickr.com/9/8302/28623258764_c87251b710_o.jpg,0.0,0.25,0.5,1.0,876,72,https://www.flickr.com/photos/usarmyband/28623258764/,https://creativecommons.org/licenses/by/2.0/,The United States Army Band,https://www.flickr.com/people/usarmyband/\nb1bf532ce2c4c3a1,https://c1.staticflickr.com/9/8037/28132989550_04e5549aec_o.jpg,0.0,0.0,0.495594713656,0.75,875,557,https://www.flickr.com/photos/didbygraham/28132989550/,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n9aba31a4b2404aa5,https://c1.staticflickr.com/1/458/31850811716_9a5882c71c_o.jpg,0.25,0.25,1.0,1.0,912,495,https://flickr.com/52066925@N00/31850811716,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/\n5b85f98e0105d135,https://c1.staticflickr.com/8/7474/26833993115_f16054e784_o.jpg,0.248713235294,0.25,0.746139705882,1.0,570,933,https://www.flickr.com/photos/agenciabrasilia/26833993115,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n53c478ffc8ddb967,https://c1.staticflickr.com/9/8149/29031351804_3d4e158245_o.jpg,0.225840336134,0.0,0.677521008403,0.75,320,613,https://www.flickr.com/photos/gails_pictures/29031351804,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n92c3f5e99d8ac862,https://c1.staticflickr.com/8/7564/29085116541_43b6dfd46c_o.jpg,0.0,0.0,0.666666666667,1.0,664,362,https://www.flickr.com/photos/ministeriodacultura/29085116541/,https://creativecommons.org/licenses/by/2.0/,Minist\\303\\251rio da Cultura,https://www.flickr.com/people/ministeriodacultura/\nfae45093bad0961a,https://c1.staticflickr.com/9/8802/30042939706_809382f8e8_o.jpg,0.0,0.0,0.499263622975,0.75,529,528,https://www.flickr.com/photos/southbeachcars/30042939706,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n0db0952967f6faa6,https://c1.staticflickr.com/6/5610/31207151522_a9d8ef4c85_o.jpg,0.28125,0.0,0.84375,0.75,816,552,https://flickr.com/29780474@N02/31207151522,https://creativecommons.org/licenses/by/2.0/,Phil Gayton,https://www.flickr.com/people/29780474@N02/\n9594ef7e0fc79ea8,https://c1.staticflickr.com/8/7720/26955054100_0d18b0786b_o.jpg,0.25,0.25,1.0,1.0,403,115,https://www.flickr.com/photos/87249144@N08/26955054100,https://creativecommons.org/licenses/by/2.0/,FolsomNatural,https://www.flickr.com/people/87249144@N08/\n634d7f18d098cccb,https://c1.staticflickr.com/6/5599/30385514465_e5bb5b1ec4_o.jpg,0.0,0.332106038292,1.0,0.996318114875,539,766,https://www.flickr.com/photos/londonmatt/30385514465,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n05cac1419419ce29,https://c1.staticflickr.com/3/2904/33166177915_2cf2b8ed63_o.jpg,0.0,0.25,0.5,1.0,854,550,https://www.flickr.com/photos/yangchen6712/33166177915,https://creativecommons.org/licenses/by/2.0/,YangChen(TW),https://www.flickr.com/people/yangchen6712/\n868af4a2e614f5ac,https://c1.staticflickr.com/9/8284/29515310871_0dd41b4840_o.jpg,0.25,0.0,0.75,0.75,718,467,https://www.flickr.com/photos/greggjerdingen/29515310871,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n6898f889c17f8e16,https://c1.staticflickr.com/6/5683/31789036413_516df80786_o.jpg,0.25,0.250923190547,1.0,0.75276957164,888,730,https://www.flickr.com/photos/eltb/31789036413,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n8e3324c208eb9a3b,https://c1.staticflickr.com/1/358/32563010712_d1417f0485_o.jpg,0.0,0.0,0.561328125,0.75,822,741,https://www.flickr.com/photos/linsinchen/32563010712,https://creativecommons.org/licenses/by/2.0/,Sinchen.Lin,https://www.flickr.com/people/linsinchen/\n7d7a8e41b8d0577e,https://c1.staticflickr.com/6/5518/30395077313_019dca3b01_o.jpg,0.25,0.0,1.0,0.75,965,182,https://flickr.com/83202873@N00/30395077313,https://creativecommons.org/licenses/by/2.0/,smittenkittenorig,https://www.flickr.com/people/smittenkittenoriginals/\n5ff168f7d006f69c,https://c1.staticflickr.com/1/506/31115729834_fc93bbea0f_o.jpg,0.0,0.25,0.5625,1.0,683,106,https://flickr.com/45457437@N00/31115729834,https://creativecommons.org/licenses/by/2.0/,David Jones,https://www.flickr.com/people/davidcjones/\nf348adf7ea1967f7,https://c1.staticflickr.com/9/8769/29760593836_4e7c8ebbda_o.jpg,0.5,0.25,1.0,1.0,909,415,https://www.flickr.com/photos/fun_flying/29760593836/,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/\n40f79488e3c2d6c4,https://c1.staticflickr.com/8/7433/27742701310_08f79aaeb0_o.jpg,0.0,0.247434017595,0.75,0.742302052786,918,749,https://www.flickr.com/photos/mdpettitt/27742701310,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/\n3e9496f7652e1968,https://c1.staticflickr.com/6/5503/30144665264_862fd303dc_o.jpg,0.0,0.0,0.666666666667,1.0,469,834,http://www.flickr.com/photos/27148401@N06/30144665264,https://creativecommons.org/licenses/by/2.0/,shipley43,https://www.flickr.com/people/27148401@N06/\n2f7d5ff922af55c4,https://c1.staticflickr.com/9/8171/28748561034_d77c5db28e_o.jpg,0.475453172205,0.25,1.0,1.0,481,633,https://www.flickr.com/photos/jeepersmedia/28748561034,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n79a5625805a08253,https://c1.staticflickr.com/8/7622/26950982570_224d340d99_o.jpg,0.0,0.25,0.498159057437,1.0,766,805,https://www.flickr.com/photos/vastateparksstaff/26950982570,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n412311ea17528b7c,https://c1.staticflickr.com/6/5553/31345581012_51f411cd78_o.jpg,0.25,0.0,0.75,0.75,764,440,https://www.flickr.com/photos/quinet/31345581012/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n00312c7e7196baf4,https://c1.staticflickr.com/9/8539/29256709000_ca71fa227f_o.jpg,0.25,0.28125,1.0,0.84375,327,220,http://www.flickr.com/photos/27305106@N06/29256709000,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\n51d1c77f80467b59,https://c1.staticflickr.com/6/5555/31034796165_c8996cacff_o.jpg,0.32917888563,0.0,0.987536656891,1.0,977,538,https://www.flickr.com/photos/zemzina/31034796165/,https://creativecommons.org/licenses/by/2.0/,Olga Khomitsevich,https://www.flickr.com/people/zemzina/\n82179b1d313e0e23,https://c1.staticflickr.com/1/268/32350804376_10b1f40d6e_o.jpg,0.0,0.0,0.5625,0.75,830,902,https://www.flickr.com/photos/76969036@N02/32350804376/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\nb0e0e06e647b478f,https://c1.staticflickr.com/6/5769/29834734204_b8897fa3f7_o.jpg,0.0,0.0,1.0,0.75117370892,484,915,https://www.flickr.com/photos/sky_hlv/29834734204,https://creativecommons.org/licenses/by/2.0/,Jose A.,https://www.flickr.com/people/sky_hlv/\nc609f86fa706bb9e,https://c1.staticflickr.com/9/8552/29601011844_a32bf06fd2_o.jpg,0.0,0.0,0.5625,0.75,113,889,https://www.flickr.com/photos/fdecomite/29601011844/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\n55a2e48a87c16998,https://c1.staticflickr.com/1/660/31687904441_5798b661c4_o.jpg,0.25,0.0,0.75,0.75,911,768,http://www.flickr.com/photos/wastes/31687904441/,https://creativecommons.org/licenses/by/2.0/,Charlotta Wasteson,https://www.flickr.com/people/wastes/\n7d833ac8ab852bd2,https://c1.staticflickr.com/1/536/31504100213_b2b24c3f0d_o.jpg,0.25,0.442757009346,1.0,1.0,52,151,https://www.flickr.com/photos/jsjgeology/31504100213,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nfe92a88132b5d67b,https://c1.staticflickr.com/6/5127/30101893166_db47d4701a_o.jpg,0.25,0.25,0.75,1.0,963,247,https://flickr.com/112540417@N03/30101893166,https://creativecommons.org/licenses/by/2.0/,Enrico BBQness,https://www.flickr.com/people/bbqnessdotcom/\n6ab876a15af539c4,https://c1.staticflickr.com/9/8869/28304826635_f4c6b9f7d7_o.jpg,0.25,0.28125,1.0,0.84375,984,611,https://www.flickr.com/photos/noaaphotolib/28304826635,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\n4fff343244f212cc,https://c1.staticflickr.com/6/5774/31301114735_677b0f08fa_o.jpg,0.0,0.305872756933,0.75,0.917618270799,821,403,https://www.flickr.com/photos/45131642@N00/31301114735/,https://creativecommons.org/licenses/by/2.0/,Phil Parker,https://www.flickr.com/people/45131642@N00/\n22a9c318b6e36853,https://c1.staticflickr.com/9/8016/29443140000_36cbb76243_o.jpg,0.249079528719,0.25,0.747238586156,1.0,620,211,https://www.flickr.com/photos/51715344@N07/29443140000/,https://creativecommons.org/licenses/by/2.0/,kami rao,https://www.flickr.com/people/51715344@N07/\n71d368782c72e313,https://c1.staticflickr.com/8/7431/27233705735_358064269d_o.jpg,0.0,0.0,0.599757673667,0.75,913,487,https://www.flickr.com/photos/mspearman/27233705735,https://creativecommons.org/licenses/by/2.0/,Mark Spearman,https://www.flickr.com/people/mspearman/\n65b8c8b065069802,https://c1.staticflickr.com/8/7116/26898609074_1eab8aeb4b_o.jpg,0.25,0.25,0.75,1.0,666,379,https://www.flickr.com/photos/sg2012/26898609074/,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/\nb0619a61cf135f5e,https://c1.staticflickr.com/8/7408/27239703215_11f55dc09e_o.jpg,0.345588235294,0.0,0.691176470588,0.75,985,420,https://www.flickr.com/photos/126816719@N03/27239703215/,https://creativecommons.org/licenses/by/2.0/,Jon Brinn,https://www.flickr.com/people/126816719@N03/\n93394c1f9c4c0053,https://c1.staticflickr.com/9/8065/27937528884_57f0526c15_o.jpg,0.5,0.25,1.0,1.0,320,883,https://www.flickr.com/photos/52450054@N04/27937528884,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\naa90f93ed6fae139,https://c1.staticflickr.com/1/577/32316961601_cd6d1ed035_o.jpg,0.0,0.0,0.75,0.75,310,828,https://www.flickr.com/photos/orangeaurochs/32316961601,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/\naa07ba1587ec047e,https://c1.staticflickr.com/9/8576/29046638172_6468dd6b89_o.jpg,0.4375,0.0,1.0,0.75,469,900,https://www.flickr.com/photos/stephenk1977/29046638172,https://creativecommons.org/licenses/by/2.0/,stephenk1977,https://www.flickr.com/people/stephenk1977/\n5d8085ae68e07d72,https://c1.staticflickr.com/8/7049/27394318535_a8c7ccdeb8_o.jpg,0.0,0.28125,0.75,0.84375,709,643,https://www.flickr.com/photos/zongo/27394318535,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n749ed3502293d019,https://c1.staticflickr.com/9/8356/29415192905_173fbf26da_o.jpg,0.0,0.330871491876,1.0,1.0,475,578,https://www.flickr.com/photos/romitagirl67/29415192905/,https://creativecommons.org/licenses/by/2.0/,RomitaGirl67,https://www.flickr.com/people/romitagirl67/\n791c3d333052ca64,https://c1.staticflickr.com/9/8440/29197626174_134d6fd15f_o.jpg,0.0,0.0,0.5625,0.75,964,908,https://www.flickr.com/photos/cbroders/29197626174,https://creativecommons.org/licenses/by/2.0/,Counse,https://www.flickr.com/people/cbroders/\n90e9a43bfb6a68b7,https://c1.staticflickr.com/9/8865/28740349711_5758bc82f4_o.jpg,0.0,0.0,0.5,0.75,867,476,https://www.flickr.com/photos/iowapipe/28740349711,https://creativecommons.org/licenses/by/2.0/,IowaPipe,https://www.flickr.com/people/iowapipe/\n72e6ba0cc7fb30a6,https://c1.staticflickr.com/9/8270/29053097670_b2b9f42c1f_o.jpg,0.28125,0.0,0.84375,0.75,875,834,https://www.flickr.com/photos/aswans1234567/29053097670,https://creativecommons.org/licenses/by/2.0/,Alex Swanston&#x27;s Bus Photos,https://www.flickr.com/people/aswans1234567/\n8c5b5bc0f39e2e06,https://c1.staticflickr.com/9/8767/28247360751_7c466f8efc_o.jpg,0.421177266576,0.25,0.842354533153,1.0,898,253,https://www.flickr.com/photos/brandedbulltank/28247360751/,https://creativecommons.org/licenses/by/2.0/,Tank,https://www.flickr.com/people/brandedbulltank/\ncc43200264a62126,https://c1.staticflickr.com/8/7447/27965290502_73c8417ef8_o.jpg,0.25,0.0,0.75,0.75,981,590,https://www.flickr.com/photos/naql/27965290502,https://creativecommons.org/licenses/by/2.0/,naql,https://www.flickr.com/people/naql/\nbe95f5be87f6fadd,https://c1.staticflickr.com/6/5721/30814461816_67e70a5169_o.jpg,0.28125,0.0,0.84375,0.75,459,603,https://www.flickr.com/photos/davidwilson1949/30814461816/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n7b6e963025eaeb66,https://c1.staticflickr.com/1/316/31606962904_b2666a8780_o.jpg,0.331617647059,0.0,0.994852941176,1.0,994,660,https://flickr.com/62788663@N04/31606962904,https://creativecommons.org/licenses/by/2.0/,Martin Jambon,https://www.flickr.com/people/mjambon/\n7f842d0c1e747334,https://c1.staticflickr.com/8/7634/27141449325_4f1a76c3ed_o.jpg,0.0,0.0,1.0,1.0,305,796,https://www.flickr.com/photos/78428166@N00/27141449325,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\ned3cb7f5154ae02d,https://c1.staticflickr.com/9/8072/29900375851_914813808d_o.jpg,0.245255474453,0.25,0.735766423358,1.0,980,747,https://www.flickr.com/photos/col_and_tasha/29900375851,https://creativecommons.org/licenses/by/2.0/,Col Ford and Natasha de Vere,https://www.flickr.com/people/col_and_tasha/\n6ecbd7d19f5b9147,https://c1.staticflickr.com/9/8737/28811659522_a0d4210243_o.jpg,0.0,0.0,0.483695652174,0.75,596,423,https://www.flickr.com/photos/robdammers/28811659522/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\nd016b3204e7ca96e,https://c1.staticflickr.com/9/8558/29643762441_5e78f77661_o.jpg,0.0,0.0,0.75,1.0,792,778,https://flickr.com/39160147@N03/29643762441,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n8400742ba78ac009,https://c1.staticflickr.com/9/8544/28451617274_58e56a03de_o.jpg,0.0,0.0,0.666666666667,1.0,971,671,https://www.flickr.com/photos/blackwing_de/28451617274,https://creativecommons.org/licenses/by/2.0/,Sebastian Werner,https://www.flickr.com/people/blackwing_de/\n121c87c3c822e2c5,https://c1.staticflickr.com/1/750/31463784832_7a3c075877_o.jpg,0.25,0.25,0.75,1.0,459,386,https://www.flickr.com/photos/quinet/31463784832,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n76886996d4ab4614,https://c1.staticflickr.com/9/8192/28493603004_1b628ae8e9_o.jpg,0.0,0.25,0.5625,1.0,975,763,https://www.flickr.com/photos/jsjgeology/28493603004,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n9d5ef11ec55123e5,https://c1.staticflickr.com/9/8872/27883604363_8cf68f0178_o.jpg,0.0,0.25,0.57765451664,1.0,100,513,http://www.flickr.com/photos/dangrothe/27883604363/,https://creativecommons.org/licenses/by/2.0/,Daniel Grothe,https://www.flickr.com/people/dangrothe/\n1dfbeffd999f280e,https://c1.staticflickr.com/9/8433/28830160583_6bc4405a04_o.jpg,0.181375628141,0.0,0.544126884422,0.75,582,569,https://www.flickr.com/photos/mauritsverbiest/28830160583,https://creativecommons.org/licenses/by/2.0/,Maurits Verbiest,https://www.flickr.com/people/mauritsverbiest/\ne3f5dbed7bd31314,https://c1.staticflickr.com/8/7682/27343823144_eeaa9065cb_o.jpg,0.25,0.5,1.0,1.0,547,864,https://www.flickr.com/photos/barnimages/27343823144,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\neb8ce5ba5c47e344,https://c1.staticflickr.com/1/684/33351191226_792c561fd4_o.jpg,0.0,0.0,0.75,0.5625,669,893,https://flickr.com/126397594@N03/33351191226,https://creativecommons.org/licenses/by/2.0/,G\\303\\274ldem \\303\\234st\\303\\274n,https://www.flickr.com/people/guldem/\nf5dffe28fc19b6e7,https://c1.staticflickr.com/6/5529/31290944551_78ff48d9a3_o.jpg,0.266071428571,0.25,1.0,1.0,918,730,https://flickr.com/91873856@N00/31290944551,https://creativecommons.org/licenses/by/2.0/,Phil Venditti,https://www.flickr.com/people/venditti_min_min-venditti/\n1ebff1b3c8de66de,https://c1.staticflickr.com/9/8551/29684108315_b9b08f8035_o.jpg,0.464122137405,0.25,1.0,1.0,337,810,https://www.flickr.com/photos/ruthanddave/29684108315,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n0546b47c13f154d3,https://c1.staticflickr.com/1/744/31706873925_eb85a4c572_o.jpg,0.0,0.0,0.976785714286,1.0,108,318,https://www.flickr.com/photos/92252798@N07/31706873925,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/\nf52db15134c1a74e,https://c1.staticflickr.com/6/5628/30300134543_71291f4050_o.jpg,0.0,0.0,1.0,1.0,638,776,https://flickr.com/13894201@N00/30300134543,https://creativecommons.org/licenses/by/2.0/,\\303\\201d\\303\\241m Szedl\\303\\241k,https://www.flickr.com/people/kelt/\n8094d4088a08cf09,https://c1.staticflickr.com/1/725/31560908483_4276d9241c_o.jpg,0.0,0.0,0.666666666667,1.0,441,615,https://www.flickr.com/photos/allagashbrewing/31560908483/,https://creativecommons.org/licenses/by/2.0/,Allagash Brewing,https://www.flickr.com/people/allagashbrewing/\nd9f624188d16fe93,https://c1.staticflickr.com/8/7402/27067928760_efcb66d26f_o.jpg,0.25,0.25,0.75,1.0,40,602,https://www.flickr.com/photos/juliofromero/27067928760,https://creativecommons.org/licenses/by/2.0/,Julio Romero,https://www.flickr.com/people/juliofromero/\n631b6820e91a9e3e,https://c1.staticflickr.com/3/2183/32694281652_62b0c63d26_o.jpg,0.333333333333,0.0,1.0,1.0,13,303,https://www.flickr.com/photos/wildreturn/32694281652/,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\n611f453c4bb616b9,https://c1.staticflickr.com/8/7494/27095667650_2158e5d0a3_o.jpg,0.25,0.25,0.75,1.0,310,65,https://www.flickr.com/photos/gaby1/27095667650,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\n5792d4a42d2a82c8,https://c1.staticflickr.com/9/8655/30162044361_628a8758b1_o.jpg,0.0,0.0,1.0,1.0,988,419,https://flickr.com/51966661@N00/30162044361,https://creativecommons.org/licenses/by/2.0/,valerialaura,https://www.flickr.com/people/valerialaura/\nc0e0c11350b8740e,https://c1.staticflickr.com/9/8316/28819944676_84ab998606_o.jpg,0.0,0.0,0.741835147745,1.0,319,698,https://www.flickr.com/photos/gails_pictures/28819944676,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nc663670c06c06ea4,https://c1.staticflickr.com/6/5671/30978227515_c8c43aa172_o.jpg,0.0,0.24882629108,1.0,1.0,909,903,http://www.flickr.com/photos/verzo/30978227515/,https://creativecommons.org/licenses/by/2.0/,Roberto Verzo,https://www.flickr.com/people/verzo/\n49591319edeb6b3a,https://c1.staticflickr.com/8/7379/28056205761_56dc8a13a9_o.jpg,0.333333333333,0.0,1.0,1.0,309,416,https://www.flickr.com/photos/104342908@N08/28056205761,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/\n02eb799d147d5f91,https://c1.staticflickr.com/8/7461/27924109056_3f35c44ec8_o.jpg,0.0,0.0,0.5,0.75,625,773,https://www.flickr.com/photos/vvbad/27924109056/,https://creativecommons.org/licenses/by/2.0/,VVBAD,https://www.flickr.com/people/vvbad/\nf2d36d089779166a,https://c1.staticflickr.com/8/7528/27618132235_3bd6c10788_o.jpg,0.0,0.25,0.503698224852,1.0,349,805,https://www.flickr.com/photos/eljay/27618132235/,https://creativecommons.org/licenses/by/2.0/,Eljay,https://www.flickr.com/people/eljay/\ncc8d850717026796,https://c1.staticflickr.com/8/7304/26869810723_660f0642a5_o.jpg,0.0,0.0,1.0,1.0,662,791,https://www.flickr.com/photos/29233640@N07/26869810723,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/\nab3fef142d031784,https://c1.staticflickr.com/1/17/30695559644_ea51d4a001_o.jpg,0.0,0.25,0.5625,1.0,657,737,https://www.flickr.com/photos/27665395@N05/30695559644,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nc84cbc2c05227bee,https://c1.staticflickr.com/1/778/32130016155_b5c1709d28_o.jpg,0.28125,0.0,0.84375,0.75,437,979,https://www.flickr.com/photos/nzcarfreak/32130016155/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\n9d55997552acf0de,https://c1.staticflickr.com/4/3827/33042042362_c6d848f625_o.jpg,0.0,0.25,0.498159057437,1.0,260,199,https://flickr.com/145431051@N05/33042042362,https://creativecommons.org/licenses/by/2.0/,Natalia King,https://www.flickr.com/people/inataliaking/\n8da3593258ae27cb,https://c1.staticflickr.com/8/7304/27230857426_6398e3ff70_o.jpg,0.257672155689,0.25,0.773016467066,1.0,581,399,https://www.flickr.com/photos/eu2016nl/27230857426,https://creativecommons.org/licenses/by/2.0/,EU2016 NL,https://www.flickr.com/people/eu2016nl/\nfccab516c111d524,https://c1.staticflickr.com/1/578/31833204592_df37b2fd5f_o.jpg,0.5,0.0,1.0,0.75,650,757,https://www.flickr.com/photos/shadowgate/31833204592,https://creativecommons.org/licenses/by/2.0/,Shadowgate,https://www.flickr.com/people/shadowgate/\n315e55af9615abd2,https://c1.staticflickr.com/1/779/31725794312_e202c64123_o.jpg,0.256726457399,0.25,0.770179372197,1.0,347,106,https://flickr.com/13476480@N07/31725794312,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nc135337ca7a575ae,https://c1.staticflickr.com/9/8239/28468432034_845b238b0a_o.jpg,0.28125,0.0,0.84375,0.75,348,178,https://www.flickr.com/photos/sedoglia/28468432034,https://creativecommons.org/licenses/by/2.0/,Sergio,https://www.flickr.com/people/sedoglia/\n3bfe9ff7b488485d,https://c1.staticflickr.com/8/7526/27213158786_4411c71bb4_o.jpg,0.0,0.25,0.5,1.0,706,710,https://www.flickr.com/photos/45220772@N06/27213158786,https://creativecommons.org/licenses/by/2.0/,Chris GBNL,https://www.flickr.com/people/45220772@N06/\n1e33aa336b89dcff,https://c1.staticflickr.com/9/8069/29343726103_76a4d6550d_o.jpg,0.455384615385,0.0,1.0,0.75,539,588,https://www.flickr.com/photos/hisgett/29343726103/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n39a483e9a23716ed,https://c1.staticflickr.com/6/5803/30224386731_129a573cb6_o.jpg,0.0,0.25,0.497426470588,1.0,676,646,https://www.flickr.com/photos/thenationalguard/30224386731,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/\n5191cfba868056a5,https://c1.staticflickr.com/9/8057/28990247303_f5235fa9ae_o.jpg,0.250923190547,0.25,0.75276957164,1.0,971,793,http://www.flickr.com/photos/pekkatamminen/28990247303/,https://creativecommons.org/licenses/by/2.0/,Pekka Tamminen,https://www.flickr.com/people/pekkatamminen/\n4572c8986c28343b,https://c1.staticflickr.com/9/8672/28241882454_babaf6f88f_o.jpg,0.334315169367,0.0,1.0,1.0,437,535,https://www.flickr.com/photos/greggjerdingen/28241882454,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n7700d0ba053dc4bd,https://c1.staticflickr.com/9/8881/28767707555_05e533e1a1_o.jpg,0.25,0.249079528719,1.0,0.747238586156,937,292,https://www.flickr.com/photos/scotnelson/28767707555,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\neab9755117160864,https://c1.staticflickr.com/8/7509/29649911804_fbed1c6dac_o.jpg,0.25,0.0,1.0,0.618442622951,611,510,https://flickr.com/128305985@N02/29649911804,https://creativecommons.org/licenses/by/2.0/,Varevo Designs,https://www.flickr.com/people/128305985@N02/\n8b47d72b39b2bd33,https://c1.staticflickr.com/8/7458/27617552740_586605d6d1_o.jpg,0.331130690162,0.0,0.993392070485,1.0,526,97,https://flickr.com/77742560@N06/27617552740,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n7d2a7bca22967f29,https://c1.staticflickr.com/8/7525/27211199483_b103fe3789_o.jpg,0.0,0.0,0.512686567164,0.75,735,600,https://www.flickr.com/photos/hisgett/27211199483,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n8e89734ed940e222,https://c1.staticflickr.com/1/510/31839325642_621a361097_o.jpg,0.30421686747,0.0,1.0,1.0,657,794,https://www.flickr.com/photos/autohistorian/31839325642,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n30b922dbfdbffd11,https://c1.staticflickr.com/3/2431/32476279840_81a638927d_o.jpg,0.28125,0.0,0.84375,0.75,610,972,https://www.flickr.com/photos/karen_roe/32476279840,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/\nef0e34b8ccb6d42f,https://c1.staticflickr.com/9/8841/28756457540_dd42170f61_o.jpg,0.25,0.25,0.75,1.0,982,712,https://www.flickr.com/photos/87533529@N00/28756457540/,https://creativecommons.org/licenses/by/2.0/,Joel Dinda,https://www.flickr.com/people/mwlguide/\n506b87b78daa499c,https://c1.staticflickr.com/8/7427/26651646184_52fdea24f9_o.jpg,0.0,0.0,0.575553797468,0.75,821,244,https://www.flickr.com/photos/jsjgeology/26651646184,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n62e0e0efc6deeef4,https://c1.staticflickr.com/8/7292/26212453023_25d43a954f_o.jpg,0.0,0.0,0.5,0.75,971,772,https://www.flickr.com/photos/akashadorable/26212453023,https://creativecommons.org/licenses/by/2.0/,reverie_rambler,https://www.flickr.com/people/akashadorable/\n28652355cd12a1e7,https://c1.staticflickr.com/8/7281/27719555664_9d2eee5a25_o.jpg,0.276162790698,0.0,0.828488372093,0.75,308,63,https://www.flickr.com/photos/86548370@N00/27719555664/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n0ed355357757528d,https://c1.staticflickr.com/1/771/30766164923_65f81b0a16_o.jpg,0.0,0.0,0.666666666667,1.0,763,795,https://www.flickr.com/photos/dalbera/30766164923,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\nabe9504895f6e8dd,https://c1.staticflickr.com/8/7719/27005746036_e3c2d66824_o.jpg,0.204773030708,0.25,0.614319092123,1.0,566,607,https://www.flickr.com/photos/kansasscanner/27005746036/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\ndd984311bff04342,https://c1.staticflickr.com/6/5505/30880758442_b260c358d1_o.jpg,0.57825203252,0.0,1.0,0.75,118,524,https://flickr.com/149229065@N07/30880758442,https://creativecommons.org/licenses/by/2.0/,bready_fv,https://www.flickr.com/people/149229065@N07/\nf7947af6545be760,https://c1.staticflickr.com/9/8088/29622519706_0b2d2626e1_o.jpg,0.0,0.0,0.7484375,1.0,418,722,https://www.flickr.com/photos/xingxiyang/29622519706/,https://creativecommons.org/licenses/by/2.0/,Kiefer,https://www.flickr.com/people/xingxiyang/\n01244097ca8ffdfa,https://c1.staticflickr.com/9/8420/29072932140_428884b149_o.jpg,0.0,0.0,0.666666666667,1.0,91,563,https://www.flickr.com/photos/bigtallguy/29072932140,https://creativecommons.org/licenses/by/2.0/,Paul Reynolds,https://www.flickr.com/people/bigtallguy/\n3cf4bb0637d0f182,https://c1.staticflickr.com/6/5336/31376083036_f61bd4c093_o.jpg,0.0,0.4375,0.75,1.0,862,52,http://www.flickr.com/photos/subzonica/31376083036/,https://creativecommons.org/licenses/by/2.0/,Hern\\303\\241n Garc\\303\\255a Crespo,https://www.flickr.com/people/subzonica/\n1d5361e858fe8462,https://c1.staticflickr.com/1/252/31161493730_01da9f540b_o.jpg,0.0,0.25,0.377400768246,1.0,499,523,https://www.flickr.com/photos/usnavalwarcollegeri/31161493730/,https://creativecommons.org/licenses/by/2.0/,U.S. Naval War College,https://www.flickr.com/people/usnavalwarcollegeri/\n6a50fbe8723a6a4a,https://c1.staticflickr.com/1/571/31590985202_b888dd2600_o.jpg,0.5,0.25,1.0,1.0,563,597,https://www.flickr.com/photos/rollercoasterphilosophy/31590985202/,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/\n001b5e6f1b89fd3b,https://c1.staticflickr.com/6/5342/31290416685_7145707d8a_o.jpg,0.4375,0.25,1.0,1.0,577,909,https://www.flickr.com/photos/127226743@N02/31290416685,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n25eef91443ded954,https://c1.staticflickr.com/6/5495/29933353114_e345092c4c_o.jpg,0.471030042918,0.0,0.942060085837,0.75,437,728,https://www.flickr.com/photos/autohistorian/29933353114,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\ned3f9b6a081a4802,https://c1.staticflickr.com/8/7432/27519628793_d12a4b1349_o.jpg,0.0,0.0,0.666666666667,1.0,818,210,https://www.flickr.com/photos/thecarspy/27519628793,https://creativecommons.org/licenses/by/2.0/,The Car Spy,https://www.flickr.com/people/thecarspy/\n95fbd20d0aaf319a,https://c1.staticflickr.com/1/292/31801536095_12b2b4d011_o.jpg,0.333333333333,0.0,1.0,1.0,826,300,https://www.flickr.com/photos/shankaronline/31801536095,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n2bc6c55a0ab24f86,https://c1.staticflickr.com/8/7578/28472228121_b58f3263f6_o.jpg,0.28125,0.0,0.84375,0.75,786,697,https://www.flickr.com/photos/merfam/28472228121/,https://creativecommons.org/licenses/by/2.0/,Jason Meredith,https://www.flickr.com/people/merfam/\n319e8b63d6a194aa,https://c1.staticflickr.com/9/8203/29608037100_b9c0377cb0_o.jpg,0.4375,0.25,1.0,1.0,826,529,https://www.flickr.com/photos/127226743@N02/29608037100,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n4fcc9c949d66a4e0,https://c1.staticflickr.com/9/8273/29520584994_c6a87b78b7_o.jpg,0.176470588235,0.0,0.529411764706,0.75,771,104,https://flickr.com/35080385@N08/29520584994,https://creativecommons.org/licenses/by/2.0/,Daniel Max,https://www.flickr.com/people/35080385@N08/\n5c847b72d1e1713f,https://c1.staticflickr.com/8/7402/27581042815_97ab7892e1_o.jpg,0.25,0.0,1.0,0.75,556,522,https://www.flickr.com/photos/13152419@N05/27581042815/,https://creativecommons.org/licenses/by/2.0/,A.J. WOODSON,https://www.flickr.com/people/13152419@N05/\n707bce947d54bcd8,https://c1.staticflickr.com/6/5533/31047975071_6e1e9857a2_o.jpg,0.43661971831,0.25,1.0,1.0,947,941,https://www.flickr.com/photos/amantedar/31047975071/,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/\n43fa89c17e628c06,https://c1.staticflickr.com/6/5669/30471849463_58158aea97_o.jpg,0.28125,0.0,0.84375,0.75,133,885,https://www.flickr.com/photos/ddebold/30471849463,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/\n6612fd36e6dd9534,https://c1.staticflickr.com/8/7446/27992527025_02e1093865_o.jpg,0.24882629108,0.0,1.0,1.0,309,866,https://www.flickr.com/photos/treegrow/27992527025,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n4146a745f9b2f3cb,https://c1.staticflickr.com/1/453/32533674871_37d9a42b5c_o.jpg,0.28125,0.0,0.84375,0.75,51,418,https://www.flickr.com/photos/kjfnjy/32533674871,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/\n74bfc95412b2f824,https://c1.staticflickr.com/8/7046/26382321234_683510e9d6_o.jpg,0.0,0.0,1.0,1.0,672,655,https://www.flickr.com/photos/salvolg/26382321234,https://creativecommons.org/licenses/by/2.0/,Salvatore,https://www.flickr.com/people/salvolg/\n5fc906f27c8975d2,https://c1.staticflickr.com/9/8029/29167405853_4e4009a5d5_o.jpg,0.0,0.0,0.5625,0.75,979,367,https://www.flickr.com/photos/marsupilami92/29167405853,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\n2fc17ec1fad5d947,https://c1.staticflickr.com/2/1618/26152633944_15768856b8_o.jpg,0.0,0.25,0.579761904762,1.0,874,929,https://www.flickr.com/photos/sergejf/26152633944,https://creativecommons.org/licenses/by/2.0/,sergejf,https://www.flickr.com/people/sergejf/\ncb63df64516985c1,https://c1.staticflickr.com/8/7226/27305715702_336cd34ebb_o.jpg,0.334315169367,0.0,1.0,1.0,635,772,https://www.flickr.com/photos/sarahvain/27305715702,https://creativecommons.org/licenses/by/2.0/,Sarah Stierch,https://www.flickr.com/people/sarahvain/\n7b8413ef241118df,https://c1.staticflickr.com/6/5627/31291332596_e0705f6670_o.jpg,0.4375,0.25,1.0,1.0,548,485,https://www.flickr.com/photos/davidwilson1949/31291332596,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n2e854fca826e54b3,https://c1.staticflickr.com/1/307/31234607810_e2d5b4b1c8_o.jpg,0.333333333333,0.0,1.0,1.0,858,596,https://www.flickr.com/photos/dalbera/31234607810/,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\nf0add7f552d2d895,https://c1.staticflickr.com/6/5800/30295930850_0c40713818_o.jpg,0.0,0.0,0.5625,0.75,650,543,https://www.flickr.com/photos/technoevangelist/30295930850,https://creativecommons.org/licenses/by/2.0/,Fee Plumley,https://www.flickr.com/people/technoevangelist/\n9d4674c86096e4bd,https://c1.staticflickr.com/9/8410/29866310754_8c13093feb_o.jpg,0.25,0.470789074355,1.0,1.0,662,614,https://www.flickr.com/photos/autohistorian/29866310754,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n05437214d1ba9580,https://c1.staticflickr.com/9/8829/28380794150_706cf5d693_o.jpg,0.0,0.25,0.5625,1.0,810,118,https://www.flickr.com/photos/68147320@N02/28380794150,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\ndacb07f80166a7fd,https://c1.staticflickr.com/6/5813/30874086821_c5bcdcb048_o.jpg,0.5,0.0,1.0,0.75,449,108,http://www.flickr.com/photos/boykoblagoev/30874086821/,https://creativecommons.org/licenses/by/2.0/,Boyko Blagoev,https://www.flickr.com/people/boykoblagoev/\n82b6f0bc71f5d0af,https://c1.staticflickr.com/4/3943/15734053815_ccb8cb6852_o.jpg,0.0,0.0,1.0,1.0,563,578,https://www.flickr.com/photos/zedzap/15734053815/,https://creativecommons.org/licenses/by/2.0/,Nick Kenrick,https://www.flickr.com/people/zedzap/\n0f36316247c03427,https://c1.staticflickr.com/1/504/31690529866_dc4e0a80a7_o.jpg,0.500736377025,0.25,1.0,1.0,753,681,https://www.flickr.com/photos/squashdev/31690529866,https://creativecommons.org/licenses/by/2.0/,England Squash Masters,https://www.flickr.com/people/squashdev/\nefeabdd8a05e91f8,https://c1.staticflickr.com/9/8810/28183540151_f7108aa9a2_o.jpg,0.0,0.0,0.5625,0.75,498,311,https://www.flickr.com/photos/131810676@N03/28183540151/,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/\n7453471febf1db6f,https://c1.staticflickr.com/9/8870/28331839720_9de4810a16_o.jpg,0.0,0.333333333333,1.0,1.0,595,90,https://www.flickr.com/photos/stevenpisano/28331839720,https://creativecommons.org/licenses/by/2.0/,Steven Pisano,https://www.flickr.com/people/stevenpisano/\ne6f2de0c605f1ed3,https://c1.staticflickr.com/9/8392/29438273202_8ba928f59f_o.jpg,0.471590909091,0.0,1.0,0.75,132,994,https://www.flickr.com/photos/dkeats/29438273202,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n648231d9393250fd,https://c1.staticflickr.com/1/436/31994770622_64e6478fe4_o.jpg,0.578822733424,0.25,1.0,1.0,548,650,https://www.flickr.com/photos/belurashok/31994770622/,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/\n864fffaf7a83b3f4,https://c1.staticflickr.com/8/7471/27863056826_bc9e568c4c_o.jpg,0.0,0.0,0.75,1.0,581,373,https://www.flickr.com/photos/juggernautco/27863056826,https://creativecommons.org/licenses/by/2.0/,Daniel X. O&#x27;Neil,https://www.flickr.com/people/juggernautco/\nc179282bd977c6e0,https://c1.staticflickr.com/3/2907/32124474993_c63801fabf_o.jpg,0.0,0.0,0.556376360809,0.75,672,105,https://www.flickr.com/photos/glorycycles/32124474993,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n40a7f086461190f3,https://c1.staticflickr.com/2/1514/26690160211_eda12ace1e_o.jpg,0.428627760252,0.25,1.0,1.0,493,841,https://www.flickr.com/photos/martius/26690160211,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\n90e1aa56cae80a60,https://c1.staticflickr.com/6/5068/30114102505_bcc8ec61db_o.jpg,0.0,0.0,1.0,1.0,918,417,https://flickr.com/64648244@N04/30114102505,https://creativecommons.org/licenses/by/2.0/,Ulf K,https://www.flickr.com/people/ulfk/\n839aa3d166b020cf,https://c1.staticflickr.com/8/7104/26514437520_58ea29102e_o.jpg,0.0,0.25,0.720796460177,1.0,14,211,https://www.flickr.com/photos/nrgoodrum/26514437520,https://creativecommons.org/licenses/by/2.0/,nick goodrum,https://www.flickr.com/people/nrgoodrum/\n38bdd950c1d08be6,https://c1.staticflickr.com/1/467/32470039506_2c9d8f3c2c_o.jpg,0.0,0.0,0.75,1.0,133,891,https://www.flickr.com/photos/rusty_clark/32470039506/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n2d95297e468bdf9b,https://c1.staticflickr.com/8/7358/27718678441_390843b0a4_o.jpg,0.28125,0.25,0.84375,1.0,866,526,https://www.flickr.com/photos/jeepersmedia/27718678441,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nef5b1e5a76ae66dc,https://c1.staticflickr.com/9/8028/29706482742_e07ecf46e1_o.jpg,0.497426470588,0.0,0.994852941176,0.75,540,725,https://www.flickr.com/photos/emilysnuffer/29706482742,https://creativecommons.org/licenses/by/2.0/,Emily May,https://www.flickr.com/people/emilysnuffer/\n7a11ae4c1f5e790c,https://c1.staticflickr.com/8/7680/28813894581_61251a80fa_o.jpg,0.249079528719,0.25,0.747238586156,1.0,689,500,https://www.flickr.com/photos/zigazou76/28813894581,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n477bf90e7413df23,https://c1.staticflickr.com/8/7338/27067101244_7942b5769e_o.jpg,0.0,0.0,0.578296703297,1.0,542,836,https://www.flickr.com/photos/fifeanddrum/27067101244,https://creativecommons.org/licenses/by/2.0/,U. S. Army Old Guard Fife and Drum Corps,https://www.flickr.com/people/fifeanddrum/\n7060ae82e5b96a77,https://c1.staticflickr.com/8/7414/27849533291_23d512cc58_o.jpg,0.0,0.0,0.75,1.0,522,495,https://www.flickr.com/photos/jeepersmedia/27849533291,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n42e55ac6782d4d99,https://c1.staticflickr.com/9/8841/28851410876_d279c09ca0_o.jpg,0.0,0.0,0.5625,0.75,974,819,https://flickr.com/131967103@N02/28851410876,https://creativecommons.org/licenses/by/2.0/,Ryan McMinds,https://www.flickr.com/people/131967103@N02/\n8868879c2acd5d9e,https://c1.staticflickr.com/8/7477/27387672956_baa0cdeb89_o.jpg,0.455384615385,0.0,1.0,0.75,322,130,https://www.flickr.com/photos/usfwsmidwest/27387672956,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n5b3a8c63e41802e7,https://c1.staticflickr.com/9/8883/27865729823_3db56871fa_o.jpg,0.25,0.25,1.0,1.0,750,758,https://flickr.com/38315261@N00/27865729823,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\n659ca4ac6cc57e89,https://c1.staticflickr.com/1/371/31418192282_a6fa2c7a51_o.jpg,0.25,0.0,0.75,0.75,778,590,https://www.flickr.com/photos/quinet/31418192282,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n9534108b0e8dceb1,https://c1.staticflickr.com/1/668/31683586152_9c8d97ef8f_o.jpg,0.282719435737,0.25,0.84815830721,1.0,647,822,https://www.flickr.com/photos/arnehendriks/31683586152,https://creativecommons.org/licenses/by/2.0/,Arne Hendriks,https://www.flickr.com/people/arnehendriks/\nfbc6b98b13c768e2,https://c1.staticflickr.com/9/8435/29171057840_4acaf34304_o.jpg,0.0,0.25,0.5625,1.0,459,566,https://www.flickr.com/photos/rheba/29171057840,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/\n7c3b0d93654b39cd,https://c1.staticflickr.com/6/5128/29789328711_639198fc6f_o.jpg,0.25,0.0,1.0,0.5625,708,428,https://www.flickr.com/photos/playamongfriends/29789328711,https://creativecommons.org/licenses/by/2.0/,Play Among Friends Paf,https://www.flickr.com/people/playamongfriends/\n43694caa12d5f823,https://c1.staticflickr.com/1/445/31614966550_d5fc6f7f3d_o.jpg,0.28125,0.25,0.84375,1.0,979,757,https://www.flickr.com/photos/cambodia4kidsorg/31614966550/,https://creativecommons.org/licenses/by/2.0/,Cambodia4kids.org Beth Kanter,https://www.flickr.com/people/cambodia4kidsorg/\n69788a29e7436808,https://c1.staticflickr.com/6/5332/30849701300_a85871c357_o.jpg,0.12962962963,0.0,1.0,1.0,310,50,https://www.flickr.com/photos/gails_pictures/30849701300/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\ndaa43d65c3b18a84,https://c1.staticflickr.com/9/8253/29381659730_52bcbf8b59_o.jpg,0.0,0.0,1.0,0.75,822,54,https://www.flickr.com/photos/39551170@N02/29381659730,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/\na8c3363bbcc7015c,https://c1.staticflickr.com/9/8823/29472376703_be7d867566_o.jpg,0.0,0.0,0.912068965517,1.0,739,840,https://www.flickr.com/photos/tomronworldwide/29472376703,https://creativecommons.org/licenses/by/2.0/,Ron Frazier,https://www.flickr.com/people/tomronworldwide/\n93a0857ff81c25ce,https://c1.staticflickr.com/6/5733/30469514315_1d8ce7f4c2_o.jpg,0.0,0.0,0.5,0.75,548,959,https://www.flickr.com/photos/rhemkes/30469514315,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\nb11fa0f292c0178f,https://c1.staticflickr.com/1/780/32263240380_ee5c7a9637_o.jpg,0.25,0.0,0.75,0.75,702,901,http://www.flickr.com/photos/124790945@N06/32263240380,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/\n1dc0533f87996962,https://c1.staticflickr.com/8/7704/26497012284_30e830cc10_o.jpg,0.409855769231,0.25,1.0,1.0,566,853,https://www.flickr.com/photos/jsjgeology/26497012284,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n589319c64adf5fce,https://c1.staticflickr.com/8/7460/27398216034_b731c9e68a_o.jpg,0.333333333333,0.0,1.0,1.0,699,588,https://www.flickr.com/photos/libereurope/27398216034/,https://creativecommons.org/licenses/by/2.0/,LIBER Europe,https://www.flickr.com/people/libereurope/\ncebd45d7200f6111,https://c1.staticflickr.com/9/8339/29164491280_b7d3bdd713_o.jpg,0.25,0.0,1.0,0.719444444444,71,947,https://www.flickr.com/photos/garlandcannon/29164491280,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/\n7e73c7adc520e406,https://c1.staticflickr.com/8/7416/26859649600_fb2cbaf86b_o.jpg,0.25,0.0,1.0,0.648070469799,133,86,https://www.flickr.com/photos/lakeworth/26859649600,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/\n6de6432b0f23ae75,https://c1.staticflickr.com/1/579/32182435510_e9fab3e93c_o.jpg,0.333333333333,0.0,1.0,1.0,105,407,https://www.flickr.com/photos/rexness/32182435510,https://creativecommons.org/licenses/by/2.0/,Rexness,https://www.flickr.com/people/rexness/\nebb4dad78cfd67a9,https://c1.staticflickr.com/8/7293/27173553526_fe84eeeec9_o.jpg,0.25,0.0,1.0,1.0,738,730,https://www.flickr.com/photos/jeepersmedia/27173553526,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\ne8c6f75ad26bae84,https://c1.staticflickr.com/9/8393/29734167231_b03b36f04b_o.jpg,0.28125,0.25,0.84375,1.0,973,929,https://www.flickr.com/photos/jsjgeology/29734167231,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n1e408a8d1e2cdc74,https://c1.staticflickr.com/6/5509/30181862974_0a8d40efb1_o.jpg,0.4375,0.0,1.0,0.75,769,779,https://www.flickr.com/photos/stmunchins/30181862974/,https://creativecommons.org/licenses/by/2.0/,St Munchin&#x27;s College,https://www.flickr.com/people/stmunchins/\n11afa51200515f9a,https://c1.staticflickr.com/8/7654/28347963084_4a9385edd0_o.jpg,0.263089005236,0.0,0.789267015707,1.0,826,567,https://www.flickr.com/photos/anandajoti/28347963084/,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/\n9f6fe669276f04cf,https://c1.staticflickr.com/9/8760/28674693282_7eec755334_o.jpg,0.0,0.0,0.7484375,1.0,920,697,https://www.flickr.com/photos/zimpenfish/28674693282,https://creativecommons.org/licenses/by/2.0/,rjp,https://www.flickr.com/people/zimpenfish/\n408bae58c26a8076,https://c1.staticflickr.com/6/5773/29699525424_ea6336aaa8_o.jpg,0.462155963303,0.0,1.0,0.75,133,761,https://www.flickr.com/photos/taylar/29699525424,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/\nb5548ecffa20aac8,https://c1.staticflickr.com/1/713/32057543825_ded4304f3b_o.jpg,0.0,0.0,0.5,0.75,934,108,http://www.flickr.com/photos/143850343@N06/32057543825/,https://creativecommons.org/licenses/by/2.0/,Sam-H-A,https://www.flickr.com/people/143850343@N06/\n9ee13ecd8d6727c0,https://c1.staticflickr.com/6/5708/30313299300_68025e82ed_o.jpg,0.0,0.498153618907,0.75,1.0,498,554,https://www.flickr.com/photos/quinet/30313299300,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nd1a723656dc08b5e,https://c1.staticflickr.com/8/7407/27895921745_908d139fdd_o.jpg,0.503303964758,0.25,1.0,1.0,822,814,https://www.flickr.com/photos/shankaronline/27895921745,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nd1709eec353a6f93,https://c1.staticflickr.com/8/7421/27144655490_a81fccf9ca_o.jpg,0.0,0.25,0.75,1.0,297,556,https://www.flickr.com/photos/rjbailey/27144655490/,https://creativecommons.org/licenses/by/2.0/,Ron Bailey,https://www.flickr.com/people/rjbailey/\nb89dbfcc49dcf156,https://c1.staticflickr.com/8/7448/27273015613_f2767e3f98_o.jpg,0.210588633288,0.0,0.631765899865,0.75,889,467,https://www.flickr.com/photos/spencerhall/27273015613,https://creativecommons.org/licenses/by/2.0/,Spencer Hall,https://www.flickr.com/people/spencerhall/\n7368fe0ff47343a0,https://c1.staticflickr.com/8/7520/26512614104_b123959864_o.jpg,0.28125,0.25,0.84375,1.0,965,447,https://www.flickr.com/photos/rainsong/26512614104,https://creativecommons.org/licenses/by/2.0/,Ali - \\330\\271\\331\\204\\331\\212 from Riyadh - \\331\\205\\331\\206 \\330\\247\\331\\204\\330\\261\\331\\212\\330\\247\\330\\266,https://www.flickr.com/people/rainsong/\nd23fd2119c4f5dec,https://c1.staticflickr.com/9/8165/28790897384_31003e57ee_o.jpg,0.249631811487,0.0,0.748895434462,0.75,329,123,https://www.flickr.com/photos/fhgitarre/28790897384,https://creativecommons.org/licenses/by/2.0/,FHgitarre,https://www.flickr.com/people/fhgitarre/\n5a0e21d54b9c4954,https://c1.staticflickr.com/8/7243/27968268826_09285822b1_o.jpg,0.0,0.0,0.715608465608,0.75,328,146,https://www.flickr.com/photos/noaaphotolib/27968268826,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\n4b8517e927f32962,https://c1.staticflickr.com/9/8140/29892684285_e0633bea72_o.jpg,0.25,0.25,1.0,1.0,866,271,https://flickr.com/10307586@N03/29892684285,https://creativecommons.org/licenses/by/2.0/,Mark Pegrum,https://www.flickr.com/people/ozmark17/\n38deb4830d12358f,https://c1.staticflickr.com/6/5650/31182154435_7dc98f5dba_o.jpg,0.5,0.0,1.0,0.75,980,936,https://www.flickr.com/photos/henry_hemming/31182154435,https://creativecommons.org/licenses/by/2.0/,Henry Hemming,https://www.flickr.com/people/henry_hemming/\n81804435ad51df95,https://c1.staticflickr.com/1/255/31787555660_d866250efd_o.jpg,0.0,0.0,0.5,0.75,437,241,https://www.flickr.com/photos/nielsautos/31787555660,https://creativecommons.org/licenses/by/2.0/,Niels de Wit,https://www.flickr.com/people/nielsautos/\ne4941a341ace171a,https://c1.staticflickr.com/9/8006/28587599723_947de8d314_o.jpg,0.25,0.25,1.0,0.75,709,298,https://www.flickr.com/photos/asrusch/28587599723,https://creativecommons.org/licenses/by/2.0/,Andy Rusch,https://www.flickr.com/people/asrusch/\n558a7b66b78ba65b,https://c1.staticflickr.com/6/5797/30174833703_4e5f61ded4_o.jpg,0.0,0.0,1.0,0.745709828393,422,668,https://www.flickr.com/photos/tusnelda/30174833703/,https://creativecommons.org/licenses/by/2.0/,storebukkebruse,https://www.flickr.com/people/tusnelda/\n435137d9d4f4125e,https://c1.staticflickr.com/8/7535/28182425121_c71755b34e_o.jpg,0.0,0.0,0.75,0.75,2,269,https://www.flickr.com/photos/aidanmorgan/28182425121/,https://creativecommons.org/licenses/by/2.0/,John Morgan,https://www.flickr.com/people/aidanmorgan/\nc43077b2283479be,https://c1.staticflickr.com/6/5522/30653895580_2c136ce8c7_o.jpg,0.0,0.0,0.75,0.588,14,765,https://flickr.com/93242958@N00/30653895580,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n77c72d0a01e1af70,https://c1.staticflickr.com/9/8214/28891107093_72da720a1d_o.jpg,0.5,0.0,1.0,0.75,428,836,https://www.flickr.com/photos/katiethebeau/28891107093/,https://creativecommons.org/licenses/by/2.0/,KatieThebeau,https://www.flickr.com/people/katiethebeau/\n72ac2a5af79e26d5,https://c1.staticflickr.com/6/5613/31220748780_31a537d326_o.jpg,0.28125,0.0,0.84375,0.75,718,862,https://www.flickr.com/photos/hugo90/31220748780,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n32c0e4647ce5a812,https://c1.staticflickr.com/9/8344/29851489791_076d3494a0_o.jpg,0.486899563319,0.0,0.973799126638,0.75,327,743,https://www.flickr.com/photos/yogendra174/29851489791,https://creativecommons.org/licenses/by/2.0/,Yogendra Joshi,https://www.flickr.com/people/yogendra174/\n54153d17b11b495c,https://c1.staticflickr.com/6/5500/30389728162_23cdff8ba8_o.jpg,0.421177266576,0.0,0.842354533153,0.75,657,551,https://www.flickr.com/photos/micsworld/30389728162,https://creativecommons.org/licenses/by/2.0/,Mic,https://www.flickr.com/people/micsworld/\nfb1efda0b27d5289,https://c1.staticflickr.com/1/460/31194422753_24550f0615_o.jpg,0.5,0.0,1.0,0.75,848,203,https://www.flickr.com/photos/quinet/31194422753,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n7c5ea6f89e6e2733,https://c1.staticflickr.com/1/454/32710889631_00f86c1d71_o.jpg,0.500736377025,0.0,1.0,0.75,820,587,https://www.flickr.com/photos/dominik_junger/32710889631/in/album-72157676671651883/,https://creativecommons.org/licenses/by/2.0/,Dominik Junger,https://www.flickr.com/people/dominik_junger/\n721804d1d3a60206,https://c1.staticflickr.com/8/7790/27456693684_f07ebe3aea_o.jpg,0.0,0.0,0.666666666667,1.0,909,34,https://www.flickr.com/photos/presidentialoffice/27456693684,https://creativecommons.org/licenses/by/2.0/,\\347\\270\\275\\347\\265\\261\\345\\272\\234,https://www.flickr.com/people/presidentialoffice/\ndcb6b32cd80f2b1f,https://c1.staticflickr.com/8/7560/29512813082_6efd1c1b56_o.jpg,0.28125,0.0,0.84375,0.75,556,832,https://www.flickr.com/photos/27665395@N05/29512813082/,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n49c27b439d39a00c,https://c1.staticflickr.com/1/653/33034701806_914058174b_o.jpg,0.335787923417,0.0,1.0,1.0,490,418,https://flickr.com/38144691@N00/33034701806,https://creativecommons.org/licenses/by/2.0/,August Kelm,https://www.flickr.com/people/augustksphotos/\n2c065d2dc6b2cf44,https://c1.staticflickr.com/6/5441/30476315260_213dbcbdf3_o.jpg,0.439547581903,0.0,1.0,0.75,934,463,https://www.flickr.com/photos/hmk/30476315260,https://creativecommons.org/licenses/by/2.0/,H. Michael Karshis,https://www.flickr.com/people/hmk/\nb3f200c672c5ca4f,https://c1.staticflickr.com/8/7539/28925572132_ff6fc934e0_o.jpg,0.0,0.25,0.5,1.0,976,275,https://www.flickr.com/photos/gabrielgm/28925572132/,https://creativecommons.org/licenses/by/2.0/,Gabriel Garcia Marengo,https://www.flickr.com/people/gabrielgm/\n3f40eba168e5d385,https://c1.staticflickr.com/6/5717/31106619226_f60452e9f2_o.jpg,0.299878836834,0.0,0.899636510501,0.75,515,936,https://www.flickr.com/photos/85546319@N04/31106619226,https://creativecommons.org/licenses/by/2.0/,Robert  Sheie,https://www.flickr.com/people/85546319@N04/\n0e71473957df4793,https://c1.staticflickr.com/1/630/31560462464_df68f43299_o.jpg,0.502573529412,0.0,1.0,0.75,878,348,https://www.flickr.com/photos/agenciabrasilia/31560462464,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n6c9f8901246faff2,https://c1.staticflickr.com/1/745/31509879035_78978e4f01_o.jpg,0.0,0.0,0.70820668693,1.0,629,689,https://www.flickr.com/photos/guldem/31509879035,https://creativecommons.org/licenses/by/2.0/,G\\303\\274ldem \\303\\234st\\303\\274n,https://www.flickr.com/people/guldem/\na64ae1acd9d09a87,https://c1.staticflickr.com/1/717/31077768123_e0787a8de6_o.jpg,0.0,0.0,1.0,1.0,131,83,http://www.flickr.com/photos/paul_e_balfe/31077768123/,https://creativecommons.org/licenses/by/2.0/,Paul Balfe,https://www.flickr.com/people/paul_e_balfe/\n05f7c084329ff0c6,https://c1.staticflickr.com/6/5513/30518437054_80b12bbda5_o.jpg,0.5,0.25,1.0,1.0,973,910,https://flickr.com/14247646@N00/30518437054,https://creativecommons.org/licenses/by/2.0/,James,https://www.flickr.com/people/jametiks/\n5d77597361d06d2b,https://c1.staticflickr.com/1/478/31414603844_530a364312_o.jpg,0.0,0.0,1.0,0.714503816794,904,92,https://www.flickr.com/photos/avedaphotos/31414603844/,https://creativecommons.org/licenses/by/2.0/,Aveda Corporation,https://www.flickr.com/people/avedaphotos/\nac2a8a4777dbe746,https://c1.staticflickr.com/8/7615/27545901420_caafb85d83_o.jpg,0.0,0.0,0.499263622975,0.75,896,46,https://www.flickr.com/photos/621crw/27545901420,https://creativecommons.org/licenses/by/2.0/,The 621st Contingency Response Wing,https://www.flickr.com/people/621crw/\n3d75d9676ad6361c,https://c1.staticflickr.com/6/5589/30796308216_2ba813235e_o.jpg,0.0,0.0,0.601941747573,0.75,151,517,https://www.flickr.com/photos/pandora_6666/30796308216,https://creativecommons.org/licenses/by/2.0/,Jo Naylor,https://www.flickr.com/people/pandora_6666/\ne3a740861f12f49e,https://c1.staticflickr.com/9/8453/29471934070_b712c35d65_o.jpg,0.21087398374,0.0,0.63262195122,0.75,820,900,https://www.flickr.com/photos/ceta_und_ttip_stoppen/29471934070/,https://creativecommons.org/licenses/by/2.0/,CETA und TTIP stoppen,https://www.flickr.com/people/ceta_und_ttip_stoppen/\n64577d3916d6dafb,https://c1.staticflickr.com/8/7774/26695019922_97087ac2c0_o.jpg,0.25,0.0,1.0,0.5625,606,754,https://www.flickr.com/photos/afropicmusing/26695019922,https://creativecommons.org/licenses/by/2.0/,afromusing,https://www.flickr.com/people/afropicmusing/\n3b32eca218ed3dbe,https://c1.staticflickr.com/8/7341/28021300931_378cfe5932_o.jpg,0.0,0.0,0.490510948905,0.75,742,838,https://www.flickr.com/photos/jdlasica/28021300931,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\n0707f3dfb7c29f5c,https://c1.staticflickr.com/6/5700/30555623662_42d83db0d3_o.jpg,0.0,0.25,0.498159057437,1.0,606,740,https://www.flickr.com/photos/145304628@N02/30555623662,https://creativecommons.org/licenses/by/2.0/,Degree53 UK,https://www.flickr.com/people/145304628@N02/\n59e9bdbb7a3fc4ba,https://c1.staticflickr.com/9/8533/30011107125_37837842a9_o.jpg,0.0,0.0,1.0,0.666666666667,518,407,https://www.flickr.com/photos/zigazou76/30011107125,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n686ea4ec999364ff,https://c1.staticflickr.com/8/7319/27523198984_f9d44bba3a_o.jpg,0.0,0.28125,0.75,0.84375,459,554,https://www.flickr.com/photos/nostri-imago/27523198984,https://creativecommons.org/licenses/by/2.0/,Cliff,https://www.flickr.com/people/nostri-imago/\ncb71a056a8e05bb2,https://c1.staticflickr.com/9/8001/29254381704_cc81ff8df9_o.jpg,0.0,0.0,0.56338028169,0.75,320,941,https://flickr.com/9243304@N04/29254381704,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/\nf63d58b5af16091f,https://c1.staticflickr.com/1/681/32382788261_b7554c250b_o.jpg,0.0,0.0,1.0,0.732612055641,716,420,https://www.flickr.com/photos/jlcernadas/32382788261/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\nd3aa8ee50458c020,https://c1.staticflickr.com/1/444/32463408492_cf7ab6f5fb_o.jpg,0.0,0.0,0.75,0.630794701987,431,874,https://www.flickr.com/photos/viumariners/32463408492/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/\n2891f4aa2279d369,https://c1.staticflickr.com/9/8658/28224525812_7301285f51_o.jpg,0.5,0.0,1.0,0.75,471,405,https://www.flickr.com/photos/rorals/28224525812,https://creativecommons.org/licenses/by/2.0/,Rory,https://www.flickr.com/people/rorals/\nae24c23192976a40,https://c1.staticflickr.com/6/5811/31350835411_b856c2e0f7_o.jpg,0.0,0.0,0.498159057437,0.75,752,888,https://www.flickr.com/photos/davehamster/31350835411,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n348ac56def3ccd35,https://c1.staticflickr.com/9/8601/30053184852_b6c871293b_o.jpg,0.331617647059,0.0,0.994852941176,1.0,916,533,https://www.flickr.com/photos/alpesdehauteprovence-tourisme/30053184852,https://creativecommons.org/licenses/by/2.0/,ADT 04,https://www.flickr.com/people/alpesdehauteprovence-tourisme/\nd46216d31908163e,https://c1.staticflickr.com/9/8723/28309396545_349e5147bb_o.jpg,0.333333333333,0.0,1.0,1.0,896,785,https://www.flickr.com/photos/ronmacphotos/28309396545,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\na8dd9ba15f7b817b,https://c1.staticflickr.com/1/575/31572326940_d87b136e59_o.jpg,0.251849112426,0.25,0.755547337278,1.0,806,740,https://www.flickr.com/photos/prefeituradeolinda/31572326940,https://creativecommons.org/licenses/by/2.0/,Prefeitura de Olinda,https://www.flickr.com/people/prefeituradeolinda/\n5224fec9ba33b50d,https://c1.staticflickr.com/9/8081/29568549431_86f962156e_o.jpg,0.0,0.0,0.75,1.0,604,532,https://flickr.com/28834651@N07/29568549431,https://creativecommons.org/licenses/by/2.0/,Aul Rah,https://www.flickr.com/people/28834651@N07/\nb3c384a2d1a391c0,https://c1.staticflickr.com/6/5543/30815777131_13d5e7667c_o.jpg,0.0,0.0,0.599757673667,0.75,631,456,https://www.flickr.com/photos/85546319@N04/30815777131,https://creativecommons.org/licenses/by/2.0/,Robert  Sheie,https://www.flickr.com/people/85546319@N04/\n4a1a488e8a975f7c,https://c1.staticflickr.com/9/8420/29353940465_05ece9b92e_o.jpg,0.25,0.25,0.75,1.0,920,833,https://www.flickr.com/photos/harshlight/29353940465,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\nd7c1d1632cf0acc7,https://c1.staticflickr.com/9/8653/28465398416_2c4202cb8d_o.jpg,0.25,0.0,0.75,0.75,404,873,https://www.flickr.com/photos/usnavy/28465398416,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\nca50e3535eb6396c,https://c1.staticflickr.com/6/5527/29526798504_12061e1707_o.jpg,0.0,0.0,0.5,0.75,556,929,https://flickr.com/137837832@N07/29526798504,https://creativecommons.org/licenses/by/2.0/,Mark Holloway,https://www.flickr.com/people/137837832@N07/\n30e132285c2e960f,https://c1.staticflickr.com/6/5663/30553419670_2249584a31_o.jpg,0.25,0.0,1.0,1.0,912,427,https://www.flickr.com/photos/jonathanrolande/30553419670,https://creativecommons.org/licenses/by/2.0/,Jonathan Rolande,https://www.flickr.com/people/jonathanrolande/\nea65c0ff71e7ceb3,https://c1.staticflickr.com/4/3953/33320124506_2fbd93baa7_o.jpg,0.333333333333,0.0,1.0,1.0,404,737,https://www.flickr.com/photos/usnavy/33320124506,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n200285e90078210b,https://c1.staticflickr.com/1/701/30876765453_574a6815b0_o.jpg,0.5,0.25,1.0,1.0,442,741,https://flickr.com/22539273@N00/30876765453,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\ncec46dbd1fa3473a,https://c1.staticflickr.com/9/8320/29351169445_b0b0090587_o.jpg,0.455696202532,0.25,0.911392405063,1.0,898,246,https://www.flickr.com/photos/lge/29351169445,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n6314b953a2f66e36,https://c1.staticflickr.com/1/306/31686321825_ef08b80af5_o.jpg,0.281690140845,0.25,0.845070422535,1.0,311,774,https://www.flickr.com/photos/treegrow/31686321825,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n1f3f949ccbc81c93,https://c1.staticflickr.com/9/8643/28179475136_e6925b8a4b_o.jpg,0.0,0.25,1.0,1.0,304,666,https://flickr.com/27305106@N06/28179475136,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\n04546cc5e537d7cd,https://c1.staticflickr.com/8/7347/27291550531_ee40bdf58a_o.jpg,0.0,0.0,0.495594713656,0.75,426,649,https://www.flickr.com/photos/kansasscanner/27291550531/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\n73064ceb466612d5,https://c1.staticflickr.com/6/5777/30172206492_407d68dc21_o.jpg,0.53125,0.0,1.0,0.75,719,673,https://flickr.com/97760755@N08/30172206492,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard,https://www.flickr.com/people/viaggioroutard/\nae78688b32986638,https://c1.staticflickr.com/9/8290/29399680281_1b2c136428_o.jpg,0.0,0.0,0.5,0.75,913,879,https://www.flickr.com/photos/ddebold/29399680281/,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/\n72d85232abd98067,https://c1.staticflickr.com/8/7655/28880045512_841b0c2d3a_o.jpg,0.25,0.0,0.75,0.75,471,599,https://www.flickr.com/photos/quinet/28880045512,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n89d8361c6bfe905c,https://c1.staticflickr.com/8/7290/27369075485_5c164b1839_o.jpg,0.25,0.0,0.75,0.75,604,51,https://www.flickr.com/photos/quinet/27369075485,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n4ca02fd28a5e9703,https://c1.staticflickr.com/9/8453/29423857932_71a8a4a98f_o.jpg,0.25,0.302066450567,1.0,0.906199351702,996,239,https://www.flickr.com/photos/92252798@N07/29423857932,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/\n48762c2cd2ed47e1,https://c1.staticflickr.com/6/5546/30817355150_7f1f77f6e2_o.jpg,0.25,0.0,1.0,0.75,755,308,https://www.flickr.com/photos/hmk/30817355150,https://creativecommons.org/licenses/by/2.0/,H. Michael Karshis,https://www.flickr.com/people/hmk/\nb217644382dcd864,https://c1.staticflickr.com/9/8082/29684292096_85e6a733cf_o.jpg,0.182707993475,0.0,1.0,1.0,512,708,https://www.flickr.com/photos/atoach/29684292096,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\nc4824f023903731a,https://c1.staticflickr.com/8/7777/26400069864_79fd47a2fe_o.jpg,0.25,0.25,1.0,1.0,738,817,https://www.flickr.com/photos/betsyweber/26400069864,https://creativecommons.org/licenses/by/2.0/,Betsy Weber,https://www.flickr.com/people/betsyweber/\n629138193e021cdf,https://c1.staticflickr.com/9/8768/28328433276_2d2146df81_o.jpg,0.0,0.5,0.75,1.0,885,739,https://www.flickr.com/photos/glenbowman/28328433276,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/\n7d4186ce0332245d,https://c1.staticflickr.com/9/8578/28958405495_50b6230377_o.jpg,0.0,0.0,0.666666666667,1.0,976,936,https://www.flickr.com/photos/o_0/28958405495,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n90dfd75887f3e67b,https://c1.staticflickr.com/8/7683/26182602974_ddb15b42a7_o.jpg,0.0,0.25,1.0,1.0,986,45,https://www.flickr.com/photos/110035327@N08/26182602974,https://creativecommons.org/licenses/by/2.0/,Stefano Akram,https://www.flickr.com/people/110035327@N08/\ned56c7616a8ac010,https://c1.staticflickr.com/8/7479/27427361256_e341e77ffe_o.jpg,0.267938931298,0.0,0.803816793893,0.75,782,568,https://www.flickr.com/photos/aperturenut/27427361256,https://creativecommons.org/licenses/by/2.0/,Rick Briggs,https://www.flickr.com/people/aperturenut/\n5d6b9cadb6f9e1cd,https://c1.staticflickr.com/9/8790/28885989621_1e024392cc_o.jpg,0.0,0.0,0.5,0.75,896,746,https://www.flickr.com/photos/elsie/28885989621/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\na033832d9ff8913b,https://c1.staticflickr.com/1/545/32710656176_55231d6054_o.jpg,0.0,0.0,0.713414634146,1.0,101,357,https://www.flickr.com/photos/wildreturn/32710656176/,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\n313ff0037b86260a,https://c1.staticflickr.com/6/5812/30890228762_9ffa0a8fcb_o.jpg,0.0,0.2515625,1.0,1.0,498,610,https://www.flickr.com/photos/southbeachcars/30890228762/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\nafe045d68f1a60d0,https://c1.staticflickr.com/6/5496/30030140344_d59046fc37_o.jpg,0.281690140845,0.0,0.845070422535,0.75,990,956,https://flickr.com/72054607@N00/30030140344,https://creativecommons.org/licenses/by/2.0/,Mark Jones,https://www.flickr.com/people/mekonsrevenge/\nb19e2df06dbcccd9,https://c1.staticflickr.com/8/7511/27829151505_2172064741_o.jpg,0.421177266576,0.25,0.842354533153,1.0,673,816,https://www.flickr.com/photos/flickbergers/27829151505/,https://creativecommons.org/licenses/by/2.0/,Tim Berger,https://www.flickr.com/people/flickbergers/\n510e5062fef4a993,https://c1.staticflickr.com/6/5822/30267535413_2a7544b60d_o.jpg,0.0,0.0,0.599757673667,0.75,631,293,https://www.flickr.com/photos/85546319@N04/30267535413/,https://creativecommons.org/licenses/by/2.0/,Robert  Sheie,https://www.flickr.com/people/85546319@N04/\n943274babd06a662,https://c1.staticflickr.com/1/327/32913036916_44339626f4_o.jpg,0.28125,0.0,0.84375,0.75,669,678,https://www.flickr.com/photos/davidstanleytravel/32913036916,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n0e83f990a04ed67d,https://c1.staticflickr.com/8/7788/28316840171_4f69657675_o.jpg,0.0,0.0,0.642547033285,1.0,822,52,https://www.flickr.com/photos/newsoresund/28316840171,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/\n607702d7ef44d081,https://c1.staticflickr.com/9/8233/29529503870_9d1063daa4_o.jpg,0.28125,0.0,0.84375,0.75,865,347,https://www.flickr.com/photos/zombieite/29529503870,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/\ne9811aebe8bed6e5,https://c1.staticflickr.com/9/8738/27986089450_329b7a8ebc_o.jpg,0.4375,0.0,1.0,0.75,336,410,https://www.flickr.com/photos/peter-trimming/27986089450,https://creativecommons.org/licenses/by/2.0/,Peter Trimming,https://www.flickr.com/people/peter-trimming/\n380053c506e32105,https://c1.staticflickr.com/8/7396/27441608895_889e301b2b_o.jpg,0.0,0.25,0.5625,1.0,780,514,https://www.flickr.com/photos/thoseguys119/27441608895,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n668bc83a884d24f9,https://c1.staticflickr.com/6/5448/30684271290_40fd020a51_o.jpg,0.0,0.0,0.728813559322,1.0,3,391,https://flickr.com/64084569@N02/30684271290,https://creativecommons.org/licenses/by/2.0/,Singa Hitam,https://www.flickr.com/people/64084569@N02/\nbe9a3bea2989a0b4,https://c1.staticflickr.com/6/5724/30572182090_20ab46d2fb_o.jpg,0.25,0.0,0.75,0.75,718,677,https://www.flickr.com/photos/42220226@N07/30572182090,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\nb74c05ecff5f99d8,https://c1.staticflickr.com/9/8403/29162412302_d1940244a9_o.jpg,0.0,0.0,0.75,0.565438871473,407,568,https://www.flickr.com/photos/eltb/29162412302,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n7a51c260ca0e83e7,https://c1.staticflickr.com/4/3912/33185518846_5c9ca0ff3a_o.jpg,0.4375,0.0,1.0,0.75,548,748,https://www.flickr.com/photos/belurashok/33185518846/,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/\ne89d48768917f563,https://c1.staticflickr.com/9/8043/29272187281_a1bf8985b6_o.jpg,0.43779342723,0.0,1.0,0.75,459,308,https://www.flickr.com/photos/rheba/29272187281/,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/\n080bec22a6b1d37d,https://c1.staticflickr.com/8/7787/27498389575_2f7553fca7_o.jpg,0.322236180905,0.0,0.966708542714,0.75,760,818,https://www.flickr.com/photos/51764518@N02/27498389575,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\ne37b556e8889d2ec,https://c1.staticflickr.com/6/5679/30117494085_f273295290_o.jpg,0.301659125189,0.0,1.0,1.0,752,618,https://www.flickr.com/photos/karen_roe/30117494085,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/\n67dd47336dc89421,https://c1.staticflickr.com/8/7566/26809054634_395b8c8989_o.jpg,0.0,0.0,0.5,0.75,818,949,https://www.flickr.com/photos/curtsm/26809054634/,https://creativecommons.org/licenses/by/2.0/,Curt Smith,https://www.flickr.com/people/curtsm/\n25f85aadcf248cc1,https://c1.staticflickr.com/6/5503/30178488442_471bae40e3_o.jpg,0.25,0.0,0.75,0.75,854,890,https://www.flickr.com/photos/tanaka_juuyoh/30178488442,https://creativecommons.org/licenses/by/2.0/,TANAKA Juuyoh (\\347\\224\\260\\344\\270\\255\\345\\215\\201\\346\\264\\213),https://www.flickr.com/people/tanaka_juuyoh/\nc3e9a84e039df3ce,https://c1.staticflickr.com/9/8538/29956439481_7289ba54cc_o.jpg,0.25,0.0,1.0,1.0,469,765,https://www.flickr.com/photos/27665395@N05/29956439481,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n0134ba03294509a1,https://c1.staticflickr.com/9/8489/29195271540_316f8c5315_o.jpg,0.25,0.0,0.75,0.75,982,355,https://www.flickr.com/photos/mindahaas/29195271540/,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/\n53fe22426ff21243,https://c1.staticflickr.com/1/626/31511641894_19a2e1d2aa_o.jpg,0.496696035242,0.0,0.993392070485,0.75,536,779,https://www.flickr.com/photos/glorycycles/31511641894,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n4053a6a3d0e63c01,https://c1.staticflickr.com/1/561/32656096985_6601815751_o.jpg,0.0,0.0,0.5625,0.75,392,460,https://www.flickr.com/photos/kjfnjy/32656096985/,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/\n3ece3c1f94e4141a,https://c1.staticflickr.com/1/484/31819662813_17ab59d903_o.jpg,0.42234548336,0.25,1.0,1.0,332,15,https://www.flickr.com/photos/usfwsmtnprairie/31819662813,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n7d253f78ef6f029a,https://c1.staticflickr.com/6/5488/29967850914_d7e94fa9f2_o.jpg,0.0,0.0,1.0,1.0,683,92,https://flickr.com/23562593@N07/29967850914,https://creativecommons.org/licenses/by/2.0/,Benjamin Wunn,https://www.flickr.com/people/derzw3rg/\nfecd59b8de8ae6f7,https://c1.staticflickr.com/1/475/31566723602_ced86113ef_o.jpg,0.25,0.25,0.75,1.0,820,793,https://www.flickr.com/photos/stevendepolo/31566723602/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n24159caf9c5e92be,https://c1.staticflickr.com/1/471/30661449994_6c0d5f9050_o.jpg,0.5,0.0,1.0,0.75,708,743,https://www.flickr.com/photos/146625745@N08/30661449994,https://creativecommons.org/licenses/by/2.0/,home thods,https://www.flickr.com/people/146625745@N08/\n44982b98ba192bb7,https://c1.staticflickr.com/9/8301/28642395174_40ebd0c8df_o.jpg,0.25,0.0,0.75,0.75,322,411,https://www.flickr.com/photos/wm_archiv/28642395174/,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/\n7ca714cdcd5d36d9,https://c1.staticflickr.com/8/7400/27242157102_b9cb18ffa1_o.jpg,0.0,0.0,0.5625,0.75,780,106,https://www.flickr.com/photos/thoseguys119/27242157102,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\ncbaff3255afbe83f,https://c1.staticflickr.com/9/8118/29896215326_352a9625cf_o.jpg,0.0,0.25,0.670648464164,1.0,561,853,https://www.flickr.com/photos/dirkhansen/29896215326,https://creativecommons.org/licenses/by/2.0/,SD Dirk,https://www.flickr.com/people/dirkhansen/\nfafbad0b3093a886,https://c1.staticflickr.com/9/8699/27967786060_8e927f96b6_o.jpg,0.287776898734,0.25,0.863330696203,1.0,672,315,https://www.flickr.com/photos/glorycycles/27967786060,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n45315ea51da415ab,https://c1.staticflickr.com/9/8855/27598466234_c924d2bdfc_o.jpg,0.25,0.25,0.75,1.0,356,189,https://www.flickr.com/photos/o_0/27598466234,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n1e4bb9fd37654da6,https://c1.staticflickr.com/9/8270/29189744532_98cb04acea_o.jpg,0.25,0.25,1.0,0.75,820,538,https://www.flickr.com/photos/tim_uk/29189744532,https://creativecommons.org/licenses/by/2.0/,Tim Sheerman-Chase,https://www.flickr.com/people/tim_uk/\n5f3ea3c6b683fb57,https://c1.staticflickr.com/1/780/32585346961_4f8e8d97e3_o.jpg,0.5,0.0,1.0,0.75,773,62,https://flickr.com/28752865@N08/32585346961,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/\nccbcaf10176e78e0,https://c1.staticflickr.com/9/8397/27954967983_925cdd6886_o.jpg,0.0,0.0,0.5,0.75,923,858,https://www.flickr.com/photos/alan-light/27954967983,https://creativecommons.org/licenses/by/2.0/,Alan Light,https://www.flickr.com/people/alan-light/\n8d17aa69b4fd7b45,https://c1.staticflickr.com/6/5664/29822954894_e605bf0229_o.jpg,0.0,0.0,0.666666666667,1.0,407,590,https://www.flickr.com/photos/quinet/29822954894,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nc25da85d5d62b000,https://c1.staticflickr.com/8/7322/27388042450_19773a1bc9_o.jpg,0.0,0.25,0.5,1.0,404,219,https://www.flickr.com/photos/usnavy/27388042450,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\nbeb3e55c385feb12,https://c1.staticflickr.com/9/8817/28251101564_5f9eb85574_o.jpg,0.17748447205,0.25,0.532453416149,1.0,815,881,https://www.flickr.com/photos/watts_photos/28251101564,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/\ned3573d0c197fbaf,https://c1.staticflickr.com/9/8337/28698753904_d31322462d_o.jpg,0.498159057437,0.25,0.996318114875,1.0,848,190,https://www.flickr.com/photos/exercitobrasileiro/28698753904,https://creativecommons.org/licenses/by/2.0/,Ex\\303\\251rcito Brasileiro,https://www.flickr.com/people/exercitobrasileiro/\n95d1a6be6786190f,https://c1.staticflickr.com/6/5580/31026020991_dbbbedc4f6_o.jpg,0.5,0.25,1.0,1.0,891,983,https://www.flickr.com/photos/swisstchoukball/31026020991/,https://creativecommons.org/licenses/by/2.0/,Swiss Tchoukball,https://www.flickr.com/people/swisstchoukball/\nc8abefc975e94b10,https://c1.staticflickr.com/8/7451/27275536125_1b48f36807_o.jpg,0.0,0.0,0.56338028169,0.75,875,675,https://www.flickr.com/photos/southbeachcars/27275536125,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\nbe97d1e63c32043e,https://c1.staticflickr.com/9/8268/29636815873_a756a0aaec_o.jpg,0.0,0.25,0.670648464164,1.0,95,230,https://www.flickr.com/photos/sucriertt/29636815873/,https://creativecommons.org/licenses/by/2.0/,Feroze Omardeen,https://www.flickr.com/people/sucriertt/\ndf2cd1b82d5dec14,https://c1.staticflickr.com/6/5499/31112840340_73557ca884_o.jpg,0.5,0.25,1.0,1.0,519,414,https://www.flickr.com/photos/box_repsol/31112840340,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n024f73e53c3c1f1d,https://c1.staticflickr.com/8/7784/27062661262_9732ff0e24_o.jpg,0.333333333333,0.0,1.0,1.0,580,638,https://www.flickr.com/photos/dalbera/27062661262,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\ne957c417fcd20c5b,https://c1.staticflickr.com/6/5728/31046143176_16800f95c8_o.jpg,0.199868073879,0.25,0.599604221636,1.0,820,791,https://www.flickr.com/photos/usembassyta/31046143176/,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tel Aviv,https://www.flickr.com/people/usembassyta/\n795f5aef9bef8134,https://c1.staticflickr.com/8/7246/27059914000_5331c7a27c_o.jpg,0.231382978723,0.25,0.69414893617,1.0,826,29,https://www.flickr.com/photos/sanp/27059914000,https://creativecommons.org/licenses/by/2.0/,San P,https://www.flickr.com/people/sanp/\n422d08407aeed1be,https://c1.staticflickr.com/9/8891/28070937640_a79a8cbfa5_o.jpg,0.4375,0.0,1.0,0.75,114,44,https://www.flickr.com/photos/yutakaseki/28070937640,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/\n69a39406cb1d2ce5,https://c1.staticflickr.com/8/7179/27561675775_4977abbb7b_o.jpg,0.0,0.25,0.75,1.0,476,46,https://www.flickr.com/photos/44156646@N06/27561675775,https://creativecommons.org/licenses/by/2.0/,Frederick Lang Jr.,https://www.flickr.com/people/44156646@N06/\n564de663adeb8cd5,https://c1.staticflickr.com/8/7207/27043384543_1ee00dc2e1_o.jpg,0.494868035191,0.0,0.989736070381,0.75,558,133,https://www.flickr.com/photos/governortomwolf/27043384543,https://creativecommons.org/licenses/by/2.0/,Governor Tom Wolf,https://www.flickr.com/people/governortomwolf/\n04c1bde5affb7b5b,https://c1.staticflickr.com/1/473/31566239624_128d26f762_o.jpg,0.285496183206,0.0,1.0,1.0,653,680,https://www.flickr.com/photos/rdecom/31566239624,https://creativecommons.org/licenses/by/2.0/,U.S. Army RDECOM,https://www.flickr.com/people/rdecom/\n90f5385a77a49f77,https://c1.staticflickr.com/8/7393/26525400000_f5d0ae4309_o.jpg,0.248713235294,0.25,0.746139705882,1.0,704,905,https://www.flickr.com/photos/panr/26525400000,https://creativecommons.org/licenses/by/2.0/,Robert Cutts,https://www.flickr.com/people/panr/\n604b54a3b7424d9b,https://c1.staticflickr.com/9/8358/29207069984_4f7b859b65_o.jpg,0.0,0.25,0.501846381093,1.0,939,430,https://flickr.com/25797459@N06/29207069984,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/\na6535c039bfeba2c,https://c1.staticflickr.com/1/737/32082026800_fdf44c3c27_o.jpg,0.0,0.0,0.561328125,0.75,536,292,https://www.flickr.com/photos/glorycycles/32082026800,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n35d67f3f70aeef92,https://c1.staticflickr.com/8/7324/28047778902_e23628dc50_o.jpg,0.25,0.25,0.75,1.0,980,582,https://www.flickr.com/photos/coreyheitzmd/28047778902,https://creativecommons.org/licenses/by/2.0/,CHeitz,https://www.flickr.com/people/coreyheitzmd/\n3efa3df701898afd,https://c1.staticflickr.com/9/8783/28492814412_129982444e_o.jpg,0.0,0.0,0.905498281787,1.0,737,1000,https://www.flickr.com/photos/stevendepolo/28492814412,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nf08f34c258228251,https://c1.staticflickr.com/9/8256/28174054160_790b304fc4_o.jpg,0.28125,0.25,0.84375,1.0,699,608,https://www.flickr.com/photos/rubenholthuijsen/28174054160/,https://creativecommons.org/licenses/by/2.0/,Ruben Holthuijsen,https://www.flickr.com/people/rubenholthuijsen/\nd47c9aabecda0e12,https://c1.staticflickr.com/8/7441/27270121096_cc1007eb2f_o.jpg,0.5,0.0,1.0,0.75,986,199,https://www.flickr.com/photos/56218409@N03/27270121096,https://creativecommons.org/licenses/by/2.0/,Matthias Ripp,https://www.flickr.com/people/56218409@N03/\nd97c1f3f1c211d1a,https://c1.staticflickr.com/9/8448/28945025323_6e7cdf207a_o.jpg,0.0,0.0,0.75,0.75,979,467,https://www.flickr.com/photos/edans/28945025323,https://creativecommons.org/licenses/by/2.0/,Enrique Dans,https://www.flickr.com/people/edans/\n62949c357e429690,https://c1.staticflickr.com/1/764/31219968184_cf7294c955_o.jpg,0.25,0.25,0.75,1.0,973,116,https://www.flickr.com/photos/jlascar/31219968184,https://creativecommons.org/licenses/by/2.0/,Jorge L\\303\\241scar,https://www.flickr.com/people/jlascar/\n9311a098cfb4b946,https://c1.staticflickr.com/8/7373/26786081873_73a09aab2f_o.jpg,0.25,0.25,0.75,1.0,821,192,https://www.flickr.com/photos/ben_salter/26786081873/,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/\n38d8d105d5e70c80,https://c1.staticflickr.com/8/7457/27675995271_5b6dc8a928_o.jpg,0.0,0.0,1.0,1.0,422,755,https://www.flickr.com/photos/arbron/27675995271,https://creativecommons.org/licenses/by/2.0/,Jeff Hitchcock,https://www.flickr.com/people/arbron/\na28beac14b9037da,https://c1.staticflickr.com/8/7408/26281652233_6667df70cb_o.jpg,0.333333333333,0.0,1.0,1.0,405,351,https://www.flickr.com/photos/km30192002/26281652233/,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/\nfa3aae44c2675e88,https://c1.staticflickr.com/9/8776/28284921904_800c76d8ac_o.jpg,0.496696035242,0.0,0.993392070485,0.75,771,375,https://www.flickr.com/photos/spera-designerschuhe/28284921904,https://creativecommons.org/licenses/by/2.0/,\"SPERA.de Designerschuhe, Taschen und Accessoires\",https://www.flickr.com/people/spera-designerschuhe/\n44aa69f642b86628,https://c1.staticflickr.com/8/7413/27678489230_1d967f5b58_o.jpg,0.0,0.0,0.634532374101,1.0,880,549,https://www.flickr.com/photos/45909111@N00/27678489230,https://creativecommons.org/licenses/by/2.0/,Gwydion M. Williams,https://www.flickr.com/people/45909111@N00/\n6cc289dc7a8fce86,https://c1.staticflickr.com/9/8671/28656397400_d4db68df02_o.jpg,0.501840942563,0.25,1.0,1.0,158,1000,https://www.flickr.com/photos/naql/28656397400,https://creativecommons.org/licenses/by/2.0/,naql,https://www.flickr.com/people/naql/\na92babc0a6436d3b,https://c1.staticflickr.com/8/7582/28982049520_eddc2d650d_o.jpg,0.0,0.25,0.5,1.0,760,655,https://www.flickr.com/photos/ulift/28982049520/in/album-72157672059230641/,https://creativecommons.org/licenses/by/2.0/,WEi WEi,https://www.flickr.com/people/ulift/\n9fbeb797de1e1639,https://c1.staticflickr.com/9/8083/29921495296_991d4559c0_o.jpg,0.42174796748,0.0,0.843495934959,0.75,763,511,https://www.flickr.com/photos/vuhung/29921495296,https://creativecommons.org/licenses/by/2.0/,Nguyen Hung Vu,https://www.flickr.com/people/vuhung/\n16179baa1513c701,https://c1.staticflickr.com/1/722/32761564425_d122c3838d_o.jpg,0.0,0.0,0.75,1.0,95,505,https://flickr.com/95098864@N08/32761564425,https://creativecommons.org/licenses/by/2.0/,S. Rohrlach,https://www.flickr.com/people/95098864@N08/\n5a8d5bc9bf40e832,https://c1.staticflickr.com/6/5692/30199498082_eba90ef2e1_o.jpg,0.0,0.0,0.666666666667,1.0,519,634,https://www.flickr.com/photos/box_repsol/30199498082,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\naa4e1cf9cb6e7801,https://c1.staticflickr.com/9/8183/29036345831_4da7d925c9_o.jpg,0.151376146789,0.25,0.454128440367,1.0,896,840,https://www.flickr.com/photos/ronmacphotos/29036345831/,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n200735f93ea764f2,https://c1.staticflickr.com/8/7582/29431396080_570340a5ef_o.jpg,0.310344827586,0.0,0.931034482759,0.75,309,285,https://www.flickr.com/photos/gails_pictures/29431396080,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n5d53f9bc389e98ad,https://c1.staticflickr.com/1/722/30784991794_6af0ab8176_o.jpg,0.25,0.25,0.75,1.0,265,468,https://www.flickr.com/photos/unirodlibrary/30784991794/,https://creativecommons.org/licenses/by/2.0/,Rod Library,https://www.flickr.com/people/unirodlibrary/\n5b974695c09ad165,https://c1.staticflickr.com/9/8453/29350958465_8426fed375_o.jpg,0.25,0.484655688623,1.0,1.0,991,393,https://www.flickr.com/photos/clairity/29350958465/,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\nbecf3b004177ded6,https://c1.staticflickr.com/8/7565/28346247573_c430ef5720_o.jpg,0.193181818182,0.0,1.0,1.0,986,457,https://www.flickr.com/photos/34905030@N00/28346247573/,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/\n4f04ca75d7aafc0a,https://c1.staticflickr.com/8/7126/27594041042_ef94e651db_o.jpg,0.25,0.249631811487,1.0,0.748895434462,840,633,https://www.flickr.com/photos/girlguidesofcan/27594041042/,https://creativecommons.org/licenses/by/2.0/,Girl Guides of Canada,https://www.flickr.com/people/girlguidesofcan/\n8764eecf6e898c7f,https://c1.staticflickr.com/8/7393/27564047580_b1667768cf_o.jpg,0.337738619677,0.0,1.0,1.0,484,711,https://www.flickr.com/photos/sybarite48/27564047580,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nc5f5e09f4f5fd41a,https://c1.staticflickr.com/9/8134/28977820041_e39c5c15c4_o.jpg,0.559602649007,0.25,0.83940397351,1.0,404,421,https://flickr.com/7489441@N06/28977820041,https://creativecommons.org/licenses/by/2.0/,Clemens Vasters,https://www.flickr.com/people/clemensv/\n17f3b8a057bc01be,https://c1.staticflickr.com/8/7537/28104131410_e13ab8f9ef_o.jpg,0.0,0.0,1.0,1.0,859,575,https://www.flickr.com/photos/v1ctor/28104131410,https://creativecommons.org/licenses/by/2.0/,Victor,https://www.flickr.com/people/v1ctor/\nc10f6e0689efbc1c,https://c1.staticflickr.com/1/258/32241427822_ac7330299e_o.jpg,0.278188180404,0.25,0.834564541213,1.0,888,297,https://www.flickr.com/photos/guldem/32241427822,https://creativecommons.org/licenses/by/2.0/,G\\303\\274ldem \\303\\234st\\303\\274n,https://www.flickr.com/people/guldem/\n0e9bdc3ab80b1a71,https://c1.staticflickr.com/8/7415/27313160706_a2440a83b0_o.jpg,0.5,0.0,1.0,0.75,367,335,https://www.flickr.com/photos/ross_elliott/27313160706,https://creativecommons.org/licenses/by/2.0/,Ross Elliott,https://www.flickr.com/people/ross_elliott/\nc17d39b1eba4cc03,https://c1.staticflickr.com/8/7468/27818709730_d10459c415_o.jpg,0.0,0.5,0.75,1.0,669,732,https://www.flickr.com/photos/jdlasica/27818709730,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\nec346009f286ffca,https://c1.staticflickr.com/1/571/30740221514_3c4fa602a0_o.jpg,0.0,0.0,0.5,0.75,120,783,https://www.flickr.com/photos/conchur/30740221514/,https://creativecommons.org/licenses/by/2.0/,Conor Lawless,https://www.flickr.com/people/conchur/\n01fa4be27dd11b5d,https://c1.staticflickr.com/1/268/31600495093_a46c0835d2_o.jpg,0.4375,0.0,1.0,0.75,451,829,https://www.flickr.com/photos/ufv/31600495093/,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/\n490df9e021386d29,https://c1.staticflickr.com/6/5800/30150475824_b342db70fa_o.jpg,0.150773195876,0.0,0.452319587629,0.75,405,351,https://flickr.com/37804979@N00/30150475824,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n08fbf75e60a6efb7,https://c1.staticflickr.com/9/8270/29799045164_ab072918cb_o.jpg,0.0,0.0,0.662261380323,1.0,484,666,https://www.flickr.com/photos/sybarite48/29799045164,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nfc583c08026e3d74,https://c1.staticflickr.com/6/5595/30252932446_a7c00f3a97_o.jpg,0.333333333333,0.0,1.0,1.0,881,588,https://www.flickr.com/photos/mobikefed/30252932446,https://creativecommons.org/licenses/by/2.0/,MoBikeFed,https://www.flickr.com/people/mobikefed/\ndb6c6671a6924eba,https://c1.staticflickr.com/9/8269/30416458805_dc9a3ef437_o.jpg,0.25,0.0,1.0,0.591346153846,407,412,https://www.flickr.com/photos/eltb/30416458805,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n5a6439b10c1f6761,https://c1.staticflickr.com/6/5703/29661528724_1ccb11fae8_o.jpg,0.0,0.25,0.561328125,1.0,320,871,https://flickr.com/86548370@N00/29661528724,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n218e02b6cfa0466e,https://c1.staticflickr.com/1/702/32609631415_d7bf443a2c_o.jpg,0.5,0.25,1.0,1.0,699,217,https://www.flickr.com/photos/renaissancechambara/32609631415/,https://creativecommons.org/licenses/by/2.0/,Ged Carroll,https://www.flickr.com/people/renaissancechambara/\n3f8bf287f20333eb,https://c1.staticflickr.com/9/8895/29333257946_c53911b432_o.jpg,0.0,0.0,0.5,0.75,973,713,https://www.flickr.com/photos/aschaf/29333257946/,https://creativecommons.org/licenses/by/2.0/,Andrea Schaffer,https://www.flickr.com/people/aschaf/\nbe5543dc68f0b970,https://c1.staticflickr.com/6/5835/30148396554_e2ec6fbf0d_o.jpg,0.441600678733,0.0,0.736001131222,0.75,780,636,https://www.flickr.com/photos/thoseguys119/30148396554,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n87fcc5f70673d3d2,https://c1.staticflickr.com/8/7455/27040942130_44a032d0fd_o.jpg,0.421177266576,0.0,0.842354533153,0.75,699,159,https://www.flickr.com/photos/nat507/27040942130,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/\n99f175132cd1c6e2,https://c1.staticflickr.com/8/7045/27716560671_79806e498e_o.jpg,0.25,0.0,1.0,0.75,934,459,https://www.flickr.com/photos/danielchownet/27716560671,https://creativecommons.org/licenses/by/2.0/,Daniel Chow,https://www.flickr.com/people/danielchownet/\na4f718e554dd18dd,https://c1.staticflickr.com/6/5445/29774026800_5e37689427_o.jpg,0.5,0.25,1.0,1.0,976,95,https://www.flickr.com/photos/wm_archiv/29774026800,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/\n46a489dcff5471a4,https://c1.staticflickr.com/3/2634/32267074504_a395babafd_o.jpg,0.0,0.0,0.75,0.75,920,590,https://www.flickr.com/photos/83015819@N00/32267074504/,https://creativecommons.org/licenses/by/2.0/,Jon Worth,https://www.flickr.com/people/83015819@N00/\n38c6124f40b8d845,https://c1.staticflickr.com/8/7589/27543292150_7375ef6b66_o.jpg,0.249631811487,0.0,0.748895434462,0.75,896,19,https://www.flickr.com/photos/ministreiodadefesa/27543292150/,https://creativecommons.org/licenses/by/2.0/,Minist\\303\\251rio da Defesa,https://www.flickr.com/people/ministreiodadefesa/\n6740e1e89b5bbab4,https://c1.staticflickr.com/1/439/32456945576_0d93348b0e_o.jpg,0.25,0.25,0.75,1.0,981,685,https://www.flickr.com/photos/30478819@N08/32456945576,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n54ff02d9dfbf8540,https://c1.staticflickr.com/6/5703/30663546512_038de017f8_o.jpg,0.249079528719,0.0,0.747238586156,0.75,884,370,https://www.flickr.com/photos/reliv/30663546512/,https://creativecommons.org/licenses/by/2.0/,Reliv International,https://www.flickr.com/people/reliv/\n2c9398f44d099e0f,https://c1.staticflickr.com/3/2051/32840993165_29d0cb8a1e_o.jpg,0.0,0.0,1.0,0.75,522,482,http://www.flickr.com/photos/23119666@N03/32840993165/,https://creativecommons.org/licenses/by/2.0/,Mark Bonica,https://www.flickr.com/people/23119666@N03/\n6896a8b78f404dc8,https://c1.staticflickr.com/9/8358/29790317621_d6a35e5136_o.jpg,0.4375,0.25,1.0,1.0,980,75,https://www.flickr.com/photos/kameyama-mie/29790317621,https://creativecommons.org/licenses/by/2.0/,Kasadera,https://www.flickr.com/people/kameyama-mie/\nd2d6ae6e0b8a0c31,https://c1.staticflickr.com/6/5600/30243986500_e184ef72fb_o.jpg,0.0,0.0,0.5,0.75,986,601,https://www.flickr.com/photos/blumenbiene/30243986500,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\nfccfc3563cd562e1,https://c1.staticflickr.com/9/8645/27729536774_b56a633841_o.jpg,0.25,0.25,0.75,1.0,977,656,https://flickr.com/111347625@N06/27729536774,https://creativecommons.org/licenses/by/2.0/,Heribert Bechen   ... bin dann mal weg!,https://www.flickr.com/people/hb1248/\nd3a88c50958b1b5f,https://c1.staticflickr.com/9/8746/27853631254_508e610bc1_o.jpg,0.0,0.25,0.5,1.0,977,1000,https://www.flickr.com/photos/celteverett/27853631254,https://creativecommons.org/licenses/by/2.0/,Gregorio Puga Bail\\303\\263n,https://www.flickr.com/people/celteverett/\n513b3032ed1f388c,https://c1.staticflickr.com/8/7514/27572579621_930aecf52c_o.jpg,0.28125,0.25,0.84375,1.0,114,542,https://www.flickr.com/photos/viewpix69/27572579621/,https://creativecommons.org/licenses/by/2.0/,Torsten Scholz,https://www.flickr.com/people/viewpix69/\n6217866896fbe2b7,https://c1.staticflickr.com/6/5719/30923267621_c221b094fe_o.jpg,0.0,0.0,0.5,0.75,699,867,https://www.flickr.com/photos/mondo79/30923267621/,https://creativecommons.org/licenses/by/2.0/,Mondo79,https://www.flickr.com/people/mondo79/\n21554e755b9706d2,https://c1.staticflickr.com/1/641/32391235981_071803d033_o.jpg,0.0,0.0,0.75,0.529210925645,342,76,https://www.flickr.com/photos/ilri/32391235981,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/\n87a2147620d5e1cb,https://c1.staticflickr.com/6/5603/30536597041_14c0e333ab_o.jpg,0.4375,0.0,1.0,0.75,780,290,https://www.flickr.com/photos/thoseguys119/30536597041/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nb86d604067f50613,https://c1.staticflickr.com/6/5791/30885593836_dda0ff2d59_o.jpg,0.0,0.24882629108,1.0,1.0,490,998,https://www.flickr.com/photos/southbeachcars/30885593836/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\naf3736cca01a2d28,https://c1.staticflickr.com/1/636/32603914891_d687da69f1_o.jpg,0.25,0.0,1.0,0.75,318,766,https://www.flickr.com/photos/treegrow/32603914891/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n5adb3d985cf217a9,https://c1.staticflickr.com/3/2183/32995484255_f1c2125a38_o.jpg,0.0,0.25,0.421177266576,1.0,405,875,https://www.flickr.com/photos/n-bphotography/32995484255/,https://creativecommons.org/licenses/by/2.0/,Nicky Boogaard,https://www.flickr.com/people/n-bphotography/\n60566d5680497389,https://c1.staticflickr.com/8/7117/27308045115_c9860d768d_o.jpg,0.5,0.0,1.0,0.75,473,544,https://www.flickr.com/photos/vastateparksstaff/27308045115,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n1cfa5381359bff9f,https://c1.staticflickr.com/6/5669/30198502892_8d507f5277_o.jpg,0.337738619677,0.0,1.0,1.0,422,852,https://www.flickr.com/photos/parktatar/30198502892,https://creativecommons.org/licenses/by/2.0/,\\320\\237\\320\\260\\321\\200\\320\\272\\320\\270 \\320\\242\\320\\260\\321\\202\\320\\260\\321\\200\\321\\201\\321\\202\\320\\260\\320\\275\\320\\260,https://www.flickr.com/people/parktatar/\ncd40b0e46c9da574,https://c1.staticflickr.com/8/7705/27405552721_fa059a91db_o.jpg,0.0,0.25,0.75,1.0,662,739,https://www.flickr.com/photos/29233640@N07/27405552721,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/\ne9ecdf28dc1d5a85,https://c1.staticflickr.com/8/7293/27771548652_1bbed73d9a_o.jpg,0.25,0.25,1.0,0.75,609,192,https://www.flickr.com/photos/66755335@N05/27771548652,https://creativecommons.org/licenses/by/2.0/,Geneva Vanderzeil apairandasparediy.com,https://www.flickr.com/people/66755335@N05/\n821aae58dc96b4b2,https://c1.staticflickr.com/8/7668/26973339655_c7771d9f37_o.jpg,0.44769874477,0.25,0.89539748954,1.0,341,575,http://www.flickr.com/photos/125382597@N08/26973339655/,https://creativecommons.org/licenses/by/2.0/,Roger Hsu,https://www.flickr.com/people/125382597@N08/\n715335d5ddfca1f2,https://c1.staticflickr.com/6/5443/30684352681_e443895cc6_o.jpg,0.0,0.25,0.497426470588,1.0,481,915,https://www.flickr.com/photos/agenciasenado/30684352681,https://creativecommons.org/licenses/by/2.0/,Senado Federal,https://www.flickr.com/people/agenciasenado/\n1be47d60e0156bbb,https://c1.staticflickr.com/6/5828/29885217483_5d5c3b4561_o.jpg,0.25,0.0,1.0,1.0,650,912,https://flickr.com/8558643@N06/29885217483,https://creativecommons.org/licenses/by/2.0/,Christophe Delaere,https://www.flickr.com/people/delaere/\n8724748782cb6c31,https://c1.staticflickr.com/1/505/31480812833_d9a37e0bee_o.jpg,0.0,0.0,0.944554455446,1.0,76,647,https://flickr.com/55893585@N08/31480812833,https://creativecommons.org/licenses/by/2.0/,BLM Nevada,https://www.flickr.com/people/blmnevada/\n2ba52bcf59097dc8,https://c1.staticflickr.com/9/8703/29072678195_c8c916e504_o.jpg,0.0,0.0,0.56338028169,0.75,971,850,https://www.flickr.com/photos/blackwing_de/29072678195,https://creativecommons.org/licenses/by/2.0/,Sebastian Werner,https://www.flickr.com/people/blackwing_de/\n2ed718f6db9785f8,https://c1.staticflickr.com/9/8109/29184695352_02765c0138_o.jpg,0.25,0.0,0.75,0.75,519,843,https://www.flickr.com/photos/box_repsol/29184695352,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n4a251fb6d80b5137,https://c1.staticflickr.com/8/7735/27313853085_2df82462d3_o.jpg,0.439547581903,0.0,1.0,0.75,800,82,https://flickr.com/21461098@N00/27313853085,https://creativecommons.org/licenses/by/2.0/,Owen Allen,https://www.flickr.com/people/owen59/\n3617bfc5d06bc196,https://c1.staticflickr.com/6/5608/29603872360_115b742b20_o.jpg,0.210588633288,0.25,0.631765899865,1.0,885,554,https://www.flickr.com/photos/ankurp/29603872360,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\n143c74a57326fd40,https://c1.staticflickr.com/1/362/31438358143_d5b15f28de_o.jpg,0.333333333333,0.0,1.0,1.0,422,423,https://www.flickr.com/photos/robin-schmitt/31438358143/,https://creativecommons.org/licenses/by/2.0/,Siris,https://www.flickr.com/people/robin-schmitt/\nd051e0bd46125123,https://c1.staticflickr.com/6/5748/31131978085_c9153efb9d_o.jpg,0.4375,0.25,1.0,1.0,669,776,https://www.flickr.com/photos/96223380@N02/31131978085,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/\n84af93c72781b7f0,https://c1.staticflickr.com/2/1616/26473779220_95c074ef92_o.jpg,0.0,0.443623639191,0.75,1.0,438,782,https://www.flickr.com/photos/kansallisarkisto/26473779220,https://creativecommons.org/licenses/by/2.0/,Kansallisarkisto,https://www.flickr.com/people/kansallisarkisto/\na52570066ecc61fd,https://c1.staticflickr.com/1/660/31595952701_5eab9952f3_o.jpg,0.0,0.0,0.75,1.0,976,583,https://www.flickr.com/photos/elzey/31595952701,https://creativecommons.org/licenses/by/2.0/,Richard Elzey,https://www.flickr.com/people/elzey/\n3e8bf1eee7083f6e,https://c1.staticflickr.com/6/5325/30267534593_e497c0a76a_o.jpg,0.0,0.0,0.599757673667,0.75,631,683,https://www.flickr.com/photos/85546319@N04/30267534593,https://creativecommons.org/licenses/by/2.0/,Robert  Sheie,https://www.flickr.com/people/85546319@N04/\nf6d5c95ce7908a58,https://c1.staticflickr.com/9/8103/29317853454_b2dec062c2_o.jpg,0.493768328446,0.0,0.987536656891,0.75,561,872,https://www.flickr.com/photos/codnewsroom/29317853454,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\nbfb2aaf48d7fc08c,https://c1.staticflickr.com/6/5347/30848584970_9d7dd68247_o.jpg,0.0,0.25,0.5,1.0,979,953,https://www.flickr.com/photos/deaconmacmillan/30848584970/,https://creativecommons.org/licenses/by/2.0/,Deacon MacMillan,https://www.flickr.com/people/deaconmacmillan/\n5528f7330399485f,https://c1.staticflickr.com/6/5821/30665663016_f164e1bbae_o.jpg,0.24882629108,0.0,1.0,1.0,74,212,http://www.flickr.com/photos/cbroders/30665663016/,https://creativecommons.org/licenses/by/2.0/,Counse,https://www.flickr.com/people/cbroders/\n635ea505879178ed,https://c1.staticflickr.com/6/5787/29740591494_abecb27341_o.jpg,0.0,0.354136429608,1.0,1.0,539,923,https://www.flickr.com/photos/22711505@N05/29740591494,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\na8631b077e74f7aa,https://c1.staticflickr.com/9/8521/28560392972_e2f7a70fbd_o.jpg,0.0,0.4375,0.75,1.0,480,486,https://www.flickr.com/photos/jonnymooshoo/28560392972/,https://creativecommons.org/licenses/by/2.0/,Jonathan Leung,https://www.flickr.com/people/jonnymooshoo/\nbb03be3702584eeb,https://c1.staticflickr.com/9/8825/28189849211_8747a0ee87_o.jpg,0.0,0.0,0.854757929883,1.0,672,624,https://www.flickr.com/photos/glorycycles/28189849211,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n8090736c8299ab28,https://c1.staticflickr.com/8/7301/27600935412_70c27a16d2_o.jpg,0.25,0.4375,1.0,1.0,980,894,https://www.flickr.com/photos/kitkaphotogirl/27600935412/,https://creativecommons.org/licenses/by/2.0/,Christine Majul,https://www.flickr.com/people/kitkaphotogirl/\n74b13710bcf4f7f3,https://c1.staticflickr.com/8/7271/27059072776_6f5d6d0919_o.jpg,0.503303964758,0.0,1.0,0.75,775,918,https://www.flickr.com/photos/spera-designerschuhe/27059072776,https://creativecommons.org/licenses/by/2.0/,\"SPERA.de Designerschuhe, Taschen und Accessoires\",https://www.flickr.com/people/spera-designerschuhe/\necd3a969dd466349,https://c1.staticflickr.com/8/7423/28019501745_3975453d32_o.jpg,0.25,0.25,1.0,1.0,285,693,https://www.flickr.com/photos/editor/28019501745,https://creativecommons.org/licenses/by/2.0/,Bart Everson,https://www.flickr.com/people/editor/\n2abcab3d77d4767e,https://c1.staticflickr.com/6/5673/30925169246_bcb5ac8949_o.jpg,0.0,0.24882629108,1.0,1.0,443,520,https://www.flickr.com/photos/eltb/30925169246,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n8c975de17f3247d1,https://c1.staticflickr.com/1/712/32281377125_d669c5337a_o.jpg,0.28125,0.0,0.84375,0.75,650,526,https://www.flickr.com/photos/stonehenge-stone-circle/32281377125/,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/\n8d86fae18afef4e0,https://c1.staticflickr.com/6/5834/29905668306_e17a9b35ed_o.jpg,0.238170347003,0.0,1.0,1.0,38,79,https://www.flickr.com/photos/2ndpeter/29905668306,https://creativecommons.org/licenses/by/2.0/,Peter Paplanus,https://www.flickr.com/people/2ndpeter/\n619a9d0eb2acdd82,https://c1.staticflickr.com/9/8079/28742831150_8cd69d4202_o.jpg,0.0,0.0,0.666666666667,1.0,885,843,https://www.flickr.com/photos/zigazou76/28742831150/,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n9ab953cce5c7f879,https://c1.staticflickr.com/3/2872/33227757875_2a76bc808e_o.jpg,0.333333333333,0.0,1.0,1.0,443,367,https://www.flickr.com/photos/dany13/33227757875/,https://creativecommons.org/licenses/by/2.0/,dany13,https://www.flickr.com/people/dany13/\n1c2e9fe8b0b2fdf2,https://c1.staticflickr.com/8/7633/27140101841_c1f8aa3b4d_o.jpg,0.0,0.0,0.666666666667,1.0,58,905,https://www.flickr.com/photos/gregthebusker/27140101841,https://creativecommons.org/licenses/by/2.0/,Greg Schechter,https://www.flickr.com/people/gregthebusker/\na414ccf5c51454e0,https://c1.staticflickr.com/8/7609/27446813796_e349a63c2f_o.jpg,0.0,0.0,0.665684830633,1.0,830,866,https://www.flickr.com/photos/fotosagenciabrasil/27446813796,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/\n26aa2e6ee43387e7,https://c1.staticflickr.com/1/378/31616355823_06b59a862a_o.jpg,0.25,0.0,1.0,0.75,913,741,https://www.flickr.com/photos/12463666@N03/31616355823/,https://creativecommons.org/licenses/by/2.0/,Bob  M ~,https://www.flickr.com/people/12463666@N03/\n3302a8c24caf20f4,https://c1.staticflickr.com/8/7553/27852122740_a93432645b_o.jpg,0.0,0.0,0.666666666667,1.0,704,548,https://flickr.com/53301297@N00/27852122740,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\ndd722682a9f2b9dd,https://c1.staticflickr.com/6/5773/29781416180_6cd73114d5_o.jpg,0.0,0.0,0.5,0.75,437,458,https://www.flickr.com/photos/greggjerdingen/29781416180,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n6afe58efa85756dc,https://c1.staticflickr.com/8/7406/27477875915_19bb21bd54_o.jpg,0.0,0.333333333333,1.0,1.0,929,849,https://www.flickr.com/photos/insatiablemunchies/27477875915,https://creativecommons.org/licenses/by/2.0/,insatiablemunch,https://www.flickr.com/people/insatiablemunchies/\n0ceee9a38409e30c,https://c1.staticflickr.com/1/412/31684872936_8e1df2a992_o.jpg,0.4375,0.0,1.0,0.75,484,712,https://www.flickr.com/photos/16801915@N06/31684872936/,https://creativecommons.org/licenses/by/2.0/,Reading Tom,https://www.flickr.com/people/16801915@N06/\n1df5e1adad21d618,https://c1.staticflickr.com/1/532/32376482310_86efb9eec4_o.jpg,0.25,0.0,0.75,0.75,405,556,https://www.flickr.com/photos/thejointstaff/32376482310,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/\n57e62606f02d0251,https://c1.staticflickr.com/8/7307/27798850402_87d7558850_o.jpg,0.496696035242,0.0,0.993392070485,0.75,548,646,https://www.flickr.com/photos/shankaronline/27798850402,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nd0fe8afb55c3c7cd,https://c1.staticflickr.com/9/8107/28396972686_381dae0505_o.jpg,0.0,0.0,1.0,0.75,498,778,https://www.flickr.com/photos/duncanh1/28396972686,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\n91d18b353d5b3be2,https://c1.staticflickr.com/4/3935/33250842731_598bbc7d1e_o.jpg,0.0,0.0,0.75,0.75,931,26,https://www.flickr.com/photos/dylan20/33250842731,https://creativecommons.org/licenses/by/2.0/,Dylan Tweney,https://www.flickr.com/people/dylan20/\n21b0803c965f76ef,https://c1.staticflickr.com/6/5667/31229598566_3fca43f16f_o.jpg,0.0,0.25,0.403311258278,1.0,920,977,https://www.flickr.com/photos/crackdog/31229598566,https://creativecommons.org/licenses/by/2.0/,William Creswell,https://www.flickr.com/people/crackdog/\nf20783fc38473514,https://c1.staticflickr.com/9/8550/28448778474_c095f2264b_o.jpg,0.248713235294,0.25,0.746139705882,1.0,386,774,https://www.flickr.com/photos/shankaronline/28448778474,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n3d6e530955c60759,https://c1.staticflickr.com/8/7293/26333233883_fb2b616f95_o.jpg,0.0,0.0,0.57765451664,0.75,512,892,https://www.flickr.com/photos/hugo90/26333233883,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n7e5c847bafc4d50c,https://c1.staticflickr.com/6/5557/30353091180_fe0a06de72_o.jpg,0.55183312263,0.25,0.919721871049,1.0,909,529,https://www.flickr.com/photos/flyingsinger/30353091180,https://creativecommons.org/licenses/by/2.0/,Bruce Irving,https://www.flickr.com/people/flyingsinger/\n0aebe24fc257286e,https://c1.staticflickr.com/8/7343/27235728323_4d87753e80_o.jpg,0.0,0.25,0.535877862595,1.0,561,315,https://www.flickr.com/photos/143049688@N08/27235728323,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/\n3c970c84b598f2d9,https://c1.staticflickr.com/6/5693/25380221549_fd25f3d570_o.jpg,0.223849372385,0.0,0.671548117155,0.75,780,597,https://www.flickr.com/photos/thoseguys119/25380221549,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nc6166621198a3de4,https://c1.staticflickr.com/6/5563/31119538711_0c79469ee9_o.jpg,0.0,0.161983471074,1.0,1.0,986,747,https://www.flickr.com/photos/mauroguanandi/31119538711/,https://creativecommons.org/licenses/by/2.0/,mauroguanandi,https://www.flickr.com/people/mauroguanandi/\n134bfd93a04b88b2,https://c1.staticflickr.com/8/7284/28111216916_c5cd478e8a_o.jpg,0.333333333333,0.0,1.0,1.0,581,962,https://www.flickr.com/photos/yourmildura/28111216916,https://creativecommons.org/licenses/by/2.0/,Your Mildura,https://www.flickr.com/people/yourmildura/\n4227a6e105cc0588,https://c1.staticflickr.com/6/5659/30998499956_ec5656fd7f_o.jpg,0.46499339498,0.0,1.0,1.0,971,141,https://www.flickr.com/photos/apardavila/30998499956,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n405dd60729a8c18d,https://c1.staticflickr.com/6/5604/31248667090_381a827f4b_o.jpg,0.0,0.0,0.5625,0.75,848,496,http://www.flickr.com/photos/mohit_s/31248667090/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/\n0d29832e5da60f5f,https://c1.staticflickr.com/9/8160/29190648723_bcf0356317_o.jpg,0.25,0.0,1.0,1.0,973,181,https://www.flickr.com/photos/jsjgeology/29190648723,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n90ab38bb74020d5a,https://c1.staticflickr.com/9/8072/28451660015_5953f09d2a_o.jpg,0.5,0.0,1.0,0.75,647,141,https://www.flickr.com/photos/tipsfortravellers/28451660015,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n068c5d66662a837a,https://c1.staticflickr.com/8/7330/26495171353_a3fff0f136_o.jpg,0.0,0.25,0.57345971564,1.0,964,773,https://www.flickr.com/photos/lafoodie/26495171353,https://creativecommons.org/licenses/by/2.0/,L.A. Foodie,https://www.flickr.com/people/lafoodie/\ne5f15610a22098bb,https://c1.staticflickr.com/9/8407/29490211104_10c2f48229_o.jpg,0.303658536585,0.25,0.910975609756,1.0,672,575,https://www.flickr.com/photos/ophilos/29490211104,https://creativecommons.org/licenses/by/2.0/,Christos Loufopoulos,https://www.flickr.com/people/ophilos/\n4cd90a6459ce9571,https://c1.staticflickr.com/8/7513/29088533881_89782643f3_o.jpg,0.234308131241,0.0,0.702924393723,0.75,719,622,https://www.flickr.com/photos/tdlucas5000/29088533881,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/\n4a0bac33f8e81e60,https://c1.staticflickr.com/9/8551/29475088050_cbbd9ea8a2_o.jpg,0.0,0.0,0.669128508124,1.0,407,857,https://www.flickr.com/photos/eltb/29475088050,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\ncc283b8f7f46fbf0,https://c1.staticflickr.com/9/8026/29591945975_73a66c762b_o.jpg,0.4375,0.0,1.0,0.75,574,962,https://www.flickr.com/photos/mauroguanandi/29591945975,https://creativecommons.org/licenses/by/2.0/,mauroguanandi,https://www.flickr.com/people/mauroguanandi/\n70b9b8ae11327472,https://c1.staticflickr.com/9/8138/30013050040_04d3fdd00b_o.jpg,0.0,0.0,1.0,1.0,11,983,https://www.flickr.com/photos/46183897@N00/30013050040,https://creativecommons.org/licenses/by/2.0/,Robert Nunnally,https://www.flickr.com/people/46183897@N00/\n5dd8e133e66ecd3a,https://c1.staticflickr.com/1/477/32384785852_132146bba9_o.jpg,0.0,0.0,0.643394648829,0.75,142,346,https://flickr.com/11076453@N00/32384785852,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/\n4dc360d125c9238c,https://c1.staticflickr.com/8/7516/26892006331_d8fff23f32_o.jpg,0.25,0.0,0.75,0.75,527,840,https://www.flickr.com/photos/johovac/26892006331,https://creativecommons.org/licenses/by/2.0/,Ed S. Johovac,https://www.flickr.com/people/johovac/\n8805b0b20d808c49,https://c1.staticflickr.com/8/7728/27175361700_dd1959dd51_o.jpg,0.5,0.25,1.0,1.0,704,927,https://www.flickr.com/photos/faceme/27175361700,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/\n15d27dbdc9eeda7f,https://c1.staticflickr.com/1/704/32389054391_5ac6fee7e7_o.jpg,0.0,0.0,0.671597633136,1.0,469,765,https://www.flickr.com/photos/54144402@N03/32389054391,https://creativecommons.org/licenses/by/2.0/,Bob Dass,https://www.flickr.com/people/54144402@N03/\n448a738f6dcba07e,https://c1.staticflickr.com/8/7755/28840807203_405a538ce8_o.jpg,0.0,0.25,0.5,1.0,563,416,https://www.flickr.com/photos/harshlight/28840807203/,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\ne5948d6294eb8ca3,https://c1.staticflickr.com/6/5480/31214754031_7eae5eeede_o.jpg,0.0,0.0,0.5625,0.75,887,676,https://www.flickr.com/photos/davidstanleytravel/31214754031,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dataset/download_images.py",
    "content": "\"\"\"Script which downloads dataset images.\n\nUsage:\n  python download_images.py --input_file=INPUT_FILE --output_dir=IMAGES_DIR\n\nwhere:\n  INPUT_FILE is input csv file with dataset description, i.e. dev_dataset.csv\n  IMAGES_DIR is output directory where all images should be downloaded\n\nExample:\n  # create directory for images\n  mkdir images\n  # download images declared in dev_dataset.csv\n  python download_images.py --input_file=dev_dataset.csv --output_dir=images\n\n\nDependencies:\n  Python 2.7 or higher.\n  Pillow library: https://python-pillow.org/\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport argparse\nimport csv\nimport os\nimport sys\nfrom functools import partial\nfrom io import BytesIO\nimport multiprocessing\nfrom multiprocessing.dummy import Pool as ThreadPool\n\nfrom PIL import Image\n\ntry:\n    from urllib.request import urlopen\nexcept ImportError:\n    from urllib2 import urlopen\n\n\ndef parse_args():\n    \"\"\"Parses command line arguments.\"\"\"\n    parser = argparse.ArgumentParser(description=\"Tool to download dataset images.\")\n    parser.add_argument(\"--input_file\", required=True, help=\"Location of dataset.csv\")\n    parser.add_argument(\n        \"--output_dir\", required=True, help=\"Output path to download images\"\n    )\n    parser.add_argument(\n        \"--threads\",\n        default=multiprocessing.cpu_count() + 1,\n        help=\"Number of threads to use\",\n    )\n    args = parser.parse_args()\n    return args.input_file, args.output_dir, int(args.threads)\n\n\ndef get_image(row, output_dir):\n    \"\"\"Downloads the image that corresponds to the given row.\n    Prints a notification if the download fails.\"\"\"\n    if not download_image(\n        image_id=row[0],\n        url=row[1],\n        x1=float(row[2]),\n        y1=float(row[3]),\n        x2=float(row[4]),\n        y2=float(row[5]),\n        output_dir=output_dir,\n    ):\n        print(\"Download failed: \" + str(row[0]))\n\n\ndef download_image(image_id, url, x1, y1, x2, y2, output_dir):\n    \"\"\"Downloads one image, crops it, resizes it and saves it locally.\"\"\"\n    output_filename = os.path.join(output_dir, image_id + \".png\")\n    if os.path.exists(output_filename):\n        # Don't download image if it's already there\n        return True\n    try:\n        # Download image\n        url_file = urlopen(url)\n        if url_file.getcode() != 200:\n            return False\n        image_buffer = url_file.read()\n        # Crop, resize and save image\n        image = Image.open(BytesIO(image_buffer)).convert(\"RGB\")\n        w = image.size[0]\n        h = image.size[1]\n        image = image.crop((int(x1 * w), int(y1 * h), int(x2 * w), int(y2 * h)))\n        image = image.resize((299, 299), resample=Image.ANTIALIAS)\n        image.save(output_filename)\n    except IOError:\n        return False\n    return True\n\n\ndef main():\n    input_filename, output_dir, n_threads = parse_args()\n\n    if not os.path.isdir(output_dir):\n        print(\"Output directory {} does not exist\".format(output_dir))\n        sys.exit()\n\n    with open(input_filename) as input_file:\n        reader = csv.reader(input_file)\n        header_row = next(reader)\n        rows = list(reader)\n    try:\n        row_idx_image_id = header_row.index(\"ImageId\")\n        row_idx_url = header_row.index(\"URL\")\n        row_idx_x1 = header_row.index(\"x1\")\n        row_idx_y1 = header_row.index(\"y1\")\n        row_idx_x2 = header_row.index(\"x2\")\n        row_idx_y2 = header_row.index(\"y2\")\n    except ValueError as e:\n        print(\"One of the columns was not found in the source file: \", e.message)\n\n    rows = [\n        (\n            row[row_idx_image_id],\n            row[row_idx_url],\n            float(row[row_idx_x1]),\n            float(row[row_idx_y1]),\n            float(row[row_idx_x2]),\n            float(row[row_idx_y2]),\n        )\n        for row in rows\n    ]\n\n    if n_threads > 1:\n        pool = ThreadPool(n_threads)\n        partial_get_images = partial(get_image, output_dir=output_dir)\n        for i, _ in enumerate(pool.imap_unordered(partial_get_images, rows), 1):\n            sys.stderr.write(\"\\rDownloaded {0} images\".format(i + 1))\n        pool.close()\n        pool.join()\n    else:\n        failed_to_download = set()\n        for idx in range(len(rows)):\n            row = rows[idx]\n            if not download_image(\n                image_id=row[0],\n                url=row[1],\n                x1=float(row[2]),\n                y1=float(row[3]),\n                x2=float(row[4]),\n                y2=float(row[5]),\n                output_dir=output_dir,\n            ):\n                failed_to_download.add(row[row_idx_image_id])\n            sys.stdout.write(\"\\rDownloaded {0} images\".format(idx + 1))\n            sys.stdout.flush()\n\n        print()\n        if failed_to_download:\n            print(\"\\nUnable to download images with the following IDs:\")\n            for image_id in failed_to_download:\n                print(image_id)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dataset/final_dataset.csv",
    "content": "ImageId,URL,x1,y1,x2,y2,TrueLabel,TargetClass,OriginalLandingURL,License,Author,AuthorProfileURL\na848d5e9f44eb947,https://c1.staticflickr.com/8/7393/26895431856_1e2779dcb6_o.jpg,0.0,0.0,0.666666666667,1.0,769,794,https://www.flickr.com/photos/galwegians/26895431856/,https://creativecommons.org/licenses/by/2.0/,Galwegians Rugby,https://www.flickr.com/people/galwegians/\na0d9f2c1237155e1,https://c1.staticflickr.com/9/8789/28462362232_7fe7f753f8_o.jpg,0.28125,0.0,0.84375,0.75,518,513,https://www.flickr.com/photos/zongo/28462362232,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n07c4a323c7cd3b0d,https://c1.staticflickr.com/1/757/31973894410_64df44bc7a_o.jpg,0.333333333333,0.0,1.0,1.0,93,246,https://www.flickr.com/photos/vilipix/31973894410,https://creativecommons.org/licenses/by/2.0/,Vilmos Vincze,https://www.flickr.com/people/vilipix/\n2663678749f79635,https://c1.staticflickr.com/8/7515/28259468696_3952fdd372_o.jpg,0.0,0.25,0.416890982503,1.0,564,489,https://www.flickr.com/photos/68704638@N04/28259468696,https://creativecommons.org/licenses/by/2.0/,M Dreibelbis,https://www.flickr.com/people/68704638@N04/\n123d524ff1fabfd8,https://c1.staticflickr.com/8/7441/28097827921_7ba6e2a576_o.jpg,0.234375,0.0,0.703125,0.75,629,601,https://www.flickr.com/photos/viaggioroutard/28097827921,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard,https://www.flickr.com/people/viaggioroutard/\nfc2af56905cb8b74,https://c1.staticflickr.com/9/8271/28727141352_9274e5c144_o.jpg,0.0,0.0,0.75,1.0,325,299,https://www.flickr.com/photos/9750464@N02/28727141352,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\nc2b607459b431044,https://c1.staticflickr.com/9/8019/29072672630_bbb32eba44_o.jpg,0.0,0.25,0.707894736842,1.0,742,141,https://flickr.com/43714545@N06/29072672630,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/\n93de7000a54a15e2,https://c1.staticflickr.com/9/8015/29914571145_236c06152a_o.jpg,0.0,0.0,0.47170487106,0.75,426,495,https://www.flickr.com/photos/rpavich/29914571145,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/\ne0e32cf5266cd521,https://c1.staticflickr.com/9/8356/29816580985_e877cbb9b1_o.jpg,0.28125,0.0,0.84375,0.75,672,5,https://www.flickr.com/photos/egizu/29816580985,https://creativecommons.org/licenses/by/2.0/,EGIZU Getxo Euskaldun Elkartea,https://www.flickr.com/people/egizu/\n90f4d1356efe095e,https://c1.staticflickr.com/8/7094/27156072575_4389d3b607_o.jpg,0.0,0.0,0.334029227557,1.0,780,444,https://www.flickr.com/photos/thoseguys119/27156072575,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n26595af120cc7dbc,https://c1.staticflickr.com/9/8645/30041063386_707c5f6956_o.jpg,0.0,0.0,0.75,0.75,840,648,https://www.flickr.com/photos/ipdegirl/30041063386,https://creativecommons.org/licenses/by/2.0/,Jenni C,https://www.flickr.com/people/ipdegirl/\n8cb7ffee680f3df9,https://c1.staticflickr.com/8/7296/26774983631_c2ab16fd43_o.jpg,0.0,0.0,0.923611111111,1.0,141,254,https://www.flickr.com/photos/winnu/26774983631/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/\nb0ad7e18aabb5953,https://c1.staticflickr.com/8/7620/27206468570_0ebd756de0_o.jpg,0.431506849315,0.0,0.86301369863,0.75,815,428,https://www.flickr.com/photos/specky4eyes/27206468570/,https://creativecommons.org/licenses/by/2.0/,Tim Dutton,https://www.flickr.com/people/specky4eyes/\nca899ebaaa192e76,https://c1.staticflickr.com/9/8624/27761792824_fe37c758b9_o.jpg,0.0,0.0,0.666666666667,1.0,512,154,https://www.flickr.com/photos/greggjerdingen/27761792824,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n2eb14089b9e0d19e,https://c1.staticflickr.com/1/687/32354291093_4a0db4e6c0_o.jpg,0.0,0.0,0.494868035191,0.75,697,656,https://www.flickr.com/photos/eaglebrook/32354291093/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/\n820811a4723b68d3,https://c1.staticflickr.com/9/8867/28587711746_8845af4b5c_o.jpg,0.281690140845,0.25,0.845070422535,1.0,303,750,https://www.flickr.com/photos/treegrow/28587711746/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n028be4c50d6b98d1,https://c1.staticflickr.com/1/299/32620162301_fcaf7fc736_o.jpg,0.25,0.25,0.75,1.0,618,112,https://flickr.com/39272011@N07/32620162301,https://creativecommons.org/licenses/by/2.0/,Secretaria de Agricultura e Abastecimento,https://www.flickr.com/people/agriculturasp/\n447cd53555a4b040,https://c1.staticflickr.com/6/5718/30359674204_72ae426b93_o.jpg,0.25,0.25,0.75,1.0,672,834,https://www.flickr.com/photos/flowizm/30359674204,https://creativecommons.org/licenses/by/2.0/,Flowizm ...,https://www.flickr.com/people/flowizm/\n84709c76bf028cf0,https://c1.staticflickr.com/1/778/31860187474_91516869dd_o.jpg,0.0,0.25,0.739247311828,1.0,209,383,http://www.flickr.com/photos/ocalways/31860187474/,https://creativecommons.org/licenses/by/2.0/,Rain Love AMR,https://www.flickr.com/people/ocalways/\n606e87f1abb2a9dd,https://c1.staticflickr.com/6/5501/30152143390_4f4fa46688_o.jpg,0.0,0.0,0.75,0.75,763,523,https://www.flickr.com/photos/vermazeren/30152143390/in/photostream/,https://creativecommons.org/licenses/by/2.0/,Arend,https://www.flickr.com/people/vermazeren/\nae16623b27665105,https://c1.staticflickr.com/1/476/32566869356_7b217c6d05_o.jpg,0.0,0.25,0.597580645161,1.0,302,508,https://www.flickr.com/photos/gails_pictures/32566869356,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nfe2e27a42f7ddd98,https://c1.staticflickr.com/8/7540/27451055534_f7a81bf51b_o.jpg,0.0,0.0,0.666666666667,1.0,980,265,https://www.flickr.com/photos/7840760@N05/27451055534/,https://creativecommons.org/licenses/by/2.0/,Chris Morriss,https://www.flickr.com/people/7840760@N05/\nde0a2707f072777f,https://c1.staticflickr.com/6/5583/30534634774_31264a30bd_o.jpg,0.322436849926,0.0,1.0,1.0,854,525,https://www.flickr.com/photos/13476480@N07/30534634774,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n3209c617316fc78a,https://c1.staticflickr.com/8/7358/28142024586_e04bf4cb59_o.jpg,0.25,0.0,1.0,0.710456942004,672,716,https://www.flickr.com/photos/glorycycles/28142024586,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n16ba4a445ceb0583,https://c1.staticflickr.com/6/5819/30850943682_bb392d5fa6_o.jpg,0.25,0.25,0.75,1.0,986,651,https://www.flickr.com/photos/133415851@N08/30850943682/,https://creativecommons.org/licenses/by/2.0/,Federico Ettlin,https://www.flickr.com/people/ettlin/\n1f9cff65da1c0782,https://c1.staticflickr.com/8/7633/27892513360_9c36dfe2f4_o.jpg,0.0,0.0,1.0,0.662261380323,314,391,https://www.flickr.com/photos/sybarite48/27892513360,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n2e3f4eae14f1a3f6,https://c1.staticflickr.com/1/580/32072671795_ef6891214a_o.jpg,0.25,0.25,0.75,1.0,405,875,https://www.flickr.com/photos/janitors/32072671795,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\naa7d9739723a05d7,https://c1.staticflickr.com/9/8226/29505794630_61a1beca26_o.jpg,0.0,0.502573529412,0.75,1.0,885,133,https://www.flickr.com/photos/34517490@N00/29505794630/,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/\n63e73d5aacf1ba97,https://c1.staticflickr.com/1/666/31261546224_cb5a86c42e_o.jpg,0.254290171607,0.0,1.0,1.0,342,214,http://www.flickr.com/photos/tusnelda/31261546224/,https://creativecommons.org/licenses/by/2.0/,storebukkebruse,https://www.flickr.com/people/tusnelda/\nc9b195587a56fe87,https://c1.staticflickr.com/9/8021/27763477813_59ef474d4c_o.jpg,0.0,0.0,0.654970760234,1.0,756,35,https://www.flickr.com/photos/benoit59/27763477813,https://creativecommons.org/licenses/by/2.0/,Benoit Brouillette,https://www.flickr.com/people/benoit59/\n5d4d94f48ccd34cd,https://c1.staticflickr.com/6/5042/29408632573_59573f25de_o.jpg,0.0,0.0,0.75,0.5625,441,849,https://www.flickr.com/photos/theuksampler/29408632573,https://creativecommons.org/licenses/by/2.0/,The Sampler,https://www.flickr.com/people/theuksampler/\n3cd91ad17344bb80,https://c1.staticflickr.com/9/8623/28127739832_7ee96f9702_o.jpg,0.5,0.0,1.0,0.75,914,954,https://flickr.com/20534939@N00/28127739832,https://creativecommons.org/licenses/by/2.0/,Michael Dunn,https://www.flickr.com/people/acidhelm/\n96aa4e82e48b9dbe,https://c1.staticflickr.com/6/5345/30839536762_5b7ae7cba0_o.jpg,0.259316770186,0.0,1.0,1.0,835,672,https://www.flickr.com/photos/senterpartiet/30839536762,https://creativecommons.org/licenses/by/2.0/,Senterpartiet (Sp),https://www.flickr.com/people/senterpartiet/\n64a91d1a6d101ccf,https://c1.staticflickr.com/6/5584/30396996684_8984c6a138_o.jpg,0.25,0.25,1.0,1.0,797,286,https://www.flickr.com/photos/sfslim/30396996684,https://creativecommons.org/licenses/by/2.0/,Aaron Muszalski,https://www.flickr.com/people/sfslim/\nc5f061dcfb483a11,https://c1.staticflickr.com/8/7631/27625208962_2dc4446862_o.jpg,0.25,0.0,0.75,0.75,848,243,https://www.flickr.com/photos/janitors/27625208962,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n752b25b1ff2ff927,https://c1.staticflickr.com/9/8510/29366748925_48b877ce87_o.jpg,0.0,0.0,0.599757673667,0.75,821,626,https://www.flickr.com/photos/mlevisay/29366748925/,https://creativecommons.org/licenses/by/2.0/,Mark Levisay,https://www.flickr.com/people/mlevisay/\nafab65c0134e89b7,https://c1.staticflickr.com/9/8253/28463005493_a1d813d3a8_o.jpg,0.0,0.25,1.0,1.0,986,229,https://www.flickr.com/photos/pussreboots/28463005493/,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/\n09eacfaa5fc9dfee,https://c1.staticflickr.com/1/31/31579543046_8ea0a42f93_o.jpg,0.5,0.0,1.0,0.75,981,596,https://www.flickr.com/photos/jseita/31579543046,https://creativecommons.org/licenses/by/2.0/,Jun Seita,https://www.flickr.com/people/jseita/\n23e57a37718d8c57,https://c1.staticflickr.com/8/7358/27239087290_5e99163ccb_o.jpg,0.4375,0.0,1.0,0.75,920,979,https://www.flickr.com/photos/cogdog/27239087290/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\na0a1afd68b1e5069,https://c1.staticflickr.com/9/8361/27843140003_75d87d3d7f_o.jpg,0.0,0.25,0.501846381093,1.0,979,634,https://www.flickr.com/photos/22711505@N05/27843140003,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n3fb246fdb7bd462f,https://c1.staticflickr.com/8/7357/27032652784_3cd2896842_o.jpg,0.0,0.0,1.0,0.992805755396,909,655,https://www.flickr.com/photos/96223380@N02/27032652784,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/\n51cf3b149ea31a6d,https://c1.staticflickr.com/8/7436/27973290836_c8698fdd79_o.jpg,0.4375,0.0,1.0,0.75,583,517,https://www.flickr.com/photos/sharonhahndarlin/27973290836,https://creativecommons.org/licenses/by/2.0/,Sharon Hahn Darlin,https://www.flickr.com/people/sharonhahndarlin/\n22b784a48ff19810,https://c1.staticflickr.com/6/5346/30464903473_64504dc166_o.jpg,0.0,0.25,0.75,1.0,830,93,https://flickr.com/131918865@N03/30464903473,https://creativecommons.org/licenses/by/2.0/,Junts Tiana,https://www.flickr.com/people/juntstiana/\n8a66231bead19adb,https://c1.staticflickr.com/8/7318/27787115320_ab440763f7_o.jpg,0.28125,0.0,0.84375,0.75,133,486,https://www.flickr.com/photos/starr-environmental/27787115320,https://creativecommons.org/licenses/by/2.0/,Forest and Kim Starr,https://www.flickr.com/people/starr-environmental/\n2dfc9cb36e29ca3e,https://c1.staticflickr.com/6/5475/30827648471_23a1a2ab84_o.jpg,0.0,0.25,0.5,1.0,323,856,https://www.flickr.com/photos/futuredu/30827648471,https://creativecommons.org/licenses/by/2.0/,Marcin Polak,https://www.flickr.com/people/futuredu/\n29285c4a579d8c3c,https://c1.staticflickr.com/9/8251/29546986532_aa228f107f_o.jpg,0.0,0.0,0.7484375,1.0,418,48,https://www.flickr.com/photos/xingxiyang/29546986532/,https://creativecommons.org/licenses/by/2.0/,Kiefer,https://www.flickr.com/people/xingxiyang/\ncc72394a7ba14370,https://c1.staticflickr.com/9/8435/28937998734_ae4de67018_o.jpg,0.0,0.0,0.69150779896,0.75,310,60,https://www.flickr.com/photos/gails_pictures/28937998734,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nd00961ae337d9e7c,https://c1.staticflickr.com/6/5144/29827652251_bd92970b02_o.jpg,0.25,0.0,1.0,1.0,669,586,https://www.flickr.com/photos/davidstanleytravel/29827652251,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n4bbe8753d01fd75c,https://c1.staticflickr.com/8/7405/27730742260_e9d785aa58_o.jpg,0.0,0.25,0.533917682927,1.0,473,707,https://www.flickr.com/photos/vastateparksstaff/27730742260/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n2297ec9e7f48a2c2,https://c1.staticflickr.com/6/5623/30344158972_e454e4bc90_o.jpg,0.0,0.0,0.51992481203,0.75,780,883,https://www.flickr.com/photos/thoseguys119/30344158972/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\ndb079b0e7c8aef32,https://c1.staticflickr.com/9/8351/28736007170_872899f67c_o.jpg,0.335787923417,0.0,1.0,1.0,407,642,https://www.flickr.com/photos/donaldjudge/28736007170/,https://creativecommons.org/licenses/by/2.0/,Donald Judge,https://www.flickr.com/people/donaldjudge/\nf5e42d715d555958,https://c1.staticflickr.com/1/395/32045778191_0be236296f_o.jpg,0.25,0.0,1.0,0.423913043478,407,257,https://www.flickr.com/photos/eltb/32045778191,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n19323986b4466974,https://c1.staticflickr.com/6/5684/30663092081_33b866d374_o.jpg,0.25,0.441588785047,1.0,1.0,918,41,https://www.flickr.com/photos/norbet/30663092081,https://creativecommons.org/licenses/by/2.0/,norbet1,https://www.flickr.com/people/norbet/\nc0a2c53a6cdd31cd,https://c1.staticflickr.com/1/712/31613349033_f6034e2212_o.jpg,0.0,0.0,0.895726495726,1.0,303,273,https://www.flickr.com/photos/gails_pictures/31613349033,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\na7f60594c1d64c66,https://c1.staticflickr.com/8/7330/27131566932_641e0e62cb_o.jpg,0.28125,0.0,0.84375,0.75,866,154,https://www.flickr.com/photos/moresheth/27131566932,https://creativecommons.org/licenses/by/2.0/,Moresheth,https://www.flickr.com/people/moresheth/\nfa150ed0ad657e7d,https://c1.staticflickr.com/8/7318/28007131136_39a99af731_o.jpg,0.0,0.25,0.5,1.0,441,768,https://www.flickr.com/photos/praxinoscope/28007131136,https://creativecommons.org/licenses/by/2.0/,David Wagner,https://www.flickr.com/people/praxinoscope/\n1edabd3f528a988f,https://c1.staticflickr.com/8/7313/27365716724_b99c3b56f6_o.jpg,0.0,0.0,0.579761904762,0.75,88,298,https://www.flickr.com/photos/132033298@N04/27365716724,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/\nacb0d1c3621f8800,https://c1.staticflickr.com/6/5527/30220699384_abaec38192_o.jpg,0.28125,0.25,0.84375,1.0,940,633,https://www.flickr.com/photos/notionscapital/30220699384,https://creativecommons.org/licenses/by/2.0/,Mike Licht,https://www.flickr.com/people/notionscapital/\nbee8a6595e8e29c5,https://c1.staticflickr.com/9/8079/29633024285_ba72f57527_o.jpg,0.25,0.0,1.0,1.0,442,818,https://www.flickr.com/photos/adactio/29633024285,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/\n8a0b82bf3b1490c7,https://c1.staticflickr.com/9/8641/29953213872_24df27b7ca_o.jpg,0.5,0.25,1.0,1.0,976,756,https://www.flickr.com/photos/wm_archiv/29953213872,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/\n88b3f2bdd279e878,https://c1.staticflickr.com/8/7337/27559388332_13ac32635b_o.jpg,0.4375,0.0,1.0,0.75,309,337,https://www.flickr.com/photos/treegrow/27559388332,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n068ea8518ba9fba2,https://c1.staticflickr.com/8/7021/26217053044_5cf7d7d527_o.jpg,0.0,0.4375,0.75,1.0,539,452,https://www.flickr.com/photos/paytonc/26217053044,https://creativecommons.org/licenses/by/2.0/,Payton Chung,https://www.flickr.com/people/paytonc/\n48e691c7cc9bbabc,https://c1.staticflickr.com/8/7660/26829662442_f0f4dfe06f_o.jpg,0.354271356784,0.0,1.0,0.75,147,473,https://www.flickr.com/photos/forest-and-kim/26829662442,https://creativecommons.org/licenses/by/2.0/,Forest Starr and Kim Starr,https://www.flickr.com/people/forest-and-kim/\n1596fdc1ff65350a,https://c1.staticflickr.com/9/8447/28528442142_3103226194_o.jpg,0.4375,0.0,1.0,0.75,973,879,https://www.flickr.com/photos/amanderson/28528442142,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n868d2dec167026ed,https://c1.staticflickr.com/9/8404/29683573562_970683405c_o.jpg,0.25,0.25,0.75,1.0,909,1000,https://www.flickr.com/photos/fun_flying/29683573562,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/\nd48647e2fc361015,https://c1.staticflickr.com/9/8673/30116376876_3457b300cb_o.jpg,0.499263622975,0.0,0.99852724595,0.75,733,493,https://www.flickr.com/photos/southbeachcars/30116376876,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n91dafb69f1245da0,https://c1.staticflickr.com/9/8793/28204602036_31f0efc233_o.jpg,0.0,0.0,0.666666666667,1.0,294,151,https://www.flickr.com/photos/flowcomm/28204602036,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\ncb88c0821527cd6d,https://c1.staticflickr.com/8/7404/27558163526_26734d2360_o.jpg,0.0,0.25,0.75,1.0,484,841,https://www.flickr.com/photos/pocius/27558163526,https://creativecommons.org/licenses/by/2.0/,Bryan Pocius,https://www.flickr.com/people/pocius/\n00d7e503d491f54a,https://c1.staticflickr.com/8/7385/27276000761_f29f3a0fc9_o.jpg,0.327407407407,0.0,1.0,1.0,896,561,https://www.flickr.com/photos/8269539@N04/27276000761,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n9e30b2ec04142ebd,https://c1.staticflickr.com/6/5753/31032656762_f4578922c9_o.jpg,0.0,0.0,0.75,1.0,699,417,https://www.flickr.com/photos/gillyberlin/31032656762,https://creativecommons.org/licenses/by/2.0/,GillyBerlin,https://www.flickr.com/people/gillyberlin/\n9dcfedf3cc0862ab,https://c1.staticflickr.com/6/5701/29746322142_9a6c281ba1_o.jpg,0.0,0.0,0.75,1.0,442,391,https://www.flickr.com/photos/pekkatamminen/29746322142,https://creativecommons.org/licenses/by/2.0/,Pekka Tamminen,https://www.flickr.com/people/pekkatamminen/\nbe4bee6c43e54e47,https://c1.staticflickr.com/6/5466/30859392621_eb785ce742_o.jpg,0.0,0.25,0.501846381093,1.0,407,351,http://www.flickr.com/photos/43547009@N00/30859392621,https://creativecommons.org/licenses/by/2.0/,Alejandro,https://www.flickr.com/people/43547009@N00/\nd4e3b08465971619,https://c1.staticflickr.com/8/7179/26681656780_1e0d19f348_o.jpg,0.438671875,0.0,1.0,0.75,985,235,https://www.flickr.com/photos/winnie_pix/26681656780,https://creativecommons.org/licenses/by/2.0/,Winniepix,https://www.flickr.com/people/winnie_pix/\nbafa4667373a1286,https://c1.staticflickr.com/1/538/32078523355_776fc5de80_o.jpg,0.25,0.25,1.0,0.75,407,592,https://www.flickr.com/photos/turyddu/32078523355/,https://creativecommons.org/licenses/by/2.0/,Umberto Rotundo,https://www.flickr.com/people/turyddu/\nb510ff28897c3100,https://c1.staticflickr.com/8/7561/28011585260_f72227da85_o.jpg,0.333333333333,0.0,1.0,1.0,570,891,https://flickr.com/53301297@N00/28011585260,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\nb981d4224948b206,https://c1.staticflickr.com/9/8273/30254064241_f4b12aeb37_o.jpg,0.330396475771,0.0,0.991189427313,1.0,697,551,https://www.flickr.com/photos/futureshape/30254064241/,https://creativecommons.org/licenses/by/2.0/,Alexander Baxevanis,https://www.flickr.com/people/futureshape/\nd20abcd49252d42b,https://c1.staticflickr.com/9/8411/29649239123_148f61352d_o.jpg,0.210588633288,0.0,0.631765899865,0.75,948,231,https://www.flickr.com/photos/sonnnateteria/29649239123,https://creativecommons.org/licenses/by/2.0/,teteria sonnna,https://www.flickr.com/people/sonnnateteria/\nad0270bbe6dafa40,https://c1.staticflickr.com/9/8430/29096467574_af6a21a60d_o.jpg,0.0,0.25,0.75,1.0,663,661,https://www.flickr.com/photos/sparkfun/29096467574,https://creativecommons.org/licenses/by/2.0/,SparkFun Electronics,https://www.flickr.com/people/sparkfun/\n48a0ac67e7cfc0f9,https://c1.staticflickr.com/9/8256/29235027732_66af649b9c_o.jpg,0.28125,0.25,0.84375,1.0,478,912,https://flickr.com/85278812@N00/29235027732,https://creativecommons.org/licenses/by/2.0/,Robbie Sproule,https://www.flickr.com/people/robbie1/\n24d310963cfd1ff7,https://c1.staticflickr.com/9/8302/27819873934_187700d91b_o.jpg,0.0,0.0,0.75,0.75,771,581,https://www.flickr.com/photos/glorycycles/27819873934,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n3bf44aa16f15d0b0,https://c1.staticflickr.com/9/8513/29030464342_8828b02977_o.jpg,0.503303964758,0.0,1.0,0.75,822,894,https://www.flickr.com/photos/zengame/29030464342,https://creativecommons.org/licenses/by/2.0/,Zengame,https://www.flickr.com/people/zengame/\nd676a27058888617,https://c1.staticflickr.com/9/8850/28426831252_5f02775aab_o.jpg,0.0,0.0,0.75,1.0,980,905,https://www.flickr.com/photos/132627961@N05/28426831252,https://creativecommons.org/licenses/by/2.0/,David Koranda,https://www.flickr.com/people/132627961@N05/\ne19627a8178cf501,https://c1.staticflickr.com/8/7762/28506125400_90f142e9ef_o.jpg,0.464122137405,0.25,1.0,1.0,151,217,https://www.flickr.com/photos/ruthanddave/28506125400,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n4c873b6a36bdae54,https://c1.staticflickr.com/9/8610/28189876186_3b132ee134_o.jpg,0.511297376093,0.25,1.0,1.0,405,997,https://www.flickr.com/photos/8269539@N04/28189876186,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\nb6a242ce42ccd13d,https://c1.staticflickr.com/9/8318/29563297280_6ea6ffce9e_o.jpg,0.332842415317,0.0,0.99852724595,1.0,566,725,https://www.flickr.com/photos/carlwwycoff/29563297280,https://creativecommons.org/licenses/by/2.0/,Carl Wycoff,https://www.flickr.com/people/carlwwycoff/\n03655c6556dbdb4e,https://c1.staticflickr.com/9/8411/29079617804_652e5d37cb_o.jpg,0.0,0.0,0.763406940063,1.0,971,134,https://www.flickr.com/photos/lassennps/29079617804/,https://creativecommons.org/licenses/by/2.0/,LassenNPS,https://www.flickr.com/people/lassennps/\n8dc5dfcb4cc64a6f,https://c1.staticflickr.com/6/5343/30882511132_af87b1237c_o.jpg,0.25,0.25,0.75,1.0,693,772,https://www.flickr.com/photos/30478819@N08/30882511132,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n8f9449e6d3f6a12a,https://c1.staticflickr.com/6/5829/30181872674_4bdb4bc25e_o.jpg,0.28125,0.25,0.84375,1.0,769,469,https://www.flickr.com/photos/stmunchins/30181872674,https://creativecommons.org/licenses/by/2.0/,St Munchin&#x27;s College,https://www.flickr.com/people/stmunchins/\n30c833ae96a6997f,https://c1.staticflickr.com/1/321/31200560813_e1f17cf06d_o.jpg,0.333333333333,0.0,1.0,1.0,927,486,https://flickr.com/22539273@N00/31200560813,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\nae97448189bb089d,https://c1.staticflickr.com/8/7073/27230835866_5aa719c7e3_o.jpg,0.4375,0.0,1.0,0.75,968,898,https://www.flickr.com/photos/bloggers/27230835866,https://creativecommons.org/licenses/by/2.0/,Reynosa Blogs,https://www.flickr.com/people/bloggers/\n144304f20ba39d97,https://c1.staticflickr.com/6/5619/30846225612_64c015e272_o.jpg,0.28125,0.0,0.84375,0.75,577,509,https://www.flickr.com/photos/127226743@N02/30846225612,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n98ffec0ae4a6d215,https://c1.staticflickr.com/8/7356/27843169051_55fecd86d8_o.jpg,0.339207048458,0.0,1.0,1.0,437,216,https://www.flickr.com/photos/hugo90/27843169051,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n95e4af6b79bd74fc,https://c1.staticflickr.com/6/5615/30108004980_b2951526b8_o.jpg,0.267938931298,0.25,0.803816793893,1.0,971,166,https://www.flickr.com/photos/breveglieri/30108004980,https://creativecommons.org/licenses/by/2.0/,Alexandre Breveglieri,https://www.flickr.com/people/breveglieri/\n00d76e7ef19e08ad,https://c1.staticflickr.com/1/95/31463366221_b90feb65df_o.jpg,0.4375,0.25,1.0,1.0,821,236,https://www.flickr.com/photos/radarsmum67/31463366221/,https://creativecommons.org/licenses/by/2.0/,Radarsmum67,https://www.flickr.com/people/radarsmum67/\n6cce7cbac1683cf2,https://c1.staticflickr.com/9/8644/28776790660_3e811ed570_o.jpg,0.5,0.25,1.0,1.0,955,100,https://www.flickr.com/photos/scotnelson/28776790660,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n17f47a0e3bb96754,https://c1.staticflickr.com/9/8038/29105202850_287ce9570f_o.jpg,0.24882629108,0.0,1.0,1.0,771,598,https://www.flickr.com/photos/wastes/29105202850,https://creativecommons.org/licenses/by/2.0/,Charlotta Wasteson,https://www.flickr.com/people/wastes/\nd02d0ae658a628e5,https://c1.staticflickr.com/6/5768/30441129921_5dcdaf7a6c_o.jpg,0.4375,0.0,1.0,0.75,449,775,https://www.flickr.com/photos/59252954@N00/30441129921,https://creativecommons.org/licenses/by/2.0/,leo gonzales,https://www.flickr.com/people/leoglenn_g/\nedd4a965a698e866,https://c1.staticflickr.com/1/37/31389116192_4b946f1901_o.jpg,0.0,0.0,0.678571428571,1.0,354,659,https://www.flickr.com/photos/dkeats/31389116192/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n14bcfaf59509b017,https://c1.staticflickr.com/9/8439/29027344026_e43fba7f64_o.jpg,0.25,0.0,0.75,0.75,651,694,https://www.flickr.com/photos/jus10h/29027344026,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n0b13868a3095652f,https://c1.staticflickr.com/8/7778/29916689360_4ce0968e3c_o.jpg,0.0,0.0,1.0,0.75,498,795,http://www.flickr.com/photos/viewpix69/29916689360/,https://creativecommons.org/licenses/by/2.0/,Torsten Scholz,https://www.flickr.com/people/viewpix69/\n33feed2fc4ef971f,https://c1.staticflickr.com/9/8124/29135110804_65e75021d8_o.jpg,0.4375,0.0,1.0,0.75,818,874,https://flickr.com/78593866@N00/29135110804,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/\n03d16338f7d34ad6,https://c1.staticflickr.com/2/1710/26141490864_6f6de79a7e_o.jpg,0.0,0.0,0.75,1.0,11,278,https://www.flickr.com/photos/9750464@N02/26141490864,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\n25cef9f76c73f942,https://c1.staticflickr.com/9/8652/28399171265_e8e9650c60_o.jpg,0.249631811487,0.0,0.748895434462,0.75,985,420,https://www.flickr.com/photos/agenciabrasilia/28399171265,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n9264d69f33365511,https://c1.staticflickr.com/8/7668/27023854630_eb60c6362e_o.jpg,0.333333333333,0.0,1.0,1.0,785,900,https://www.flickr.com/photos/cogdog/27023854630,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n017907ab47d2a23b,https://c1.staticflickr.com/9/8676/30554124925_82699306c4_o.jpg,0.4375,0.0,1.0,0.75,835,457,https://www.flickr.com/photos/irekia/30554124925/,https://creativecommons.org/licenses/by/2.0/,Irekia,https://www.flickr.com/people/irekia/\n34a55472d3a3848e,https://c1.staticflickr.com/6/5557/31657826385_4703106576_o.jpg,0.0,0.0,0.5625,0.75,459,643,https://flickr.com/44048553@N03/31657826385,https://creativecommons.org/licenses/by/2.0/,Nacho,https://www.flickr.com/people/gonmi/\n7b066132a678899e,https://c1.staticflickr.com/9/8750/28855883982_ac616a3afe_o.jpg,0.0,0.25,0.5625,1.0,909,10,https://www.flickr.com/photos/wwworks/28855883982,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/\n9968d57cfb97183c,https://c1.staticflickr.com/6/5096/29527046893_02ab7d9e36_o.jpg,0.290633608815,0.0,0.871900826446,1.0,484,726,https://www.flickr.com/photos/sybarite48/29527046893/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n3f1b9bd1f998078c,https://c1.staticflickr.com/8/7110/28237263546_b6ed8481ec_o.jpg,0.5,0.25,1.0,1.0,581,127,https://www.flickr.com/photos/unb_agencia/28237263546,https://creativecommons.org/licenses/by/2.0/,Secom UnB,https://www.flickr.com/people/unb_agencia/\nbb6eae644b610271,https://c1.staticflickr.com/9/8770/28772005082_8df660284b_o.jpg,0.333333333333,0.0,1.0,1.0,922,927,https://www.flickr.com/photos/andyhay/28772005082,https://creativecommons.org/licenses/by/2.0/,Andy Hay,https://www.flickr.com/people/andyhay/\ne61c5de4b79cdd43,https://c1.staticflickr.com/4/3838/32772787800_f01219c220_o.jpg,0.0,0.190243902439,1.0,1.0,826,292,https://flickr.com/37922399@N05/32772787800,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\neb0272648289a1bb,https://c1.staticflickr.com/9/8456/29843300475_049df0d839_o.jpg,0.28125,0.0,0.84375,0.75,625,840,http://www.flickr.com/photos/publiclibrariesnsw/29843300475/,https://creativecommons.org/licenses/by/2.0/,State Library of NSW Public Library Services,https://www.flickr.com/people/publiclibrariesnsw/\nf8f8ac0b8c70545c,https://c1.staticflickr.com/8/7316/26245312523_d7bccfc875_o.jpg,0.25,0.0,1.0,0.75,108,84,https://www.flickr.com/photos/togawanderings/26245312523,https://creativecommons.org/licenses/by/2.0/,Thomas Galvez,https://www.flickr.com/people/togawanderings/\na99f4f1a627add6c,https://c1.staticflickr.com/6/5493/31201584201_c3434dc10c_o.jpg,0.418124006359,0.25,1.0,1.0,309,157,https://www.flickr.com/photos/gails_pictures/31201584201/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n7590e4076ffd211d,https://c1.staticflickr.com/8/7443/27081730733_3d6b808038_o.jpg,0.25,0.0,0.75,0.75,733,526,https://www.flickr.com/photos/yutakaseki/27081730733/,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/\n8d7763df68b4fce0,https://c1.staticflickr.com/4/3950/33195104895_cc8726992f_o.jpg,0.0,0.0,0.714503816794,1.0,683,456,https://www.flickr.com/photos/atoach/33195104895,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n021ff13fe44a0165,https://c1.staticflickr.com/9/8230/29208542631_f92d781b82_o.jpg,0.561781609195,0.0,0.936302681992,0.75,719,656,https://www.flickr.com/photos/davideastwell/29208542631/,https://creativecommons.org/licenses/by/2.0/,David Eastwell,https://www.flickr.com/people/davideastwell/\n2dd6c2c48dae1970,https://c1.staticflickr.com/9/8721/27901022944_0228c5126a_o.jpg,0.25,0.0,0.75,0.75,548,425,https://www.flickr.com/photos/126337928@N05/27901022944,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\nab5b0947144beb3e,https://c1.staticflickr.com/9/8814/28267120572_7b41d647f1_o.jpg,0.519869942197,0.0,1.0,0.75,683,460,https://www.flickr.com/photos/13476480@N07/28267120572,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\ndb61cf12b9c0da9b,https://c1.staticflickr.com/8/7716/26274696824_48ea930581_o.jpg,0.498159057437,0.25,0.996318114875,1.0,321,563,https://www.flickr.com/photos/ilouque/26274696824,https://creativecommons.org/licenses/by/2.0/,ilouque,https://www.flickr.com/people/ilouque/\n49891ab8d826b5e2,https://c1.staticflickr.com/9/8379/29397027366_8d5b965a65_o.jpg,0.0,0.0,0.561328125,0.75,780,919,https://www.flickr.com/photos/thoseguys119/29397027366,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n34a74efa49795808,https://c1.staticflickr.com/9/8680/27753912104_53c03eaf9c_o.jpg,0.28125,0.25,0.84375,1.0,459,348,https://flickr.com/24701549@N07/27753912104,https://creativecommons.org/licenses/by/2.0/,Spudgun67,https://www.flickr.com/people/24701549@N07/\nff83ee5de635fda6,https://c1.staticflickr.com/1/418/31553043064_69329766a9_o.jpg,0.0,0.0,0.5625,0.75,822,417,https://www.flickr.com/photos/davidstanleytravel/31553043064,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\nf3cc2fc0b4d59d0b,https://c1.staticflickr.com/8/7437/26933428346_1db8cdf627_o.jpg,0.0,0.0,0.5,0.75,752,637,https://flickr.com/142967625@N05/26933428346,https://creativecommons.org/licenses/by/2.0/,Joe Labrie,https://www.flickr.com/people/joe_labrie_photographe/\n6f927c97e925114c,https://c1.staticflickr.com/6/5743/30695984876_7954b22e18_o.jpg,0.260918674699,0.25,0.782756024096,1.0,404,767,https://www.flickr.com/photos/usnavy/30695984876,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n14f62659ed234e96,https://c1.staticflickr.com/8/7329/26671886473_e9f9d9a9fa_o.jpg,0.4375,0.25,1.0,1.0,780,130,https://www.flickr.com/photos/thoseguys119/26671886473,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n600321f77c0d6499,https://c1.staticflickr.com/8/7419/27026335933_9113f3b770_o.jpg,0.0,0.25,0.5,1.0,913,307,https://www.flickr.com/photos/davebloggs007/27026335933,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\ne4c0df449d63eab4,https://c1.staticflickr.com/6/5834/29906759733_ec6cc2093f_o.jpg,0.0,0.0,0.5,0.75,608,753,https://www.flickr.com/photos/148525563@N02/29906759733/,https://creativecommons.org/licenses/by/2.0/,Paintimpact,https://www.flickr.com/people/148525563@N02/\n2a4185153f0f76fc,https://c1.staticflickr.com/9/8036/28980116746_1c3b6b320e_o.jpg,0.0,0.0,0.666666666667,1.0,662,118,https://www.flickr.com/photos/greggjerdingen/28980116746,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nfc5d1d8333f43c3d,https://c1.staticflickr.com/6/5574/30692208712_8db581a9fb_o.jpg,0.333333333333,0.0,1.0,1.0,629,828,https://www.flickr.com/photos/prayitnophotography/30692208712,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\n6ebbac35bc7977ac,https://c1.staticflickr.com/8/7622/27416626222_ffdf90d22a_o.jpg,0.28125,0.0,0.84375,0.75,947,1,https://www.flickr.com/photos/cogdog/27416626222,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nec28d2d65b5004cf,https://c1.staticflickr.com/1/498/32099970701_132b9382b2_o.jpg,0.331706281834,0.25,0.995118845501,1.0,851,265,https://www.flickr.com/photos/thepeachpeddler/32099970701,https://creativecommons.org/licenses/by/2.0/,thepeachpeddler,https://www.flickr.com/people/thepeachpeddler/\n4e87821bcecd7f66,https://c1.staticflickr.com/8/7329/26840543325_d36e6e71b7_o.jpg,0.421177266576,0.25,0.842354533153,1.0,986,587,https://www.flickr.com/photos/oimax/26840543325,https://creativecommons.org/licenses/by/2.0/,OiMax,https://www.flickr.com/people/oimax/\n134f6ad0a24213b7,https://c1.staticflickr.com/6/5682/31219759181_bffba8b0a2_o.jpg,0.5,0.0,1.0,0.75,405,470,https://www.flickr.com/photos/janitors/31219759181,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n2c2a7bb5f94900d6,https://c1.staticflickr.com/9/8121/29442152215_6ebbaf1149_o.jpg,0.0,0.25,0.5,1.0,231,275,https://www.flickr.com/photos/gotovan/29442152215,https://creativecommons.org/licenses/by/2.0/,GoToVan,https://www.flickr.com/people/gotovan/\n17305ce8e6a2b746,https://c1.staticflickr.com/9/8408/29045253574_7c05d0db84_o.jpg,0.0,0.0,0.5625,0.75,889,776,https://www.flickr.com/photos/msdi/29045253574/,https://creativecommons.org/licenses/by/2.0/,Matt Deegan,https://www.flickr.com/people/msdi/\n38f1ac45dc5481a7,https://c1.staticflickr.com/9/8015/29871385696_91f208cb52_o.jpg,0.578822733424,0.25,1.0,1.0,699,159,https://flickr.com/24215621@N08/29871385696,https://creativecommons.org/licenses/by/2.0/,Meraj Chhaya,https://www.flickr.com/people/merajchhaya/\nbedcd9af3d03feab,https://c1.staticflickr.com/1/735/32464237086_90200f8112_o.jpg,0.0,0.0,0.5625,0.75,780,879,https://www.flickr.com/photos/thoseguys119/32464237086,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nf1a10831d9706a79,https://c1.staticflickr.com/8/7510/26280667354_e5b09ea702_o.jpg,0.25,0.25,1.0,1.0,976,497,https://www.flickr.com/photos/gunnarsohn/26280667354,https://creativecommons.org/licenses/by/2.0/,gunnarsohn,https://www.flickr.com/people/gunnarsohn/\n17a424aa2a5c3b32,https://c1.staticflickr.com/9/8564/28956784346_be1b84ccc6_o.jpg,0.0,0.0,1.0,0.75,986,779,https://www.flickr.com/photos/gregoryjevyak/28956784346/,https://creativecommons.org/licenses/by/2.0/,Gregory Jevyak,https://www.flickr.com/people/gregoryjevyak/\nb5c4852bafd2354e,https://c1.staticflickr.com/9/8690/27852347033_587182503e_o.jpg,0.0,0.0,0.75,0.440443213296,922,9,https://www.flickr.com/photos/21022123@N04/27852347033,https://creativecommons.org/licenses/by/2.0/,Mike Steele,https://www.flickr.com/people/21022123@N04/\n5ba0fbb0af6c7273,https://c1.staticflickr.com/8/7316/26407410074_c50e5be30b_o.jpg,0.0,0.25,0.75,0.75,806,602,https://www.flickr.com/photos/claude_wians/26407410074,https://creativecommons.org/licenses/by/2.0/,Claude Wians,https://www.flickr.com/people/claude_wians/\ne0b447f9a4252571,https://c1.staticflickr.com/9/8256/29200615230_0f126b02e9_o.jpg,0.277173913043,0.0,0.83152173913,0.75,132,324,https://www.flickr.com/photos/sonstroem/29200615230,https://creativecommons.org/licenses/by/2.0/,Eric Sonstroem,https://www.flickr.com/people/sonstroem/\nb29368067328647a,https://c1.staticflickr.com/9/8034/29193460900_e0b08fdf16_o.jpg,0.346808510638,0.0,0.693617021277,1.0,976,548,https://www.flickr.com/photos/53113704@N03/29193460900/,https://creativecommons.org/licenses/by/2.0/,Traveltipy,https://www.flickr.com/people/53113704@N03/\nbee2de7fb160544d,https://c1.staticflickr.com/8/7189/26846345684_de05313350_o.jpg,0.0,0.0,1.0,1.0,78,64,https://www.flickr.com/photos/78428166@N00/26846345684/,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\n66c0d373c70f8015,https://c1.staticflickr.com/9/8254/28974234362_23b95ca707_o.jpg,0.333333333333,0.0,1.0,1.0,508,580,https://www.flickr.com/photos/stevendepolo/28974234362,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n70544e275547b8a1,https://c1.staticflickr.com/8/7096/26957429261_053ec6180d_o.jpg,0.0,0.0,0.75,1.0,479,513,https://www.flickr.com/photos/stephanridgway/26957429261,https://creativecommons.org/licenses/by/2.0/,Stephan Ridgway,https://www.flickr.com/people/stephanridgway/\nee89176569a567e2,https://c1.staticflickr.com/9/8396/29497075110_ef50a01051_o.jpg,0.0,0.0,0.666666666667,1.0,548,174,https://www.flickr.com/photos/shankaronline/29497075110,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\ne76f53cdf635a209,https://c1.staticflickr.com/9/8488/29802906881_086ed60ccb_o.jpg,0.250923190547,0.0,0.75276957164,0.75,95,323,https://www.flickr.com/photos/amslerpix/29802906881/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\nf2ad45c05e3cf873,https://c1.staticflickr.com/9/8513/29119075055_f0d1381268_o.jpg,0.5,0.0,1.0,0.75,651,428,https://www.flickr.com/photos/pahudson/29119075055,https://creativecommons.org/licenses/by/2.0/,Paul Hudson,https://www.flickr.com/people/pahudson/\ne0c61d59f84d37cf,https://c1.staticflickr.com/9/8751/28685123572_6a5f945066_o.jpg,0.267938931298,0.0,0.803816793893,0.75,484,425,https://www.flickr.com/photos/ruthanddave/28685123572,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\nbbc6f7a166452914,https://c1.staticflickr.com/6/5549/29442815984_3292570b59_o.jpg,0.46688034188,0.25,0.933760683761,1.0,292,337,https://www.flickr.com/photos/dkeats/29442815984/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n19271184f1f1d751,https://c1.staticflickr.com/4/3786/33387790516_b40cc72f9a_o.jpg,0.0,0.0,0.666666666667,1.0,426,402,https://flickr.com/92599451@N08/33387790516,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\n67ccbd8e8345fe8d,https://c1.staticflickr.com/9/8133/28737583983_c87c57c587_o.jpg,0.0,0.0,1.0,1.0,539,776,https://www.flickr.com/photos/arbron/28737583983/,https://creativecommons.org/licenses/by/2.0/,Jeff Hitchcock,https://www.flickr.com/people/arbron/\n2574554ebe47cf10,https://c1.staticflickr.com/9/8876/28750331626_d3fdbc5034_o.jpg,0.0,0.0,0.560452418097,0.75,763,489,https://www.flickr.com/photos/marsupilami92/28750331626,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\n5c08f5c085a4285b,https://c1.staticflickr.com/8/7306/28534172090_a2da903070_o.jpg,0.0,0.0,0.75,0.6,133,908,https://www.flickr.com/photos/83613432@N02/28534172090,https://creativecommons.org/licenses/by/2.0/,Vijay Sonar,https://www.flickr.com/people/83613432@N02/\nc388f7293a1da649,https://c1.staticflickr.com/9/8473/28858314990_36cec38ce6_o.jpg,0.25,0.25,0.75,1.0,561,645,https://www.flickr.com/photos/trainor/28858314990/,https://creativecommons.org/licenses/by/2.0/,John Trainor,https://www.flickr.com/people/trainor/\nd056bccb5bc3d5ea,https://c1.staticflickr.com/1/491/32544295592_7b0ce66975_o.jpg,0.0,0.0,0.5,0.75,342,119,https://www.flickr.com/photos/30478819@N08/32544295592,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n92cbae0f539f4693,https://c1.staticflickr.com/9/8061/29024020142_e19f01f64d_o.jpg,0.333333333333,0.0,1.0,1.0,638,328,https://flickr.com/73648413@N00/29024020142,https://creativecommons.org/licenses/by/2.0/,Spiky7,https://www.flickr.com/people/73648413@N00/\n57f3ffbed045a293,https://c1.staticflickr.com/9/8311/29353863945_04dcd8f0d0_o.jpg,0.25,0.0,0.75,0.75,920,750,https://www.flickr.com/photos/harshlight/29353863945,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\nb1f369e39c125e02,https://c1.staticflickr.com/6/5452/30922153735_8c66b9ab89_o.jpg,0.25,0.0,1.0,0.75,224,22,https://flickr.com/49503166727@N01/30922153735,https://creativecommons.org/licenses/by/2.0/,John Patrick Robichaud,https://www.flickr.com/people/troismarteaux/\nb8bf8c3d6cdaecde,https://c1.staticflickr.com/6/5790/30554621990_243d3265ab_o.jpg,0.0,0.25,0.5625,1.0,98,183,https://www.flickr.com/photos/29780474@N02/30554621990,https://creativecommons.org/licenses/by/2.0/,Phil Gayton,https://www.flickr.com/people/29780474@N02/\n366f064167c5071c,https://c1.staticflickr.com/8/7739/26795319412_51565c7978_o.jpg,0.28125,0.25,0.84375,1.0,820,518,https://www.flickr.com/photos/wfryer/26795319412,https://creativecommons.org/licenses/by/2.0/,Wesley Fryer,https://www.flickr.com/people/wfryer/\n17a36bd440bba152,https://c1.staticflickr.com/9/8844/27787418394_12d6f8873b_o.jpg,0.0,0.25,0.496908127208,1.0,669,893,https://www.flickr.com/photos/96223380@N02/27787418394,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/\n5902bb3969713da0,https://c1.staticflickr.com/1/751/31960401626_ba97b2f19d_o.jpg,0.49294205052,0.0,1.0,0.75,309,268,https://www.flickr.com/photos/42244964@N03/31960401626,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/\nf4a1349134800b4a,https://c1.staticflickr.com/9/8174/29688629145_fd8fdb33fd_o.jpg,0.0,0.0,0.5,0.75,108,270,https://www.flickr.com/photos/raita/29688629145,https://creativecommons.org/licenses/by/2.0/,Raita Futo,https://www.flickr.com/people/raita/\n438eeddd57911cdd,https://c1.staticflickr.com/6/5758/29568629304_fac76d6087_o.jpg,0.5,0.25,1.0,1.0,973,649,http://www.flickr.com/photos/gusjer/29568629304/,https://creativecommons.org/licenses/by/2.0/,Gusjer,https://www.flickr.com/people/gusjer/\n9293e446892a5b9a,https://c1.staticflickr.com/9/8737/28873981825_53dbb7b83a_o.jpg,0.25,0.0,0.75,0.75,808,587,https://www.flickr.com/photos/navfac/28873981825/,https://creativecommons.org/licenses/by/2.0/,NAVFAC,https://www.flickr.com/people/navfac/\n4de7adb41321d49c,https://c1.staticflickr.com/6/5739/30178169221_b5d9ecf006_o.jpg,0.0,0.0,0.665684830633,1.0,980,265,https://www.flickr.com/photos/142508741@N02/30178169221,https://creativecommons.org/licenses/by/2.0/,Bethany Ciullo,https://www.flickr.com/people/142508741@N02/\n99ff2bfd4401af43,https://c1.staticflickr.com/6/5778/30519007832_fe570da36f_o.jpg,0.281690140845,0.0,0.845070422535,0.75,969,30,https://www.flickr.com/photos/olgierd/30519007832/,https://creativecommons.org/licenses/by/2.0/,Olgierd Rudak,https://www.flickr.com/people/olgierd/\n586848951395c151,https://c1.staticflickr.com/3/2379/32937325125_0ca9653352_o.jpg,0.0,0.25,0.5,1.0,404,498,https://www.flickr.com/photos/usnavy/32937325125,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\ne89964025e14ed16,https://c1.staticflickr.com/6/5513/31444728725_14cfdc0481_o.jpg,0.0,0.333333333333,1.0,1.0,431,553,https://www.flickr.com/photos/viumariners/31444728725/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/\n5cd979f60ad807d1,https://c1.staticflickr.com/9/8394/28824871344_5e89b7f6f9_o.jpg,0.0,0.0,0.666666666667,1.0,512,807,https://www.flickr.com/photos/greggjerdingen/28824871344,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n5e781d29d1d9ec33,https://c1.staticflickr.com/8/7379/27681308100_1ba114ab34_o.jpg,0.0,0.0,1.0,1.0,441,640,https://www.flickr.com/photos/lucianosb/27681308100/,https://creativecommons.org/licenses/by/2.0/,Luciano Santa Br\\303\\255gida,https://www.flickr.com/people/lucianosb/\n11a00a7e8836eb67,https://c1.staticflickr.com/9/8526/28801804653_c20e74eac0_o.jpg,0.576662143826,0.25,1.0,1.0,625,521,https://www.flickr.com/photos/135302410@N02/28801804653,https://creativecommons.org/licenses/by/2.0/,Libraries Taskforce,https://www.flickr.com/people/135302410@N02/\n14f549f3bfefaa26,https://c1.staticflickr.com/1/514/32041709910_d2159999ff_o.jpg,0.0,0.0,0.666666666667,1.0,848,636,https://www.flickr.com/photos/quinet/32041709910,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nf0f0a9c5001f6a9d,https://c1.staticflickr.com/6/5497/31133802826_db88d6441e_o.jpg,0.0,0.25,0.75,1.0,458,203,http://www.flickr.com/photos/bwgtheatre/31133802826/,https://creativecommons.org/licenses/by/2.0/,Bradley Griffin,https://www.flickr.com/people/bwgtheatre/\nff00170e05a6a38f,https://c1.staticflickr.com/9/8812/28932828096_f2e58dcaee_o.jpg,0.498153618907,0.25,1.0,1.0,407,894,https://www.flickr.com/photos/eltb/28932828096,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n1c13b40577556c76,https://c1.staticflickr.com/6/5518/31210647845_5f0a341647_o.jpg,0.281165311653,0.0,0.843495934959,1.0,896,682,https://www.flickr.com/photos/13476480@N07/31210647845,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nc1cfa7a344be6daf,https://c1.staticflickr.com/6/5717/30635734392_81ebd97464_o.jpg,0.28125,0.25,0.84375,1.0,764,995,https://flickr.com/91672006@N00/30635734392,https://creativecommons.org/licenses/by/2.0/,George,https://www.flickr.com/people/jestermx6/\n0416d5920c3b9806,https://c1.staticflickr.com/3/2603/32902484582_f666d66817_o.jpg,0.25,0.0,0.75,0.75,868,33,https://www.flickr.com/photos/76969036@N02/32902484582/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\nad4db0136d8277ec,https://c1.staticflickr.com/9/8853/28851747732_f14ec7ed9f_o.jpg,0.600790513834,0.25,1.0,1.0,98,402,https://www.flickr.com/photos/mypubliclands/28851747732,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n5455592a7d774d3d,https://c1.staticflickr.com/8/7046/27289741452_68e8cfe6f1_o.jpg,0.25,0.25,1.0,1.0,581,891,https://www.flickr.com/photos/stella12/27289741452/,https://creativecommons.org/licenses/by/2.0/,Deb Nystrom,https://www.flickr.com/people/stella12/\n8b2fa75cb3ecc580,https://c1.staticflickr.com/9/8814/28367951616_fe55344bab_o.jpg,0.25,0.0,0.75,0.75,547,829,https://www.flickr.com/photos/arielffs/28367951616/,https://creativecommons.org/licenses/by/2.0/,Ariel Serr\\303\\243o,https://www.flickr.com/people/arielffs/\n4c94160866a3d277,https://c1.staticflickr.com/8/7582/30308176305_00a3371cd1_o.jpg,0.25,0.25,1.0,1.0,519,514,https://www.flickr.com/photos/glorycycles/30308176305,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n4ed92365fed79447,https://c1.staticflickr.com/1/289/31801486495_0de58c5047_o.jpg,0.5,0.0,1.0,0.75,763,492,https://www.flickr.com/photos/shankaronline/31801486495,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nfd4b703f0fb9ab17,https://c1.staticflickr.com/6/5823/30411394850_8ef41df41c_o.jpg,0.0,0.0,0.666666666667,1.0,450,161,https://www.flickr.com/photos/armyengineersnorfolk/30411394850/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Corps of Engineers Norfolk District,https://www.flickr.com/people/armyengineersnorfolk/\n0e8a179c8dc287f2,https://c1.staticflickr.com/1/501/32452931516_89a0e2bc90_o.jpg,0.4375,0.0,1.0,0.75,539,790,https://flickr.com/137698907@N06/32452931516,https://creativecommons.org/licenses/by/2.0/,Alain K.,https://www.flickr.com/people/alainnnn/\ne791cc299b503480,https://c1.staticflickr.com/8/7702/27240711726_c60dbfbd49_o.jpg,0.0,0.0,0.75,1.0,875,616,https://www.flickr.com/photos/sea_beach_express/27240711726,https://creativecommons.org/licenses/by/2.0/,Kristain Baty,https://www.flickr.com/people/sea_beach_express/\n9d3c7fb7cb85807c,https://c1.staticflickr.com/6/5512/30142002643_ee002ccf38_o.jpg,0.496696035242,0.25,0.993392070485,1.0,258,188,https://www.flickr.com/photos/aikos/30142002643,https://creativecommons.org/licenses/by/2.0/,\"Aiko, Thomas &amp; Juliette+Isaac\",https://www.flickr.com/people/aikos/\nf66a66c282bc2904,https://c1.staticflickr.com/8/7562/27330548053_a754529490_o.jpg,0.5,0.0,1.0,0.75,719,112,https://www.flickr.com/photos/voyagesetc/27330548053,https://creativecommons.org/licenses/by/2.0/,Voyages etc...,https://www.flickr.com/people/voyagesetc/\n4f9f47f238ee29a5,https://c1.staticflickr.com/4/3797/32550901900_6f7e67f00a_o.jpg,0.0,0.25,0.499263622975,1.0,519,119,https://www.flickr.com/photos/box_repsol/32550901900,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\neeaa4734c75429aa,https://c1.staticflickr.com/8/7492/26882350345_9f107e8e35_o.jpg,0.450630252101,0.25,0.901260504202,1.0,675,129,https://www.flickr.com/photos/johnloo/26882350345,https://creativecommons.org/licenses/by/2.0/,John Loo,https://www.flickr.com/people/johnloo/\n377dfa614f9e4a44,https://c1.staticflickr.com/9/8712/28676597230_f0c94af9f5_o.jpg,0.0,0.0,0.5,0.75,896,646,https://www.flickr.com/photos/elsie/28676597230/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\n321d735ada1cc89a,https://c1.staticflickr.com/9/8852/28964824665_e511c35cf7_o.jpg,0.25,0.250923190547,1.0,0.75276957164,407,600,https://www.flickr.com/photos/eltb/28964824665,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n8eb3aebd4c3d03b4,https://c1.staticflickr.com/8/7780/26890242371_03210b59dc_o.jpg,0.0,0.0,0.75,1.0,738,449,https://www.flickr.com/photos/jeepersmedia/26890242371,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n6499b534cc8f94d8,https://c1.staticflickr.com/8/7199/26651969714_4a2e6a967b_o.jpg,0.333333333333,0.0,1.0,1.0,725,91,https://www.flickr.com/photos/shadowgate/26651969714,https://creativecommons.org/licenses/by/2.0/,Shadowgate,https://www.flickr.com/people/shadowgate/\n8abffdf3c1f4c3fe,https://c1.staticflickr.com/8/7423/27573996582_2d7b4926ee_o.jpg,0.452546296296,0.25,1.0,1.0,281,314,https://www.flickr.com/photos/wildreturn/27573996582,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\n8684432e7bfbc535,https://c1.staticflickr.com/6/5595/31341526316_c7b75d2a23_o.jpg,0.5,0.25,1.0,1.0,95,756,https://www.flickr.com/photos/yutakaseki/31341526316,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/\n41461b5e0ccdc416,https://c1.staticflickr.com/6/5760/30815853572_038a4856f8_o.jpg,0.0,0.25,0.5,1.0,990,862,https://flickr.com/58827557@N06/30815853572,https://creativecommons.org/licenses/by/2.0/,Clint Budd,https://www.flickr.com/people/58827557@N06/\nd552f351dff8db55,https://c1.staticflickr.com/1/618/32475615442_0dc4cc26c5_o.jpg,0.28125,0.25,0.84375,1.0,875,988,https://flickr.com/92627106@N02/32475615442,https://creativecommons.org/licenses/by/2.0/,Alex Swanston&#x27;s Bus Photos,https://www.flickr.com/people/aswans1234567/\n5bc0e1768f05ec70,https://c1.staticflickr.com/8/7221/26957895830_957e7dfcf3_o.jpg,0.279641185647,0.25,0.838923556942,1.0,979,817,https://www.flickr.com/photos/jared422/26957895830,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/\n6e5258ea94ec0da6,https://c1.staticflickr.com/8/7323/27287712224_12dd1d471a_o.jpg,0.0,0.0,0.662261380323,1.0,4,334,https://www.flickr.com/photos/shankaronline/27287712224,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n0efdda94fe6c721e,https://c1.staticflickr.com/3/2319/32230202894_eb75325bf5_o.jpg,0.5,0.0,1.0,0.75,568,451,https://www.flickr.com/photos/yourbestdigs/32230202894,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\n71bd5cbcdfa36f8c,https://c1.staticflickr.com/8/7536/28459810983_7b3a739f07_o.jpg,0.25,0.25,0.75,1.0,437,833,https://www.flickr.com/photos/greggjerdingen/28459810983,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nf68d779351925e3d,https://c1.staticflickr.com/6/5649/30981210032_2a37c26e68_o.jpg,0.5,0.0,1.0,0.75,470,295,https://www.flickr.com/photos/amslerpix/30981210032,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n3304024661dcd36f,https://c1.staticflickr.com/6/5733/29742054314_e20abaee34_o.jpg,0.0,0.0,0.75,0.75,866,487,https://www.flickr.com/photos/michperu/29742054314,https://creativecommons.org/licenses/by/2.0/,Manuel Iglesias,https://www.flickr.com/people/michperu/\n32d34ef25dfcab60,https://c1.staticflickr.com/3/2818/32998233562_e8e69083d3_o.jpg,0.0,0.332842415317,1.0,0.99852724595,870,224,http://flickr.com/photos/95116426@N07/32998233562,https://creativecommons.org/licenses/by/2.0/,stellahyc910,https://www.flickr.com/people/stellahyc/\n755cad2db75470e8,https://c1.staticflickr.com/9/8748/28749471122_fc30e73ed4_o.jpg,0.0,0.0,1.0,0.918685121107,806,161,https://flickr.com/18206869@N04/28749471122,https://creativecommons.org/licenses/by/2.0/,Terry Gilbert,https://www.flickr.com/people/terrygil999/\n3b2423808e7f0cda,https://c1.staticflickr.com/1/700/31640113891_63f0d685ff_o.jpg,0.5,0.25,1.0,1.0,469,808,https://www.flickr.com/photos/greggjerdingen/31640113891,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n40fa67f6e533a165,https://c1.staticflickr.com/6/5531/31296767702_64a637505a_o.jpg,0.497411242604,0.0,1.0,0.75,144,780,https://www.flickr.com/photos/winnu/31296767702/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/\n4666fb1de28146a4,https://c1.staticflickr.com/1/583/30829582303_a689db9ee8_o.jpg,0.28125,0.0,0.84375,0.75,848,977,https://www.flickr.com/photos/mohit_s/30829582303,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/\ne869526a63cfc3e1,https://c1.staticflickr.com/9/8306/29689204702_495bd5fe91_o.jpg,0.0,0.25,0.5,1.0,819,782,https://www.flickr.com/photos/abbers13/29689204702/,https://creativecommons.org/licenses/by/2.0/,Abby Gillardi,https://www.flickr.com/people/abbers13/\nf63487f987f90319,https://c1.staticflickr.com/1/426/32770801112_feea4890f7_o.jpg,0.5,0.25,1.0,1.0,885,658,https://www.flickr.com/photos/jlascar/32770801112,https://creativecommons.org/licenses/by/2.0/,Jorge L\\303\\241scar,https://www.flickr.com/people/jlascar/\n5ddf15933fecf87d,https://c1.staticflickr.com/1/601/31790181832_f1664b5a0a_o.jpg,0.25,0.4375,1.0,1.0,667,220,https://www.flickr.com/photos/nano/31790181832,https://creativecommons.org/licenses/by/2.0/,Nano Taboada,https://www.flickr.com/people/nano/\n6e1f4df97b7f31ef,https://c1.staticflickr.com/9/8465/29378948232_23b0cbf7a7_o.jpg,0.5,0.0,1.0,0.75,718,288,https://www.flickr.com/photos/greggjerdingen/29378948232,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n0349edaef07bd804,https://c1.staticflickr.com/6/5832/30317363392_6f408833e2_o.jpg,0.421177266576,0.0,0.842354533153,0.75,522,422,https://www.flickr.com/photos/rdecom/30317363392,https://creativecommons.org/licenses/by/2.0/,U.S. Army RDECOM,https://www.flickr.com/people/rdecom/\nd3ca4c92740a9287,https://c1.staticflickr.com/6/5713/30496470730_6d8206183b_o.jpg,0.0,0.0,0.75,0.5,684,365,https://www.flickr.com/photos/29621494@N02/30496470730/,https://creativecommons.org/licenses/by/2.0/,Paula  R. Lively,https://www.flickr.com/people/29621494@N02/\n82d659d80b4c3dee,https://c1.staticflickr.com/6/5574/31368541855_f09e45b7e0_o.jpg,0.25,0.25,1.0,1.0,550,34,https://www.flickr.com/photos/103707855@N05/31368541855/,https://creativecommons.org/licenses/by/2.0/,J R,https://www.flickr.com/people/103707855@N05/\ne70505caa5782d6d,https://c1.staticflickr.com/8/7565/28983036915_6484d5e35d_o.jpg,0.497411242604,0.25,1.0,1.0,459,948,https://www.flickr.com/photos/discoveroregon/28983036915,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\nbef51c7bf48a1ce3,https://c1.staticflickr.com/8/7296/26825150301_d3098368ae_o.jpg,0.5,0.0,1.0,0.75,763,902,https://www.flickr.com/photos/hisgett/26825150301,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n8baec6c6491d00ee,https://c1.staticflickr.com/9/8606/28920694626_1c94c32e6c_o.jpg,0.28125,0.25,0.84375,1.0,477,622,http://www.flickr.com/photos/lauriej/28920694626/,https://creativecommons.org/licenses/by/2.0/,Laura James,https://www.flickr.com/people/lauriej/\n311ffc1b7d3f9eac,https://c1.staticflickr.com/8/7140/26505155423_24468659df_o.jpg,0.0,0.0,0.508928571429,0.75,780,339,https://www.flickr.com/photos/113306963@N05/26505155423,https://creativecommons.org/licenses/by/2.0/,travelmag.com,https://www.flickr.com/people/113306963@N05/\n9829ee285a6775ca,https://c1.staticflickr.com/6/5592/30626812420_b1e7f8f7bd_o.jpg,0.332,0.0,1.0,1.0,940,170,https://flickr.com/142171482@N06/30626812420,https://creativecommons.org/licenses/by/2.0/,Med Coolman,https://www.flickr.com/people/uwlideas/\nfe5964afb8b1d97f,https://c1.staticflickr.com/8/7429/27610091791_2df0a0f175_o.jpg,0.25,0.0,1.0,0.75,108,968,https://flickr.com/76738608@N08/27610091791,https://creativecommons.org/licenses/by/2.0/,Christian Gloor,https://www.flickr.com/people/christian_gloor/\nd29b2a50389cc1bf,https://c1.staticflickr.com/6/5612/30563379813_9b9fa28793_o.jpg,0.0,0.0,0.666666666667,1.0,209,143,https://www.flickr.com/photos/brian_tomlinson/30563379813,https://creativecommons.org/licenses/by/2.0/,Brian Tomlinson,https://www.flickr.com/people/brian_tomlinson/\nfeb118a79463b92c,https://c1.staticflickr.com/8/7409/27889221781_0b8f3ba708_o.jpg,0.419028340081,0.25,0.838056680162,1.0,896,612,https://www.flickr.com/photos/hisgett/27889221781/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\ncdb921ec7f0ca0bf,https://c1.staticflickr.com/8/7280/26918563512_2148165c4e_o.jpg,0.330871491876,0.0,1.0,1.0,512,240,https://www.flickr.com/photos/hugo90/26918563512,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n2a74d420e819e63a,https://c1.staticflickr.com/6/5347/30574753022_83fc3521e1_o.jpg,0.4375,0.25,1.0,1.0,780,555,https://www.flickr.com/photos/thoseguys119/30574753022,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\neeed39b34d06db49,https://c1.staticflickr.com/1/114/31129373910_5146a70b31_o.jpg,0.0977701543739,0.0,1.0,1.0,407,892,https://flickr.com/98826299@N00/31129373910,https://creativecommons.org/licenses/by/2.0/,Deb Nystrom,https://www.flickr.com/people/stella12/\ne64dc418e4347581,https://c1.staticflickr.com/3/2882/33134685245_8f75bb8d0c_o.jpg,0.250923190547,0.25,0.75276957164,1.0,405,774,https://www.flickr.com/photos/barteq24/33134685245/,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/\nd3173f530afd7cf1,https://c1.staticflickr.com/6/5145/29542043444_ab9ffe2fc2_o.jpg,0.494444444444,0.0,1.0,0.75,706,235,https://www.flickr.com/photos/tutenkhamunsleeping/29542043444,https://creativecommons.org/licenses/by/2.0/,Steve Jones,https://www.flickr.com/people/tutenkhamunsleeping/\nf7efcce46489f5df,https://c1.staticflickr.com/8/7275/26921092445_d5460572da_o.jpg,0.284198113208,0.25,0.852594339623,1.0,293,758,https://www.flickr.com/photos/pokerbrit/26921092445,https://creativecommons.org/licenses/by/2.0/,Steve Wilson - over 8 million views Thanks !!,https://www.flickr.com/people/pokerbrit/\n97e95848008c6e48,https://c1.staticflickr.com/6/5256/29292934334_a6649a6698_o.jpg,0.0,0.0,0.5625,0.75,686,868,https://www.flickr.com/photos/zombieite/29292934334,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/\nb31309b3aea0b4d8,https://c1.staticflickr.com/1/411/31753373286_eb2a0863ee_o.jpg,0.25,0.25,0.75,1.0,542,686,https://www.flickr.com/photos/quinet/31753373286,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nc7fbd05709d295c4,https://c1.staticflickr.com/1/619/32672839855_3562147962_o.jpg,0.25,0.0,0.75,0.75,821,354,https://www.flickr.com/photos/8269539@N04/32672839855,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\nbacaf550b57c54a8,https://c1.staticflickr.com/1/739/31814487031_cfc3d03ae5_o.jpg,0.0,0.0730434782609,1.0,1.0,806,700,https://flickr.com/143135875@N03/31814487031,https://creativecommons.org/licenses/by/2.0/,Save the Dream,https://www.flickr.com/people/143135875@N03/\n9011236561e23d43,https://c1.staticflickr.com/9/8861/28294633891_4a8e5f7653_o.jpg,0.495555555556,0.25,1.0,1.0,405,472,https://www.flickr.com/photos/barteq24/28294633891,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/\n3f25632667c42f4c,https://c1.staticflickr.com/8/7402/26680455234_e0840a02f6_o.jpg,0.0,0.25,0.75,1.0,502,208,https://www.flickr.com/photos/7749076@N07/26680455234/,https://creativecommons.org/licenses/by/2.0/,Jason Campbell,https://www.flickr.com/people/7749076@N07/\na7be100325aa1918,https://c1.staticflickr.com/9/8413/30113636550_9bf6766449_o.jpg,0.0,0.25,0.489416058394,1.0,507,773,https://www.flickr.com/photos/magdalenaroeseler/30113636550,https://creativecommons.org/licenses/by/2.0/,Magdalena Roeseler,https://www.flickr.com/people/magdalenaroeseler/\n806b5f9a24c0a8b2,https://c1.staticflickr.com/8/7658/27425514584_047975d793_o.jpg,0.4375,0.25,1.0,1.0,108,677,https://www.flickr.com/photos/jimg944/27425514584/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n2970b5fe8a8c02ec,https://c1.staticflickr.com/1/180/31511763076_6efa641dda_o.jpg,0.0,0.25,0.5,1.0,438,933,https://www.flickr.com/photos/taxdesign/31511763076/,https://creativecommons.org/licenses/by/2.0/,Danny  Tax,https://www.flickr.com/people/taxdesign/\nca5d2b03728816db,https://c1.staticflickr.com/6/5676/22839233878_73e7df7656_o.jpg,0.4375,0.25,1.0,1.0,737,672,https://flickr.com/126953417@N02/22839233878,https://creativecommons.org/licenses/by/2.0/,Philip Terry Graham,https://www.flickr.com/people/philipterrygraham/\ne4bdf7d7ff8d3150,https://c1.staticflickr.com/6/5747/30972192330_8c41740711_o.jpg,0.248348017621,0.25,0.745044052863,1.0,706,874,http://www.flickr.com/photos/the_mechanic_in_line/30972192330/,https://creativecommons.org/licenses/by/2.0/,Ignacio  Olmedo Godoy,https://www.flickr.com/people/the_mechanic_in_line/\n9b5ae5eb14277ea8,https://c1.staticflickr.com/8/7752/28307651151_2d17204b8d_o.jpg,0.0,0.25,0.5,1.0,147,566,https://www.flickr.com/photos/blachswan/28307651151,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\nda08f6663bd5560c,https://c1.staticflickr.com/8/7153/26452071503_745cc6fef3_o.jpg,0.25,0.296147672552,1.0,0.888443017657,539,478,https://www.flickr.com/photos/seattlemunicipalarchives/26452071503,https://creativecommons.org/licenses/by/2.0/,Seattle Municipal Archives,https://www.flickr.com/people/seattlemunicipalarchives/\n6b536636db03368a,https://c1.staticflickr.com/8/7545/27367428633_2596f3be8a_o.jpg,0.484397677794,0.0,0.968795355588,0.75,441,808,https://flickr.com/86063712@N00/27367428633,https://creativecommons.org/licenses/by/2.0/,dirvish,https://www.flickr.com/people/dirvish/\ne7427e0bf38005df,https://c1.staticflickr.com/9/8429/28724493290_6ac79c4ca6_o.jpg,0.25,0.25,0.75,1.0,662,775,https://www.flickr.com/photos/greggjerdingen/28724493290/?map=1,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nfad49974eb07371c,https://c1.staticflickr.com/8/7392/27314374504_71336526b3_o.jpg,0.25,0.0,1.0,1.0,522,274,https://www.flickr.com/photos/jeepersmedia/27314374504,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n47619046827f497b,https://c1.staticflickr.com/8/7401/28010170156_3362652e6e_o.jpg,0.25,0.0,0.75,0.75,896,768,https://www.flickr.com/photos/markyharky/28010170156,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\nba5ce414717dcdf4,https://c1.staticflickr.com/9/8809/29551063606_a4a3ddbb1c_o.jpg,0.217975206612,0.25,0.653925619835,1.0,780,136,https://www.flickr.com/photos/thoseguys119/29551063606,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nd7c273e136422d51,https://c1.staticflickr.com/8/7680/26913585804_0ec8d20edb_o.jpg,0.0,0.25,0.5625,1.0,484,696,https://www.flickr.com/photos/quinet/26913585804,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\ncc2e9d6cf38bc353,https://c1.staticflickr.com/8/7356/27287752883_44af3c5fdd_o.jpg,0.503303964758,0.25,1.0,1.0,821,887,https://www.flickr.com/photos/shankaronline/27287752883,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n75d8d5c5266243ef,https://c1.staticflickr.com/2/1489/26164565684_1d4f64e383_o.jpg,0.0,0.0,0.535877862595,0.75,404,470,https://www.flickr.com/photos/navcent/26164565684,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/\n655c354a4bb88d84,https://c1.staticflickr.com/9/8067/28759280910_33db0e70c1_o.jpg,0.25,0.25,0.75,1.0,820,691,https://www.flickr.com/photos/janitors/28759280910,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n6e1cf5c882663565,https://c1.staticflickr.com/1/448/32597453005_d8558f8717_o.jpg,0.0,0.25,0.5,1.0,411,496,https://flickr.com/54602205@N00/32597453005,https://creativecommons.org/licenses/by/2.0/,Richard Elzey,https://www.flickr.com/people/elzey/\n1dfc1acdb562105b,https://c1.staticflickr.com/9/8139/29237132001_5e28454fa3_o.jpg,0.246162280702,0.25,0.738486842105,1.0,22,166,https://www.flickr.com/photos/usfwsmtnprairie/29237132001/,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n5f0cf2c7c1a6f623,https://c1.staticflickr.com/6/5576/31209185091_98718db14c_o.jpg,0.0,0.0,0.75,1.0,526,105,https://www.flickr.com/photos/rainsong/31209185091,https://creativecommons.org/licenses/by/2.0/,Ali - \\330\\271\\331\\204\\331\\212 from Riyadh - \\331\\205\\331\\206 \\330\\247\\331\\204\\330\\261\\331\\212\\330\\247\\330\\266,https://www.flickr.com/people/rainsong/\n54e70afd9d5d2bd8,https://c1.staticflickr.com/8/7541/27009353743_b4abeb7276_o.jpg,0.333333333333,0.0,1.0,1.0,24,776,https://www.flickr.com/photos/michalnovota/27009353743,https://creativecommons.org/licenses/by/2.0/,Michal Novota,https://www.flickr.com/people/michalnovota/\nd425b4c35b0bffa6,https://c1.staticflickr.com/3/2847/32761085782_a83af860ee_o.jpg,0.0,0.25,0.496696035242,1.0,20,685,https://www.flickr.com/photos/sybarite48/32761085782/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n8ec46b8728b0a0f8,https://c1.staticflickr.com/8/7046/26403140404_9759757020_o.jpg,0.4375,0.0,1.0,0.75,820,634,https://flickr.com/28204245@N00/26403140404,https://creativecommons.org/licenses/by/2.0/,Paul Chan,https://www.flickr.com/people/paulstudio/\n466a2149f63b1949,https://c1.staticflickr.com/6/5470/30033515491_cd82a09340_o.jpg,0.0,0.0,0.5892,0.75,947,607,https://www.flickr.com/photos/vastateparksstaff/30033515491,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n771d639d9ff131bb,https://c1.staticflickr.com/1/498/31746241953_09452eb796_o.jpg,0.0,0.0,0.75,1.0,916,408,https://www.flickr.com/photos/ruthanddave/31746241953/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n10bf22cfe599aee1,https://c1.staticflickr.com/8/7197/27566877611_2ee48e2145_o.jpg,0.28125,0.0,0.84375,0.75,277,991,https://www.flickr.com/photos/evilnickname/27566877611/,https://creativecommons.org/licenses/by/2.0/,William,https://www.flickr.com/people/evilnickname/\n3d80dee908866b85,https://c1.staticflickr.com/6/5822/30804987095_216428b0f2_o.jpg,0.0,0.0,0.567503924647,0.75,12,53,https://www.flickr.com/photos/kjfnjy/30804987095/,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/\n6ccaa665bb65d289,https://c1.staticflickr.com/8/7541/30062492555_0b05cef0d8_o.jpg,0.0,0.0,1.0,1.0,964,58,http://www.flickr.com/photos/visentico/30062492555/,https://creativecommons.org/licenses/by/2.0/,Sento,https://www.flickr.com/people/visentico/\nbe152f981a1c5d67,https://c1.staticflickr.com/9/8735/28462952096_c853276ddb_o.jpg,0.0,0.399030694669,0.75,1.0,820,432,https://www.flickr.com/photos/rarvesen/28462952096/,https://creativecommons.org/licenses/by/2.0/,Ralph Arvesen,https://www.flickr.com/people/rarvesen/\n66dabc3fd9ce2e61,https://c1.staticflickr.com/4/3794/33190900506_fedfdec1c5_o.jpg,0.259962406015,0.25,0.779887218045,1.0,780,59,https://www.flickr.com/photos/thoseguys119/33190900506,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n3ce1dba657c636da,https://c1.staticflickr.com/9/8192/29514827695_94faca8008_o.jpg,0.25,0.0,0.75,0.75,699,582,https://www.flickr.com/photos/soso__1991/29514827695/,https://creativecommons.org/licenses/by/2.0/,SALoOM,https://www.flickr.com/people/soso__1991/\ndc79ef0b67dc3fd6,https://c1.staticflickr.com/8/7392/26935774985_48d980a590_o.jpg,0.0,0.0,0.5,0.75,413,728,https://www.flickr.com/photos/blumenbiene/26935774985,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\n0bbfab51568d2ce4,https://c1.staticflickr.com/1/449/31031697963_936db8af83_o.jpg,0.0,0.0,0.75,0.694010416667,662,601,https://www.flickr.com/photos/hisgett/31031697963,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n05b325bbeec76da5,https://c1.staticflickr.com/1/713/31671929494_068b02b44d_o.jpg,0.25,0.25,0.75,1.0,832,662,https://flickr.com/50979393@N00/31671929494,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/\n1143966d5d65eea4,https://c1.staticflickr.com/2/1664/26488921110_8817700ea6_o.jpg,0.231711647727,0.0,0.695134943182,0.75,556,195,https://www.flickr.com/photos/kansasscanner/26488921110,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\n0141152633bc75ef,https://c1.staticflickr.com/6/5321/31234310632_1d1c57e264_o.jpg,0.0,0.0,0.462110481586,0.75,763,453,https://www.flickr.com/photos/keyslibraries/31234310632,https://creativecommons.org/licenses/by/2.0/,Florida Keys--Public Libraries,https://www.flickr.com/people/keyslibraries/\n2ae7111d7768957e,https://c1.staticflickr.com/8/7346/28024404191_0279c9c85f_o.jpg,0.0,0.0,1.0,1.0,976,227,https://www.flickr.com/photos/church4u2/28024404191,https://creativecommons.org/licenses/by/2.0/,Church Iglesia,https://www.flickr.com/people/church4u2/\n10306582446b961f,https://c1.staticflickr.com/6/5784/30911990046_cfec141bcb_o.jpg,0.28125,0.0,0.84375,0.75,566,711,https://www.flickr.com/photos/railwayofaustralia/30911990046/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/\n07cd1d5ab8276a5f,https://c1.staticflickr.com/8/7380/26869354885_0f6f16a5da_o.jpg,0.0,0.332842415317,1.0,0.99852724595,653,720,https://www.flickr.com/photos/carlwwycoff/26869354885,https://creativecommons.org/licenses/by/2.0/,Carl Wycoff,https://www.flickr.com/people/carlwwycoff/\nf516a993bb170b32,https://c1.staticflickr.com/9/8683/28462538762_5f1af9889c_o.jpg,0.500736377025,0.0,1.0,0.75,196,355,https://www.flickr.com/photos/jlarnos/28462538762,https://creativecommons.org/licenses/by/2.0/,Jaro Larnos,https://www.flickr.com/people/jlarnos/\nc29d046d9fca4d54,https://c1.staticflickr.com/4/3755/32700569161_88d736320c_o.jpg,0.25,0.249079528719,1.0,0.747238586156,709,737,https://www.flickr.com/photos/davehamster/32700569161,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\ne5c54075d9d8927f,https://c1.staticflickr.com/8/7619/26961402502_0361f62ccd_o.jpg,0.25,0.0,1.0,0.5,595,896,https://www.flickr.com/photos/dierkschaefer/26961402502,https://creativecommons.org/licenses/by/2.0/,dierk schaefer,https://www.flickr.com/people/dierkschaefer/\n1e1385d9e6a4159b,https://c1.staticflickr.com/8/7203/27045271136_e94bee79d5_o.jpg,0.28125,0.25,0.84375,1.0,469,244,https://www.flickr.com/photos/transitomedellin/27045271136,https://creativecommons.org/licenses/by/2.0/,Secretar\\303\\255a de Movilidad de Medell\\303\\255n,https://www.flickr.com/people/transitomedellin/\n1b8308f5029417d9,https://c1.staticflickr.com/9/8629/28283833636_e29fa29b24_o.jpg,0.25,0.0,0.75,0.75,821,685,https://www.flickr.com/photos/harshlight/28283833636,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\nc02fcb7ea4c53795,https://c1.staticflickr.com/8/7660/27519280881_f07dd53c53_o.jpg,0.4375,0.0,1.0,0.75,938,508,https://www.flickr.com/photos/stevendepolo/27519280881,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n6c3deea4e44ab653,https://c1.staticflickr.com/9/8267/30181925371_6961146f5d_o.jpg,0.0,0.0,0.5625,0.75,875,532,https://www.flickr.com/photos/69203347@N03/30181925371,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n8c5c46d627350cb2,https://c1.staticflickr.com/9/8402/29785292081_2b98d09bf4_o.jpg,0.4375,0.25,1.0,1.0,780,59,https://www.flickr.com/photos/thoseguys119/29785292081/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n6cee243f4eb866ee,https://c1.staticflickr.com/6/5836/29954732810_b19a71d3fa_o.jpg,0.316901408451,0.0,0.633802816901,0.75,780,718,https://www.flickr.com/photos/thoseguys119/29954732810,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n4b1c01b84f5167a6,https://c1.staticflickr.com/8/7323/27472130946_e27724f827_o.jpg,0.496696035242,0.0,0.993392070485,0.75,719,501,https://www.flickr.com/photos/30478819@N08/27472130946/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\nddbf1ee557f77c8f,https://c1.staticflickr.com/1/648/32452427125_ac93e260f6_o.jpg,0.0,0.315948275862,0.75,1.0,592,838,https://flickr.com/23563006@N08/32452427125,https://creativecommons.org/licenses/by/2.0/,Phoebe Baker,https://www.flickr.com/people/phoebe_photo/\n540ff3106328fb06,https://c1.staticflickr.com/9/8162/29052256586_9d6ebd8098_o.jpg,0.297202797203,0.25,1.0,1.0,114,385,https://www.flickr.com/photos/gails_pictures/29052256586,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\na92cfbea5e0b75d8,https://c1.staticflickr.com/6/5706/30664782196_58d4b17ba4_o.jpg,0.0,0.0,0.93031358885,1.0,694,746,https://www.flickr.com/photos/presidenciamx/30664782196/,https://creativecommons.org/licenses/by/2.0/,Presidencia de la Rep\\303\\272blica Mexicana,https://www.flickr.com/people/presidenciamx/\n8e5e859aec5aee1d,https://c1.staticflickr.com/1/520/31912025006_256075bb9b_o.jpg,0.0,0.282131661442,0.75,0.846394984326,569,1,https://flickr.com/16704083@N00/31912025006,https://creativecommons.org/licenses/by/2.0/,Dean Burkholder,https://www.flickr.com/people/sysdmg/\nf55b2d3c8a3f6b01,https://c1.staticflickr.com/8/7344/27390905245_783359335b_o.jpg,0.0,0.25,0.5,1.0,512,616,https://www.flickr.com/photos/42220226@N07/27390905245,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\nbee1a4859471c925,https://c1.staticflickr.com/8/7747/27755171703_15167aee54_o.jpg,0.2515625,0.0,1.0,1.0,526,722,http://www.flickr.com/photos/57385426@N02/27755171703,https://creativecommons.org/licenses/by/2.0/,Craig Dietrich,https://www.flickr.com/people/craigdietrich/\n5aa5accdf0eef6bd,https://c1.staticflickr.com/6/5347/30600979002_bcf45feae2_o.jpg,0.0,0.25,0.495594713656,1.0,972,761,https://flickr.com/14642507@N08/30600979002,https://creativecommons.org/licenses/by/2.0/,sasastro,https://www.flickr.com/people/sasastro/\n5981c45746185473,https://c1.staticflickr.com/1/666/32012851142_5dfc3765aa_o.jpg,0.284198113208,0.25,0.852594339623,1.0,320,938,https://flickr.com/47602497@N06/32012851142,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/\n6a4b272ba0d04cd4,https://c1.staticflickr.com/1/584/32383568621_69128645a5_o.jpg,0.0,0.25,0.5625,1.0,92,345,https://www.flickr.com/photos/garryknight/32383568621,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\ne4e23b2468da6c53,https://c1.staticflickr.com/8/7474/28124398135_4d80b17256_o.jpg,0.438671875,0.0,1.0,0.75,920,707,https://www.flickr.com/photos/summonedbyfells/28124398135,https://creativecommons.org/licenses/by/2.0/,summonedbyfells,https://www.flickr.com/people/summonedbyfells/\nddb826087156b9b6,https://c1.staticflickr.com/1/457/31635876315_85bd8bed6d_o.jpg,0.25,0.25,0.75,1.0,763,476,https://flickr.com/77742560@N06/31635876315,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n00705d85cfbd90c4,https://c1.staticflickr.com/9/8469/29455407801_5b7cddae68_o.jpg,0.25,0.0,1.0,0.75,518,275,https://www.flickr.com/photos/zouny/29455407801,https://creativecommons.org/licenses/by/2.0/,Johnny Ainsworth,https://www.flickr.com/people/zouny/\n00f01fa61f508f1e,https://c1.staticflickr.com/6/5487/30960566092_00e622b68f_o.jpg,0.0,0.25,0.5625,1.0,8,949,https://flickr.com/7706348@N04/30960566092,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/\nf53f31e6fc467034,https://c1.staticflickr.com/4/3948/32761528496_00daa6e9e2_o.jpg,0.421177266576,0.0,0.842354533153,0.75,968,468,https://www.flickr.com/photos/98302443@N00/32761528496,https://creativecommons.org/licenses/by/2.0/,Shalu Sharma,https://www.flickr.com/people/98302443@N00/\n59f2b67aef90b06b,https://c1.staticflickr.com/8/7292/27403707305_cfae38d0da_o.jpg,0.237068965517,0.25,0.711206896552,1.0,459,901,https://www.flickr.com/photos/usacetulsa/27403707305,https://creativecommons.org/licenses/by/2.0/,usacetulsa,https://www.flickr.com/people/usacetulsa/\n9cc6c08128e52e96,https://c1.staticflickr.com/8/7344/27472863954_ee3bc8af5b_o.jpg,0.4375,0.0,1.0,0.75,518,465,https://www.flickr.com/photos/zongo/27472863954,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\nf186c52c5b35ac6c,https://c1.staticflickr.com/8/7310/27704230212_7f76767693_o.jpg,0.25,0.25,1.0,1.0,546,688,https://www.flickr.com/photos/livepine/27704230212,https://creativecommons.org/licenses/by/2.0/,Chen Zhao,https://www.flickr.com/people/livepine/\n1480fff946815c2b,https://c1.staticflickr.com/1/414/30721436554_d3b55ff2f6_o.jpg,0.28125,0.0,0.84375,0.75,2,961,https://www.flickr.com/photos/dubster/30721436554/,https://creativecommons.org/licenses/by/2.0/,Dubi Kaufmann,https://www.flickr.com/people/dubster/\n928cc46fc78f9a87,https://c1.staticflickr.com/8/7716/27377479220_cca49fa619_o.jpg,0.0,0.0,0.786858974359,1.0,422,543,https://www.flickr.com/photos/martius/27377479220,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\n668ff3359bc32d67,https://c1.staticflickr.com/8/7355/26677194630_3ae87988a5_o.jpg,0.248713235294,0.25,0.746139705882,1.0,831,664,https://www.flickr.com/photos/agenciabrasilia/26677194630,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\na80c957522ae813d,https://c1.staticflickr.com/8/7057/27805938006_0e589fe1dc_o.jpg,0.25,0.0,1.0,1.0,133,795,https://www.flickr.com/photos/forest-and-kim/27805938006,https://creativecommons.org/licenses/by/2.0/,Forest Starr and Kim Starr,https://www.flickr.com/people/forest-and-kim/\nb47fbcf7946ff6de,https://c1.staticflickr.com/9/8002/29360869571_df0fd50e6a_o.jpg,0.0,0.0,0.561569688769,1.0,875,969,https://www.flickr.com/photos/9759010@N07/29360869571,https://creativecommons.org/licenses/by/2.0/,Ken,https://www.flickr.com/people/9759010@N07/\n66ea65f5ced3fa48,https://c1.staticflickr.com/9/8891/28275254376_267e9b549d_o.jpg,0.0,0.0,0.665684830633,1.0,896,624,https://www.flickr.com/photos/ronmacphotos/28275254376,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n058c9532549bc07e,https://c1.staticflickr.com/3/2512/33062077246_f2ae477983_o.jpg,0.0,0.0,0.75,1.0,699,916,https://www.flickr.com/photos/marsupilami92/33062077246,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\n479cc33ff3f131b3,https://c1.staticflickr.com/8/7398/28010163216_87055813f3_o.jpg,0.25,0.0,0.75,0.75,896,19,https://www.flickr.com/photos/markyharky/28010163216,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n62eb552e74fcadff,https://c1.staticflickr.com/8/7455/27853584870_21043d2e11_o.jpg,0.0,0.0,0.75,0.75,742,342,https://flickr.com/60944636@N00/27853584870,https://creativecommons.org/licenses/by/2.0/,el cajon yacht club,https://www.flickr.com/people/el_cajon_yacht_club/\nd3f8ba1305ee626d,https://c1.staticflickr.com/6/5617/29598952700_a2cbc28ac9_o.jpg,0.0,0.25,0.5625,1.0,976,148,https://www.flickr.com/photos/herry/29598952700/,https://creativecommons.org/licenses/by/2.0/,Herry Lawford,https://www.flickr.com/people/herry/\n30a0b3835965fb9f,https://c1.staticflickr.com/6/5649/30444954471_9e8f405c71_o.jpg,0.0,0.0,0.683582089552,1.0,706,404,https://flickr.com/115599753@N04/30444954471,https://creativecommons.org/licenses/by/2.0/,Jill Myers,https://www.flickr.com/people/115599753@N04/\n0aa9b1f7dd9440a2,https://c1.staticflickr.com/1/71/31192119930_245209c301_o.jpg,0.5,0.0,1.0,0.75,426,334,https://www.flickr.com/photos/stevendepolo/31192119930,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n662b5a486372b19c,https://c1.staticflickr.com/9/8774/28308493522_7b87c8ccee_o.jpg,0.0,0.25,0.5,1.0,431,759,https://www.flickr.com/photos/usembassyta/28308493522/,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tel Aviv,https://www.flickr.com/people/usembassyta/\ne9f4e600b41146f7,https://c1.staticflickr.com/3/2452/31980716974_a06a13b34f_o.jpg,0.0,0.0,0.844112769486,1.0,672,848,https://www.flickr.com/photos/glorycycles/31980716974/,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\ne9d65dc23635343a,https://c1.staticflickr.com/9/8841/28727389655_ec9fc5d19f_o.jpg,0.5,0.0,1.0,0.75,848,123,https://www.flickr.com/photos/kecko/28727389655,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\n5966f21e36a930f1,https://c1.staticflickr.com/9/8837/28409174192_fe7e1dedd4_o.jpg,0.0,0.0,0.75,1.0,976,741,https://www.flickr.com/photos/sybarite48/28409174192,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nd7ed7c9dd549f558,https://c1.staticflickr.com/9/8149/29082045462_4a90beae6d_o.jpg,0.0,0.0,0.75,1.0,959,907,https://www.flickr.com/photos/eamoncurry/29082045462?rb=1,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/\nad422df43e2a757e,https://c1.staticflickr.com/9/8861/28257585136_d2934c339c_o.jpg,0.217975206612,0.25,0.653925619835,1.0,405,711,https://flickr.com/60911558@N04/28257585136,https://creativecommons.org/licenses/by/2.0/,Ian Gratton,https://www.flickr.com/people/ian_a_gratton/\nf0920019f77fc2f8,https://c1.staticflickr.com/9/8335/29188507242_87e9243daa_o.jpg,0.0,0.0,0.720858895706,1.0,563,706,https://www.flickr.com/photos/vaubeh/29188507242,https://creativecommons.org/licenses/by/2.0/,vaubeh,https://www.flickr.com/people/vaubeh/\nd226233e9e80c844,https://c1.staticflickr.com/8/7631/28937682791_771143e527_o.jpg,0.25,0.0,1.0,1.0,667,782,https://www.flickr.com/photos/68147320@N02/28937682791,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\n1a64b567079b97d2,https://c1.staticflickr.com/9/8293/29405449772_d232f6df61_o.jpg,0.25,0.25,0.75,1.0,971,741,https://www.flickr.com/photos/fchelaru/29405449772,https://creativecommons.org/licenses/by/2.0/,Florin Chelaru,https://www.flickr.com/people/fchelaru/\nbbdd9f5816a28b00,https://c1.staticflickr.com/9/8278/28870727490_de42394844_o.jpg,0.4375,0.25,1.0,1.0,548,923,https://www.flickr.com/photos/marsupilami92/28870727490,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\nf52059c9d20cc678,https://c1.staticflickr.com/8/7391/27546716184_6bae6e65b0_o.jpg,0.29114713217,0.0,1.0,0.75,318,249,https://www.flickr.com/photos/marknenadov/27546716184,https://creativecommons.org/licenses/by/2.0/,Mark Nenadov,https://www.flickr.com/people/marknenadov/\ne03b970bb8b75246,https://c1.staticflickr.com/1/528/32132337182_54a2d6599d_o.jpg,0.578822733424,0.0,1.0,0.75,650,306,http://www.flickr.com/photos/stonehenge-stone-circle/32132337182/,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/\n5e8f903d4de583a0,https://c1.staticflickr.com/8/7582/27275955744_b5ff977921_o.jpg,0.25,0.0,1.0,0.561328125,955,609,https://www.flickr.com/photos/scotnelson/27275955744,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n1c6e57b8073b895f,https://c1.staticflickr.com/8/7348/26656487363_9c3b699b4a_o.jpg,0.0,0.267938931298,0.75,0.803816793893,611,780,https://www.flickr.com/photos/spreadshirt/26656487363,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/\n3de1a3085d00e681,https://c1.staticflickr.com/6/5577/29998010284_9a298a0132_o.jpg,0.281690140845,0.25,0.845070422535,1.0,89,279,https://flickr.com/30802095@N04/29998010284,https://creativecommons.org/licenses/by/2.0/,Liam  Lysaght,https://www.flickr.com/people/30802095@N04/\n89e7fbd80e0de870,https://c1.staticflickr.com/4/3695/32434803614_d25e212bb1_o.jpg,0.0,0.0,0.665684830633,1.0,747,772,https://flickr.com/98147195@N00/32434803614,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/\nfaf5794831de61e5,https://c1.staticflickr.com/8/7793/29424918596_ac59e1e3ca_o.jpg,0.377492877493,0.0,1.0,1.0,820,791,https://www.flickr.com/photos/nslashdot/29424918596,https://creativecommons.org/licenses/by/2.0/,Deeped Niclas &amp; Amanda Strandh,https://www.flickr.com/people/nslashdot/\n27606923c0d7511b,https://c1.staticflickr.com/9/8668/28005323994_80685f4fdc_o.jpg,0.28125,0.25,0.84375,1.0,669,392,https://flickr.com/131810676@N03/28005323994,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/\neaf890cbcfa00655,https://c1.staticflickr.com/8/7281/26498177364_48ddfeb0ea_o.jpg,0.361566018424,0.0,0.602610030706,0.75,780,350,https://www.flickr.com/photos/thoseguys119/26498177364/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nffde317d066d4b8a,https://c1.staticflickr.com/1/319/32065668671_6cea1925fe_o.jpg,0.0,0.25,0.5,1.0,859,533,https://flickr.com/46884728@N06/32065668671,https://creativecommons.org/licenses/by/2.0/,piet theisohn,https://www.flickr.com/people/piet_theisohn/\n6370342e4e218ed4,https://c1.staticflickr.com/9/8493/29660763405_8c1a3b19af_o.jpg,0.333333333333,0.0,1.0,1.0,719,681,https://www.flickr.com/photos/tobiasbegemann/29660763405/,https://creativecommons.org/licenses/by/2.0/,Tobias Begemann,https://www.flickr.com/people/tobiasbegemann/\n1386bd0426854bf7,https://c1.staticflickr.com/9/8804/28500606361_53fcae57c6_o.jpg,0.2806640625,0.0,0.8419921875,0.75,611,367,https://www.flickr.com/photos/cogdog/28500606361,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\ndd6a8febc0c953ef,https://c1.staticflickr.com/9/8492/29384461980_f5c4361d25_o.jpg,0.0,0.0,0.75,0.75,644,45,https://www.flickr.com/photos/78428166@N00/29384461980/,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\nc3c7e3994bc34b59,https://c1.staticflickr.com/6/5693/31037061305_fcf63d21f9_o.jpg,0.25,0.0,0.75,0.75,645,316,https://www.flickr.com/photos/wendelinjacober/31037061305,https://creativecommons.org/licenses/by/2.0/,Wendelin Jacober,https://www.flickr.com/people/wendelinjacober/\n05184dda95fbfa63,https://c1.staticflickr.com/9/8779/29389715742_c73901e305_o.jpg,0.0,0.0,0.5,0.75,490,660,https://www.flickr.com/photos/aotaro/29389715742,https://creativecommons.org/licenses/by/2.0/,aotaro,https://www.flickr.com/people/aotaro/\neb459b9f238f24f3,https://c1.staticflickr.com/8/7690/26437466834_86e332ca28_o.jpg,0.0,0.25,0.5,1.0,512,771,https://www.flickr.com/photos/42220226@N07/26437466834,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\n3e0dec78b4d643f6,https://c1.staticflickr.com/6/5265/29236005893_4e27cae1bc_o.jpg,0.0,0.25,0.508928571429,1.0,815,37,https://www.flickr.com/photos/22711505@N05/29236005893,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\nf9028cfa6fd4089b,https://c1.staticflickr.com/9/8280/29324823684_49b8e22d46_o.jpg,0.0,0.0,0.7484375,1.0,405,655,https://www.flickr.com/photos/venkatmangudi/29324823684,https://creativecommons.org/licenses/by/2.0/,Venkat Mangudi,https://www.flickr.com/people/venkatmangudi/\n0a0e6bfebdf57cbd,https://c1.staticflickr.com/8/7484/29504634976_4a35098885_o.jpg,0.0,0.0,0.75,0.75,881,533,https://www.flickr.com/photos/kristoferbjorkman/29504634976/,https://creativecommons.org/licenses/by/2.0/,Kristofer Bj\\303\\266rkman,https://www.flickr.com/people/kristoferbjorkman/\na9fac3c7eb2bd0ef,https://c1.staticflickr.com/6/5622/30356760081_599ff89c2c_o.jpg,0.0,0.0,0.75,0.5625,443,791,https://www.flickr.com/photos/arjanrichter/30356760081,https://creativecommons.org/licenses/by/2.0/,Arjan Richter,https://www.flickr.com/people/arjanrichter/\n5e6da7e17856b545,https://c1.staticflickr.com/8/7664/27476595630_95c99aedd8_o.jpg,0.0,0.0,0.75,1.0,744,673,https://www.flickr.com/photos/144110575@N07/27476595630,https://creativecommons.org/licenses/by/2.0/,Jobs For Felons Hub,https://www.flickr.com/people/144110575@N07/\na2f1fb4b89552db1,https://c1.staticflickr.com/9/8703/28779483321_1d3beef2cd_o.jpg,0.25,0.25,0.75,1.0,909,414,https://www.flickr.com/photos/8269539@N04/28779483321/,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n0db0731366fb387e,https://c1.staticflickr.com/8/7379/28035224505_6afb88ee65_o.jpg,0.373566878981,0.0,0.747133757962,0.75,896,737,https://www.flickr.com/photos/hisgett/28035224505,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n2e5009ae2ba70503,https://c1.staticflickr.com/6/5325/30182940780_c05ca5bc5f_o.jpg,0.25,0.28125,1.0,0.84375,973,865,https://www.flickr.com/photos/jsjgeology/30182940780,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n1b2562cbabc6ade7,https://c1.staticflickr.com/1/761/31457927273_2785030ed0_o.jpg,0.0,0.0,0.665684830633,1.0,855,390,https://www.flickr.com/photos/usnavalwarcollegeri/31457927273,https://creativecommons.org/licenses/by/2.0/,U.S. Naval War College,https://www.flickr.com/people/usnavalwarcollegeri/\n97cb978b16f410e7,https://c1.staticflickr.com/8/7582/26964621803_b1338dd888_o.jpg,0.0,0.272727272727,0.75,0.818181818182,813,159,https://www.flickr.com/photos/jurvetson/26964621803,https://creativecommons.org/licenses/by/2.0/,Steve Jurvetson,https://www.flickr.com/people/jurvetson/\n10ce0cba6cb94154,https://c1.staticflickr.com/6/5492/30796308436_aefebd1629_o.jpg,0.0,0.0,0.5892,0.75,151,763,https://www.flickr.com/photos/pandora_6666/30796308436,https://creativecommons.org/licenses/by/2.0/,Jo Naylor,https://www.flickr.com/people/pandora_6666/\n960c2fbb9393dac1,https://c1.staticflickr.com/6/5660/29277821453_750675569a_o.jpg,0.240412445731,0.25,0.721237337192,1.0,699,58,https://www.flickr.com/photos/22711505@N05/29277821453,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n87991155b1d3f344,https://c1.staticflickr.com/1/355/32582244962_6ff83aece5_o.jpg,0.0036036036036,0.0,1.0,1.0,918,632,https://www.flickr.com/photos/norbet/32582244962/,https://creativecommons.org/licenses/by/2.0/,norbet1,https://www.flickr.com/people/norbet/\n6cbe797e65839c6e,https://c1.staticflickr.com/8/7332/27449283081_8b9af7e5aa_o.jpg,0.464122137405,0.0,1.0,0.75,404,584,https://www.flickr.com/photos/usnavy/27449283081,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\nd37eee8e62337a23,https://c1.staticflickr.com/9/8872/29683124836_f333f20e19_o.jpg,0.0,0.0,0.75,0.75,438,554,https://www.flickr.com/photos/rapidtravelchai/29683124836,https://creativecommons.org/licenses/by/2.0/,Stefan Krasowski,https://www.flickr.com/people/rapidtravelchai/\n12872ceb20f95c72,https://c1.staticflickr.com/8/7082/26527521084_59770450e3_o.jpg,0.0,0.0,0.75,0.75,309,208,https://www.flickr.com/photos/orangeaurochs/26527521084,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/\nde3459da31859a10,https://c1.staticflickr.com/1/458/32544272722_70146bac1f_o.jpg,0.0,0.0,0.666666666667,1.0,386,814,https://www.flickr.com/photos/30478819@N08/32544272722,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n55af4665ba3a5464,https://c1.staticflickr.com/6/5781/30065521570_ecfd7627fc_o.jpg,0.0,0.0,0.838016528926,1.0,11,829,https://www.flickr.com/photos/chrislbaker/30065521570,https://creativecommons.org/licenses/by/2.0/,Chris Baker,https://www.flickr.com/people/chrislbaker/\n9da4b60fa0ce86d7,https://c1.staticflickr.com/9/8490/29526508965_013a16ebcd_o.jpg,0.0,0.0,0.75,1.0,416,846,https://www.flickr.com/photos/bexwalton/29526508965,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/\nc93fb8ab4993238d,https://c1.staticflickr.com/9/8215/29266283393_acbcd2d9d8_o.jpg,0.42174796748,0.0,0.843495934959,0.75,405,351,https://flickr.com/76908380@N04/29266283393,https://creativecommons.org/licenses/by/2.0/,Valentin Hintikka,https://www.flickr.com/people/valentinhintikka/\na7e7d3a212e6be4e,https://c1.staticflickr.com/6/5330/30326411121_23a786e9cc_o.jpg,0.486191860465,0.25,0.97238372093,1.0,672,658,https://www.flickr.com/photos/glorycycles/30326411121,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n378e9b86e085c920,https://c1.staticflickr.com/9/8072/30014657986_985483d28c_o.jpg,0.438671875,0.0,1.0,0.75,822,893,https://www.flickr.com/photos/jasoncartwright/30014657986/,https://creativecommons.org/licenses/by/2.0/,Jason Cartwright,https://www.flickr.com/people/jasoncartwright/\nd5a031ae7657e09f,https://c1.staticflickr.com/2/1468/26165908343_f5ab5333fe_o.jpg,0.0,0.0,0.666666666667,1.0,519,978,https://www.flickr.com/photos/janitors/26165908343,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\nd6a884049122f404,https://c1.staticflickr.com/1/577/31088666023_7e4fbf7aca_o.jpg,0.239718614719,0.0,0.719155844156,0.75,309,284,https://www.flickr.com/photos/42244964@N03/31088666023,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/\n5adfbcf6d3430882,https://c1.staticflickr.com/6/5773/30099519660_e53ee695a6_o.jpg,0.281802120141,0.0,1.0,0.75,310,16,http://www.flickr.com/photos/8414198@N04/30099519660,https://creativecommons.org/licenses/by/2.0/,Andrey,https://www.flickr.com/people/akras/\n89ec4c53ebdb5cab,https://c1.staticflickr.com/9/8789/28285530991_9efbed0f14_o.jpg,0.25,0.0,0.75,0.75,53,368,https://flickr.com/14583963@N00/28285530991,https://creativecommons.org/licenses/by/2.0/,David Short,https://www.flickr.com/people/14583963@N00/\n06a02e39de2514d0,https://c1.staticflickr.com/8/7747/26736417344_457c9e15be_o.jpg,0.267938931298,0.0,0.803816793893,0.75,820,844,https://www.flickr.com/photos/jus10h/26736417344,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\naad61bf6c5001828,https://c1.staticflickr.com/6/5663/30091386730_c3b6da8553_o.jpg,0.258620689655,0.0,0.775862068966,0.75,672,568,https://www.flickr.com/photos/glorycycles/30091386730,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n50a3ec38f05cc572,https://c1.staticflickr.com/6/5639/31049619242_67e1418d7f_o.jpg,0.5,0.0,1.0,0.75,820,620,https://www.flickr.com/photos/worldskillsteamuk/31049619242/,https://creativecommons.org/licenses/by/2.0/,WorldSkills  UK,https://www.flickr.com/people/worldskillsteamuk/\nc1e470254bb87522,https://c1.staticflickr.com/9/8550/29793086206_c58496f1dd_o.jpg,0.0,0.0,0.5,0.75,683,224,https://www.flickr.com/photos/texasbackroads/29793086206/,https://creativecommons.org/licenses/by/2.0/,Nicolas Henderson,https://www.flickr.com/people/texasbackroads/\n3e7f00115428a973,https://c1.staticflickr.com/8/7361/27680525281_01f66ca20c_o.jpg,0.0,0.0,0.561569688769,1.0,490,630,https://www.flickr.com/photos/144110575@N07/27680525281,https://creativecommons.org/licenses/by/2.0/,Jobs For Felons Hub,https://www.flickr.com/people/144110575@N07/\neaf975aa423855a1,https://c1.staticflickr.com/9/8378/29163025530_5302119066_o.jpg,0.0,0.0,0.75,0.75,550,904,https://www.flickr.com/photos/dedrawolff/29163025530,https://creativecommons.org/licenses/by/2.0/,Dedra Wolff,https://www.flickr.com/people/dedrawolff/\n6d0d1adfac75b16e,https://c1.staticflickr.com/9/8430/29142611383_2899a80fb0_o.jpg,0.0,0.25,0.75,0.75,520,373,https://www.flickr.com/photos/quinet/29142611383,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n95286cc8512e2180,https://c1.staticflickr.com/9/8026/29608084645_fe2bebf215_o.jpg,0.0,0.287776898734,0.75,0.863330696203,490,443,https://www.flickr.com/photos/iblee/29608084645,https://creativecommons.org/licenses/by/2.0/,lee leblanc,https://www.flickr.com/people/iblee/\n0c7f0f3c192b45dc,https://c1.staticflickr.com/6/5608/30232593670_71d1459d97_o.jpg,0.332106038292,0.0,0.996318114875,1.0,973,479,https://www.flickr.com/photos/zigazou76/30232593670,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\nc4282fd2dc6d3c9b,https://c1.staticflickr.com/6/5800/30843798446_d4453855ed_o.jpg,0.5,0.0,1.0,0.75,349,836,https://flickr.com/22592971@N04/30843798446,https://creativecommons.org/licenses/by/2.0/,Mark  Gunn,https://www.flickr.com/people/mark-gunn/\n60c17d52dc3194fb,https://c1.staticflickr.com/8/7460/26898662073_873911b31d_o.jpg,0.25,0.0,1.0,0.75,980,705,https://www.flickr.com/photos/atoach/26898662073/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n254dcca9acff2944,https://c1.staticflickr.com/9/8123/29793040716_b02302662e_o.jpg,0.4375,0.25,1.0,1.0,875,891,https://www.flickr.com/photos/aswans1234567/29793040716/,https://creativecommons.org/licenses/by/2.0/,Alex Swanston&#x27;s Bus Photos,https://www.flickr.com/people/aswans1234567/\n83d9fa2207b657ff,https://c1.staticflickr.com/1/697/31482486846_1152d88e79_o.jpg,0.0,0.25,0.5625,1.0,469,834,https://www.flickr.com/photos/davidwilson1949/31482486846,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n721a5dc05dbcb457,https://c1.staticflickr.com/8/7169/26753951864_798f7bce28_o.jpg,0.251353790614,0.0,1.0,0.75,954,784,https://www.flickr.com/photos/scotnelson/26753951864,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\ndcd8e769e9be80b6,https://c1.staticflickr.com/9/8311/28854278864_a06268db28_o.jpg,0.248348017621,0.0,0.745044052863,0.75,507,598,https://www.flickr.com/photos/felipe_gabaldon/28854278864,https://creativecommons.org/licenses/by/2.0/,Felipe Gabald\\303\\263n,https://www.flickr.com/people/felipe_gabaldon/\nc2f36b66894e18ad,https://c1.staticflickr.com/8/7359/27592542231_c86cfd8ae6_o.jpg,0.25,0.25,0.75,1.0,896,640,https://www.flickr.com/photos/faceme/27592542231,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/\n9292189fd34132d1,https://c1.staticflickr.com/8/7436/27716090366_83abddfa1d_o.jpg,0.256343283582,0.25,0.769029850746,1.0,136,63,https://www.flickr.com/photos/lakeworth/27716090366/,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/\n3bfc1feb105b9a76,https://c1.staticflickr.com/6/5716/30442075022_393df5da81_o.jpg,0.0,0.0,0.812703583062,1.0,973,768,https://www.flickr.com/photos/103060904@N04/30442075022/,https://creativecommons.org/licenses/by/2.0/,Keron Beattie,https://www.flickr.com/people/103060904@N04/\n275d7e67715837b7,https://c1.staticflickr.com/9/8490/29691405946_54bb971f83_o.jpg,0.250923190547,0.25,0.75276957164,1.0,459,23,http://www.flickr.com/photos/eltb/29691405946/,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n199dbc9bb234d3eb,https://c1.staticflickr.com/8/7432/28158924655_0b5768849e_o.jpg,0.249079528719,0.0,0.747238586156,0.75,209,754,https://flickr.com/142677604@N03/28158924655,https://creativecommons.org/licenses/by/2.0/,Kraken Fireball,https://www.flickr.com/people/142677604@N03/\ne316f5f573aff0a5,https://c1.staticflickr.com/9/8413/29234173482_7441f18d0d_o.jpg,0.5,0.25,1.0,1.0,543,681,https://www.flickr.com/photos/codnewsroom/29234173482,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\n4c32a77c2d627ecb,https://c1.staticflickr.com/6/5645/30163303454_e77254858e_o.jpg,0.25,0.267410714286,1.0,1.0,673,891,https://www.flickr.com/photos/publicresourceorg/30163303454,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/\n255e80bf87d12516,https://c1.staticflickr.com/6/5523/30514087241_81c4b0121e_o.jpg,0.0,0.25,0.580683624801,1.0,405,16,https://www.flickr.com/photos/ajmexico/30514087241,https://creativecommons.org/licenses/by/2.0/,ajmexico,https://www.flickr.com/people/ajmexico/\n8f4761a71ad5944e,https://c1.staticflickr.com/8/7654/27067231945_3629889212_o.jpg,0.438671875,0.0,1.0,0.75,950,191,https://www.flickr.com/photos/cogdog/27067231945,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n2fdcbe02ab1d6757,https://c1.staticflickr.com/6/5747/30186936901_26343dd544_o.jpg,0.5,0.0,1.0,0.75,403,844,https://flickr.com/49969498@N02/30186936901,https://creativecommons.org/licenses/by/2.0/,Robert Bell,https://www.flickr.com/people/roberttbell/\n816c7632b8c85491,https://c1.staticflickr.com/6/5267/30086067086_bedfd5643b_o.jpg,0.4375,0.25,1.0,1.0,955,43,https://www.flickr.com/photos/scotnelson/30086067086,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n0dcb2c94e60b4efe,https://c1.staticflickr.com/9/8811/28903297116_49a3ac1d2b_o.jpg,0.0,0.0,0.666666666667,1.0,519,555,https://www.flickr.com/photos/box_repsol/28903297116,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nc8cec867a6ec0faa,https://c1.staticflickr.com/9/8044/29084271660_ba3a0cc4a0_o.jpg,0.0,0.0,1.0,0.739130434783,437,384,https://www.flickr.com/photos/autohistorian/29084271660,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n6aea134a3ad33f38,https://c1.staticflickr.com/1/508/32673017136_b4fd325b21_o.jpg,0.0,0.0,0.75,1.0,24,247,https://www.flickr.com/photos/rusty_clark/32673017136,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\na14e6629fc56396c,https://c1.staticflickr.com/9/8426/28855117446_8d63056456_o.jpg,0.25,0.25,1.0,1.0,655,757,https://www.flickr.com/photos/moto_club4ag/28855117446,https://creativecommons.org/licenses/by/2.0/,Moto &quot;Club4AG&quot; Miwa,https://www.flickr.com/people/moto_club4ag/\n74ae9e8039013987,https://c1.staticflickr.com/4/3865/33406350172_138f88725b_o.jpg,0.25,0.25,1.0,1.0,536,83,http://www.flickr.com/photos/glorycycles/33406350172/,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\nc9481b9782bb4f1a,https://c1.staticflickr.com/8/7411/27175924830_e3510898ec_o.jpg,0.0,0.0,0.666666666667,1.0,484,292,https://www.flickr.com/photos/glenbowman/27175924830,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/\n15f6730523be0c03,https://c1.staticflickr.com/9/8341/28845710984_d431f27657_o.jpg,0.0,0.0,0.5625,0.75,946,151,https://www.flickr.com/photos/aroberts/28845710984,https://creativecommons.org/licenses/by/2.0/,Andy Roberts,https://www.flickr.com/people/aroberts/\na46c7d8be28259ea,https://c1.staticflickr.com/9/8639/30353834141_bfa750c339_o.jpg,0.0,0.0,0.419028340081,0.75,780,597,https://www.flickr.com/photos/thoseguys119/30353834141,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\ncf022c285011f91f,https://c1.staticflickr.com/9/8462/28962430723_4b0836d320_o.jpg,0.280226209048,0.25,0.840678627145,1.0,662,873,https://www.flickr.com/photos/andreboeni/28962430723,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n833deae6bc79f83e,https://c1.staticflickr.com/9/8508/29327163371_cedc7d85a4_o.jpg,0.0,0.0,0.666666666667,1.0,519,203,https://www.flickr.com/photos/box_repsol/29327163371,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n477d9f66cdd55002,https://c1.staticflickr.com/1/355/32906104026_a41fba0844_o.jpg,0.25,0.4375,1.0,1.0,577,399,http://www.flickr.com/photos/143957286@N05/32906104026,https://creativecommons.org/licenses/by/2.0/,whitehart1882,https://www.flickr.com/people/143957286@N05/\n3c4ae74a9c09cecd,https://c1.staticflickr.com/9/8711/28257777633_85810b6daf_o.jpg,0.0,0.0,0.561328125,0.75,113,805,https://www.flickr.com/photos/adactio/28257777633,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/\n53b3bac60b5e7754,https://c1.staticflickr.com/6/5585/30287486864_9c1ebf987f_o.jpg,0.4375,0.25,1.0,1.0,739,888,https://www.flickr.com/photos/carlos_verza/30287486864/,https://creativecommons.org/licenses/by/2.0/,carlos verza,https://www.flickr.com/people/carlos_verza/\nf27a10945fe9ff4b,https://c1.staticflickr.com/9/8554/28791518124_0540d45510_o.jpg,0.0,0.0,0.562330623306,1.0,979,953,https://www.flickr.com/photos/bohemiannie/28791518124,https://creativecommons.org/licenses/by/2.0/,annie!,https://www.flickr.com/people/bohemiannie/\nb634eee16b27b342,https://c1.staticflickr.com/8/7764/27408178181_0b35b270e4_o.jpg,0.281690140845,0.0,0.845070422535,0.75,985,903,https://www.flickr.com/photos/aryehalex/27408178181/,https://creativecommons.org/licenses/by/2.0/,Aryeh Alex,https://www.flickr.com/people/aryehalex/\nf56250efb71d6668,https://c1.staticflickr.com/8/7632/28005357512_7c94aa61a5_o.jpg,0.578822733424,0.0,1.0,0.75,918,590,https://www.flickr.com/photos/bagogames/28005357512,https://creativecommons.org/licenses/by/2.0/,BagoGames,https://www.flickr.com/people/bagogames/\n471028ef37186e19,https://c1.staticflickr.com/8/7502/28339825641_94dc8ce544_o.jpg,0.0,0.0,0.75,0.629552980132,844,903,https://www.flickr.com/photos/jared422/28339825641,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/\n3d387e72f39bb706,https://c1.staticflickr.com/8/7376/27235102896_0f2338fbda_o.jpg,0.4375,0.25,1.0,1.0,117,985,https://www.flickr.com/photos/blmoregon/27235102896,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\n2f01c6eed500462f,https://c1.staticflickr.com/9/8051/29221385303_00211f4a67_o.jpg,0.25,0.493045387994,1.0,0.986090775988,683,599,https://www.flickr.com/photos/the-o/29221385303,https://creativecommons.org/licenses/by/2.0/,David Ohmer,https://www.flickr.com/people/the-o/\n36281d3fff2e7d9a,https://c1.staticflickr.com/1/300/31252849673_140d779413_o.jpg,0.0,0.0,0.75,0.75,760,730,https://www.flickr.com/photos/nicokaiser/31252849673,https://creativecommons.org/licenses/by/2.0/,Nico Kaiser,https://www.flickr.com/people/nicokaiser/\n69572f4a9707dba0,https://c1.staticflickr.com/1/727/32432691826_7766fc5dd3_o.jpg,0.25,0.0,1.0,0.75,156,377,https://flickr.com/49503029034@N01/32432691826,https://creativecommons.org/licenses/by/2.0/,Heather Kennedy,https://www.flickr.com/people/moria/\n8115faf7544a531a,https://c1.staticflickr.com/8/7537/30284413195_e944457ca4_o.jpg,0.0,0.25,0.75,1.0,519,5,https://www.flickr.com/photos/glorycycles/30284413195,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n54c3454fe2ac6f83,https://c1.staticflickr.com/9/8201/29025023036_78634f8ece_o.jpg,0.268922018349,0.25,0.806766055046,1.0,553,37,https://www.flickr.com/photos/bethscupham/29025023036/,https://creativecommons.org/licenses/by/2.0/,Beth Scupham,https://www.flickr.com/people/bethscupham/\nc333e21afd582d54,https://c1.staticflickr.com/6/5326/30786915200_0781f2022c_o.jpg,0.210588633288,0.0,0.631765899865,0.75,947,37,https://www.flickr.com/photos/mauroguanandi/30786915200,https://creativecommons.org/licenses/by/2.0/,mauroguanandi,https://www.flickr.com/people/mauroguanandi/\n718ef5a99da31acb,https://c1.staticflickr.com/8/7756/26891636440_10c6df03f7_o.jpg,0.2806640625,0.25,0.8419921875,1.0,979,337,https://www.flickr.com/photos/upsticksngo/26891636440,https://creativecommons.org/licenses/by/2.0/,UpSticksNGo Crew,https://www.flickr.com/people/upsticksngo/\nb94ad9852c9ade1f,https://c1.staticflickr.com/6/5454/31283029186_991f22e9a3_o.jpg,0.5,0.25,1.0,1.0,327,449,https://www.flickr.com/photos/52450054@N04/31283029186/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n195be0058b857e50,https://c1.staticflickr.com/9/8143/29363298444_58043566c4_o.jpg,0.336764705882,0.0,1.0,1.0,694,870,https://flickr.com/8598276@N07/29363298444,https://creativecommons.org/licenses/by/2.0/,St. George&#x27;s School,https://www.flickr.com/people/stgeorgesschool/\n443fc3547c981e16,https://c1.staticflickr.com/6/5494/30374133503_74cd143048_o.jpg,0.234642857143,0.0,0.703928571429,0.75,980,542,https://www.flickr.com/photos/hamed/30374133503/,https://creativecommons.org/licenses/by/2.0/,Hamed Saber,https://www.flickr.com/people/hamed/\n63fa27eea73b1428,https://c1.staticflickr.com/9/8120/29744690920_0be1e735d5_o.jpg,0.248713235294,0.25,0.746139705882,1.0,896,860,https://flickr.com/34153108@N06/29744690920,https://creativecommons.org/licenses/by/2.0/,Gerard van der Schaaf,https://www.flickr.com/people/34153108@N06/\n7431d69f14edc70b,https://c1.staticflickr.com/9/8676/30036004390_9e1c281003_o.jpg,0.5,0.0,1.0,0.75,519,318,https://www.flickr.com/photos/box_repsol/30036004390,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nb437185a095f923e,https://c1.staticflickr.com/8/7745/26268247083_89bc1c9376_o.jpg,0.25,0.0,1.0,0.75,389,797,http://www.flickr.com/photos/mondo79/26268247083/,https://creativecommons.org/licenses/by/2.0/,Mondo79,https://www.flickr.com/people/mondo79/\n9b5e40255d8797f1,https://c1.staticflickr.com/6/5770/30511768833_b709f4c4b4_o.jpg,0.281690140845,0.0,0.845070422535,0.75,806,969,https://www.flickr.com/photos/arturtula/30511768833/,https://creativecommons.org/licenses/by/2.0/,Artur (RUS) Potosi,https://www.flickr.com/people/arturtula/\ne0bd8812818082e2,https://c1.staticflickr.com/1/641/32012204564_ce07d12148_o.jpg,0.25,0.25,0.75,1.0,490,334,https://www.flickr.com/photos/tinto/32012204564,https://creativecommons.org/licenses/by/2.0/,J\\303\\266rg Schubert,https://www.flickr.com/people/tinto/\na629afa881a5e414,https://c1.staticflickr.com/8/7496/26514326923_a8cc4330c5_o.jpg,0.0,0.25,0.433127572016,1.0,566,861,https://www.flickr.com/photos/jsjgeology/26514326923,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n7fd59ac546707787,https://c1.staticflickr.com/9/8553/30106308216_bf23b64807_o.jpg,0.0,0.0,0.663235294118,1.0,507,330,https://flickr.com/23119666@N03/30106308216,https://creativecommons.org/licenses/by/2.0/,Mark Bonica,https://www.flickr.com/people/23119666@N03/\nadab202e9cd5fcd2,https://c1.staticflickr.com/8/7245/27849545201_8605375a8f_o.jpg,0.4375,0.25,1.0,1.0,522,323,https://www.flickr.com/photos/jeepersmedia/27849545201,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n36ad1ff75147f53e,https://c1.staticflickr.com/9/8767/28168989340_b507d4cfee_o.jpg,0.0,0.0,0.666666666667,1.0,484,847,https://www.flickr.com/photos/tipsfortravellers/28168989340,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\nf670c8e22100e14c,https://c1.staticflickr.com/9/8142/27937702403_44d332ce62_o.jpg,0.5,0.25,1.0,1.0,971,398,https://www.flickr.com/photos/davebloggs007/27937702403,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\n4d49b986a4350ef0,https://c1.staticflickr.com/8/7469/27918323190_18d5ec65a2_o.jpg,0.210588633288,0.25,0.631765899865,1.0,980,582,https://www.flickr.com/photos/mypubliclands/27918323190/,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n1f2bc0bf9093a0b1,https://c1.staticflickr.com/9/8791/27796081224_689be02144_o.jpg,0.0,0.0,0.5,0.75,431,462,https://www.flickr.com/photos/usembassyta/27796081224,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tel Aviv,https://www.flickr.com/people/usembassyta/\nd485616379a48d20,https://c1.staticflickr.com/6/5809/29950974770_eb4839cd26_o.jpg,0.28125,0.0,0.84375,0.75,756,407,https://www.flickr.com/photos/yutakaseki/29950974770,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/\n1d4bdc8fb076c989,https://c1.staticflickr.com/1/745/32424019766_26c3e81cbd_o.jpg,0.210588633288,0.0,0.631765899865,0.75,405,976,https://flickr.com/99041966@N06/32424019766,https://creativecommons.org/licenses/by/2.0/,Nicky Boogaard,https://www.flickr.com/people/n-bphotography/\nb0e0d37759ce4e3a,https://c1.staticflickr.com/6/5801/30823966840_6808acd0cf_o.jpg,0.0,0.0,0.666666666667,1.0,948,435,https://flickr.com/79183573@N08/30823966840,https://creativecommons.org/licenses/by/2.0/,Phil Fiddes,https://www.flickr.com/people/philjose1878/\n69d411b3b5646afa,https://c1.staticflickr.com/8/7250/27225791300_574668b3c6_o.jpg,0.25,0.0,0.75,0.75,582,817,https://www.flickr.com/photos/greggjerdingen/27225791300,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n3ef7d0c5bcbad151,https://c1.staticflickr.com/8/7158/26931819995_04ce080985_o.jpg,0.211382113821,0.25,0.634146341463,1.0,976,832,https://www.flickr.com/photos/discoveroregon/26931819995,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n78d07449cbdd0074,https://c1.staticflickr.com/8/7566/30238377541_2606775bf7_o.jpg,0.318926974665,0.0,1.0,1.0,310,121,https://www.flickr.com/photos/mypubliclands/30238377541/,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n7434d610814cdc56,https://c1.staticflickr.com/9/8768/30027974105_25d980db49_o.jpg,0.0,0.0,0.666666666667,1.0,982,624,https://www.flickr.com/photos/apardavila/30027974105/,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\nc2758960b6f9a899,https://c1.staticflickr.com/8/7299/27557323161_cdbb0428f9_o.jpg,0.493694362018,0.0,1.0,0.75,321,983,https://www.flickr.com/photos/postmanpetecoluk/27557323161/,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\nf2f9fa9d862e11ea,https://c1.staticflickr.com/6/5581/31179065985_9692ca8a07_o.jpg,0.28125,0.0,0.84375,0.75,875,511,https://www.flickr.com/photos/pics-by-mpd/31179065985/,https://creativecommons.org/licenses/by/2.0/,Matt Davis,https://www.flickr.com/people/pics-by-mpd/\nc0e76750c6c1708a,https://c1.staticflickr.com/1/304/30734131803_2f17172200_o.jpg,0.0,0.25,0.497426470588,1.0,867,269,https://www.flickr.com/photos/n28307/30734131803,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/\n1f71b268ab9b2894,https://c1.staticflickr.com/8/7051/27040061026_5fdfac5efc_o.jpg,0.25,0.25,0.75,1.0,706,378,https://www.flickr.com/photos/jsjgeology/27040061026,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n8a8bd3339833db47,https://c1.staticflickr.com/1/465/32381679615_b7d40e28ff_o.jpg,0.333333333333,0.0,1.0,1.0,604,982,http://www.flickr.com/photos/uk-in-japan/32381679615/,https://creativecommons.org/licenses/by/2.0/,UK in Japan- FCO,https://www.flickr.com/people/uk-in-japan/\n2c68c6ae26e649e7,https://c1.staticflickr.com/6/5524/30148391854_e778ec51e4_o.jpg,0.46754636234,0.25,0.935092724679,1.0,780,948,https://www.flickr.com/photos/thoseguys119/30148391854,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n1f0afdb18a9beb88,https://c1.staticflickr.com/6/5694/25312227679_f5e17a236d_o.jpg,0.28125,0.0,0.84375,0.75,566,466,https://www.flickr.com/photos/railwayofaustralia/25312227679/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/\n422e130b8c40bd9e,https://c1.staticflickr.com/6/5614/31271046960_3566e36498_o.jpg,0.0,0.0,1.0,0.838016528926,348,492,https://www.flickr.com/photos/usfwsmtnprairie/31271046960,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n9f29c0d42a8cfd16,https://c1.staticflickr.com/6/5342/30859918751_30df2c2c14_o.jpg,0.28125,0.25,0.84375,1.0,566,828,https://www.flickr.com/photos/railwayofaustralia/30859918751/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/\n921f74b7d1313db3,https://c1.staticflickr.com/9/8257/28649632904_51833e69bf_o.jpg,0.469650986343,0.25,1.0,1.0,718,405,https://www.flickr.com/photos/hugo90/28649632904,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n1c8d37176aa05ac9,https://c1.staticflickr.com/8/7228/27898265472_0cb216e047_o.jpg,0.0,0.25,0.5625,1.0,481,710,https://www.flickr.com/photos/jeepersmedia/27898265472,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nca21a4384daebdf4,https://c1.staticflickr.com/6/5604/30719903711_ae4de4f230_o.jpg,0.28125,0.25,0.84375,1.0,826,468,http://www.flickr.com/photos/dimsis/30719903711/,https://creativecommons.org/licenses/by/2.0/,Dimitris Siskopoulos,https://www.flickr.com/people/dimsis/\n2bc556455337129b,https://c1.staticflickr.com/8/7604/26486988663_7bfc5106ef_o.jpg,0.263565891473,0.0,1.0,1.0,702,166,https://flickr.com/126288307@N05/26486988663,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/\na9874ddc69c3773e,https://c1.staticflickr.com/8/7198/26987568032_b68efd8a13_o.jpg,0.0,0.0,0.75,0.528409090909,532,619,https://www.flickr.com/photos/51764518@N02/26987568032,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\nb8621c85dda872e2,https://c1.staticflickr.com/1/336/31261893400_885da93f70_o.jpg,0.0,0.429527559055,0.75,1.0,437,949,https://www.flickr.com/photos/autohistorian/31261893400,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n9f8c1aee800f7a3d,https://c1.staticflickr.com/8/7379/28173753565_e1701800d0_o.jpg,0.496696035242,0.25,0.993392070485,1.0,314,118,https://www.flickr.com/photos/sybarite48/28173753565,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n8b21457ca3ccb595,https://c1.staticflickr.com/9/8394/29088859210_3aeff38284_o.jpg,0.5,0.0,1.0,0.75,539,520,https://www.flickr.com/photos/vahemart/29088859210,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\nc36a95d6daba263c,https://c1.staticflickr.com/6/5713/30718687756_4e3d64e6b6_o.jpg,0.227320675105,0.0,0.681962025316,0.75,355,270,https://www.flickr.com/photos/47652574@N06/30718687756,https://creativecommons.org/licenses/by/2.0/,Tee Cee,https://www.flickr.com/people/tcee35mm/\n3cbba40aacbbcc80,https://c1.staticflickr.com/8/7340/27012431294_5a3cbd7421_o.jpg,0.0,0.0,0.497426470588,0.75,739,603,https://www.flickr.com/photos/danieltoschlaeger/27012431294/,https://creativecommons.org/licenses/by/2.0/,tlwmdbt,https://www.flickr.com/people/danieltoschlaeger/\nd4ae0b51e0c5c161,https://c1.staticflickr.com/6/5512/30966022700_f4d9e92aa6_o.jpg,0.5,0.25,1.0,1.0,405,976,https://www.flickr.com/photos/janitors/30966022700,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\nbd31d635ef978b3f,https://c1.staticflickr.com/1/537/31851713681_26d83da8ec_o.jpg,0.468616262482,0.25,0.937232524964,1.0,511,224,https://www.flickr.com/photos/tdlucas5000/31851713681,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/\n0a0a409aad6e704f,https://c1.staticflickr.com/8/7229/27335443414_799fb9bc4d_o.jpg,0.25,0.0,1.0,1.0,885,37,https://www.flickr.com/photos/43547009@N00/27335443414,https://creativecommons.org/licenses/by/2.0/,Alejandro,https://www.flickr.com/people/43547009@N00/\nfa3cafcaab477f21,https://c1.staticflickr.com/6/5821/31372026075_c75c0b2767_o.jpg,0.25,0.0,1.0,1.0,848,907,https://www.flickr.com/photos/mohit_s/31372026075/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/\nf6449244abe058a0,https://c1.staticflickr.com/8/7435/27965959886_70048ee073_o.jpg,0.198848684211,0.0,0.596546052632,0.75,920,549,https://www.flickr.com/photos/jeepersmedia/27965959886,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\na36f7818a29ccb92,https://c1.staticflickr.com/9/8350/29366884170_ecc4e82d29_o.jpg,0.376029654036,0.25,1.0,1.0,310,465,https://www.flickr.com/photos/gails_pictures/29366884170/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n6c7e3ceeb5ee2b59,https://c1.staticflickr.com/6/5833/30016507454_1e30207a70_o.jpg,0.37517831669,0.0,1.0,1.0,820,496,https://www.flickr.com/photos/jus10h/30016507454,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n7b0258c3be58e0c9,https://c1.staticflickr.com/9/8344/29150254141_6d57b624e0_o.jpg,0.333333333333,0.0,1.0,1.0,405,830,https://www.flickr.com/photos/markyharky/29150254141/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n572d3b5dc638583a,https://c1.staticflickr.com/6/5833/30346042186_6f168f6405_o.jpg,0.210588633288,0.0,0.631765899865,0.75,706,177,https://www.flickr.com/photos/abhinavnfr/30346042186,https://creativecommons.org/licenses/by/2.0/,Abhinav Phangcho Choudhury,https://www.flickr.com/people/abhinavnfr/\ne74a151f4b86e6a3,https://c1.staticflickr.com/9/8530/29328450450_ac84d2d6a9_o.jpg,0.0,0.25,0.75,1.0,777,552,https://www.flickr.com/photos/wwworks/29328450450,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/\nd21d3b084d0c8691,https://c1.staticflickr.com/6/5684/30382778405_e8383ccb5b_o.jpg,0.249631811487,0.25,0.748895434462,1.0,940,956,https://flickr.com/97760755@N08/30382778405,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard,https://www.flickr.com/people/viaggioroutard/\nc1ebefdf4c0143e4,https://c1.staticflickr.com/6/5815/30057647913_2c770d06aa_o.jpg,0.358944954128,0.25,0.598241590214,1.0,780,673,https://www.flickr.com/photos/thoseguys119/30057647913,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n79a6c5c8b04a7108,https://c1.staticflickr.com/9/8873/28679282790_9b58dd9cd3_o.jpg,0.0,0.0,0.501846381093,0.75,407,607,https://www.flickr.com/photos/eltb/28679282790,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n0c467ffdbf86e92f,https://c1.staticflickr.com/1/395/31874535112_0a01e6d045_o.jpg,0.0,0.0,0.547453703704,0.75,920,908,https://www.flickr.com/photos/79157069@N03/31874535112,https://creativecommons.org/licenses/by/2.0/,Matthew Paul  Argall,https://www.flickr.com/people/79157069@N03/\n6001cc9decf254ff,https://c1.staticflickr.com/8/7353/27869081216_a2819336d7_o.jpg,0.128161888702,0.0,1.0,1.0,806,247,https://www.flickr.com/photos/minoritenplatz8/27869081216,https://creativecommons.org/licenses/by/2.0/,\"Bundesministerium f\\303\\274r Europa, Integration und \\303\\204u\\303\\237eres\",https://www.flickr.com/people/minoritenplatz8/\n67e6bb4051982f03,https://c1.staticflickr.com/9/8075/29786875025_c4a83652b3_o.jpg,0.326939291737,0.0,0.980817875211,0.75,310,314,https://www.flickr.com/photos/gails_pictures/29786875025,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n5821b43dd6cffda0,https://c1.staticflickr.com/1/445/31497636784_3824fcf78d_o.jpg,0.5,0.0,1.0,0.75,979,504,https://www.flickr.com/photos/n28307/31497636784,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/\n7ec38ae39a88c314,https://c1.staticflickr.com/9/8462/28749920950_4e2871e85f_o.jpg,0.248713235294,0.0,0.746139705882,0.75,820,617,https://www.flickr.com/photos/agenciabrasilia/28749920950/,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n319c19cfcec52407,https://c1.staticflickr.com/9/8598/28550253931_fa47bd9afe_o.jpg,0.0,0.0,0.666666666667,1.0,512,462,https://www.flickr.com/photos/daveseven/28550253931,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/\nd9c84f1fccfe314b,https://c1.staticflickr.com/3/2015/32924183885_f45877f864_o.jpg,0.5,0.25,1.0,1.0,885,590,https://flickr.com/8721758@N06/32924183885,https://creativecommons.org/licenses/by/2.0/,Jorge L\\303\\241scar,https://www.flickr.com/people/jlascar/\n7ccadb841d5cd61d,https://c1.staticflickr.com/1/627/32454573732_bb3a05d8cd_o.jpg,0.25,0.25,0.75,1.0,484,349,https://www.flickr.com/photos/renaud-camus/32454573732/,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/\nc3304e13b7bda3c7,https://c1.staticflickr.com/9/8562/30417068616_2b77df34e1_o.jpg,0.0,0.25,0.604132901135,1.0,309,38,https://www.flickr.com/photos/gails_pictures/30417068616,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\ndf38456297fa9c94,https://c1.staticflickr.com/9/8041/29084106261_060381d8ce_o.jpg,0.25,0.0,1.0,1.0,472,749,https://www.flickr.com/photos/quinet/29084106261,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nefbc9cd5580d04d8,https://c1.staticflickr.com/1/578/32517088401_12d30505d9_o.jpg,0.0,0.25,0.596618357488,1.0,923,603,https://www.flickr.com/photos/garysoup/32517088401,https://creativecommons.org/licenses/by/2.0/,Gary Stevens,https://www.flickr.com/people/garysoup/\n7e32da515522cc2a,https://c1.staticflickr.com/6/5760/29865043584_6b74119851_o.jpg,0.25,0.0,0.75,0.75,518,937,https://www.flickr.com/photos/tim_uk/29865043584,https://creativecommons.org/licenses/by/2.0/,Tim Sheerman-Chase,https://www.flickr.com/people/tim_uk/\nb4817b7ed2ef5cab,https://c1.staticflickr.com/9/8850/28261460800_1e12f57ef2_o.jpg,0.0,0.25,0.5,1.0,971,469,https://www.flickr.com/photos/permork/28261460800,https://creativecommons.org/licenses/by/2.0/,Per Mork,https://www.flickr.com/people/permork/\n1481fdedc84f8d7e,https://c1.staticflickr.com/9/8576/28234788343_60063730eb_o.jpg,0.333333333333,0.0,1.0,1.0,820,572,https://www.flickr.com/photos/dwhartwig/28234788343,https://creativecommons.org/licenses/by/2.0/,Daniel Hartwig,https://www.flickr.com/people/dwhartwig/\n91ec6ccae8627bc4,https://c1.staticflickr.com/9/8169/29089000754_e5d0f6008e_o.jpg,0.0,0.0,1.0,1.0,929,428,https://www.flickr.com/photos/danielchownet/29089000754,https://creativecommons.org/licenses/by/2.0/,Daniel Chow,https://www.flickr.com/people/danielchownet/\n6584e4d1e88fc504,https://c1.staticflickr.com/6/5755/30658637601_cddb02ddc5_o.jpg,0.258620689655,0.25,0.775862068966,1.0,982,666,https://www.flickr.com/photos/apardavila/30658637601,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n7775e606614f7109,https://c1.staticflickr.com/9/8504/29366880940_1a0467e53e_o.jpg,0.356605351171,0.0,1.0,0.75,310,363,https://www.flickr.com/photos/gails_pictures/29366880940/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n796c06b3b3e71a2f,https://c1.staticflickr.com/9/8735/27961750923_8c274875e4_o.jpg,0.0,0.0,0.75,0.75,973,779,https://flickr.com/45846171@N04/27961750923,https://creativecommons.org/licenses/by/2.0/,Andy Arthur,https://www.flickr.com/people/andyarthur/\nd5a032736124091e,https://c1.staticflickr.com/9/8562/29450157824_76e058afb1_o.jpg,0.0,0.25,0.475899280576,1.0,407,903,https://www.flickr.com/photos/eltb/29450157824,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n67cbc4909c6dc1fe,https://c1.staticflickr.com/9/8405/29870388090_24011a5222_o.jpg,0.25,0.0,1.0,0.57765451664,820,17,https://www.flickr.com/photos/jus10h/29870388090,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n0cf1006fa5ba76f7,https://c1.staticflickr.com/8/7386/27477466395_80a1f2101b_o.jpg,0.4375,0.0,1.0,0.75,763,238,https://www.flickr.com/photos/112024099@N03/27477466395,https://creativecommons.org/licenses/by/2.0/,chomjong,https://www.flickr.com/people/112024099@N03/\n311676a00c8893c4,https://c1.staticflickr.com/8/7292/27908420186_702bf9b39e_o.jpg,0.333333333333,0.0,1.0,1.0,548,425,https://www.flickr.com/photos/rhemkes/27908420186,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\n8044dd26fc14de39,https://c1.staticflickr.com/1/591/32315868536_c066a758e2_o.jpg,0.276510067114,0.0,0.829530201342,1.0,769,796,https://flickr.com/44124373758@N01/32315868536,https://creativecommons.org/licenses/by/2.0/,Oisin Hurley,https://www.flickr.com/people/oisinhurley/\n6f9955e55ef99f16,https://c1.staticflickr.com/6/5556/30610774366_1b34f7c58e_o.jpg,0.0,0.25,0.535877862595,1.0,133,72,https://www.flickr.com/photos/usfwsmtnprairie/30610774366,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n7f727c0b0ddfbd0e,https://c1.staticflickr.com/8/7503/29521464522_745013e728_o.jpg,0.479437229437,0.25,0.958874458874,1.0,760,748,https://flickr.com/25797459@N06/29521464522,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/\n08da2f33c958a2c5,https://c1.staticflickr.com/6/5347/31186865752_0d9a0e86ab_o.jpg,0.438430311231,0.0,1.0,1.0,147,86,https://www.flickr.com/photos/blachswan/31186865752,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\n216a352028b5a9ad,https://c1.staticflickr.com/8/7717/27406290326_ebea89f4cf_o.jpg,0.252730109204,0.0,1.0,1.0,19,104,https://www.flickr.com/photos/usfwsmidwest/27406290326,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n3724813a3c8c96ad,https://c1.staticflickr.com/8/7190/27485755226_4e89c38736_o.jpg,0.5,0.0,1.0,0.75,309,534,https://www.flickr.com/photos/nikkvalentine/27485755226,https://creativecommons.org/licenses/by/2.0/,The Manic Macrographer,https://www.flickr.com/people/nikkvalentine/\n33d792783c22d45f,https://c1.staticflickr.com/9/8390/29014863480_f5a0d8533a_o.jpg,0.0,0.0,0.561328125,0.75,324,879,http://www.flickr.com/photos/74542540@N00/29014863480,https://creativecommons.org/licenses/by/2.0/,Amit Patel,https://www.flickr.com/people/amitp/\n793f1ee90bb62f34,https://c1.staticflickr.com/9/8383/29241391666_7762c465ec_o.jpg,0.28882725832,0.25,0.86648177496,1.0,459,592,https://www.flickr.com/photos/r00s/29241391666/,https://creativecommons.org/licenses/by/2.0/,Ro\\315\\254\\315\\254\\315\\240\\315\\240\\315\\241\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240s\\315\\254\\315\\254\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240a\\315\\254\\315\\254\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240 Menkman,https://www.flickr.com/people/r00s/\n759a0a1ab6c15443,https://c1.staticflickr.com/8/7755/28099404020_077b11543d_o.jpg,0.0,0.25,0.5,1.0,443,751,https://www.flickr.com/photos/harshlight/28099404020/,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\n4371a4d28a882323,https://c1.staticflickr.com/6/5628/30441063612_2203d5d631_o.jpg,0.25,0.25,1.0,1.0,907,479,https://www.flickr.com/photos/stevendepolo/30441063612,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n9c2a53372d1eff74,https://c1.staticflickr.com/9/8577/28465403076_43a4c79cd2_o.jpg,0.46104815864,0.0,0.92209631728,0.75,404,428,https://www.flickr.com/photos/usnavy/28465403076,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n8f19026252749e5b,https://c1.staticflickr.com/1/722/33093497875_8a8b854e0b_o.jpg,0.248348017621,0.0,0.745044052863,0.75,672,577,https://www.flickr.com/photos/glorycycles/33093497875,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\ncc683067d2d52fe8,https://c1.staticflickr.com/6/5560/30616770974_87f1b8efd9_o.jpg,0.468844984802,0.25,1.0,1.0,699,805,https://www.flickr.com/photos/grassrootsgroundswell/30616770974/,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/\nb7ed9c42b29598ce,https://c1.staticflickr.com/9/8606/29314683256_920269b591_o.jpg,0.0,0.0,0.75,0.75,918,949,https://www.flickr.com/photos/alexschweigert/29314683256,https://creativecommons.org/licenses/by/2.0/,Alex Schweigert,https://www.flickr.com/people/alexschweigert/\n6fe7ce8ebc8f22b7,https://c1.staticflickr.com/9/8623/28418338381_cf3cef89b1_o.jpg,0.491228070175,0.0,0.982456140351,0.75,977,556,https://www.flickr.com/photos/lizadaly/28418338381,https://creativecommons.org/licenses/by/2.0/,Liza,https://www.flickr.com/people/lizadaly/\nc5e0b9edb1fa5190,https://c1.staticflickr.com/1/256/32391565520_a37fa9143c_o.jpg,0.333333333333,0.0,1.0,1.0,689,865,https://www.flickr.com/photos/futureshape/32391565520,https://creativecommons.org/licenses/by/2.0/,Alexander Baxevanis,https://www.flickr.com/people/futureshape/\ncfe1a78b6cc154be,https://c1.staticflickr.com/8/7741/26977413172_164c62c313_o.jpg,0.0,0.0,0.83498349835,1.0,602,593,https://www.flickr.com/photos/140473922@N07/26977413172/,https://creativecommons.org/licenses/by/2.0/,malnasfalu,https://www.flickr.com/people/140473922@N07/\n6a51a6a0bd7dc284,https://c1.staticflickr.com/1/589/31654285074_4f1a1396a5_o.jpg,0.5,0.0,1.0,0.75,91,650,https://www.flickr.com/photos/30478819@N08/31654285074,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\nd0326f9a31c4300f,https://c1.staticflickr.com/3/2497/32651155722_69025acc65_o.jpg,0.0,0.25,0.5,1.0,617,793,https://www.flickr.com/photos/noaamarinedebris/32651155722/,https://creativecommons.org/licenses/by/2.0/,NOAA Marine Debris Program,https://www.flickr.com/people/noaamarinedebris/\nda85153cbce214e9,https://c1.staticflickr.com/6/5609/31109641991_a170505603_o.jpg,0.0,0.0,0.75,1.0,524,627,https://www.flickr.com/photos/mig/31109641991,https://creativecommons.org/licenses/by/2.0/,miguelb,https://www.flickr.com/people/mig/\nd55fda7e2688fe42,https://c1.staticflickr.com/8/7752/28427051610_8eb6fcb315_o.jpg,0.0,0.0,0.5,0.75,470,610,https://www.flickr.com/photos/brindle95/28427051610,https://creativecommons.org/licenses/by/2.0/,Apollo,https://www.flickr.com/people/brindle95/\n89bbfa0990f087e8,https://c1.staticflickr.com/6/5730/30582869850_01f2763dfa_o.jpg,0.0,0.4375,0.75,1.0,650,635,https://www.flickr.com/photos/gruenemann/30582869850/,https://creativecommons.org/licenses/by/2.0/,John W. Schulze,https://www.flickr.com/people/gruenemann/\nb38fa0e5497c3ab9,https://c1.staticflickr.com/8/7627/27132552874_359ee26d18_o.jpg,0.0,0.0,1.0,1.0,669,754,https://www.flickr.com/photos/serdal/27132552874,https://creativecommons.org/licenses/by/2.0/,Abdulla Al Muhairi,https://www.flickr.com/people/serdal/\n59fe491c8d238f91,https://c1.staticflickr.com/8/7658/26759941810_8e35916b7c_o.jpg,0.28125,0.0,0.84375,0.75,405,843,https://www.flickr.com/photos/u07ch/26759941810,https://creativecommons.org/licenses/by/2.0/,Chris Hoare,https://www.flickr.com/people/u07ch/\ned95f24243c8fb92,https://c1.staticflickr.com/6/5329/30852149700_3c1eb60f62_o.jpg,0.408653846154,0.0,1.0,0.75,471,817,https://www.flickr.com/photos/pyride/30852149700/,https://creativecommons.org/licenses/by/2.0/,Julie anne Johnson,https://www.flickr.com/people/pyride/\n373ae7b6f09b3273,https://c1.staticflickr.com/8/7548/28128328046_4452c1a4da_o.jpg,0.0,0.0,0.579761904762,0.75,787,769,https://www.flickr.com/photos/archivesnz/28128328046,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/\n70495b91befea093,https://c1.staticflickr.com/8/7668/27889938681_431b8a7552_o.jpg,0.25,0.25,0.75,1.0,309,545,https://www.flickr.com/photos/42244964@N03/27889938681,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/\n8f08f1f32cca10a5,https://c1.staticflickr.com/1/349/31057978814_0edf8d1d5d_o.jpg,0.25,0.0,1.0,1.0,875,969,https://www.flickr.com/photos/69203347@N03/31057978814,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n5f3702bf2b5c5941,https://c1.staticflickr.com/8/7113/27282503636_32b7c42a14_o.jpg,0.0,0.0,0.5625,0.75,518,816,https://www.flickr.com/photos/investmenttotal/27282503636,https://creativecommons.org/licenses/by/2.0/,InvestmentTotal.com,https://www.flickr.com/people/investmenttotal/\n0fd701f03891ad1e,https://c1.staticflickr.com/8/7495/27791382936_7acdeefab9_o.jpg,0.25,0.0,1.0,0.556376360809,532,710,https://www.flickr.com/photos/51764518@N02/27791382936,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n9c55ed67f01b4bab,https://c1.staticflickr.com/9/8847/28932719496_bb180fac8e_o.jpg,0.0,0.0,0.75,0.5,777,801,https://www.flickr.com/photos/wwworks/28932719496,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/\n6cabb8f2ed6a5e48,https://c1.staticflickr.com/8/7215/27535842545_6ecd490e05_o.jpg,0.0,0.230198019802,0.75,0.690594059406,895,791,https://www.flickr.com/photos/lge/27535842545,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n0d99fc710c916c53,https://c1.staticflickr.com/8/7667/26960112102_d5b4713fdc_o.jpg,0.0,0.25,0.75,1.0,418,890,https://www.flickr.com/photos/cydcor/26960112102,https://creativecommons.org/licenses/by/2.0/,Cydcor,https://www.flickr.com/people/cydcor/\n7d8aea537ebbd610,https://c1.staticflickr.com/9/8018/28998694956_53fd3b1c6f_o.jpg,0.5,0.25,1.0,1.0,702,329,https://www.flickr.com/photos/david_a_l/28998694956/,https://creativecommons.org/licenses/by/2.0/,David \\303\\201lvarez L\\303\\263pez,https://www.flickr.com/people/david_a_l/\n7191ed980d370988,https://c1.staticflickr.com/8/7572/29457133980_c26b00fbe5_o.jpg,0.25,0.25,0.75,1.0,415,599,https://www.flickr.com/photos/mujitra/29457133980,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/\nce250c5f6c6c925c,https://c1.staticflickr.com/6/5756/30458339032_a7da4229f2_o.jpg,0.0,0.0,1.0,1.0,518,592,https://www.flickr.com/photos/watty_rugby/30458339032/,https://creativecommons.org/licenses/by/2.0/,Steve Watkins,https://www.flickr.com/people/watty_rugby/\nc98bb0c38792f9a5,https://c1.staticflickr.com/8/7789/27466002676_65f0081a69_o.jpg,0.438430311231,0.0,1.0,1.0,392,9,https://www.flickr.com/photos/lwpkommunikacio/27466002676,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\nc7ea406b501e47cb,https://c1.staticflickr.com/6/5805/29381340434_1be1714322_o.jpg,0.0,0.0,0.5625,0.75,975,329,https://www.flickr.com/photos/jsjgeology/29381340434,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n0804141fc80a512b,https://c1.staticflickr.com/6/5532/31429066966_431fa0dbb0_o.jpg,0.498159057437,0.0,0.996318114875,0.75,752,790,https://www.flickr.com/photos/davehamster/31429066966,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n71522fb58f7879ee,https://c1.staticflickr.com/8/7649/27087307515_c79c6e9b15_o.jpg,0.560479041916,0.0,1.0,1.0,629,526,https://www.flickr.com/photos/glynlowe/27087307515,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/\n820e369be4f64c37,https://c1.staticflickr.com/9/8078/29061269866_2508d72a24_o.jpg,0.333333333333,0.0,1.0,1.0,477,121,https://www.flickr.com/photos/elsie/29061269866/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\n20c7fdb3317a5432,https://c1.staticflickr.com/8/7104/27718687611_0255d32a65_o.jpg,0.0,0.0,0.75,1.0,866,804,https://www.flickr.com/photos/jeepersmedia/27718687611,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n6a20e5e1e6a570c5,https://c1.staticflickr.com/9/8076/29408860532_04acb42ecd_o.jpg,0.333333333333,0.0,1.0,1.0,699,643,https://www.flickr.com/photos/nanpalmero/29408860532,https://creativecommons.org/licenses/by/2.0/,Nan Palmero,https://www.flickr.com/people/nanpalmero/\n8282eeec6fd402db,https://c1.staticflickr.com/9/8383/29262994366_e639cc4093_o.jpg,0.25,0.28125,1.0,0.84375,955,342,https://www.flickr.com/photos/scotnelson/29262994366,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n3c73661be26c374d,https://c1.staticflickr.com/2/1692/26686963731_4c7b05505d_o.jpg,0.243449781659,0.25,0.730349344978,1.0,977,121,https://www.flickr.com/photos/13476480@N07/26686963731,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n2b095b23f25c7333,https://c1.staticflickr.com/6/5487/22762078788_47c4b4437c_o.jpg,0.25,0.25,1.0,1.0,970,679,https://flickr.com/77315663@N00/22762078788,https://creativecommons.org/licenses/by/2.0/,Farther Along,https://www.flickr.com/people/jcbrandon/\n55cb5a6e876a9fef,https://c1.staticflickr.com/1/656/32071453581_44d1d559c2_o.jpg,0.279641185647,0.25,0.838923556942,1.0,309,934,https://www.flickr.com/photos/gails_pictures/32071453581,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n0a90c071f4658ec0,https://c1.staticflickr.com/6/5465/30332288814_32c01f9dde_o.jpg,0.439547581903,0.0,1.0,0.75,662,922,https://www.flickr.com/photos/andreboeni/30332288814,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n11181569176d4648,https://c1.staticflickr.com/6/5557/30880263980_baf0aecb34_o.jpg,0.46499339498,0.0,1.0,1.0,735,975,https://www.flickr.com/photos/hisgett/30880263980,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\nb0c2fd91d40d7c35,https://c1.staticflickr.com/6/5723/30242987100_1d78f024ee_o.jpg,0.25,0.25,0.75,1.0,976,569,https://www.flickr.com/photos/jsorbie/30242987100,https://creativecommons.org/licenses/by/2.0/,Jim Sorbie,https://www.flickr.com/people/jsorbie/\n094629f317cb3add,https://c1.staticflickr.com/4/3796/32974694701_9d7d70f691_o.jpg,0.25,0.277173913043,1.0,0.83152173913,418,778,https://www.flickr.com/photos/linvoyage/32974694701/,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/\n85d23545982b7f8c,https://c1.staticflickr.com/9/8391/29075134512_71a18865f5_o.jpg,0.25,0.0,1.0,1.0,889,13,https://www.flickr.com/photos/fdecomite/29075134512/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\n956869d69ffc83eb,https://c1.staticflickr.com/8/7347/27356657122_70ce604f1b_o.jpg,0.0,0.0,0.745709828393,1.0,806,645,https://www.flickr.com/photos/publicresourceorg/27356657122/,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/\n5f4b4946bdfe2ad4,https://c1.staticflickr.com/9/8361/29445464890_95280f1e96_o.jpg,0.0,0.25,0.5625,1.0,910,549,https://www.flickr.com/photos/orsorama/29445464890/,https://creativecommons.org/licenses/by/2.0/,Franco Dal Molin,https://www.flickr.com/people/orsorama/\n50ebcb625858518c,https://c1.staticflickr.com/6/5505/30700149596_e65533128e_o.jpg,0.249079528719,0.0,0.747238586156,0.75,752,839,https://www.flickr.com/photos/davehamster/30700149596,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n651e466339f928c7,https://c1.staticflickr.com/8/7452/26745627380_eb1760bfb9_o.jpg,0.0,0.0,0.421177266576,0.75,138,679,https://www.flickr.com/photos/barrigoni/26745627380/,https://creativecommons.org/licenses/by/2.0/,HarmonyonPlanetEarth,https://www.flickr.com/people/barrigoni/\nadb7ebb0c1aa25d1,https://c1.staticflickr.com/8/7510/28105009625_aaa5c7241c_o.jpg,0.334315169367,0.0,1.0,1.0,618,762,https://www.flickr.com/photos/gobiernodechile/28105009625,https://creativecommons.org/licenses/by/2.0/,Gobierno de Chile,https://www.flickr.com/people/gobiernodechile/\na217a3348fc1ca33,https://c1.staticflickr.com/8/7579/26987845346_84621f3d11_o.jpg,0.4375,0.25,1.0,1.0,47,106,https://www.flickr.com/photos/60740813@N04/26987845346,https://creativecommons.org/licenses/by/2.0/,Michele Lamberti,https://www.flickr.com/people/60740813@N04/\n5395c37718514504,https://c1.staticflickr.com/2/1675/26755595865_59cfb0feec_o.jpg,0.5,0.0,1.0,0.75,15,751,https://www.flickr.com/photos/briangratwicke/26755595865/,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/\n8b7694b4d97d4cf5,https://c1.staticflickr.com/1/326/31479470461_0fdb6de0f7_o.jpg,0.31592039801,0.0,0.94776119403,0.75,760,156,https://www.flickr.com/photos/51764518@N02/31479470461,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n7bbe4f3334281c71,https://c1.staticflickr.com/6/5724/30246774161_fabe5f3601_o.jpg,0.5,0.0,1.0,0.75,519,772,https://www.flickr.com/photos/box_repsol/30246774161,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nf4333fecb75d5fb2,https://c1.staticflickr.com/9/8317/29003795082_9be4a6d04f_o.jpg,0.0,0.0,1.0,0.75,708,758,https://www.flickr.com/photos/bazzadarambler/29003795082,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\n90e15e3b757438c5,https://c1.staticflickr.com/6/5599/30417754741_84e904e967_o.jpg,0.28125,0.25,0.84375,1.0,699,546,https://www.flickr.com/photos/kudumomo/30417754741/,https://creativecommons.org/licenses/by/2.0/,momo,https://www.flickr.com/people/kudumomo/\ncfbc3c4a20c315da,https://c1.staticflickr.com/8/7410/27314989426_565dd559ee_o.jpg,0.0,0.0,0.666666666667,1.0,968,473,https://www.flickr.com/photos/barnimages/27314989426,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\n7a668babde838176,https://c1.staticflickr.com/6/5600/29885485184_ce182a163b_o.jpg,0.0,0.282225237449,1.0,0.846675712347,407,814,https://www.flickr.com/photos/eltb/29885485184,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n825ee445b97d2a6f,https://c1.staticflickr.com/8/7365/26272351023_f0a69afd4a_o.jpg,0.25,0.0,0.75,0.75,826,266,https://www.flickr.com/photos/daveynin/26272351023,https://creativecommons.org/licenses/by/2.0/,daveynin,https://www.flickr.com/people/daveynin/\n07125eb61aa541e9,https://c1.staticflickr.com/8/7631/28586505570_e8eb50f6b8_o.jpg,0.502573529412,0.25,1.0,1.0,437,776,https://www.flickr.com/photos/rich701/28586505570,https://creativecommons.org/licenses/by/2.0/,Richard,https://www.flickr.com/people/rich701/\n8ef712565196f839,https://c1.staticflickr.com/1/624/31031634973_5b3036450f_o.jpg,0.381557377049,0.0,1.0,0.75,662,272,https://www.flickr.com/photos/hisgett/31031634973,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n4313065196ceb86a,https://c1.staticflickr.com/8/7666/27433211566_58b7944c90_o.jpg,0.262273413897,0.0,0.786820241692,0.75,780,919,https://www.flickr.com/photos/thoseguys119/27433211566/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n2d9db6275b0e91e1,https://c1.staticflickr.com/9/8831/28433055282_95e08f83e1_o.jpg,0.499263622975,0.0,0.99852724595,0.75,404,523,https://www.flickr.com/photos/usnavy/28433055282,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n6f324b5bb67f51b1,https://c1.staticflickr.com/8/7433/27821048570_3893d31206_o.jpg,0.0,0.0,0.75,1.0,923,819,https://www.flickr.com/photos/yto/27821048570,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/\n0c45a270a6eb9937,https://c1.staticflickr.com/9/8115/29398964756_a216da0724_o.jpg,0.211668928087,0.25,0.635006784261,1.0,539,176,https://www.flickr.com/photos/eltb/29398964756,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nb4039b92b796fd0b,https://c1.staticflickr.com/2/1591/26490880130_670d10231e_o.jpg,0.452546296296,0.0,1.0,0.75,438,169,https://www.flickr.com/photos/kansallisarkisto/26490880130,https://creativecommons.org/licenses/by/2.0/,Kansallisarkisto,https://www.flickr.com/people/kansallisarkisto/\ne513379076125e2c,https://c1.staticflickr.com/8/7471/27822092586_8c43d66994_o.jpg,0.4375,0.25,1.0,1.0,977,770,https://www.flickr.com/photos/bwgtheatre/27822092586,https://creativecommons.org/licenses/by/2.0/,Bradley Griffin,https://www.flickr.com/people/bwgtheatre/\n0304bb981b51f764,https://c1.staticflickr.com/8/7676/27020459980_9f749618ba_o.jpg,0.475453172205,0.0,1.0,0.75,780,845,https://www.flickr.com/photos/thoseguys119/27020459980,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n8a84b78e0ed727f1,https://c1.staticflickr.com/8/7330/28063207555_ef08081098_o.jpg,0.333333333333,0.0,1.0,1.0,480,483,https://www.flickr.com/photos/karen_roe/28063207555,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/\nae87647541e29397,https://c1.staticflickr.com/9/8279/29190916386_010b8ac106_o.jpg,0.299878836834,0.0,0.899636510501,0.75,336,356,https://www.flickr.com/photos/peter-trimming/29190916386,https://creativecommons.org/licenses/by/2.0/,Peter Trimming,https://www.flickr.com/people/peter-trimming/\ned1bee886ef25504,https://c1.staticflickr.com/9/8868/28063123923_0a27d7f55d_o.jpg,0.0,0.25,0.5,1.0,512,868,https://www.flickr.com/photos/daveseven/28063123923,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/\na227fdb9d07c04df,https://c1.staticflickr.com/9/8874/28139783251_c5de8da770_o.jpg,0.258164852255,0.0,1.0,1.0,581,737,https://www.flickr.com/photos/sporst/28139783251,https://creativecommons.org/licenses/by/2.0/,sporst,https://www.flickr.com/people/sporst/\nb53073dd1e357be6,https://c1.staticflickr.com/1/607/32558218935_2e52afd6f2_o.jpg,0.25,0.0,1.0,0.75,641,462,https://www.flickr.com/photos/ruthanddave/32558218935,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n433093ec597a8810,https://c1.staticflickr.com/1/781/32163987625_9c26f048ff_o.jpg,0.0,0.0,1.0,0.565217391304,888,713,https://www.flickr.com/photos/eltb/32163987625,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\neb2910f7acc95c57,https://c1.staticflickr.com/9/8543/28574787014_93b71fcf4a_o.jpg,0.25,0.0,0.75,0.75,577,896,https://www.flickr.com/photos/virtualpainter/28574787014,https://creativecommons.org/licenses/by/2.0/,Taka Umemura,https://www.flickr.com/people/virtualpainter/\n3be49614088e63dc,https://c1.staticflickr.com/8/7377/26835732401_9c12ace971_o.jpg,0.0,0.25,0.5625,1.0,934,151,https://www.flickr.com/photos/jeepersmedia/26835732401,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nf99a3c016a7fa202,https://c1.staticflickr.com/8/7730/29296388745_7755996646_o.jpg,0.0,0.25,0.5625,1.0,437,177,https://www.flickr.com/photos/sebilden/29296388745/,https://creativecommons.org/licenses/by/2.0/,David J,https://www.flickr.com/people/sebilden/\n60a3850b34c4c0fe,https://c1.staticflickr.com/8/7279/27212291713_cd85fbc77a_o.jpg,0.249631811487,0.25,0.748895434462,1.0,896,391,https://www.flickr.com/photos/621crw/27212291713,https://creativecommons.org/licenses/by/2.0/,The 621st Contingency Response Wing,https://www.flickr.com/people/621crw/\nd007442615d580c7,https://c1.staticflickr.com/2/1504/26703054011_6fe7ddc835_o.jpg,0.273846153846,0.0,1.0,1.0,437,458,https://www.flickr.com/photos/darioalvarez/26703054011,https://creativecommons.org/licenses/by/2.0/,Dario Alvarez,https://www.flickr.com/people/darioalvarez/\nf8f90b6a2ff3a5ca,https://c1.staticflickr.com/9/8258/29440143700_51967ac0fc_o.jpg,0.25,0.0,1.0,0.75,672,452,https://www.flickr.com/photos/glorycycles/29440143700,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\nee375f7e73e3b84f,https://c1.staticflickr.com/8/7422/28007703456_ae82c2b756_o.jpg,0.4375,0.25,1.0,1.0,599,869,https://www.flickr.com/photos/jordanklein/28007703456/,https://creativecommons.org/licenses/by/2.0/,Jordan Klein,https://www.flickr.com/people/jordanklein/\nc857d3f49a6d9c11,https://c1.staticflickr.com/9/8273/30298912162_449559cbff_o.jpg,0.0,0.0,0.5,0.75,556,987,https://www.flickr.com/photos/grahammitchellphotography/30298912162/,https://creativecommons.org/licenses/by/2.0/,Graham  Mitchell,https://www.flickr.com/people/grahammitchellphotography/\n1d9f64da62574f30,https://c1.staticflickr.com/9/8889/28297719030_7f933dac1f_o.jpg,0.0,0.0,0.75,1.0,325,766,https://www.flickr.com/photos/130942787@N03/28297719030,https://creativecommons.org/licenses/by/2.0/,Guy Elen,https://www.flickr.com/people/130942787@N03/\nb0b583c3294c3ad2,https://c1.staticflickr.com/8/7113/26819420020_231176d14d_o.jpg,0.28125,0.25,0.84375,1.0,418,892,https://www.flickr.com/photos/39993437@N04/26819420020,https://creativecommons.org/licenses/by/2.0/,Jamil Razzaq,https://www.flickr.com/people/39993437@N04/\n9f5cb2c8f2d0b24e,https://c1.staticflickr.com/8/7738/27943924966_9b451d7bdf_o.jpg,0.28125,0.0,0.84375,0.75,820,631,https://www.flickr.com/photos/30677915@N02/27943924966,https://creativecommons.org/licenses/by/2.0/,guy  hurst,https://www.flickr.com/people/30677915@N02/\nd540cec965053bf6,https://c1.staticflickr.com/8/7469/29532291920_0a1019984d_o.jpg,0.45393858478,0.0,1.0,1.0,963,759,https://www.flickr.com/photos/jsjgeology/29532291920,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nfb9a4a41888c8579,https://c1.staticflickr.com/9/8299/28119126890_e76c980d62_o.jpg,0.333333333333,0.0,1.0,1.0,818,658,https://www.flickr.com/photos/greggjerdingen/28119126890,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n843f9eff05e7fbcc,https://c1.staticflickr.com/3/2836/32790048955_3d3f723197_o.jpg,0.0,0.0,0.662261380323,1.0,672,812,https://www.flickr.com/photos/glorycycles/32790048955,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n6d4119c703062fef,https://c1.staticflickr.com/8/7298/28027403425_8e3b49679c_o.jpg,0.5,0.0,1.0,0.75,252,36,https://www.flickr.com/photos/pasa/28027403425,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n57b8ec98c0c88a16,https://c1.staticflickr.com/8/7027/26734228484_c93025b4ca_o.jpg,0.28125,0.25,0.84375,1.0,780,683,https://www.flickr.com/photos/119034083@N02/26734228484,https://creativecommons.org/licenses/by/2.0/,nybuspics,https://www.flickr.com/people/119034083@N02/\nc3f9ddf6b5ade520,https://c1.staticflickr.com/9/8386/29728121721_2e0c8a36c9_o.jpg,0.0,0.0,0.666666666667,1.0,461,998,https://www.flickr.com/photos/newsoresund/29728121721,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/\nca2a43e512b5c510,https://c1.staticflickr.com/9/8179/29321681252_071d9135a4_o.jpg,0.0,0.0,0.775834658188,1.0,577,919,https://www.flickr.com/photos/jared422/29321681252,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/\n0a98c90a9ffababd,https://c1.staticflickr.com/9/8450/29284081335_8ec6b855f4_o.jpg,0.0,0.0,0.75,1.0,98,819,https://www.flickr.com/photos/9750464@N02/29284081335/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\nb47665eea2b4f9ed,https://c1.staticflickr.com/8/7334/27028278075_8847aff92e_o.jpg,0.496696035242,0.25,0.993392070485,1.0,124,883,https://www.flickr.com/photos/whitefield_d/27028278075,https://creativecommons.org/licenses/by/2.0/,whity,https://www.flickr.com/people/whitefield_d/\n2e1107bf5d4ca7c4,https://c1.staticflickr.com/8/7362/27383002910_372db89546_o.jpg,0.0,0.0,0.666666666667,1.0,806,463,https://www.flickr.com/photos/darrencole/27383002910/,https://creativecommons.org/licenses/by/2.0/,Darren765,https://www.flickr.com/people/darrencole/\nc798689965793b41,https://c1.staticflickr.com/9/8316/28419798014_8b6002ed9d_o.jpg,0.28125,0.25,0.84375,1.0,718,870,https://www.flickr.com/photos/hugo90/28419798014,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n2284c0096329463d,https://c1.staticflickr.com/1/360/31478354833_9a810029d9_o.jpg,0.5,0.0,1.0,0.75,240,379,https://www.flickr.com/photos/33712891@N04/31478354833,https://creativecommons.org/licenses/by/2.0/,tracydonald,https://www.flickr.com/people/tracydonald/\n9efa722b7b18ecab,https://c1.staticflickr.com/3/2581/32070491794_86376aa5c5_o.jpg,0.25,0.25,0.75,1.0,519,446,https://www.flickr.com/photos/box_repsol/32070491794,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n183fe3f472c4ffec,https://c1.staticflickr.com/8/7318/27290695103_bae3c5a14f_o.jpg,0.250923190547,0.25,0.75276957164,1.0,407,766,https://www.flickr.com/photos/eltb/27290695103,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n417670ae481c9ac3,https://c1.staticflickr.com/9/8337/29863557746_1475feebbc_o.jpg,0.0,0.0,0.421177266576,0.75,669,439,https://www.flickr.com/photos/ankurp/29863557746,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\nf3f2347fd7ec8112,https://c1.staticflickr.com/8/7394/27522569541_ac2ee7f2db_o.jpg,0.0,0.0,0.5625,0.75,405,532,https://www.flickr.com/photos/shankaronline/27522569541,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nf3de3a9ff54c7ed5,https://c1.staticflickr.com/6/5441/31015208816_ca68d5492d_o.jpg,0.0,0.0,0.388166449935,0.75,889,89,https://flickr.com/38986305@N06/31015208816,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/\nda0ad49443639c49,https://c1.staticflickr.com/6/5555/30437546563_45d097e374_o.jpg,0.0,0.25,0.475215517241,1.0,820,436,https://www.flickr.com/photos/jus10h/30437546563,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\ncf8f44a7362cad8e,https://c1.staticflickr.com/6/5731/29806477191_1f35b3120a_o.jpg,0.210588633288,0.25,0.631765899865,1.0,669,601,https://www.flickr.com/photos/ankurp/29806477191,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\ne186330fb9c14ec5,https://c1.staticflickr.com/8/7081/27293862200_9435280b38_o.jpg,0.0,0.330871491876,1.0,1.0,407,805,https://www.flickr.com/photos/eltb/27293862200,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n7d772f64ec0c0ec8,https://c1.staticflickr.com/6/5046/29990359851_4efb303572_o.jpg,0.234308131241,0.0,0.702924393723,0.75,556,565,https://www.flickr.com/photos/kansasscanner/29990359851,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\n07d7cec77e33a6ba,https://c1.staticflickr.com/6/5710/29862839724_86f5f4c22e_o.jpg,0.253152818991,0.25,0.759458456973,1.0,699,667,https://www.flickr.com/photos/bikashdas/29862839724/,https://creativecommons.org/licenses/by/2.0/,Bikash Das,https://www.flickr.com/people/bikashdas/\nac1435ed348ce988,https://c1.staticflickr.com/9/8607/28337101075_84dce7efee_o.jpg,0.0,0.0,0.75,1.0,975,413,https://www.flickr.com/photos/jsjgeology/28337101075/,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n2a259cef3dd194ff,https://c1.staticflickr.com/9/8276/28904784613_eab8cda5e7_o.jpg,0.0,0.25,0.5625,1.0,769,119,https://www.flickr.com/photos/stmunchins/28904784613,https://creativecommons.org/licenses/by/2.0/,St Munchin&#x27;s College,https://www.flickr.com/people/stmunchins/\n34eff871384c98b7,https://c1.staticflickr.com/8/7285/27676432146_3a9899fb3f_o.jpg,0.248348017621,0.0,0.745044052863,0.75,16,440,https://www.flickr.com/photos/usfwsmidwest/27676432146,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\neaa398ee21a7935a,https://c1.staticflickr.com/3/2217/32464357950_68d26683e9_o.jpg,0.333333333333,0.0,1.0,1.0,116,170,https://www.flickr.com/photos/silkebaron/32464357950,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/\nea7f67790d0d1acb,https://c1.staticflickr.com/6/5752/31355012995_65342e278b_o.jpg,0.42174796748,0.25,0.843495934959,1.0,699,713,https://www.flickr.com/photos/franganillo/31355012995,https://creativecommons.org/licenses/by/2.0/,Jorge Franganillo,https://www.flickr.com/people/franganillo/\nbd81b18fc7aeb622,https://c1.staticflickr.com/8/7522/26715765294_87b57acff7_o.jpg,0.305872756933,0.0,0.917618270799,0.75,776,205,https://www.flickr.com/photos/simanta_ongong/26715765294/,https://creativecommons.org/licenses/by/2.0/,simanta ongong,https://www.flickr.com/people/simanta_ongong/\n3a6e060b4e4e5679,https://c1.staticflickr.com/6/5738/30630040172_cd95d2379b_o.jpg,0.547685834502,0.25,1.0,1.0,982,383,https://www.flickr.com/photos/apardavila/30630040172,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n3671d4e197b45d67,https://c1.staticflickr.com/8/7431/27122090570_37ee609034_o.jpg,0.499263622975,0.0,0.99852724595,0.75,822,500,https://www.flickr.com/photos/nlny/27122090570/,https://creativecommons.org/licenses/by/2.0/,Harrie van Veen,https://www.flickr.com/people/nlny/\nc6dc73dd474bd5ef,https://c1.staticflickr.com/9/8679/28253668176_505c1f2058_o.jpg,0.499263622975,0.0,0.99852724595,0.75,499,697,https://www.flickr.com/photos/agenciabrasilia/28253668176,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n228fdb06c678fbae,https://c1.staticflickr.com/8/7063/27869156366_bd427fb4d6_o.jpg,0.333333333333,0.0,1.0,1.0,484,507,https://flickr.com/27538469@N06/27869156366,https://creativecommons.org/licenses/by/2.0/,Colin Gregory,https://www.flickr.com/people/27538469@N06/\nae3a195359c4c198,https://c1.staticflickr.com/1/296/32288947381_dcda20718d_o.jpg,0.0,0.0,0.7484375,1.0,461,483,https://flickr.com/29350288@N06/32288947381,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/\nd9ed3c9314e21f56,https://c1.staticflickr.com/9/8461/29183477620_9f3fc3dd83_o.jpg,0.0,0.0,0.662261380323,1.0,484,288,https://www.flickr.com/photos/sybarite48/29183477620,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nb1eea5e72b0bb211,https://c1.staticflickr.com/1/562/32702359576_7b0b8151be_o.jpg,0.0,0.0,0.75,1.0,908,515,https://flickr.com/76396789@N00/32702359576,https://creativecommons.org/licenses/by/2.0/,Tjeerd Wiersma,https://www.flickr.com/people/tjeerd/\nb98022eec66378e7,https://c1.staticflickr.com/1/642/31294291983_2bcacc72b0_o.jpg,0.333333333333,0.0,1.0,1.0,760,210,https://flickr.com/116451027@N08/31294291983,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/\nc0acc56a3abd9256,https://c1.staticflickr.com/8/7409/27819557475_2e66cdf64e_o.jpg,0.0,0.0,0.317273795535,0.75,815,588,http://www.flickr.com/photos/7332125@N04/27819557475,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n579c364d849e4700,https://c1.staticflickr.com/9/8023/28593597514_7a1880f0fe_o.jpg,0.0,0.0,0.666666666667,1.0,651,211,https://www.flickr.com/photos/jus10h/28593597514,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\ndfc055abdd389f72,https://c1.staticflickr.com/9/8212/29866116716_8d8686b7ae_o.jpg,0.25,0.28125,1.0,0.84375,459,551,https://www.flickr.com/photos/atoach/29866116716,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\ne2a618de2db3ec0c,https://c1.staticflickr.com/9/8399/29408962884_d38742c7dc_o.jpg,0.333333333333,0.0,1.0,1.0,561,642,https://www.flickr.com/photos/smaedli/29408962884,https://creativecommons.org/licenses/by/2.0/,Chad Kainz,https://www.flickr.com/people/smaedli/\n7488970f310fa53f,https://c1.staticflickr.com/8/7192/27399620762_47397920ba_o.jpg,0.0,0.0,0.666666666667,1.0,512,147,https://www.flickr.com/photos/greggjerdingen/27399620762,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n12f9b8aa9d59fd53,https://c1.staticflickr.com/8/7398/27742799606_6703b9c23a_o.jpg,0.5,0.0,1.0,0.75,100,96,https://www.flickr.com/photos/happymillerman/27742799606,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\n9a65078827dee0dc,https://c1.staticflickr.com/1/701/32996049780_873f83d898_o.jpg,0.333333333333,0.0,1.0,1.0,33,635,https://www.flickr.com/photos/briangratwicke/32996049780,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/\nf26453821e0889ee,https://c1.staticflickr.com/1/717/31979238692_0fbc2ba4d9_o.jpg,0.28125,0.25,0.84375,1.0,635,590,https://flickr.com/59595815@N03/31979238692,https://creativecommons.org/licenses/by/2.0/,MTA Capital Construction Mega Projects,https://www.flickr.com/people/mtacc-esa/\n40967df5367606fd,https://c1.staticflickr.com/1/257/31719840804_c9626a2bbd_o.jpg,0.25,0.299738219895,1.0,1.0,747,853,https://flickr.com/56292751@N03/31719840804,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/\na3d0800a98d5da65,https://c1.staticflickr.com/9/8169/28453843191_8e24541875_o.jpg,0.0,0.0,0.663235294118,1.0,615,210,https://www.flickr.com/photos/toomore/28453843191,https://creativecommons.org/licenses/by/2.0/,Toomore Chiang,https://www.flickr.com/people/toomore/\n903e6d1d34d4c358,https://c1.staticflickr.com/9/8243/29487212981_13dc50542c_o.jpg,0.0,0.25,0.561328125,1.0,961,213,https://www.flickr.com/photos/jwynia/29487212981,https://creativecommons.org/licenses/by/2.0/,J Wynia,https://www.flickr.com/people/jwynia/\n1672d505b98747a4,https://c1.staticflickr.com/6/5786/31141677486_06c9dcdc92_o.jpg,0.0,0.0,0.75,1.0,875,449,https://flickr.com/36548767@N08/31141677486,https://creativecommons.org/licenses/by/2.0/,Matt Davis,https://www.flickr.com/people/pics-by-mpd/\n7ccfc54dc777e951,https://c1.staticflickr.com/9/8103/28981734635_d03a9a14fc_o.jpg,0.25,0.25,1.0,1.0,980,597,https://www.flickr.com/photos/beglen/28981734635,https://creativecommons.org/licenses/by/2.0/,\"David, Bergin, Emmett and Elliott\",https://www.flickr.com/people/beglen/\n32fbd27a06cf3e01,https://c1.staticflickr.com/6/5546/30388150293_3135126e54_o.jpg,0.25,0.0,1.0,1.0,763,205,https://www.flickr.com/photos/brighton/30388150293,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/\nc5ba7deed4f0a13e,https://c1.staticflickr.com/8/7187/27501492822_fda4a5f205_o.jpg,0.333333333333,0.0,1.0,1.0,485,298,https://www.flickr.com/photos/10459174@N03/27501492822/in/pool-1507265@N24/,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/\n723f8c75452c186a,https://c1.staticflickr.com/6/5772/30454132455_9b455d662e_o.jpg,0.5,0.0,1.0,0.75,822,791,http://www.flickr.com/photos/132646954@N02/30454132455,https://creativecommons.org/licenses/by/2.0/,dronepicr,https://www.flickr.com/people/132646954@N02/\nfcd0a20ee7d5351e,https://c1.staticflickr.com/6/5623/29712252233_d248f6b25b_o.jpg,0.25,0.0,1.0,0.75,617,932,https://flickr.com/49503166727@N01/29712252233,https://creativecommons.org/licenses/by/2.0/,John Patrick Robichaud,https://www.flickr.com/people/troismarteaux/\nc60691ff7d33ea2e,https://c1.staticflickr.com/9/8747/28148066654_3f63362d78_o.jpg,0.25,0.0,0.75,0.75,820,660,https://www.flickr.com/photos/thecomeupshow/28148066654/,https://creativecommons.org/licenses/by/2.0/,The Come Up Show,https://www.flickr.com/people/thecomeupshow/\n2e5af1c8c6f07204,https://c1.staticflickr.com/9/8223/29382916804_24ddfaa4ef_o.jpg,0.0,0.25,0.5,1.0,471,451,https://www.flickr.com/photos/dakone2k/29382916804,https://creativecommons.org/licenses/by/2.0/,Daniel Cruz Valle,https://www.flickr.com/people/dakone2k/\nca9b59b1a1cf6fcd,https://c1.staticflickr.com/6/5610/31682033341_ccdd5ca983_o.jpg,0.5,0.0,1.0,0.75,857,676,https://www.flickr.com/photos/quinet/31682033341,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n388eedf525c989cb,https://c1.staticflickr.com/8/7553/27056674005_1a4e1598a3_o.jpg,0.5,0.25,1.0,1.0,346,747,https://www.flickr.com/photos/slapers/27056674005,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\nbf6b194ab9471379,https://c1.staticflickr.com/9/8563/28536781261_a5c95ccd30_o.jpg,0.25,0.0,1.0,1.0,437,783,https://www.flickr.com/photos/65843623@N02/28536781261,https://creativecommons.org/licenses/by/2.0/,Alberto from Spain,https://www.flickr.com/people/65843623@N02/\nf4adc2d2443bfeba,https://c1.staticflickr.com/9/8233/29903332911_947e38648c_o.jpg,0.5,0.0,1.0,0.75,548,432,https://www.flickr.com/photos/rhemkes/29903332911/,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\n68178f59e9e1f79a,https://c1.staticflickr.com/9/8381/29363643586_b3ae1b12c7_o.jpg,0.481981981982,0.25,1.0,1.0,718,668,https://www.flickr.com/photos/cogdog/29363643586,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n32b0ed2459c6b80d,https://c1.staticflickr.com/9/8259/28956116063_cd94a1af36_o.jpg,0.0,0.273978685613,0.75,1.0,318,380,https://www.flickr.com/photos/gails_pictures/28956116063,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n41660e685b1f78e7,https://c1.staticflickr.com/8/7476/28114501400_3fbdc63282_o.jpg,0.249079528719,0.25,0.747238586156,1.0,320,247,https://www.flickr.com/photos/remcclean/28114501400,https://creativecommons.org/licenses/by/2.0/,remcclean,https://www.flickr.com/people/remcclean/\n7afb8841dfbeb94b,https://c1.staticflickr.com/1/274/31695969154_4581cebbb7_o.jpg,0.0,0.0,0.777070063694,1.0,306,47,https://www.flickr.com/photos/gails_pictures/31695969154,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n428e143b941e7a4b,https://c1.staticflickr.com/1/744/32093478881_38752b8640_o.jpg,0.48007518797,0.0,1.0,0.75,794,860,http://www.flickr.com/photos/governortomwolf/32093478881/,https://creativecommons.org/licenses/by/2.0/,Governor Tom Wolf,https://www.flickr.com/people/governortomwolf/\nab3c9183c5c6896d,https://c1.staticflickr.com/8/7148/26287121754_8b0f5602f0_o.jpg,0.4375,0.0,1.0,0.75,717,644,https://www.flickr.com/photos/andreboeni/26287121754/,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n8a0af86d3d6be11f,https://c1.staticflickr.com/8/7323/27730962321_d344e9f29a_o.jpg,0.25,0.46493902439,1.0,1.0,842,784,https://flickr.com/45021273@N08/27730962321,https://creativecommons.org/licenses/by/2.0/,Laurel L. Russwurm,https://www.flickr.com/people/laurelrusswurm/\n137625f78bc4ac8f,https://c1.staticflickr.com/6/5680/31220213495_772755cb5d_o.jpg,0.5,0.25,1.0,1.0,490,418,https://www.flickr.com/photos/nanagyei/31220213495/,https://creativecommons.org/licenses/by/2.0/,Nana B Agyei,https://www.flickr.com/people/nanagyei/\n137d815d415a92c2,https://c1.staticflickr.com/9/8420/29534382042_89e903e09f_o.jpg,0.5,0.25,1.0,1.0,99,702,https://www.flickr.com/photos/dfaulder/29534382042/,https://creativecommons.org/licenses/by/2.0/,dfaulder,https://www.flickr.com/people/dfaulder/\n39215655c9a7178e,https://c1.staticflickr.com/1/611/31057981644_1d87486bf7_o.jpg,0.0,0.0,0.75,1.0,875,587,https://www.flickr.com/photos/69203347@N03/31057981644,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n9cb79497fa6c9351,https://c1.staticflickr.com/6/5543/29908346812_be7f055913_o.jpg,0.5,0.0,1.0,0.75,561,292,https://www.flickr.com/photos/116153846@N06/29908346812,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/\n7a4d67a64275c208,https://c1.staticflickr.com/6/5746/30776706951_0061c6bc86_o.jpg,0.28125,0.25,0.84375,1.0,875,334,https://www.flickr.com/photos/69203347@N03/30776706951,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n4c8c4ce3649460bd,https://c1.staticflickr.com/9/8339/29751409851_2b3a25033d_o.jpg,0.495555555556,0.25,1.0,1.0,312,388,https://www.flickr.com/photos/52450054@N04/29751409851,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\nf9877ce2f6a0b7d3,https://c1.staticflickr.com/8/7333/27814069652_a77657eb50_o.jpg,0.0,0.32917888563,1.0,0.987536656891,524,907,https://www.flickr.com/photos/135431875@N04/27814069652,https://creativecommons.org/licenses/by/2.0/,jackcast2015,https://www.flickr.com/people/135431875@N04/\n14bce548cd76a4d6,https://c1.staticflickr.com/9/8469/29532442732_3e6fc149e8_o.jpg,0.5,0.25,1.0,1.0,152,261,https://www.flickr.com/photos/gammaman/29532442732,https://creativecommons.org/licenses/by/2.0/,Eli Christman,https://www.flickr.com/people/gammaman/\nf17c25897f023ad5,https://c1.staticflickr.com/9/8507/28880478772_3e5e634b04_o.jpg,0.25,0.0,0.75,0.75,288,232,https://flickr.com/33200530@N04/28880478772,https://creativecommons.org/licenses/by/2.0/,CucombreLibre,https://www.flickr.com/people/33200530@N04/\n2f2e2576ed658403,https://c1.staticflickr.com/8/7554/27831864621_28c5c66736_o.jpg,0.4375,0.0,1.0,0.75,9,660,https://www.flickr.com/photos/rikkis_refuge/27831864621/,https://creativecommons.org/licenses/by/2.0/,Rikki&#x27;s  Refuge,https://www.flickr.com/people/rikkis_refuge/\n917781a809f1d51b,https://c1.staticflickr.com/9/8141/28868278293_69d9d5a6da_o.jpg,0.0,0.0,0.5,0.75,327,68,https://www.flickr.com/photos/52450054@N04/28868278293/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n4425d41fa54572ae,https://c1.staticflickr.com/9/8427/28167655294_a1803ec339_o.jpg,0.0,0.25,0.75,1.0,793,391,https://www.flickr.com/photos/caguard/28167655294,https://creativecommons.org/licenses/by/2.0/,California National Guard,https://www.flickr.com/people/caguard/\n3790af8e5c68f21f,https://c1.staticflickr.com/9/8138/30302307675_fe3ee4b8f9_o.jpg,0.0,0.0,0.561569688769,1.0,976,607,https://flickr.com/10787737@N02/30302307675,https://creativecommons.org/licenses/by/2.0/,osseous,https://www.flickr.com/people/osseous/\nb8b2b05fa9d16762,https://c1.staticflickr.com/8/7094/26830110882_df58bdfdd3_o.jpg,0.0879310344828,0.0,1.0,1.0,986,601,https://www.flickr.com/photos/loarie/26830110882,https://creativecommons.org/licenses/by/2.0/,Don Loarie,https://www.flickr.com/people/loarie/\n55476c763e53e913,https://c1.staticflickr.com/8/7135/27922051546_48454255a4_o.jpg,0.242198838897,0.0,0.726596516691,0.75,706,770,https://www.flickr.com/photos/45909111@N00/27922051546,https://creativecommons.org/licenses/by/2.0/,Gwydion M. Williams,https://www.flickr.com/people/45909111@N00/\n1cfde8428f13e78c,https://c1.staticflickr.com/1/671/32412061321_f1ed5457f2_o.jpg,0.25,0.0,1.0,1.0,547,850,https://flickr.com/89246112@N00/32412061321,https://creativecommons.org/licenses/by/2.0/,Bart,https://www.flickr.com/people/89246112@N00/\n691d3672ba0d151c,https://c1.staticflickr.com/8/7295/26690394084_f6ded2bacf_o.jpg,0.25,0.25,0.75,1.0,518,413,https://www.flickr.com/photos/n28307/26690394084,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/\ncb2a0eba9d8cc244,https://c1.staticflickr.com/1/467/31220351953_849b44a9f1_o.jpg,0.4375,0.25,1.0,1.0,108,468,https://www.flickr.com/photos/jimg944/31220351953/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n6109d54137b44d32,https://c1.staticflickr.com/9/8399/28975290324_c983753a34_o.jpg,0.281690140845,0.25,0.845070422535,1.0,909,654,https://www.flickr.com/photos/28169156@N03/28975290324,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/\n2faf3ea634f1c11c,https://c1.staticflickr.com/9/8884/28346841561_2968e83d8a_o.jpg,0.332842415317,0.0,0.99852724595,1.0,986,104,https://www.flickr.com/photos/cogdog/28346841561,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nfef650b151701e0e,https://c1.staticflickr.com/8/7234/27399250871_8523057d82_o.jpg,0.0,0.289880952381,0.75,0.869642857143,133,115,https://www.flickr.com/photos/taylar/27399250871,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/\ne00ce23c7b316857,https://c1.staticflickr.com/6/5792/30184294373_56d9e6d434_o.jpg,0.0,0.0,0.75,1.0,98,155,https://flickr.com/33879687@N05/30184294373,https://creativecommons.org/licenses/by/2.0/,. .,https://www.flickr.com/people/1051980/\nfa61b6c9d4988957,https://c1.staticflickr.com/8/7547/27312188780_12eae5c4ec_o.jpg,0.250923190547,0.25,0.75276957164,1.0,821,704,https://www.flickr.com/photos/franklinc55/27312188780,https://creativecommons.org/licenses/by/2.0/,Franklin Campbell,https://www.flickr.com/people/franklinc55/\n7ac7efc575318d7d,https://c1.staticflickr.com/8/7550/26757572961_0aee11e3fd_o.jpg,0.480130057803,0.0,0.960260115607,0.75,822,605,https://www.flickr.com/photos/13476480@N07/26757572961,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n3a18c30e8585b650,https://c1.staticflickr.com/1/335/32548487906_42712204fd_o.jpg,0.0,0.25,0.607317073171,1.0,524,970,https://flickr.com/135431875@N04/32548487906,https://creativecommons.org/licenses/by/2.0/,jackcast2015,https://www.flickr.com/people/135431875@N04/\n23f66121cee4fb69,https://c1.staticflickr.com/8/7385/26988871512_3251f5691a_o.jpg,0.0,0.0,0.5625,0.75,980,565,https://www.flickr.com/photos/ilri/26988871512,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/\na1bbd2e79e9b9ed3,https://c1.staticflickr.com/9/8351/29206927770_3ee5c1f4d6_o.jpg,0.29465849387,0.25,1.0,1.0,325,51,https://www.flickr.com/photos/gails_pictures/29206927770/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nd27438a87d39b36d,https://c1.staticflickr.com/9/8474/29143268935_66ba12e2fc_o.jpg,0.25,0.400242326333,1.0,1.0,418,492,https://www.flickr.com/photos/pavdw/29143268935,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/\n421f9c734a44a065,https://c1.staticflickr.com/1/453/32406031495_82e4c2fb5f_o.jpg,0.25,0.490510948905,1.0,0.98102189781,742,526,https://flickr.com/29570076@N06/32406031495,https://creativecommons.org/licenses/by/2.0/,Yale Law Library,https://www.flickr.com/people/yalelawlibrary/\n817de357d9405774,https://c1.staticflickr.com/9/8860/28576589462_b8044dfe3d_o.jpg,0.210588633288,0.0,0.631765899865,0.75,441,715,https://www.flickr.com/photos/erikkristensen/28576589462/,https://creativecommons.org/licenses/by/2.0/,Erik Cleves Kristensen,https://www.flickr.com/people/erikkristensen/\na52bcf11da0326c2,https://c1.staticflickr.com/9/8837/28615619571_33abb3c596_o.jpg,0.302264808362,0.25,1.0,1.0,320,428,https://www.flickr.com/photos/gails_pictures/28615619571?rb=1,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nfa5f85e11dd99d17,https://c1.staticflickr.com/8/7253/26662097833_6464809e1e_o.jpg,0.4375,0.0,1.0,0.75,294,51,https://www.flickr.com/photos/amanderson/26662097833/,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n50c629ef55774091,https://c1.staticflickr.com/6/5109/29548881943_1d3f7e5c33_o.jpg,0.495594713656,0.0,0.991189427313,0.75,561,791,https://www.flickr.com/photos/barrydahl/29548881943/,https://creativecommons.org/licenses/by/2.0/,Barry Dahl,https://www.flickr.com/people/barrydahl/\nca47311ad359e8f2,https://c1.staticflickr.com/1/577/32495245012_36cdfb55b7_o.jpg,0.0,0.0,0.666666666667,1.0,324,83,https://www.flickr.com/photos/usfwsmidwest/32495245012,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\ncbb3ca9e9f433811,https://c1.staticflickr.com/9/8159/28769959655_ef4c8f548b_o.jpg,0.0,0.0,0.5,0.75,405,587,https://www.flickr.com/photos/ronmacphotos/28769959655,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n882a5858f009a6ee,https://c1.staticflickr.com/9/8136/30386732686_24a35e3be4_o.jpg,0.4375,0.0,1.0,0.75,872,965,https://www.flickr.com/photos/slapers/30386732686,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\n86dfeb7312773b5d,https://c1.staticflickr.com/8/7552/26270924594_2122f7969e_o.jpg,0.503303964758,0.0,1.0,0.75,643,942,https://www.flickr.com/photos/amslerpix/26270924594/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n37adf37ecb5e5fce,https://c1.staticflickr.com/9/8419/29447125535_fbd62255f9_o.jpg,0.251849112426,0.0,0.755547337278,0.75,985,126,https://www.flickr.com/photos/dominicspics/29447125535/,https://creativecommons.org/licenses/by/2.0/,Dominic Alves,https://www.flickr.com/people/dominicspics/\na600298956469f9f,https://c1.staticflickr.com/8/7386/27577591321_d298ed04d5_o.jpg,0.5,0.25,1.0,1.0,706,630,https://www.flickr.com/photos/126337928@N05/27577591321/,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\nbc0daf048b619a2b,https://c1.staticflickr.com/1/721/31594508410_286d30e768_o.jpg,0.333333333333,0.0,1.0,1.0,718,675,https://flickr.com/124442726@N06/31594508410,https://creativecommons.org/licenses/by/2.0/,Truck Hardware,https://www.flickr.com/people/truckhardware/\n40028a513882a923,https://c1.staticflickr.com/6/5720/30036006370_1478c56dcb_o.jpg,0.5,0.0,1.0,0.75,519,425,https://www.flickr.com/photos/box_repsol/30036006370,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n36a213638a700215,https://c1.staticflickr.com/9/8729/27887557974_5d30629219_o.jpg,0.25,0.0,0.75,0.75,699,590,https://www.flickr.com/photos/raita/27887557974,https://creativecommons.org/licenses/by/2.0/,Raita Futo,https://www.flickr.com/people/raita/\nfde3b2adfe9c5b64,https://c1.staticflickr.com/9/8143/28410300184_da6d2c874b_o.jpg,0.215753424658,0.0,0.647260273973,0.75,760,190,https://www.flickr.com/photos/mdpettitt/28410300184,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/\n45d7dd8920bbc306,https://c1.staticflickr.com/9/8658/28753347835_4e6fd879b6_o.jpg,0.25,0.25,0.75,1.0,133,196,https://www.flickr.com/photos/walterpro/28753347835,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/\nf36acec36484bd2b,https://c1.staticflickr.com/8/7418/27823039141_132ce81401_o.jpg,0.28125,0.25,0.84375,1.0,583,906,https://www.flickr.com/photos/shankaronline/27823039141/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n4595c561ddece482,https://c1.staticflickr.com/6/5807/31108785395_c8974bc085_o.jpg,0.415322580645,0.0,0.83064516129,0.75,629,645,https://www.flickr.com/photos/prayitnophotography/31108785395,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\n6b4a921e14c00eb6,https://c1.staticflickr.com/6/5139/29854449210_49d4834c4a_o.jpg,0.5,0.0,1.0,0.75,561,837,https://flickr.com/100379608@N08/29854449210,https://creativecommons.org/licenses/by/2.0/,Bob Gibbs,https://www.flickr.com/people/100379608@N08/\n403ed8d0bd52e635,https://c1.staticflickr.com/1/595/32662656931_9bf258e736_o.jpg,0.5,0.25,1.0,1.0,8,652,https://flickr.com/99604640@N00/32662656931,https://creativecommons.org/licenses/by/2.0/,Ilya Yakubovich,https://www.flickr.com/people/yakubovich/\n1b465950df77627d,https://c1.staticflickr.com/6/5293/29916688155_52d6c6f51b_o.jpg,0.578822733424,0.0,1.0,0.75,418,814,https://www.flickr.com/photos/pavdw/29916688155,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/\na04c9b37bb551245,https://c1.staticflickr.com/8/7683/26561798614_df37c4acd6_o.jpg,0.333333333333,0.0,1.0,1.0,458,940,https://www.flickr.com/photos/romanboed/26561798614,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/\nf0211f1f1c8ca37b,https://c1.staticflickr.com/8/7387/27352570472_059fbe3763_o.jpg,0.25,0.0,0.75,0.75,548,50,https://www.flickr.com/photos/rhemkes/27352570472,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\n7b029514afd6c6c7,https://c1.staticflickr.com/8/7189/27026523461_5f7c63778a_o.jpg,0.0,0.0,0.75,0.75,540,410,https://www.flickr.com/photos/home_of_chaos/27026523461,https://creativecommons.org/licenses/by/2.0/,thierry ehrmann,https://www.flickr.com/people/home_of_chaos/\nb93bd310c51d873f,https://c1.staticflickr.com/8/7484/28010641131_a80fab4b7c_o.jpg,0.5,0.0,1.0,0.75,731,710,https://www.flickr.com/photos/elsie/28010641131,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\nf9176d709b39bb17,https://c1.staticflickr.com/1/520/31429235570_b9ccdd3976_o.jpg,0.25,0.0,0.75,0.75,407,988,https://www.flickr.com/photos/shankaronline/31429235570,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nd49b767f40f78ff3,https://c1.staticflickr.com/1/561/31728841953_ea588f7cf5_o.jpg,0.0,0.0,0.5625,0.75,780,931,https://www.flickr.com/photos/thoseguys119/31728841953,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\ndbd9031659bd49cb,https://c1.staticflickr.com/9/8471/29260542504_8e26cd4ed5_o.jpg,0.0,0.25,0.75,1.0,582,391,https://www.flickr.com/photos/moto_club4ag/29260542504/,https://creativecommons.org/licenses/by/2.0/,Moto &quot;Club4AG&quot; Miwa,https://www.flickr.com/people/moto_club4ag/\n15a5dc74059f1e41,https://c1.staticflickr.com/6/5618/30624692935_f577a0e7c4_o.jpg,0.4375,0.0,1.0,0.75,780,391,https://www.flickr.com/photos/thoseguys119/30624692935,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n8ba9a02fbab6aa8a,https://c1.staticflickr.com/9/8738/29073986172_dd9c6d2011_o.jpg,0.248348017621,0.0,0.745044052863,0.75,980,718,https://www.flickr.com/photos/132870281@N02/29073986172,https://creativecommons.org/licenses/by/2.0/,alexis dupuis,https://www.flickr.com/people/132870281@N02/\nb17213667cb4bf0c,https://c1.staticflickr.com/6/5710/30483643802_e64ac894c5_o.jpg,0.0,0.25,0.5,1.0,868,83,https://www.flickr.com/photos/76969036@N02/30483643802,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n0a002669d7bdc690,https://c1.staticflickr.com/8/7084/26716288432_71c372e5cb_o.jpg,0.5,0.25,1.0,1.0,519,513,https://www.flickr.com/photos/box_repsol/26716288432,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nb9b01d201a3a2c8d,https://c1.staticflickr.com/1/381/31058132884_363b0183cb_o.jpg,0.0,0.0,0.75,1.0,875,263,https://www.flickr.com/photos/69203347@N03/31058132884,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\ndf4ad15dc252a8db,https://c1.staticflickr.com/6/5585/29848121941_28bfc875b7_o.jpg,0.281165311653,0.0,0.843495934959,1.0,980,789,https://www.flickr.com/photos/itravelnz/29848121941/,https://creativecommons.org/licenses/by/2.0/,itravelNZ\\302\\256 - New Zealand in your pocket\\342\\204\\242,https://www.flickr.com/people/itravelnz/\n57330c1a8e20616e,https://c1.staticflickr.com/8/7797/27620429334_9396b70e17_o.jpg,0.4375,0.0,1.0,0.75,763,203,https://www.flickr.com/photos/112024099@N03/27620429334,https://creativecommons.org/licenses/by/2.0/,chomjong,https://www.flickr.com/people/112024099@N03/\n828b40df1e3937e0,https://c1.staticflickr.com/9/8300/29170935613_4854323658_o.jpg,0.0,0.25,0.5,1.0,909,645,https://www.flickr.com/photos/fun_flying/29170935613,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/\nc453bd91493bd022,https://c1.staticflickr.com/1/764/31905300696_effc8c8feb_o.jpg,0.0,0.0,0.666666666667,1.0,512,631,https://www.flickr.com/photos/42220226@N07/31905300696,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\nb68ef7a9a72eb0e4,https://c1.staticflickr.com/1/562/30958089704_ebff9798c5_o.jpg,0.0,0.0,0.67551369863,0.75,304,528,https://www.flickr.com/photos/33398884@N03/30958089704/,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\n0cb76df6941f0375,https://c1.staticflickr.com/9/8700/28416430300_cf1e6456da_o.jpg,0.244897959184,0.0,1.0,1.0,318,124,https://www.flickr.com/photos/gails_pictures/28416430300/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n3b9abecfb8ac2c2c,https://c1.staticflickr.com/6/5680/29930820805_a78abc78e6_o.jpg,0.24213836478,0.0,1.0,1.0,561,855,https://www.flickr.com/photos/dirkhansen/29930820805,https://creativecommons.org/licenses/by/2.0/,SD Dirk,https://www.flickr.com/people/dirkhansen/\nbca7fa00d4446fbe,https://c1.staticflickr.com/6/5597/31443844785_76305c2d14_o.jpg,0.5,0.25,1.0,1.0,561,741,https://www.flickr.com/photos/codnewsroom/31443844785/,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\nfc401415837270be,https://c1.staticflickr.com/9/8808/28180843881_ef03d589b2_o.jpg,0.333333333333,0.0,1.0,1.0,374,956,https://www.flickr.com/photos/ivyfield/28180843881,https://creativecommons.org/licenses/by/2.0/,Yutaka Tsutano,https://www.flickr.com/people/ivyfield/\na8a8c84378c8f2fa,https://c1.staticflickr.com/9/8276/28343695574_e11c16663d_o.jpg,0.0,0.0,0.643394648829,0.75,314,621,https://www.flickr.com/photos/orangeaurochs/28343695574/,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/\n363952704be794fc,https://c1.staticflickr.com/9/8224/29739646571_7e0f58944a_o.jpg,0.25,0.0,1.0,0.75,309,478,https://www.flickr.com/photos/treegrow/29739646571,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n20ec63305a2e1821,https://c1.staticflickr.com/6/5337/30379166585_5db26d69aa_o.jpg,0.270252324037,0.0,0.810756972112,1.0,820,942,https://www.flickr.com/photos/peterhess/30379166585,https://creativecommons.org/licenses/by/2.0/,Peter Alfred Hess,https://www.flickr.com/people/peterhess/\n9f9cce2592904f22,https://c1.staticflickr.com/9/8280/29820900685_b60ea3a774_o.jpg,0.0,0.0,0.75,0.75,986,962,https://www.flickr.com/photos/atoach/29820900685,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n64cabd20539131ff,https://c1.staticflickr.com/9/8424/29505212301_6403f4f2e4_o.jpg,0.56106505102,0.0,0.935108418367,0.75,780,352,https://www.flickr.com/photos/thoseguys119/29505212301,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nc664a99912ef23a4,https://c1.staticflickr.com/1/462/32207905181_7b70eac967_o.jpg,0.0,0.0,0.666666666667,1.0,854,377,https://www.flickr.com/photos/13476480@N07/32207905181,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n81e9ef687578c9fb,https://c1.staticflickr.com/9/8521/29831864285_1dcb9ab81f_o.jpg,0.317068106312,0.25,0.951204318937,1.0,309,540,http://www.flickr.com/photos/35142635@N05/29831864285/,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\ndd00c7e6d61a55d3,https://c1.staticflickr.com/8/7712/26409219564_ac8b2980da_o.jpg,0.499263622975,0.25,0.99852724595,1.0,820,211,https://www.flickr.com/photos/usmarshals/26409219564,https://creativecommons.org/licenses/by/2.0/,Office of  Public Affairs,https://www.flickr.com/people/usmarshals/\n5ac56d8491faf69c,https://c1.staticflickr.com/6/5703/22847393558_c58089d50d_o.jpg,0.25,0.25,0.75,1.0,719,478,https://www.flickr.com/photos/dalecruse/22847393558/,https://creativecommons.org/licenses/by/2.0/,Dale Cruse,https://www.flickr.com/people/dalecruse/\nc89c5c0021098951,https://c1.staticflickr.com/9/8719/27969390944_1b4b87c0f2_o.jpg,0.2806640625,0.25,0.8419921875,1.0,422,479,https://www.flickr.com/photos/maxime-b/27969390944/,https://creativecommons.org/licenses/by/2.0/,Maxime B,https://www.flickr.com/people/maxime-b/\nf47fc3732465de83,https://c1.staticflickr.com/3/2943/32076298194_ef3966dab5_o.jpg,0.333333333333,0.0,1.0,1.0,765,732,https://www.flickr.com/photos/big-ashb/32076298194,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/\n50db8c31bb4a4eec,https://c1.staticflickr.com/9/8195/28533281404_fa34230a83_o.jpg,0.25,0.28125,1.0,0.84375,985,701,https://www.flickr.com/photos/usfwsmtnprairie/28533281404,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n244633b53f8cbef5,https://c1.staticflickr.com/8/7525/26603745364_ac970a1b11_o.jpg,0.2806640625,0.0,0.8419921875,0.75,875,284,https://www.flickr.com/photos/dariuspinkston/26603745364,https://creativecommons.org/licenses/by/2.0/,Darius Pinkston,https://www.flickr.com/people/dariuspinkston/\n21c79fad9b01ac68,https://c1.staticflickr.com/9/8471/29367417270_fc801e8063_o.jpg,0.0,0.0,0.599757673667,0.75,295,863,https://www.flickr.com/photos/10459174@N03/29367417270,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/\ne2cb61a9e4485409,https://c1.staticflickr.com/6/5577/29978271993_1a8025fb1e_o.jpg,0.5,0.0,1.0,0.75,763,844,https://flickr.com/36704648@N02/29978271993,https://creativecommons.org/licenses/by/2.0/,Ubud Writers &amp; Readers Festival,https://www.flickr.com/people/ubudwritersfest/\n85c285af98ab8168,https://c1.staticflickr.com/6/5714/30506593650_f2be9d1df2_o.jpg,0.0,0.0,1.0,1.0,973,537,https://www.flickr.com/photos/charithmania/30506593650,https://creativecommons.org/licenses/by/2.0/,Charith Gunarathna,https://www.flickr.com/people/charithmania/\ne150314705ec99a4,https://c1.staticflickr.com/9/8581/28872407634_9d3344982e_o.jpg,0.0,0.25,0.497426470588,1.0,54,653,https://www.flickr.com/photos/93467196@N02/28872407634/,https://creativecommons.org/licenses/by/2.0/,Frost Museum,https://www.flickr.com/people/93467196@N02/\na4bce66eb95418aa,https://c1.staticflickr.com/9/8732/27688278394_ffd07306cf_o.jpg,0.0,0.0,0.830592105263,1.0,393,817,https://www.flickr.com/photos/noaaphotolib/27688278394/,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\ne76f4a4a05e77e20,https://c1.staticflickr.com/1/466/30957552583_2184d3c7b3_o.jpg,0.5,0.25,1.0,1.0,831,646,https://www.flickr.com/photos/dfid/30957552583,https://creativecommons.org/licenses/by/2.0/,DFID - UK Department for International Development,https://www.flickr.com/people/dfid/\n42e193ecfc2e3441,https://c1.staticflickr.com/9/8544/28856563790_1a25355065_o.jpg,0.28125,0.0,0.84375,0.75,971,600,https://www.flickr.com/photos/29638108@N06/28856563790/,https://creativecommons.org/licenses/by/2.0/,Jennifer C.,https://www.flickr.com/people/29638108@N06/\n9b1ab3c04cd2b27a,https://c1.staticflickr.com/8/7597/28569602895_0326b29234_o.jpg,0.43661971831,0.25,1.0,1.0,526,758,https://flickr.com/64552256@N08/28569602895,https://creativecommons.org/licenses/by/2.0/,Dage - Looking For Europe,https://www.flickr.com/people/64552256@N08/\n3368343d0ddce5db,https://c1.staticflickr.com/9/8204/29776380022_0799cf1f9d_o.jpg,0.328402366864,0.0,1.0,1.0,320,161,https://www.flickr.com/photos/gaby1/29776380022/,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\n313ceb183e6238d8,https://c1.staticflickr.com/6/5696/29657839680_772fc9e40c_o.jpg,0.296147672552,0.25,0.888443017657,1.0,976,388,https://www.flickr.com/photos/22711505@N05/29657839680,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n9e4d03d077a5b514,https://c1.staticflickr.com/6/5585/30507117015_49b7a2e295_o.jpg,0.5,0.25,1.0,1.0,913,130,https://www.flickr.com/photos/erikstarck/30507117015/,https://creativecommons.org/licenses/by/2.0/,Erik Starck,https://www.flickr.com/people/erikstarck/\n96970834c771040a,https://c1.staticflickr.com/1/265/31268902733_2e72721c48_o.jpg,0.0,0.25,0.582802547771,1.0,498,795,https://www.flickr.com/photos/torontohistory/31268902733,https://creativecommons.org/licenses/by/2.0/,Toronto History,https://www.flickr.com/people/torontohistory/\n355014caf5f2c2e0,https://c1.staticflickr.com/8/7414/27623246112_d4204dbc91_o.jpg,0.5,0.25,1.0,1.0,896,717,https://www.flickr.com/photos/7armyjmtc/27623246112,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n9244be3c4be9f73c,https://c1.staticflickr.com/8/7564/27568772651_4dd389119f_o.jpg,0.28125,0.25,0.84375,1.0,896,574,https://www.flickr.com/photos/28169156@N03/27568772651,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/\n8550de628994fdf7,https://c1.staticflickr.com/8/7054/27014642882_2971712694_o.jpg,0.0,0.48275862069,0.75,1.0,558,893,https://www.flickr.com/photos/113306963@N05/27014642882,https://creativecommons.org/licenses/by/2.0/,travelmag.com,https://www.flickr.com/people/113306963@N05/\nf61623b1362bec02,https://c1.staticflickr.com/1/317/31936317472_8cb3aa45e1_o.jpg,0.333333333333,0.0,1.0,1.0,23,300,https://www.flickr.com/photos/paxson_woelber/31936317472/,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/\n87551e658af4abfd,https://c1.staticflickr.com/9/8080/29514225756_7062712d91_o.jpg,0.249631811487,0.0,0.748895434462,0.75,466,92,https://www.flickr.com/photos/usmarshals/29514225756,https://creativecommons.org/licenses/by/2.0/,Office of  Public Affairs,https://www.flickr.com/people/usmarshals/\na4de0f834e585cb7,https://c1.staticflickr.com/8/7451/27927864891_ef43413c2d_o.jpg,0.0,0.0,0.611581920904,1.0,789,869,https://www.flickr.com/photos/peterscherub/27927864891,https://creativecommons.org/licenses/by/2.0/,judy dean,https://www.flickr.com/people/peterscherub/\na79e31315f8dfb99,https://c1.staticflickr.com/9/8048/29469839615_2be181acf5_o.jpg,0.0,0.0,0.666666666667,1.0,548,288,https://www.flickr.com/photos/rhemkes/29469839615,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\nd84fb33e3a6212ca,https://c1.staticflickr.com/9/8034/29736819671_9cf0fc2077_o.jpg,0.0,0.496301775148,0.75,1.0,459,762,https://www.flickr.com/photos/atoach/29736819671,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\nc7b729498c8fc7ae,https://c1.staticflickr.com/1/669/32050027072_03d657abdf_o.jpg,0.25,0.0,0.75,0.75,4,334,https://www.flickr.com/photos/146401137@N06/32050027072,https://creativecommons.org/licenses/by/2.0/,Jin Kemoole,https://www.flickr.com/people/146401137@N06/\nd56010e1feabc7c4,https://c1.staticflickr.com/1/551/31061670453_2da4e7a7e8_o.jpg,0.333333333333,0.0,1.0,1.0,719,797,https://www.flickr.com/photos/danielchodusov/31061670453/,https://creativecommons.org/licenses/by/2.0/,Daniel Chodusov,https://www.flickr.com/people/danielchodusov/\ne8b762491b4655d4,https://c1.staticflickr.com/9/8094/29011785896_4bf67b3d00_o.jpg,0.0,0.0354609929078,1.0,1.0,986,707,https://www.flickr.com/photos/35142635@N05/29011785896,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\nd1427d0f270bd4df,https://c1.staticflickr.com/6/5599/31715077946_448f61f085_o.jpg,0.292127071823,0.0,0.87638121547,1.0,544,304,https://www.flickr.com/photos/51764518@N02/31715077946,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n822227e38f029c4f,https://c1.staticflickr.com/9/8187/29408968022_c4191393bd_o.jpg,0.0,0.0,0.666666666667,1.0,819,928,https://www.flickr.com/photos/nanpalmero/29408968022/,https://creativecommons.org/licenses/by/2.0/,Nan Palmero,https://www.flickr.com/people/nanpalmero/\ncdeb5d6d390441b8,https://c1.staticflickr.com/9/8290/28907705042_c5bdc5b73e_o.jpg,0.0,0.251849112426,0.75,0.755547337278,407,824,https://www.flickr.com/photos/eltb/28907705042,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nddaa8a00596ca5a0,https://c1.staticflickr.com/9/8286/28608540933_97d5a13f99_o.jpg,0.5,0.0,1.0,0.75,405,998,https://www.flickr.com/photos/markyharky/28608540933/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n1d56331cc332d8c0,https://c1.staticflickr.com/6/5035/30070809681_58637f77e0_o.jpg,0.0,0.25,0.452314165498,1.0,752,873,https://flickr.com/84991107@N08/30070809681,https://creativecommons.org/licenses/by/2.0/,lmankram7,https://www.flickr.com/people/lmankram7/\n1b47c0f04142e2e1,https://c1.staticflickr.com/8/7314/26729384311_0a5a9bd00e_o.jpg,0.4375,0.0,1.0,0.75,336,174,https://www.flickr.com/photos/tahini/26729384311,https://creativecommons.org/licenses/by/2.0/,Mr Thinktank,https://www.flickr.com/people/tahini/\n820de8657297cdef,https://c1.staticflickr.com/8/7134/27479111995_3d4e8d05d8_o.jpg,0.0,0.25,0.5,1.0,348,429,https://www.flickr.com/photos/137837832@N07/27479111995,https://creativecommons.org/licenses/by/2.0/,Mark Holloway,https://www.flickr.com/people/137837832@N07/\n8f79430fd8fa0266,https://c1.staticflickr.com/6/5124/29753916150_acbf6eabb6_o.jpg,0.25,0.0,1.0,0.558411214953,407,1000,https://www.flickr.com/photos/eltb/29753916150,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n0ffa4e0eef72f7ed,https://c1.staticflickr.com/8/7541/30027975025_d1813cd422_o.jpg,0.0,0.0,0.666666666667,1.0,982,538,https://www.flickr.com/photos/apardavila/30027975025/,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n6581cedbb54131d1,https://c1.staticflickr.com/9/8084/29162188826_96b949b64c_o.jpg,0.0,0.0,0.75,1.0,604,364,https://www.flickr.com/photos/127226743@N02/29162188826,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n013a793e570ce867,https://c1.staticflickr.com/9/8415/30230835226_869c38a5db_o.jpg,0.0,0.0,0.654970760234,1.0,114,174,https://www.flickr.com/photos/mypubliclands/30230835226,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n167502396f459582,https://c1.staticflickr.com/6/5522/30406722161_36f4cfdf1b_o.jpg,0.28125,0.0,0.84375,0.75,346,861,https://www.flickr.com/photos/heleenmeijer/30406722161/,https://creativecommons.org/licenses/by/2.0/,Helena,https://www.flickr.com/people/heleenmeijer/\nb9f1fb7576442a86,https://c1.staticflickr.com/1/514/32106645611_04e8d874cb_o.jpg,0.275735294118,0.0,0.827205882353,0.75,321,943,https://flickr.com/47602497@N06/32106645611,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/\n1b8fa35bda34ea7e,https://c1.staticflickr.com/8/7034/26946866475_f2240fae57_o.jpg,0.0,0.0,0.5625,0.75,815,515,https://www.flickr.com/photos/brisbanecitycouncil/26946866475,https://creativecommons.org/licenses/by/2.0/,Brisbane City Council,https://www.flickr.com/people/brisbanecitycouncil/\ndb3ce966322fd79c,https://c1.staticflickr.com/2/1694/26481174770_9ac2c7df0f_o.jpg,0.333333333333,0.0,1.0,1.0,820,875,https://www.flickr.com/photos/sansebastian2016/26481174770,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/\neaae60306488ad99,https://c1.staticflickr.com/6/5623/22772543648_700b0f0963_o.jpg,0.28125,0.0,0.84375,0.75,532,957,https://www.flickr.com/photos/rainsong/22772543648,https://creativecommons.org/licenses/by/2.0/,Ali - \\330\\271\\331\\204\\331\\212 from Riyadh - \\331\\205\\331\\206 \\330\\247\\331\\204\\330\\261\\331\\212\\330\\247\\330\\266,https://www.flickr.com/people/rainsong/\n1eb05e3710140666,https://c1.staticflickr.com/8/7253/27617862902_e302d03b77_o.jpg,0.0,0.0,0.965794768612,1.0,761,94,https://www.flickr.com/photos/lge/27617862902,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n4023051e19fd71fb,https://c1.staticflickr.com/1/633/31676057536_42fb312118_o.jpg,0.5,0.25,1.0,1.0,820,201,https://www.flickr.com/photos/stevendepolo/31676057536/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nea2b0f67bfe3dbf0,https://c1.staticflickr.com/8/7347/26678552450_6916692f58_o.jpg,0.0912220309811,0.0,1.0,1.0,309,326,https://www.flickr.com/photos/gails_pictures/26678552450,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n0076988fe4283df7,https://c1.staticflickr.com/8/7271/27075113073_4d5606ee7d_o.jpg,0.0,0.0,0.714503816794,1.0,613,314,https://www.flickr.com/photos/13476480@N07/27075113073,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n0cd36caf25713a59,https://c1.staticflickr.com/9/8828/29789512266_e9e38132ce_o.jpg,0.415322580645,0.25,0.83064516129,1.0,963,437,https://www.flickr.com/photos/jsjgeology/29789512266,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ne30a9ae501e9c1e9,https://c1.staticflickr.com/9/8235/29200277835_b2a5bb8e93_o.jpg,0.25,0.328205128205,1.0,1.0,343,670,https://flickr.com/7660730@N08/29200277835,https://creativecommons.org/licenses/by/2.0/,Jeremy Sutcliffe,https://www.flickr.com/people/jmts/\ne10a19df1718e464,https://c1.staticflickr.com/9/8019/29004734360_a4a8f5957d_o.jpg,0.331069609508,0.0,0.993208828523,0.75,309,369,https://www.flickr.com/photos/gails_pictures/29004734360,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n9f340eca7b32bd1e,https://c1.staticflickr.com/9/8564/28678452345_baa5d09167_o.jpg,0.25,0.25,0.75,1.0,821,402,https://www.flickr.com/photos/kecko/28678452345/,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\nbedc314a6098a667,https://c1.staticflickr.com/8/7606/26754568921_07e07e417f_o.jpg,0.236593059937,0.0,1.0,1.0,821,751,https://www.flickr.com/photos/trolleway/26754568921,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/\n2d760d56d41046d5,https://c1.staticflickr.com/8/7123/27846361561_fe1de683ea_o.jpg,0.0,0.0,0.666666666667,1.0,848,59,https://www.flickr.com/photos/137837832@N07/27846361561,https://creativecommons.org/licenses/by/2.0/,Mark Holloway,https://www.flickr.com/people/137837832@N07/\n482cc9f4f6898b37,https://c1.staticflickr.com/8/7771/29831714195_cbb9b42197_o.jpg,0.151414309484,0.0,1.0,1.0,305,755,https://www.flickr.com/photos/35142635@N05/29831714195,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\n498e2bd959cefdb6,https://c1.staticflickr.com/8/7648/27099636454_b62f1bbec5_o.jpg,0.0,0.5,0.75,1.0,808,555,https://www.flickr.com/photos/rdecom/27099636454,https://creativecommons.org/licenses/by/2.0/,U.S. Army RDECOM,https://www.flickr.com/people/rdecom/\n78c489239b3b97ea,https://c1.staticflickr.com/9/8421/29395607952_1a27464152_o.jpg,0.4375,0.25,1.0,1.0,780,757,https://www.flickr.com/photos/thoseguys119/29395607952,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n4bed2cc145dfea94,https://c1.staticflickr.com/9/8557/29728891655_9141e77de2_o.jpg,0.25,0.0,1.0,1.0,780,145,https://www.flickr.com/photos/thoseguys119/29728891655,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n0e75ebd66b9ab3cc,https://c1.staticflickr.com/9/8204/28870800040_9fa77a14f9_o.jpg,0.336764705882,0.0,1.0,1.0,550,573,https://www.flickr.com/photos/axiomnews/28870800040/,https://creativecommons.org/licenses/by/2.0/,Axiom News,https://www.flickr.com/people/axiomnews/\n018cc1cfeddd84a7,https://c1.staticflickr.com/8/7048/27061327025_d1ef3c0071_o.jpg,0.0,0.0,1.0,1.0,519,983,https://www.flickr.com/photos/bao_tri_nguyen/27061327025/,https://creativecommons.org/licenses/by/2.0/,Tri Nguyen,https://www.flickr.com/people/bao_tri_nguyen/\nc4e9b4bac5ba89a9,https://c1.staticflickr.com/9/8590/28316917511_24a63eab37_o.jpg,0.4375,0.25,1.0,1.0,975,471,https://www.flickr.com/photos/jsjgeology/28316917511,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\na177ea4e820c080c,https://c1.staticflickr.com/8/7443/27620181772_4fcdc35cf7_o.jpg,0.0,0.0,0.75,0.636439267887,854,206,https://www.flickr.com/photos/13476480@N07/27620181772,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n39f8a0fffbdf4450,https://c1.staticflickr.com/1/394/31896006996_7b4da78572_o.jpg,0.0,0.25,0.75,0.75,595,871,http://www.flickr.com/photos/quinet/31896006996/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n6fe367bf2215c662,https://c1.staticflickr.com/9/8105/28463800794_0bc6580ac0_o.jpg,0.47170487106,0.0,0.94340974212,0.75,702,296,https://www.flickr.com/photos/texaus1/28463800794/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/\nd337053fd1047a75,https://c1.staticflickr.com/6/5682/30689358025_609d4c8db4_o.jpg,0.237949640288,0.25,0.713848920863,1.0,848,816,https://www.flickr.com/photos/13476480@N07/30689358025,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n6877d693e8b1356f,https://c1.staticflickr.com/9/8317/27986413424_eb87392b47_o.jpg,0.0,0.0,0.752351097179,1.0,327,129,https://www.flickr.com/photos/amantedar/27986413424,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/\n896a90c7a8041e68,https://c1.staticflickr.com/8/7647/28047675151_db80835e9e_o.jpg,0.0,0.25,0.5,1.0,618,556,https://www.flickr.com/photos/lwpkommunikacio/28047675151,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\naa99394c991d34e8,https://c1.staticflickr.com/6/5561/30387187074_3091a5598b_o.jpg,0.0,0.0,0.75,1.0,40,785,https://www.flickr.com/photos/rickmccharles/30387187074/,https://creativecommons.org/licenses/by/2.0/,Rick McCharles,https://www.flickr.com/people/rickmccharles/\n017264a3fee3338d,https://c1.staticflickr.com/6/5752/30149118614_26b2cdfe14_o.jpg,0.25,0.5,1.0,1.0,709,334,https://www.flickr.com/photos/dalbera/30149118614,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n57ee1c2a47ec9810,https://c1.staticflickr.com/6/5538/30620105904_43042912b7_o.jpg,0.2103515625,0.0,0.6310546875,0.75,441,536,https://www.flickr.com/photos/47514124@N02/30620105904/,https://creativecommons.org/licenses/by/2.0/,Geoffrey Franklin,https://www.flickr.com/people/47514124@N02/\n57112103cafb4b9c,https://c1.staticflickr.com/6/5529/30662759775_354ca49bdd_o.jpg,0.25,0.0,0.75,0.75,459,348,https://www.flickr.com/photos/quinet/30662759775,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n1af56f58bba8b780,https://c1.staticflickr.com/1/38/31402990651_a0e95e966c_o.jpg,0.0,0.0977701543739,1.0,1.0,533,711,https://www.flickr.com/photos/amanderson/31402990651,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n0895a84a23103126,https://c1.staticflickr.com/9/8376/29330744781_91fc7bf6f8_o.jpg,0.333333333333,0.0,1.0,1.0,921,223,https://www.flickr.com/photos/pasa/29330744781,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n7e41c1f7754c7ea1,https://c1.staticflickr.com/9/8714/28068905594_3bbfb32995_o.jpg,0.334315169367,0.0,1.0,1.0,561,295,https://www.flickr.com/photos/delaneyr/28068905594,https://creativecommons.org/licenses/by/2.0/,Broderick Delaney,https://www.flickr.com/people/delaneyr/\n0aad339cdee8eb02,https://c1.staticflickr.com/1/546/32677326065_ddb1f9a55d_o.jpg,0.350800582242,0.0,1.0,1.0,780,247,https://www.flickr.com/photos/thoseguys119/32677326065/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nf0efbfe27d160b35,https://c1.staticflickr.com/9/8878/29550416891_4e7103dee8_o.jpg,0.25,0.25,0.75,1.0,418,94,https://www.flickr.com/photos/dalecruse/29550416891/,https://creativecommons.org/licenses/by/2.0/,Dale Cruse,https://www.flickr.com/people/dalecruse/\nd3f8b8cd2158b58c,https://c1.staticflickr.com/8/7704/27356224312_75759d39f3_o.jpg,0.0,0.0,0.666666666667,1.0,694,957,https://www.flickr.com/photos/tsengphotos/27356224312,https://creativecommons.org/licenses/by/2.0/,Tony Tseng,https://www.flickr.com/people/tsengphotos/\n4de2f401074f5bda,https://c1.staticflickr.com/8/7308/27198730136_f03b4fb6a9_o.jpg,0.28125,0.0,0.84375,0.75,539,821,https://www.flickr.com/photos/jared422/27198730136,https://creativecommons.org/licenses/by/2.0/,Jared,https://www.flickr.com/people/jared422/\nae2a1a76a4be80a8,https://c1.staticflickr.com/8/7286/26678238524_ee9bb89719_o.jpg,0.25,0.274729520866,1.0,0.824188562597,980,796,https://www.flickr.com/photos/watershedpost/26678238524,https://creativecommons.org/licenses/by/2.0/,Watershed Post,https://www.flickr.com/people/watershedpost/\n89008ea71dc270a1,https://c1.staticflickr.com/1/712/32096288421_5afc8b8481_o.jpg,0.25,0.0,0.75,0.75,971,345,https://www.flickr.com/photos/davebloggs007/32096288421,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\nb7d3e5ed7f10cd0d,https://c1.staticflickr.com/6/5483/9183278262_1dec2bf080_o.jpg,0.249631811487,0.25,0.748895434462,1.0,924,855,https://www.flickr.com/photos/dominicspics/9183278262,https://creativecommons.org/licenses/by/2.0/,Dominic Alves,https://www.flickr.com/people/dominicspics/\n5c1da62255db7885,https://c1.staticflickr.com/9/8659/28169240330_aa42c2a5cd_o.jpg,0.4375,0.0,1.0,0.75,534,489,https://www.flickr.com/photos/alicebyday/28169240330,https://creativecommons.org/licenses/by/2.0/,Alicebyday,https://www.flickr.com/people/alicebyday/\nedf5ad695c6994ad,https://c1.staticflickr.com/8/7257/27442022315_4e519a97bf_o.jpg,0.0,0.25,0.5625,1.0,706,376,https://www.flickr.com/photos/haxpett/27442022315,https://creativecommons.org/licenses/by/2.0/,Axel Pettersson,https://www.flickr.com/people/haxpett/\nb61ce2c89c305ac8,https://c1.staticflickr.com/6/5750/31051203470_e23a0f3ef1_o.jpg,0.5,0.25,1.0,1.0,891,490,https://www.flickr.com/photos/112772881@N02/31051203470/,https://creativecommons.org/licenses/by/2.0/,alias keiner,https://www.flickr.com/people/112772881@N02/\nd101fb088eb63d06,https://c1.staticflickr.com/8/7251/27971960346_3936b41f8b_o.jpg,0.245255474453,0.0,0.735766423358,0.75,672,515,https://www.flickr.com/photos/glorycycles/27971960346,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n808eaddcee3cd75a,https://c1.staticflickr.com/6/5516/30362716513_2df436eeb7_o.jpg,0.5,0.0,1.0,0.75,920,238,https://www.flickr.com/photos/shankaronline/30362716513,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n386d9dd66fa70471,https://c1.staticflickr.com/9/8718/28273272850_2a737410ed_o.jpg,0.322931785196,0.0,0.968795355588,1.0,635,440,https://www.flickr.com/photos/13476480@N07/28273272850/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\na50d88e152c16df0,https://c1.staticflickr.com/9/8326/29798149236_f7438bab0d_o.jpg,0.5,0.25,1.0,1.0,364,477,https://www.flickr.com/photos/wildreturn/29798149236,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\nc17e418fda3eb851,https://c1.staticflickr.com/9/8629/28316700954_a7a8f713b8_o.jpg,0.0,0.0,0.666666666667,1.0,519,263,https://www.flickr.com/photos/box_repsol/28316700954,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n444f8d24af346341,https://c1.staticflickr.com/8/7767/26562695813_d188e7772d_o.jpg,0.0,0.0,0.666666666667,1.0,404,134,https://www.flickr.com/photos/navcent/26562695813/,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/\nfbdde8cbc678bea7,https://c1.staticflickr.com/8/7327/26400437683_cf15440b52_o.jpg,0.4375,0.25,1.0,1.0,934,83,https://www.flickr.com/photos/yama2k/26400437683/,https://creativecommons.org/licenses/by/2.0/,Takahiro Yamagiwa,https://www.flickr.com/people/yama2k/\n20ffc3569c6896f5,https://c1.staticflickr.com/8/7428/27503782662_cd78baf1f3_o.jpg,0.0,0.0,0.5,0.75,437,241,https://www.flickr.com/photos/nielsautos/27503782662,https://creativecommons.org/licenses/by/2.0/,Niels de Wit,https://www.flickr.com/people/nielsautos/\nbf571602729dc613,https://c1.staticflickr.com/9/8227/29601881771_a7f0b8109d_o.jpg,0.2783203125,0.25,0.8349609375,1.0,23,975,https://www.flickr.com/photos/asianu/29601881771/,https://creativecommons.org/licenses/by/2.0/,ASIM CHAUDHURI,https://www.flickr.com/people/asianu/\na792bc6e572778a8,https://c1.staticflickr.com/9/8360/28946901502_1d9b6ec649_o.jpg,0.516304347826,0.0,1.0,0.75,662,673,https://www.flickr.com/photos/autohistorian/28946901502,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\nbb2c1ff4a6069852,https://c1.staticflickr.com/1/581/31576432532_80ba7de622_o.jpg,0.0,0.0,0.75,0.5,777,810,https://www.flickr.com/photos/eebeephoto/31576432532/,https://creativecommons.org/licenses/by/2.0/,Ed Berger,https://www.flickr.com/people/eebeephoto/\n90b3e0d9d97d8844,https://c1.staticflickr.com/8/7369/27056673845_5ce2cdec00_o.jpg,0.25,0.25,0.75,1.0,826,93,https://www.flickr.com/photos/slapers/27056673845,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\n9ec0f6e152204b39,https://c1.staticflickr.com/1/744/31015725594_838e57a023_o.jpg,0.0,0.25,0.5625,1.0,55,313,https://flickr.com/150203126@N07/31015725594,https://creativecommons.org/licenses/by/2.0/,Bradley Allf,https://www.flickr.com/people/150203126@N07/\na40673e9a382e09d,https://c1.staticflickr.com/9/8639/27924700174_9aac3c6d53_o.jpg,0.32332761578,0.25,1.0,1.0,309,430,https://www.flickr.com/photos/gails_pictures/27924700174/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n2413f3c22fc92bc7,https://c1.staticflickr.com/1/604/32006794135_2f5f077b38_o.jpg,0.5,0.25,1.0,1.0,948,616,https://flickr.com/13497267@N04/32006794135,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\nc1eac623a995e2c4,https://c1.staticflickr.com/1/716/31183502483_f0623e8249_o.jpg,0.0,0.25,0.421177266576,1.0,971,364,https://www.flickr.com/photos/stefans02/31183502483,https://creativecommons.org/licenses/by/2.0/,Stefans02,https://www.flickr.com/people/stefans02/\n983ccc0f449e5f09,https://c1.staticflickr.com/6/5822/29283288084_a19bb7f529_o.jpg,0.0,0.0,0.421177266576,0.75,820,234,https://www.flickr.com/photos/timmccune/29283288084,https://creativecommons.org/licenses/by/2.0/,Tim McCune,https://www.flickr.com/people/timmccune/\n18d6afdfc6887cb4,https://c1.staticflickr.com/2/1629/26730207146_44f8a1a628_o.jpg,0.332842415317,0.0,0.99852724595,1.0,33,110,https://www.flickr.com/photos/briangratwicke/26730207146/,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/\nbade827d486116fd,https://c1.staticflickr.com/1/757/31488607526_b9ecb49387_o.jpg,0.248348017621,0.25,0.745044052863,1.0,771,525,https://www.flickr.com/photos/spera-designerschuhe/31488607526,https://creativecommons.org/licenses/by/2.0/,\"SPERA.de Designerschuhe, Taschen und Accessoires\",https://www.flickr.com/people/spera-designerschuhe/\n7f4cb4f73265df7e,https://c1.staticflickr.com/8/7463/29771425545_1456b155a2_o.jpg,0.284198113208,0.25,0.852594339623,1.0,769,100,https://www.flickr.com/photos/oisinhurley/29771425545,https://creativecommons.org/licenses/by/2.0/,Oisin Hurley,https://www.flickr.com/people/oisinhurley/\n860c38fe1a182825,https://c1.staticflickr.com/9/8381/29230613555_0201b998e3_o.jpg,0.250923190547,0.25,0.75276957164,1.0,706,634,https://flickr.com/24415554@N04/29230613555,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/\nf62f390eb1097576,https://c1.staticflickr.com/9/8289/27793036264_90104f60db_o.jpg,0.25,0.431603773585,1.0,1.0,515,379,https://www.flickr.com/photos/91591049@N00/27793036264,https://creativecommons.org/licenses/by/2.0/,SenseiAlan,https://www.flickr.com/people/91591049@N00/\nbd8dbdd64864e34c,https://c1.staticflickr.com/8/7558/28036849252_253ccb6d32_o.jpg,0.25,0.0,0.75,0.75,558,889,https://www.flickr.com/photos/vitofun/28036849252,https://creativecommons.org/licenses/by/2.0/,Vito  Fun,https://www.flickr.com/people/vitofun/\n79cd07520e74e76d,https://c1.staticflickr.com/8/7786/28092294381_4de850d6dd_o.jpg,0.439547581903,0.0,1.0,0.75,127,770,https://www.flickr.com/photos/noaaphotolib/28092294381/,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\nc061f55f54313fba,https://c1.staticflickr.com/6/5584/30804093225_2812ffa8bc_o.jpg,0.0,0.0,1.0,1.0,923,407,https://www.flickr.com/photos/yto/30804093225,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/\n33664ff3dbea3612,https://c1.staticflickr.com/8/7728/27118293775_9ab658d4e8_o.jpg,0.0,0.25,0.75,1.0,702,515,https://www.flickr.com/photos/91425144@N04/27118293775,https://creativecommons.org/licenses/by/2.0/,Arran Bee,https://www.flickr.com/people/91425144@N04/\n5a5de7f4eeed4924,https://c1.staticflickr.com/1/611/31551581321_a5913cb571_o.jpg,0.25,0.0,1.0,0.5625,804,520,https://www.flickr.com/photos/oregondot/31551581321,https://creativecommons.org/licenses/by/2.0/,Oregon Department of Transportation,https://www.flickr.com/people/oregondot/\nf7613103a3f7f606,https://c1.staticflickr.com/6/5747/31389715356_b543f50fd5_o.jpg,0.491827637444,0.25,1.0,1.0,490,360,https://www.flickr.com/photos/stevensnodgrass/31389715356,https://creativecommons.org/licenses/by/2.0/,Steve Snodgrass,https://www.flickr.com/people/stevensnodgrass/\n67fcf5cf43220ffe,https://c1.staticflickr.com/1/564/31572047642_0722d49085_o.jpg,0.4375,0.0,1.0,0.75,328,536,https://flickr.com/149503105@N07/31572047642,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/\n91e1eac1507098b3,https://c1.staticflickr.com/1/726/31957749302_1d2465a829_o.jpg,0.4375,0.0,1.0,0.75,780,367,https://www.flickr.com/photos/thoseguys119/31957749302,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nc8ae4d4f0eebd02f,https://c1.staticflickr.com/8/7101/26790907006_717cc0b174_o.jpg,0.0,0.0,0.666666666667,1.0,610,724,https://flickr.com/87096660@N06/26790907006,https://creativecommons.org/licenses/by/2.0/,P_Gigs,https://www.flickr.com/people/ispecialize/\nf5ac8056354f85ba,https://c1.staticflickr.com/9/8064/28047914584_33745a3e9a_o.jpg,0.25,0.25,0.75,1.0,982,192,https://www.flickr.com/photos/mindahaas/28047914584,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/\n492cb6e65ab265ea,https://c1.staticflickr.com/9/8841/28243296200_7984f5db24_o.jpg,0.25,0.25,0.75,1.0,320,139,https://www.flickr.com/photos/j_w_c/28243296200,https://creativecommons.org/licenses/by/2.0/,James,https://www.flickr.com/people/j_w_c/\n9cc5ced4df55a800,https://c1.staticflickr.com/9/8135/29837591205_cfd89d98ac_o.jpg,0.0,0.0,0.75,0.610749185668,431,687,https://www.flickr.com/photos/ftmeade/29837591205,https://creativecommons.org/licenses/by/2.0/,Fort George G. Meade Public Affairs Office,https://www.flickr.com/people/ftmeade/\n71a293490570c3ec,https://c1.staticflickr.com/6/5627/30076998724_9cc0b85baa_o.jpg,0.5,0.0,1.0,0.75,948,729,https://flickr.com/127338544@N06/30076998724,https://creativecommons.org/licenses/by/2.0/,Sarah Ward,https://www.flickr.com/people/127338544@N06/\n587e62c63503db38,https://c1.staticflickr.com/8/7196/26892084982_605da83241_o.jpg,0.218793103448,0.25,0.656379310345,1.0,459,891,https://www.flickr.com/photos/26126239@N02/26892084982/,https://creativecommons.org/licenses/by/2.0/,University of Exeter,https://www.flickr.com/people/26126239@N02/\n0a098aba2e583b34,https://c1.staticflickr.com/6/5466/30386990384_354093f5ac_o.jpg,0.114520958084,0.25,0.343562874251,1.0,780,239,https://www.flickr.com/photos/thoseguys119/30386990384,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n3a61c40078214cf4,https://c1.staticflickr.com/9/8370/29707719271_78a1e4cd17_o.jpg,0.0,0.0,0.666666666667,1.0,704,676,https://www.flickr.com/photos/janitors/29707719271,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n3c99b1263f54b352,https://c1.staticflickr.com/9/8110/28995276032_52cc83fe9f_o.jpg,0.0,0.0,0.5625,0.75,704,342,https://www.flickr.com/photos/safelibraries/28995276032/,https://creativecommons.org/licenses/by/2.0/,Dan Kleinman,https://www.flickr.com/people/safelibraries/\ncb3255cbe604c3de,https://c1.staticflickr.com/9/8538/30161780776_9645afc06e_o.jpg,0.4375,0.25,1.0,1.0,975,179,https://www.flickr.com/photos/jsjgeology/30161780776,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ne2c30f2538205422,https://c1.staticflickr.com/8/7247/26579812220_d2490c0c89_o.jpg,0.0,0.25,0.5625,1.0,518,908,https://www.flickr.com/photos/southbeachcars/26579812220,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n4663fe34ae048d1b,https://c1.staticflickr.com/8/7679/27156362451_b9cc999972_o.jpg,0.0,0.0,0.498159057437,0.75,752,695,https://www.flickr.com/photos/davehamster/27156362451,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n50179d5916b65cd4,https://c1.staticflickr.com/6/5628/30662821010_35b4277386_o.jpg,0.0,0.25,0.435350756534,1.0,806,809,https://flickr.com/144153098@N08/30662821010,https://creativecommons.org/licenses/by/2.0/,Le Radiophare,https://www.flickr.com/people/leradiophare/\nef3050e7c9b439fa,https://c1.staticflickr.com/9/8839/28081572673_d41c681d4e_o.jpg,0.0,0.25,0.5625,1.0,635,31,https://www.flickr.com/photos/ilri/28081572673,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/\ncc383892d1ec2550,https://c1.staticflickr.com/9/8837/28755601556_d5a89618be_o.jpg,0.145242070117,0.0,1.0,1.0,305,357,https://www.flickr.com/photos/92252798@N07/28755601556,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/\n3a8e99ff844d3b93,https://c1.staticflickr.com/9/8058/28241035750_8fef9dbbc1_o.jpg,0.0,0.25,0.472779369628,1.0,975,9,https://www.flickr.com/photos/jsjgeology/28241035750,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n4edf13a4ef204868,https://c1.staticflickr.com/9/8276/29640058063_41568b79e5_o.jpg,0.0,0.25,0.75,1.0,672,298,https://www.flickr.com/photos/glorycycles/29640058063,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\nb20e2e980f4ded49,https://c1.staticflickr.com/9/8878/29696500461_ed71cdb872_o.jpg,0.4375,0.0,1.0,0.75,459,348,https://www.flickr.com/photos/kirbyurner/29696500461,https://creativecommons.org/licenses/by/2.0/,thekirbster,https://www.flickr.com/people/kirbyurner/\n15d1a6d2bc5b9cef,https://c1.staticflickr.com/9/8806/29518966205_2eabd57cff_o.jpg,0.0,0.0,0.75,1.0,822,883,https://www.flickr.com/photos/linsinchen/29518966205,https://creativecommons.org/licenses/by/2.0/,Sinchen.Lin,https://www.flickr.com/people/linsinchen/\nc7cf0370caf2cb0e,https://c1.staticflickr.com/8/7546/28020258155_46b588fdd4_o.jpg,0.25,0.0,1.0,1.0,641,268,https://www.flickr.com/photos/akras/28020258155,https://creativecommons.org/licenses/by/2.0/,Andrey,https://www.flickr.com/people/akras/\n1f9e0ef9d3b1ac2b,https://c1.staticflickr.com/1/30/31606235256_e2b036160d_o.jpg,0.0,0.4375,0.75,1.0,920,577,http://www.flickr.com/photos/25955895@N03/31606235256,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n5fe8f9580d3a92d1,https://c1.staticflickr.com/8/7212/26749856630_2a680babcb_o.jpg,0.0,0.25,0.5,1.0,625,449,https://www.flickr.com/photos/kjarrett/26749856630,https://creativecommons.org/licenses/by/2.0/,Kevin Jarrett,https://www.flickr.com/people/kjarrett/\n60472060bd7a30c4,https://c1.staticflickr.com/6/5126/29849597982_92213dfe31_o.jpg,0.25,0.0,1.0,0.617213114754,22,209,https://www.flickr.com/photos/patrick_k59/29849597982,https://creativecommons.org/licenses/by/2.0/,patrickkavanagh,https://www.flickr.com/people/patrick_k59/\n30dc1c9a22aeb20a,https://c1.staticflickr.com/2/1610/26164518923_f1f71c342b_o.jpg,0.0,0.0,0.666666666667,1.0,512,274,https://flickr.com/42220226@N07/26164518923,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\nf3076fa8db5ac4d7,https://c1.staticflickr.com/9/8415/30148719842_4e381285a0_o.jpg,0.459355828221,0.25,1.0,1.0,875,481,https://www.flickr.com/photos/76969036@N02/30148719842,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\na2db81f0c82be581,https://c1.staticflickr.com/9/8207/29284999816_8baac27b37_o.jpg,0.0,0.25,0.740574506284,1.0,309,927,https://www.flickr.com/photos/gails_pictures/29284999816,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n699a852d085ca5a2,https://c1.staticflickr.com/1/548/32061567272_ab043c0503_o.jpg,0.322931785196,0.0,0.968795355588,1.0,889,894,https://www.flickr.com/photos/jlcernadas/32061567272,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\n974fa34c5ac33e70,https://c1.staticflickr.com/9/8805/28708213072_338ca2320d_o.jpg,0.0,0.0,0.5,0.75,874,421,https://www.flickr.com/photos/amslerpix/28708213072/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n9699e28c9bed2d39,https://c1.staticflickr.com/9/8190/28739849060_8d4ff6a25c_o.jpg,0.0,0.25,0.75,1.0,896,445,https://www.flickr.com/photos/peter_curb/28739849060/,https://creativecommons.org/licenses/by/2.0/,Peter,https://www.flickr.com/people/peter_curb/\nb814dc2396a679dd,https://c1.staticflickr.com/9/8405/29272639984_2fd9a98e43_o.jpg,0.281690140845,0.0,0.845070422535,0.75,407,935,https://www.flickr.com/photos/eltb/29272639984,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n993357c62f7de85b,https://c1.staticflickr.com/9/8450/28727991476_c070a72cf1_o.jpg,0.0,0.0,1.0,1.0,756,685,https://www.flickr.com/photos/esoastronomy/28727991476,https://creativecommons.org/licenses/by/2.0/,European Southern Observatory,https://www.flickr.com/people/esoastronomy/\n80cd50b1e702b621,https://c1.staticflickr.com/9/8227/29247894293_83648fbb12_o.jpg,0.25,0.0,1.0,0.75,546,117,http://www.flickr.com/photos/46183897@N00/29247894293,https://creativecommons.org/licenses/by/2.0/,Robert Nunnally,https://www.flickr.com/people/46183897@N00/\n42c0f0241873ee1d,https://c1.staticflickr.com/8/7445/27514841904_7783724a27_o.jpg,0.0,0.0,0.5,0.75,980,535,https://www.flickr.com/photos/mypubliclands/27514841904,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\nb543d4954953b16a,https://c1.staticflickr.com/8/7515/28308262656_e41d2334ec_o.jpg,0.0,0.0,0.755102040816,1.0,310,372,https://www.flickr.com/photos/ndrwfgg/28308262656,https://creativecommons.org/licenses/by/2.0/,Andy / Andrew Fogg,https://www.flickr.com/people/ndrwfgg/\nde48a5455e28628e,https://c1.staticflickr.com/9/8535/29916229871_2c5b9d85ef_o.jpg,0.287776898734,0.0,0.863330696203,0.75,982,673,https://www.flickr.com/photos/apardavila/29916229871,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n4920e46c49ffdb9c,https://c1.staticflickr.com/1/444/32388653222_d0766057c8_o.jpg,0.249079528719,0.0,0.747238586156,0.75,818,586,https://www.flickr.com/photos/davehamster/32388653222,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\na5b6c7bf4769f8bf,https://c1.staticflickr.com/8/7460/26753107264_3c573836f1_o.jpg,0.281719532554,0.25,0.845158597663,1.0,830,480,http://www.flickr.com/photos/89246112@N00/26753107264/,https://creativecommons.org/licenses/by/2.0/,Bart,https://www.flickr.com/people/89246112@N00/\n84e91c0b8ca02f79,https://c1.staticflickr.com/8/7181/27595589222_51d4625a89_o.jpg,0.0,0.0,0.5,0.75,405,556,https://www.flickr.com/photos/alessandroambrosetti/27595589222,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/\ncb74d5e88350a868,https://c1.staticflickr.com/1/747/31619979270_8c6eca179b_o.jpg,0.5,0.0,1.0,0.75,974,301,https://flickr.com/39136124@N00/31619979270,https://creativecommons.org/licenses/by/2.0/,Paul Asman and Jill Lenoble,https://www.flickr.com/people/pauljill/\nfa03989e0fdf318d,https://c1.staticflickr.com/9/8166/28498558833_7fc44c5b8f_o.jpg,0.0,0.0,0.732612055641,1.0,145,374,https://www.flickr.com/photos/taylar/28498558833,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/\n66b16a73ba956714,https://c1.staticflickr.com/9/8019/29468620820_9512109548_o.jpg,0.0,0.25,0.611745513866,1.0,672,513,https://www.flickr.com/photos/swampa/29468620820,https://creativecommons.org/licenses/by/2.0/,Steve Collis,https://www.flickr.com/people/swampa/\na4b6546fb71feac3,https://c1.staticflickr.com/9/8047/28584347493_60666a8804_o.jpg,0.421177266576,0.0,0.842354533153,0.75,973,743,https://www.flickr.com/photos/dfmagazine/28584347493,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/\n8b2f06597a576599,https://c1.staticflickr.com/8/7354/27926128126_136600fd2d_o.jpg,0.0,0.333333333333,1.0,1.0,793,749,https://www.flickr.com/photos/thenationalguard/27926128126,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/\n24a5d6665c96748b,https://c1.staticflickr.com/8/7325/27243958956_a7ac3bba90_o.jpg,0.0,0.0,0.311337209302,0.75,780,645,https://www.flickr.com/photos/thoseguys119/27243958956/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n456d48d1abe6bc4c,https://c1.staticflickr.com/6/5652/30738756730_903be37c23_o.jpg,0.299878836834,0.0,0.899636510501,0.75,19,844,https://www.flickr.com/photos/hisgett/30738756730/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n9b6eaca58e1f3a16,https://c1.staticflickr.com/1/699/32119264241_a1625122c0_o.jpg,0.0,0.0,0.666666666667,1.0,991,969,https://www.flickr.com/photos/eduardorobles/32119264241,https://creativecommons.org/licenses/by/2.0/,Eduardo Robles Pacheco,https://www.flickr.com/people/eduardorobles/\n56af3b3dd9fe53ac,https://c1.staticflickr.com/6/5779/30870590735_b02a1b445f_o.jpg,0.25,0.0,0.75,0.75,718,870,https://www.flickr.com/photos/greggjerdingen/30870590735,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n0e14cb874a3f01a3,https://c1.staticflickr.com/6/5739/30340839054_da3bd3fc70_o.jpg,0.0,0.0,0.5,0.75,320,748,https://www.flickr.com/photos/ansk/30340839054,https://creativecommons.org/licenses/by/2.0/,arian.suresh,https://www.flickr.com/people/ansk/\n0b18419f3e2e0d50,https://c1.staticflickr.com/8/7533/27128071800_ed6c02bf38_o.jpg,0.0,0.0,1.0,0.961061946903,24,491,https://www.flickr.com/photos/sarahvain/27128071800,https://creativecommons.org/licenses/by/2.0/,Sarah Stierch,https://www.flickr.com/people/sarahvain/\nc7eecfae937150e9,https://c1.staticflickr.com/8/7462/28118769880_288044e953_o.jpg,0.25578358209,0.0,0.767350746269,0.75,309,805,https://www.flickr.com/photos/78428166@N00/28118769880,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\n478cdebaecbbd037,https://c1.staticflickr.com/6/5789/30219046794_7a4db4c19b_o.jpg,0.25,0.0,0.75,0.75,971,563,https://www.flickr.com/photos/paxson_woelber/30219046794,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/\n7fdecd6565739802,https://c1.staticflickr.com/1/172/31528681765_ed90ff0abe_o.jpg,0.0,0.0,0.75,1.0,979,499,https://www.flickr.com/photos/theocrazzolara/31528681765/,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/\nd980e0c9dcf5c8a8,https://c1.staticflickr.com/8/7288/27642490216_87d32ce8ef_o.jpg,0.25,0.313049209139,1.0,0.939147627417,918,631,https://www.flickr.com/photos/24858199@N00/27642490216,https://creativecommons.org/licenses/by/2.0/,John Greenfield,https://www.flickr.com/people/24858199@N00/\n090b7b3d7dac83e3,https://c1.staticflickr.com/1/702/32644867925_4e1c3a9952_o.jpg,0.333333333333,0.0,1.0,1.0,519,474,https://www.flickr.com/photos/box_repsol/32644867925,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n301c9231c8ce38da,https://c1.staticflickr.com/1/373/31831624096_e71629713e_o.jpg,0.5,0.0,1.0,0.75,422,574,https://flickr.com/136477533@N06/31831624096,https://creativecommons.org/licenses/by/2.0/,Thijs Paanakker,https://www.flickr.com/people/136477533@N06/\nb2298ca549255350,https://c1.staticflickr.com/9/8808/28690231300_56cd784755_o.jpg,0.0,0.25,0.5,1.0,753,865,https://www.flickr.com/photos/squashdev/28690231300,https://creativecommons.org/licenses/by/2.0/,England Squash Masters,https://www.flickr.com/people/squashdev/\n314d8558e1ad7629,https://c1.staticflickr.com/6/5625/30622316002_8f1d6916f2_o.jpg,0.0,0.25,0.5,1.0,980,781,https://www.flickr.com/photos/wendelinjacober/30622316002,https://creativecommons.org/licenses/by/2.0/,Wendelin Jacober,https://www.flickr.com/people/wendelinjacober/\nf48144ca8eba49c5,https://c1.staticflickr.com/8/7463/27378999693_fcc701c720_o.jpg,0.25,0.0,1.0,0.75,810,900,https://www.flickr.com/photos/yto/27378999693,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/\n0b4024b4e357a6ae,https://c1.staticflickr.com/9/8393/28773345601_d4d5d04377_o.jpg,0.0,0.25,0.37166454892,1.0,815,37,https://www.flickr.com/photos/watts_photos/28773345601,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/\n6bf3f30e46f2343f,https://c1.staticflickr.com/9/8419/28939386972_cc3d1f3ae6_o.jpg,0.25,0.254054054054,1.0,1.0,310,357,https://www.flickr.com/photos/35142635@N05/28939386972,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\nd3b18a4a0b1d8f42,https://c1.staticflickr.com/8/7574/30111407271_d9a4724741_o.jpg,0.0,0.0,0.5625,0.75,975,725,https://www.flickr.com/photos/jsjgeology/30111407271,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nc444433540e3dc27,https://c1.staticflickr.com/9/8409/29675626831_bb6bf7561e_o.jpg,0.0,0.0,0.7484375,1.0,507,598,https://www.flickr.com/photos/zongo/29675626831,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n35bba255621535c8,https://c1.staticflickr.com/8/7698/28226013051_945289ecab_o.jpg,0.0,0.25,0.535877862595,1.0,393,950,https://www.flickr.com/photos/noaaphotolib/28226013051,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\n1c8729adb36efba6,https://c1.staticflickr.com/8/7393/27633423065_ed969d7401_o.jpg,0.0,0.0,0.75,0.5625,736,549,https://www.flickr.com/photos/sebilden/27633423065,https://creativecommons.org/licenses/by/2.0/,David J,https://www.flickr.com/people/sebilden/\n24027338ca7f0173,https://c1.staticflickr.com/3/2815/33039658636_1d8b6cd98f_o.jpg,0.0,0.174055829228,1.0,1.0,437,427,http://www.flickr.com/photos/31411679@N08/33039658636,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\ne2f6b6de4686029c,https://c1.staticflickr.com/9/8658/28769298372_3b197ae635_o.jpg,0.0,0.0,1.0,1.0,443,860,https://www.flickr.com/photos/respres/28769298372,https://creativecommons.org/licenses/by/2.0/,Jeff Turner,https://www.flickr.com/people/respres/\ne256e71e1d750b15,https://c1.staticflickr.com/9/8230/30101273355_fd9aa73baf_o.jpg,0.0,0.0,1.0,0.664212076583,672,424,https://www.flickr.com/photos/91396027@N00/30101273355,https://creativecommons.org/licenses/by/2.0/,Adam Loving,https://www.flickr.com/people/91396027@N00/\n850ce1f6ebda8a9e,https://c1.staticflickr.com/6/5343/31386427245_5ee5fef9e9_o.jpg,0.333333333333,0.0,1.0,1.0,304,399,https://www.flickr.com/photos/christian_gloor/31386427245/,https://creativecommons.org/licenses/by/2.0/,Christian Gloor,https://www.flickr.com/people/christian_gloor/\n43a776491bca6133,https://c1.staticflickr.com/9/8727/30032687381_063f55d273_o.jpg,0.0,0.333333333333,1.0,1.0,142,908,https://www.flickr.com/photos/steve_childs/30032687381/,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/\nef49e733ecfcd9f5,https://c1.staticflickr.com/6/5775/30275979302_6d9be20aa1_o.jpg,0.0,0.0,0.499263622975,0.75,618,950,https://www.flickr.com/photos/gobiernodechile/30275979302,https://creativecommons.org/licenses/by/2.0/,Gobierno de Chile,https://www.flickr.com/people/gobiernodechile/\nac27124605fc0092,https://c1.staticflickr.com/6/5672/30007414364_96eea525e9_o.jpg,0.0,0.25,0.5,1.0,960,2,https://www.flickr.com/photos/o_0/30007414364,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n44ede47181b3ed7c,https://c1.staticflickr.com/9/8086/28859174645_1481eb3ea0_o.jpg,0.25,0.281690140845,1.0,0.845070422535,407,675,https://www.flickr.com/photos/eltb/28859174645,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\ne071f6c084846cd4,https://c1.staticflickr.com/8/7620/27892527821_7d43768fca_o.jpg,0.0,0.0,0.558411214953,0.75,780,145,https://www.flickr.com/photos/thoseguys119/27892527821,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n79b2687072279913,https://c1.staticflickr.com/1/743/32906588345_49bfe10a2d_o.jpg,0.0,0.25,0.5625,1.0,975,577,https://www.flickr.com/photos/krossbow/32906588345,https://creativecommons.org/licenses/by/2.0/,F Delventhal,https://www.flickr.com/people/krossbow/\nf8ad9213b005e85a,https://c1.staticflickr.com/8/7055/27203858751_43b296b1f2_o.jpg,0.25,0.0,1.0,0.67667238422,925,530,https://www.flickr.com/photos/10413717@N08/27203858751,https://creativecommons.org/licenses/by/2.0/,Smabs Sputzer,https://www.flickr.com/people/10413717@N08/\n1e222e7ec0de2723,https://c1.staticflickr.com/1/574/31934206825_7c314e41bb_o.jpg,0.28125,0.25,0.84375,1.0,802,276,https://www.flickr.com/photos/kudumomo/31934206825/,https://creativecommons.org/licenses/by/2.0/,momo,https://www.flickr.com/people/kudumomo/\n586bb9f8e35e9353,https://c1.staticflickr.com/9/8580/28033037860_47967e40a8_o.jpg,0.0,0.0,0.5,0.75,913,400,https://www.flickr.com/photos/davebloggs007/28033037860,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\na452f6aa4e59e58e,https://c1.staticflickr.com/6/5610/25306466099_5638195afa_o.jpg,0.25,0.0,1.0,0.75,672,682,https://www.flickr.com/photos/minnellium/25306466099/,https://creativecommons.org/licenses/by/2.0/,Dave Haygarth,https://www.flickr.com/people/minnellium/\n702562cd530638f8,https://c1.staticflickr.com/6/5656/31149706722_1e36740569_o.jpg,0.0,0.25,0.75,1.0,908,508,https://www.flickr.com/photos/g4gti/31149706722/,https://creativecommons.org/licenses/by/2.0/,Ryohei Noda,https://www.flickr.com/people/g4gti/\n513c332da1871c47,https://c1.staticflickr.com/9/8819/28350586342_2392784308_o.jpg,0.336764705882,0.0,1.0,1.0,876,803,https://www.flickr.com/photos/governordanmalloy/28350586342,https://creativecommons.org/licenses/by/2.0/,Dannel Malloy,https://www.flickr.com/people/governordanmalloy/\n2bc9a45814b19194,https://c1.staticflickr.com/9/8459/28565031922_dff800cd1d_o.jpg,0.25,0.0,1.0,1.0,874,913,https://www.flickr.com/photos/bignosedk/28565031922/,https://creativecommons.org/licenses/by/2.0/,bignosedk,https://www.flickr.com/people/bignosedk/\nc790f093bea813b3,https://c1.staticflickr.com/6/5519/29852540954_68245f647e_o.jpg,0.0,0.0,0.666666666667,1.0,519,693,https://www.flickr.com/photos/box_repsol/29852540954,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n35fab6b3e9625b3b,https://c1.staticflickr.com/6/5660/30341720985_6609d6a563_o.jpg,0.0,0.254464285714,0.75,0.763392857143,141,508,https://www.flickr.com/photos/dkeats/30341720985,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n50ff6daab1f960a7,https://c1.staticflickr.com/1/370/32296250730_ca16ff04a5_o.jpg,0.0,0.211956521739,0.75,0.635869565217,407,792,https://www.flickr.com/photos/eltb/32296250730,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n9ecbb09e58020f68,https://c1.staticflickr.com/9/8800/28371455781_7dcfffb783_o.jpg,0.210588633288,0.25,0.631765899865,1.0,920,118,https://www.flickr.com/photos/rsanajong/28371455781,https://creativecommons.org/licenses/by/2.0/,Ruth San,https://www.flickr.com/people/rsanajong/\na6ecd871a2ac0a64,https://c1.staticflickr.com/1/369/32400476881_85e1e8eb7c_o.jpg,0.357452966715,0.0,1.0,1.0,662,557,http://www.flickr.com/photos/31411679@N08/32400476881,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\ne57db09222f91915,https://c1.staticflickr.com/8/7354/27277335942_0cff74599b_o.jpg,0.232244318182,0.0,0.696732954545,0.75,896,646,https://www.flickr.com/photos/usnavy/27277335942,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n6380b4206e5c5f58,https://c1.staticflickr.com/8/7473/26943688420_d5bb6ca753_o.jpg,0.25,0.0,1.0,0.75,441,531,https://www.flickr.com/photos/vernieman/26943688420,https://creativecommons.org/licenses/by/2.0/,Vernon Chan,https://www.flickr.com/people/vernieman/\n37c329eff6e5207a,https://c1.staticflickr.com/1/369/31707653936_f51f5ac9ce_o.jpg,0.0,0.0,0.75,1.0,459,991,https://www.flickr.com/photos/londonmatt/31707653936,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\ncac9934731b00e4d,https://c1.staticflickr.com/9/8462/28585735914_864bf98603_o.jpg,0.0,0.0,0.666666666667,1.0,353,667,https://www.flickr.com/photos/flowcomm/28585735914,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\n2138d27d3732a137,https://c1.staticflickr.com/9/8333/29333401096_471bcc1ca5_o.jpg,0.0,0.0,0.666666666667,1.0,973,754,https://www.flickr.com/photos/aschaf/29333401096/,https://creativecommons.org/licenses/by/2.0/,Andrea Schaffer,https://www.flickr.com/people/aschaf/\na48a756d26a49564,https://c1.staticflickr.com/8/7437/26643195393_2b06a59f33_o.jpg,0.237068965517,0.25,0.711206896552,1.0,13,363,https://www.flickr.com/photos/132295270@N07/26643195393,https://creativecommons.org/licenses/by/2.0/,Renee,https://www.flickr.com/people/132295270@N07/\n3fd9abe4e245e424,https://c1.staticflickr.com/9/8209/29528303331_95cb896952_o.jpg,0.0,0.0,0.5,0.75,561,654,https://www.flickr.com/photos/tabor-roeder/29528303331/in/photostream/,https://creativecommons.org/licenses/by/2.0/,Phil Roeder,https://www.flickr.com/people/tabor-roeder/\n51855296d7f8f5ea,https://c1.staticflickr.com/8/7442/26902931295_49b58d7791_o.jpg,0.4375,0.25,1.0,1.0,934,538,https://www.flickr.com/photos/jeepersmedia/26902931295,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n6d6292e293401c10,https://c1.staticflickr.com/9/8355/28711694875_13de26ba1c_o.jpg,0.25,0.0,0.75,0.75,470,805,https://www.flickr.com/photos/brindle95/28711694875,https://creativecommons.org/licenses/by/2.0/,Apollo,https://www.flickr.com/people/brindle95/\n63016bdc53cccc9d,https://c1.staticflickr.com/9/8272/29576248996_c367d9da50_o.jpg,0.0,0.25,0.56338028169,1.0,303,999,https://www.flickr.com/photos/treegrow/29576248996/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nf83ffca92b5f8c95,https://c1.staticflickr.com/8/7505/29890674496_b88e7e93d5_o.jpg,0.489195230999,0.25,1.0,1.0,874,456,https://www.flickr.com/photos/34517490@N00/29890674496,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/\nb09c68115edf03ab,https://c1.staticflickr.com/6/5581/30110282886_639d279080_o.jpg,0.0178890876565,0.0,1.0,1.0,113,320,https://www.flickr.com/photos/jsjgeology/30110282886,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n3b382708d0733e54,https://c1.staticflickr.com/8/7745/27233830482_449ab6898b_o.jpg,0.0,0.25,0.5,1.0,972,991,https://www.flickr.com/photos/wrongwalker/27233830482,https://creativecommons.org/licenses/by/2.0/,Thierry Figini,https://www.flickr.com/people/wrongwalker/\n601ccb5940cc7215,https://c1.staticflickr.com/8/7665/28405826375_43c7f0dcd6_o.jpg,0.0,0.0,1.0,0.477556109726,569,65,https://www.flickr.com/photos/ninara/28405826375,https://creativecommons.org/licenses/by/2.0/,Ninara,https://www.flickr.com/people/ninara/\na1a1aa76e52e6146,https://c1.staticflickr.com/1/654/31703609554_e54c2e0659_o.jpg,0.25,0.0,0.75,0.75,739,785,https://www.flickr.com/photos/blumenbiene/31703609554,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\n84cbd5ee8222c0b0,https://c1.staticflickr.com/9/8663/28185639141_68215b670b_o.jpg,0.357452966715,0.0,1.0,1.0,611,109,https://www.flickr.com/photos/dfmagazine/28185639141,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/\n1f4521cc50e70452,https://c1.staticflickr.com/6/5643/29952653663_9a85cec071_o.jpg,0.529739776952,0.25,0.882899628253,1.0,919,730,https://flickr.com/53051055@N07/29952653663,https://creativecommons.org/licenses/by/2.0/,Susan Babbitt,https://www.flickr.com/people/scavenger49/\n7ae84861ec06c528,https://c1.staticflickr.com/9/8212/29724578442_3dbfa852a9_o.jpg,0.0,0.0,0.75,0.53506097561,990,301,https://www.flickr.com/photos/biodivlibrary/29724578442,https://creativecommons.org/licenses/by/2.0/,Biodiversity Heritage Library,https://www.flickr.com/people/biodivlibrary/\nf882f00523dfda0f,https://c1.staticflickr.com/6/5801/30976571960_a064e65e50_o.jpg,0.496696035242,0.0,0.993392070485,0.75,520,763,https://www.flickr.com/photos/applesnpearsau/30976571960,https://creativecommons.org/licenses/by/2.0/,Apple and Pear Australia Ltd,https://www.flickr.com/people/applesnpearsau/\nb025d96ff865c96f,https://c1.staticflickr.com/1/485/31826152322_6b2360e544_o.jpg,0.31724137931,0.25,1.0,1.0,113,78,https://www.flickr.com/photos/jsjgeology/31826152322,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n1fef5453f2d061bc,https://c1.staticflickr.com/9/8204/29142476984_3c67566539_o.jpg,0.0,0.25,0.496696035242,1.0,989,775,https://www.flickr.com/photos/76827729@N08/29142476984,https://creativecommons.org/licenses/by/2.0/,Sabrina Setaro,https://www.flickr.com/people/76827729@N08/\nda79145690db51bc,https://c1.staticflickr.com/9/8438/27951673283_d37ef53404_o.jpg,0.0,0.28125,0.75,0.84375,558,538,https://www.flickr.com/photos/taymazvalley/27951673283,https://creativecommons.org/licenses/by/2.0/,Taymaz Valley,https://www.flickr.com/people/taymazvalley/\n55c261cd082aeb95,https://c1.staticflickr.com/8/7454/28204321376_28afcdda95_o.jpg,0.0,0.25,0.5,1.0,294,30,https://www.flickr.com/photos/flowcomm/28204321376/,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\n4bf8cd3abf9e5ccc,https://c1.staticflickr.com/8/7650/26807437962_5064fddec4_o.jpg,0.0,0.25,0.75,1.0,25,121,http://www.flickr.com/32870650@N08/26807437962/,https://creativecommons.org/licenses/by/2.0/,Dana Moos,https://www.flickr.com/people/dana_moos/\n8dbdeaeffbf4c042,https://c1.staticflickr.com/9/8174/29018402341_82b41c0f7e_o.jpg,0.25,0.0,0.75,0.75,548,472,https://www.flickr.com/photos/seraveenl/29018402341,https://creativecommons.org/licenses/by/2.0/,Stefan Geertsen,https://www.flickr.com/people/seraveenl/\n9768c69fffb461ac,https://c1.staticflickr.com/6/5347/30797279450_8cf9f4c36d_o.jpg,0.0,0.0,0.67667238422,0.75,569,504,https://www.flickr.com/photos/ringkong/30797279450,https://creativecommons.org/licenses/by/2.0/,typexnick,https://www.flickr.com/people/ringkong/\n1c172450001e25e9,https://c1.staticflickr.com/9/8731/28901422065_0af04781cb_o.jpg,0.45,0.25,0.9,1.0,405,101,https://www.flickr.com/photos/erussell1984/28901422065,https://creativecommons.org/licenses/by/2.0/,airbus777,https://www.flickr.com/people/erussell1984/\n8d7377adce26710e,https://c1.staticflickr.com/6/5564/30567232200_2278364509_o.jpg,0.25,0.25,0.75,1.0,34,619,https://www.flickr.com/photos/usfws_pacificsw/30567232200,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/\n15cc30a72f8f9e95,https://c1.staticflickr.com/9/8069/29100729892_1d1452aae7_o.jpg,0.5,0.0,1.0,0.75,986,813,https://www.flickr.com/photos/100652816@N08/29100729892/,https://creativecommons.org/licenses/by/2.0/,Alfred Schierholz,https://www.flickr.com/people/100652816@N08/\n9e3ad056e72813ff,https://c1.staticflickr.com/8/7703/29099383912_356d4e1940_o.jpg,0.0,0.0,0.75,1.0,868,241,https://www.flickr.com/photos/jeepersmedia/29099383912,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nd5c663521de9a11f,https://c1.staticflickr.com/8/7666/26655397080_293bc369d7_o.jpg,0.28125,0.0,0.84375,0.75,926,793,https://www.flickr.com/photos/68147320@N02/26655397080,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\n5f9b54e586f0e8b0,https://c1.staticflickr.com/6/5517/30465252920_82f971a112_o.jpg,0.541960507757,0.0,1.0,0.75,973,557,https://www.flickr.com/photos/jsjgeology/30465252920,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n406a9b7ec03568d3,https://c1.staticflickr.com/6/5597/31713039236_424546452b_o.jpg,0.25,0.0,0.75,0.75,459,861,https://flickr.com/32370233@N05/31713039236,https://creativecommons.org/licenses/by/2.0/,Public Information Office,https://www.flickr.com/people/mariettaga/\ne4205784a0a89159,https://c1.staticflickr.com/8/7352/26956176851_f883d7d620_o.jpg,0.269908116386,0.0,0.809724349158,0.75,473,539,https://www.flickr.com/photos/aasenhistorie/26956176851,https://creativecommons.org/licenses/by/2.0/,\\303\\205sen Museum og Historielag,https://www.flickr.com/people/aasenhistorie/\nbf67145fe4f58b5a,https://c1.staticflickr.com/8/7537/26205679123_aa3b00b7c3_o.jpg,0.0,0.25,0.5,1.0,519,935,https://www.flickr.com/photos/box_repsol/26205679123,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n2c452d5ca61428a6,https://c1.staticflickr.com/6/5768/30573796340_b1a8aff843_o.jpg,0.503303964758,0.0,1.0,0.75,889,339,https://www.flickr.com/photos/sybarite48/30573796340/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nc7693ad33075a40e,https://c1.staticflickr.com/9/8189/29131482421_9809bbb869_o.jpg,0.45,0.25,0.9,1.0,810,513,https://flickr.com/25977089@N00/29131482421,https://creativecommons.org/licenses/by/2.0/,goblinbox_(queen_of_ad_hoc_bento),https://www.flickr.com/people/goblinbox/\n31a2c1b6d289e197,https://c1.staticflickr.com/9/8412/29978803786_73dc2196d7_o.jpg,0.0372340425532,0.0,1.0,1.0,487,897,https://www.flickr.com/photos/grotonschool/29978803786/,https://creativecommons.org/licenses/by/2.0/,Groton School,https://www.flickr.com/people/grotonschool/\naa6cf27c89580217,https://c1.staticflickr.com/8/7667/28246134286_653c8d1012_o.jpg,0.4375,0.25,1.0,1.0,407,918,https://www.flickr.com/photos/phelyan/28246134286,https://creativecommons.org/licenses/by/2.0/,Phelyan Sanjoin,https://www.flickr.com/people/phelyan/\n3c416fd66e2f7fa3,https://c1.staticflickr.com/9/8610/29844330543_6fb83c391b_o.jpg,0.155052264808,0.25,0.465156794425,1.0,896,713,https://www.flickr.com/photos/8782469@N05/29844330543/,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/\n6744ffc05e787e5f,https://c1.staticflickr.com/8/7721/26961749056_942da88dc7_o.jpg,0.4375,0.25,1.0,1.0,780,531,https://www.flickr.com/photos/thoseguys119/26961749056,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n865e2437e57a4a3b,https://c1.staticflickr.com/9/8612/28292578761_b771fed902_o.jpg,0.0,0.0,0.5,0.75,33,949,https://www.flickr.com/photos/briangratwicke/28292578761,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/\nad7376c3bf2159dd,https://c1.staticflickr.com/9/8313/29678534671_f307c1c700_o.jpg,0.5,0.25,1.0,1.0,672,447,https://www.flickr.com/photos/swampa/29678534671/,https://creativecommons.org/licenses/by/2.0/,Steve Collis,https://www.flickr.com/people/swampa/\n5f2138e8a283fea8,https://c1.staticflickr.com/1/477/31600432432_908a5fa3db_o.jpg,0.460183767228,0.25,1.0,1.0,321,844,https://www.flickr.com/photos/gails_pictures/31600432432,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n7cdd3b329012d4f5,https://c1.staticflickr.com/9/8651/27857043203_b547c5101e_o.jpg,0.4375,0.25,1.0,1.0,756,508,https://www.flickr.com/photos/fdecomite/27857043203/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\n9a3cf1e30d5a2c50,https://c1.staticflickr.com/6/5564/30235658854_66ecec4677_o.jpg,0.25,0.25,0.75,1.0,558,552,https://www.flickr.com/photos/zmescience/30235658854,https://creativecommons.org/licenses/by/2.0/,ZME  Science,https://www.flickr.com/people/zmescience/\nca615289147a0fea,https://c1.staticflickr.com/6/5738/30870713791_e75fa2e4b2_o.jpg,0.28125,0.0,0.84375,0.75,411,158,https://flickr.com/91008793@N00/30870713791,https://creativecommons.org/licenses/by/2.0/,bobistraveling,https://www.flickr.com/people/bobistraveling/\nd31e27a79c9ed146,https://c1.staticflickr.com/2/1519/26748865155_a937cfbfd2_o.jpg,0.4375,0.25,1.0,1.0,356,754,https://www.flickr.com/photos/edenpictures/26748865155,https://creativecommons.org/licenses/by/2.0/,\"Eden, Janine and Jim\",https://www.flickr.com/people/edenpictures/\n465d3fd1c9e40b45,https://c1.staticflickr.com/2/1637/26671635232_8f1d6766ed_o.jpg,0.228169014085,0.0,0.684507042254,0.75,986,448,https://www.flickr.com/photos/pussreboots/26671635232/,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/\nf2cd349192790cd5,https://c1.staticflickr.com/1/636/32119299370_8a28939abc_o.jpg,0.497426470588,0.25,0.994852941176,1.0,429,228,https://www.flickr.com/photos/agenciabrasilia/32119299370,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\ne8be80e51ed52dbe,https://c1.staticflickr.com/8/7582/28225932891_968bbedd11_o.jpg,0.4375,0.0,1.0,0.75,3,438,https://www.flickr.com/photos/noaaphotolib/28225932891,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\nbc4dbe4e478c89db,https://c1.staticflickr.com/9/8554/30299873792_e208ffa403_o.jpg,0.5,0.0,1.0,0.75,426,785,https://www.flickr.com/photos/60712129@N06/30299873792,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/\nb5e1c723122c11c6,https://c1.staticflickr.com/9/8444/28251086673_2062bc2d4c_o.jpg,0.400242326333,0.25,1.0,1.0,23,385,https://www.flickr.com/photos/andymorffew/28251086673,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\n1e534d2ed2e757aa,https://c1.staticflickr.com/9/8395/29728167275_d144a0f52a_o.jpg,0.454002808989,0.0,0.908005617978,0.75,972,347,https://www.flickr.com/photos/134832191@N08/29728167275,https://creativecommons.org/licenses/by/2.0/,Martyn Fletcher,https://www.flickr.com/people/134832191@N08/\n04d25653548c8051,https://c1.staticflickr.com/8/7622/27388905943_cc9bd70303_o.jpg,0.0,0.0,0.503698224852,0.75,146,729,https://www.flickr.com/photos/noaaphotolib/27388905943,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\n288def49c353a9df,https://c1.staticflickr.com/6/5481/30728325851_e46bbbe12e_o.jpg,0.0,0.282131661442,0.75,0.846394984326,407,317,https://www.flickr.com/photos/eltb/30728325851,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n8f18f5567522fca6,https://c1.staticflickr.com/8/7115/27083767095_b36c3683bc_o.jpg,0.25,0.25,0.75,1.0,782,705,https://www.flickr.com/photos/deniwlp84/27083767095,https://creativecommons.org/licenses/by/2.0/,Deni Williams,https://www.flickr.com/people/deniwlp84/\n3cac40ae81852a71,https://c1.staticflickr.com/2/1714/26149641464_806a44e2fb_o.jpg,0.48275862069,0.25,1.0,1.0,22,288,https://www.flickr.com/photos/lakeworth/26149641464,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/\n509c3200ab099636,https://c1.staticflickr.com/4/3872/33169330906_ae041604ce_o.jpg,0.0,0.0,0.666666666667,1.0,820,790,https://www.flickr.com/photos/alterna2/33169330906/,https://creativecommons.org/licenses/by/2.0/,Alterna2 http://www.alterna2.com,https://www.flickr.com/people/alterna2/\n516301f7fd74072e,https://c1.staticflickr.com/9/8594/28580872186_0a9da916ae_o.jpg,0.0,0.503303964758,0.75,1.0,885,537,https://www.flickr.com/photos/50732955@N00/28580872186,https://creativecommons.org/licenses/by/2.0/,Timmy_L,https://www.flickr.com/people/50732955@N00/\n337f39a809b1b1fc,https://c1.staticflickr.com/6/5622/31270916172_17b03fabaa_o.jpg,0.281165311653,0.0,0.843495934959,1.0,976,891,https://www.flickr.com/photos/65047661@N00/31270916172/,https://creativecommons.org/licenses/by/2.0/,Jim  Lukach,https://www.flickr.com/people/65047661@N00/\n74e1abc1f6e851d7,https://c1.staticflickr.com/6/5340/30946508495_dcf4741c01_o.jpg,0.25,0.25,0.75,1.0,407,728,https://www.flickr.com/photos/eltb/30946508495,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n027597d81677f3df,https://c1.staticflickr.com/6/5606/30376373476_fb384215bd_o.jpg,0.25,0.25,0.75,1.0,980,164,https://www.flickr.com/photos/syshook/30376373476/,https://creativecommons.org/licenses/by/2.0/,Rajib Ghosh,https://www.flickr.com/people/syshook/\nda1d564874342922,https://c1.staticflickr.com/8/7125/27747864171_c41b5e38ac_o.jpg,0.0,0.25,0.5625,1.0,980,404,https://www.flickr.com/photos/vastateparksstaff/27747864171,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n1c3ca5fb97b4110c,https://c1.staticflickr.com/8/7616/26866707503_0fc1f58d06_o.jpg,0.0,0.25,0.5,1.0,48,339,https://www.flickr.com/photos/st33vo/26866707503,https://creativecommons.org/licenses/by/2.0/,Steven Straiton,https://www.flickr.com/people/st33vo/\nfd8a654bc379d914,https://c1.staticflickr.com/8/7449/27611217962_c0bb90a758_o.jpg,0.25,0.0,1.0,0.613970588235,86,440,https://www.flickr.com/photos/mark-gunn/27611217962,https://creativecommons.org/licenses/by/2.0/,Mark  Gunn,https://www.flickr.com/people/mark-gunn/\nbf2af62b02f9ddfd,https://c1.staticflickr.com/6/5804/30313378913_865af584f4_o.jpg,0.0,0.0,0.5625,0.75,973,894,https://www.flickr.com/photos/jsjgeology/30313378913,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n025ae742a23721f4,https://c1.staticflickr.com/8/7296/26741324344_d156b5d759_o.jpg,0.0,0.233045622688,1.0,0.699136868064,762,638,https://www.flickr.com/photos/wolfvision_vsolution/26741324344/,https://creativecommons.org/licenses/by/2.0/,WolfVision GmbH,https://www.flickr.com/people/wolfvision_vsolution/\nb231bf3c03da13bd,https://c1.staticflickr.com/8/7107/26574373433_9663ec9802_o.jpg,0.0,0.25,0.5625,1.0,388,866,https://www.flickr.com/photos/sedoglia/26574373433,https://creativecommons.org/licenses/by/2.0/,Sergio,https://www.flickr.com/people/sedoglia/\nc5efec11992a91bb,https://c1.staticflickr.com/1/383/31708885771_38deb355c2_o.jpg,0.0,0.281690140845,0.75,0.845070422535,887,531,https://www.flickr.com/photos/southbeachcars/31708885771,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n5e725eba3bdf1806,https://c1.staticflickr.com/6/5836/31200238952_e09f1846cd_o.jpg,0.28125,0.0,0.84375,0.75,566,392,https://www.flickr.com/photos/davidwilson1949/31200238952/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n383f271f5d7b37f2,https://c1.staticflickr.com/8/7256/27745693316_dd0211201b_o.jpg,0.457373271889,0.0,1.0,0.75,821,948,https://www.flickr.com/photos/jsjgeology/27745693316,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n191381f06ea859a9,https://c1.staticflickr.com/9/8510/28651484113_41de53b6ca_o.jpg,0.0,0.0,0.666666666667,1.0,431,399,https://www.flickr.com/photos/yourbestdigs/28651484113,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\n5141b9902efff940,https://c1.staticflickr.com/6/5540/29300374824_39fec2e4e7_o.jpg,0.25,0.25,0.75,1.0,832,907,https://www.flickr.com/photos/147489968@N06/29300374824,https://creativecommons.org/licenses/by/2.0/,Paintzen,https://www.flickr.com/people/147489968@N06/\nc3309015d35f07f4,https://c1.staticflickr.com/1/485/31914455941_f3e3999c81_o.jpg,0.28125,0.0,0.84375,0.75,477,845,https://www.flickr.com/photos/garryknight/31914455941/,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\n48c2bd4448c4d311,https://c1.staticflickr.com/9/8644/28529303080_eb29197164_o.jpg,0.4375,0.0,1.0,0.75,706,837,https://www.flickr.com/photos/26531284@N02/28529303080,https://creativecommons.org/licenses/by/2.0/,rickpilot_2000,https://www.flickr.com/people/26531284@N02/\nd80fd1dcbd8db378,https://c1.staticflickr.com/6/5694/30060457803_e5e58350b8_o.jpg,0.0,0.0,0.421177266576,0.75,600,715,https://flickr.com/148662629@N08/30060457803,https://creativecommons.org/licenses/by/2.0/,Dirk Pons,https://www.flickr.com/people/148662629@N08/\n41860112864b472c,https://c1.staticflickr.com/6/5710/30560392956_6f69243a67_o.jpg,0.28125,0.0,0.84375,0.75,484,442,https://flickr.com/10787737@N02/30560392956,https://creativecommons.org/licenses/by/2.0/,osseous,https://www.flickr.com/people/osseous/\nbd2eada9f7d33abe,https://c1.staticflickr.com/6/5092/29980647155_f3f4cd7dfb_o.jpg,0.28125,0.0,0.84375,0.75,880,54,https://www.flickr.com/photos/31029865@N06/29980647155,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/\na729a4aae8a61a28,https://c1.staticflickr.com/9/8844/28399603156_472c934408_o.jpg,0.0,0.0,0.75,1.0,133,83,https://www.flickr.com/photos/nature80020/28399603156,https://creativecommons.org/licenses/by/2.0/,nature80020,https://www.flickr.com/people/nature80020/\nfc912e8f19f4e1c9,https://c1.staticflickr.com/9/8794/27746131383_94be5fff1c_o.jpg,0.25,0.0,1.0,0.5625,320,158,https://flickr.com/27305106@N06/27746131383,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\n7c8d13796ad37aba,https://c1.staticflickr.com/9/8406/28257602312_6671dfcbca_o.jpg,0.25,0.25,0.75,1.0,769,716,https://www.flickr.com/photos/petenowakowski/28257602312/,https://creativecommons.org/licenses/by/2.0/,Pete Nowakowski,https://www.flickr.com/people/petenowakowski/\n8a8ea770e3966f60,https://c1.staticflickr.com/8/7192/26526998484_8e5aa14e0f_o.jpg,0.0,0.25,0.531155015198,1.0,348,165,https://www.flickr.com/photos/usfwsmidwest/26526998484,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\nf54aeb5092ed5267,https://c1.staticflickr.com/6/5559/30378835014_3d27f6341c_o.jpg,0.0,0.25,0.421177266576,1.0,147,643,https://flickr.com/40883175@N06/30378835014,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\n3b7f9186008ed0f5,https://c1.staticflickr.com/9/8313/29431761591_406a1172fd_o.jpg,0.0,0.0,1.0,1.0,672,883,https://www.flickr.com/photos/glorycycles/29431761591,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n56f5af432db2761c,https://c1.staticflickr.com/9/8639/28940478726_693be453a0_o.jpg,0.0,0.0,0.5625,0.75,976,43,https://www.flickr.com/photos/71267357@N06/28940478726/,https://creativecommons.org/licenses/by/2.0/,Transformer18,https://www.flickr.com/people/71267357@N06/\ne165dcbeb553716f,https://c1.staticflickr.com/8/7337/27599335060_84a0aa3cdf_o.jpg,0.0,0.0,0.75,0.599757673667,2,727,https://www.flickr.com/photos/pratikpower/27599335060,https://creativecommons.org/licenses/by/2.0/,Pratik Kadam,https://www.flickr.com/people/pratikpower/\ndcacd2cb3a4a708b,https://c1.staticflickr.com/6/5512/31080312132_1b46dea7c6_o.jpg,0.0,0.0,0.5625,0.75,875,105,https://www.flickr.com/photos/9759010@N07/31080312132,https://creativecommons.org/licenses/by/2.0/,Ken,https://www.flickr.com/people/9759010@N07/\nd4ba1959112ec401,https://c1.staticflickr.com/1/406/32074830360_a12aa034f1_o.jpg,0.4375,0.0,1.0,0.75,437,740,https://flickr.com/64583732@N04/32074830360,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\n1301ae213e18a95b,https://c1.staticflickr.com/8/7690/27056668605_ecd1c27d43_o.jpg,0.25,0.0,0.75,0.75,980,16,https://www.flickr.com/photos/slapers/27056668605,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\n16ac239e2cdce2bf,https://c1.staticflickr.com/9/8845/28527655182_cdfd3c94f2_o.jpg,0.28125,0.25,0.84375,1.0,647,396,https://www.flickr.com/photos/amanderson/28527655182,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n1a9d934c5f1e9b30,https://c1.staticflickr.com/1/504/31529749781_6dd859448e_o.jpg,0.0,0.0,0.496696035242,0.75,706,988,http://www.flickr.com/photos/28101583@N07/31529749781/,https://creativecommons.org/licenses/by/2.0/,Drew  Jacksich,https://www.flickr.com/people/28101583@N07/\nc33dd1625990debd,https://c1.staticflickr.com/6/5520/31018061101_85096c72f6_o.jpg,0.0,0.0527240773286,1.0,1.0,449,831,https://www.flickr.com/photos/youngshanahan/31018061101/,https://creativecommons.org/licenses/by/2.0/,young shanahan,https://www.flickr.com/people/youngshanahan/\nb81f94d7dead3f87,https://c1.staticflickr.com/8/7499/26855432905_e744ebb7f5_o.jpg,0.333333333333,0.0,1.0,1.0,548,558,https://www.flickr.com/photos/rhemkes/26855432905,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\n7443b3a00aa62632,https://c1.staticflickr.com/8/7032/26494098444_24b70a5383_o.jpg,0.0,0.25,0.75,1.0,822,392,https://www.flickr.com/photos/jbrocker_photos/26494098444,https://creativecommons.org/licenses/by/2.0/,Jacqueline Brocker,https://www.flickr.com/people/jbrocker_photos/\na5aec9ae6f69aba3,https://c1.staticflickr.com/6/5524/29954452823_73c786e715_o.jpg,0.4375,0.0,1.0,0.75,780,57,https://www.flickr.com/photos/thoseguys119/29954452823/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nb45d46b94dc1a5df,https://c1.staticflickr.com/6/5805/30822705541_40dbe9513b_o.jpg,0.0746527777778,0.0,1.0,1.0,499,180,https://flickr.com/72649499@N02/30822705541,https://creativecommons.org/licenses/by/2.0/,Visit El Paso,https://www.flickr.com/people/visitelpaso/\n2272adb7416960d5,https://c1.staticflickr.com/8/7534/26872628225_4471526f36_o.jpg,0.497426470588,0.0,0.994852941176,0.75,108,262,https://www.flickr.com/photos/78139009@N03/26872628225,https://creativecommons.org/licenses/by/2.0/,allen,https://www.flickr.com/people/78139009@N03/\n064d418830204240,https://c1.staticflickr.com/4/3880/33156746752_793f2a569f_o.jpg,0.25,0.25,1.0,1.0,938,349,https://flickr.com/55229469@N07/33156746752,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\ne597fa21734e89c4,https://c1.staticflickr.com/1/385/32041156043_d4251a6b81_o.jpg,0.25,0.0,1.0,0.606331168831,341,933,https://www.flickr.com/photos/ligthelm/32041156043/,https://creativecommons.org/licenses/by/2.0/,Rick Ligthelm,https://www.flickr.com/people/ligthelm/\n04856d7577af3f01,https://c1.staticflickr.com/2/1648/26727066606_203a95181d_o.jpg,0.333333333333,0.0,1.0,1.0,885,876,https://www.flickr.com/photos/flynn_nrg/26727066606/,https://creativecommons.org/licenses/by/2.0/,Miguel Mendez,https://www.flickr.com/people/flynn_nrg/\ne49f7cebc3a971c5,https://c1.staticflickr.com/8/7204/26792027900_cf40e07f3d_o.jpg,0.0,0.0,0.912068965517,1.0,322,729,https://www.flickr.com/photos/33398884@N03/26792027900,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\n1615a2ff9a08f98a,https://c1.staticflickr.com/6/5758/30007956914_7ef7260174_o.jpg,0.25,0.28125,1.0,0.84375,311,452,https://www.flickr.com/photos/christian_gloor/30007956914,https://creativecommons.org/licenses/by/2.0/,Christian Gloor,https://www.flickr.com/people/christian_gloor/\naade251caeefb72e,https://c1.staticflickr.com/9/8111/29016174660_863b4a37d0_o.jpg,0.0,0.0,0.75,0.5,443,348,https://www.flickr.com/photos/xiquinho/29016174660/,https://creativecommons.org/licenses/by/2.0/,xiquinhosilva,https://www.flickr.com/people/xiquinho/\n18e650e2f3fd0b8b,https://c1.staticflickr.com/9/8600/30031776975_74db42fea2_o.jpg,0.333333333333,0.0,1.0,1.0,760,95,https://www.flickr.com/photos/southbeachcars/30031776975,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n47c2d25662fb97e9,https://c1.staticflickr.com/8/7420/27075113093_fa73ff5880_o.jpg,0.340175953079,0.0,1.0,1.0,613,50,https://www.flickr.com/photos/13476480@N07/27075113093,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\ncc6a261a775718b0,https://c1.staticflickr.com/8/7450/26624729103_131cb6c3d5_o.jpg,0.25,0.25,0.75,1.0,820,572,https://www.flickr.com/photos/usaghumphreys/26624729103,https://creativecommons.org/licenses/by/2.0/,USAG- Humphreys,https://www.flickr.com/people/usaghumphreys/\n71fd9b6568c3554f,https://c1.staticflickr.com/9/8168/29604585675_06c8ed512a_o.jpg,0.0,0.0,0.75,0.5,975,542,https://www.flickr.com/photos/125945909@N05/29604585675,https://creativecommons.org/licenses/by/2.0/,Min Zhou,https://www.flickr.com/people/125945909@N05/\nb24df552253c097e,https://c1.staticflickr.com/8/7363/28038705582_10da3c32d0_o.jpg,0.0,0.0,0.5,0.75,327,548,https://www.flickr.com/photos/52450054@N04/28038705582/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\na7111498662cb869,https://c1.staticflickr.com/9/8387/27906192913_f5f455d46f_o.jpg,0.0,0.0,0.666666666667,1.0,820,164,https://www.flickr.com/photos/weeklydig/27906192913,https://creativecommons.org/licenses/by/2.0/,digboston,https://www.flickr.com/people/weeklydig/\n52a4c99c9b9a25ba,https://c1.staticflickr.com/1/440/32844287786_5faab3c7d1_o.jpg,0.0,0.25,0.421177266576,1.0,980,896,https://www.flickr.com/photos/blmoregon/32844287786,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\n7e5a9f165fd5b3b5,https://c1.staticflickr.com/6/5766/29886866174_4082a96154_o.jpg,0.0,0.25,0.5625,1.0,875,242,https://www.flickr.com/photos/didbygraham/29886866174,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\nbd88d3d7ea607cd7,https://c1.staticflickr.com/8/7494/27315069980_b5baaff788_o.jpg,0.0,0.25,0.5625,1.0,693,836,https://www.flickr.com/photos/stevendepolo/27315069980,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n303678f2e5c4f96b,https://c1.staticflickr.com/8/7757/27525692380_d7fb9ec430_o.jpg,0.324035234899,0.25,0.972105704698,1.0,788,71,https://www.flickr.com/photos/mypubliclands/27525692380,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n4190c29443e0b16a,https://c1.staticflickr.com/9/8306/28449853004_eff6a2aa67_o.jpg,0.266552511416,0.0,0.799657534247,0.75,672,312,https://www.flickr.com/photos/glorycycles/28449853004,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n79b273f7a55ecd69,https://c1.staticflickr.com/9/8641/30177005205_4a92846888_o.jpg,0.0,0.0,0.5,0.75,278,435,https://www.flickr.com/photos/philjose1878/30177005205,https://creativecommons.org/licenses/by/2.0/,Phil Fiddes,https://www.flickr.com/people/philjose1878/\n456f0845b4eae10c,https://c1.staticflickr.com/6/5568/30764193980_91b597907f_o.jpg,0.0,0.28125,0.75,0.84375,973,945,https://www.flickr.com/photos/rob-young/30764193980/,https://creativecommons.org/licenses/by/2.0/,Rob Young,https://www.flickr.com/people/rob-young/\nc91a1530bd7f65cd,https://c1.staticflickr.com/9/8680/28494149881_5459d5a224_o.jpg,0.0,0.0,0.645728643216,0.75,459,914,https://www.flickr.com/photos/nat507/28494149881,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/\n6473f306f208411b,https://c1.staticflickr.com/9/8636/28216529995_8b68e21206_o.jpg,0.0,0.0,1.0,0.666666666667,967,414,https://www.flickr.com/photos/aloha75/28216529995,https://creativecommons.org/licenses/by/2.0/,Sam Howzit,https://www.flickr.com/people/aloha75/\nfd752ff9c44ec7f2,https://c1.staticflickr.com/1/396/32576373656_7fcf6c5ee4_o.jpg,0.0,0.0,1.0,0.666666666667,431,228,https://www.flickr.com/photos/viumariners/32576373656/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/\n5cbd5dfd1cf9a8b3,https://c1.staticflickr.com/9/8547/29716169792_62153d091b_o.jpg,0.28125,0.25,0.84375,1.0,874,599,https://flickr.com/8147927@N08/29716169792,https://creativecommons.org/licenses/by/2.0/,Thanate Tan,https://www.flickr.com/people/thanate_tan/\nf8694b0fdee5c9b2,https://c1.staticflickr.com/8/7079/27303909801_f9b1fbec46_o.jpg,0.0,0.30421686747,1.0,1.0,842,402,https://www.flickr.com/photos/spreadshirt/27303909801,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/\n5a6e51d54fc077c9,https://c1.staticflickr.com/6/5615/31156090932_1c48c16b3c_o.jpg,0.333333333333,0.0,1.0,1.0,986,26,https://www.flickr.com/photos/clairity/31156090932/,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\n823e94312d145344,https://c1.staticflickr.com/9/8643/28552213905_24d30ccfe0_o.jpg,0.28125,0.25,0.84375,1.0,669,854,https://www.flickr.com/photos/davidstanleytravel/28552213905,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n7599a033ce87b3b8,https://c1.staticflickr.com/6/5797/30418778714_3e0fc8a3bc_o.jpg,0.25,0.25,1.0,1.0,826,691,https://flickr.com/60517117@N00/30418778714,https://creativecommons.org/licenses/by/2.0/,Steve Terrell,https://www.flickr.com/people/robotclaw/\n0a7cda4e191e093d,https://c1.staticflickr.com/9/8867/28763165515_7a6e15df40_o.jpg,0.25,0.25,0.75,1.0,519,485,https://www.flickr.com/photos/janitors/28763165515,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n33fb6db0ec2dca80,https://c1.staticflickr.com/9/8813/28929004556_c8a1fb977d_o.jpg,0.0,0.0,1.0,1.0,323,32,https://www.flickr.com/photos/134015204@N02/28929004556?rb=1,https://creativecommons.org/licenses/by/2.0/,rippchenmitkraut66,https://www.flickr.com/people/rippchenmitkraut66/\n2510c86e125f01f7,https://c1.staticflickr.com/9/8206/29956416505_8881d0bea1_o.jpg,0.0,0.0,0.5625,0.75,593,842,https://www.flickr.com/photos/tslac/29956416505,https://creativecommons.org/licenses/by/2.0/,Texas State Library and Archives Commission,https://www.flickr.com/people/tslac/\n166f4368c4e92941,https://c1.staticflickr.com/8/7004/27671252943_ce29dfec3f_o.jpg,0.0,0.5,0.75,1.0,975,529,https://www.flickr.com/photos/mnuernberger/27671252943,https://creativecommons.org/licenses/by/2.0/,Marco N\\303\\274rnberger,https://www.flickr.com/people/mnuernberger/\ne2f9d18e5de96894,https://c1.staticflickr.com/6/5606/30419566604_e448265b23_o.jpg,0.0,0.25,0.421177266576,1.0,980,184,https://flickr.com/148985558@N06/30419566604,https://creativecommons.org/licenses/by/2.0/,paztravels,https://www.flickr.com/people/paztravels/\n3ea12524f19ef9cc,https://c1.staticflickr.com/8/7764/28451777986_059ff4bed5_o.jpg,0.0,0.25,0.75,1.0,871,350,https://www.flickr.com/photos/59722994@N00/28451777986,https://creativecommons.org/licenses/by/2.0/,Motohiko Tokuriki,https://www.flickr.com/people/tokuriki/\n05e63d92d031a2b3,https://c1.staticflickr.com/9/8250/29624581192_089ec373c6_o.jpg,0.0,0.0,0.496696035242,0.75,980,469,https://www.flickr.com/photos/ashchand/29624581192,https://creativecommons.org/licenses/by/2.0/,Ashwin Chandrasekaran,https://www.flickr.com/people/ashchand/\nf427620358c6c92d,https://c1.staticflickr.com/6/5490/31175708731_2a40e8fa6d_o.jpg,0.25,0.25,0.75,1.0,629,712,https://www.flickr.com/photos/prayitnophotography/31175708731,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\n8edded180488d8b8,https://c1.staticflickr.com/4/3902/32749566386_08b4f75af5_o.jpg,0.0,0.0,0.662261380323,1.0,672,493,https://www.flickr.com/photos/glorycycles/32749566386,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\nb8a5b4a95d3a3930,https://c1.staticflickr.com/9/8715/28081795322_15141991a0_o.jpg,0.0,0.0,0.75,0.75,979,171,https://www.flickr.com/photos/aidanmorgan/28081795322,https://creativecommons.org/licenses/by/2.0/,John Morgan,https://www.flickr.com/people/aidanmorgan/\n7f05a54a4194d722,https://c1.staticflickr.com/8/7323/27251873060_4c1d4b1f20_o.jpg,0.0,0.0,0.666666666667,1.0,40,830,https://www.flickr.com/photos/60199688@N08/27251873060/,https://creativecommons.org/licenses/by/2.0/,erikccooper,https://www.flickr.com/people/60199688@N08/\n78ba24181566aa76,https://c1.staticflickr.com/8/7762/27471775396_9e919e3994_o.jpg,0.252777777778,0.25,0.758333333333,1.0,78,692,https://www.flickr.com/photos/23660854@N07/27471775396,https://creativecommons.org/licenses/by/2.0/,Marshal Hedin,https://www.flickr.com/people/23660854@N07/\n6de9c760f9fca002,https://c1.staticflickr.com/6/5809/22842003478_e48fe425de_o.jpg,0.25,0.0,1.0,0.75,324,492,https://www.flickr.com/photos/sheila_sund/22842003478,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/\nd8df9e8f8d619629,https://c1.staticflickr.com/9/8324/29784397852_09e66e8ba3_o.jpg,0.421177266576,0.25,0.842354533153,1.0,669,302,https://www.flickr.com/photos/ankurp/29784397852,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\n8dc3b28f3f2d6e41,https://c1.staticflickr.com/6/5687/30563604874_22212000a9_o.jpg,0.28125,0.25,0.84375,1.0,875,235,https://www.flickr.com/photos/wltmauc/30563604874,https://creativecommons.org/licenses/by/2.0/,Aubrey Morandarte,https://www.flickr.com/people/wltmauc/\n0be40127f05d09b8,https://c1.staticflickr.com/1/711/32602187995_a71eab3a82_o.jpg,0.0,0.281690140845,0.75,0.845070422535,558,433,https://www.flickr.com/photos/aukirk/32602187995,https://creativecommons.org/licenses/by/2.0/,Austin Kirk,https://www.flickr.com/people/aukirk/\n24387363af940d26,https://c1.staticflickr.com/1/436/31615723060_613795710b_o.jpg,0.243095930233,0.25,0.729287790698,1.0,980,731,https://www.flickr.com/photos/nicholas_t/31615723060,https://creativecommons.org/licenses/by/2.0/,Nicholas A. Tonelli,https://www.flickr.com/people/nicholas_t/\n913534c70379b170,https://c1.staticflickr.com/6/5772/31091704592_5737bdc892_o.jpg,0.0,0.25,0.5,1.0,39,685,https://www.flickr.com/photos/silkebaron/31091704592,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/\n1bba4ef457be4add,https://c1.staticflickr.com/9/8150/28640089846_bf0bb330dd_o.jpg,0.25,0.263416815742,1.0,1.0,22,459,https://www.flickr.com/photos/hisgett/28640089846/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\nf0b5fb31d0b21f1a,https://c1.staticflickr.com/9/8736/28135692231_153a09231e_o.jpg,0.0,0.25,0.75,0.75,304,950,https://www.flickr.com/photos/chaz_pics/28135692231/,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\n5a0a62f0950f1a7c,https://c1.staticflickr.com/9/8218/29657949522_df9f31d7b5_o.jpg,0.55625,0.25,1.0,1.0,405,976,https://www.flickr.com/photos/hisgett/29657949522/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n2b1e1f0029bac0e6,https://c1.staticflickr.com/6/5490/30748432912_d20a98a2e8_o.jpg,0.28125,0.0,0.84375,0.75,875,718,https://www.flickr.com/photos/69203347@N03/30748432912,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\nd46ebcc62af2acb9,https://c1.staticflickr.com/8/7683/28587713576_9abff046fa_o.jpg,0.438671875,0.0,1.0,0.75,303,89,https://www.flickr.com/photos/treegrow/28587713576/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n5194d217d92d4766,https://c1.staticflickr.com/6/5754/31001495165_f10911b6db_o.jpg,0.0,0.0,0.75,0.75,938,108,https://www.flickr.com/photos/lablasco/31001495165/,https://creativecommons.org/licenses/by/2.0/,Lablascovegmenu,https://www.flickr.com/people/lablasco/\n5623513a685f8768,https://c1.staticflickr.com/8/7538/26706714732_4dd5db5530_o.jpg,0.5,0.25,1.0,1.0,348,409,https://www.flickr.com/photos/kpaulus/26706714732,https://creativecommons.org/licenses/by/2.0/,Kristine Paulus,https://www.flickr.com/people/kpaulus/\n79851972b121cbbb,https://c1.staticflickr.com/9/8364/29372683066_1f4972f555_o.jpg,0.0,0.25,0.5,1.0,792,624,https://www.flickr.com/photos/polycart/29372683066,https://creativecommons.org/licenses/by/2.0/,Polycart,https://www.flickr.com/people/polycart/\nbb4d99cb6d0fa407,https://c1.staticflickr.com/6/5477/30440351076_a76e025830_o.jpg,0.158823529412,0.25,0.476470588235,1.0,896,492,https://www.flickr.com/photos/8782469@N05/30440351076,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/\nf448f3de61f8984b,https://c1.staticflickr.com/9/8305/29770886371_50cbd67376_o.jpg,0.25,0.0,1.0,1.0,986,994,https://www.flickr.com/photos/louisvilleusace/29770886371,https://creativecommons.org/licenses/by/2.0/,LouisvilleUSACE,https://www.flickr.com/people/louisvilleusace/\n4a43182fa48efb7b,https://c1.staticflickr.com/2/1692/26760229095_97ae025c92_o.jpg,0.0,0.0,0.666666666667,1.0,806,778,https://www.flickr.com/photos/jamesboyes/26760229095,https://creativecommons.org/licenses/by/2.0/,James Boyes,https://www.flickr.com/people/jamesboyes/\n7b5bb3821e924e98,https://c1.staticflickr.com/8/7290/27062590492_9deaa9a986_o.jpg,0.0,0.0,0.260106382979,0.75,780,750,https://www.flickr.com/photos/thoseguys119/27062590492,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n0b66e14b69c8d27c,https://c1.staticflickr.com/9/8550/29796420193_bd585838a6_o.jpg,0.0,0.0,0.666666666667,1.0,979,911,https://www.flickr.com/photos/za-photos/29796420193/,https://creativecommons.org/licenses/by/2.0/,Jolene Thompson,https://www.flickr.com/people/za-photos/\n3fd4e857267ea420,https://c1.staticflickr.com/8/7668/27164513270_6b3335bd17_o.jpg,0.0,0.0,0.801292407108,1.0,278,206,https://www.flickr.com/photos/x1brett/27164513270,https://creativecommons.org/licenses/by/2.0/,brett jordan,https://www.flickr.com/people/x1brett/\n7718bb25eee9c53b,https://c1.staticflickr.com/1/517/31708975603_dc3144215c_o.jpg,0.4375,0.0,1.0,0.75,920,256,https://www.flickr.com/photos/rubenholthuijsen/31708975603/,https://creativecommons.org/licenses/by/2.0/,Ruben Holthuijsen,https://www.flickr.com/people/rubenholthuijsen/\n5f22e9e4a74037e4,https://c1.staticflickr.com/1/272/32613292486_60295cc144_o.jpg,0.0,0.25,0.5625,1.0,469,472,https://www.flickr.com/photos/27665395@N05/32613292486,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nc638b72e6ce89197,https://c1.staticflickr.com/9/8729/28279072642_28eb614c5d_o.jpg,0.25,0.25,0.75,1.0,976,52,https://www.flickr.com/photos/o_0/28279072642,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\nf68a12cb3aa6a4d0,https://c1.staticflickr.com/8/7775/26907330006_e4a35b75e8_o.jpg,0.0,0.288370253165,0.75,0.865110759494,671,351,https://www.flickr.com/photos/autohistorian/26907330006,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n3aa1b2978bded6a7,https://c1.staticflickr.com/9/8146/29818027015_467741f105_o.jpg,0.28125,0.25,0.84375,1.0,986,521,https://www.flickr.com/photos/104342908@N08/29818027015/,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/\nef1dc595bac111ff,https://c1.staticflickr.com/9/8406/29078738015_7b408ea619_o.jpg,0.281690140845,0.25,0.845070422535,1.0,303,825,https://www.flickr.com/photos/treegrow/29078738015,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\ndbc0d5aaf91e0c64,https://c1.staticflickr.com/6/5606/31008852875_6ae0ec6dc7_o.jpg,0.5,0.0,1.0,0.75,973,599,https://www.flickr.com/photos/visitelpaso/31008852875/,https://creativecommons.org/licenses/by/2.0/,Visit El Paso,https://www.flickr.com/people/visitelpaso/\n026e6fc090ca1e0b,https://c1.staticflickr.com/9/8309/29264595430_fba4d7f333_o.jpg,0.686697782964,0.0,1.0,0.75,780,512,https://www.flickr.com/photos/thoseguys119/29264595430,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nd173abdca8d08e00,https://c1.staticflickr.com/9/8534/29200329383_1b7e226913_o.jpg,0.5,0.25,1.0,1.0,611,473,https://www.flickr.com/photos/yourbestdigs/29200329383,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\n8f6cf070856bd7fd,https://c1.staticflickr.com/9/8716/28386662866_1544cfdac6_o.jpg,0.28125,0.25,0.84375,1.0,875,657,https://www.flickr.com/photos/didbygraham/28386662866,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n7c0b2866ef0111dd,https://c1.staticflickr.com/9/8627/28583418351_ce244c8e22_o.jpg,0.0,0.373762376238,0.75,1.0,561,868,https://www.flickr.com/photos/93558439@N05/28583418351,https://creativecommons.org/licenses/by/2.0/,Thomson20192,https://www.flickr.com/people/93558439@N05/\nd9c4a9500e3d8a1f,https://c1.staticflickr.com/9/8866/28517613676_29a4c9c2b8_o.jpg,0.0,0.0,1.0,0.75,975,757,https://www.flickr.com/photos/jsjgeology/28517613676,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n9d43792b9cdefba9,https://c1.staticflickr.com/9/8441/28707482333_923e0a3972_o.jpg,0.438430311231,0.0,1.0,1.0,145,557,https://www.flickr.com/photos/blachswan/28707482333/,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\n14f438bee9415e72,https://c1.staticflickr.com/9/8699/27675685924_a8345b9c38_o.jpg,0.0,0.5,0.75,1.0,563,529,https://www.flickr.com/photos/22711505@N05/27675685924,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n49882677346dd240,https://c1.staticflickr.com/9/8746/29581944051_82b0f49f83_o.jpg,0.174055829228,0.0,1.0,1.0,507,227,https://www.flickr.com/photos/7412up/29581944051,https://creativecommons.org/licenses/by/2.0/,Willy DURCZOK,https://www.flickr.com/people/7412up/\n8f02e12af18cd746,https://c1.staticflickr.com/9/8275/30047996471_4bbea54036_o.jpg,0.0,0.0,0.75,0.423337856174,650,500,https://www.flickr.com/photos/ben_salter/30047996471,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/\n572b040f23142076,https://c1.staticflickr.com/8/7559/27007892725_18f57823c3_o.jpg,0.0,0.0,0.5,0.75,782,835,https://www.flickr.com/photos/mwlguide/27007892725,https://creativecommons.org/licenses/by/2.0/,Joel Dinda,https://www.flickr.com/people/mwlguide/\n51b0114ef80b939c,https://c1.staticflickr.com/9/8701/29004111174_3361a7f5fe_o.jpg,0.0,0.25,0.75,1.0,204,168,https://www.flickr.com/photos/55229469@N07/29004111174,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\nb324159c2ca6d42c,https://c1.staticflickr.com/9/8022/29664260621_9bc4b9cde0_o.jpg,0.0,0.0,0.902229845626,1.0,115,768,https://www.flickr.com/photos/132326394@N07/29664260621/,https://creativecommons.org/licenses/by/2.0/,Stephan,https://www.flickr.com/people/132326394@N07/\n24f4e16bde01097f,https://c1.staticflickr.com/9/8272/28809310943_d466679ab4_o.jpg,0.0,0.25,0.603155339806,1.0,982,784,https://www.flickr.com/photos/dok1/28809310943,https://creativecommons.org/licenses/by/2.0/,Don O&#x27;Brien,https://www.flickr.com/people/dok1/\nee5329d0690f640a,https://c1.staticflickr.com/8/7311/27284976195_ca37bd4b11_o.jpg,0.0,0.25,0.75,1.0,9,104,https://www.flickr.com/photos/28457235@N04/27284976195/,https://creativecommons.org/licenses/by/2.0/,buecker,https://www.flickr.com/people/28457235@N04/\n5bd18fcd1ee84013,https://c1.staticflickr.com/6/5609/31656687831_fc021bec7b_o.jpg,0.28125,0.0,0.84375,0.75,556,72,https://www.flickr.com/photos/27665395@N05/31656687831,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nc0a4e548b5cbd6e1,https://c1.staticflickr.com/1/611/31614904655_d543a34242_o.jpg,0.276497695853,0.0,1.0,1.0,821,751,https://flickr.com/38986305@N06/31614904655,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/\nc93988167288033f,https://c1.staticflickr.com/9/8460/28246028704_fec9717a5a_o.jpg,0.0,0.0,0.5,0.75,982,840,https://www.flickr.com/photos/mindahaas/28246028704/,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/\n951bce0c4f695dc1,https://c1.staticflickr.com/6/5071/30118811365_e360845f73_o.jpg,0.0,0.0,0.489416058394,0.75,780,488,https://www.flickr.com/photos/thoseguys119/30118811365,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n7c4b8ad60f369c61,https://c1.staticflickr.com/9/8679/29999251375_b8c42f3c01_o.jpg,0.0,0.25,0.582802547771,1.0,982,656,https://www.flickr.com/photos/apardavila/29999251375,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\ne85a1abe87f1efef,https://c1.staticflickr.com/8/7326/28030562162_fab7bcb3f9_o.jpg,0.28125,0.25,0.84375,1.0,85,486,https://www.flickr.com/photos/guldem/28030562162,https://creativecommons.org/licenses/by/2.0/,G\\303\\274ldem \\303\\234st\\303\\274n,https://www.flickr.com/people/guldem/\na4e53a643cbd27a3,https://c1.staticflickr.com/1/291/32013237824_0987df33b6_o.jpg,0.25,0.0,1.0,1.0,418,193,http://www.flickr.com/photos/31424626@N05/32013237824,https://creativecommons.org/licenses/by/2.0/,Pulencio,https://www.flickr.com/people/pulencio/\n29596c93e9d20f40,https://c1.staticflickr.com/9/8768/29998682832_0521c6b6ae_o.jpg,0.246522693997,0.0,0.739568081991,0.75,561,721,https://flickr.com/41431665@N07/29998682832,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\n3c0ce2f15437d6c9,https://c1.staticflickr.com/8/7352/26796257841_a90a5aa6ac_o.jpg,0.25,0.0,0.75,0.75,820,612,https://www.flickr.com/photos/jus10h/26796257841,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n7bf4d177631cf983,https://c1.staticflickr.com/9/8182/28538329426_a497d4e708_o.jpg,0.502717391304,0.0,0.837862318841,0.75,459,614,https://www.flickr.com/photos/22711505@N05/28538329426,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\ne711ce39b5009cf4,https://c1.staticflickr.com/9/8058/29568056736_9e3da92729_o.jpg,0.423337856174,0.0,0.846675712347,0.75,392,308,https://www.flickr.com/photos/piawaugh/29568056736,https://creativecommons.org/licenses/by/2.0/,Pia Waugh,https://www.flickr.com/people/piawaugh/\n2b57b90a06780ecf,https://c1.staticflickr.com/8/7538/29654217532_65a85d9c27_o.jpg,0.0,0.498153618907,0.75,1.0,498,257,https://www.flickr.com/photos/eltb/29654217532,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n46e99e55efdb3083,https://c1.staticflickr.com/9/8321/29562817746_1f7eaee38a_o.jpg,0.0,0.25,0.531155015198,1.0,887,2,https://www.flickr.com/photos/29233640@N07/29562817746,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/\nf5eb74676e173342,https://c1.staticflickr.com/9/8112/29617355311_7cd599a5f6_o.jpg,0.443623639191,0.25,1.0,1.0,719,773,https://www.flickr.com/photos/pleia2/29617355311,https://creativecommons.org/licenses/by/2.0/,Elizabeth K. Joseph,https://www.flickr.com/people/pleia2/\nef70097e4f402ac3,https://c1.staticflickr.com/9/8083/29752159901_e17f85b1ce_o.jpg,0.0,0.25,0.5,1.0,566,359,https://www.flickr.com/photos/mypubliclands/29752159901,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n988eb07ca03b06cc,https://c1.staticflickr.com/8/7189/27204192715_a6943be9b0_o.jpg,0.0,0.0,0.666666666667,1.0,780,123,https://www.flickr.com/photos/zionfiction/27204192715,https://creativecommons.org/licenses/by/2.0/,r. nial bradshaw,https://www.flickr.com/people/zionfiction/\ndc521698f8d5d546,https://c1.staticflickr.com/1/697/32525816761_0bf08c3a6f_o.jpg,0.0,0.25,0.5,1.0,324,850,https://www.flickr.com/photos/usfwsmidwest/32525816761,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\nce2facd2fb6d0cbe,https://c1.staticflickr.com/9/8396/29014536013_b1f475ea94_o.jpg,0.25,0.25,1.0,1.0,305,606,https://www.flickr.com/photos/50066720@N03/29014536013/,https://creativecommons.org/licenses/by/2.0/,Beckie,https://www.flickr.com/people/50066720@N03/\nf35e452f8f9b7634,https://c1.staticflickr.com/9/8736/29911442362_33e4f77cba_o.jpg,0.0,0.0,0.599757673667,0.75,459,22,https://www.flickr.com/photos/larry1732/29911442362,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/\n0cb2a9ff095c5860,https://c1.staticflickr.com/6/5473/30527611383_9ac469c186_o.jpg,0.28125,0.0,0.84375,0.75,986,199,https://www.flickr.com/photos/rusty_clark/30527611383/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\nfc4e917f0f1837f6,https://c1.staticflickr.com/8/7220/27180681395_9846dc50a6_o.jpg,0.248713235294,0.0,0.746139705882,0.75,404,867,https://www.flickr.com/photos/rpavich/27180681395,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/\na845c7f368219a16,https://c1.staticflickr.com/9/8477/28887424350_99cbc4f819_o.jpg,0.0,0.4375,0.75,1.0,674,934,https://www.flickr.com/photos/knightbaron/28887424350,https://creativecommons.org/licenses/by/2.0/,KniBaron,https://www.flickr.com/people/knightbaron/\nb9ab42ddbc891f7f,https://c1.staticflickr.com/9/8857/28630284570_f0b18f7830_o.jpg,0.333333333333,0.0,1.0,1.0,548,977,https://www.flickr.com/photos/92854252@N04/28630284570/,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/\n4e214d74a13e7eae,https://c1.staticflickr.com/6/5514/29964707093_4069dc0406_o.jpg,0.334315169367,0.0,1.0,1.0,682,809,https://www.flickr.com/photos/143842337@N03/29964707093/,https://creativecommons.org/licenses/by/2.0/,ThoroughlyReviewed,https://www.flickr.com/people/143842337@N03/\nc9bc0f6afe6a7397,https://c1.staticflickr.com/1/310/31843640285_6e6419cab7_o.jpg,0.0,0.0,1.0,1.0,921,525,https://flickr.com/53301297@N00/31843640285,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n983d11a0ab98007a,https://c1.staticflickr.com/1/404/31566868002_74ed92d09f_o.jpg,0.333333333333,0.0,1.0,1.0,820,473,https://www.flickr.com/photos/stevendepolo/31566868002,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nc22a761ff780a7f0,https://c1.staticflickr.com/9/8759/28310969426_0b21dbb63b_o.jpg,0.0,0.0,0.5,0.75,519,572,https://www.flickr.com/photos/box_repsol/28310969426,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n98a6f4ca43bc13d8,https://c1.staticflickr.com/1/267/32373055602_7ed2c91657_o.jpg,0.284741144414,0.0,0.854223433243,1.0,982,256,https://www.flickr.com/photos/22711505@N05/32373055602,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\nf215eddb3c35e1c8,https://c1.staticflickr.com/1/412/31746318483_f3374e67f5_o.jpg,0.267938931298,0.25,0.803816793893,1.0,971,121,https://www.flickr.com/photos/ruthanddave/31746318483,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\nae474c518dd0dcdd,https://c1.staticflickr.com/6/5448/29903549963_376cce3e8b_o.jpg,0.400242326333,0.25,1.0,1.0,310,392,https://www.flickr.com/photos/theocrazzolara/29903549963/,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/\n8cbd9f1413c5b039,https://c1.staticflickr.com/9/8034/29093793354_e84e286e23_o.jpg,0.578822733424,0.25,1.0,1.0,950,128,https://www.flickr.com/photos/danielmee/29093793354,https://creativecommons.org/licenses/by/2.0/,Daniel Mee,https://www.flickr.com/people/danielmee/\ndd1b335e88e70f22,https://c1.staticflickr.com/8/7391/27537501975_370bb62227_o.jpg,0.0,0.0,0.666666666667,1.0,422,677,https://www.flickr.com/photos/26126239@N02/27537501975,https://creativecommons.org/licenses/by/2.0/,University of Exeter,https://www.flickr.com/people/26126239@N02/\na7e0d42195468ac5,https://c1.staticflickr.com/6/5616/29787279544_52c0555219_o.jpg,0.0,0.0,0.659824046921,1.0,563,335,http://www.flickr.com/photos/photatojonez/29787279544/,https://creativecommons.org/licenses/by/2.0/,Alexander Day,https://www.flickr.com/people/photatojonez/\n5179dc051c3bfe3a,https://c1.staticflickr.com/8/7639/27610972275_4d282976fb_o.jpg,0.0,0.0,0.45,0.75,407,591,https://www.flickr.com/photos/eltb/27610972275/,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n93efb4997382472c,https://c1.staticflickr.com/9/8294/27944274244_3b3e9a10d8_o.jpg,0.0,0.0,1.0,0.666666666667,438,452,https://www.flickr.com/photos/65047661@N00/27944274244/,https://creativecommons.org/licenses/by/2.0/,Jim  Lukach,https://www.flickr.com/people/65047661@N00/\n87fc376a83ebd215,https://c1.staticflickr.com/8/7360/26964787593_0f9162686b_o.jpg,0.4375,0.0,1.0,0.75,563,250,https://www.flickr.com/photos/pamelav/26964787593/,https://creativecommons.org/licenses/by/2.0/,Pamela V White,https://www.flickr.com/people/pamelav/\n4500f4b29dc9f203,https://c1.staticflickr.com/9/8557/30330380866_4a764893d4_o.jpg,0.25,0.25,0.75,1.0,830,283,https://www.flickr.com/photos/albertlugosi/30330380866,https://creativecommons.org/licenses/by/2.0/,Albert Lugosi,https://www.flickr.com/people/albertlugosi/\n06669fa0ad76ffea,https://c1.staticflickr.com/1/481/31138282364_b51d629652_o.jpg,0.257672155689,0.0,0.773016467066,0.75,704,546,https://www.flickr.com/photos/thomasleuthard/31138282364,https://creativecommons.org/licenses/by/2.0/,Thomas Leuthard,https://www.flickr.com/people/thomasleuthard/\ndda50547c2ac694c,https://c1.staticflickr.com/9/8327/29862585196_4841911fb1_o.jpg,0.578822733424,0.0,1.0,0.75,669,677,https://www.flickr.com/photos/ankurp/29862585196,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\na68e035407c80913,https://c1.staticflickr.com/6/5666/30775836001_f9005f424d_o.jpg,0.249631811487,0.25,0.748895434462,1.0,868,673,https://www.flickr.com/photos/76969036@N02/30775836001,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n4a20523c00280ebd,https://c1.staticflickr.com/8/7417/27116983063_e1a6a9fde4_o.jpg,0.285496183206,0.0,1.0,1.0,404,613,https://www.flickr.com/photos/usnavy/27116983063,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\ne124ddb2933ce3ee,https://c1.staticflickr.com/9/8117/28691120934_a08d2237c3_o.jpg,0.0,0.0,1.0,0.799676898223,983,737,https://www.flickr.com/photos/slgc/28691120934/,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\ne9dc79b4d9a5c072,https://c1.staticflickr.com/6/5783/30558121892_8bf40d1285_o.jpg,0.221875,0.0,0.665625,0.75,896,339,https://www.flickr.com/photos/hisgett/30558121892,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\nc871806d605af637,https://c1.staticflickr.com/9/8668/28210661206_7b5ef3d50a_o.jpg,0.25,0.25,0.75,1.0,909,767,https://www.flickr.com/photos/fun_flying/28210661206,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/\n1cacc4349406aec3,https://c1.staticflickr.com/9/8726/28598627761_4926bb04be_o.jpg,0.0,0.0,1.0,0.663235294118,644,891,https://flickr.com/13589279@N05/28598627761,https://creativecommons.org/licenses/by/2.0/,Mike Ball,https://www.flickr.com/people/massmarrier/\nd43da544939a9bfe,https://c1.staticflickr.com/8/7388/27808730486_eb4117376f_o.jpg,0.229343220339,0.25,0.688029661017,1.0,896,118,https://www.flickr.com/photos/8269539@N04/27808730486,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\nc96a5e1a54678fb7,https://c1.staticflickr.com/8/7041/27645775162_9999ebb2a4_o.jpg,0.25,0.25,0.75,1.0,673,656,https://www.flickr.com/photos/o_0/27645775162/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n18ba2b80fe7712bc,https://c1.staticflickr.com/9/8461/29005856964_ffa218e727_o.jpg,0.163739669421,0.0,0.491219008264,1.0,719,663,https://www.flickr.com/photos/132033298@N04/29005856964,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/\n87491fb1d2363b4d,https://c1.staticflickr.com/9/8559/29377748600_5085d378ed_o.jpg,0.0,0.0,0.666666666667,1.0,561,845,https://www.flickr.com/photos/jill_carlson/29377748600/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\nb10b8b771ce0e658,https://c1.staticflickr.com/9/8425/29589785976_89dd2b1462_o.jpg,0.218793103448,0.0,0.656379310345,0.75,437,987,https://www.flickr.com/photos/autohistorian/29589785976,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n27e0d2d2a445edb5,https://c1.staticflickr.com/6/5668/29806336344_b0a2176d5d_o.jpg,0.0,0.0,0.75,1.0,980,871,https://www.flickr.com/photos/blodgett-esq/29806336344/,https://creativecommons.org/licenses/by/2.0/,blodgett esq.,https://www.flickr.com/people/blodgett-esq/\nd5a5ea0cfb74713d,https://c1.staticflickr.com/8/7438/27056675635_29414ca085_o.jpg,0.0,0.25,0.5,1.0,349,414,https://www.flickr.com/photos/slapers/27056675635,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\n12f5d4d63fd333bb,https://c1.staticflickr.com/9/8554/29650813575_2405152648_o.jpg,0.0,0.0,0.561328125,0.75,336,892,https://www.flickr.com/photos/j_benson/29650813575/,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/\n43a8ba622aeb8907,https://c1.staticflickr.com/6/5620/31453990606_3ecb88a22e_o.jpg,0.25,0.25,0.75,1.0,490,846,https://www.flickr.com/photos/143850343@N06/31453990606/,https://creativecommons.org/licenses/by/2.0/,Sam-H-A,https://www.flickr.com/people/143850343@N06/\n4d2279fbb77d5cf4,https://c1.staticflickr.com/6/5759/29467876023_f2853f0f22_o.jpg,0.498159057437,0.0,0.996318114875,0.75,324,464,http://www.flickr.com/photos/usfwsmtnprairie/29467876023/,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\nd5086d482ee5a6bf,https://c1.staticflickr.com/4/3945/33200171726_d957ed78b5_o.jpg,0.5,0.0,1.0,0.75,98,183,https://www.flickr.com/photos/am1974/33200171726/,https://creativecommons.org/licenses/by/2.0/,Artur Malinowski,https://www.flickr.com/people/am1974/\n689896ca3c110e0f,https://c1.staticflickr.com/9/8525/29413123402_9a615ff9d2_o.jpg,0.25,0.25,0.75,1.0,820,670,https://www.flickr.com/photos/22257051@N07/29413123402,https://creativecommons.org/licenses/by/2.0/,The Come Up Show,https://www.flickr.com/people/thecomeupshow/\nd4d04d53302a46b2,https://c1.staticflickr.com/9/8887/28506001620_2b07ee4987_o.jpg,0.25,0.0,1.0,1.0,964,708,https://www.flickr.com/photos/ruthanddave/28506001620,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n53bf4804c98a319a,https://c1.staticflickr.com/1/255/31828933411_9c77475315_o.jpg,0.25,0.0,0.75,0.75,501,412,https://www.flickr.com/photos/mypubliclands/31828933411/,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\ndfa69d4bbbe98947,https://c1.staticflickr.com/8/7557/26595435894_4b8ea322df_o.jpg,0.5,0.0,1.0,0.75,820,913,https://www.flickr.com/photos/strelka/26595435894/,https://creativecommons.org/licenses/by/2.0/,\"Strelka Institute for Media, Architecture and Design\",https://www.flickr.com/people/strelka/\n0c09c08b079105b3,https://c1.staticflickr.com/6/5618/30525103314_a70fe3b6b3_o.jpg,0.0,0.0,0.75,0.75,498,277,https://flickr.com/53301297@N00/30525103314,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n443e7fabb15790e2,https://c1.staticflickr.com/9/8007/29250761402_9fe25d93dc_o.jpg,0.0,0.0,0.5625,0.75,991,275,https://www.flickr.com/photos/zongo/29250761402/,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n7baabcc2b65fd7b7,https://c1.staticflickr.com/1/736/32900675130_e8bbc5dcc2_o.jpg,0.28125,0.25,0.84375,1.0,672,711,https://www.flickr.com/photos/glorycycles/32900675130/,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\nef7b9df82183a037,https://c1.staticflickr.com/1/688/31497001456_f311722ae1_o.jpg,0.5,0.0,1.0,0.75,820,448,https://www.flickr.com/photos/thejointstaff/31497001456,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/\nde0316f73303fade,https://c1.staticflickr.com/1/316/32388284962_f7c41eb398_o.jpg,0.210588633288,0.25,0.631765899865,1.0,498,988,https://flickr.com/25034321@N05/32388284962,https://creativecommons.org/licenses/by/2.0/,Ninian  Reid,https://www.flickr.com/people/ninian_reid/\nca397965e52fff65,https://c1.staticflickr.com/9/8673/28346652132_b5ac4ba0c9_o.jpg,0.333333333333,0.0,1.0,1.0,484,456,https://www.flickr.com/photos/tipsfortravellers/28346652132,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n0cde76c81018cc8a,https://c1.staticflickr.com/8/7452/27738941746_ea054acda9_o.jpg,0.25,0.25,0.75,1.0,472,779,https://www.flickr.com/photos/historicbremen/27738941746,https://creativecommons.org/licenses/by/2.0/,Historic Bremen,https://www.flickr.com/people/historicbremen/\n3417481b4e7b29c8,https://c1.staticflickr.com/8/7412/27785214572_dbede9aedd_o.jpg,0.0,0.25,0.540644171779,1.0,131,221,https://www.flickr.com/photos/7326810@N08/27785214572,https://creativecommons.org/licenses/by/2.0/,Jean,https://www.flickr.com/people/7326810@N08/\n3d633d0d16ce6adf,https://c1.staticflickr.com/6/5542/31207825101_98cef7e28f_o.jpg,0.0,0.0,0.5,0.75,868,717,https://www.flickr.com/photos/76969036@N02/31207825101/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n740ac1818ddd2348,https://c1.staticflickr.com/9/8134/29141921473_72e41ce8c3_o.jpg,0.0,0.0,0.5,0.75,405,803,https://www.flickr.com/photos/markyharky/29141921473,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\na5d637656f4a402c,https://c1.staticflickr.com/9/8208/28855665554_4605649b37_o.jpg,0.25,0.0,1.0,0.56338028169,318,197,https://www.flickr.com/photos/treegrow/28855665554,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n8cdf83a40ca622f6,https://c1.staticflickr.com/9/8688/27961256813_d07491f87d_o.jpg,0.0,0.25,0.75,1.0,545,425,https://www.flickr.com/photos/discoveroregon/27961256813,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n57f37f94f35eeb62,https://c1.staticflickr.com/9/8063/29238226802_5b612af290_o.jpg,0.25,0.309729064039,1.0,0.929187192118,579,614,https://www.flickr.com/photos/virtualevangelical/29238226802,https://creativecommons.org/licenses/by/2.0/,Evangelical Resident,https://www.flickr.com/people/virtualevangelical/\nc9d0f609d73c3bf8,https://c1.staticflickr.com/8/7512/26874346542_8ae0c4d6c1_o.jpg,0.0,0.0,0.5,0.75,781,842,https://www.flickr.com/photos/glynlowe/26874346542,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/\naba052815b5f1a17,https://c1.staticflickr.com/9/8764/28710173280_ce0dc92a48_o.jpg,0.5,0.0,1.0,0.75,820,879,https://www.flickr.com/photos/strelka/28710173280,https://creativecommons.org/licenses/by/2.0/,\"Strelka Institute for Media, Architecture and Design\",https://www.flickr.com/people/strelka/\n890b26283b4a858c,https://c1.staticflickr.com/8/7701/26844058190_90ba77e647_o.jpg,0.0,0.0,1.0,0.75,459,733,https://www.flickr.com/photos/24701549@N07/26844058190,https://creativecommons.org/licenses/by/2.0/,Spudgun67,https://www.flickr.com/people/24701549@N07/\n844b5a20a81b2881,https://c1.staticflickr.com/9/8519/28890651640_02dfab407b_o.jpg,0.25,0.25,1.0,1.0,832,806,https://www.flickr.com/photos/danielguenther/28890651640,https://creativecommons.org/licenses/by/2.0/,Daniel G\\303\\274nther,https://www.flickr.com/people/danielguenther/\n28236da104ddeace,https://c1.staticflickr.com/6/5634/30535509572_f40049c872_o.jpg,0.0,0.25,0.599757673667,1.0,709,537,https://flickr.com/15802578@N00/30535509572,https://creativecommons.org/licenses/by/2.0/,Billie Grace Ward,https://www.flickr.com/people/wwward0/\n7f84a1fe9c7d2ae8,https://c1.staticflickr.com/9/8194/28071424683_a8912a7b6c_o.jpg,0.0,0.0,0.547453703704,0.75,476,591,https://www.flickr.com/photos/29233640@N07/28071424683,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/\n9d396037f03bddf2,https://c1.staticflickr.com/3/2407/32640699590_c3c3e934a8_o.jpg,0.437669376694,0.0,1.0,1.0,518,47,http://www.flickr.com/photos/143272442@N02/32640699590/,https://creativecommons.org/licenses/by/2.0/,Construction Sites Berlin,https://www.flickr.com/people/143272442@N02/\n3ab4a736681fc8a9,https://c1.staticflickr.com/6/5513/30942759646_16b442608a_o.jpg,0.0,0.25,0.5,1.0,763,939,https://www.flickr.com/photos/39551170@N02/30942759646/,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/\n017493c1cddc040c,https://c1.staticflickr.com/8/7507/27604565336_6ca7588675_o.jpg,0.438671875,0.25,1.0,1.0,309,378,https://www.flickr.com/photos/treegrow/27604565336/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nc2c9e2236b83f70e,https://c1.staticflickr.com/6/5681/30404602451_bfd8c45a9c_o.jpg,0.0,0.0,0.5,0.75,947,804,https://flickr.com/38315261@N00/30404602451,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\n453841c49a5bff89,https://c1.staticflickr.com/6/5706/30302309300_7be19c61cc_o.jpg,0.25,0.0,0.75,0.75,405,627,https://www.flickr.com/photos/ajmexico/30302309300,https://creativecommons.org/licenses/by/2.0/,ajmexico,https://www.flickr.com/people/ajmexico/\nc779b0c309843dfa,https://c1.staticflickr.com/3/2310/32064915793_b9711fc6fc_o.jpg,0.0,0.0,0.665684830633,1.0,820,795,https://www.flickr.com/photos/26126239@N02/32064915793/,https://creativecommons.org/licenses/by/2.0/,University of Exeter,https://www.flickr.com/people/26126239@N02/\n39efdad3eeaf6fb8,https://c1.staticflickr.com/9/8582/29272491315_9f71ca38e6_o.jpg,0.0,0.25,0.75,1.0,743,477,https://www.flickr.com/photos/rocketboom/29272491315/,https://creativecommons.org/licenses/by/2.0/,SupportPDX,https://www.flickr.com/people/rocketboom/\n2ed100c942fe2248,https://c1.staticflickr.com/8/7284/27257527010_a6a8e17b5b_o.jpg,0.528969957082,0.25,1.0,1.0,604,90,https://www.flickr.com/photos/13476480@N07/27257527010,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nd26f130d5a268561,https://c1.staticflickr.com/6/5523/31037422572_8fa7754e07_o.jpg,0.0,0.0,1.0,0.75,973,886,https://www.flickr.com/photos/jsjgeology/31037422572,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nff756131d3d9147a,https://c1.staticflickr.com/8/7643/26266186204_9ec36f92b3_o.jpg,0.0,0.0,0.561328125,0.75,518,916,https://www.flickr.com/photos/southbeachcars/26266186204,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n17f53e22052ac67c,https://c1.staticflickr.com/9/8102/29111683795_304e1c3c8b_o.jpg,0.25,0.0,1.0,0.75,986,899,https://www.flickr.com/photos/mig/29111683795/,https://creativecommons.org/licenses/by/2.0/,miguelb,https://www.flickr.com/people/mig/\n67d78d51e2bc102b,https://c1.staticflickr.com/9/8804/27707452174_96f0a4ae7d_o.jpg,0.4375,0.25,1.0,1.0,501,898,https://www.flickr.com/photos/woodhead/27707452174,https://creativecommons.org/licenses/by/2.0/,jasonwoodhead23,https://www.flickr.com/people/woodhead/\n7503a5e845fe6d07,https://c1.staticflickr.com/3/2250/32671579282_15d92f153e_o.jpg,0.25,0.4375,1.0,1.0,885,399,https://www.flickr.com/photos/143957286@N05/32671579282,https://creativecommons.org/licenses/by/2.0/,whitehart1882,https://www.flickr.com/people/143957286@N05/\n6464ad4ab696bb37,https://c1.staticflickr.com/8/7754/26923036940_fb945952e3_o.jpg,0.286277602524,0.25,0.858832807571,1.0,499,497,https://www.flickr.com/photos/r00s/26923036940,https://creativecommons.org/licenses/by/2.0/,Ro\\315\\254\\315\\254\\315\\240\\315\\240\\315\\241\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240s\\315\\254\\315\\254\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240a\\315\\254\\315\\254\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240 Menkman,https://www.flickr.com/people/r00s/\n0a124a5df3a82bef,https://c1.staticflickr.com/9/8187/29948376721_cf0e6f2f46_o.jpg,0.578822733424,0.0,1.0,0.75,761,529,http://www.flickr.com/photos/10787737@N02/29948376721,https://creativecommons.org/licenses/by/2.0/,osseous,https://www.flickr.com/people/osseous/\n0753e78ac4f70e23,https://c1.staticflickr.com/1/773/31492219294_68f9fa100b_o.jpg,0.0,0.0,0.5625,0.75,459,237,https://www.flickr.com/photos/alper/31492219294,https://creativecommons.org/licenses/by/2.0/,Alper \\303\\207u\\304\\237un,https://www.flickr.com/people/alper/\n626c9d5889b7d80a,https://c1.staticflickr.com/6/5619/30581230662_a9c76311d5_o.jpg,0.4375,0.0,1.0,0.75,608,772,https://flickr.com/30095562@N07/30581230662,https://creativecommons.org/licenses/by/2.0/,John Kwasnik,https://www.flickr.com/people/kwaspix/\n05fab9918f05816d,https://c1.staticflickr.com/9/8571/28680878580_6328252f79_o.jpg,0.25,0.25,0.75,1.0,95,383,https://flickr.com/49048066@N06/28680878580,https://creativecommons.org/licenses/by/2.0/,Ben  Cappellacci,https://www.flickr.com/people/cappellacci/\n2e3a1a1c440751e1,https://c1.staticflickr.com/8/7320/26339862564_4351c0a692_o.jpg,0.333333333333,0.0,1.0,1.0,405,463,https://www.flickr.com/photos/km30192002/26339862564/,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/\na4d9f51a15d63047,https://c1.staticflickr.com/9/8576/28542048560_5b03b26494_o.jpg,0.0,0.28125,0.75,0.84375,709,231,https://www.flickr.com/photos/igcameron/28542048560,https://creativecommons.org/licenses/by/2.0/,Iain Cameron,https://www.flickr.com/people/igcameron/\nb13bcb7c709c2ddd,https://c1.staticflickr.com/8/7530/27212290393_143ec85902_o.jpg,0.332842415317,0.0,0.99852724595,1.0,896,773,https://www.flickr.com/photos/621crw/27212290393/,https://creativecommons.org/licenses/by/2.0/,The 621st Contingency Response Wing,https://www.flickr.com/people/621crw/\nf74d64067624d5bb,https://c1.staticflickr.com/8/7306/27296283963_dc2fe99540_o.jpg,0.0,0.0,0.75,0.379820051414,309,519,https://www.flickr.com/photos/jsjgeology/27296283963,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n055ec88618acdd58,https://c1.staticflickr.com/1/548/31407189214_697f508033_o.jpg,0.0,0.0,0.495594713656,0.75,317,766,https://www.flickr.com/photos/aotaro/31407189214/,https://creativecommons.org/licenses/by/2.0/,aotaro,https://www.flickr.com/people/aotaro/\ncf7467de061473b6,https://c1.staticflickr.com/6/5657/30718191926_5f42889592_o.jpg,0.421177266576,0.0,0.842354533153,0.75,377,198,https://www.flickr.com/photos/lwpkommunikacio/30718191926,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\n9c858a860598df4c,https://c1.staticflickr.com/9/8513/29146876133_b8cbb04c92_o.jpg,0.5,0.0,1.0,0.75,437,745,https://www.flickr.com/photos/8782469@N05/29146876133,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/\n5c5fc3d9b7efea58,https://c1.staticflickr.com/6/5478/30459045624_3ce3b52357_o.jpg,0.333333333333,0.0,1.0,1.0,763,265,https://www.flickr.com/photos/schaerer/30459045624/,https://creativecommons.org/licenses/by/2.0/,Walter Sch\\303\\244rer,https://www.flickr.com/people/schaerer/\n1516c3ab0faeafd9,https://c1.staticflickr.com/8/7326/27533046715_1394b5bc6b_o.jpg,0.0,0.306985294118,0.75,0.920955882353,864,772,https://flickr.com/56846157@N00/27533046715,https://creativecommons.org/licenses/by/2.0/,Christine Rondeau,https://www.flickr.com/people/crondeau/\n3118557a12e2bd94,https://c1.staticflickr.com/9/8389/29115169316_dafc478c46_o.jpg,0.0,0.25,0.561328125,1.0,323,145,https://www.flickr.com/photos/tamakisono/29115169316/,https://creativecommons.org/licenses/by/2.0/,Tamaki Sono,https://www.flickr.com/people/tamakisono/\na6cca368f8e25813,https://c1.staticflickr.com/8/7562/27130656106_5ec4c0ede3_o.jpg,0.486342042755,0.25,0.810570071259,1.0,821,626,https://www.flickr.com/photos/jsjgeology/27130656106,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nf0132a818478b833,https://c1.staticflickr.com/9/8494/29666625972_88506f3a3e_o.jpg,0.0,0.4375,0.75,1.0,336,570,https://www.flickr.com/photos/kirbyurner/29666625972,https://creativecommons.org/licenses/by/2.0/,thekirbster,https://www.flickr.com/people/kirbyurner/\n926c676a37c8d8ca,https://c1.staticflickr.com/6/5661/25292904139_f7c2e0f1b9_o.jpg,0.480130057803,0.0,0.960260115607,0.75,975,138,https://www.flickr.com/photos/jsjgeology/25292904139,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nd1b6dac7fb52ad5d,https://c1.staticflickr.com/8/7389/27083479310_f98e9c0576_o.jpg,0.28125,0.25,0.84375,1.0,19,409,https://www.flickr.com/photos/9750464@N02/27083479310/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\nfc686275c3bc0f3b,https://c1.staticflickr.com/9/8098/29126916735_35b0374261_o.jpg,0.486547085202,0.25,1.0,1.0,547,451,https://www.flickr.com/photos/100739735@N06/29126916735,https://creativecommons.org/licenses/by/2.0/,interestedbystandr,https://www.flickr.com/people/100739735@N06/\ne1b42783d8a2dbf8,https://c1.staticflickr.com/9/8751/28302703740_95ea3b0b62_o.jpg,0.4375,0.0,1.0,0.75,908,731,https://www.flickr.com/photos/infrogmation/28302703740/,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/\n633fae7955650839,https://c1.staticflickr.com/6/5509/30424624871_c06338a730_o.jpg,0.499263622975,0.25,0.99852724595,1.0,888,609,https://www.flickr.com/photos/sejmrp/30424624871,https://creativecommons.org/licenses/by/2.0/,Sejm RP,https://www.flickr.com/people/sejmrp/\nbada76e1ab67db63,https://c1.staticflickr.com/6/5542/29875060053_7e7b3623a6_o.jpg,0.0,0.25,0.5,1.0,128,387,https://www.flickr.com/photos/erikstarck/29875060053/,https://creativecommons.org/licenses/by/2.0/,Erik Starck,https://www.flickr.com/people/erikstarck/\nef6c65ef4f5a3c56,https://c1.staticflickr.com/9/8373/29079548625_8cf25e9493_o.jpg,0.421177266576,0.0,0.842354533153,0.75,984,862,https://www.flickr.com/photos/20940650@N07/29079548625/,https://creativecommons.org/licenses/by/2.0/,Geoffrey Rhodes,https://www.flickr.com/people/20940650@N07/\n7831e44f93fe1cbf,https://c1.staticflickr.com/8/7305/27300069633_32166c7d5f_o.jpg,0.256726457399,0.25,0.770179372197,1.0,896,60,https://www.flickr.com/photos/13476480@N07/27300069633,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n6b1332a380406e89,https://c1.staticflickr.com/9/8502/28061592184_06543fbc7c_o.jpg,0.0,0.0,0.666666666667,1.0,706,439,https://www.flickr.com/photos/kecko/28061592184,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\n4686fea497a61d5c,https://c1.staticflickr.com/9/8199/28782720594_60612b74a9_o.jpg,0.5,0.25,1.0,1.0,792,620,https://www.flickr.com/photos/polycart/28782720594,https://creativecommons.org/licenses/by/2.0/,Polycart,https://www.flickr.com/people/polycart/\n448a2fb878795f1d,https://c1.staticflickr.com/9/8475/29142060953_5dbe9820d5_o.jpg,0.0,0.0,0.630794701987,0.75,75,492,https://www.flickr.com/photos/gails_pictures/29142060953,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n4461c08e0e8ccad3,https://c1.staticflickr.com/6/5656/30272310723_13dbcba3b3_o.jpg,0.0,0.25,0.5625,1.0,780,680,https://www.flickr.com/photos/thoseguys119/30272310723,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n34f7e556b2e503ff,https://c1.staticflickr.com/9/8693/29522683966_6a50b8c7fa_o.jpg,0.0,0.25,0.75,1.0,931,137,https://www.flickr.com/photos/sixteenmilesofstring/29522683966,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/\n5f68620e03d4a9f6,https://c1.staticflickr.com/6/5806/29977292885_6f49cac547_o.jpg,0.371487603306,0.0,1.0,0.75,973,395,https://flickr.com/75735834@N06/29977292885,https://creativecommons.org/licenses/by/2.0/,Feroze Omardeen,https://www.flickr.com/people/sucriertt/\n347407d25c526f99,https://c1.staticflickr.com/9/8286/29403773790_642354d373_o.jpg,0.0,0.0,0.75,1.0,481,581,https://flickr.com/39160147@N03/29403773790,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n0ac190e8667c3b55,https://c1.staticflickr.com/1/306/31693050754_b02c812664_o.jpg,0.0,0.0,0.75,1.0,672,578,https://flickr.com/48968648@N05/31693050754,https://creativecommons.org/licenses/by/2.0/,Carl,https://www.flickr.com/people/c4s9/\nc5dfe8bb702a0e3a,https://c1.staticflickr.com/9/8295/28549716853_25e6db8c9d_o.jpg,0.25,0.25,1.0,1.0,142,294,https://www.flickr.com/photos/16502322@N03/28549716853,https://creativecommons.org/licenses/by/2.0/,fishhawk,https://www.flickr.com/people/16502322@N03/\n2140e9cfa6ca42c3,https://c1.staticflickr.com/1/347/32458889151_9aeff8c991_o.jpg,0.254054054054,0.25,1.0,1.0,848,340,https://www.flickr.com/photos/13476480@N07/32458889151,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nb92c426bcdf4e43d,https://c1.staticflickr.com/6/5531/30516404614_f9bd18f172_o.jpg,0.25,0.0,0.75,0.75,309,759,https://www.flickr.com/photos/ansk/30516404614,https://creativecommons.org/licenses/by/2.0/,arian.suresh,https://www.flickr.com/people/ansk/\n7ced78d6f882f2cf,https://c1.staticflickr.com/6/5551/30783981132_8507f11e6d_o.jpg,0.5,0.25,1.0,1.0,558,538,https://www.flickr.com/photos/30478819@N08/30783981132,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\nb6881a126290ecd9,https://c1.staticflickr.com/8/7463/28124051314_39f3ba78d1_o.jpg,0.4375,0.0,1.0,0.75,512,151,https://www.flickr.com/photos/daveseven/28124051314,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/\necdd4ee9d7ffc01d,https://c1.staticflickr.com/6/5461/31172403132_0b7f980a4a_o.jpg,0.0,0.25,0.5,1.0,321,159,http://www.flickr.com/photos/146401137@N06/31172403132/,https://creativecommons.org/licenses/by/2.0/,Jin Kemoole,https://www.flickr.com/people/146401137@N06/\n100e0fa0e08f801f,https://c1.staticflickr.com/8/7412/27789216060_a7f864c818_o.jpg,0.0,0.0,0.75,1.0,758,804,https://www.flickr.com/photos/mountainash/27789216060/,https://creativecommons.org/licenses/by/2.0/,Mountain/ \\\\Ash,https://www.flickr.com/people/mountainash/\nd4381dfea17fcfa1,https://c1.staticflickr.com/9/8554/30272108682_199587655a_o.jpg,0.0,0.0,0.5,0.75,976,812,https://www.flickr.com/photos/thomasjhannigan/30272108682,https://creativecommons.org/licenses/by/2.0/,Tom Hannigan,https://www.flickr.com/people/thomasjhannigan/\n7b9c901d0f735717,https://c1.staticflickr.com/8/7629/27603236993_c76b0c841d_o.jpg,0.25,0.0,1.0,0.715608465608,426,628,https://www.flickr.com/photos/markittleman/27603236993,https://creativecommons.org/licenses/by/2.0/,Mark Ittleman,https://www.flickr.com/people/markittleman/\n40687cd08d42055c,https://c1.staticflickr.com/6/5455/25387649349_7a4824030a_o.jpg,0.5,0.25,1.0,1.0,971,825,https://www.flickr.com/photos/breveglieri/25387649349/,https://creativecommons.org/licenses/by/2.0/,Alexandre Breveglieri,https://www.flickr.com/people/breveglieri/\n45f89ca0408c28b7,https://c1.staticflickr.com/1/468/32732032475_57b3f226c7_o.jpg,0.457373271889,0.0,1.0,0.75,889,222,https://www.flickr.com/photos/victorianorivero/32732032475/,https://creativecommons.org/licenses/by/2.0/,Jose  Losada -  Fotograf\\303\\255a,https://www.flickr.com/people/victorianorivero/\nbba21ec1c7d742be,https://c1.staticflickr.com/8/7783/26687499083_3040d602a7_o.jpg,0.28125,0.25,0.84375,1.0,625,285,https://www.flickr.com/photos/tslac/26687499083,https://creativecommons.org/licenses/by/2.0/,Texas State Library and Archives Commission,https://www.flickr.com/people/tslac/\n84fd99e0b9520145,https://c1.staticflickr.com/9/8127/29213827684_abd1503ae2_o.jpg,0.5,0.25,1.0,1.0,920,894,https://www.flickr.com/photos/blmalaska/29213827684,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Alaska,https://www.flickr.com/people/blmalaska/\nfbd293de35f2feb3,https://c1.staticflickr.com/9/8021/29130998146_d0ec63c0b8_o.jpg,0.197411003236,0.0,1.0,1.0,818,231,https://www.flickr.com/photos/autohistorian/29130998146,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n759e53c9e3f518f8,https://c1.staticflickr.com/6/5756/30631471366_68ac56dc6e_o.jpg,0.0,0.0,0.75,0.5,777,510,https://flickr.com/81179422@N03/30631471366,https://creativecommons.org/licenses/by/2.0/,Delegaci\\303\\263n de Cultura Ayuntamiento de C\\303\\263rdoba,https://www.flickr.com/people/palacio_orive/\n59d001ec50ebdf4d,https://c1.staticflickr.com/8/7644/27336864141_5e93f948a6_o.jpg,0.0,0.0,0.75,1.0,78,444,https://www.flickr.com/photos/treegrow/27336864141/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n5d93f75020b4f99b,https://c1.staticflickr.com/9/8843/28334811186_962a5302ed_o.jpg,0.5,0.0,1.0,0.75,699,632,https://www.flickr.com/photos/bexwalton/28334811186,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/\nb314f385c6c7f89b,https://c1.staticflickr.com/9/8394/28069888523_f5de909c33_o.jpg,0.309309309309,0.0,1.0,1.0,512,277,https://www.flickr.com/photos/greggjerdingen/28069888523,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n9048d5541b108214,https://c1.staticflickr.com/8/7052/27573583621_1462efb9b8_o.jpg,0.0,0.25,0.710456942004,1.0,611,631,https://www.flickr.com/photos/moritzbarcelona/27573583621,https://creativecommons.org/licenses/by/2.0/,Moritz Barcelona,https://www.flickr.com/people/moritzbarcelona/\n405799ea564a8b39,https://c1.staticflickr.com/9/8278/28594471526_ab0aea3d54_o.jpg,0.4375,0.0,1.0,0.75,920,759,https://www.flickr.com/photos/londonmatt/28594471526,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n8898ae162ae23c6d,https://c1.staticflickr.com/6/5751/30092190744_3d2c47d2ec_o.jpg,0.333333333333,0.0,1.0,1.0,950,128,https://www.flickr.com/photos/stevendepolo/30092190744/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n1a399682019bbe29,https://c1.staticflickr.com/1/543/32505258375_4fa0b0dc6f_o.jpg,0.0,0.216,1.0,1.0,653,407,https://flickr.com/93563885@N07/32505258375,https://creativecommons.org/licenses/by/2.0/,Katie Morgan,https://www.flickr.com/people/fergyfamily/\n913ad6048e841a46,https://c1.staticflickr.com/1/437/31763931435_569b376bd2_o.jpg,0.25,0.0,0.75,0.75,320,115,https://www.flickr.com/photos/gails_pictures/31763931435,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n1f529d5c65918c03,https://c1.staticflickr.com/9/8491/29456056695_2cdb7c5fa7_o.jpg,0.23585243553,0.0,0.70755730659,0.75,821,781,https://www.flickr.com/photos/robdammers/29456056695,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\nf79eed22bf1037a8,https://c1.staticflickr.com/6/5591/29972927364_4e8c99c051_o.jpg,0.0,0.25,0.5,1.0,647,970,https://flickr.com/22539273@N00/29972927364,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n580b4d2a2666195e,https://c1.staticflickr.com/6/5582/30641320684_38d716f2ba_o.jpg,0.0,0.0,0.75,1.0,976,147,https://www.flickr.com/photos/gillyberlin/30641320684,https://creativecommons.org/licenses/by/2.0/,GillyBerlin,https://www.flickr.com/people/gillyberlin/\ncfbd849c1d1b753b,https://c1.staticflickr.com/8/7763/28842755226_dd03c6c536_o.jpg,0.499263622975,0.25,0.99852724595,1.0,981,98,https://www.flickr.com/photos/respres/28842755226,https://creativecommons.org/licenses/by/2.0/,Jeff Turner,https://www.flickr.com/people/respres/\na6775224519b8428,https://c1.staticflickr.com/8/7308/28190918831_78b87d36ee_o.jpg,0.28125,0.25,0.84375,1.0,570,426,https://www.flickr.com/photos/27665395@N05/28190918831,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n91ac92c2fe317aa0,https://c1.staticflickr.com/1/451/31465651143_aa49f535ee_o.jpg,0.25,0.0,0.75,0.75,581,604,https://www.flickr.com/photos/55229469@N07/31465651143,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\n037152a42a3d1e8c,https://c1.staticflickr.com/9/8499/28070026824_854ac0ae45_o.jpg,0.333333333333,0.0,1.0,1.0,627,730,https://www.flickr.com/photos/130075348@N08/28070026824/,https://creativecommons.org/licenses/by/2.0/,Rokok Indonesia,https://www.flickr.com/people/130075348@N08/\n2fb53afe7ff66d5f,https://c1.staticflickr.com/1/777/31727059532_c65033b8a1_o.jpg,0.0,0.25,0.5625,1.0,979,847,https://www.flickr.com/photos/bigyahu/31727059532/,https://creativecommons.org/licenses/by/2.0/,alan jones,https://www.flickr.com/people/bigyahu/\ncf473f838f4887d3,https://c1.staticflickr.com/9/8502/29133260452_e926b6a9a2_o.jpg,0.0,0.5,0.75,1.0,309,731,https://www.flickr.com/photos/nikkvalentine/29133260452,https://creativecommons.org/licenses/by/2.0/,The Manic Macrographer,https://www.flickr.com/people/nikkvalentine/\n39fee27ace569b18,https://c1.staticflickr.com/1/759/32239443161_87aa162d08_o.jpg,0.25,0.25,0.75,1.0,699,214,https://www.flickr.com/photos/33200530@N04/32239443161,https://creativecommons.org/licenses/by/2.0/,CucombreLibre,https://www.flickr.com/people/33200530@N04/\nf62087fb9791b8dd,https://c1.staticflickr.com/9/8453/28990629474_0be470c9f2_o.jpg,0.24882629108,0.0,1.0,1.0,537,373,https://www.flickr.com/photos/garryknight/28990629474,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\ne2dbc0a9bbc95aed,https://c1.staticflickr.com/9/8780/28367169592_3fce2df3d9_o.jpg,0.280226209048,0.0,0.840678627145,0.75,986,253,https://www.flickr.com/photos/34517490@N00/28367169592,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/\nb43cfbab3695d213,https://c1.staticflickr.com/9/8519/29262472894_580d0ac88d_o.jpg,0.25,0.0,1.0,0.421177266576,669,124,https://www.flickr.com/photos/ankurp/29262472894,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\n8a7af2232c2d26cc,https://c1.staticflickr.com/6/5795/29663048944_c02e81cf30_o.jpg,0.248713235294,0.0,0.746139705882,0.75,405,151,https://www.flickr.com/photos/n28307/29663048944/,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/\ne9829512f54cd635,https://c1.staticflickr.com/8/7667/28857805962_3ea7a8b73a_o.jpg,0.5,0.0,1.0,0.75,909,579,https://www.flickr.com/photos/elsie/28857805962,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\nf768195642b13968,https://c1.staticflickr.com/9/8581/28329386945_ba5c420fa2_o.jpg,0.0,0.25,0.5,1.0,739,855,https://www.flickr.com/photos/blumenbiene/28329386945,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\n67f778e2fefacbd8,https://c1.staticflickr.com/9/8406/29404881920_ffcfe21bc1_o.jpg,0.478487614081,0.0,1.0,1.0,815,331,https://www.flickr.com/photos/yamahawatercraft/29404881920/,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/\nf91a2d49f4d6f9a2,https://c1.staticflickr.com/6/5496/30228515753_76e15a280c_o.jpg,0.332106038292,0.0,0.996318114875,1.0,753,653,https://www.flickr.com/photos/eaglebrook/30228515753/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/\nc2cc91d7ba25e28a,https://c1.staticflickr.com/6/5458/30999587760_6c067bc21f_o.jpg,0.0,0.24213836478,1.0,1.0,828,17,https://www.flickr.com/photos/enneafive/30999587760,https://creativecommons.org/licenses/by/2.0/,Johan Neven,https://www.flickr.com/people/enneafive/\n12531e9ee03613d3,https://c1.staticflickr.com/1/359/31792912914_79c490e92d_o.jpg,0.4,0.0,1.0,1.0,291,467,https://www.flickr.com/photos/gsloan/31792912914,https://creativecommons.org/licenses/by/2.0/,gsloan,https://www.flickr.com/people/gsloan/\n3c0f5ed4f28e6212,https://c1.staticflickr.com/2/1504/26772116805_353041727b_o.jpg,0.25,0.0,0.75,0.75,669,173,https://www.flickr.com/photos/subherwal/26772116805,https://creativecommons.org/licenses/by/2.0/,subherwal,https://www.flickr.com/people/subherwal/\n27b18726bc432c1d,https://c1.staticflickr.com/1/399/31462815523_ab78b4e4e5_o.jpg,0.248348017621,0.25,0.745044052863,1.0,348,130,https://www.flickr.com/photos/usfwsmtnprairie/31462815523,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n8b6f584e407696a6,https://c1.staticflickr.com/8/7749/29640290475_4d30452f18_o.jpg,0.25,0.0,0.75,0.75,896,768,https://www.flickr.com/photos/markyharky/29640290475,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n9ce5331116cc9cb3,https://c1.staticflickr.com/6/5764/29922947073_b29a3ce3fe_o.jpg,0.0,0.25,0.75,1.0,981,432,https://www.flickr.com/photos/upsticksngo/29922947073,https://creativecommons.org/licenses/by/2.0/,UpSticksNGo Crew,https://www.flickr.com/people/upsticksngo/\n3a8315f3ae8d1363,https://c1.staticflickr.com/1/328/30920568024_32c731b16c_o.jpg,0.0,0.0,0.75,1.0,818,632,https://flickr.com/27665395@N05/30920568024,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\ncb1404889f313767,https://c1.staticflickr.com/9/8199/29991744525_27ae4c9e33_o.jpg,0.332842415317,0.0,0.99852724595,1.0,820,429,https://www.flickr.com/photos/presidenciamx/29991744525,https://creativecommons.org/licenses/by/2.0/,Presidencia de la Rep\\303\\272blica Mexicana,https://www.flickr.com/people/presidenciamx/\n52d821a200a98dff,https://c1.staticflickr.com/8/7650/27729434644_a2220a823c_o.jpg,0.513100436681,0.25,1.0,1.0,778,520,https://www.flickr.com/photos/51764518@N02/27729434644,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n35eeb6f318a262f2,https://c1.staticflickr.com/9/8896/28531140285_f00aee518d_o.jpg,0.25,0.0,0.75,0.75,699,757,https://www.flickr.com/photos/tekgator/28531140285,https://creativecommons.org/licenses/by/2.0/,tekgator,https://www.flickr.com/people/tekgator/\nfe00f11d340ee724,https://c1.staticflickr.com/6/5830/30067794852_dbcd1c2868_o.jpg,0.25,0.0,1.0,1.0,320,782,https://www.flickr.com/photos/treegrow/30067794852,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\ncd5e9cd9e77b00d3,https://c1.staticflickr.com/6/5346/30491356892_0a789b5fc5_o.jpg,0.0,0.0,0.5625,0.75,955,523,https://www.flickr.com/photos/scotnelson/30491356892,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\nb81e7b2bd2324839,https://c1.staticflickr.com/6/5330/30700502256_85115eb646_o.jpg,0.0,0.0,0.498159057437,0.75,752,951,https://www.flickr.com/photos/davehamster/30700502256,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\na6cc984eb9f224e9,https://c1.staticflickr.com/4/3671/33169767981_d2c0c8bd47_o.jpg,0.25,0.0,0.75,0.75,998,341,https://flickr.com/74747209@N05/33169767981,https://creativecommons.org/licenses/by/2.0/,David Lochlin,https://www.flickr.com/people/dlochlin/\nf7eb7acd6fd319cf,https://c1.staticflickr.com/1/767/31803625456_d57721c077_o.jpg,0.0,0.0,0.674229452055,0.75,582,691,https://www.flickr.com/photos/hisgett/31803625456,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n9913bf444efddf01,https://c1.staticflickr.com/8/7010/26831242473_d3118ee1b6_o.jpg,0.0,0.25,0.5625,1.0,310,894,https://www.flickr.com/photos/swallowtailgardenseeds/26831242473,https://creativecommons.org/licenses/by/2.0/,Swallowtail Garden Seeds,https://www.flickr.com/people/swallowtailgardenseeds/\na6444423de78e204,https://c1.staticflickr.com/9/8833/28210662766_5111540a65_o.jpg,0.25,0.0,0.75,0.75,909,516,https://www.flickr.com/photos/fun_flying/28210662766,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/\n4ec091f3c8be00cf,https://c1.staticflickr.com/8/7200/26935330125_5bfb02c79f_o.jpg,0.0,0.0,0.666666666667,1.0,309,673,https://www.flickr.com/photos/dhruvaraj/26935330125,https://creativecommons.org/licenses/by/2.0/,Dhruvaraj S,https://www.flickr.com/people/dhruvaraj/\n9319b63e7c57e9d0,https://c1.staticflickr.com/6/5696/30458008266_ae94a0ce76_o.jpg,0.5,0.25,1.0,1.0,982,988,https://flickr.com/109289138@N06/30458008266,https://creativecommons.org/licenses/by/2.0/,Joburg Cricket Club,https://www.flickr.com/people/joburgcricketclub/\n01dadd6b781ef538,https://c1.staticflickr.com/9/8521/28369844141_41a017a9e3_o.jpg,0.0,0.25,0.5,1.0,702,698,https://www.flickr.com/photos/texaus1/28369844141/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/\na51e82e5aab08fcd,https://c1.staticflickr.com/6/5481/29594227874_02b0391aac_o.jpg,0.28125,0.0,0.84375,0.75,975,166,https://www.flickr.com/photos/jsjgeology/29594227874,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nc58ebfa367444280,https://c1.staticflickr.com/9/8269/30409149395_11819433c0_o.jpg,0.0,0.0,0.510804769001,0.75,735,790,https://www.flickr.com/photos/zongo/30409149395,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n1c111256a89401c8,https://c1.staticflickr.com/1/223/31382314782_13ae7da8fa_o.jpg,0.0,0.0,0.985663082437,1.0,854,197,https://www.flickr.com/photos/13476480@N07/31382314782/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n5e6d42c4437d3ac7,https://c1.staticflickr.com/9/8551/29640334353_65e5a85ba3_o.jpg,0.0,0.25,0.5,1.0,561,775,https://www.flickr.com/photos/116153846@N06/29640334353/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/\n38426929a2c14bc3,https://c1.staticflickr.com/8/7365/27597422241_3f8bfacd5c_o.jpg,0.25,0.0,0.75,0.75,618,132,https://www.flickr.com/photos/ucdaviscoe/27597422241,https://creativecommons.org/licenses/by/2.0/,UC Davis College of Engineering,https://www.flickr.com/people/ucdaviscoe/\n397aa21ee684462f,https://c1.staticflickr.com/8/7738/26741751471_c0a65d9bd7_o.jpg,0.438671875,0.0,1.0,0.75,16,273,https://www.flickr.com/photos/j_benson/26741751471,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/\n43576696015d1cbf,https://c1.staticflickr.com/8/7374/27600935212_9e72834da4_o.jpg,0.0,0.0,0.75,0.5625,980,404,https://www.flickr.com/photos/kitkaphotogirl/27600935212,https://creativecommons.org/licenses/by/2.0/,Christine Majul,https://www.flickr.com/people/kitkaphotogirl/\n8f64cebadc25455f,https://c1.staticflickr.com/8/7255/26967955113_8140440e8f_o.jpg,0.281165311653,0.0,0.843495934959,1.0,42,114,https://www.flickr.com/photos/ddebold/26967955113,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/\n92f332fa278a6388,https://c1.staticflickr.com/3/2465/32760092592_a34aeb2b16_o.jpg,0.0,0.0,0.618442622951,0.75,526,737,http://www.flickr.com/photos/107922203@N04/32760092592,https://creativecommons.org/licenses/by/2.0/,Simon Matzinger,https://www.flickr.com/people/simonmatzinger/\n2fb1551d1372b52b,https://c1.staticflickr.com/9/8443/28525221002_3d17f1374e_o.jpg,0.333333333333,0.0,1.0,1.0,980,20,https://www.flickr.com/photos/trocaire/28525221002,https://creativecommons.org/licenses/by/2.0/,Trocaire,https://www.flickr.com/people/trocaire/\nfd29deb77ba26d26,https://c1.staticflickr.com/9/8353/28762987602_487f07575e_o.jpg,0.5,0.0,1.0,0.75,418,943,https://www.flickr.com/photos/_bundjugend/28762987602,https://creativecommons.org/licenses/by/2.0/,BUNDjugend,https://www.flickr.com/people/_bundjugend/\nae404fb6a6b27926,https://c1.staticflickr.com/8/7342/27033999202_fb59c78264_o.jpg,0.25,0.0,0.75,0.75,976,571,https://www.flickr.com/photos/14320857@N08/27033999202,https://creativecommons.org/licenses/by/2.0/,WIL,https://www.flickr.com/people/14320857@N08/\n6145928c022a5422,https://c1.staticflickr.com/8/7347/27748925642_697198a625_o.jpg,0.332842415317,0.0,0.99852724595,1.0,490,673,https://www.flickr.com/photos/cogdog/27748925642,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nc540dd1411d7fd01,https://c1.staticflickr.com/9/8808/30066479845_893a1e591d_o.jpg,0.333333333333,0.0,1.0,1.0,976,626,https://www.flickr.com/photos/wm_archiv/30066479845/,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/\n6d2661af090cf782,https://c1.staticflickr.com/9/8633/28062798963_58f746d4d8_o.jpg,0.25,0.25,0.75,1.0,821,576,https://www.flickr.com/photos/kecko/28062798963,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\n71bad4ce88086431,https://c1.staticflickr.com/8/7214/26927690554_4f0ab7c6b3_o.jpg,0.0,0.460183767228,0.75,1.0,688,504,https://www.flickr.com/photos/brighton/26927690554,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/\n431f6f8fbf02b996,https://c1.staticflickr.com/8/7455/27440050530_949bc5ff44_o.jpg,0.171913202934,0.0,0.515739608802,0.75,780,483,https://www.flickr.com/photos/thoseguys119/27440050530,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n106c5156d1143156,https://c1.staticflickr.com/9/8801/28721998643_6356f151b4_o.jpg,0.0,0.0,0.75,1.0,723,409,https://www.flickr.com/photos/robbie1/28721998643,https://creativecommons.org/licenses/by/2.0/,Robbie Sproule,https://www.flickr.com/people/robbie1/\n9a59aaa777ee1b98,https://c1.staticflickr.com/8/7485/15588561527_8118699fbf_o.jpg,0.25,0.25,1.0,1.0,664,728,https://www.flickr.com/photos/zedzap/15588561527,https://creativecommons.org/licenses/by/2.0/,Nick Kenrick,https://www.flickr.com/people/zedzap/\ne26ba475f6961b39,https://c1.staticflickr.com/1/317/31569075924_108f8051e7_o.jpg,0.0,0.25,0.5,1.0,451,985,https://www.flickr.com/photos/ufv/31569075924,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/\n98bfd09ce2172b6e,https://c1.staticflickr.com/6/5833/29911712004_fa33d19f65_o.jpg,0.0,0.25,0.417452830189,1.0,982,785,https://www.flickr.com/photos/armymaterielcommand/29911712004/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/\nc70321a38f020f99,https://c1.staticflickr.com/6/5780/30465465662_6664674d27_o.jpg,0.0,0.0,0.497426470588,0.75,867,497,https://www.flickr.com/photos/agenciabrasilia/30465465662,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n8e3421784da0fbaf,https://c1.staticflickr.com/8/7575/29135241811_efb4d94f77_o.jpg,0.5,0.0,1.0,0.75,971,66,https://www.flickr.com/photos/davebloggs007/29135241811/,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\n3d0c6846e0a3d6e1,https://c1.staticflickr.com/9/8230/29297635434_d28e43c0e4_o.jpg,0.25,0.25,1.0,1.0,459,568,https://www.flickr.com/photos/discoveroregon/29297635434,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n4e18b3e96197d170,https://c1.staticflickr.com/6/5830/30665270806_04f91a7201_o.jpg,0.0,0.0,1.0,1.0,309,134,https://www.flickr.com/photos/treegrow/30665270806,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nea9570d503e060c1,https://c1.staticflickr.com/8/7376/26880926690_db328dc76a_o.jpg,0.295833333333,0.0,0.8875,1.0,986,593,https://www.flickr.com/photos/ninara/26880926690,https://creativecommons.org/licenses/by/2.0/,Ninara,https://www.flickr.com/people/ninara/\nffb1aec98aa4d1cd,https://c1.staticflickr.com/9/8107/29215629650_27532b5cf9_o.jpg,0.25,0.25,1.0,1.0,329,924,https://www.flickr.com/photos/92252798@N07/29215629650/,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/\n5cfd318873773c4b,https://c1.staticflickr.com/9/8561/28950384811_c3f60d6751_o.jpg,0.0,0.25,0.75,1.0,922,511,https://flickr.com/64648244@N04/28950384811,https://creativecommons.org/licenses/by/2.0/,Ulf K,https://www.flickr.com/people/ulfk/\n9dcc08c54da327fa,https://c1.staticflickr.com/9/8346/29690905046_8fee69992b_o.jpg,0.250923190547,0.25,0.75276957164,1.0,979,813,https://flickr.com/134273297@N06/29690905046,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/134273297@N06/\nb333adaf19a62659,https://c1.staticflickr.com/9/8728/28282854521_354a0a9df9_o.jpg,0.256744604317,0.0,1.0,0.75,884,710,https://www.flickr.com/photos/jmh-pics/28282854521,https://creativecommons.org/licenses/by/2.0/,Jan Mark Holzer,https://www.flickr.com/people/jmh-pics/\n9be422211168e7d4,https://c1.staticflickr.com/1/334/32034447996_b78bae04ea_o.jpg,0.3176910299,0.0,0.953073089701,0.75,311,372,https://www.flickr.com/photos/gails_pictures/32034447996,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nd459517d03b214d6,https://c1.staticflickr.com/9/8179/28900305403_a45c1cec38_o.jpg,0.0,0.25,0.5,1.0,820,693,http://www.flickr.com/photos/thecomeupshow/28900305403/,https://creativecommons.org/licenses/by/2.0/,The Come Up Show,https://www.flickr.com/people/thecomeupshow/\n4f21a9a591ac85a0,https://c1.staticflickr.com/1/562/32737938522_d581c633d3_o.jpg,0.0,0.0,1.0,0.681073025335,305,59,https://flickr.com/52450054@N04/32737938522,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n196eeedde559e5a9,https://c1.staticflickr.com/9/8029/30048123755_16e083967f_o.jpg,0.473457675753,0.0,0.946915351506,0.75,664,511,https://www.flickr.com/photos/eltb/30048123755,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\ncfc9a0804ec5ed84,https://c1.staticflickr.com/8/7486/27054375586_d56389a0fc_o.jpg,0.25,0.25,0.75,1.0,618,700,https://www.flickr.com/photos/irekia/27054375586,https://creativecommons.org/licenses/by/2.0/,Irekia,https://www.flickr.com/people/irekia/\n1d9fadf8adf77ded,https://c1.staticflickr.com/9/8593/28573319500_8d84f02c2a_o.jpg,0.202873563218,0.0,0.608620689655,1.0,971,167,https://www.flickr.com/photos/stephanridgway/28573319500,https://creativecommons.org/licenses/by/2.0/,Stephan Ridgway,https://www.flickr.com/people/stephanridgway/\n32a854a741fbfbfc,https://c1.staticflickr.com/8/7244/27797436316_4f61006002_o.jpg,0.0,0.0,0.5,0.75,342,81,https://www.flickr.com/photos/ilri/27797436316,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/\ncbe850d9e2c516bd,https://c1.staticflickr.com/8/7146/26343921814_24637b69b4_o.jpg,0.0,0.5,0.75,1.0,366,113,https://www.flickr.com/photos/quinet/26343921814,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n396eaf2e38bf48db,https://c1.staticflickr.com/9/8168/29045293124_a21a483be0_o.jpg,0.228169014085,0.25,0.684507042254,1.0,438,932,https://www.flickr.com/photos/abukij/29045293124/,https://creativecommons.org/licenses/by/2.0/,Paolo Gamba,https://www.flickr.com/people/abukij/\n859119120eebb266,https://c1.staticflickr.com/1/361/32285005580_5c4043827f_o.jpg,0.25,0.25,0.75,1.0,971,72,https://www.flickr.com/photos/kecko/32285005580,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\n0628d3695a7cf701,https://c1.staticflickr.com/1/631/30965046424_87c51a2eca_o.jpg,0.21087398374,0.25,0.63262195122,1.0,830,983,https://www.flickr.com/photos/dalecruse/30965046424,https://creativecommons.org/licenses/by/2.0/,Dale Cruse,https://www.flickr.com/people/dalecruse/\nd1557838138ec727,https://c1.staticflickr.com/9/8853/28975077616_b975e7df0f_o.jpg,0.25,0.25,0.75,1.0,405,463,https://www.flickr.com/photos/markyharky/28975077616,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\ne5c7f7a376f59e2a,https://c1.staticflickr.com/9/8159/29693555372_af1b2c0227_o.jpg,0.502573529412,0.25,1.0,1.0,971,62,https://www.flickr.com/photos/paxson_woelber/29693555372,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/\n825725877162f89d,https://c1.staticflickr.com/1/753/32111215196_70017b97ea_o.jpg,0.0,0.0,1.0,0.75,779,946,https://www.flickr.com/photos/mwichary/32111215196,https://creativecommons.org/licenses/by/2.0/,Marcin Wichary,https://www.flickr.com/people/mwichary/\n2db18c479272c66c,https://c1.staticflickr.com/8/7511/27802920906_146e7e96a9_o.jpg,0.235515021459,0.25,0.706545064378,1.0,404,672,https://www.flickr.com/photos/usnavy/27802920906,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n6439d652cd021c27,https://c1.staticflickr.com/8/7053/26533041183_7ccdac4e8e_o.jpg,0.4375,0.25,1.0,1.0,976,706,https://www.flickr.com/photos/yourmildura/26533041183,https://creativecommons.org/licenses/by/2.0/,Your Mildura,https://www.flickr.com/people/yourmildura/\nd330fefbebf1068f,https://c1.staticflickr.com/9/8387/28933064066_afe81d8075_o.jpg,0.0,0.10102739726,1.0,1.0,986,817,https://flickr.com/28435100@N00/28933064066,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/\n46bef326fcdb59a0,https://c1.staticflickr.com/9/8269/30118421771_4f43841857_o.jpg,0.25,0.0,1.0,0.5,973,746,https://www.flickr.com/photos/bruvva/30118421771,https://creativecommons.org/licenses/by/2.0/,Steve Austin,https://www.flickr.com/people/bruvva/\n8309ff762c508515,https://c1.staticflickr.com/8/7399/27863065696_eb3ac24d8b_o.jpg,0.0,0.0,0.5625,0.75,763,47,https://www.flickr.com/photos/juggernautco/27863065696,https://creativecommons.org/licenses/by/2.0/,Daniel X. O&#x27;Neil,https://www.flickr.com/people/juggernautco/\n4c9fe7037e6e6c32,https://c1.staticflickr.com/8/7787/28442420405_07fa40529c_o.jpg,0.5,0.0,1.0,0.75,556,809,https://flickr.com/29621494@N02/28442420405,https://creativecommons.org/licenses/by/2.0/,Paula  R. Lively,https://www.flickr.com/people/29621494@N02/\n92bbb63704533ce7,https://c1.staticflickr.com/9/8224/29276583444_7731e6e305_o.jpg,0.5,0.25,1.0,1.0,561,892,https://www.flickr.com/photos/jill_carlson/29276583444,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\nd7ecbb95fd4f3772,https://c1.staticflickr.com/8/7522/26620373054_3c6f38cc8e_o.jpg,0.0,0.0,0.75,1.0,920,837,https://www.flickr.com/photos/10413717@N08/26620373054,https://creativecommons.org/licenses/by/2.0/,Smabs Sputzer,https://www.flickr.com/people/10413717@N08/\n362127c4888cd6cd,https://c1.staticflickr.com/6/5510/31003951476_180840de52_o.jpg,0.387030995106,0.0,1.0,0.75,68,199,https://www.flickr.com/photos/rarvesen/31003951476,https://creativecommons.org/licenses/by/2.0/,Ralph Arvesen,https://www.flickr.com/people/rarvesen/\nd69a37a0fbe81871,https://c1.staticflickr.com/6/5532/30770208461_1d3271a4e2_o.jpg,0.25,0.0,1.0,0.75,209,810,https://www.flickr.com/photos/28998778@N00/30770208461,https://creativecommons.org/licenses/by/2.0/,Shari,https://www.flickr.com/people/28998778@N00/\n55758f66817463ab,https://c1.staticflickr.com/1/392/31374523740_f449208392_o.jpg,0.311985172982,0.25,0.935955518946,1.0,321,921,https://flickr.com/43272765@N04/31374523740,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nf80973d29150401c,https://c1.staticflickr.com/6/5235/29924633621_bf7ae46973_o.jpg,0.25,0.25,0.75,1.0,587,564,https://www.flickr.com/photos/13476480@N07/29924633621,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nd4e286fa9f1c81f2,https://c1.staticflickr.com/8/7451/27838107670_f38ea4e5da_o.jpg,0.0,0.0,0.75,0.75,314,510,https://www.flickr.com/photos/mpclemens/27838107670,https://creativecommons.org/licenses/by/2.0/,mpclemens,https://www.flickr.com/people/mpclemens/\n6bbed601a751fcac,https://c1.staticflickr.com/8/7721/29672247364_557aecbda7_o.jpg,0.497426470588,0.25,0.994852941176,1.0,672,991,https://www.flickr.com/photos/dno1967b/29672247364,https://creativecommons.org/licenses/by/2.0/,Daniel Oines,https://www.flickr.com/people/dno1967b/\nb4fba30537dd81b6,https://c1.staticflickr.com/6/5805/30597263631_b0c46f6b33_o.jpg,0.0,0.25,0.75,1.0,422,924,https://flickr.com/7961680@N07/30597263631,https://creativecommons.org/licenses/by/2.0/,Per \\303\\205str\\303\\266m,https://www.flickr.com/people/perkovich/\na78b1225e371f0a2,https://c1.staticflickr.com/6/5677/30593866135_e07bf8d940_o.jpg,0.0,0.25,0.5625,1.0,704,924,https://www.flickr.com/photos/gorka_huhezi/30593866135/,https://creativecommons.org/licenses/by/2.0/,Gorka Montiel,https://www.flickr.com/people/gorka_huhezi/\nfe01d91cb69ed098,https://c1.staticflickr.com/9/8867/29202515804_eeee5bb52f_o.jpg,0.200627476882,0.25,0.601882430647,1.0,976,574,https://www.flickr.com/photos/135366503@N05/29202515804,https://creativecommons.org/licenses/by/2.0/,CLAUDIA DEA,https://www.flickr.com/people/135366503@N05/\nf714f9bfd3b1974c,https://c1.staticflickr.com/9/8207/28451654095_947f219287_o.jpg,0.0,0.5,0.75,1.0,647,463,https://www.flickr.com/photos/tipsfortravellers/28451654095,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n30c042bd7384d9a2,https://c1.staticflickr.com/6/5695/30535589590_cc8d2b390d_o.jpg,0.0,0.25,0.497426470588,1.0,912,639,https://flickr.com/7432654@N02/30535589590,https://creativecommons.org/licenses/by/2.0/,distelfliege,https://www.flickr.com/people/distelfliege/\n412b792fe088b4e9,https://c1.staticflickr.com/1/353/31547975386_780677dfb8_o.jpg,0.502573529412,0.25,1.0,1.0,661,579,https://www.flickr.com/photos/husseinabdallah/31547975386,https://creativecommons.org/licenses/by/2.0/,abdallahh,https://www.flickr.com/people/husseinabdallah/\nfd482264247b3c41,https://c1.staticflickr.com/9/8398/28905952120_6b4daf7c48_o.jpg,0.0,0.0,0.7484375,1.0,980,85,https://www.flickr.com/photos/flickbergers/28905952120/,https://creativecommons.org/licenses/by/2.0/,Tim Berger,https://www.flickr.com/people/flickbergers/\n47afbbac291afb31,https://c1.staticflickr.com/9/8727/27709379933_ef296f8d2e_o.jpg,0.0,0.25,0.75,1.0,950,766,https://www.flickr.com/photos/sixmilliondollardan/27709379933,https://creativecommons.org/licenses/by/2.0/,danjo paluska,https://www.flickr.com/people/sixmilliondollardan/\ne626b31893ffe7f6,https://c1.staticflickr.com/6/5829/30522332120_9e7ddd2cd5_o.jpg,0.28125,0.0,0.84375,0.75,661,190,https://www.flickr.com/photos/paparutzi/30522332120/,https://creativecommons.org/licenses/by/2.0/,christina rutz,https://www.flickr.com/people/paparutzi/\nd861730b6be8adf4,https://c1.staticflickr.com/9/8802/29976723722_7dac139fe7_o.jpg,0.499263622975,0.0,0.99852724595,0.75,880,82,https://www.flickr.com/photos/sansebastian2016/29976723722,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/\ne9b36b22d744ecfb,https://c1.staticflickr.com/8/7479/29559184200_7840098afa_o.jpg,0.0,0.25,0.405378486056,1.0,546,481,https://www.flickr.com/photos/bagogames/29559184200,https://creativecommons.org/licenses/by/2.0/,BagoGames,https://www.flickr.com/people/bagogames/\n196ac1353270fe6c,https://c1.staticflickr.com/6/5620/30642577310_d8fd92bb36_o.jpg,0.25,0.25,0.75,1.0,561,578,https://flickr.com/57511216@N04/30642577310,https://creativecommons.org/licenses/by/2.0/,Daniel,https://www.flickr.com/people/57511216@N04/\n663546b50f0a655e,https://c1.staticflickr.com/6/5458/30043866300_928a2d28bb_o.jpg,0.0,0.226157082749,0.75,0.678471248247,407,805,http://www.flickr.com/photos/eltb/30043866300/,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nbbe5a1af1784dc71,https://c1.staticflickr.com/8/7696/28284615651_cccfc50b1b_o.jpg,0.0,0.25,0.75,1.0,693,634,https://www.flickr.com/photos/danielchownet/28284615651,https://creativecommons.org/licenses/by/2.0/,Daniel Chow,https://www.flickr.com/people/danielchownet/\naeaa6257c8bf9865,https://c1.staticflickr.com/8/7555/26222424363_00dfffd6b7_o.jpg,0.331130690162,0.0,0.993392070485,1.0,980,255,https://www.flickr.com/photos/nubobo/26222424363/,https://creativecommons.org/licenses/by/2.0/,nubobo,https://www.flickr.com/people/nubobo/\n7327ef59a75606a8,https://c1.staticflickr.com/1/265/32567125011_b0f2b1e4d2_o.jpg,0.46493902439,0.25,1.0,1.0,971,515,https://www.flickr.com/photos/ruthanddave/32567125011/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n7941287d96e2a97d,https://c1.staticflickr.com/8/7433/27133764275_46b7345618_o.jpg,0.25,0.25,0.75,1.0,821,651,https://www.flickr.com/photos/134741223@N04/27133764275,https://creativecommons.org/licenses/by/2.0/,Paulius Malinovskis,https://www.flickr.com/people/134741223@N04/\n2251fc3834568425,https://c1.staticflickr.com/6/5550/30645926583_06b8c09023_o.jpg,0.458686440678,0.0,0.917372881356,0.75,114,596,https://www.flickr.com/photos/jsjgeology/30645926583,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n48b6e5ef0c86af57,https://c1.staticflickr.com/8/7050/26898227675_aed79d5e10_o.jpg,0.0,0.0,0.726153846154,1.0,986,785,https://www.flickr.com/photos/peterscherub/26898227675,https://creativecommons.org/licenses/by/2.0/,judy dean,https://www.flickr.com/people/peterscherub/\nd85e566653833c5b,https://c1.staticflickr.com/8/7672/27911589636_39cc5448d1_o.jpg,0.0,0.0,0.421177266576,0.75,821,408,https://www.flickr.com/photos/gammaman/27911589636,https://creativecommons.org/licenses/by/2.0/,Eli Christman,https://www.flickr.com/people/gammaman/\n159c87854dba2439,https://c1.staticflickr.com/8/7288/28098505735_df0d9a77a1_o.jpg,0.0,0.25,0.5,1.0,556,349,https://www.flickr.com/photos/jill_carlson/28098505735/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\n28a9d10e48f5c317,https://c1.staticflickr.com/8/7334/28096497335_315985133e_o.jpg,0.0,0.0,0.5625,0.75,986,601,https://www.flickr.com/photos/a_peach/28096497335,https://creativecommons.org/licenses/by/2.0/,A_Peach,https://www.flickr.com/people/a_peach/\nf4021a2355a08a84,https://c1.staticflickr.com/8/7437/28048420711_11ac521ea8_o.jpg,0.0,0.0,0.422142857143,0.75,558,410,https://www.flickr.com/photos/bagogames/28048420711,https://creativecommons.org/licenses/by/2.0/,BagoGames,https://www.flickr.com/people/bagogames/\n9137f22576f67221,https://c1.staticflickr.com/9/8781/28704776765_028dbaef7b_o.jpg,0.0,0.0,0.5,0.75,779,311,https://www.flickr.com/photos/s2ublack/28704776765/,https://creativecommons.org/licenses/by/2.0/,Stewart Black,https://www.flickr.com/people/s2ublack/\n17b69544e99b8cfc,https://c1.staticflickr.com/1/686/31388266214_da4abe0856_o.jpg,0.333333333333,0.0,1.0,1.0,548,823,https://www.flickr.com/photos/rhemkes/31388266214,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\n13acecd84f7ef16a,https://c1.staticflickr.com/9/8039/28406631783_c8b90d0e01_o.jpg,0.262273413897,0.25,0.786820241692,1.0,603,654,https://www.flickr.com/photos/familymwr/28406631783,https://creativecommons.org/licenses/by/2.0/,U.S. Army,https://www.flickr.com/people/familymwr/\ne93477a46f38d99d,https://c1.staticflickr.com/6/5256/29568920333_0bcb9a6799_o.jpg,0.0,0.0,0.5625,0.75,975,159,https://www.flickr.com/photos/jsjgeology/29568920333,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nc9ee2a48285aaa15,https://c1.staticflickr.com/6/5686/30568435063_b488f78730_o.jpg,0.280226209048,0.25,0.840678627145,1.0,913,567,https://www.flickr.com/photos/135302410@N02/30568435063,https://creativecommons.org/licenses/by/2.0/,Libraries Taskforce,https://www.flickr.com/people/135302410@N02/\n26cd2c61e18346ea,https://c1.staticflickr.com/8/7341/27040003656_d63b51e616_o.jpg,0.0,0.25,0.335144927536,1.0,706,474,https://flickr.com/47445767@N05/27040003656,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nf647829391509caa,https://c1.staticflickr.com/6/5506/30214132714_e8e57bf862_o.jpg,0.0,0.25,0.503698224852,1.0,405,914,https://www.flickr.com/photos/barteq24/30214132714,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/\nfc6753079864d0df,https://c1.staticflickr.com/9/8099/29192177426_d209800937_o.jpg,0.5,0.0,1.0,0.75,560,515,https://www.flickr.com/photos/dodnewsfeatures/29192177426,https://creativecommons.org/licenses/by/2.0/,DoD News,https://www.flickr.com/people/dodnewsfeatures/\n89723de59bcd729f,https://c1.staticflickr.com/9/8821/28494980665_7600910e02_o.jpg,0.0,0.0595446584939,1.0,1.0,820,496,https://www.flickr.com/photos/rarvesen/28494980665,https://creativecommons.org/licenses/by/2.0/,Ralph Arvesen,https://www.flickr.com/people/rarvesen/\n652701f43ad0e3cb,https://c1.staticflickr.com/9/8727/27860838673_09c3947d69_o.jpg,0.42234548336,0.0,1.0,0.75,821,651,https://www.flickr.com/photos/hisgett/27860838673,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n326f789026f60f2b,https://c1.staticflickr.com/8/7545/29854455250_7c2fcd0d09_o.jpg,0.0,0.0,0.5,0.75,561,220,https://flickr.com/100379608@N08/29854455250,https://creativecommons.org/licenses/by/2.0/,Bob Gibbs,https://www.flickr.com/people/100379608@N08/\n6eb7d12b21504ee9,https://c1.staticflickr.com/1/613/31245442393_82c14ff959_o.jpg,0.0,0.25,0.75,1.0,830,163,https://flickr.com/83136374@N05/31245442393,https://creativecommons.org/licenses/by/2.0/,Ajay Suresh,https://www.flickr.com/people/ajay_suresh/\nce4a0aa202981fa8,https://c1.staticflickr.com/8/7386/27835662462_178d4de7fc_o.jpg,0.0,0.25,0.70534150613,1.0,9,738,https://www.flickr.com/photos/usdagov/27835662462,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\nb58e4f4ba81fe624,https://c1.staticflickr.com/9/8601/28824981185_3063755b08_o.jpg,0.306766917293,0.0,1.0,1.0,896,443,https://www.flickr.com/photos/8269539@N04/28824981185/,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n834a4fbc1803557c,https://c1.staticflickr.com/1/727/31377394774_f5dced269d_o.jpg,0.0,0.0,0.5,0.75,851,944,https://www.flickr.com/photos/thepeachpeddler/31377394774,https://creativecommons.org/licenses/by/2.0/,thepeachpeddler,https://www.flickr.com/people/thepeachpeddler/\n0557707195f0c04c,https://c1.staticflickr.com/9/8643/28234298541_e4fd0853d2_o.jpg,0.55,0.25,1.0,1.0,427,498,https://flickr.com/25034321@N05/28234298541,https://creativecommons.org/licenses/by/2.0/,Ninian  Reid,https://www.flickr.com/people/ninian_reid/\n2e812c3b619f4b68,https://c1.staticflickr.com/9/8866/28690639941_44e10630b5_o.jpg,0.4375,0.0,1.0,0.75,780,483,https://www.flickr.com/photos/thoseguys119/28690639941,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nf5bd6bd67c9f31b9,https://c1.staticflickr.com/8/7633/27052183466_285326b7f9_o.jpg,0.0,0.25,0.5,1.0,490,327,https://www.flickr.com/photos/deniwlp84/27052183466,https://creativecommons.org/licenses/by/2.0/,Deni Williams,https://www.flickr.com/people/deniwlp84/\n8727f30177985200,https://c1.staticflickr.com/6/5682/30777446271_f88440e3bd_o.jpg,0.48007518797,0.0,1.0,0.75,536,845,https://www.flickr.com/photos/glorycycles/30777446271,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n758f02ad7d77c50b,https://c1.staticflickr.com/1/751/31777078281_6396633fa6_o.jpg,0.5,0.0,1.0,0.75,179,982,https://www.flickr.com/photos/58827557@N06/31777078281,https://creativecommons.org/licenses/by/2.0/,Clint Budd,https://www.flickr.com/people/58827557@N06/\n45890708ac7a91ce,https://c1.staticflickr.com/6/5516/25319249609_a88c3df281_o.jpg,0.0,0.436666666667,0.75,1.0,671,796,https://flickr.com/96223380@N02/25319249609,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/\nd414908a62d1232f,https://c1.staticflickr.com/1/395/31809726276_3f55a92e26_o.jpg,0.0,0.25,0.75,1.0,835,102,https://flickr.com/89719643@N08/31809726276,https://creativecommons.org/licenses/by/2.0/,Firu_kun,https://www.flickr.com/people/firu_kun/\n820145c8ad94595f,https://c1.staticflickr.com/1/686/32470033422_269415c929_o.jpg,0.0,0.0,0.75,1.0,699,256,https://flickr.com/127226743@N02/32470033422,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\nc187af75232f06df,https://c1.staticflickr.com/8/7437/26859623276_cf65ed8680_o.jpg,0.333333333333,0.0,1.0,1.0,519,459,https://www.flickr.com/photos/box_repsol/26859623276,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n1f175a7ff580eff4,https://c1.staticflickr.com/9/8792/28355272936_f011d68d35_o.jpg,0.0,0.0,0.5625,0.75,763,234,https://www.flickr.com/photos/marsupilami92/28355272936,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\n78bdd4d6cc1c879f,https://c1.staticflickr.com/6/5506/30505544570_646bfef025_o.jpg,0.0,0.25,0.561328125,1.0,980,214,https://www.flickr.com/photos/666_is_money/30505544570,https://creativecommons.org/licenses/by/2.0/,Raquel Baranow,https://www.flickr.com/people/666_is_money/\n226872b02631d21f,https://c1.staticflickr.com/8/7300/27734595342_1ff7226a9b_o.jpg,0.0,0.25,0.75,1.0,940,824,https://www.flickr.com/photos/yto/27734595342/,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/\n136e2ca662372705,https://c1.staticflickr.com/9/8246/29006830961_13c9fd67b3_o.jpg,0.5,0.0,1.0,0.75,702,175,https://www.flickr.com/photos/box_repsol/29006830961,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\na23d4cb3e070d9df,https://c1.staticflickr.com/8/7434/27792852586_7d3023f05c_o.jpg,0.0,0.0,0.666666666667,1.0,512,627,https://www.flickr.com/photos/greggjerdingen/27792852586,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n0b83d114fac4d4e3,https://c1.staticflickr.com/8/7381/26878179294_be93afb756_o.jpg,0.25,0.25,0.75,1.0,461,577,https://www.flickr.com/photos/allthishappiness/26878179294,https://creativecommons.org/licenses/by/2.0/,kater,https://www.flickr.com/people/allthishappiness/\n016c19d0af0bef81,https://c1.staticflickr.com/8/7126/27021429202_b71d894daa_o.jpg,0.0,0.0,0.568119891008,1.0,780,444,https://www.flickr.com/photos/thoseguys119/27021429202,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n616db99ad802a9c0,https://c1.staticflickr.com/9/8188/28521502796_06e0f4d49c_o.jpg,0.0,0.0,0.666666666667,1.0,704,532,https://www.flickr.com/photos/17367470@N05/28521502796,https://creativecommons.org/licenses/by/2.0/,bluesbby,https://www.flickr.com/people/17367470@N05/\ndc99ee87075dedba,https://c1.staticflickr.com/1/452/32387933792_4267a70723_o.jpg,0.4375,0.25,1.0,1.0,780,130,https://www.flickr.com/photos/thoseguys119/32387933792,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n9de139592b4596ad,https://c1.staticflickr.com/9/8610/29842748943_a641432f48_o.jpg,0.25,0.25,0.75,1.0,704,778,https://www.flickr.com/photos/polycola/29842748943,https://creativecommons.org/licenses/by/2.0/,Anders Lejczak,https://www.flickr.com/people/polycola/\n71f94f27a141f382,https://c1.staticflickr.com/9/8673/28003288044_04b807b762_o.jpg,0.0,0.25,0.561328125,1.0,321,91,https://www.flickr.com/photos/treegrow/28003288044/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nc7cf9e068c71afdd,https://c1.staticflickr.com/9/8281/28182226973_528473deef_o.jpg,0.0,0.25,0.75,1.0,507,868,https://www.flickr.com/photos/zigazou76/28182226973/,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n8aa44c083ed75dcc,https://c1.staticflickr.com/9/8153/28821472214_57a503a3de_o.jpg,0.0,0.0,0.561569688769,1.0,971,628,http://www.flickr.com/photos/phalaenopsisaphrodite523/28821472214/,https://creativecommons.org/licenses/by/2.0/,Francesca Cappa,https://www.flickr.com/people/phalaenopsisaphrodite523/\nce6bdedc89ee0c89,https://c1.staticflickr.com/4/3690/33075660575_f5edc56bb9_o.jpg,0.25,0.0,0.75,0.75,568,849,https://www.flickr.com/photos/yourbestdigs/33075660575/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\n9e5b9a3387c17aec,https://c1.staticflickr.com/9/8377/29083734266_a16b9b52b1_o.jpg,0.251849112426,0.0,0.755547337278,0.75,885,841,https://www.flickr.com/photos/eltb/29083734266,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\ncbf9f5a03d85ce43,https://c1.staticflickr.com/9/8435/29027344686_58bbebfe41_o.jpg,0.0,0.0,0.568396226415,0.75,651,181,https://www.flickr.com/photos/jus10h/29027344686,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\nc8f1f43ffb4c0440,https://c1.staticflickr.com/9/8082/29138633751_a13bea87ff_o.jpg,0.25,0.0,0.75,0.75,947,495,https://www.flickr.com/photos/blumenbiene/29138633751,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\neee8b45fa7903f0f,https://c1.staticflickr.com/9/8238/29033565786_bdb3db8422_o.jpg,0.526542324247,0.25,1.0,1.0,324,30,https://www.flickr.com/photos/usfwsmidwest/29033565786,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n0a5a761882a098db,https://c1.staticflickr.com/9/8479/29516961070_bf28f8e150_o.jpg,0.0,0.0,0.666666666667,1.0,563,966,https://www.flickr.com/photos/swampa/29516961070,https://creativecommons.org/licenses/by/2.0/,Steve Collis,https://www.flickr.com/people/swampa/\n982b63d66e01aece,https://c1.staticflickr.com/8/7561/27079720035_216140f617_o.jpg,0.0,0.0,0.72731316726,0.75,918,928,https://www.flickr.com/photos/sorbus-galleria/27079720035,https://creativecommons.org/licenses/by/2.0/,Sorbus galleria,https://www.flickr.com/people/sorbus-galleria/\ncc6261571a779f34,https://c1.staticflickr.com/1/423/32009819770_9619c31f27_o.jpg,0.4375,0.0,1.0,0.75,610,571,https://www.flickr.com/photos/27665395@N05/32009819770,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n7e6c3e93d160a094,https://c1.staticflickr.com/9/8796/27917027260_d0d6d5047b_o.jpg,0.0,0.231382978723,0.75,0.69414893617,567,424,https://flickr.com/93416311@N00/27917027260,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\nf39982a7eefe2b72,https://c1.staticflickr.com/6/5791/29783361063_026863250a_o.jpg,0.4375,0.25,1.0,1.0,490,81,https://flickr.com/10390868@N07/29783361063,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\n6047cf3b655d452e,https://c1.staticflickr.com/9/8640/28090607604_6a7c53b029_o.jpg,0.0,0.0,0.5625,0.75,909,852,https://www.flickr.com/photos/mickaeltr/28090607604/,https://creativecommons.org/licenses/by/2.0/,Micka\\303\\253l T.,https://www.flickr.com/people/mickaeltr/\n9b13a42a7a66a742,https://c1.staticflickr.com/6/5752/30775200585_0a2aa4ded7_o.jpg,0.0,0.0,0.7484375,1.0,821,856,https://www.flickr.com/photos/chaz_pics/30775200585/,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\n42023d98eec3e21f,https://c1.staticflickr.com/6/5679/30400024723_eb2424c74a_o.jpg,0.421177266576,0.0,0.842354533153,0.75,459,544,https://www.flickr.com/photos/davidboily/30400024723/,https://creativecommons.org/licenses/by/2.0/,NomadicPics,https://www.flickr.com/people/davidboily/\n5a375880e9d0aaf8,https://c1.staticflickr.com/8/7235/26908523165_be94f00467_o.jpg,0.25,0.25,1.0,1.0,507,227,https://www.flickr.com/photos/hubble_esa/26908523165,https://creativecommons.org/licenses/by/2.0/,Hubble ESA,https://www.flickr.com/people/hubble_esa/\n43df149ab9f1ec3d,https://c1.staticflickr.com/8/7380/27325765973_2de71af52b_o.jpg,0.0,0.0,0.497426470588,0.75,404,391,https://www.flickr.com/photos/usnavy/27325765973,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n11f5bfa0348cf73b,https://c1.staticflickr.com/6/5750/30109407996_77b15e73d1_o.jpg,0.5,0.25,1.0,1.0,942,802,https://www.flickr.com/photos/mikespeaks/30109407996,https://creativecommons.org/licenses/by/2.0/,Mike Maguire,https://www.flickr.com/people/mikespeaks/\n60fc59f59f504047,https://c1.staticflickr.com/1/724/32424143031_75401da2da_o.jpg,0.0,0.0,0.5,0.75,669,392,https://flickr.com/138532424@N02/32424143031,https://creativecommons.org/licenses/by/2.0/,Australian Embassy Jakarta,https://www.flickr.com/people/kedubesaustralia/\nabe67ca246604b15,https://c1.staticflickr.com/8/7361/28087108175_39f44efc6a_o.jpg,0.28125,0.25,0.84375,1.0,512,932,https://www.flickr.com/photos/notionscapital/28087108175,https://creativecommons.org/licenses/by/2.0/,Mike Licht,https://www.flickr.com/people/notionscapital/\ncb8cdbf661de7c72,https://c1.staticflickr.com/9/8159/28528275813_2bfb4a6a46_o.jpg,0.25,0.25,0.75,1.0,981,542,https://www.flickr.com/photos/n28307/28528275813,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/\nec237095abdb441b,https://c1.staticflickr.com/1/695/30685393134_88c43218d9_o.jpg,0.258078994614,0.0,1.0,0.75,910,930,https://www.flickr.com/photos/13476480@N07/30685393134,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n086cf1cec5b312c6,https://c1.staticflickr.com/8/7187/26885294675_618496a1e9_o.jpg,0.0,0.0,1.0,1.0,384,92,https://www.flickr.com/photos/jbrocker_photos/26885294675,https://creativecommons.org/licenses/by/2.0/,Jacqueline Brocker,https://www.flickr.com/people/jbrocker_photos/\n5e06b3ce04626b6c,https://c1.staticflickr.com/8/7612/27815003385_64b82cedf6_o.jpg,0.502573529412,0.25,1.0,1.0,404,190,https://www.flickr.com/photos/usnavy/27815003385,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\ncc70e2d9c92d11d0,https://c1.staticflickr.com/9/8222/29035166292_da45e84a3f_o.jpg,0.0,0.0,0.666666666667,1.0,761,576,https://www.flickr.com/photos/133187873@N07/29035166292/,https://creativecommons.org/licenses/by/2.0/,Jennifer Firmenich,https://www.flickr.com/people/133187873@N07/\n1e0e7a14e406e6e9,https://c1.staticflickr.com/9/8652/28092495682_cac2170bc8_o.jpg,0.249079528719,0.0,0.747238586156,0.75,699,528,https://www.flickr.com/photos/steffenz/28092495682,https://creativecommons.org/licenses/by/2.0/,Steffen Zahn,https://www.flickr.com/people/steffenz/\n626077e609ca18b4,https://c1.staticflickr.com/8/7186/26279516544_6c500c73a3_o.jpg,0.0,0.0,0.496696035242,0.75,657,191,https://www.flickr.com/photos/eguidetravel/26279516544/,https://creativecommons.org/licenses/by/2.0/,eGuide Travel,https://www.flickr.com/people/eguidetravel/\n13992d45aea1ac78,https://c1.staticflickr.com/9/8472/29541019041_b680fa85ae_o.jpg,0.309309309309,0.0,1.0,1.0,308,574,https://www.flickr.com/photos/52450054@N04/29541019041/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n05db1d3ced78827e,https://c1.staticflickr.com/8/7604/27380853325_3ff7efe9f6_o.jpg,0.46104815864,0.25,0.92209631728,1.0,780,805,https://www.flickr.com/photos/thoseguys119/27380853325,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n6403e1c6f6853bba,https://c1.staticflickr.com/9/8092/29195089652_0e3f958e31_o.jpg,0.25,0.25,1.0,1.0,753,977,https://www.flickr.com/photos/jonicdao/29195089652/,https://creativecommons.org/licenses/by/2.0/,jojo nicdao,https://www.flickr.com/people/jonicdao/\n4ef3c9c9d2c5cd38,https://c1.staticflickr.com/9/8612/28302854456_7fd6d0670e_o.jpg,0.267530487805,0.25,0.802591463415,1.0,975,548,https://www.flickr.com/photos/jsjgeology/28302854456/,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nd7544981179c5e49,https://c1.staticflickr.com/1/493/32663662265_8175f81cf1_o.jpg,0.5,0.25,1.0,1.0,98,152,https://www.flickr.com/photos/markyharky/32663662265,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n45625711771f6741,https://c1.staticflickr.com/8/7789/26250637844_1a32b6105a_o.jpg,0.314020028612,0.0,0.942060085837,1.0,12,718,https://www.flickr.com/photos/postmanpetecoluk/26250637844/,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\n57cb2d0d4e60115f,https://c1.staticflickr.com/6/5574/29935756904_619835da00_o.jpg,0.25,0.0,0.75,0.75,977,998,https://www.flickr.com/photos/splodge360/29935756904,https://creativecommons.org/licenses/by/2.0/,Stephen Steven Hodge,https://www.flickr.com/people/splodge360/\ndde22ae5b6aa2705,https://c1.staticflickr.com/8/7548/27081747240_b2f881bf72_o.jpg,0.468844984802,0.0,1.0,0.75,325,33,https://www.flickr.com/photos/petervonbagh/27081747240,https://creativecommons.org/licenses/by/2.0/,Peter von Bagh,https://www.flickr.com/people/petervonbagh/\n099f98003eacf5a8,https://c1.staticflickr.com/8/7654/26689131623_5437b57e06_o.jpg,0.0,0.0,0.521837349398,0.75,780,717,https://www.flickr.com/photos/thoseguys119/26689131623,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nbb9e5845df4de497,https://c1.staticflickr.com/1/379/31808300650_bdec0a706d_o.jpg,0.382786885246,0.25,1.0,1.0,309,560,https://www.flickr.com/photos/gails_pictures/31808300650,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\ne58548561b357e77,https://c1.staticflickr.com/6/5511/30584211776_28e90ed707_o.jpg,0.0,0.0,0.75,1.0,583,117,https://flickr.com/10390868@N07/30584211776,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\nddc6474be0571ec6,https://c1.staticflickr.com/8/7389/27912404221_4394207050_o.jpg,0.0,0.0,1.0,1.0,697,436,https://www.flickr.com/photos/78428166@N00/27912404221,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\n1e4d8f729c80305c,https://c1.staticflickr.com/9/8679/28863704555_ccccce4225_o.jpg,0.333333333333,0.0,1.0,1.0,472,425,https://www.flickr.com/photos/quinet/28863704555/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nfab9b44e0d87c9d1,https://c1.staticflickr.com/6/5486/30180445021_2eac22a1f7_o.jpg,0.0,0.0,0.506305637982,0.75,337,287,https://www.flickr.com/photos/mypubliclands/30180445021,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n17d2415ade2b68a1,https://c1.staticflickr.com/8/7233/26703892982_a9c1ed938c_o.jpg,0.0,0.25,0.5,1.0,826,771,https://www.flickr.com/photos/tejvan/26703892982/,https://creativecommons.org/licenses/by/2.0/,Tejvan Pettinger,https://www.flickr.com/people/tejvan/\na05b6cb034b7fa44,https://c1.staticflickr.com/6/5723/30025343983_70de3205f1_o.jpg,0.0,0.0,0.5,0.75,405,725,https://www.flickr.com/photos/alessandroambrosetti/30025343983,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/\n2fbbb2062cf585fd,https://c1.staticflickr.com/8/7101/27767445301_f66ee841df_o.jpg,0.333333333333,0.0,1.0,1.0,924,77,https://www.flickr.com/photos/kostas-limitsios/27767445301,https://creativecommons.org/licenses/by/2.0/,Kostas Limitsios,https://www.flickr.com/people/kostas-limitsios/\n61cefa6a34376c52,https://c1.staticflickr.com/8/7374/27898387651_9788695def_o.jpg,0.25,0.0,0.75,0.75,997,946,https://www.flickr.com/photos/quinet/27898387651,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n4c15cab91ce70b90,https://c1.staticflickr.com/8/7490/28946290610_c32cc53397_o.jpg,0.0,0.25,0.75,1.0,672,576,https://www.flickr.com/photos/glorycycles/28946290610,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n96e6305f9aa3d40c,https://c1.staticflickr.com/6/5635/29878649004_936558ca3c_o.jpg,0.0,0.0,0.672592592593,1.0,23,624,https://www.flickr.com/photos/photatojonez/29878649004,https://creativecommons.org/licenses/by/2.0/,Alexander Day,https://www.flickr.com/people/photatojonez/\n6900d8c619e7bcfb,https://c1.staticflickr.com/6/5835/30498612532_f7666a0c40_o.jpg,0.0,0.25,0.5,1.0,519,697,https://www.flickr.com/photos/box_repsol/30498612532,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n7f8a82fdac5cca80,https://c1.staticflickr.com/9/8162/28409390513_dafc4d3097_o.jpg,0.409546061415,0.0,0.81909212283,0.75,979,821,https://www.flickr.com/photos/bagogames/28409390513,https://creativecommons.org/licenses/by/2.0/,BagoGames,https://www.flickr.com/people/bagogames/\n4bcd048562317b69,https://c1.staticflickr.com/9/8246/28612811524_ed127f0289_o.jpg,0.4375,0.0,1.0,0.75,975,184,https://www.flickr.com/photos/jsjgeology/28612811524,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ne779d2576c165949,https://c1.staticflickr.com/6/5326/30635888270_a32a409fb7_o.jpg,0.0,0.0,1.0,1.0,912,798,https://flickr.com/52066925@N00/30635888270,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/\n1891666471fd859a,https://c1.staticflickr.com/9/8112/29304276195_081e1f7e22_o.jpg,0.25,0.0,1.0,0.400725593668,443,348,https://www.flickr.com/photos/xiquinho/29304276195,https://creativecommons.org/licenses/by/2.0/,xiquinhosilva,https://www.flickr.com/people/xiquinho/\n70da0375a4855a2b,https://c1.staticflickr.com/9/8217/28780187980_53b56b5d0c_o.jpg,0.0,0.25,0.695217391304,1.0,324,674,https://www.flickr.com/photos/usfwsmidwest/28780187980/,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\nbb39a75d977b50cc,https://c1.staticflickr.com/9/8413/29711642155_73b2966a2d_o.jpg,0.25,0.0,1.0,1.0,981,42,https://www.flickr.com/photos/cogdog/29711642155/?map=1,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nf1df3a222f52c6ae,https://c1.staticflickr.com/8/7205/26726038911_f793d14ac2_o.jpg,0.4375,0.0,1.0,0.75,696,364,https://www.flickr.com/photos/computerhotline/26726038911/,https://creativecommons.org/licenses/by/2.0/,Thomas Bresson,https://www.flickr.com/people/computerhotline/\ne763332902cd1d04,https://c1.staticflickr.com/6/5474/30419774994_076389d703_o.jpg,0.0,0.25,0.515344311377,1.0,416,316,https://www.flickr.com/photos/boscdanjou/30419774994/,https://creativecommons.org/licenses/by/2.0/,Bosc d&#x27;Anjou,https://www.flickr.com/people/boscdanjou/\n1128ae1d013bfead,https://c1.staticflickr.com/9/8320/29227972683_93d76cd87d_o.jpg,0.0,0.0,0.666666666667,1.0,442,106,https://www.flickr.com/photos/allagashbrewing/29227972683,https://creativecommons.org/licenses/by/2.0/,Allagash Brewing,https://www.flickr.com/people/allagashbrewing/\n81350e4e68286f1d,https://c1.staticflickr.com/1/257/32296349550_fea2fbd7ef_o.jpg,0.0,0.0,0.565217391304,1.0,874,87,https://www.flickr.com/photos/eltb/32296349550,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n0037457099831038,https://c1.staticflickr.com/8/7624/26750743561_98ff3b6de8_o.jpg,0.0,0.0,0.665684830633,1.0,820,803,https://www.flickr.com/photos/re-publica/26750743561,https://creativecommons.org/licenses/by/2.0/,re:publica,https://www.flickr.com/people/re-publica/\nb3e1c45b2ee26ed9,https://c1.staticflickr.com/8/7769/27044150752_d18793d2d5_o.jpg,0.333333333333,0.0,1.0,1.0,114,314,https://www.flickr.com/photos/briangratwicke/27044150752,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/\n20c6b5de5ccc6213,https://c1.staticflickr.com/9/8494/28500572574_92f800ee4a_o.jpg,0.0,0.0,0.51992481203,0.75,975,636,https://www.flickr.com/photos/jsjgeology/28500572574,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\neff36f2e4c2e8058,https://c1.staticflickr.com/8/7327/27994452046_944f9e7ceb_o.jpg,0.0,0.0,0.75,1.0,981,325,https://www.flickr.com/photos/lumen850/27994452046,https://creativecommons.org/licenses/by/2.0/,elminium,https://www.flickr.com/people/lumen850/\n6fdef96412a1a79c,https://c1.staticflickr.com/6/5791/30782694000_ed57ca3c93_o.jpg,0.0,0.0,0.5,0.75,539,930,https://www.flickr.com/photos/gotovan/30782694000,https://creativecommons.org/licenses/by/2.0/,GoToVan,https://www.flickr.com/people/gotovan/\nc97e69c61ed82fde,https://c1.staticflickr.com/8/7338/27460776514_c5a89d703c_o.jpg,0.0,0.0,0.666666666667,1.0,480,563,https://www.flickr.com/photos/69663188@N00/27460776514/,https://creativecommons.org/licenses/by/2.0/,Grant.C,https://www.flickr.com/people/grant_subaru/\nab9f22a83e8fad15,https://c1.staticflickr.com/8/7077/27723495182_0dc1d7d748_o.jpg,0.261312217195,0.25,0.783936651584,1.0,100,554,https://www.flickr.com/photos/sbern/27723495182,https://creativecommons.org/licenses/by/2.0/,Stefan Berndtsson,https://www.flickr.com/people/sbern/\n880266c86a5cc884,https://c1.staticflickr.com/8/7515/27084790893_88c6ce0123_o.jpg,0.0,0.0,0.75,0.75,405,138,https://www.flickr.com/photos/craightonmiller/27084790893,https://creativecommons.org/licenses/by/2.0/,Craighton Miller,https://www.flickr.com/people/craightonmiller/\n639c3402d2f4087f,https://c1.staticflickr.com/9/8138/30186318601_3f7e1f11fa_o.jpg,0.25,0.0,0.75,0.75,526,605,https://flickr.com/48539981@N03/30186318601,https://creativecommons.org/licenses/by/2.0/,Felix Dance,https://www.flickr.com/people/felixdance/\n3917dce7a9a86181,https://c1.staticflickr.com/8/7485/26840080736_13f6407a06_o.jpg,0.0,0.0,0.666666666667,1.0,820,115,https://www.flickr.com/photos/nanpalmero/26840080736,https://creativecommons.org/licenses/by/2.0/,Nan Palmero,https://www.flickr.com/people/nanpalmero/\n97131307bfc8c73c,https://c1.staticflickr.com/1/772/32749639240_f2ece6e133_o.jpg,0.0,0.393668831169,0.75,1.0,484,588,https://www.flickr.com/photos/pyride/32749639240,https://creativecommons.org/licenses/by/2.0/,Julie anne Johnson,https://www.flickr.com/people/pyride/\n94b07b8d87b1169a,https://c1.staticflickr.com/6/5793/30737912512_cbdea11a6b_o.jpg,0.0,0.0,0.75,0.75,820,748,https://www.flickr.com/photos/moonierocks/30737912512/,https://creativecommons.org/licenses/by/2.0/,Marilyn Roxie,https://www.flickr.com/people/moonierocks/\nd87ffd300b8228d2,https://c1.staticflickr.com/6/5748/31329490516_4eb1ba925a_o.jpg,0.25,0.0,1.0,0.496696035242,919,546,https://www.flickr.com/photos/zionfiction/31329490516,https://creativecommons.org/licenses/by/2.0/,r. nial bradshaw,https://www.flickr.com/people/zionfiction/\nb3ffbdb422bbaf07,https://c1.staticflickr.com/3/2944/32386765884_928eab48fc_o.jpg,0.0,0.0,0.5625,0.75,918,789,https://www.flickr.com/photos/usagapg/32386765884/,https://creativecommons.org/licenses/by/2.0/,Aberdeen Proving Ground,https://www.flickr.com/people/usagapg/\na84d56908d891680,https://c1.staticflickr.com/1/273/31871194741_bea04c27f5_o.jpg,0.421703296703,0.0,1.0,1.0,431,875,https://www.flickr.com/photos/viumariners/31871194741/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/\n88ce0ad1de0168f8,https://c1.staticflickr.com/8/7526/28075448522_50687f1edf_o.jpg,0.0,0.0,0.617213114754,0.75,309,407,https://www.flickr.com/photos/35142635@N05/28075448522,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\n1849b094728d520a,https://c1.staticflickr.com/6/5683/30638280440_54bff19618_o.jpg,0.0,0.0,1.0,0.828947368421,884,637,https://www.flickr.com/photos/nat507/30638280440/,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/\n60ad0ed57f2d22db,https://c1.staticflickr.com/6/5541/30287126544_6e647613cd_o.jpg,0.0,0.373762376238,0.75,1.0,422,828,https://www.flickr.com/photos/duncanh1/30287126544,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\nf5ec1f282e38d9b3,https://c1.staticflickr.com/9/8282/29296349346_8a99a2f048_o.jpg,0.28125,0.0,0.84375,0.75,309,127,https://www.flickr.com/photos/treegrow/29296349346,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n8c485ae77065eba8,https://c1.staticflickr.com/9/8560/28344396322_ff74b34b60_o.jpg,0.0,0.0,0.666666666667,1.0,93,543,https://www.flickr.com/photos/silkebaron/28344396322/,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/\na0c580e905ac8c77,https://c1.staticflickr.com/8/7714/26515336243_17d41eb4d7_o.jpg,0.0,0.0,0.625,1.0,699,424,https://www.flickr.com/photos/viaggioroutard/26515336243,https://creativecommons.org/licenses/by/2.0/,Viaggio Routard,https://www.flickr.com/people/viaggioroutard/\nc3fd6b9a80845631,https://c1.staticflickr.com/9/8771/29233540675_e81fc2f05c_o.jpg,0.251849112426,0.0,0.755547337278,0.75,548,866,https://www.flickr.com/photos/28101583@N07/29233540675,https://creativecommons.org/licenses/by/2.0/,Drew  Jacksich,https://www.flickr.com/people/28101583@N07/\n607da844c5c516c8,https://c1.staticflickr.com/8/7506/26562209630_00c069c15f_o.jpg,0.0,0.0,0.63924963925,1.0,672,587,https://www.flickr.com/photos/glorycycles/26562209630,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n62940f3805195b7d,https://c1.staticflickr.com/9/8218/29880087555_9b641a861f_o.jpg,0.25,0.0,1.0,1.0,699,495,https://www.flickr.com/photos/marsupilami92/29880087555/,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\n551fd05f307aa188,https://c1.staticflickr.com/6/5792/31095062510_05ab1c4823_o.jpg,0.501840942563,0.0,1.0,0.75,752,523,https://www.flickr.com/photos/davehamster/31095062510/,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n0930b6c9833f198c,https://c1.staticflickr.com/9/8755/27763656834_a276f8cc85_o.jpg,0.25,0.25,0.75,1.0,512,663,https://www.flickr.com/photos/greggjerdingen/27763656834,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nd603622bdc1d91fc,https://c1.staticflickr.com/6/5790/30126475762_cbdc7daee6_o.jpg,0.25,0.25,0.75,1.0,408,599,https://www.flickr.com/photos/kecko/30126475762,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\n64970b901ef0209e,https://c1.staticflickr.com/9/8724/28227819681_f95f42576a_o.jpg,0.25,0.25,1.0,0.75,873,95,https://www.flickr.com/photos/sheila_sund/28227819681,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/\ndbe893759f87390d,https://c1.staticflickr.com/3/2263/32519576950_bdff5f7190_o.jpg,0.25,0.25,0.75,1.0,114,483,https://www.flickr.com/photos/37180297@N08/32519576950/,https://creativecommons.org/licenses/by/2.0/,LiCheng Shih,https://www.flickr.com/people/papilioshih/\n9c46fc881be714ca,https://c1.staticflickr.com/8/7415/27595256915_5661f0a51e_o.jpg,0.4375,0.0,1.0,0.75,405,455,https://www.flickr.com/photos/shankaronline/27595256915,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n3055dc98cf8a57a5,https://c1.staticflickr.com/6/5535/30714884170_a6254a5627_o.jpg,0.0,0.0,0.5,0.75,737,695,https://www.flickr.com/photos/stevendepolo/30714884170,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nd7b476c0f9e0e65d,https://c1.staticflickr.com/9/8751/28841277556_b19993cf78_o.jpg,0.4375,0.0,1.0,0.75,459,970,https://www.flickr.com/photos/127226743@N02/28841277556,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n665964e46080dae4,https://c1.staticflickr.com/6/5798/30274253233_a0df682f8a_o.jpg,0.496301775148,0.25,1.0,1.0,662,693,http://www.flickr.com/photos/91807507@N03/30274253233/,https://creativecommons.org/licenses/by/2.0/,GPS 56,https://www.flickr.com/people/91807507@N03/\n94867dda40b37ccf,https://c1.staticflickr.com/6/5542/30683767556_54e6d47319_o.jpg,0.4375,0.0,1.0,0.75,886,998,https://www.flickr.com/photos/mmmavocado/30683767556/,https://creativecommons.org/licenses/by/2.0/,Malcolm Manners,https://www.flickr.com/people/mmmavocado/\ne86d3240501de2cc,https://c1.staticflickr.com/8/7684/26247186274_78c800d2a4_o.jpg,0.25,0.0,0.75,0.75,519,703,https://www.flickr.com/photos/box_repsol/26247186274,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nfadc7128db36bf61,https://c1.staticflickr.com/9/8855/28366763032_2354ff312e_o.jpg,0.0,0.0,0.75,0.5625,823,758,https://www.flickr.com/photos/mdagdept/28366763032/,https://creativecommons.org/licenses/by/2.0/,MdAgDept,https://www.flickr.com/people/mdagdept/\nec059989d017e677,https://c1.staticflickr.com/8/7398/27128063040_9e2b5e2c63_o.jpg,0.5,0.0,1.0,0.75,426,694,https://www.flickr.com/photos/sarahvain/27128063040,https://creativecommons.org/licenses/by/2.0/,Sarah Stierch,https://www.flickr.com/people/sarahvain/\n6feed34722f237e7,https://c1.staticflickr.com/8/7496/26320693773_b51590bb53_o.jpg,0.28125,0.25,0.84375,1.0,405,933,https://www.flickr.com/photos/39551170@N02/26320693773,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/\na4d8de5ed9daad7a,https://c1.staticflickr.com/8/7533/27739978502_cd63d8b273_o.jpg,0.438430311231,0.0,1.0,1.0,570,574,https://www.flickr.com/photos/transitomedellin/27739978502,https://creativecommons.org/licenses/by/2.0/,Secretar\\303\\255a de Movilidad de Medell\\303\\255n,https://www.flickr.com/people/transitomedellin/\ne2fb2a36879328d6,https://c1.staticflickr.com/9/8139/30151198796_7f548b3512_o.jpg,0.299878836834,0.0,0.899636510501,0.75,95,444,https://www.flickr.com/photos/andymorffew/30151198796,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\n56aeb022610946ff,https://c1.staticflickr.com/1/716/30984539614_9264fd7673_o.jpg,0.0,0.0,0.621710526316,0.75,310,83,https://flickr.com/43272765@N04/30984539614,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n328558f4886154dd,https://c1.staticflickr.com/8/7510/27029142832_e379584840_o.jpg,0.28125,0.0,0.84375,0.75,570,482,https://www.flickr.com/photos/27665395@N05/27029142832,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n8f9c26fa4842489e,https://c1.staticflickr.com/9/8475/28534463493_8a29c6c868_o.jpg,0.25,0.0,1.0,1.0,975,499,https://www.flickr.com/photos/welix/28534463493,https://creativecommons.org/licenses/by/2.0/,Weli&#x27;mi&#x27;nakwan,https://www.flickr.com/people/welix/\n6ffb40ed27f1ea1d,https://c1.staticflickr.com/9/8276/30276366541_060424aaa2_o.jpg,0.0,0.25,0.5,1.0,647,842,https://www.flickr.com/photos/thejointstaff/30276366541/,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/\n2446cc6251657e54,https://c1.staticflickr.com/1/274/31942975694_970ed59a0a_o.jpg,0.28125,0.0,0.84375,0.75,114,8,https://www.flickr.com/photos/scotnelson/31942975694/,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n0dc146817ba15f43,https://c1.staticflickr.com/9/8866/28242908073_27594bb6c5_o.jpg,0.526203208556,0.25,0.789304812834,1.0,971,517,https://www.flickr.com/photos/stephanridgway/28242908073/,https://creativecommons.org/licenses/by/2.0/,Stephan Ridgway,https://www.flickr.com/people/stephanridgway/\n9821d5cb5cee9844,https://c1.staticflickr.com/9/8651/27845346213_b3b4c44f18_o.jpg,0.0,0.0,0.649199417758,1.0,971,102,https://www.flickr.com/photos/jsjgeology/27845346213,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nf410f7e55ab34cd9,https://c1.staticflickr.com/1/709/30920000584_b999554ac0_o.jpg,0.497426470588,0.0,0.994852941176,0.75,744,730,https://www.flickr.com/photos/bvi4092/30920000584,https://creativecommons.org/licenses/by/2.0/,bvi4092,https://www.flickr.com/people/bvi4092/\nd1d5ad9f7db05c65,https://c1.staticflickr.com/1/526/32103155146_c9a9d5a168_o.jpg,0.28125,0.0,0.84375,0.75,625,617,https://www.flickr.com/photos/newcastlelibraries/32103155146,https://creativecommons.org/licenses/by/2.0/,Newcastle Libraries,https://www.flickr.com/people/newcastlelibraries/\n78cc7e87b1c49531,https://c1.staticflickr.com/6/5708/31182535465_e2b18ce9e6_o.jpg,0.0,0.0,0.419028340081,0.75,875,425,https://www.flickr.com/photos/9759010@N07/31182535465,https://creativecommons.org/licenses/by/2.0/,Ken,https://www.flickr.com/people/9759010@N07/\n09a754c424c3fb4f,https://c1.staticflickr.com/9/8685/28362639536_a18ac0c458_o.jpg,0.28125,0.0,0.84375,0.75,975,913,https://www.flickr.com/photos/jsjgeology/28362639536,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n5a40245e1c994e21,https://c1.staticflickr.com/8/7322/26756536054_6bfab4ab37_o.jpg,0.0,0.249631811487,0.75,0.748895434462,653,511,https://www.flickr.com/photos/us_embassy_newzealand/26756536054/,https://creativecommons.org/licenses/by/2.0/,US Embassy,https://www.flickr.com/people/us_embassy_newzealand/\nff691ee265e67513,https://c1.staticflickr.com/9/8070/29539951820_b514fc01f1_o.jpg,0.154485049834,0.0,1.0,1.0,310,48,https://www.flickr.com/photos/gails_pictures/29539951820,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n658a3cc3b21a516d,https://c1.staticflickr.com/2/1449/26145403003_2c89142536_o.jpg,0.0,0.25,0.75,1.0,976,92,https://www.flickr.com/photos/29225212@N08/26145403003,https://creativecommons.org/licenses/by/2.0/,Mark Skarratts,https://www.flickr.com/people/29225212@N08/\n90b1e970fc800c4b,https://c1.staticflickr.com/6/5780/31235083381_ee9e0c741b_o.jpg,0.25,0.0,1.0,1.0,826,107,https://www.flickr.com/photos/jsjgeology/31235083381,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n96f2c8aeef574982,https://c1.staticflickr.com/8/7466/27241125076_9d511ec126_o.jpg,0.4375,0.25,1.0,1.0,874,236,https://www.flickr.com/photos/estudiante/27241125076,https://creativecommons.org/licenses/by/2.0/,Dan,https://www.flickr.com/people/estudiante/\n8fcb1f70b0d807cb,https://c1.staticflickr.com/9/8890/27997582240_62fc0c25b9_o.jpg,0.0,0.0,0.5,0.75,563,812,https://www.flickr.com/photos/harshlight/27997582240,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\nb2e2031dba6d9110,https://c1.staticflickr.com/8/7352/26886474510_9a9c793ee3_o.jpg,0.255022321429,0.25,0.765066964286,1.0,848,704,https://www.flickr.com/photos/13476480@N07/26886474510,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nd1fc118dde717e86,https://c1.staticflickr.com/1/758/30943127713_8421db873d_o.jpg,0.0,0.0,0.5625,0.75,546,372,https://flickr.com/10688882@N00/30943127713,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/\nefd383818235664b,https://c1.staticflickr.com/9/8826/28394077390_eb2cf8eb96_o.jpg,0.0,0.281690140845,0.75,0.845070422535,507,668,http://www.flickr.com/photos/84894254@N03/28394077390,https://creativecommons.org/licenses/by/2.0/,Magdalena Roeseler,https://www.flickr.com/people/magdalenaroeseler/\ne6ce7bdc752558f7,https://c1.staticflickr.com/8/7786/28026219961_47d5e5ba2d_o.jpg,0.0,0.0,0.5625,0.75,512,249,https://www.flickr.com/photos/daveseven/28026219961,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/\n2d39235151ed8bbe,https://c1.staticflickr.com/1/262/31418889390_74084bed01_o.jpg,0.333333333333,0.0,1.0,1.0,661,501,https://www.flickr.com/photos/pasa/31418889390,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n6762025e55997283,https://c1.staticflickr.com/9/8194/29758772402_c1687b6a58_o.jpg,0.25,0.25,1.0,0.75,425,828,https://www.flickr.com/photos/rpavich/29758772402,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/\nb7a519c4f18f35dc,https://c1.staticflickr.com/1/457/31263070774_06a2cc166a_o.jpg,0.0,0.0,1.0,0.96975088968,905,415,https://www.flickr.com/photos/rulenumberone2/31263070774,https://creativecommons.org/licenses/by/2.0/,rulenumberone2,https://www.flickr.com/people/rulenumberone2/\n83a79e1c96a2c3d4,https://c1.staticflickr.com/9/8889/28941004276_884f939e06_o.jpg,0.0,0.25,0.5,1.0,875,472,https://www.flickr.com/photos/kieransphotostream/28941004276,https://creativecommons.org/licenses/by/2.0/,Koex73,https://www.flickr.com/people/kieransphotostream/\n361474ae41fc57b7,https://c1.staticflickr.com/1/686/32042498230_edf603fb8f_o.jpg,0.336764705882,0.0,1.0,1.0,635,81,https://www.flickr.com/photos/agenciabrasilia/32042498230,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n894fa71009a08f15,https://c1.staticflickr.com/9/8784/29844165165_2aaa9657ff_o.jpg,0.0,0.0,0.666666666667,1.0,885,894,https://www.flickr.com/photos/prof_richard/29844165165,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/\ne6b37d9256c0c12d,https://c1.staticflickr.com/8/7072/28032764536_ace5ecb8d6_o.jpg,0.0,0.0,1.0,0.666666666667,638,400,https://www.flickr.com/photos/peterscherub/28032764536,https://creativecommons.org/licenses/by/2.0/,judy dean,https://www.flickr.com/people/peterscherub/\nf580032c69051bf8,https://c1.staticflickr.com/6/5651/30245701914_9d8b8260c3_o.jpg,0.0,0.0,0.733746130031,1.0,396,903,https://www.flickr.com/photos/linvoyage/30245701914,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/\n395827efe97502a2,https://c1.staticflickr.com/1/265/31685645216_acbf427dc8_o.jpg,0.271313364055,0.25,0.813940092166,1.0,580,671,https://www.flickr.com/photos/eebeephoto/31685645216/,https://creativecommons.org/licenses/by/2.0/,Ed Berger,https://www.flickr.com/people/eebeephoto/\n97445f57c27f2d47,https://c1.staticflickr.com/3/2545/32519532420_791c7a408f_o.jpg,0.25,0.0,1.0,1.0,977,796,https://www.flickr.com/photos/davidstanleytravel/32519532420/,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\ne4b30712d50cef1d,https://c1.staticflickr.com/9/8548/29275499636_4f17fbf418_o.jpg,0.0,0.0,0.799676898223,1.0,133,148,https://www.flickr.com/photos/andymorffew/29275499636,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\nf42d4a29adf9fdab,https://c1.staticflickr.com/9/8327/28658951111_5388512345_o.jpg,0.0,0.25,0.75,0.75,442,983,https://www.flickr.com/photos/hirlimann/28658951111,https://creativecommons.org/licenses/by/2.0/,Ludovic Hirlimann,https://www.flickr.com/people/hirlimann/\nae599bfbe60f9cb3,https://c1.staticflickr.com/8/7396/27761678751_a719e5b178_o.jpg,0.0,0.0,1.0,1.0,972,747,https://www.flickr.com/photos/martingarri/27761678751,https://creativecommons.org/licenses/by/2.0/,Martin Garrido,https://www.flickr.com/people/martingarri/\n559e47277444524a,https://c1.staticflickr.com/8/7388/26795017073_fb3ddb3121_o.jpg,0.0,0.0,0.786858974359,1.0,437,812,https://www.flickr.com/photos/eurosporttuning/26795017073,https://creativecommons.org/licenses/by/2.0/,Frank Derks,https://www.flickr.com/people/eurosporttuning/\n89998556679b6187,https://c1.staticflickr.com/6/5765/30854475991_9a9fff12e8_o.jpg,0.0,0.25,0.75,1.0,582,584,https://www.flickr.com/photos/artlung/30854475991,https://creativecommons.org/licenses/by/2.0/,Joe Crawford,https://www.flickr.com/people/artlung/\n0233419c159a2412,https://c1.staticflickr.com/9/8165/27745906263_fe81dd8d43_o.jpg,0.0,0.0,0.666666666667,1.0,960,706,https://www.flickr.com/photos/jmh-pics/27745906263,https://creativecommons.org/licenses/by/2.0/,Jan Mark Holzer,https://www.flickr.com/people/jmh-pics/\n8f7fcccbd5d77137,https://c1.staticflickr.com/1/491/31050374504_724f43a02f_o.jpg,0.0,0.0,0.75,0.75,825,788,https://flickr.com/52066925@N00/31050374504,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/\nf67c6df686c18aba,https://c1.staticflickr.com/9/8579/29585778993_6ef1054a62_o.jpg,0.0,0.330871491876,1.0,1.0,407,611,https://www.flickr.com/photos/eltb/29585778993,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n382ef525198b959e,https://c1.staticflickr.com/9/8451/29527354530_c777b7ea9c_o.jpg,0.0,0.0,0.587060702875,0.75,265,578,https://www.flickr.com/photos/calliope/29527354530,https://creativecommons.org/licenses/by/2.0/,liz west,https://www.flickr.com/people/calliope/\nc162b94ff3381024,https://c1.staticflickr.com/9/8538/29608701050_00effef96d_o.jpg,0.0,0.25,0.5625,1.0,874,759,https://www.flickr.com/photos/127226743@N02/29608701050,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\nd3773c79f0669d54,https://c1.staticflickr.com/8/7297/28182565672_eb6ef6a16b_o.jpg,0.0,0.0,0.907056798623,1.0,309,731,https://www.flickr.com/photos/linsepatron/28182565672/,https://creativecommons.org/licenses/by/2.0/,Line Sabroe,https://www.flickr.com/people/linsepatron/\n95a029749845b857,https://c1.staticflickr.com/8/7659/26217470653_5666790c94_o.jpg,0.0,0.0,0.554347826087,0.75,548,562,https://www.flickr.com/photos/trolleway/26217470653/,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/\na14bbb59334f2149,https://c1.staticflickr.com/9/8127/29818159100_72f8844620_o.jpg,0.25,0.25,0.75,1.0,561,228,https://www.flickr.com/photos/codnewsroom/29818159100,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\naf124fbb600e535e,https://c1.staticflickr.com/9/8012/28533117934_ae1f3e25d8_o.jpg,0.28125,0.0,0.84375,0.75,875,423,https://www.flickr.com/photos/alper/28533117934,https://creativecommons.org/licenses/by/2.0/,Alper \\303\\207u\\304\\237un,https://www.flickr.com/people/alper/\n2666fa6693af3050,https://c1.staticflickr.com/9/8482/28824490374_3974fbe728_o.jpg,0.0,0.5,0.75,1.0,857,625,https://www.flickr.com/photos/zigazou76/28824490374,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\na6226e2dce2a68aa,https://c1.staticflickr.com/9/8237/28546433013_a39c7c9408_o.jpg,0.0,0.0,0.599757673667,0.75,515,601,https://www.flickr.com/photos/larry1732/28546433013,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/\n826c2d54adef0c9a,https://c1.staticflickr.com/4/3923/32400195373_49ac1532dc_o.jpg,0.5,0.25,1.0,1.0,108,377,https://www.flickr.com/photos/chad_sparkes/32400195373,https://creativecommons.org/licenses/by/2.0/,Chad Sparkes,https://www.flickr.com/people/chad_sparkes/\n43fc9de02f6b5d28,https://c1.staticflickr.com/9/8393/29448302593_2082a11a68_o.jpg,0.0,0.0,0.666666666667,1.0,561,812,https://flickr.com/48542161@N04/29448302593,https://creativecommons.org/licenses/by/2.0/,Max Goldberg,https://www.flickr.com/people/max-goldberg/\n8a9b656eab3a1ff9,https://c1.staticflickr.com/8/7484/29357000516_bb90776bed_o.jpg,0.257672155689,0.0,0.773016467066,0.75,309,330,https://www.flickr.com/photos/42244964@N03/29357000516,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/\n837c8620e10fa557,https://c1.staticflickr.com/6/5528/29943287876_a2311f3670_o.jpg,0.5,0.25,1.0,1.0,991,573,https://www.flickr.com/photos/sucriertt/29943287876,https://creativecommons.org/licenses/by/2.0/,Feroze Omardeen,https://www.flickr.com/people/sucriertt/\nc459a562734cd971,https://c1.staticflickr.com/8/7737/28285793291_d085aef7bf_o.jpg,0.545358649789,0.25,1.0,1.0,752,839,https://www.flickr.com/photos/95472204@N03/28285793291,https://creativecommons.org/licenses/by/2.0/,Andrew &amp; Alan Frost,https://www.flickr.com/people/95472204@N03/\nfd79d55498824520,https://c1.staticflickr.com/9/8665/28026599983_5cf819e1b5_o.jpg,0.2806640625,0.0,0.8419921875,0.75,318,336,https://www.flickr.com/photos/treegrow/28026599983/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n994fbc8383a07e54,https://c1.staticflickr.com/1/355/31966431426_91189b87cb_o.jpg,0.0,0.25,0.537844036697,1.0,629,93,https://www.flickr.com/photos/jlcernadas/31966431426/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\nfed194bf3b56fba7,https://c1.staticflickr.com/6/5718/30415657710_16e4f10804_o.jpg,0.0,0.0,0.496696035242,0.75,326,113,https://flickr.com/25733107@N04/30415657710,https://creativecommons.org/licenses/by/2.0/,Aah-Yeah,https://www.flickr.com/people/aah-yeah/\n647b4857d92cc211,https://c1.staticflickr.com/6/5594/29709037893_1b2a8dae3c_o.jpg,0.2806640625,0.0,0.8419921875,0.75,676,258,https://www.flickr.com/photos/southbeachcars/29709037893,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n7860a041f0c076cd,https://c1.staticflickr.com/8/7463/27980245440_320c02e3c9_o.jpg,0.25,0.25,0.75,1.0,709,578,https://www.flickr.com/photos/renaud-camus/27980245440/?map=1,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/\ned7002893bc2f4c7,https://c1.staticflickr.com/3/2772/33058537475_52d61da4bf_o.jpg,0.25,0.0,0.75,0.75,868,231,https://www.flickr.com/photos/76969036@N02/33058537475/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n77542b97f0049769,https://c1.staticflickr.com/8/7773/29421177033_6a6b33f045_o.jpg,0.0,0.0,0.403311258278,0.75,459,748,https://www.flickr.com/photos/eltb/29421177033,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n564460cc9be9be61,https://c1.staticflickr.com/1/274/32364459001_74cd217de6_o.jpg,0.456338028169,0.0,0.912676056338,0.75,93,458,https://www.flickr.com/photos/dkeats/32364459001,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\ncf78f63c54187bec,https://c1.staticflickr.com/4/3841/33086599681_35a7848664_o.jpg,0.4375,0.25,1.0,1.0,735,95,https://www.flickr.com/photos/27665395@N05/33086599681/,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n2621772a490cd0de,https://c1.staticflickr.com/6/5669/30977168166_1f49b257f4_o.jpg,0.0,0.25,0.665816326531,1.0,820,781,http://www.flickr.com/photos/rarvesen/30977168166/,https://creativecommons.org/licenses/by/2.0/,Ralph Arvesen,https://www.flickr.com/people/rarvesen/\n3d6dcdafbb9dc27b,https://c1.staticflickr.com/6/5162/30237625155_1e08eb7500_o.jpg,0.498159057437,0.25,0.996318114875,1.0,561,691,https://www.flickr.com/photos/eaglebrook/30237625155,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/\n517b88ad5ffd2fdf,https://c1.staticflickr.com/6/5458/30010629873_ca90218b76_o.jpg,0.0,0.0,0.747269890796,1.0,912,432,https://www.flickr.com/photos/happyskrappy/30010629873,https://creativecommons.org/licenses/by/2.0/,jenn,https://www.flickr.com/people/happyskrappy/\nbf1f5852338a59a0,https://c1.staticflickr.com/8/7089/26249653033_6048fda7a3_o.jpg,0.528938906752,0.0,0.881564844587,1.0,136,152,https://www.flickr.com/photos/lakeworth/26249653033,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/\nde236ab325734421,https://c1.staticflickr.com/6/5793/29696902090_e966724fc4_o.jpg,0.0458553791887,0.0,1.0,1.0,717,513,https://www.flickr.com/photos/13476480@N07/29696902090,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n26dab12c8c3812b8,https://c1.staticflickr.com/1/533/31762062631_e3776379a4_o.jpg,0.0,0.0,0.75,0.75,405,151,https://flickr.com/47224062@N03/31762062631,https://creativecommons.org/licenses/by/2.0/,Icaro Ferracini,https://www.flickr.com/people/icaroferracini/\n5685f380cdfd6bdb,https://c1.staticflickr.com/8/7296/26787580190_e667de75f7_o.jpg,0.499263622975,0.0,0.99852724595,0.75,718,107,https://www.flickr.com/photos/greggjerdingen/26787580190/,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nec422b98fc566186,https://c1.staticflickr.com/9/8029/29448876685_e910855ff6_o.jpg,0.0,0.0,0.508928571429,0.75,971,851,https://www.flickr.com/photos/linvoyage/29448876685,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/\nb0cf369571eb56b7,https://c1.staticflickr.com/9/8686/28597399595_1fd81114c6_o.jpg,0.327407407407,0.0,1.0,1.0,985,954,https://flickr.com/33497841@N02/28597399595,https://creativecommons.org/licenses/by/2.0/,Andrey Zharkikh,https://www.flickr.com/people/zharkikh/\n75307fc8548a1f68,https://c1.staticflickr.com/9/8644/30280625356_bf0f68e780_o.jpg,0.28125,0.25,0.84375,1.0,346,576,http://www.flickr.com/photos/eamoncurry/30280625356/,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/\n84958e67e869a4ab,https://c1.staticflickr.com/8/7577/28396934462_ea64974e9c_o.jpg,0.0,0.0,0.663235294118,1.0,626,929,https://www.flickr.com/photos/slgc/28396934462,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\naed5042a1020173c,https://c1.staticflickr.com/1/573/31411640740_99be7dd88e_o.jpg,0.5,0.25,1.0,1.0,404,828,https://www.flickr.com/photos/usnavy/31411640740,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n29aa4abd5ec26581,https://c1.staticflickr.com/6/5782/30742114125_67787e684a_o.jpg,0.498159057437,0.25,0.996318114875,1.0,608,624,https://flickr.com/69384212@N04/30742114125,https://creativecommons.org/licenses/by/2.0/,Lws &amp; Clrk,https://www.flickr.com/people/lewis-clark/\nc4aa9d77cb1b4927,https://c1.staticflickr.com/9/8137/30039197630_c2fabe1854_o.jpg,0.333333333333,0.0,1.0,1.0,854,557,https://www.flickr.com/photos/slapers/30039197630,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\n31039bd613c75ef9,https://c1.staticflickr.com/9/8455/29775141261_96202ac088_o.jpg,0.0,0.0,0.515344311377,0.75,618,393,https://flickr.com/38014693@N04/29775141261,https://creativecommons.org/licenses/by/2.0/,Governo do Estado de S\\303\\243o Paulo,https://www.flickr.com/people/governosp/\n56112174c8c0de61,https://c1.staticflickr.com/9/8463/29691928466_1cb8bd35ba_o.jpg,0.0,0.25,0.501846381093,1.0,539,828,https://www.flickr.com/photos/akras/29691928466,https://creativecommons.org/licenses/by/2.0/,Andrey,https://www.flickr.com/people/akras/\nbb67780f32491734,https://c1.staticflickr.com/6/5652/30883107485_ee1a53b58b_o.jpg,0.0,0.0,0.75,1.0,163,389,https://www.flickr.com/photos/ruthanddave/30883107485,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n0e6eddca6228ef7c,https://c1.staticflickr.com/9/8106/28256568960_84fecd9757_o.jpg,0.0,0.25,0.561328125,1.0,664,789,https://www.flickr.com/photos/marsupilami92/28256568960,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\nb4da4e4c923c953c,https://c1.staticflickr.com/8/7707/29133731892_08abc2c3f5_o.jpg,0.28125,0.25,0.84375,1.0,548,662,https://www.flickr.com/photos/trolleway/29133731892/,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/\n030c68053c2778bd,https://c1.staticflickr.com/9/8136/29586786723_3ccaef6e64_o.jpg,0.0,0.0,0.665684830633,1.0,885,118,https://www.flickr.com/photos/martius/29586786723/,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\n0642780a60983569,https://c1.staticflickr.com/9/8745/28343518894_c2b78c1d13_o.jpg,0.5,0.25,1.0,1.0,896,856,https://www.flickr.com/photos/elsie/28343518894/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\n3bcdf6695c707c61,https://c1.staticflickr.com/9/8357/29099474294_358d0283a7_o.jpg,0.0,0.0,0.666666666667,1.0,980,428,http://www.flickr.com/photos/amslerpix/29099474294/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\nb8a4c5b160a2027c,https://c1.staticflickr.com/9/8441/28592091365_6a551c4771_o.jpg,0.25,0.0,0.75,0.75,428,622,https://www.flickr.com/photos/sterlingcollege/28592091365/,https://creativecommons.org/licenses/by/2.0/,Sterling College,https://www.flickr.com/people/sterlingcollege/\nfce9b52c90c9997e,https://c1.staticflickr.com/9/8861/28488132142_72d7f4d20f_o.jpg,0.278188180404,0.0,0.834564541213,0.75,875,677,https://www.flickr.com/photos/didbygraham/28488132142,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n65ce68b28671f73e,https://c1.staticflickr.com/1/293/32196905736_7c89181e47_o.jpg,0.25,0.25,0.75,1.0,719,586,https://www.flickr.com/photos/romanboed/32196905736,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/\n7a2313fbcedcbe22,https://c1.staticflickr.com/9/8268/29092236470_5b9da0ef79_o.jpg,0.0,0.0,0.75,0.5625,653,142,https://www.flickr.com/photos/quinet/29092236470/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n5085bbb36515834f,https://c1.staticflickr.com/8/7352/27673981061_48ef162039_o.jpg,0.25,0.0,1.0,0.75,418,588,https://www.flickr.com/photos/thomaspurves/27673981061,https://creativecommons.org/licenses/by/2.0/,Tom Purves,https://www.flickr.com/people/thomaspurves/\n72dff1bff620f618,https://c1.staticflickr.com/9/8562/29388220405_68c75e85df_o.jpg,0.25,0.25,0.75,1.0,863,424,https://www.flickr.com/photos/agenciabrasilia/29388220405,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n6d48d7b1238c5d8d,https://c1.staticflickr.com/9/8452/29591539195_af1acb82a3_o.jpg,0.0,0.0,0.75,0.5,973,479,https://www.flickr.com/photos/quinet/29591539195,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n57d1361e30f54c93,https://c1.staticflickr.com/6/5604/30411899672_a4c9e01257_o.jpg,0.0,0.0,0.5,0.75,431,682,https://flickr.com/51735829@N00/30411899672,https://creativecommons.org/licenses/by/2.0/,Dave n Laura,https://www.flickr.com/people/lauraanddave/\nca31395e1a54ce30,https://c1.staticflickr.com/8/7212/27153875976_f29075f182_o.jpg,0.28125,0.25,0.84375,1.0,657,867,https://www.flickr.com/photos/27665395@N05/27153875976,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n69cba04e99e74e91,https://c1.staticflickr.com/9/8082/29780987721_244aa630c4_o.jpg,0.0,0.419316375199,0.75,1.0,582,648,https://www.flickr.com/photos/hugo90/29780987721,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n2443c73a65826558,https://c1.staticflickr.com/9/8003/29082005145_fb4369cbb3_o.jpg,0.25,0.25,0.75,1.0,455,288,https://www.flickr.com/photos/boristhaser/29082005145,https://creativecommons.org/licenses/by/2.0/,Boris Thaser,https://www.flickr.com/people/boristhaser/\n62bf8f1aca3933ec,https://c1.staticflickr.com/9/8158/29270125475_0e5fc00d80_o.jpg,0.0,0.0,0.75,0.565438871473,407,656,https://www.flickr.com/photos/eltb/29270125475,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n38d50454657fe7f0,https://c1.staticflickr.com/8/7625/27202554790_2849f2bc07_o.jpg,0.4375,0.25,1.0,1.0,151,889,https://www.flickr.com/photos/amanderson/27202554790,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n77963a8fcd9d3815,https://c1.staticflickr.com/9/8304/28432708504_bff2971569_o.jpg,0.0,0.0,0.75,0.535877862595,541,579,https://www.flickr.com/photos/atoach/28432708504/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\ne67ab4ba4bb4dea9,https://c1.staticflickr.com/9/8201/29529180516_295ea3d000_o.jpg,0.258620689655,0.25,0.775862068966,1.0,922,786,https://www.flickr.com/photos/yalelawlibrary/29529180516,https://creativecommons.org/licenses/by/2.0/,Yale Law Library,https://www.flickr.com/people/yalelawlibrary/\n471331bfea881dae,https://c1.staticflickr.com/8/7211/27310081935_d2c80e2bb8_o.jpg,0.306930693069,0.0,0.920792079208,1.0,821,944,https://www.flickr.com/photos/16179216@N07/27310081935/,https://creativecommons.org/licenses/by/2.0/,Barry Lewis,https://www.flickr.com/people/16179216@N07/\nea8362b1ea8764b8,https://c1.staticflickr.com/9/8726/29583628221_f4f930dfa1_o.jpg,0.0,0.25,0.471030042918,1.0,982,692,https://www.flickr.com/photos/apardavila/29583628221,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n3ecbd108c7a4a59a,https://c1.staticflickr.com/6/5601/30176824744_a6551f70d5_o.jpg,0.0,0.25,0.497426470588,1.0,405,801,https://flickr.com/34153108@N06/30176824744,https://creativecommons.org/licenses/by/2.0/,Gerard van der Schaaf,https://www.flickr.com/people/34153108@N06/\ned9d3ed4416fd039,https://c1.staticflickr.com/6/5540/31129728156_d2722fdc37_o.jpg,0.438430311231,0.0,1.0,1.0,33,755,https://www.flickr.com/photos/usfws_pacificsw/31129728156,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/\n5121873f03384771,https://c1.staticflickr.com/6/5479/30694722112_314b552607_o.jpg,0.248713235294,0.0,0.746139705882,0.75,581,481,https://www.flickr.com/photos/agenciabrasilia/30694722112,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\ne039b480f13cfa77,https://c1.staticflickr.com/9/8860/28783445131_6a14fdf3a4_o.jpg,0.0,0.0,1.0,0.75117370892,407,124,https://www.flickr.com/photos/eltb/28783445131,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\neba74af87036309b,https://c1.staticflickr.com/6/5685/30685445782_4a96f2c706_o.jpg,0.282131661442,0.25,0.846394984326,1.0,12,721,https://www.flickr.com/photos/taylar/30685445782,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/\n84b42fffa7927f00,https://c1.staticflickr.com/9/8186/28946902624_f7639422d9_o.jpg,0.25,0.25,1.0,1.0,970,696,https://www.flickr.com/photos/jcbrandon/28946902624,https://creativecommons.org/licenses/by/2.0/,Farther Along,https://www.flickr.com/people/jcbrandon/\n8f7629134e069cc2,https://c1.staticflickr.com/8/7642/27156804385_81f0ef9394_o.jpg,0.195822454308,0.0,0.587467362924,0.75,780,672,https://www.flickr.com/photos/thoseguys119/27156804385,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nf28f903cdb956e13,https://c1.staticflickr.com/1/286/31711157641_b206eaee23_o.jpg,0.28125,0.25,0.84375,1.0,33,779,https://flickr.com/146378829@N04/31711157641,https://creativecommons.org/licenses/by/2.0/,Alanah Nasadyk,https://www.flickr.com/people/146378829@N04/\nbeeecacedee95b9b,https://c1.staticflickr.com/9/8464/29230149522_e135af862c_o.jpg,0.0,0.0,0.665684830633,1.0,404,190,https://www.flickr.com/photos/usmcarchives/29230149522,https://creativecommons.org/licenses/by/2.0/,USMC Archives,https://www.flickr.com/people/usmcarchives/\nc5e9f25a84c6a7ef,https://c1.staticflickr.com/6/5631/30573815501_c19947725f_o.jpg,0.0,0.25,0.5,1.0,561,803,https://flickr.com/53276480@N07/30573815501,https://creativecommons.org/licenses/by/2.0/,Maize &amp; Blue Nation,https://www.flickr.com/people/maizenbluenation/\nc31029c3ddc87098,https://c1.staticflickr.com/6/5682/30421980474_0c9e0e020f_o.jpg,0.0,0.0,0.75,0.5,312,994,https://flickr.com/52450054@N04/30421980474,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n485e14444aa4aed3,https://c1.staticflickr.com/1/334/30689857534_03594aec66_o.jpg,0.0,0.0,0.75,0.75,539,817,https://flickr.com/135797038@N08/30689857534,https://creativecommons.org/licenses/by/2.0/,So Many Desks,https://www.flickr.com/people/somanydesks/\n8bf9b171bbc22efc,https://c1.staticflickr.com/6/5575/30921758832_9ed9bd9e69_o.jpg,0.237949640288,0.25,0.713848920863,1.0,604,486,https://www.flickr.com/photos/thomasfisherlibrary/30921758832/,https://creativecommons.org/licenses/by/2.0/,\"Thomas Fisher Rare Book Library, UofT\",https://www.flickr.com/people/thomasfisherlibrary/\n557003bf047b560f,https://c1.staticflickr.com/9/8708/27664686744_fcd18d61c6_o.jpg,0.4375,0.25,1.0,1.0,976,817,https://www.flickr.com/photos/phelyan/27664686744/,https://creativecommons.org/licenses/by/2.0/,Phelyan Sanjoin,https://www.flickr.com/people/phelyan/\n9f7aef192b8fa8b3,https://c1.staticflickr.com/9/8133/30103273002_49907765c7_o.jpg,0.0,0.0,0.5,0.75,477,639,http://www.flickr.com/photos/8176740@N05/30103273002,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\n7acdc4decdc0fef2,https://c1.staticflickr.com/9/8841/27934444864_2922d006f6_o.jpg,0.0,0.0,0.75,1.0,975,754,https://www.flickr.com/photos/jsjgeology/27934444864,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nc64006ae09b27ec8,https://c1.staticflickr.com/8/7459/26889035454_c1096f1800_o.jpg,0.25,0.25,0.75,1.0,980,565,https://www.flickr.com/photos/valthorensguide/26889035454,https://creativecommons.org/licenses/by/2.0/,David Mitchell,https://www.flickr.com/people/valthorensguide/\n783b77fc4444708b,https://c1.staticflickr.com/8/7070/26750925261_3765a76918_o.jpg,0.5,0.0,1.0,0.75,830,586,https://www.flickr.com/photos/peter-trimming/26750925261/,https://creativecommons.org/licenses/by/2.0/,Peter Trimming,https://www.flickr.com/people/peter-trimming/\nbe9cf8a8b9de2376,https://c1.staticflickr.com/9/8446/27828530294_d0eb8245f6_o.jpg,0.281165311653,0.0,0.843495934959,1.0,808,102,https://www.flickr.com/photos/rvwithtito/27828530294/,https://creativecommons.org/licenses/by/2.0/,RVWithTito.com,https://www.flickr.com/people/rvwithtito/\nbdb95712664d9e5f,https://c1.staticflickr.com/8/7307/27430765713_5f796b6e5b_o.jpg,0.25,0.0,0.75,0.75,405,732,https://www.flickr.com/photos/markyharky/27430765713/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n6985406661938601,https://c1.staticflickr.com/9/8552/29251374173_e66a29ba12_o.jpg,0.346121416526,0.25,1.0,1.0,309,146,https://www.flickr.com/photos/gails_pictures/29251374173,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n4f31358268225536,https://c1.staticflickr.com/9/8711/28380739570_9ca0911990_o.jpg,0.0,0.0,0.640173410405,1.0,734,614,https://www.flickr.com/photos/13476480@N07/28380739570,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nc3925aca6643a543,https://c1.staticflickr.com/8/7719/27089871631_0af1c167c6_o.jpg,0.0,0.0,0.475899280576,0.75,780,72,https://www.flickr.com/photos/thoseguys119/27089871631,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n30d06d021ee9e8dd,https://c1.staticflickr.com/9/8776/28198767894_2cd0367367_o.jpg,0.438671875,0.25,1.0,1.0,997,810,https://www.flickr.com/photos/treegrow/28198767894,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\neeb541fd8ea08353,https://c1.staticflickr.com/6/5701/30886238101_9a34298857_o.jpg,0.0,0.25,0.5,1.0,973,537,https://flickr.com/135146612@N03/30886238101,https://creativecommons.org/licenses/by/2.0/,Weekend Wayfarers,https://www.flickr.com/people/135146612@N03/\n16c67aa07888528d,https://c1.staticflickr.com/8/7758/27835756243_50322ec4fc_o.jpg,0.0,0.0,0.5,0.75,484,357,https://www.flickr.com/photos/tipsfortravellers/27835756243,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n51d545471e30a2e7,https://c1.staticflickr.com/8/7276/27540823735_94957a61a8_o.jpg,0.25,0.28125,1.0,0.84375,702,510,https://www.flickr.com/photos/7armyjmtc/27540823735,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n8d026a82f7149f51,https://c1.staticflickr.com/9/8631/28316802542_21acdb9224_o.jpg,0.400242326333,0.25,1.0,1.0,739,687,https://www.flickr.com/photos/ericrosenbaum/28316802542,https://creativecommons.org/licenses/by/2.0/,Eric Rosenbaum,https://www.flickr.com/people/ericrosenbaum/\ncd2027f2ef2bad13,https://c1.staticflickr.com/9/8357/28576417850_a7dd807b09_o.jpg,0.25,0.476244343891,1.0,1.0,709,344,https://www.flickr.com/photos/22711505@N05/28576417850,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n38b1bbd717f6e77b,https://c1.staticflickr.com/4/3948/32872085060_93d228fda0_o.jpg,0.0,0.25,0.506305637982,1.0,826,468,https://www.flickr.com/photos/jsjgeology/32872085060,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n070fdf97b04a48b3,https://c1.staticflickr.com/8/7555/27549752220_695c7548ec_o.jpg,0.0,0.0,0.514248704663,1.0,115,324,https://www.flickr.com/photos/scotnelson/27549752220,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n9552c19d7e2bca89,https://c1.staticflickr.com/6/5805/29673982384_a769d5b5e1_o.jpg,0.0,0.333333333333,1.0,1.0,948,490,https://flickr.com/119630347@N06/29673982384,https://creativecommons.org/licenses/by/2.0/,keith gallie,https://www.flickr.com/people/keefio/\n7627a84bd3a98a83,https://c1.staticflickr.com/6/5499/29694689793_da47cf877b_o.jpg,0.0,0.0,0.395454545455,1.0,780,467,https://www.flickr.com/photos/thoseguys119/29694689793,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n56f3542e14bacdff,https://c1.staticflickr.com/1/423/31205501720_74e365d8e1_o.jpg,0.263565891473,0.0,1.0,1.0,323,40,https://www.flickr.com/photos/gails_pictures/31205501720,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n3297efead7d32e38,https://c1.staticflickr.com/1/641/31682585402_88328f49d9_o.jpg,0.25,0.25,0.75,1.0,979,566,https://flickr.com/97044517@N04/31682585402,https://creativecommons.org/licenses/by/2.0/,Lars Ploug-S\\303\\270rensen,https://www.flickr.com/people/plougsorensen/\na81dc3dc71e6e04d,https://c1.staticflickr.com/6/5741/30623540545_7071123126_o.jpg,0.267938931298,0.0,0.803816793893,0.75,880,394,https://www.flickr.com/photos/40441865@N08/30623540545,https://creativecommons.org/licenses/by/2.0/,mitchell haindfield,https://www.flickr.com/people/40441865@N08/\n418ea9dad45595d9,https://c1.staticflickr.com/9/8004/29131347565_976f176046_o.jpg,0.254464285714,0.25,0.763392857143,1.0,429,29,https://www.flickr.com/photos/garlandcannon/29131347565,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/\nbda1d2236583367a,https://c1.staticflickr.com/9/8436/28692914810_0e888b3e29_o.jpg,0.0,0.0,0.5625,0.75,792,669,https://www.flickr.com/photos/10515323@N08/28692914810,https://creativecommons.org/licenses/by/2.0/,Hazel Nicholson,https://www.flickr.com/people/10515323@N08/\nc63a1e5c6861c194,https://c1.staticflickr.com/6/5443/30351926664_1e19358eab_o.jpg,0.28125,0.0,0.84375,0.75,626,848,https://www.flickr.com/photos/garryknight/30351926664,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\ne38149be6618db5d,https://c1.staticflickr.com/9/8434/29163720990_6dd70519f9_o.jpg,0.4375,0.25,1.0,1.0,986,897,https://www.flickr.com/photos/torsten-behrens/29163720990,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/\na30d09723ea2d470,https://c1.staticflickr.com/6/5329/30428022622_1f613b655a_o.jpg,0.25,0.0,1.0,0.75,971,815,https://www.flickr.com/photos/rvoegtli/30428022622/,https://creativecommons.org/licenses/by/2.0/,Rosmarie Voegtli,https://www.flickr.com/people/rvoegtli/\nd067d31645d501ef,https://c1.staticflickr.com/9/8691/28443781445_fd90c7aa47_o.jpg,0.28125,0.25,0.84375,1.0,780,389,https://www.flickr.com/photos/119034083@N02/28443781445,https://creativecommons.org/licenses/by/2.0/,nybuspics,https://www.flickr.com/people/119034083@N02/\n1864b9416370c851,https://c1.staticflickr.com/8/7741/27321838121_b3435f9810_o.jpg,0.249079528719,0.25,0.747238586156,1.0,604,656,https://www.flickr.com/photos/londonmatt/27321838121,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\nafa01ad786b66529,https://c1.staticflickr.com/9/8806/29503639764_4cdde02f9d_o.jpg,0.5,0.25,1.0,1.0,404,46,https://www.flickr.com/photos/usnavy/29503639764,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n3c7d9aa291688ebd,https://c1.staticflickr.com/9/8600/28620694595_7f5e0d8b6d_o.jpg,0.43661971831,0.0,1.0,0.75,127,984,https://www.flickr.com/photos/treegrow/28620694595/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n70ef4858481e66b9,https://c1.staticflickr.com/8/7176/26903297972_0711470d1c_o.jpg,0.46493902439,0.0,1.0,0.75,964,157,https://www.flickr.com/photos/ruthanddave/26903297972/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n8316ba0f531fad9f,https://c1.staticflickr.com/8/7444/27932136736_9374df3471_o.jpg,0.280784844384,0.0,0.842354533153,1.0,673,870,https://flickr.com/37922399@N05/27932136736,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n7f6d8a15cec61bc8,https://c1.staticflickr.com/9/8475/28264251200_55f2796260_o.jpg,0.480855855856,0.25,1.0,1.0,144,423,https://www.flickr.com/photos/25553993@N02/28264251200/,https://creativecommons.org/licenses/by/2.0/,Kev Chapman,https://www.flickr.com/people/25553993@N02/\n00c290a290534440,https://c1.staticflickr.com/6/5647/31130082665_914d94fcc9_o.jpg,0.5,0.25,1.0,1.0,973,267,https://www.flickr.com/photos/clairity/31130082665,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\n21112149d8e4d116,https://c1.staticflickr.com/9/8244/29736684056_d41d206c49_o.jpg,0.0,0.0,1.0,0.75,600,673,https://www.flickr.com/photos/garlandcannon/29736684056,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/\ncf750ad0576fc8a6,https://c1.staticflickr.com/9/8110/29872852795_0ff32dc56f_o.jpg,0.0,0.0,0.666666666667,1.0,606,557,https://www.flickr.com/photos/janitors/29872852795,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n4162bf598f15bf78,https://c1.staticflickr.com/9/8131/30165532185_ec71243097_o.jpg,0.0,0.0,0.666666666667,1.0,980,922,https://www.flickr.com/photos/alaska_region/30165532185,https://creativecommons.org/licenses/by/2.0/,USDA Forest Service Alaska Region,https://www.flickr.com/people/alaska_region/\n390a0d9986a6710e,https://c1.staticflickr.com/1/604/32463410642_d7b44ba09e_o.jpg,0.229667609618,0.25,0.689002828854,1.0,431,290,https://www.flickr.com/photos/viumariners/32463410642/,https://creativecommons.org/licenses/by/2.0/,VIU Mariners,https://www.flickr.com/people/viumariners/\nc720fc6cfb89e3e3,https://c1.staticflickr.com/9/8111/28932536731_4d0442f0f3_o.jpg,0.333333333333,0.0,1.0,1.0,417,851,https://www.flickr.com/photos/fotosagenciabrasil/28932536731,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/\nb0f973d5662aac61,https://c1.staticflickr.com/8/7233/26261709574_e1c9139194_o.jpg,0.331617647059,0.0,0.994852941176,1.0,706,871,https://www.flickr.com/photos/shankaronline/26261709574,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n30a26012f3ba7aa6,https://c1.staticflickr.com/8/7064/26530906274_9538372f61_o.jpg,0.32700729927,0.0,0.98102189781,1.0,548,596,https://www.flickr.com/photos/robdammers/26530906274,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\nd0f0a97371490ea8,https://c1.staticflickr.com/8/7080/27600104456_5b8bae56cd_o.jpg,0.0,0.0,1.0,0.657393850659,407,814,https://www.flickr.com/photos/eltb/27600104456,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nc9aa364f27386ef6,https://c1.staticflickr.com/8/7294/26985045545_9ce9bb6847_o.jpg,0.25,0.0,0.75,0.75,848,576,https://www.flickr.com/photos/7armyjmtc/26985045545,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n58c4788adb094b2f,https://c1.staticflickr.com/8/7332/27104706172_cfc064a95e_o.jpg,0.371487603306,0.0,1.0,0.75,780,218,https://www.flickr.com/photos/thoseguys119/27104706172,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n682b38680fc040ee,https://c1.staticflickr.com/9/8679/30296688752_085a8a90f2_o.jpg,0.198707592892,0.0,1.0,1.0,959,291,https://www.flickr.com/photos/torontohistory/30296688752,https://creativecommons.org/licenses/by/2.0/,Toronto History,https://www.flickr.com/people/torontohistory/\n88cc9c866912bb77,https://c1.staticflickr.com/6/5527/30647215664_729c2a8d2e_o.jpg,0.0,0.25,0.53506097561,1.0,971,542,https://www.flickr.com/photos/ruthanddave/30647215664,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n531e1dc1a349a4a5,https://c1.staticflickr.com/8/7434/28100093945_ae00c6842c_o.jpg,0.333333333333,0.0,1.0,1.0,875,668,https://www.flickr.com/photos/km30192002/28100093945,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/\n9ae77e61affa68c1,https://c1.staticflickr.com/6/5471/29801296414_4daf55b9f6_o.jpg,0.5,0.25,1.0,1.0,913,518,https://www.flickr.com/photos/usfwsmtnprairie/29801296414,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\nda49c4bd1f22dda4,https://c1.staticflickr.com/9/8009/29056978703_77538201ec_o.jpg,0.250923190547,0.25,0.75276957164,1.0,289,246,https://www.flickr.com/photos/usfwshq/29056978703,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/\ne195beba96d8a70f,https://c1.staticflickr.com/9/8600/27999426663_6eea641722_o.jpg,0.25,0.0,1.0,1.0,437,810,https://www.flickr.com/photos/65843623@N02/27999426663,https://creativecommons.org/licenses/by/2.0/,Alberto from Spain,https://www.flickr.com/people/65843623@N02/\n68a3a7fccc5243c0,https://c1.staticflickr.com/9/8518/28854990806_d6472f5218_o.jpg,0.0,0.0,0.5625,0.75,577,710,https://www.flickr.com/photos/64667184@N02/28854990806/,https://creativecommons.org/licenses/by/2.0/,James Abbott,https://www.flickr.com/people/jamesabbott1963/\ndd1996d05bed1259,https://c1.staticflickr.com/6/5832/30802462922_54a9a49c79_o.jpg,0.0,0.0,1.0,1.0,699,58,https://www.flickr.com/photos/catsper/30802462922,https://creativecommons.org/licenses/by/2.0/,J c,https://www.flickr.com/people/catsper/\nd419872a0ca20782,https://c1.staticflickr.com/6/5705/30088551103_06be1fe185_o.jpg,0.0,0.25,0.75,1.0,820,391,https://www.flickr.com/photos/zaffi/30088551103,https://creativecommons.org/licenses/by/2.0/,Raffi Asdourian,https://www.flickr.com/people/zaffi/\n76741c5d63a56011,https://c1.staticflickr.com/8/7094/26778467563_fba7edecef_o.jpg,0.0,0.0,1.0,1.0,976,599,https://www.flickr.com/photos/rvc/26778467563/,https://creativecommons.org/licenses/by/2.0/,Rafael Vianna Croffi,https://www.flickr.com/people/rvc/\n0d96a2b5331ae369,https://c1.staticflickr.com/1/562/32520553416_a1579ee449_o.jpg,0.0,0.0,0.666666666667,1.0,105,366,https://www.flickr.com/photos/rexness/32520553416,https://creativecommons.org/licenses/by/2.0/,Rexness,https://www.flickr.com/people/rexness/\n1a31aebfb1aed595,https://c1.staticflickr.com/1/260/31812953540_da4ef6816e_o.jpg,0.305359661495,0.0,0.916078984485,1.0,948,210,https://www.flickr.com/photos/gaby1/31812953540,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\n89b8cfdccad2d38c,https://c1.staticflickr.com/6/5349/31222750705_1df267d84b_o.jpg,0.0,0.0,0.380308880309,0.75,979,575,https://www.flickr.com/photos/walterpro/31222750705,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/\n86d7f79b27d8e9cd,https://c1.staticflickr.com/8/7331/27350928380_12e535a763_o.jpg,0.0,0.25,0.5,1.0,459,429,https://www.flickr.com/photos/quinet/27350928380,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n78a36d2087e10530,https://c1.staticflickr.com/9/8009/28657987212_8a9e095845_o.jpg,0.249631811487,0.0,0.748895434462,0.75,613,435,https://www.flickr.com/photos/13476480@N07/28657987212,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n2da87918bc750711,https://c1.staticflickr.com/8/7769/27662145891_ce44167707_o.jpg,0.4375,0.25,1.0,1.0,808,442,https://www.flickr.com/photos/dlnorman/27662145891,https://creativecommons.org/licenses/by/2.0/,D&#x27;Arcy Norman,https://www.flickr.com/people/dlnorman/\n33f949b9ac9bffd2,https://c1.staticflickr.com/8/7289/27122464873_5366122771_o.jpg,0.4108,0.25,1.0,1.0,536,850,https://www.flickr.com/photos/glorycycles/27122464873,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\ndb963aee5969f160,https://c1.staticflickr.com/9/8492/29121966346_71f35d911e_o.jpg,0.0,0.28125,0.75,0.84375,310,200,https://www.flickr.com/photos/usfwsmtnprairie/29121966346,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\ne12a17932f739ea6,https://c1.staticflickr.com/8/7328/27351929353_492f3058d2_o.jpg,0.0,0.0,1.0,0.841059602649,304,943,https://www.flickr.com/photos/104342908@N08/27351929353,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/\n1b94bd2fd2689d3f,https://c1.staticflickr.com/6/5345/30508564714_934412b08b_o.jpg,0.0,0.25,0.735241502683,1.0,147,914,http://www.flickr.com/photos/blachswan/30508564714/,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\ne372fb60603d19eb,https://c1.staticflickr.com/8/7382/27070395126_7c56624074_o.jpg,0.276744186047,0.0,0.83023255814,0.75,780,654,https://www.flickr.com/photos/thoseguys119/27070395126,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n02ea3849038381ff,https://c1.staticflickr.com/8/7720/26931270544_e4339a9172_o.jpg,0.25,0.464122137405,1.0,1.0,702,490,https://www.flickr.com/photos/7armyjmtc/26931270544,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n34ab7b212045cec4,https://c1.staticflickr.com/6/5643/22783816858_2a0f4df9f5_o.jpg,0.578822733424,0.0,1.0,0.75,563,161,https://flickr.com/9505106@N02/22783816858,https://creativecommons.org/licenses/by/2.0/,Benito Condemi de Felice,https://www.flickr.com/people/bedesign/\nf076c7ab432c528d,https://c1.staticflickr.com/8/7458/27523536234_be6d0287e8_o.jpg,0.0,0.0,0.666666666667,1.0,407,642,https://www.flickr.com/photos/eltb/27523536234,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n2f3ef912ac6b0250,https://c1.staticflickr.com/9/8423/28732924263_fbc59cba1a_o.jpg,0.25,0.25,0.75,1.0,986,70,https://www.flickr.com/photos/vahemart/28732924263/,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\n8ae56aa3aaf970ca,https://c1.staticflickr.com/8/7325/27612369013_951e01b304_o.jpg,0.24882629108,0.0,1.0,1.0,666,166,https://flickr.com/26777097@N03/27612369013,https://creativecommons.org/licenses/by/2.0/,Jan Hammershaug,https://www.flickr.com/people/hammershaug/\n662f0bd43a7a394c,https://c1.staticflickr.com/8/7079/26520594243_e8fe458603_o.jpg,0.28125,0.25,0.84375,1.0,123,671,https://www.flickr.com/photos/lafoodie/26520594243,https://creativecommons.org/licenses/by/2.0/,L.A. Foodie,https://www.flickr.com/people/lafoodie/\n73c377387cee48ad,https://c1.staticflickr.com/9/8190/29728622111_70d1910dbf_o.jpg,0.25,0.0,0.75,0.75,989,568,https://www.flickr.com/photos/cohenvandervelde/29728622111/,https://creativecommons.org/licenses/by/2.0/,Cohen Van der Velde,https://www.flickr.com/people/cohenvandervelde/\nc9ab570c037b890d,https://c1.staticflickr.com/8/7320/27211544444_4ff72148b5_o.jpg,0.376029654036,0.0,1.0,0.75,405,477,https://www.flickr.com/photos/bmbc/27211544444,https://creativecommons.org/licenses/by/2.0/,bridgewatermbc,https://www.flickr.com/people/bmbc/\n4b5cb77f306c6473,https://c1.staticflickr.com/9/8256/28780742656_24252f31c7_o.jpg,0.0,0.25,0.5,1.0,980,804,https://www.flickr.com/photos/mypubliclands/28780742656,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\nba5a8ce3cf16d3c7,https://c1.staticflickr.com/3/2146/32031010323_ab5ce2a718_o.jpg,0.25,0.0,0.75,0.75,116,954,https://www.flickr.com/photos/silkebaron/32031010323/,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/\ne04bee37b5336cbf,https://c1.staticflickr.com/9/8621/28232175006_faab55a17b_o.jpg,0.25,0.0,1.0,0.56338028169,308,999,https://flickr.com/130093583@N04/28232175006,https://creativecommons.org/licenses/by/2.0/,Janet Graham,https://www.flickr.com/people/130093583@N04/\nb45fa39e7236c16b,https://c1.staticflickr.com/8/7575/26545609693_2dcda71408_o.jpg,0.0,0.0,0.878172588832,1.0,309,260,http://www.flickr.com/photos/43272765@N04/26545609693,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nd08cf5e6c4605f74,https://c1.staticflickr.com/6/5537/29722203784_99cd9ce155_o.jpg,0.25,0.25,1.0,1.0,918,356,https://www.flickr.com/photos/artlung/29722203784,https://creativecommons.org/licenses/by/2.0/,Joe Crawford,https://www.flickr.com/people/artlung/\n713105e8bda5472c,https://c1.staticflickr.com/9/8239/29480202512_32dde52f01_o.jpg,0.25,0.0,1.0,0.75,310,850,https://www.flickr.com/photos/orangeaurochs/29480202512,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/\n366caad06763b53d,https://c1.staticflickr.com/9/8006/29593961576_7417526a13_o.jpg,0.0,0.25,0.471030042918,1.0,840,497,https://flickr.com/38986305@N06/29593961576,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/\n20ad0885462dc12f,https://c1.staticflickr.com/8/7565/26485982724_5334f911c5_o.jpg,0.0,0.0,0.561569688769,1.0,320,889,https://www.flickr.com/photos/31031835@N08/26485982724,https://creativecommons.org/licenses/by/2.0/,John Tann,https://www.flickr.com/people/31031835@N08/\nffce60210764e242,https://c1.staticflickr.com/1/652/31810035072_497bb9b9e3_o.jpg,0.281690140845,0.0,0.845070422535,0.75,986,536,https://flickr.com/114409174@N07/31810035072,https://creativecommons.org/licenses/by/2.0/,nestor ferraro,https://www.flickr.com/people/nestorferraro/\n79d103440ab60cdb,https://c1.staticflickr.com/9/8600/29705946093_c4ee764743_o.jpg,0.210272873194,0.0,1.0,1.0,484,574,https://www.flickr.com/photos/darrenshilson/29705946093,https://creativecommons.org/licenses/by/2.0/,Darren Shilson,https://www.flickr.com/people/darrenshilson/\nea6a509c71e8d794,https://c1.staticflickr.com/8/7258/27459186044_e5b55dac38_o.jpg,0.4375,0.25,1.0,1.0,914,217,https://www.flickr.com/photos/hockeyholic/27459186044,https://creativecommons.org/licenses/by/2.0/,Andy Blackledge,https://www.flickr.com/people/hockeyholic/\nc8b54d9146aaa440,https://c1.staticflickr.com/6/5520/30499015996_25265d7274_o.jpg,0.0,0.2806640625,0.75,0.8419921875,709,10,https://www.flickr.com/photos/southbeachcars/30499015996,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n5b9cfa2f055cd9a1,https://c1.staticflickr.com/8/7618/26221283983_cfbcc376ff_o.jpg,0.335787923417,0.0,1.0,1.0,971,563,https://www.flickr.com/photos/bravenboer/26221283983/,https://creativecommons.org/licenses/by/2.0/,Martin Bravenboer,https://www.flickr.com/people/bravenboer/\n893e2abe2cfbeb64,https://c1.staticflickr.com/8/7767/27073060115_c20b7a64c8_o.jpg,0.0,0.0,0.5625,0.75,706,874,https://www.flickr.com/photos/jsjgeology/27073060115,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n178a2bef27ef6162,https://c1.staticflickr.com/8/7365/26855254721_63e142b6a0_o.jpg,0.421177266576,0.25,0.842354533153,1.0,986,34,https://www.flickr.com/photos/peter-kudlacz/26855254721,https://creativecommons.org/licenses/by/2.0/,Peter Kudlacz,https://www.flickr.com/people/peter-kudlacz/\n6a95efa7bc5f4e48,https://c1.staticflickr.com/8/7458/26615327133_03693d788d_o.jpg,0.0,0.0,0.666666666667,1.0,980,3,https://www.flickr.com/photos/oregondot/26615327133,https://creativecommons.org/licenses/by/2.0/,Oregon Department of Transportation,https://www.flickr.com/people/oregondot/\ndefcc0e67346fb39,https://c1.staticflickr.com/9/8186/28995290133_6a314df601_o.jpg,0.314020028612,0.0,0.942060085837,1.0,982,247,https://www.flickr.com/photos/lge/28995290133,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\nb6a5dbc20dc808d3,https://c1.staticflickr.com/8/7037/27036592194_8dd824439e_o.jpg,0.0,0.4375,0.75,1.0,323,773,https://www.flickr.com/photos/chaz_pics/27036592194,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\na3f437b6dc2d6c4d,https://c1.staticflickr.com/1/722/32131983090_4f49d17c5a_o.jpg,0.43661971831,0.25,1.0,1.0,51,448,https://www.flickr.com/photos/rusty_clark/32131983090,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n477c70799ba00b5a,https://c1.staticflickr.com/9/8242/29615739252_55d215833a_o.jpg,0.252777777778,0.0,0.758333333333,0.75,706,489,https://www.flickr.com/photos/rich701/29615739252,https://creativecommons.org/licenses/by/2.0/,Richard,https://www.flickr.com/people/rich701/\nfcaaf6c070d0d7a3,https://c1.staticflickr.com/6/5205/29854451120_9bfb6844cd_o.jpg,0.333333333333,0.0,1.0,1.0,561,222,https://flickr.com/100379608@N08/29854451120,https://creativecommons.org/licenses/by/2.0/,Bob Gibbs,https://www.flickr.com/people/100379608@N08/\n70f2b41c6c0e9951,https://c1.staticflickr.com/8/7162/26789143930_f6ec4d04d1_o.jpg,0.249631811487,0.25,0.748895434462,1.0,662,820,https://www.flickr.com/photos/greggjerdingen/26789143930,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n43c85cc95db8ca82,https://c1.staticflickr.com/9/8740/28048237754_2c9e89c81c_o.jpg,0.0,0.25,0.5,1.0,982,14,http://www.flickr.com/photos/50264926@N02/28048237754,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/\ndef8b638330a429a,https://c1.staticflickr.com/6/5516/30827957656_010c0c9be6_o.jpg,0.248348017621,0.25,0.745044052863,1.0,981,701,https://flickr.com/124906627@N06/30827957656,https://creativecommons.org/licenses/by/2.0/,Fabien LE JEUNE,https://www.flickr.com/people/124906627@N06/\n7d7102a099be414d,https://c1.staticflickr.com/6/5509/31372095431_0a4aa92619_o.jpg,0.28125,0.25,0.84375,1.0,971,517,https://www.flickr.com/photos/ruthanddave/31372095431/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\nad4f260c05f3cbc2,https://c1.staticflickr.com/8/7432/27131972211_3c0479aebc_o.jpg,0.25,0.0,1.0,1.0,780,389,https://www.flickr.com/photos/thoseguys119/27131972211/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nb72598892abcab9c,https://c1.staticflickr.com/9/8743/28765960962_1cf92c774a_o.jpg,0.0,0.25,0.75,0.75,896,582,https://flickr.com/94896083@N03/28765960962,https://creativecommons.org/licenses/by/2.0/,Martin Gent,https://www.flickr.com/people/94896083@N03/\n9847d292c776e26e,https://c1.staticflickr.com/9/8263/29144649432_6b4f561188_o.jpg,0.0,0.0,0.75,1.0,921,670,https://www.flickr.com/photos/90384027@N00/29144649432/,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/\n82adc9bc71be5d99,https://c1.staticflickr.com/8/7357/27990168345_1ac23d7c7d_o.jpg,0.25,0.385187580854,1.0,0.770375161708,898,155,https://www.flickr.com/photos/lge/27990168345,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n31792980a21aea1b,https://c1.staticflickr.com/6/5339/31206308941_89ba46afe7_o.jpg,0.250521920668,0.0,0.501043841336,0.75,976,18,https://www.flickr.com/photos/vastateparksstaff/31206308941,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n002e4f93a2db2848,https://c1.staticflickr.com/9/8547/30332686526_5d5e4fc267_o.jpg,0.0,0.0,0.619458128079,0.75,755,205,https://www.flickr.com/photos/51764518@N02/30332686526,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\nb6871d5446d66411,https://c1.staticflickr.com/9/8221/29186491756_d90388986d_o.jpg,0.500736377025,0.25,1.0,1.0,924,701,https://www.flickr.com/photos/us_embassy_newzealand/29186491756/,https://creativecommons.org/licenses/by/2.0/,US Embassy,https://www.flickr.com/people/us_embassy_newzealand/\n31d7acb588ab6203,https://c1.staticflickr.com/9/8722/28209149041_d150f8fbd5_o.jpg,0.25,0.25,0.75,1.0,859,345,https://www.flickr.com/photos/134969748@N06/28209149041/,https://creativecommons.org/licenses/by/2.0/,Michel Meynsbrughen,https://www.flickr.com/people/134969748@N06/\nc3df182351f38e2d,https://c1.staticflickr.com/9/8583/28355161722_8c18072f8e_o.jpg,0.333333333333,0.0,1.0,1.0,673,793,https://www.flickr.com/photos/paxson_woelber/28355161722,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/\nf0bba6ce1cfb18e3,https://c1.staticflickr.com/1/435/32161160540_7fa275a933_o.jpg,0.25,0.0,0.75,0.75,774,522,http://www.flickr.com/photos/pgenterprises/32161160540/,https://creativecommons.org/licenses/by/2.0/,Pete G,https://www.flickr.com/people/pgenterprises/\nb1f1a1003a90acd7,https://c1.staticflickr.com/6/5755/29798388221_790a1a513b_o.jpg,0.24882629108,0.0,1.0,1.0,320,693,https://www.flickr.com/photos/amantedar/29798388221/,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/\n84690a716f9a6c11,https://c1.staticflickr.com/8/7351/26748489474_0ac12b42c4_o.jpg,0.502573529412,0.25,1.0,1.0,518,903,https://www.flickr.com/photos/agenciabrasilia/26748489474,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\ncb539a2083b0a8ea,https://c1.staticflickr.com/9/8140/29914852416_8f3c5499d1_o.jpg,0.277173913043,0.0,0.83152173913,0.75,672,601,https://www.flickr.com/photos/glorycycles/29914852416,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n3ce25cb1b2d242f5,https://c1.staticflickr.com/9/8728/28482702402_6a9654bf3b_o.jpg,0.28125,0.25,0.84375,1.0,693,706,https://www.flickr.com/photos/stevendepolo/28482702402,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nbaa9f8295070dd66,https://c1.staticflickr.com/6/5647/31302346581_73ebd78d22_o.jpg,0.0,0.0,0.452314165498,0.75,976,668,https://www.flickr.com/photos/8269539@N04/31302346581/,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n658149bf0e6e9f85,https://c1.staticflickr.com/8/7735/27779452085_a89179147f_o.jpg,0.0,0.0,0.699395770393,1.0,560,104,https://www.flickr.com/photos/photographingtravis/27779452085,https://creativecommons.org/licenses/by/2.0/,Travis Wise,https://www.flickr.com/people/photographingtravis/\n59f73601f7ac9705,https://c1.staticflickr.com/6/5738/30947817110_7c36bfe67e_o.jpg,0.28125,0.25,0.84375,1.0,978,721,https://www.flickr.com/photos/rusty_clark/30947817110/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\nbca436f44f6b862f,https://c1.staticflickr.com/6/5458/30558271052_3945615113_o.jpg,0.28125,0.25,0.84375,1.0,459,151,https://flickr.com/29484524@N00/30558271052,https://creativecommons.org/licenses/by/2.0/,The Greater Southwestern Exploration Company,https://www.flickr.com/people/gsec/\n4839164a8a3b1bac,https://c1.staticflickr.com/9/8338/29166083912_3ff57ef94f_o.jpg,0.0,0.30849220104,0.75,1.0,821,944,https://www.flickr.com/photos/60900612@N08/29166083912/,https://creativecommons.org/licenses/by/2.0/,Thomas&#x27;s Pics,https://www.flickr.com/people/60900612@N08/\nbf4ecf00aa6a7fba,https://c1.staticflickr.com/8/7573/26980834191_3d489bf0ac_o.jpg,0.25,0.0,0.75,0.75,854,84,https://www.flickr.com/photos/insmu74/26980834191,https://creativecommons.org/licenses/by/2.0/,Stefan Munder,https://www.flickr.com/people/insmu74/\n7a52ac62104601c2,https://c1.staticflickr.com/8/7414/27153294905_ee998bc4f8_o.jpg,0.333049403748,0.0,1.0,0.75,417,497,https://www.flickr.com/photos/virginia_gymnastics/27153294905,https://creativecommons.org/licenses/by/2.0/,C B,https://www.flickr.com/people/virginia_gymnastics/\n9b370bdb123ec5d6,https://c1.staticflickr.com/1/309/32095235596_1e1d91ca32_o.jpg,0.0,0.25,0.5,1.0,920,360,https://flickr.com/77742560@N06/32095235596,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n778a1138481787d5,https://c1.staticflickr.com/1/738/31830964004_d439c25c32_o.jpg,0.25,0.25,1.0,1.0,479,688,http://www.flickr.com/photos/artotemsco/31830964004/,https://creativecommons.org/licenses/by/2.0/,Artotem,https://www.flickr.com/people/artotemsco/\nb4bf9dcbd95e05d1,https://c1.staticflickr.com/9/8575/30238799946_68ea3b58d8_o.jpg,0.270897239264,0.25,0.812691717791,1.0,982,826,https://www.flickr.com/photos/apardavila/30238799946,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n1b04e7d71ebb40da,https://c1.staticflickr.com/9/8421/29018069334_8f322192bd_o.jpg,0.0,0.0,0.5625,0.75,718,345,https://www.flickr.com/photos/hugo90/29018069334,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n25d148185e670285,https://c1.staticflickr.com/1/260/32078591901_a91cbb6684_o.jpg,0.25,0.0,0.75,0.75,653,511,https://www.flickr.com/photos/armysmdc/32078591901/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Space and Missile Defense Command (SMDC),https://www.flickr.com/people/armysmdc/\n2454b6ee5107d99b,https://c1.staticflickr.com/8/7261/26752594452_117a38cf35_o.jpg,0.0,0.0,0.521837349398,0.75,100,584,https://www.flickr.com/photos/kitkaphotogirl/26752594452,https://creativecommons.org/licenses/by/2.0/,Christine Majul,https://www.flickr.com/people/kitkaphotogirl/\n40245e8bf0b9dd6c,https://c1.staticflickr.com/4/3903/33101838470_67c588ae7d_o.jpg,0.25,0.25,0.75,1.0,771,468,https://www.flickr.com/photos/monkey-kc/33101838470,https://creativecommons.org/licenses/by/2.0/,Kalvin Chan,https://www.flickr.com/people/monkey-kc/\n629194828049a497,https://c1.staticflickr.com/1/722/32243820372_593d602088_o.jpg,0.25,0.5,1.0,1.0,582,544,https://www.flickr.com/photos/quinet/32243820372,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n9e55e674cd4aca84,https://c1.staticflickr.com/9/8051/28566809215_3545920a70_o.jpg,0.28125,0.25,0.84375,1.0,976,648,https://www.flickr.com/photos/usdagov/28566809215/,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n59d085fdb8a522d8,https://c1.staticflickr.com/6/5667/31026655610_639367ab7f_o.jpg,0.25,0.0,1.0,0.75,960,28,https://www.flickr.com/photos/ambigel/31026655610/,https://creativecommons.org/licenses/by/2.0/,Alexander Andrade,https://www.flickr.com/people/ambigel/\n3694c28c34717560,https://c1.staticflickr.com/9/8409/28892387935_ef1e796436_o.jpg,0.333333333333,0.0,1.0,1.0,980,931,https://www.flickr.com/photos/aotaro/28892387935,https://creativecommons.org/licenses/by/2.0/,aotaro,https://www.flickr.com/people/aotaro/\n8eca639840976a76,https://c1.staticflickr.com/9/8786/29644163912_240e1bb875_o.jpg,0.28125,0.25,0.84375,1.0,386,413,https://www.flickr.com/photos/wwarby/29644163912,https://creativecommons.org/licenses/by/2.0/,William Warby,https://www.flickr.com/people/wwarby/\n223759cd7c163535,https://c1.staticflickr.com/6/5557/31220389531_9ce994d4d5_o.jpg,0.0,0.25,0.5625,1.0,931,665,https://flickr.com/49588910@N00/31220389531,https://creativecommons.org/licenses/by/2.0/,# annola,https://www.flickr.com/people/annola/\n2c60b2871e740696,https://c1.staticflickr.com/9/8545/29322182345_b089d38820_o.jpg,0.5,0.25,1.0,1.0,376,84,https://www.flickr.com/photos/97169514@N06/29322182345/,https://creativecommons.org/licenses/by/2.0/,Mike Macke,https://www.flickr.com/people/97169514@N06/\n31c64a90529935a2,https://c1.staticflickr.com/1/609/31980794632_9a7afe9216_o.jpg,0.25,0.0,1.0,0.44375,956,36,https://www.flickr.com/photos/hisgett/31980794632,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n0357da27656a85f8,https://c1.staticflickr.com/6/5322/30333305332_c88d0b6961_o.jpg,0.0,0.25,0.5,1.0,859,766,https://www.flickr.com/photos/agenciabrasilia/30333305332,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n99c649f1364eb2ea,https://c1.staticflickr.com/9/8825/29456327171_bb14641923_o.jpg,0.0458553791887,0.0,1.0,1.0,696,559,https://www.flickr.com/photos/zeevveez/29456327171,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/\nb59cd6b083780579,https://c1.staticflickr.com/9/8285/28762224560_d9d9c029bf_o.jpg,0.333333333333,0.0,1.0,1.0,866,884,https://www.flickr.com/photos/30478819@N08/28762224560,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n015f9237f0fb238f,https://c1.staticflickr.com/8/7309/28001984465_92989d911f_o.jpg,0.0,0.0,0.5,0.75,704,589,https://www.flickr.com/photos/pawel_pacholec/28001984465/,https://creativecommons.org/licenses/by/2.0/,Pawel Pacholec,https://www.flickr.com/people/pawel_pacholec/\n975a56312782d90a,https://c1.staticflickr.com/4/3769/33273964465_f3695f039f_o.jpg,0.25,0.25,1.0,1.0,449,131,https://flickr.com/70360263@N03/33273964465,https://creativecommons.org/licenses/by/2.0/,Kim Singdahlsen,https://www.flickr.com/people/70360263@N03/\n0608704c3098e9c4,https://c1.staticflickr.com/8/7624/27509752052_01be111f4a_o.jpg,0.228169014085,0.25,0.684507042254,1.0,704,668,https://www.flickr.com/photos/thorsten-hofmeister/27509752052,https://creativecommons.org/licenses/by/2.0/,Thorsten Hofmeister,https://www.flickr.com/people/thorsten-hofmeister/\n1b5013bae08d7e52,https://c1.staticflickr.com/1/629/31731855000_ae6796b942_o.jpg,0.33686440678,0.0,0.673728813559,0.75,405,394,https://flickr.com/37804979@N00/31731855000,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\nf374c0c3f8bbc431,https://c1.staticflickr.com/8/7667/27782025613_2249c77e14_o.jpg,0.421177266576,0.25,0.842354533153,1.0,971,362,https://www.flickr.com/photos/kosalabandara/27782025613,https://creativecommons.org/licenses/by/2.0/,Kosala Bandara,https://www.flickr.com/people/kosalabandara/\n1f18c39535f9a771,https://c1.staticflickr.com/8/7086/26812413863_8f7c66083e_o.jpg,0.29770531401,0.0,0.893115942029,0.75,320,393,https://www.flickr.com/photos/gails_pictures/26812413863,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n5b1dd36ac2739d68,https://c1.staticflickr.com/9/8054/29675037322_2eb0782106_o.jpg,0.175409836066,0.0,1.0,1.0,310,590,https://www.flickr.com/photos/gails_pictures/29675037322,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nf60f43d2320b8375,https://c1.staticflickr.com/9/8445/29540449602_9aa9f82b84_o.jpg,0.25,0.0,1.0,0.608536585366,734,655,https://www.flickr.com/photos/filipbossuyt/29540449602,https://creativecommons.org/licenses/by/2.0/,filip bossuyt,https://www.flickr.com/people/filipbossuyt/\nb48c77df77ea4392,https://c1.staticflickr.com/6/5675/31039201011_b33dfba066_o.jpg,0.28125,0.25,0.84375,1.0,12,123,https://www.flickr.com/photos/9750464@N02/31039201011/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\n60703de4aa8de09f,https://c1.staticflickr.com/6/5782/30155274082_6b964fb38f_o.jpg,0.25,0.0,1.0,0.5,561,72,https://www.flickr.com/photos/116153846@N06/30155274082/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/\n4d220903b814d05a,https://c1.staticflickr.com/6/5458/30801136686_2d0fd56d2f_o.jpg,0.0,0.332106038292,1.0,0.996318114875,864,287,https://www.flickr.com/photos/senkreu/30801136686/in/album-72157676163816066/,https://creativecommons.org/licenses/by/2.0/,Castellers d&#x27;Esplugues,https://www.flickr.com/people/senkreu/\n0d22bfd77b1b4f42,https://c1.staticflickr.com/9/8488/29713629496_dabe572df0_o.jpg,0.0,0.25,0.5,1.0,561,776,https://www.flickr.com/photos/116153846@N06/29713629496/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/\nf451e307d16c4ced,https://c1.staticflickr.com/1/750/31760378145_ffe3b91468_o.jpg,0.263237518911,0.25,0.789712556732,1.0,855,909,http://www.flickr.com/photos/soul_stealer/31760378145/,https://creativecommons.org/licenses/by/2.0/,Martin SoulStealer,https://www.flickr.com/people/soul_stealer/\n679ea1ad7c815a3b,https://c1.staticflickr.com/9/8730/29371609435_136112c23c_o.jpg,0.25,0.0,1.0,0.579761904762,437,297,https://www.flickr.com/photos/autohistorian/29371609435,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n06227762bad2b330,https://c1.staticflickr.com/6/5691/30589543195_a70c225cda_o.jpg,0.3,0.25,0.9,1.0,515,66,https://www.flickr.com/photos/85546319@N04/30589543195,https://creativecommons.org/licenses/by/2.0/,Robert  Sheie,https://www.flickr.com/people/85546319@N04/\n8fb0238f76cdb721,https://c1.staticflickr.com/9/8474/29393231170_6233dbf5c4_o.jpg,0.248713235294,0.25,0.746139705882,1.0,340,183,https://www.flickr.com/photos/blmnevada/29393231170/,https://creativecommons.org/licenses/by/2.0/,BLM Nevada,https://www.flickr.com/people/blmnevada/\ne8b191e94906ede6,https://c1.staticflickr.com/6/5524/30495584252_77be73657a_o.jpg,0.0,0.0,0.5,0.75,971,298,https://www.flickr.com/photos/slaporte/30495584252/,https://creativecommons.org/licenses/by/2.0/,Stephen,https://www.flickr.com/people/slaporte/\n450a592d56df96fc,https://c1.staticflickr.com/8/7299/27274568355_fd96ee14f6_o.jpg,0.28125,0.25,0.84375,1.0,875,79,https://www.flickr.com/photos/sea_beach_express/27274568355,https://creativecommons.org/licenses/by/2.0/,Kristain Baty,https://www.flickr.com/people/sea_beach_express/\n08c533e22dd00f1c,https://c1.staticflickr.com/9/8388/28411519474_2aa773bde8_o.jpg,0.4375,0.25,1.0,1.0,310,619,https://www.flickr.com/photos/hayzphotos/28411519474/,https://creativecommons.org/licenses/by/2.0/,Paul Hayday,https://www.flickr.com/people/hayzphotos/\n3f76f6e3eea94a65,https://c1.staticflickr.com/1/410/32188956012_a69ef28a34_o.jpg,0.0,0.25,0.669368600683,1.0,747,270,https://flickr.com/56292751@N03/32188956012,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/\n356344792d7618a5,https://c1.staticflickr.com/8/7068/27031317355_00c7a67b0f_o.jpg,0.0,0.43661971831,0.75,1.0,443,571,https://www.flickr.com/photos/eltb/27031317355,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n8607209efa55c15b,https://c1.staticflickr.com/9/8101/28586783001_3da553f99e_o.jpg,0.0,0.25,0.5625,1.0,810,52,https://www.flickr.com/photos/68147320@N02/28586783001,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\n0166096402d36771,https://c1.staticflickr.com/6/5631/30516679126_cf3946c7ce_o.jpg,0.333333333333,0.0,1.0,1.0,885,930,https://flickr.com/32916425@N04/30516679126,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/\nae15c565e54d8928,https://c1.staticflickr.com/8/7402/27388545703_2746ba9417_o.jpg,0.578822733424,0.0,1.0,0.75,981,569,https://www.flickr.com/photos/usdagov/27388545703,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n9e4c17addf566964,https://c1.staticflickr.com/9/8399/29038404101_7d45ab0b41_o.jpg,0.0,0.25,0.503698224852,1.0,688,767,https://www.flickr.com/photos/eltb/29038404101,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n9c194c7fc0ef02f2,https://c1.staticflickr.com/6/5513/30112856425_4e6ac8616d_o.jpg,0.504405286344,0.25,1.0,1.0,561,540,https://www.flickr.com/photos/codnewsroom/30112856425,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\n9971855bd0b70297,https://c1.staticflickr.com/8/7711/27123847181_21ef361b14_o.jpg,0.28125,0.0,0.84375,0.75,428,607,https://www.flickr.com/photos/londonmatt/27123847181,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n6ef50fd6d78ac91a,https://c1.staticflickr.com/9/8326/28544673953_665803f158_o.jpg,0.0,0.0,0.51724137931,0.75,830,902,https://www.flickr.com/photos/robdammers/28544673953,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\nd1811c249db313e6,https://c1.staticflickr.com/9/8207/29606580866_b380112c09_o.jpg,0.0,0.0,1.0,0.908777969019,889,290,https://www.flickr.com/photos/atoach/29606580866,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n646d3915eba3dd7c,https://c1.staticflickr.com/8/7408/26898818163_746a632cfa_o.jpg,0.278621495327,0.0,0.835864485981,0.75,669,930,https://www.flickr.com/photos/publicresourceorg/26898818163/,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/\n1fed1fe97fefe793,https://c1.staticflickr.com/9/8665/28236456323_7124344a63_o.jpg,0.0,0.0,0.75,0.75,918,805,https://www.flickr.com/photos/23024164@N06/28236456323,https://creativecommons.org/licenses/by/2.0/,Damian Gadal,https://www.flickr.com/people/23024164@N06/\n231d616fa10cc908,https://c1.staticflickr.com/9/8127/29948121035_6e6c64491c_o.jpg,0.333333333333,0.0,1.0,1.0,340,181,https://www.flickr.com/photos/blmoregon/29948121035,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\n2634a742a7e89a48,https://c1.staticflickr.com/1/602/32770576855_08faa9af95_o.jpg,0.299878836834,0.0,0.899636510501,0.75,293,666,https://www.flickr.com/photos/happymillerman/32770576855,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\na1b15a7b9573fc9d,https://c1.staticflickr.com/9/8401/30036859065_9510da323f_o.jpg,0.0,0.25,0.75,1.0,561,859,https://www.flickr.com/photos/smaedli/30036859065,https://creativecommons.org/licenses/by/2.0/,Chad Kainz,https://www.flickr.com/people/smaedli/\n30c9109a90483273,https://c1.staticflickr.com/6/5086/30139519396_9690187f2f_o.jpg,0.333333333333,0.0,1.0,1.0,859,263,https://www.flickr.com/photos/prof_richard/30139519396,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/\naed8d839589a6059,https://c1.staticflickr.com/2/1495/26503575620_c93d2fed41_o.jpg,0.28125,0.0,0.84375,0.75,830,843,https://www.flickr.com/photos/raver_mikey/26503575620/,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/\nd0ba16c850fec4b5,https://c1.staticflickr.com/8/7454/26920109042_58d819b711_o.jpg,0.0,0.0,0.75,0.56338028169,733,249,https://www.flickr.com/photos/dok1/26920109042,https://creativecommons.org/licenses/by/2.0/,Don O&#x27;Brien,https://www.flickr.com/people/dok1/\nb3b73c39a00a2299,https://c1.staticflickr.com/6/5519/30270414202_0ba7b1d8e7_o.jpg,0.438671875,0.0,1.0,0.75,873,112,https://www.flickr.com/photos/powellburns/30270414202,https://creativecommons.org/licenses/by/2.0/,Powell Burns,https://www.flickr.com/people/powellburns/\n6668807f6060a45f,https://c1.staticflickr.com/8/7160/26802349742_0e4da3e604_o.jpg,0.5,0.0,1.0,0.75,821,626,https://www.flickr.com/photos/kecko/26802349742,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\nf3332771b727a5ee,https://c1.staticflickr.com/9/8665/28842206286_db59e6f23d_o.jpg,0.25,0.0,0.75,0.75,760,669,https://www.flickr.com/photos/nicokaiser/28842206286,https://creativecommons.org/licenses/by/2.0/,Nico Kaiser,https://www.flickr.com/people/nicokaiser/\n2184d30260150e71,https://c1.staticflickr.com/8/7264/27218548615_95a0430eed_o.jpg,0.0,0.0,0.75,0.75,114,60,https://www.flickr.com/photos/artlung/27218548615,https://creativecommons.org/licenses/by/2.0/,Joe Crawford,https://www.flickr.com/people/artlung/\n91e0a7a55c1d75f3,https://c1.staticflickr.com/9/8289/28859190345_36c83f30ff_o.jpg,0.0,0.0,1.0,0.75117370892,407,640,https://www.flickr.com/photos/eltb/28859190345,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n59121a5a8acd5f0b,https://c1.staticflickr.com/9/8452/28454774783_59cf8db4cf_o.jpg,0.25,0.0,0.75,0.75,971,855,https://www.flickr.com/photos/blackwing_de/28454774783,https://creativecommons.org/licenses/by/2.0/,Sebastian Werner,https://www.flickr.com/people/blackwing_de/\n86426a047c914b15,https://c1.staticflickr.com/9/8893/28160821316_f5d63eb270_o.jpg,0.2515625,0.0,1.0,1.0,309,711,https://www.flickr.com/photos/gails_pictures/28160821316/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n54eb8d77f36d65dc,https://c1.staticflickr.com/8/7292/27476175660_94f5e0ebb7_o.jpg,0.502573529412,0.0,1.0,0.75,449,467,https://www.flickr.com/photos/byzantiumbooks/27476175660/,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/\n443d5de0d68061d7,https://c1.staticflickr.com/6/5546/29731072524_c488ae9045_o.jpg,0.0,0.28125,0.75,0.84375,763,678,https://flickr.com/8388191@N07/29731072524,https://creativecommons.org/licenses/by/2.0/,Terry Platt,https://www.flickr.com/people/mobilealabama/\nb7eca631d6e00632,https://c1.staticflickr.com/8/7219/27127453951_d917daa1f9_o.jpg,0.25,0.0,0.75,0.75,788,900,https://www.flickr.com/photos/joneslibraryma/27127453951/,https://creativecommons.org/licenses/by/2.0/,Jones Library,https://www.flickr.com/people/joneslibraryma/\n31d4266388257ff9,https://c1.staticflickr.com/6/5647/29695160954_c8e36b048a_o.jpg,0.681470588235,0.0,1.0,0.75,780,909,https://www.flickr.com/photos/thoseguys119/29695160954,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n934b8b9ad14bfdab,https://c1.staticflickr.com/9/8813/28290786071_8c32334b50_o.jpg,0.210588633288,0.25,0.631765899865,1.0,980,639,https://flickr.com/59274709@N03/28290786071,https://creativecommons.org/licenses/by/2.0/,Przemek P,https://www.flickr.com/people/globalquiz/\nff06a10fb89f68bf,https://c1.staticflickr.com/9/8609/27681911664_96bf1842ca_o.jpg,0.2806640625,0.0,0.8419921875,0.75,920,688,https://www.flickr.com/photos/cogdog/27681911664/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n367be14d42db2cb6,https://c1.staticflickr.com/1/624/32367927704_876e4e3239_o.jpg,0.0,0.25,0.496696035242,1.0,704,857,https://www.flickr.com/photos/vastateparksstaff/32367927704/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n9780a9ec0de2ea32,https://c1.staticflickr.com/8/7335/27803775181_c66a27a3d8_o.jpg,0.0,0.0,0.665684830633,1.0,9,693,https://www.flickr.com/photos/sarahvain/27803775181,https://creativecommons.org/licenses/by/2.0/,Sarah Stierch,https://www.flickr.com/people/sarahvain/\n5a0bc772d79bf4f7,https://c1.staticflickr.com/1/622/32042124816_6e182d9203_o.jpg,0.0,0.464122137405,0.75,1.0,438,378,https://www.flickr.com/photos/blmoregon/32042124816,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\n4b9046fff85b4f64,https://c1.staticflickr.com/8/7065/27132333685_f24e0312ca_o.jpg,0.0,0.0,0.666666666667,1.0,867,943,https://www.flickr.com/photos/andreas_neumeier/27132333685,https://creativecommons.org/licenses/by/2.0/,Andreas Neumeier,https://www.flickr.com/people/andreas_neumeier/\n8f76cff7e5a6b6d5,https://c1.staticflickr.com/1/721/32445155051_491334423a_o.jpg,0.424446202532,0.25,1.0,1.0,320,900,http://www.flickr.com/photos/47602497@N06/32445155051,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/\nb706f029d5f7bbc9,https://c1.staticflickr.com/6/5486/30871161412_eeb4b57b00_o.jpg,0.217252396166,0.0,1.0,1.0,512,685,https://www.flickr.com/photos/autohistorian/30871161412,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\ned469c7126fb88bb,https://c1.staticflickr.com/6/5734/31214670086_b650c0ed73_o.jpg,0.2806640625,0.25,0.8419921875,1.0,963,685,https://www.flickr.com/photos/powellburns/31214670086,https://creativecommons.org/licenses/by/2.0/,Powell Burns,https://www.flickr.com/people/powellburns/\n752226a59337fd4f,https://c1.staticflickr.com/8/7384/27729145561_10ff4bd4d4_o.jpg,0.280784844384,0.0,0.842354533153,1.0,699,915,https://www.flickr.com/photos/provence___provenza/27729145561,https://creativecommons.org/licenses/by/2.0/,Daniel70mi Falciola,https://www.flickr.com/people/provence___provenza/\nf748e6d1a654d88e,https://c1.staticflickr.com/1/410/31903287406_1e00e4de72_o.jpg,0.0,0.25,0.5625,1.0,108,927,https://www.flickr.com/photos/jimg944/31903287406/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\ndf9afc207b6417ce,https://c1.staticflickr.com/9/8346/29210725372_503534f942_o.jpg,0.0,0.0,0.75,0.540644171779,490,482,https://www.flickr.com/photos/tynigh/29210725372/,https://creativecommons.org/licenses/by/2.0/,Ty Nigh,https://www.flickr.com/people/tynigh/\nbfc923081f179706,https://c1.staticflickr.com/9/8163/29650838375_4b096ac35a_o.jpg,0.4375,0.0,1.0,0.75,12,165,http://www.flickr.com/photos/j_benson/29650838375/,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/\nfae27865dc0dfdb6,https://c1.staticflickr.com/8/7103/26725562970_3c1d3f8733_o.jpg,0.438671875,0.0,1.0,0.75,337,678,https://www.flickr.com/photos/fishwasher/26725562970,https://creativecommons.org/licenses/by/2.0/,Vlad Podvorny,https://www.flickr.com/people/fishwasher/\n1f9ecce63e94ba97,https://c1.staticflickr.com/6/5552/30908389806_a8cc5d878b_o.jpg,0.333333333333,0.0,1.0,1.0,693,472,https://www.flickr.com/photos/comedynose/30908389806,https://creativecommons.org/licenses/by/2.0/,Pete,https://www.flickr.com/people/comedynose/\n15d354fcc3fa027e,https://c1.staticflickr.com/6/5625/30682716776_f15f30b9f6_o.jpg,0.0,0.0,1.0,1.0,739,537,https://flickr.com/60944636@N00/30682716776,https://creativecommons.org/licenses/by/2.0/,el cajon yacht club,https://www.flickr.com/people/el_cajon_yacht_club/\n081f36a3036c82e9,https://c1.staticflickr.com/9/8345/28715142401_2b41f16de0_o.jpg,0.231890459364,0.0,0.695671378092,0.75,405,632,https://flickr.com/96223380@N02/28715142401,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/\nd81b302bd03ccca2,https://c1.staticflickr.com/6/5624/30799095616_9475195a1b_o.jpg,0.25,0.0,0.75,0.75,312,881,https://www.flickr.com/photos/ansk/30799095616,https://creativecommons.org/licenses/by/2.0/,arian.suresh,https://www.flickr.com/people/ansk/\n8060e42dc3b7147a,https://c1.staticflickr.com/8/7354/28135262255_356dace0d8_o.jpg,0.25,0.0,0.75,0.75,818,318,https://www.flickr.com/photos/thecarspy/28135262255,https://creativecommons.org/licenses/by/2.0/,The Car Spy,https://www.flickr.com/people/thecarspy/\nc39e14b985d2504a,https://c1.staticflickr.com/9/8618/30465704306_1f55cbe415_o.jpg,0.49889380531,0.25,1.0,1.0,495,979,https://www.flickr.com/photos/eltb/30465704306,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n45a0dfd2c88a3f13,https://c1.staticflickr.com/6/5754/31231179316_03a30b08f4_o.jpg,0.0,0.0,0.5,0.75,779,751,https://www.flickr.com/photos/mujitra/31231179316,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/\na90bf0cacb5662ed,https://c1.staticflickr.com/8/7312/27905486782_56fe2e5767_o.jpg,0.4375,0.25,1.0,1.0,875,480,https://www.flickr.com/photos/69203347@N03/27905486782,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\nc32cc4ffb4f85ecd,https://c1.staticflickr.com/8/7395/27084897643_bbae9cce8c_o.jpg,0.250923190547,0.0,0.75276957164,0.75,604,221,https://www.flickr.com/photos/jorge-11/27084897643,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/\n0b380045d7f9bf06,https://c1.staticflickr.com/8/7358/26990370230_c25b68b97c_o.jpg,0.0,0.0,0.617213114754,0.75,294,2,https://www.flickr.com/photos/amanderson/26990370230,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n6d818e8669f3ac61,https://c1.staticflickr.com/6/5731/30521493686_630cce0076_o.jpg,0.0,0.0,0.75,1.0,434,139,https://www.flickr.com/photos/stevendepolo/30521493686,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n77ac531050fb1153,https://c1.staticflickr.com/9/8342/28776338230_c9ea2c2994_o.jpg,0.0,0.5,0.75,1.0,874,808,https://www.flickr.com/photos/zigazou76/28776338230,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n2bb77d79f0a8a869,https://c1.staticflickr.com/9/8557/28406946510_2722a7e834_o.jpg,0.4375,0.25,1.0,1.0,808,667,https://flickr.com/61008969@N03/28406946510,https://creativecommons.org/licenses/by/2.0/,ICTE-UQ,https://www.flickr.com/people/icte-uq/\n283cbf4827004f2f,https://c1.staticflickr.com/6/5673/31101328662_0f917f545e_o.jpg,0.0,0.25,0.483695652174,1.0,820,448,https://www.flickr.com/photos/jus10h/31101328662,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\nc967ac383bc39e0b,https://c1.staticflickr.com/8/7289/27254670985_326c9aca15_o.jpg,0.263433813893,0.0,0.790301441678,1.0,555,52,https://www.flickr.com/photos/walterpro/27254670985,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/\nd0df52c255e4d14d,https://c1.staticflickr.com/8/7246/27479788632_4837443f8b_o.jpg,0.25,0.0,1.0,0.724689165187,498,800,https://www.flickr.com/photos/trondheim_byarkiv/27479788632,https://creativecommons.org/licenses/by/2.0/,Municipal Archives of Trondheim,https://www.flickr.com/people/trondheim_byarkiv/\n6bb46ab95f32861f,https://c1.staticflickr.com/9/8051/29695835045_9219ebd8c5_o.jpg,0.26075619296,0.0,0.782268578879,1.0,815,797,https://www.flickr.com/photos/yamahawatercraft/29695835045/,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/\n02851c38dfce98b0,https://c1.staticflickr.com/8/7562/27520834756_dca8248c4d_o.jpg,0.25,0.25,0.75,1.0,986,931,https://www.flickr.com/photos/cogdog/27520834756/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n43a736b30b249139,https://c1.staticflickr.com/9/8182/28394501131_6100344c20_o.jpg,0.28125,0.0,0.84375,0.75,490,716,https://www.flickr.com/photos/fdecomite/28394501131,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\n278c6878aa810fed,https://c1.staticflickr.com/9/8153/7456686468_3307378ab3_o.jpg,0.25,0.25,0.75,1.0,770,519,https://www.flickr.com/photos/dominicspics/7456686468,https://creativecommons.org/licenses/by/2.0/,Dominic Alves,https://www.flickr.com/people/dominicspics/\n566908f2a76c406c,https://c1.staticflickr.com/9/8437/28219029883_1a083fd1e4_o.jpg,0.25,0.25,0.75,1.0,976,700,https://www.flickr.com/photos/mypubliclands/28219029883,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\ned542bad1c02dfec,https://c1.staticflickr.com/8/7069/27386644351_f4aac62dd5_o.jpg,0.270061728395,0.0,1.0,1.0,320,944,https://www.flickr.com/photos/gails_pictures/27386644351,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n7f5ba3e3f3eca6b3,https://c1.staticflickr.com/8/7344/27377155134_bd2c853e53_o.jpg,0.25,0.25,0.75,1.0,137,375,https://www.flickr.com/photos/blachswan/27377155134,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\nada5e14c279fd3e9,https://c1.staticflickr.com/6/5824/30974869612_e907fca9ca_o.jpg,0.25,0.25,1.0,1.0,729,495,https://www.flickr.com/photos/rodrigoparedes/30974869612,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/\nd9b229c394707b6c,https://c1.staticflickr.com/8/7344/28029362406_7ea1da8055_o.jpg,0.25,0.0,0.75,0.75,512,860,https://www.flickr.com/photos/karen_roe/28029362406,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/\nb0f28f897d4e1624,https://c1.staticflickr.com/1/140/31274923920_f1f76e0744_o.jpg,0.25,0.25,0.75,1.0,85,775,https://www.flickr.com/photos/simonmatzinger/31274923920/,https://creativecommons.org/licenses/by/2.0/,Simon Matzinger,https://www.flickr.com/people/simonmatzinger/\nb245f492db3b8daa,https://c1.staticflickr.com/8/7101/27868852041_98bec1eb36_o.jpg,0.0,0.25,0.567503924647,1.0,826,687,https://www.flickr.com/photos/atoach/27868852041,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n89265ce23a10ebe9,https://c1.staticflickr.com/6/5681/30425702622_55ef49272f_o.jpg,0.0,0.0,0.5,0.75,982,624,https://www.flickr.com/photos/armymaterielcommand/30425702622/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/\n394efece813cf835,https://c1.staticflickr.com/6/5468/29975017416_bb705990b5_o.jpg,0.0,0.25,0.5625,1.0,975,422,https://www.flickr.com/photos/jsjgeology/29975017416,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n4564855b694b4c4f,https://c1.staticflickr.com/8/7616/26553708633_c25f01eb54_o.jpg,0.0,0.0,0.473457675753,0.75,780,130,https://www.flickr.com/photos/thoseguys119/26553708633,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nc15bfaa5507a192b,https://c1.staticflickr.com/8/7332/28106145076_c11dd3b14d_o.jpg,0.0,0.25,0.5,1.0,558,507,https://www.flickr.com/photos/vitofun/28106145076,https://creativecommons.org/licenses/by/2.0/,Vito  Fun,https://www.flickr.com/people/vitofun/\n3bd2be0773c5597d,https://c1.staticflickr.com/9/8876/28971611026_6a15cc1c73_o.jpg,0.4375,0.0,1.0,0.75,986,647,https://www.flickr.com/photos/jseelbach/28971611026,https://creativecommons.org/licenses/by/2.0/,Julius Seelbach,https://www.flickr.com/people/jseelbach/\n4f62bef440d663c2,https://c1.staticflickr.com/6/5830/31320120676_a73163cb09_o.jpg,0.25,0.0,1.0,1.0,50,57,https://flickr.com/146749261@N05/31320120676,https://creativecommons.org/licenses/by/2.0/,@ FS Images,https://www.flickr.com/people/146749261@N05/\na9410c6d06bca7ef,https://c1.staticflickr.com/8/7377/27899968076_ca4d9c5e6b_o.jpg,0.0,0.5,0.75,1.0,558,387,https://www.flickr.com/photos/esoastronomy/27899968076,https://creativecommons.org/licenses/by/2.0/,European Southern Observatory,https://www.flickr.com/people/esoastronomy/\n865c22c59f23a382,https://c1.staticflickr.com/9/8535/29753512076_033baa1e5f_o.jpg,0.25,0.0,0.75,0.75,967,501,https://www.flickr.com/photos/shankaronline/29753512076,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n9ec17e0dd0115e57,https://c1.staticflickr.com/6/5779/30700157176_c010eb19d6_o.jpg,0.0,0.0,0.498159057437,0.75,752,984,https://www.flickr.com/photos/davehamster/30700157176,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n96c9b394d26a0e07,https://c1.staticflickr.com/9/8385/29345403475_32da13b313_o.jpg,0.0,0.25,0.5,1.0,426,837,https://www.flickr.com/photos/cmichel67/29345403475,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/\n59c61c1e72a3757b,https://c1.staticflickr.com/4/3720/32463465520_3ab218ebe5_o.jpg,0.25,0.0,0.75,0.75,116,824,https://www.flickr.com/photos/silkebaron/32463465520,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/\n46f7ffbffac617ed,https://c1.staticflickr.com/9/8705/28257724020_cbc8260034_o.jpg,0.0896551724138,0.0,1.0,1.0,319,282,https://www.flickr.com/photos/gails_pictures/28257724020,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nad54fe631197c46f,https://c1.staticflickr.com/6/5777/30306598544_45d7790434_o.jpg,0.25,0.0,1.0,1.0,810,577,https://www.flickr.com/photos/68147320@N02/30306598544,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\n5568d5c80c28f3a9,https://c1.staticflickr.com/7/6080/6101018315_13df00e66d_o.jpg,0.479437229437,0.25,0.958874458874,1.0,875,545,https://www.flickr.com/photos/davidwilson1949/6101018315,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n0a991d4b1bb84222,https://c1.staticflickr.com/8/7442/27810141205_259c2c7141_o.jpg,0.250923190547,0.0,0.75276957164,0.75,896,619,https://www.flickr.com/photos/13476480@N07/27810141205,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n80bab2fc1b1f0cc6,https://c1.staticflickr.com/8/7415/26893561024_bfd5dcd3ae_o.jpg,0.0,0.0,1.0,1.0,484,145,https://www.flickr.com/photos/map/26893561024,https://creativecommons.org/licenses/by/2.0/,map,https://www.flickr.com/people/map/\na8b5ebcf8fa29c5f,https://c1.staticflickr.com/6/5622/30730405831_b9b247002b_o.jpg,0.0,0.25,0.67667238422,1.0,820,913,https://flickr.com/47225149@N07/30730405831,https://creativecommons.org/licenses/by/2.0/,Dutch Boyd,https://www.flickr.com/people/localvegas/\nbc0d82ed9e18bc52,https://c1.staticflickr.com/1/301/31994799785_32116bbdd8_o.jpg,0.25,0.25,1.0,1.0,693,800,https://www.flickr.com/photos/sixteenmilesofstring/31994799785/,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/\n854ec432cb7cb227,https://c1.staticflickr.com/6/5543/29900346290_78c6f293ca_o.jpg,0.0,0.0,0.75,1.0,975,382,http://www.flickr.com/photos/47445767@N05/29900346290,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nfdc25f6bef50f0f7,https://c1.staticflickr.com/8/7414/26794876006_355be34bc8_o.jpg,0.332842415317,0.0,0.99852724595,1.0,404,910,https://www.flickr.com/photos/navcent/26794876006/,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/\n07291b807f06aba9,https://c1.staticflickr.com/6/5689/30674880970_b88f507b85_o.jpg,0.0,0.0,0.666666666667,1.0,653,413,https://www.flickr.com/photos/usarmyafrica/30674880970,https://creativecommons.org/licenses/by/2.0/,US Army Africa,https://www.flickr.com/people/usarmyafrica/\n01d22f91e26bb81c,https://c1.staticflickr.com/2/1671/26467041370_d4f20e2aea_o.jpg,0.485426008969,0.25,1.0,1.0,407,37,https://www.flickr.com/photos/eltb/26467041370,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n64dcdbce369b771e,https://c1.staticflickr.com/9/8295/28730331744_3ed9892235_o.jpg,0.4375,0.0,1.0,0.75,979,395,https://www.flickr.com/photos/lofink/28730331744/,https://creativecommons.org/licenses/by/2.0/,David Lofink,https://www.flickr.com/people/lofink/\n0e3e585fada8a9b7,https://c1.staticflickr.com/8/7040/27184333564_9a53ab7e6d_o.jpg,0.0,0.0,0.5625,0.75,416,651,https://www.flickr.com/photos/stevendepolo/27184333564,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nd3d5b0e4d7406947,https://c1.staticflickr.com/1/479/32218813675_2e18ac3471_o.jpg,0.0,0.0,0.645728643216,0.75,851,568,https://www.flickr.com/photos/thepeachpeddler/32218813675,https://creativecommons.org/licenses/by/2.0/,thepeachpeddler,https://www.flickr.com/people/thepeachpeddler/\n1e7d95b4f2f7f145,https://c1.staticflickr.com/8/7449/27467868920_f98e65b86b_o.jpg,0.271186440678,0.0,1.0,1.0,717,552,https://www.flickr.com/photos/duncanh1/27467868920/,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\n8951b233e5c08a1b,https://c1.staticflickr.com/4/3764/33456857325_563ae52d0c_o.jpg,0.0,0.0,1.0,1.0,796,576,https://www.flickr.com/photos/billmorrow/33456857325/,https://creativecommons.org/licenses/by/2.0/,Bill Morrow,https://www.flickr.com/people/billmorrow/\n4346a9236f07a96e,https://c1.staticflickr.com/8/7428/27867864261_46a5e6c462_o.jpg,0.25,0.0,0.75,0.75,561,911,http://www.flickr.com/photos/dinumukherjee/27867864261/,https://creativecommons.org/licenses/by/2.0/,Dinu Mukherjee,https://www.flickr.com/people/dinumukherjee/\nc281a3896a13dcf4,https://c1.staticflickr.com/8/7600/27537864963_76fb237586_o.jpg,0.0,0.0,0.70534150613,0.75,920,642,https://www.flickr.com/photos/byzantiumbooks/27537864963,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/\nee02222da14c4baf,https://c1.staticflickr.com/6/5750/29920916720_224b3e8d5a_o.jpg,0.0,0.5,0.75,1.0,563,396,https://flickr.com/25797459@N06/29920916720,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/\n5148632709203f26,https://c1.staticflickr.com/9/8137/29668016191_e4f2e0cbfa_o.jpg,0.0,0.0,0.56338028169,0.75,526,412,https://www.flickr.com/photos/jaygalvin/29668016191,https://creativecommons.org/licenses/by/2.0/,Jay Galvin,https://www.flickr.com/people/jaygalvin/\n252c688d536c7b81,https://c1.staticflickr.com/9/8550/30217166912_5d961c0678_o.jpg,0.0,0.25,0.5625,1.0,820,459,https://www.flickr.com/photos/jasoncartwright/30217166912,https://creativecommons.org/licenses/by/2.0/,Jason Cartwright,https://www.flickr.com/people/jasoncartwright/\n24d22f8923e66373,https://c1.staticflickr.com/9/8083/29040614113_ec4b1c787b_o.jpg,0.0,0.0,1.0,1.0,963,783,https://flickr.com/73451168@N00/29040614113,https://creativecommons.org/licenses/by/2.0/,J Wynia,https://www.flickr.com/people/jwynia/\n6e958521c7586286,https://c1.staticflickr.com/6/5641/31141619325_6d09acf278_o.jpg,0.0,0.25,0.499263622975,1.0,404,473,https://www.flickr.com/photos/us_embassy_newzealand/31141619325,https://creativecommons.org/licenses/by/2.0/,US Embassy,https://www.flickr.com/people/us_embassy_newzealand/\n6c9db8b16874d992,https://c1.staticflickr.com/6/5588/30840611922_21199963bd_o.jpg,0.5,0.25,1.0,1.0,976,586,https://www.flickr.com/photos/o_0/30840611922/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n581f4a7fb19abc45,https://c1.staticflickr.com/1/479/31038106223_dc8034279a_o.jpg,0.305989583333,0.25,1.0,1.0,420,102,http://www.flickr.com/photos/iblee/31038106223/,https://creativecommons.org/licenses/by/2.0/,lee leblanc,https://www.flickr.com/people/iblee/\n0e1a8a2ee27559a5,https://c1.staticflickr.com/8/7285/27877075156_38378fc26a_o.jpg,0.0,0.0,1.0,1.0,960,884,https://www.flickr.com/photos/naotakem/27877075156,https://creativecommons.org/licenses/by/2.0/,Naotake Murayama,https://www.flickr.com/people/naotakem/\n36ed2d50cfbb3372,https://c1.staticflickr.com/9/8713/28391753412_49cd680fd7_o.jpg,0.333333333333,0.0,1.0,1.0,980,865,https://www.flickr.com/photos/mypubliclands/28391753412,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n1f6ac792e75f9cad,https://c1.staticflickr.com/1/725/32378658705_0f24d3a0a5_o.jpg,0.0,0.0,1.0,1.0,313,923,https://www.flickr.com/photos/treegrow/32378658705,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n6e703bb64d14b304,https://c1.staticflickr.com/9/8741/28297568711_599c18187b_o.jpg,0.0,0.0,0.666666666667,1.0,428,567,https://www.flickr.com/photos/visitmelbourne/28297568711/,https://creativecommons.org/licenses/by/2.0/,Tourism Victoria,https://www.flickr.com/people/visitmelbourne/\nf88259852b5bfa56,https://c1.staticflickr.com/9/8547/29584949230_40562154e6_o.jpg,0.0,0.0,0.603085553997,1.0,405,570,https://www.flickr.com/photos/hisgett/29584949230/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n69248938edf0e2ee,https://c1.staticflickr.com/8/7353/27498210483_f8bf1723b1_o.jpg,0.0,0.0,0.5,0.75,459,642,https://www.flickr.com/photos/summonedbyfells/27498210483/,https://creativecommons.org/licenses/by/2.0/,summonedbyfells,https://www.flickr.com/people/summonedbyfells/\n14df9b521676ff6b,https://c1.staticflickr.com/1/347/31431438860_a5e3d32ed0_o.jpg,0.0,0.0,1.0,0.811382113821,891,81,https://www.flickr.com/photos/dohastadiumplusqatar/31431438860/,https://creativecommons.org/licenses/by/2.0/,Doha Stadium Plus Qatar,https://www.flickr.com/people/dohastadiumplusqatar/\nbc0ba0112bee28da,https://c1.staticflickr.com/8/7726/26782042864_af5deed0c7_o.jpg,0.25,0.0,1.0,1.0,976,678,https://www.flickr.com/photos/16725630@N00/26782042864,https://creativecommons.org/licenses/by/2.0/,Matt Zimmerman,https://www.flickr.com/people/16725630@N00/\n1bfd727f7f331275,https://c1.staticflickr.com/1/260/31057995984_1ccb2c024a_o.jpg,0.0,0.0,0.75,1.0,875,918,https://www.flickr.com/photos/69203347@N03/31057995984/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n6aa3d188c976eee9,https://c1.staticflickr.com/8/7043/26989165486_6ca2ed97d2_o.jpg,0.0,0.0,0.666666666667,1.0,100,388,https://www.flickr.com/photos/ddebold/26989165486,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/\n0bce12d12f20fbb9,https://c1.staticflickr.com/8/7504/29239307602_57bfc14926_o.jpg,0.25,0.25,0.75,1.0,355,88,https://www.flickr.com/photos/pyramidtexts/29239307602,https://creativecommons.org/licenses/by/2.0/,Vincent Brown,https://www.flickr.com/people/pyramidtexts/\n2b0092b5867e5f13,https://c1.staticflickr.com/8/7563/27934954655_f7d9f09407_o.jpg,0.0,0.0,0.75,0.5,853,497,https://www.flickr.com/photos/21560098@N06/27934954655,https://creativecommons.org/licenses/by/2.0/,Nina Matthews Photography,https://www.flickr.com/people/21560098@N06/\n9dcbcc82b1e47120,https://c1.staticflickr.com/8/7561/27682536761_f805b2fefa_o.jpg,0.0,0.25,0.5625,1.0,644,408,https://www.flickr.com/photos/jdlasica/27682536761,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\nc2c3ce724c93cb14,https://c1.staticflickr.com/6/5676/30347548570_b030fda4a7_o.jpg,0.5,0.25,1.0,1.0,459,691,http://www.flickr.com/photos/barretthall/30347548570/,https://creativecommons.org/licenses/by/2.0/,popofatticus,https://www.flickr.com/people/barretthall/\n0906b1904b146f57,https://c1.staticflickr.com/9/8635/30432237455_356523ec6e_o.jpg,0.4375,0.0,1.0,0.75,920,504,https://www.flickr.com/photos/bazzadarambler/30432237455,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\nb21cc2dd249a7859,https://c1.staticflickr.com/6/5667/30798815560_4d58dcdf25_o.jpg,0.0,0.0,0.75,0.75,471,695,https://www.flickr.com/photos/27353377@N04/30798815560/,https://creativecommons.org/licenses/by/2.0/,Carrie A.,https://www.flickr.com/people/27353377@N04/\n306bb14e4dd599b3,https://c1.staticflickr.com/8/7392/28064760906_5a5bbd3d8a_o.jpg,0.307365439093,0.0,0.92209631728,1.0,629,858,https://www.flickr.com/photos/jdlasica/28064760906,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\nbe3b333c8f71ae5a,https://c1.staticflickr.com/1/93/31520511066_542a3e0445_o.jpg,0.229217603912,0.0,0.687652811736,1.0,709,995,https://flickr.com/8146925@N08/31520511066,https://creativecommons.org/licenses/by/2.0/,\\303\\201ngel M. Felic\\303\\255simo,https://www.flickr.com/people/elgolem/\n333393730953e5b3,https://c1.staticflickr.com/9/8011/29216897003_fbc15e496b_o.jpg,0.28125,0.25,0.84375,1.0,625,844,https://www.flickr.com/photos/publiclibrariesnsw/29216897003,https://creativecommons.org/licenses/by/2.0/,State Library of NSW Public Library Services,https://www.flickr.com/people/publiclibrariesnsw/\n3d98314058b49796,https://c1.staticflickr.com/8/7184/27330675470_f01cd844b3_o.jpg,0.493045387994,0.25,0.986090775988,1.0,426,752,https://www.flickr.com/photos/72821066@N04/27330675470,https://creativecommons.org/licenses/by/2.0/,Kathleen,https://www.flickr.com/people/72821066@N04/\n3d858aa8d3b69b42,https://c1.staticflickr.com/6/5557/29863694915_a6c9a6665b_o.jpg,0.0,0.0,0.622507122507,1.0,341,457,https://www.flickr.com/photos/7326810@N08/29863694915,https://creativecommons.org/licenses/by/2.0/,Jean,https://www.flickr.com/people/7326810@N08/\n82502e2866b5d58e,https://c1.staticflickr.com/1/702/31958439974_839e53d97e_o.jpg,0.0,0.0,0.75,1.0,548,956,https://www.flickr.com/photos/belurashok/31958439974,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/\n758a2ce307c70cb7,https://c1.staticflickr.com/9/8736/28449013200_a0dc04bf4c_o.jpg,0.0,0.0,0.75117370892,1.0,606,510,https://www.flickr.com/photos/tamakisono/28449013200,https://creativecommons.org/licenses/by/2.0/,Tamaki Sono,https://www.flickr.com/people/tamakisono/\nd82b521a161e3cfa,https://c1.staticflickr.com/6/5479/30679608780_e484e611ed_o.jpg,0.0,0.0,0.666666666667,1.0,719,739,https://www.flickr.com/photos/ben_salter/30679608780,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/\n0fc6f2d31f532581,https://c1.staticflickr.com/6/5776/30046535856_4c6ee79d68_o.jpg,0.25,0.0,1.0,0.619458128079,27,626,https://www.flickr.com/photos/12567713@N00/30046535856,https://creativecommons.org/licenses/by/2.0/,born1945,https://www.flickr.com/people/12567713@N00/\n2339fc4559a37fb2,https://c1.staticflickr.com/6/5823/30235945205_f5ff47929b_o.jpg,0.0,0.0,1.0,0.799676898223,960,230,https://www.flickr.com/photos/bluemarleysabyss/30235945205,https://creativecommons.org/licenses/by/2.0/,Julia S.,https://www.flickr.com/people/bluemarleysabyss/\na4641b1496f6d212,https://c1.staticflickr.com/6/5683/29969439090_15a8f03be2_o.jpg,0.273726851852,0.25,0.821180555556,1.0,672,235,https://www.flickr.com/photos/glorycycles/29969439090,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n6f7e882f95d9cad1,https://c1.staticflickr.com/9/8089/29592676161_e7cdb8e7c2_o.jpg,0.0,0.25,0.5625,1.0,906,56,https://www.flickr.com/photos/adactio/29592676161,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/\n384922a61058d22a,https://c1.staticflickr.com/9/8638/28621782691_b5b92622b9_o.jpg,0.281690140845,0.25,0.845070422535,1.0,309,957,https://www.flickr.com/photos/rippchenmitkraut66/28621782691/,https://creativecommons.org/licenses/by/2.0/,rippchenmitkraut66,https://www.flickr.com/people/rippchenmitkraut66/\n74a0f69178788c94,https://c1.staticflickr.com/9/8552/29890747401_b02169b564_o.jpg,0.0,0.235387045814,1.0,1.0,922,233,https://www.flickr.com/photos/rich701/29890747401/,https://creativecommons.org/licenses/by/2.0/,Richard,https://www.flickr.com/people/rich701/\n04727f8a38a80019,https://c1.staticflickr.com/1/426/30867308804_7688962f8e_o.jpg,0.0,0.0,0.5,0.75,717,617,https://www.flickr.com/photos/78428166@N00/30867308804/,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\nd2c219fdbd8fa0f0,https://c1.staticflickr.com/8/7519/26955322890_76804ba70f_o.jpg,0.25,0.0,0.75,0.75,972,624,https://www.flickr.com/photos/usaghumphreys/26955322890,https://creativecommons.org/licenses/by/2.0/,USAG- Humphreys,https://www.flickr.com/people/usaghumphreys/\n8e0cab0af054d36d,https://c1.staticflickr.com/9/8450/29096384102_a8bd2945bb_o.jpg,0.248348017621,0.0,0.745044052863,0.75,484,300,https://www.flickr.com/photos/sybarite48/29096384102,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n969cc631529587a2,https://c1.staticflickr.com/1/721/32349330296_21b1655fec_o.jpg,0.333333333333,0.0,1.0,1.0,511,240,https://www.flickr.com/photos/imo-un/32349330296,https://creativecommons.org/licenses/by/2.0/,International Maritime Organization,https://www.flickr.com/people/imo-un/\n39d50c128ba7b0bd,https://c1.staticflickr.com/8/7202/26933423786_c7e2e292b6_o.jpg,0.25,0.0,0.75,0.75,752,68,https://www.flickr.com/photos/joe_labrie_photographe/26933423786/,https://creativecommons.org/licenses/by/2.0/,Joe Labrie,https://www.flickr.com/people/joe_labrie_photographe/\n9d27aa28f202ae78,https://c1.staticflickr.com/9/8279/28519602574_421d3bb35c_o.jpg,0.275154798762,0.25,0.825464396285,1.0,593,531,https://flickr.com/100239928@N08/28519602574,https://creativecommons.org/licenses/by/2.0/,BTC Keychain,https://www.flickr.com/people/btckeychain/\n63addd49ab984a14,https://c1.staticflickr.com/8/7426/26580891193_64130dd4e6_o.jpg,0.0,0.25,0.5625,1.0,780,811,https://www.flickr.com/photos/thoseguys119/26580891193,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n4f7952d5ab4d7f39,https://c1.staticflickr.com/8/7414/27653365675_d946076c36_o.jpg,0.31726618705,0.0,0.951798561151,1.0,896,68,https://www.flickr.com/photos/621crw/27653365675/,https://creativecommons.org/licenses/by/2.0/,The 621st Contingency Response Wing,https://www.flickr.com/people/621crw/\n1cdd7d5724781f3e,https://c1.staticflickr.com/1/740/31904299905_e19ef4e4c5_o.jpg,0.5,0.0,1.0,0.75,818,566,https://www.flickr.com/photos/greggjerdingen/31904299905,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n59c03ccc5cb833f1,https://c1.staticflickr.com/8/7516/26965614291_69ef89061c_o.jpg,0.633522727273,0.25,1.0,1.0,459,517,https://www.flickr.com/photos/22711505@N05/26965614291,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n97bed290680759be,https://c1.staticflickr.com/8/7645/27687952991_bc3c647f5f_o.jpg,0.25,0.25,0.75,1.0,566,733,https://www.flickr.com/photos/sodaigomi/27687952991,https://creativecommons.org/licenses/by/2.0/,sodai gomi,https://www.flickr.com/people/sodaigomi/\nff0c3df74e9f135e,https://c1.staticflickr.com/6/5447/30634365842_7f9795843b_o.jpg,0.0,0.25,0.504444444444,1.0,309,506,http://www.flickr.com/photos/patrick_k59/30634365842/,https://creativecommons.org/licenses/by/2.0/,patrickkavanagh,https://www.flickr.com/people/patrick_k59/\n9ec8e5c890b81bec,https://c1.staticflickr.com/1/538/31953872514_49b33f5c90_o.jpg,0.4375,0.0,1.0,0.75,833,431,https://www.flickr.com/photos/exoticvacations/31953872514/,https://creativecommons.org/licenses/by/2.0/,Wangpin Thondup,https://www.flickr.com/people/exoticvacations/\ndf572b6bd546d236,https://c1.staticflickr.com/6/5796/30707232921_cbcebcf3fd_o.jpg,0.25,0.0,1.0,0.75,863,677,https://flickr.com/8060974@N02/30707232921,https://creativecommons.org/licenses/by/2.0/,Jenny Brown,https://www.flickr.com/people/jennyellenbrown/\nabe66b0da8ba0cee,https://c1.staticflickr.com/9/8398/29584610700_f4b2de2224_o.jpg,0.25,0.0,1.0,1.0,909,699,https://www.flickr.com/photos/adactio/29584610700,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/\nb5761c4a445eee44,https://c1.staticflickr.com/9/8072/29162789670_7fa9814061_o.jpg,0.25,0.0,1.0,1.0,693,564,https://www.flickr.com/photos/jeepersmedia/29162789670,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nbec534f903cf5c51,https://c1.staticflickr.com/9/8053/28783558610_bfcd207777_o.jpg,0.311985172982,0.25,0.935955518946,1.0,309,121,https://www.flickr.com/photos/gails_pictures/28783558610,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n178f5890f92a92a0,https://c1.staticflickr.com/9/8207/29155554523_72e2b20b06_o.jpg,0.25,0.25,1.0,1.0,490,931,https://www.flickr.com/photos/antoine-imbert/29155554523,https://creativecommons.org/licenses/by/2.0/,Antoine Imbert,https://www.flickr.com/people/antoine-imbert/\n6f55c835fbdd6d98,https://c1.staticflickr.com/8/7430/26992832744_643a944acd_o.jpg,0.210588633288,0.0,0.631765899865,0.75,615,922,https://www.flickr.com/photos/mujitra/26992832744,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/\nce5ea55a4e02fbaa,https://c1.staticflickr.com/9/8317/29144929061_bec56ce980_o.jpg,0.225,0.0,0.675,0.75,653,771,https://www.flickr.com/photos/ftmeade/29144929061,https://creativecommons.org/licenses/by/2.0/,Fort George G. Meade Public Affairs Office,https://www.flickr.com/people/ftmeade/\n67b3d77c9b48e559,https://c1.staticflickr.com/8/7509/27411623806_1662e45bf2_o.jpg,0.0,0.0,1.0,0.876480541455,947,452,https://www.flickr.com/photos/92252798@N07/27411623806,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/\nc5b048a9be49d144,https://c1.staticflickr.com/8/7343/27275933712_c7fde42257_o.jpg,0.568493150685,0.25,1.0,1.0,752,859,https://www.flickr.com/photos/odolphie/27275933712,https://creativecommons.org/licenses/by/2.0/,Niki Odolphie,https://www.flickr.com/people/odolphie/\n19917ce4c0b73d03,https://c1.staticflickr.com/8/7288/26653682243_628884d4f6_o.jpg,0.260918674699,0.25,0.782756024096,1.0,324,421,https://www.flickr.com/photos/zeevveez/26653682243,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/\nce81ad607ec10f0e,https://c1.staticflickr.com/3/2048/32878661076_01bfc34e57_o.jpg,0.25,0.25,0.75,1.0,765,773,https://www.flickr.com/photos/big-ashb/32878661076/,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/\n2ca9a74e9461a362,https://c1.staticflickr.com/9/8827/28241039050_2c557eb372_o.jpg,0.25,0.298309178744,1.0,0.894927536232,975,884,https://www.flickr.com/photos/jsjgeology/28241039050,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nf041df267ce93962,https://c1.staticflickr.com/8/7683/27716953064_29679bc94a_o.jpg,0.4375,0.0,1.0,0.75,975,48,https://www.flickr.com/photos/jsjgeology/27716953064,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n1c015da4dd90f54c,https://c1.staticflickr.com/9/8071/29334655541_2793451f1a_o.jpg,0.25,0.0,1.0,1.0,980,597,https://www.flickr.com/photos/amslerpix/29334655541,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n15b8410a7a0fc434,https://c1.staticflickr.com/8/7333/27727564000_1fe1c23bc1_o.jpg,0.25,0.313118811881,1.0,0.939356435644,980,5,https://www.flickr.com/photos/blmoregon/27727564000,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\nd37c6ec499a02bc6,https://c1.staticflickr.com/4/3865/32902482982_5b7fe586d9_o.jpg,0.25,0.0,0.75,0.75,868,965,https://www.flickr.com/photos/76969036@N02/32902482982,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\na1c46868be2ff302,https://c1.staticflickr.com/1/512/32344107335_f1eb8eaba4_o.jpg,0.25,0.27032208589,1.0,0.810966257669,512,539,https://www.flickr.com/photos/andreboeni/32344107335,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\na1f111b8f669920d,https://c1.staticflickr.com/6/5536/30697916911_873c73d330_o.jpg,0.236940298507,0.0,0.710820895522,1.0,653,736,https://www.flickr.com/photos/thejointstaff/30697916911,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/\n568db43a7ae9904e,https://c1.staticflickr.com/9/8023/29466569235_239555efe7_o.jpg,0.249631811487,0.25,0.748895434462,1.0,896,784,https://www.flickr.com/photos/markyharky/29466569235,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n97c72b4e6148bdd6,https://c1.staticflickr.com/9/8299/29495450326_68081f5b7d_o.jpg,0.285686119874,0.0,0.857058359621,0.75,972,564,https://www.flickr.com/photos/catsper/29495450326,https://creativecommons.org/licenses/by/2.0/,J c,https://www.flickr.com/people/catsper/\nc2444bf73d554023,https://c1.staticflickr.com/1/525/32588098091_5fe70c8d82_o.jpg,0.0,0.0,0.5625,0.75,518,330,https://www.flickr.com/photos/jamesbondsv/32588098091,https://creativecommons.org/licenses/by/2.0/,Steven Vance,https://www.flickr.com/people/jamesbondsv/\n498fe23c9b77db96,https://c1.staticflickr.com/6/5348/30540867642_286f83e003_o.jpg,0.28125,0.0,0.84375,0.75,450,510,https://www.flickr.com/photos/augustbrill/30540867642/,https://creativecommons.org/licenses/by/2.0/,August Brill,https://www.flickr.com/people/augustbrill/\nbca5c8f95cd08bb5,https://c1.staticflickr.com/6/5740/30897148861_bbd57f8335_o.jpg,0.25,0.25,0.75,1.0,979,598,https://www.flickr.com/photos/braiu_74/30897148861/,https://creativecommons.org/licenses/by/2.0/,Paolo Braiuca,https://www.flickr.com/people/braiu_74/\n61848a7a553d1b5c,https://c1.staticflickr.com/9/8257/28809838033_8d50bef5e4_o.jpg,0.5,0.25,1.0,1.0,959,922,https://www.flickr.com/photos/glenbowman/28809838033,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/\n8adcd740959ffadc,https://c1.staticflickr.com/1/356/32419087811_5e71ab356d_o.jpg,0.0,0.0,1.0,0.666666666667,341,611,http://www.flickr.com/photos/happymillerman/32419087811/,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\n769b04f34bb2a350,https://c1.staticflickr.com/8/7538/26791253293_b750bb1032_o.jpg,0.0,0.0,0.5,0.75,777,57,https://www.flickr.com/photos/usafe/26791253293/,https://creativecommons.org/licenses/by/2.0/,USAFE AFAFRICA,https://www.flickr.com/people/usafe/\n09540b63dc9894c5,https://c1.staticflickr.com/8/7196/27080002421_2473986b0a_o.jpg,0.0,0.25,0.63875,1.0,448,500,https://www.flickr.com/photos/51764518@N02/27080002421,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n80aaa01c95b76d0a,https://c1.staticflickr.com/6/5815/30978067906_6aab221b70_o.jpg,0.0,0.0,1.0,1.0,499,134,http://www.flickr.com/photos/jonicdao/30978067906/,https://creativecommons.org/licenses/by/2.0/,jojo nicdao,https://www.flickr.com/people/jonicdao/\n706c48da4ebcf737,https://c1.staticflickr.com/6/5338/30478269120_7a6d569965_o.jpg,0.0,0.0,0.5,0.75,898,612,https://flickr.com/56324301@N00/30478269120,https://creativecommons.org/licenses/by/2.0/,rohypnol [Francesco Zaia],https://www.flickr.com/people/rohypnol/\n7c1307f03ca3108b,https://c1.staticflickr.com/1/772/31323010074_e3d7feb1aa_o.jpg,0.423913043478,0.0,0.847826086957,0.75,407,771,https://www.flickr.com/photos/eltb/31323010074,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nbeaf64b58a74512f,https://c1.staticflickr.com/9/8745/28726152391_b21090a7f7_o.jpg,0.0,0.0,0.499263622975,0.75,896,764,https://www.flickr.com/photos/13476480@N07/28726152391,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n7af23b2069f08360,https://c1.staticflickr.com/9/8725/28599606353_f2da87c816_o.jpg,0.0,0.25,0.5,1.0,820,85,https://www.flickr.com/photos/146190439@N03/28599606353/,https://creativecommons.org/licenses/by/2.0/,Klimacamp im Rheinland,https://www.flickr.com/people/146190439@N03/\n4f5ca68718bd3263,https://c1.staticflickr.com/1/406/31599942061_ccee753564_o.jpg,0.2806640625,0.25,0.8419921875,1.0,750,734,https://flickr.com/73840284@N04/31599942061,https://creativecommons.org/licenses/by/2.0/,Harry Rose,https://www.flickr.com/people/macleaygrassman/\n12738de9177dafd6,https://c1.staticflickr.com/2/1519/26737086846_557652b2cd_o.jpg,0.0,0.280784844384,1.0,0.842354533153,980,407,https://www.flickr.com/photos/ekigyuu/26737086846,https://creativecommons.org/licenses/by/2.0/,California Cow,https://www.flickr.com/people/ekigyuu/\n176e15c13401b234,https://c1.staticflickr.com/1/533/31616898185_c847deb981_o.jpg,0.25,0.25,0.75,1.0,981,325,https://www.flickr.com/photos/jseita/31616898185,https://creativecommons.org/licenses/by/2.0/,Jun Seita,https://www.flickr.com/people/jseita/\n255cc92540462d11,https://c1.staticflickr.com/9/8621/29061797951_8e770decf8_o.jpg,0.0,0.25,0.75,1.0,786,551,https://www.flickr.com/photos/mig/29061797951,https://creativecommons.org/licenses/by/2.0/,miguelb,https://www.flickr.com/people/mig/\n8f59677ee8f12cbd,https://c1.staticflickr.com/9/8782/29040754903_242deaa93d_o.jpg,0.4375,0.25,1.0,1.0,625,610,https://www.flickr.com/photos/publiclibrariesnsw/29040754903,https://creativecommons.org/licenses/by/2.0/,State Library of NSW Public Library Services,https://www.flickr.com/people/publiclibrariesnsw/\n37f7386a82f542c7,https://c1.staticflickr.com/1/428/31640670023_d9bb6276cb_o.jpg,0.25,0.0,1.0,0.684051724138,592,476,https://www.flickr.com/photos/phoebe_photo/31640670023,https://creativecommons.org/licenses/by/2.0/,Phoebe Baker,https://www.flickr.com/people/phoebe_photo/\n852e6b3080ab17d2,https://c1.staticflickr.com/1/288/32264250986_b0e60f8a74_o.jpg,0.0,0.25,0.736583184258,1.0,310,962,https://flickr.com/43272765@N04/32264250986,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n920cca78581d9f4c,https://c1.staticflickr.com/1/735/32127327552_fe9e52d6c8_o.jpg,0.0,0.25,0.599757673667,1.0,880,851,https://www.flickr.com/photos/stevendepolo/32127327552,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n092818c8c6c5982a,https://c1.staticflickr.com/6/5754/29593995264_76e9bc50f9_o.jpg,0.0,0.0,0.666666666667,1.0,718,120,https://www.flickr.com/photos/greggjerdingen/29593995264,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n771af14fce3fba43,https://c1.staticflickr.com/6/5476/30753183936_958193daae_o.jpg,0.28125,0.0,0.84375,0.75,820,911,https://www.flickr.com/photos/dhaun/30753183936/,https://creativecommons.org/licenses/by/2.0/,Dirk Haun,https://www.flickr.com/people/dhaun/\na8656992ebce4856,https://c1.staticflickr.com/2/1637/26140671534_d9daf08651_o.jpg,0.333333333333,0.0,1.0,1.0,976,894,https://www.flickr.com/photos/o_0/26140671534/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n5098cfb8c7073c11,https://c1.staticflickr.com/8/7495/27018332354_f199013190_o.jpg,0.0,0.0,0.75,0.5625,459,151,https://www.flickr.com/photos/atoach/27018332354,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\nc31bf2a561660a48,https://c1.staticflickr.com/6/5755/30669717416_3011752a30_o.jpg,0.0,0.0,0.5,0.75,108,649,https://www.flickr.com/photos/u07ch/30669717416,https://creativecommons.org/licenses/by/2.0/,Chris Hoare,https://www.flickr.com/people/u07ch/\nc873c43ba87746e4,https://c1.staticflickr.com/9/8630/28729485836_d91dcfb607_o.jpg,0.336764705882,0.0,1.0,1.0,647,396,https://www.flickr.com/photos/shankaronline/28729485836,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n43c9215ee68bc5d7,https://c1.staticflickr.com/9/8418/29823325382_be6a60cda5_o.jpg,0.25,0.25,0.75,1.0,985,159,https://www.flickr.com/photos/yann07/29823325382,https://creativecommons.org/licenses/by/2.0/,Yann C\\305\\223uru,https://www.flickr.com/people/yann07/\n50828d348b4b02e3,https://c1.staticflickr.com/8/7625/28370914165_a3ee0f995f_o.jpg,0.0,0.0,0.75,1.0,309,41,https://flickr.com/86548370@N00/28370914165,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n2605210b837b62c0,https://c1.staticflickr.com/6/5612/30458504186_56dac3ea08_o.jpg,0.0,0.25,0.524546827795,1.0,40,305,https://www.flickr.com/photos/puliarfanita/30458504186/,https://creativecommons.org/licenses/by/2.0/,Anita Ritenour,https://www.flickr.com/people/puliarfanita/\naa9bc11261d7a2ff,https://c1.staticflickr.com/8/7525/28250324241_42fcd989be_o.jpg,0.498153618907,0.25,1.0,1.0,848,801,https://www.flickr.com/photos/13476480@N07/28250324241,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n1717f691372b0819,https://c1.staticflickr.com/6/5577/31104154361_7f2f38526f_o.jpg,0.28125,0.0,0.84375,0.75,975,855,https://www.flickr.com/photos/jsjgeology/31104154361,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n31808e17e25f3752,https://c1.staticflickr.com/1/661/32365383110_a722efd9d5_o.jpg,0.25,0.428627760252,1.0,1.0,612,410,https://flickr.com/52107254@N05/32365383110,https://creativecommons.org/licenses/by/2.0/,Grace Hwu,https://www.flickr.com/people/sotghwu/\n2f97c75ea7a469ac,https://c1.staticflickr.com/9/8072/28779080532_522ea40971_o.jpg,0.0,0.25,0.5,1.0,620,530,https://www.flickr.com/photos/juggernautco/28779080532,https://creativecommons.org/licenses/by/2.0/,Daniel X. O&#x27;Neil,https://www.flickr.com/people/juggernautco/\n08453c8cf2a132ff,https://c1.staticflickr.com/9/8416/30393287656_d947c76460_o.jpg,0.0,0.0,0.510804769001,0.75,548,48,https://www.flickr.com/photos/belurashok/30393287656,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/\neb6c759090300089,https://c1.staticflickr.com/8/7081/27209879421_10ba356c74_o.jpg,0.333333333333,0.0,1.0,1.0,402,793,https://www.flickr.com/photos/mwf2005/27209879421,https://creativecommons.org/licenses/by/2.0/,muffinn,https://www.flickr.com/people/mwf2005/\nde9cd631e3f1bb3b,https://c1.staticflickr.com/6/5489/29879506755_eb432db4ca_o.jpg,0.25,0.0,0.75,0.75,443,855,https://www.flickr.com/photos/jlascar/29879506755/,https://creativecommons.org/licenses/by/2.0/,Jorge L\\303\\241scar,https://www.flickr.com/people/jlascar/\nce2f060a73fb9743,https://c1.staticflickr.com/1/694/32579057382_9bfe3c1ac7_o.jpg,0.0,0.25,0.5625,1.0,875,675,https://www.flickr.com/photos/69203347@N03/32579057382,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n29225ff6d19ebacd,https://c1.staticflickr.com/2/1476/26646359952_04816c536a_o.jpg,0.0,0.25,0.515344311377,1.0,407,40,https://www.flickr.com/photos/eltb/26646359952,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nda04a8e89336ef9c,https://c1.staticflickr.com/8/7695/26588583343_537a1a71fa_o.jpg,0.0,0.25,0.5,1.0,540,471,https://www.flickr.com/photos/dierkschaefer/26588583343/,https://creativecommons.org/licenses/by/2.0/,dierk schaefer,https://www.flickr.com/people/dierkschaefer/\nc6c1eb153349fd71,https://c1.staticflickr.com/9/8035/29700852775_6618412aae_o.jpg,0.0,0.0,0.802588996764,1.0,769,356,https://www.flickr.com/photos/dirkhansen/29700852775,https://creativecommons.org/licenses/by/2.0/,SD Dirk,https://www.flickr.com/people/dirkhansen/\nc4a0f75e6a0dcdab,https://c1.staticflickr.com/1/371/32356421506_ce717e0650_o.jpg,0.25,0.25,0.75,1.0,971,317,https://www.flickr.com/photos/davebloggs007/32356421506,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\na1a48d6b76aed9c7,https://c1.staticflickr.com/9/8505/28883283213_fb987bc869_o.jpg,0.0,0.0,1.0,0.831960461285,635,403,https://www.flickr.com/photos/kwarz/28883283213,https://creativecommons.org/licenses/by/2.0/,zeitfaenger.at,https://www.flickr.com/people/kwarz/\n080e84af4ff421bc,https://c1.staticflickr.com/6/5666/29641817484_7003c5ca5e_o.jpg,0.0,0.0,1.0,0.666666666667,459,796,https://www.flickr.com/photos/annaustin/29641817484/,https://creativecommons.org/licenses/by/2.0/,Anna Hanks,https://www.flickr.com/people/annaustin/\n28be9026c07a8fd6,https://c1.staticflickr.com/9/8768/28085160720_d38ef0ffe2_o.jpg,0.0,0.25,0.5,1.0,519,123,https://www.flickr.com/photos/box_repsol/28085160720,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n83d5a14d9ffa8eb1,https://c1.staticflickr.com/6/5664/30861030616_226717c7ff_o.jpg,0.280784844384,0.0,0.842354533153,1.0,976,626,http://www.flickr.com/photos/paalia/30861030616/,https://creativecommons.org/licenses/by/2.0/,Paul Stocker,https://www.flickr.com/people/paalia/\nd3ceb2329adfe9a5,https://c1.staticflickr.com/9/8474/29199633881_56fc117997_o.jpg,0.0,0.0,0.75,0.503698224852,407,766,https://www.flickr.com/photos/eltb/29199633881,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nea6b10138e655e0f,https://c1.staticflickr.com/6/5572/30334799742_da9f43616b_o.jpg,0.25,0.0,0.75,0.75,672,424,https://www.flickr.com/photos/blmoregon/30334799742,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\n2fc2878b88ad6b2b,https://c1.staticflickr.com/8/7249/26376699344_c01f4b9896_o.jpg,0.25,0.0,1.0,1.0,556,439,https://www.flickr.com/photos/27665395@N05/26376699344,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\ncf648fe7d2176bdc,https://c1.staticflickr.com/1/733/32562068886_2c8ef40172_o.jpg,0.312410841655,0.0,0.937232524964,1.0,986,397,https://www.flickr.com/photos/tdlucas5000/32562068886,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/\n69720b5bb72880f7,https://c1.staticflickr.com/9/8568/30344899681_e1fc8222bd_o.jpg,0.25,0.0,0.75,0.75,146,492,https://www.flickr.com/photos/o_0/30344899681,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n895807aae38ee82c,https://c1.staticflickr.com/9/8639/28526148964_d4850cd58d_o.jpg,0.25,0.0,1.0,1.0,426,447,https://www.flickr.com/photos/crondeau/28526148964,https://creativecommons.org/licenses/by/2.0/,Christine Rondeau,https://www.flickr.com/people/crondeau/\nb2ea3efeec905a9f,https://c1.staticflickr.com/9/8890/28605143951_182e356e20_o.jpg,0.5,0.25,1.0,1.0,499,187,https://www.flickr.com/photos/cbroders/28605143951,https://creativecommons.org/licenses/by/2.0/,Counse,https://www.flickr.com/people/cbroders/\n1281b9ec06ee7ea6,https://c1.staticflickr.com/6/5326/30880259920_6732d53b03_o.jpg,0.0,0.25,0.462765957447,1.0,695,447,https://www.flickr.com/photos/hisgett/30880259920/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\ne13257fa72f9d0f8,https://c1.staticflickr.com/8/7158/27087600992_3f521b8e06_o.jpg,0.438430311231,0.0,1.0,1.0,498,896,https://www.flickr.com/photos/mark-gunn/27087600992,https://creativecommons.org/licenses/by/2.0/,Mark  Gunn,https://www.flickr.com/people/mark-gunn/\nbb79e91249a0870c,https://c1.staticflickr.com/9/8158/28938349365_ea8f93db1a_o.jpg,0.0,0.0,0.739130434783,1.0,456,847,https://www.flickr.com/photos/hinkelstone/28938349365,https://creativecommons.org/licenses/by/2.0/,Karl-Ludwig Poggemann,https://www.flickr.com/people/hinkelstone/\n7d38e5523a5d5656,https://c1.staticflickr.com/3/2069/32678434991_7b325511b0_o.jpg,0.0,0.0,0.666666666667,1.0,404,70,https://www.flickr.com/photos/usnavy/32678434991,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n75b516f2f1ee9163,https://c1.staticflickr.com/8/7360/27317635511_104e050e50_o.jpg,0.0,0.0,0.421177266576,0.75,833,77,https://www.flickr.com/photos/ankurp/27317635511,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\n9296cc676dd39564,https://c1.staticflickr.com/9/8348/28325633061_5f3e78c0d4_o.jpg,0.306985294118,0.0,0.920955882353,0.75,815,820,https://www.flickr.com/photos/dangrothe/28325633061,https://creativecommons.org/licenses/by/2.0/,Daniel Grothe,https://www.flickr.com/people/dangrothe/\ne826a9302605cd52,https://c1.staticflickr.com/9/8573/28906202873_b1ece8e79f_o.jpg,0.0,0.25,0.504444444444,1.0,561,228,https://www.flickr.com/photos/jill_carlson/28906202873/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\nca7099ba7e889162,https://c1.staticflickr.com/2/1479/26178206403_111aff1b1c_o.jpg,0.28125,0.0,0.84375,0.75,780,555,https://www.flickr.com/photos/119034083@N02/26178206403,https://creativecommons.org/licenses/by/2.0/,nybuspics,https://www.flickr.com/people/119034083@N02/\n0b491af542f7ffd9,https://c1.staticflickr.com/6/5681/31419344116_b398ef6521_o.jpg,0.0,0.0,0.75,1.0,986,998,https://flickr.com/125734989@N03/31419344116,https://creativecommons.org/licenses/by/2.0/,Tu\\341\\272\\245n An,https://www.flickr.com/people/125734989@N03/\n41b367f57b6da354,https://c1.staticflickr.com/1/276/32309427916_f8489035e8_o.jpg,0.4375,0.25,1.0,1.0,108,676,https://www.flickr.com/photos/jimg944/32309427916,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n0b3e55f4f58ece40,https://c1.staticflickr.com/9/8424/29940355582_76d4cfbc92_o.jpg,0.0,0.25,0.75,1.0,600,882,https://www.flickr.com/photos/ryanrocketship/29940355582,https://creativecommons.org/licenses/by/2.0/,Ryan Ruppe,https://www.flickr.com/people/ryanrocketship/\n08fc91166bd0c709,https://c1.staticflickr.com/9/8193/29002397180_ffc3fd5978_o.jpg,0.5,0.25,1.0,1.0,457,35,https://www.flickr.com/photos/b-j-oe-r-n/29002397180/,https://creativecommons.org/licenses/by/2.0/,Bj\\303\\266rn Rudner,https://www.flickr.com/people/b-j-oe-r-n/\nb57c41ba26a0b986,https://c1.staticflickr.com/8/7320/27939723092_65e625efb5_o.jpg,0.11073253833,0.0,1.0,1.0,986,45,https://www.flickr.com/photos/29233640@N07/27939723092,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/\n38f5a375cb13f34d,https://c1.staticflickr.com/9/8879/28714081425_9fce7f78ed_o.jpg,0.5,0.25,1.0,1.0,367,827,https://www.flickr.com/photos/hirlimann/28714081425,https://creativecommons.org/licenses/by/2.0/,Ludovic Hirlimann,https://www.flickr.com/people/hirlimann/\nf53395c5f78ae587,https://c1.staticflickr.com/8/7134/27080802626_d88a1ecd23_o.jpg,0.0,0.0,0.75,1.0,479,475,https://www.flickr.com/photos/rusty_clark/27080802626,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n843282d597cbb732,https://c1.staticflickr.com/9/8022/28739516601_22e520a6fa_o.jpg,0.0,0.25,0.561328125,1.0,305,132,https://www.flickr.com/photos/treegrow/28739516601,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n7ec06f818f54c205,https://c1.staticflickr.com/1/639/32146846790_b1d654dfd8_o.jpg,0.369205298013,0.25,1.0,1.0,662,976,https://www.flickr.com/photos/jlcernadas/32146846790/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\n82adc75ee7644ed0,https://c1.staticflickr.com/8/7576/27849526600_7f96d6639b_o.jpg,0.0,0.25,0.549459041731,1.0,324,793,https://www.flickr.com/photos/usfwsmidwest/27849526600,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\nd67d5b9e6dec4a70,https://c1.staticflickr.com/9/8199/29000937046_f82b0cb579_o.jpg,0.25,0.25,1.0,1.0,944,860,https://www.flickr.com/photos/wwworks/29000937046,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/\nf35981e6a0f004a5,https://c1.staticflickr.com/1/436/31515730173_119b45d974_o.jpg,0.0,0.0,0.5,0.75,40,700,https://www.flickr.com/photos/thomasjhannigan/31515730173,https://creativecommons.org/licenses/by/2.0/,Tom Hannigan,https://www.flickr.com/people/thomasjhannigan/\necaaedfeb274cddb,https://c1.staticflickr.com/6/5563/30625931284_b7ae5ef4cb_o.jpg,0.0,0.0,1.0,0.97153024911,780,340,https://www.flickr.com/photos/thoseguys119/30625931284/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n621dcaab311223ba,https://c1.staticflickr.com/6/5662/30733306236_c9472f2864_o.jpg,0.28125,0.25,0.84375,1.0,875,731,https://www.flickr.com/photos/27665395@N05/30733306236,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\ncb17fa667332aac3,https://c1.staticflickr.com/8/7605/27371016364_afbb0a6dbe_o.jpg,0.0,0.25,0.5625,1.0,629,586,https://www.flickr.com/photos/crocieristi/27371016364,https://creativecommons.org/licenses/by/2.0/,Carlo Mirante,https://www.flickr.com/people/crocieristi/\n3b69f49f024116fc,https://c1.staticflickr.com/1/714/31171861424_5a5617153d_o.jpg,0.43661971831,0.25,1.0,1.0,130,124,https://www.flickr.com/photos/rusty_clark/31171861424,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\nc592398cdcd493a5,https://c1.staticflickr.com/9/8262/29508132101_4108122796_o.jpg,0.0,0.25,0.75,1.0,786,742,https://www.flickr.com/photos/mig/29508132101/,https://creativecommons.org/licenses/by/2.0/,miguelb,https://www.flickr.com/people/mig/\n421a948ee9a80f0e,https://c1.staticflickr.com/1/579/31523298460_b1f6ec1def_o.jpg,0.438430311231,0.0,1.0,1.0,931,571,https://www.flickr.com/photos/jeffreyww/31523298460,https://creativecommons.org/licenses/by/2.0/,jeffreyw,https://www.flickr.com/people/jeffreyww/\nd095bb06d6ad44b8,https://c1.staticflickr.com/9/8167/29732411705_fa2a3ee5a5_o.jpg,0.0,0.25,0.69150779896,1.0,558,136,https://www.flickr.com/photos/duncanh1/29732411705,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\n90d3f81e621b293e,https://c1.staticflickr.com/8/7513/27399900161_6f53c78564_o.jpg,0.333333333333,0.0,1.0,1.0,310,903,https://www.flickr.com/photos/dynphoto/27399900161,https://creativecommons.org/licenses/by/2.0/,Dyn Photo,https://www.flickr.com/people/dynphoto/\nc9fce44b8d67afe1,https://c1.staticflickr.com/9/8349/29359078094_49183bb4ea_o.jpg,0.0,0.0945017182131,1.0,1.0,457,308,https://www.flickr.com/photos/col_and_tasha/29359078094,https://creativecommons.org/licenses/by/2.0/,Col Ford and Natasha de Vere,https://www.flickr.com/people/col_and_tasha/\n733e7043d93f83ca,https://c1.staticflickr.com/9/8738/27834808194_97e5a2b7a1_o.jpg,0.25,0.0,1.0,1.0,512,485,https://www.flickr.com/photos/rsanajong/27834808194,https://creativecommons.org/licenses/by/2.0/,Ruth San,https://www.flickr.com/people/rsanajong/\nba4373e3f59af4a0,https://c1.staticflickr.com/9/8711/27980786170_447dac7067_o.jpg,0.497426470588,0.25,0.994852941176,1.0,625,914,https://www.flickr.com/photos/vvbad/27980786170,https://creativecommons.org/licenses/by/2.0/,VVBAD,https://www.flickr.com/people/vvbad/\n20ac8849cd117b3d,https://c1.staticflickr.com/9/8669/28431512451_f5f071c93d_o.jpg,0.28125,0.0,0.84375,0.75,428,350,https://www.flickr.com/photos/londonmatt/28431512451,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n4d05d6759e6bbea0,https://c1.staticflickr.com/8/7351/27384369951_51a4eb11e0_o.jpg,0.0,0.25,0.5625,1.0,875,333,https://www.flickr.com/photos/wltmauc/27384369951,https://creativecommons.org/licenses/by/2.0/,Aubrey Morandarte,https://www.flickr.com/people/wltmauc/\nd7049fcdaac68ecb,https://c1.staticflickr.com/8/7649/27765706161_76b96c6ef0_o.jpg,0.331130690162,0.0,0.993392070485,1.0,484,880,https://www.flickr.com/photos/sybarite48/27765706161,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n3f2ff80c87db61c7,https://c1.staticflickr.com/9/8393/29775669361_009cb8405d_o.jpg,0.0,0.25,0.75,1.0,631,887,https://www.flickr.com/photos/85546319@N04/29775669361,https://creativecommons.org/licenses/by/2.0/,Robert  Sheie,https://www.flickr.com/people/85546319@N04/\n8ec955279d3c6e36,https://c1.staticflickr.com/6/5493/30575524842_6f7e6737f1_o.jpg,0.333333333333,0.0,1.0,1.0,896,498,https://www.flickr.com/photos/ministeriodedefensaperu/30575524842,https://creativecommons.org/licenses/by/2.0/,Galeria del Ministerio de Defensa del Per\\303\\272,https://www.flickr.com/people/ministeriodedefensaperu/\nb44aed3a2c49bd26,https://c1.staticflickr.com/9/8359/28821368104_b41b4a0028_o.jpg,0.25,0.25,0.75,1.0,971,66,https://www.flickr.com/photos/phalaenopsisaphrodite523/28821368104,https://creativecommons.org/licenses/by/2.0/,Francesca Cappa,https://www.flickr.com/people/phalaenopsisaphrodite523/\nbae442721bb0e3ab,https://c1.staticflickr.com/9/8559/29245860155_05e62df601_o.jpg,0.0,0.28125,0.75,0.84375,539,549,https://www.flickr.com/photos/neu318/29245860155/,https://creativecommons.org/licenses/by/2.0/,Jorge de la Llama,https://www.flickr.com/people/neu318/\n15177f5c6296a584,https://c1.staticflickr.com/8/7455/27103205752_218c57f4a2_o.jpg,0.470789074355,0.0,1.0,0.75,896,979,https://www.flickr.com/photos/ronmacphotos/27103205752,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n884e9f571fd83de2,https://c1.staticflickr.com/2/1554/26658449942_fd427d848f_o.jpg,0.0,0.0,0.5,0.75,826,22,https://flickr.com/141187322@N06/26658449942,https://creativecommons.org/licenses/by/2.0/,KayRetired,https://www.flickr.com/people/141187322@N06/\n19d19504fb4a3f8f,https://c1.staticflickr.com/6/5452/30654015815_fba453d886_o.jpg,0.248713235294,0.25,0.746139705882,1.0,581,867,https://www.flickr.com/photos/taniwha/30654015815/,https://creativecommons.org/licenses/by/2.0/,Br3nda,https://www.flickr.com/people/taniwha/\n5ef849fc4feb9459,https://c1.staticflickr.com/8/7294/27203310790_26c7ec64d2_o.jpg,0.0,0.0,0.296590909091,0.75,980,565,https://www.flickr.com/photos/aryehalex/27203310790,https://creativecommons.org/licenses/by/2.0/,Aryeh Alex,https://www.flickr.com/people/aryehalex/\n9eafc3680ef735a3,https://c1.staticflickr.com/1/762/32445436676_d4f63261a4_o.jpg,0.234978540773,0.0,0.704935622318,0.75,93,812,https://www.flickr.com/photos/dkeats/32445436676,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\nc54d9d576a077722,https://c1.staticflickr.com/8/7504/29539752324_0a97b37e7d_o.jpg,0.0,0.0,0.666666666667,1.0,874,758,https://www.flickr.com/photos/markusspiske/29539752324,https://creativecommons.org/licenses/by/2.0/,Markus Spiske,https://www.flickr.com/people/markusspiske/\nab1da57dc73af11f,https://c1.staticflickr.com/8/7549/28062009672_bda3a3dfc4_o.jpg,0.0,0.0,0.75,0.75,704,87,https://www.flickr.com/photos/hendrikwieduwilt/28062009672,https://creativecommons.org/licenses/by/2.0/,Hendrik Wieduwilt,https://www.flickr.com/people/hendrikwieduwilt/\n66289ced86959b55,https://c1.staticflickr.com/8/7305/26967083915_f906ea57ab_o.jpg,0.5,0.25,1.0,1.0,752,926,https://www.flickr.com/photos/joe_labrie_photographe/26967083915,https://creativecommons.org/licenses/by/2.0/,Joe Labrie,https://www.flickr.com/people/joe_labrie_photographe/\n3a521bd7aee61d11,https://c1.staticflickr.com/6/5719/30852469481_201995f74c_o.jpg,0.0,0.25,0.561328125,1.0,540,542,https://www.flickr.com/photos/southbeachcars/30852469481,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\nba2bed779882997f,https://c1.staticflickr.com/8/7493/26956468191_3cd61bc2fc_o.jpg,0.5,0.25,1.0,1.0,833,77,https://www.flickr.com/photos/123835587@N04/26956468191/,https://creativecommons.org/licenses/by/2.0/,Justin Raycraft,https://www.flickr.com/people/123835587@N04/\n674f7b59808a92d3,https://c1.staticflickr.com/6/5546/30297814024_0040ba10e4_o.jpg,0.25,0.0,0.75,0.75,729,813,https://www.flickr.com/photos/comedynose/30297814024,https://creativecommons.org/licenses/by/2.0/,Pete,https://www.flickr.com/people/comedynose/\n44ccb5aa5ed7f50f,https://c1.staticflickr.com/9/8480/29644572925_3d70064905_o.jpg,0.25,0.0,1.0,0.501846381093,999,561,https://www.flickr.com/photos/vastateparksstaff/29644572925,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n3522bf2abd44efd8,https://c1.staticflickr.com/9/8227/29278408452_ca0d70003e_o.jpg,0.5,0.0,1.0,0.75,604,147,https://www.flickr.com/photos/134741223@N04/29278408452,https://creativecommons.org/licenses/by/2.0/,Paulius Malinovskis,https://www.flickr.com/people/134741223@N04/\ndc0bd508e4fdb97d,https://c1.staticflickr.com/8/7556/27841568901_52762f3021_o.jpg,0.333333333333,0.0,1.0,1.0,548,425,https://www.flickr.com/photos/rhemkes/27841568901,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\nb7d817561de999ee,https://c1.staticflickr.com/3/2622/32279907963_2731533a7e_o.jpg,0.25,0.5,1.0,1.0,647,943,https://www.flickr.com/photos/art_inthecity/32279907963,https://creativecommons.org/licenses/by/2.0/,art_inthecity,https://www.flickr.com/people/art_inthecity/\n8e8c3bfb94c534b4,https://c1.staticflickr.com/9/8081/29455694985_bfddb58b13_o.jpg,0.25,0.0,1.0,0.75,820,399,https://www.flickr.com/photos/stephanski/29455694985,https://creativecommons.org/licenses/by/2.0/,Stephan Hochhaus,https://www.flickr.com/people/stephanski/\n35ec4b8826601287,https://c1.staticflickr.com/6/5522/31114175862_11363e3c13_o.jpg,0.0,0.0,0.75,1.0,652,681,https://www.flickr.com/photos/andydr/31114175862,https://creativecommons.org/licenses/by/2.0/,Andrew Ratto,https://www.flickr.com/people/andydr/\n345db4b138d1d5ee,https://c1.staticflickr.com/9/8862/28856215882_36bbaa4862_o.jpg,0.226984126984,0.0,1.0,1.0,612,812,https://www.flickr.com/photos/andyarthur/28856215882,https://creativecommons.org/licenses/by/2.0/,Andy Arthur,https://www.flickr.com/people/andyarthur/\nffef4dd4b93b672a,https://c1.staticflickr.com/8/7552/27097150551_7a543c0143_o.jpg,0.311253561254,0.0,0.933760683761,1.0,559,969,https://www.flickr.com/photos/toussaintconseil/27097150551,https://creativecommons.org/licenses/by/2.0/,Glonadine,https://www.flickr.com/people/toussaintconseil/\na01b650e7cc9d959,https://c1.staticflickr.com/8/7719/27800830305_a3accb28de_o.jpg,0.0,0.500736377025,0.75,1.0,842,684,https://www.flickr.com/photos/worldskillsteamuk/27800830305,https://creativecommons.org/licenses/by/2.0/,WorldSkills  UK,https://www.flickr.com/people/worldskillsteamuk/\n37b5c59e52011801,https://c1.staticflickr.com/4/3090/3195790760_5355cb7e72_o.jpg,0.0,0.0,0.678571428571,1.0,830,748,https://www.flickr.com/photos/davidwilson1949/3195790760,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n4be81b675b8e129a,https://c1.staticflickr.com/8/7356/27806524135_34767941ed_o.jpg,0.497426470588,0.25,0.994852941176,1.0,820,804,https://www.flickr.com/photos/agenciabrasilia/27806524135,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n3a6fe666cdb93bc8,https://c1.staticflickr.com/8/7250/27761888672_7cba8864a8_o.jpg,0.25,0.0,1.0,0.531155015198,688,819,https://www.flickr.com/photos/dalbera/27761888672,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n44fcd78843219bb2,https://c1.staticflickr.com/8/7158/26893210830_88e518167e_o.jpg,0.0,0.412939297125,0.75,1.0,702,703,https://www.flickr.com/photos/texaus1/26893210830/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/\n41356f6242a7044e,https://c1.staticflickr.com/8/7434/27115854595_d179284daa_o.jpg,0.248348017621,0.0,0.745044052863,0.75,100,915,https://www.flickr.com/photos/usfwsmidwest/27115854595,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\naa17dfdac249291a,https://c1.staticflickr.com/9/8783/28845140625_e01129bf0d_o.jpg,0.421177266576,0.0,0.842354533153,0.75,875,682,https://www.flickr.com/photos/102010851@N02/28845140625,https://creativecommons.org/licenses/by/2.0/,EastLondoner,https://www.flickr.com/people/102010851@N02/\ne75c42a0c5d43067,https://c1.staticflickr.com/9/8271/30254566246_2203f09f40_o.jpg,0.578822733424,0.0,1.0,0.75,348,284,https://www.flickr.com/photos/larry1732/30254566246,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/\na37df1410c95fcb1,https://c1.staticflickr.com/8/7467/27162381975_66abbac267_o.jpg,0.28125,0.25,0.84375,1.0,437,299,https://www.flickr.com/photos/nzcarfreak/27162381975,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\nc4ae3effff7d7b58,https://c1.staticflickr.com/9/8271/29310863194_8d223ae7dd_o.jpg,0.25,0.25,1.0,1.0,769,839,https://www.flickr.com/photos/124962693@N07/29310863194,https://creativecommons.org/licenses/by/2.0/,Samuel Ab\\303\\244cherli,https://www.flickr.com/people/abaecherliphotography/\nba463d52a4710bca,https://c1.staticflickr.com/9/8463/28683623145_b6cff04704_o.jpg,0.25,0.25,0.75,1.0,638,667,https://www.flickr.com/photos/elsie/28683623145/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\n39a748dc7a3d964a,https://c1.staticflickr.com/6/5475/30977606640_cac48fe32b_o.jpg,0.0,0.25,0.407456724368,1.0,972,211,https://flickr.com/95611897@N07/30977606640,https://creativecommons.org/licenses/by/2.0/,Monica Valentine,https://www.flickr.com/people/mrvishere/\ndd94cf0d2ea23ba0,https://c1.staticflickr.com/8/7634/26763706346_d5514db485_o.jpg,0.0,0.25,0.391134289439,1.0,922,757,https://www.flickr.com/photos/13476480@N07/26763706346,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n485083d9858ee92d,https://c1.staticflickr.com/9/8875/28648949680_df4648cd14_o.jpg,0.25,0.0,1.0,0.75,633,565,https://www.flickr.com/photos/sparkfun/28648949680,https://creativecommons.org/licenses/by/2.0/,SparkFun Electronics,https://www.flickr.com/people/sparkfun/\na84245835f36d314,https://c1.staticflickr.com/1/278/31991337321_8516591ff9_o.jpg,0.237949640288,0.25,0.713848920863,1.0,875,702,https://www.flickr.com/photos/didbygraham/31991337321,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\na433dbbf64eabff5,https://c1.staticflickr.com/9/8190/29020061046_319fda7645_o.jpg,0.28125,0.25,0.84375,1.0,875,425,http://www.flickr.com/photos/ww1photos/29020061046/,https://creativecommons.org/licenses/by/2.0/,Jane Jones,https://www.flickr.com/people/ww1photos/\n51bd174c6af19d7e,https://c1.staticflickr.com/8/7761/26262944403_aa86481599_o.jpg,0.4375,0.25,1.0,1.0,730,798,https://www.flickr.com/photos/shankaronline/26262944403,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\na40071ec26435025,https://c1.staticflickr.com/9/8275/29384944121_67a39cc629_o.jpg,0.5,0.0,1.0,0.75,985,831,https://www.flickr.com/photos/63122283@N06/29384944121,https://creativecommons.org/licenses/by/2.0/,Nelo Hotsuma,https://www.flickr.com/people/63122283@N06/\n4508280660cef26f,https://c1.staticflickr.com/8/7502/27681843185_9258ae802b_o.jpg,0.279141104294,0.0,1.0,1.0,896,722,https://www.flickr.com/photos/13476480@N07/27681843185,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nba2388c5818dc5e8,https://c1.staticflickr.com/6/5487/30651045523_a4ba0898c3_o.jpg,0.578822733424,0.25,1.0,1.0,629,253,http://www.flickr.com/photos/crocieristi/30651045523/,https://creativecommons.org/licenses/by/2.0/,Carlo Mirante,https://www.flickr.com/people/crocieristi/\n9d25701c69713071,https://c1.staticflickr.com/9/8103/29246314865_c8948e9776_o.jpg,0.25,0.0,1.0,0.5,777,260,https://www.flickr.com/photos/usarmyband/29246314865/,https://creativecommons.org/licenses/by/2.0/,The United States Army Band,https://www.flickr.com/people/usarmyband/\n01f7e845b4bb6858,https://c1.staticflickr.com/8/7792/27085754636_2685ffd98b_o.jpg,0.28125,0.25,0.84375,1.0,871,836,https://www.flickr.com/photos/ewolivera/27085754636,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/\n648072f37bcdd6ae,https://c1.staticflickr.com/9/8531/29525291730_3b2c7b8706_o.jpg,0.395150720839,0.0,0.790301441678,0.75,629,414,https://www.flickr.com/photos/zongo/29525291730,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n08d4d6367652408d,https://c1.staticflickr.com/8/7346/27611303280_ea821aee4c_o.jpg,0.28125,0.25,0.84375,1.0,610,590,https://www.flickr.com/photos/thenationalguard/27611303280,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/\n0843587aeeed537c,https://c1.staticflickr.com/8/7010/26360186874_8a87624db1_o.jpg,0.25,0.0,1.0,1.0,90,275,https://www.flickr.com/photos/zeevveez/26360186874,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/\ne0c8a54b9089b71f,https://c1.staticflickr.com/9/8893/28391004082_5502350087_o.jpg,0.267938931298,0.25,0.803816793893,1.0,95,470,https://www.flickr.com/photos/usfwsmtnprairie/28391004082,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n12adcb247798eccb,https://c1.staticflickr.com/6/5748/30530295911_3f908cf6e2_o.jpg,0.25,0.0,0.75,0.75,560,551,https://www.flickr.com/photos/am1974/30530295911,https://creativecommons.org/licenses/by/2.0/,Artur Malinowski,https://www.flickr.com/people/am1974/\n3f3fdf6909d02648,https://c1.staticflickr.com/6/5635/30327965204_1743b182f0_o.jpg,0.0,0.330871491876,1.0,1.0,688,871,https://www.flickr.com/photos/eltb/30327965204,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nd3c293a5432c1467,https://c1.staticflickr.com/9/8411/29217652146_28730ddf61_o.jpg,0.249079528719,0.25,0.747238586156,1.0,830,903,https://www.flickr.com/photos/97934454@N06/29217652146,https://creativecommons.org/licenses/by/2.0/,danielhak,https://www.flickr.com/people/97934454@N06/\n0cda86f27b9c06d3,https://c1.staticflickr.com/1/361/32357946790_e058b399e6_o.jpg,0.0,0.25,0.421177266576,1.0,875,746,https://www.flickr.com/photos/9759010@N07/32357946790,https://creativecommons.org/licenses/by/2.0/,Ken,https://www.flickr.com/people/9759010@N07/\nbf9db7779061b1fe,https://c1.staticflickr.com/8/7080/27520678742_94c6271095_o.jpg,0.250923190547,0.0,0.75276957164,0.75,459,901,https://www.flickr.com/photos/jorge-11/27520678742,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/\n20e2fd13ef9cf574,https://c1.staticflickr.com/9/8875/29774562686_3b806b5f0b_o.jpg,0.0,0.0,0.663235294118,1.0,311,696,https://www.flickr.com/photos/95230066@N07/29774562686/,https://creativecommons.org/licenses/by/2.0/,British Pest Control  Association,https://www.flickr.com/people/95230066@N07/\nf80a82a2f8246daa,https://c1.staticflickr.com/6/5564/30851389850_2225a12fa0_o.jpg,0.250923190547,0.25,0.75276957164,1.0,704,790,https://www.flickr.com/photos/79157069@N03/30851389850,https://creativecommons.org/licenses/by/2.0/,Matthew Paul  Argall,https://www.flickr.com/people/79157069@N03/\n14b8551ab09247f1,https://c1.staticflickr.com/9/8489/29640246375_f249f48ed7_o.jpg,0.25,0.0,0.75,0.75,896,516,https://www.flickr.com/photos/markyharky/29640246375,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\naed5fe49871fb602,https://c1.staticflickr.com/9/8570/26676446682_5b8f3df8ef_o.jpg,0.0,0.25,0.75,1.0,820,427,https://www.flickr.com/photos/bjoern/26676446682,https://creativecommons.org/licenses/by/2.0/,bjoern,https://www.flickr.com/people/bjoern/\n20443c017b395b1a,https://c1.staticflickr.com/3/2327/32703994062_55cc6f8501_o.jpg,0.25,0.25,1.0,1.0,669,886,https://www.flickr.com/photos/mrsdkrebs/32703994062/,https://creativecommons.org/licenses/by/2.0/,Denise Krebs,https://www.flickr.com/people/mrsdkrebs/\n4a47643e0cbec878,https://c1.staticflickr.com/1/738/32754348005_26a1521c37_o.jpg,0.25,0.0,0.75,0.75,477,751,http://www.flickr.com/photos/148039650@N02/32754348005,https://creativecommons.org/licenses/by/2.0/,Rasul RAUMA,https://www.flickr.com/people/148039650@N02/\nf1f10c7f021c34f1,https://c1.staticflickr.com/9/8712/28277395334_c493239c54_o.jpg,0.22009569378,0.0,1.0,1.0,85,387,https://flickr.com/124436036@N03/28277395334,https://creativecommons.org/licenses/by/2.0/,Raveendra Jayashantha,https://www.flickr.com/people/raveejaya/\nfd524559c4495d3f,https://c1.staticflickr.com/9/8322/29115437495_65f89408d3_o.jpg,0.25,0.25,0.75,1.0,896,892,https://www.flickr.com/photos/ronmacphotos/29115437495,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n28673788d6d3a60c,https://c1.staticflickr.com/6/5593/30254805131_42df3b7485_o.jpg,0.0,0.243095930233,0.75,0.729287790698,888,515,https://www.flickr.com/photos/eltb/30254805131,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\ne885199cada243d0,https://c1.staticflickr.com/1/468/31749576282_e2efcfe9e3_o.jpg,0.296147672552,0.0,0.888443017657,0.75,923,387,https://flickr.com/68716054@N00/31749576282,https://creativecommons.org/licenses/by/2.0/,Ro\\315\\254\\315\\254\\315\\240\\315\\240\\315\\241\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240s\\315\\254\\315\\254\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240a\\315\\254\\315\\254\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240 Menkman,https://www.flickr.com/people/r00s/\n715cc5844ea4610f,https://c1.staticflickr.com/8/7711/26822564273_5e3124dafa_o.jpg,0.500736377025,0.0,1.0,0.75,711,740,https://www.flickr.com/photos/143676616@N05/26822564273,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\n76b6198d4d51562e,https://c1.staticflickr.com/8/7362/27888840622_6b62ce584f_o.jpg,0.415322580645,0.0,0.83064516129,0.75,896,789,https://www.flickr.com/photos/13476480@N07/27888840622,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nd1d5352856991fb2,https://c1.staticflickr.com/9/8142/29237897450_f66ddca483_o.jpg,0.25,0.25,1.0,0.75,653,565,https://flickr.com/8269539@N04/29237897450,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\nfa9c42057a5307ad,https://c1.staticflickr.com/6/5552/30739511221_fb3fe23ebe_o.jpg,0.0,0.25,0.75,0.75,777,840,https://flickr.com/129351189@N08/30739511221,https://creativecommons.org/licenses/by/2.0/,Feria del Libro Ricardo Palma,https://www.flickr.com/people/feriaricardopalma/\n8cdd2c5a83ebe45d,https://c1.staticflickr.com/1/352/31382012173_5083819142_o.jpg,0.437669376694,0.0,1.0,1.0,581,126,https://www.flickr.com/photos/comedynose/31382012173,https://creativecommons.org/licenses/by/2.0/,Pete,https://www.flickr.com/people/comedynose/\nc711349016578f1c,https://c1.staticflickr.com/1/620/32248387266_9752e1e58d_o.jpg,0.0,0.25,0.75,1.0,921,594,https://flickr.com/53301297@N00/32248387266,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\nf2ca5edd0642ec45,https://c1.staticflickr.com/6/5756/29929006834_47c47b660c_o.jpg,0.5,0.0,1.0,0.75,607,582,https://flickr.com/137479669@N05/29929006834,https://creativecommons.org/licenses/by/2.0/,Milton Keynes Museum,https://www.flickr.com/people/mkmuseum/\n87743e32802dd7a7,https://c1.staticflickr.com/1/339/32216988033_e4d18c4805_o.jpg,0.4375,0.25,1.0,1.0,904,935,https://www.flickr.com/photos/garryknight/32216988033,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\n3989a0847481e163,https://c1.staticflickr.com/1/474/32401038240_fb5fd06095_o.jpg,0.262096774194,0.0,1.0,0.75,799,918,https://www.flickr.com/photos/51764518@N02/32401038240,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n77f164cf9db76f09,https://c1.staticflickr.com/9/8108/29204038206_6047cc58ae_o.jpg,0.493045387994,0.0,0.986090775988,0.75,694,706,https://www.flickr.com/photos/144833373@N06/29204038206/,https://creativecommons.org/licenses/by/2.0/,World Rowing Championships,https://www.flickr.com/people/144833373@N06/\nb21eb8444933ba74,https://c1.staticflickr.com/8/7300/27380302823_69e3a616bc_o.jpg,0.0,0.25,0.598790322581,1.0,664,765,https://www.flickr.com/photos/sybarite48/27380302823,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n9a1f83edfdf2a408,https://c1.staticflickr.com/6/5529/30770277271_d5f6d34e6f_o.jpg,0.254464285714,0.0,0.763392857143,0.75,141,194,https://www.flickr.com/photos/usfwsmidwest/30770277271,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n74e357a88ff94a07,https://c1.staticflickr.com/6/5487/30156644213_bd0e22d1b8_o.jpg,0.25,0.0,0.75,0.75,978,544,https://www.flickr.com/photos/alexbalzanella/30156644213/,https://creativecommons.org/licenses/by/2.0/,Alex Balzanella,https://www.flickr.com/people/alexbalzanella/\n55ed9483245c673c,https://c1.staticflickr.com/6/5570/30386992654_3b519dce00_o.jpg,0.64768683274,0.0,0.97153024911,0.75,780,931,https://www.flickr.com/photos/thoseguys119/30386992654/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nf30e7bbbea617fcd,https://c1.staticflickr.com/6/5671/31383339865_339bec2ee0_o.jpg,0.493694362018,0.0,1.0,0.75,854,460,https://www.flickr.com/photos/13476480@N07/31383339865/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nb2d2abae235f1ba8,https://c1.staticflickr.com/1/757/30969345234_af04fefa32_o.jpg,0.0,0.0,0.75,0.568396226415,755,413,https://www.flickr.com/photos/51764518@N02/30969345234,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n7e6e5dd2d64f09b4,https://c1.staticflickr.com/9/8550/29525655001_2ce702423b_o.jpg,0.5,0.0,1.0,0.75,561,502,https://flickr.com/57511216@N04/29525655001,https://creativecommons.org/licenses/by/2.0/,Daniel,https://www.flickr.com/people/57511216@N04/\nc9421d0f01f06128,https://c1.staticflickr.com/1/570/32685883375_3e62518cde_o.jpg,0.0,0.0,0.75,0.75,663,498,https://www.flickr.com/photos/sparkfun/32685883375,https://creativecommons.org/licenses/by/2.0/,SparkFun Electronics,https://www.flickr.com/people/sparkfun/\n0a5a40e34c53246e,https://c1.staticflickr.com/9/8539/29437931322_aca0e1697a_o.jpg,0.25,0.0,1.0,0.75,498,213,https://www.flickr.com/photos/83015819@N00/29437931322,https://creativecommons.org/licenses/by/2.0/,Jon Worth,https://www.flickr.com/people/83015819@N00/\n9622dd5fe518a3c8,https://c1.staticflickr.com/8/7437/27215745213_97ba084bd8_o.jpg,0.28125,0.25,0.84375,1.0,780,352,https://www.flickr.com/photos/thoseguys119/27215745213,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\ncfdfa6e881689ffd,https://c1.staticflickr.com/6/5462/31252626776_98fa27d99c_o.jpg,0.0,0.0,0.75,0.75,672,858,https://www.flickr.com/photos/glorycycles/31252626776,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n6a2c70c10ec98aa9,https://c1.staticflickr.com/6/5820/30619778402_ee2a7940d2_o.jpg,0.25,0.25,1.0,0.75,725,705,https://www.flickr.com/photos/big-ashb/30619778402/,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/\n71445da10dc28475,https://c1.staticflickr.com/1/469/31909526470_ba30bd4195_o.jpg,0.25,0.25,0.75,1.0,721,161,https://www.flickr.com/photos/vzbv_de/31909526470,https://creativecommons.org/licenses/by/2.0/,Verbraucherzentrale Bundesverband,https://www.flickr.com/people/vzbv_de/\n775e08a934201ee6,https://c1.staticflickr.com/9/8279/29847648686_07c8963e83_o.jpg,0.0,0.0,0.666666666667,1.0,348,774,https://www.flickr.com/photos/o_0/29847648686,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n02b847a6e0f27405,https://c1.staticflickr.com/3/2797/32702689612_f6040606e1_o.jpg,0.4375,0.0,1.0,0.75,418,767,http://www.flickr.com/photos/pulencio/32702689612/,https://creativecommons.org/licenses/by/2.0/,Pulencio,https://www.flickr.com/people/pulencio/\n84f0657453e1a0d3,https://c1.staticflickr.com/9/8244/29405427562_f455716e3a_o.jpg,0.0,0.0,0.5,0.75,563,497,https://www.flickr.com/photos/soso__1991/29405427562/,https://creativecommons.org/licenses/by/2.0/,SALoOM,https://www.flickr.com/people/soso__1991/\n790dee2e3edd6ad1,https://c1.staticflickr.com/6/5546/31328503322_8d77867d21_o.jpg,0.445652173913,0.0,1.0,0.75,972,673,https://flickr.com/22592971@N04/31328503322,https://creativecommons.org/licenses/by/2.0/,Mark  Gunn,https://www.flickr.com/people/mark-gunn/\n7d0850c4c0afc9cb,https://c1.staticflickr.com/8/7388/27210334620_e00616a48f_o.jpg,0.25,0.25,0.75,1.0,461,41,https://www.flickr.com/photos/allthishappiness/27210334620,https://creativecommons.org/licenses/by/2.0/,kater,https://www.flickr.com/people/allthishappiness/\n70dd1a97d4663a72,https://c1.staticflickr.com/6/5521/31101799446_246d0a71b9_o.jpg,0.0,0.0,0.666666666667,1.0,519,489,https://www.flickr.com/photos/box_repsol/31101799446,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n6ec273991aff4793,https://c1.staticflickr.com/8/7692/29235770415_f2f60be9ae_o.jpg,0.25,0.0,1.0,0.75,471,544,https://www.flickr.com/photos/stevendepolo/29235770415,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n80fe66caea074891,https://c1.staticflickr.com/8/7235/27665655161_4e8b1bc93b_o.jpg,0.500736377025,0.25,1.0,1.0,561,979,https://www.flickr.com/photos/132774913@N06/27665655161,https://creativecommons.org/licenses/by/2.0/,Winnipeg Blue Bombers,https://www.flickr.com/people/132774913@N06/\ne6076758f0c3c5f8,https://c1.staticflickr.com/9/8390/28681356530_e17d714bb6_o.jpg,0.0,0.25,0.35861423221,1.0,826,508,https://flickr.com/64337707@N07/28681356530,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/\n0ab42873bae1b88e,https://c1.staticflickr.com/4/3806/33360835281_c6c24e7000_o.jpg,0.0,0.25,0.5,1.0,396,724,https://www.flickr.com/photos/linvoyage/33360835281,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/\nd3c8c49a69abce81,https://c1.staticflickr.com/2/1538/26741641236_5441dc1b29_o.jpg,0.280784844384,0.0,0.842354533153,1.0,501,114,https://www.flickr.com/photos/141009962@N07/26741641236/,https://creativecommons.org/licenses/by/2.0/,juan jesus jald\\303\\263n cuevas,https://www.flickr.com/people/141009962@N07/\n5bb467651a9bb186,https://c1.staticflickr.com/6/5568/30954086432_acdd119d38_o.jpg,0.0,0.0,0.666666666667,1.0,966,427,https://www.flickr.com/photos/o_0/30954086432,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n1ab735409e8db949,https://c1.staticflickr.com/8/7791/27248510654_18799b8d18_o.jpg,0.28125,0.0,0.84375,0.75,661,18,https://www.flickr.com/photos/barrettelementary/27248510654/,https://creativecommons.org/licenses/by/2.0/,K.W. Barrett,https://www.flickr.com/people/barrettelementary/\n8ff2f242d37fd0e9,https://c1.staticflickr.com/8/7060/27193480481_b7a095c3f8_o.jpg,0.0,0.0,0.510804769001,0.75,834,544,https://www.flickr.com/photos/usnavy/27193480481,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\nd24ff49949d9ac44,https://c1.staticflickr.com/8/7799/27030844646_15d89c6d22_o.jpg,0.518089725036,0.0,1.0,0.75,821,736,https://www.flickr.com/photos/jsjgeology/27030844646,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n23f2f2219e81150b,https://c1.staticflickr.com/8/7365/27834122886_8e18b2a107_o.jpg,0.0,0.322864321608,0.75,0.968592964824,112,8,https://www.flickr.com/photos/scotnelson/27834122886,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n6073219e8d1af6e7,https://c1.staticflickr.com/8/7507/30111436405_3c987dc815_o.jpg,0.0,0.333333333333,1.0,1.0,561,798,https://www.flickr.com/photos/116153846@N06/30111436405/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/\n2108c89efef75b8c,https://c1.staticflickr.com/4/3934/33309518296_f896e2cd1b_o.jpg,0.5,0.0,1.0,0.75,971,116,https://www.flickr.com/photos/davebloggs007/33309518296/,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\n3c1eb816ca5b35f6,https://c1.staticflickr.com/9/8066/28453457941_3a74f7ed1c_o.jpg,0.4375,0.25,1.0,1.0,975,517,https://www.flickr.com/photos/jsjgeology/28453457941,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n5b8864d18fc512b3,https://c1.staticflickr.com/6/5524/30171673324_72085cce79_o.jpg,0.5,0.25,1.0,1.0,416,990,https://www.flickr.com/photos/gotovan/30171673324,https://creativecommons.org/licenses/by/2.0/,GoToVan,https://www.flickr.com/people/gotovan/\nf772bf5039d59ff2,https://c1.staticflickr.com/8/7357/26845607294_b92f85f3a8_o.jpg,0.25,0.0,1.0,0.5625,826,870,https://www.flickr.com/photos/simonsimages/26845607294/,https://creativecommons.org/licenses/by/2.0/,simonsimages,https://www.flickr.com/people/simonsimages/\nef24dde54169ff22,https://c1.staticflickr.com/8/7107/26958155412_33d5efe254_o.jpg,0.0,0.25,0.5,1.0,563,673,https://www.flickr.com/photos/insmu74/26958155412,https://creativecommons.org/licenses/by/2.0/,Stefan Munder,https://www.flickr.com/people/insmu74/\na22a37dfbd62067b,https://c1.staticflickr.com/8/7545/27312391441_4c79588f7f_o.jpg,0.245614035088,0.0,0.736842105263,0.75,323,532,https://www.flickr.com/photos/usfwsmidwest/27312391441,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n77e9c7e43c7d5748,https://c1.staticflickr.com/6/5749/31055712736_f148051b90_o.jpg,0.28125,0.0,0.84375,0.75,940,67,https://www.flickr.com/photos/30478819@N08/31055712736/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\ncbad7143016a1593,https://c1.staticflickr.com/1/431/31024670673_2c7a56b53b_o.jpg,0.25,0.0,0.75,0.75,820,97,https://www.flickr.com/photos/jus10h/31024670673,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n41394f0da7ac8b12,https://c1.staticflickr.com/9/8498/29300292724_71a5f04400_o.jpg,0.468844984802,0.0,1.0,0.75,313,90,https://www.flickr.com/photos/nrgoodrum/29300292724,https://creativecommons.org/licenses/by/2.0/,nick goodrum,https://www.flickr.com/people/nrgoodrum/\n461afde2e6af3979,https://c1.staticflickr.com/1/727/32485772451_baf506599f_o.jpg,0.5,0.0,1.0,0.75,519,439,https://www.flickr.com/photos/box_repsol/32485772451,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nbb02668924d52bb9,https://c1.staticflickr.com/9/8727/28312365824_b445f72bbd_o.jpg,0.25,0.0,0.75,0.75,818,288,https://www.flickr.com/photos/glenbowman/28312365824,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/\n411951a49e593a59,https://c1.staticflickr.com/8/7292/27375279856_d1b83ae488_o.jpg,0.0,0.0,0.669128508124,1.0,672,858,https://www.flickr.com/photos/28521130@N02/27375279856/,https://creativecommons.org/licenses/by/2.0/,Chris Crook,https://www.flickr.com/people/28521130@N02/\n0f7e263edbeb463b,https://c1.staticflickr.com/8/7343/26472974134_451e8a5534_o.jpg,0.4375,0.25,1.0,1.0,418,317,https://www.flickr.com/photos/flightlog/26472974134,https://creativecommons.org/licenses/by/2.0/,flightlog,https://www.flickr.com/people/flightlog/\n06479a6fdd009458,https://c1.staticflickr.com/6/5523/29316362203_e7346dc71d_o.jpg,0.0,0.0,0.5625,0.75,473,944,https://flickr.com/40797569@N08/29316362203,https://creativecommons.org/licenses/by/2.0/,Potomac Conservancy,https://www.flickr.com/people/potomacconservancy/\n61a0fcc8c2cbfe7b,https://c1.staticflickr.com/8/7132/26798293134_1e0edc36ef_o.jpg,0.25,0.0,1.0,0.599757673667,539,693,https://www.flickr.com/photos/taymazvalley/26798293134,https://creativecommons.org/licenses/by/2.0/,Taymaz Valley,https://www.flickr.com/people/taymazvalley/\nfadce27a1f790ab2,https://c1.staticflickr.com/8/7222/27500618016_0652c953c2_o.jpg,0.299878836834,0.0,0.899636510501,0.75,985,966,https://www.flickr.com/photos/nordique/27500618016,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/\nc901fea3283a3c08,https://c1.staticflickr.com/9/8512/28287472501_e1076a2dd4_o.jpg,0.0,0.0,0.666666666667,1.0,972,541,https://www.flickr.com/photos/85189931@N00/28287472501,https://creativecommons.org/licenses/by/2.0/,niki georgiev,https://www.flickr.com/people/85189931@N00/\n2d8239598bd135a6,https://c1.staticflickr.com/9/8129/29365605063_6a143232a8_o.jpg,0.0,0.25,0.5,1.0,875,490,https://www.flickr.com/photos/126337928@N05/29365605063/,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\nf22c5f698989dac1,https://c1.staticflickr.com/8/7515/27325766933_22ec88dff6_o.jpg,0.0,0.0,0.482608695652,0.75,404,672,https://www.flickr.com/photos/usnavy/27325766933,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n266a1194c77111ad,https://c1.staticflickr.com/9/8196/28428018770_9767b6e05d_o.jpg,0.25,0.25,0.75,1.0,981,596,https://www.flickr.com/photos/amslerpix/28428018770/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n09690637b62a30e2,https://c1.staticflickr.com/9/8480/29174231222_e37b7e906c_o.jpg,0.250553097345,0.25,0.751659292035,1.0,664,403,https://www.flickr.com/photos/romanboed/29174231222/,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/\nf457d4739be4220a,https://c1.staticflickr.com/1/663/31658703571_ab7d3bfa45_o.jpg,0.5,0.25,1.0,1.0,662,724,http://flickr.com/photos/52900873@N07/31658703571,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n59d4ef6a62cd2cc8,https://c1.staticflickr.com/8/7374/27259191121_f7da80606f_o.jpg,0.0,0.0,0.666666666667,1.0,519,903,https://www.flickr.com/photos/box_repsol/27259191121,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n5775f0a2539557b5,https://c1.staticflickr.com/8/7492/26531234650_50379dc45b_o.jpg,0.0,0.0,0.5625,0.75,920,801,https://www.flickr.com/photos/davidstanleytravel/26531234650,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n9a7ccdb8130eea74,https://c1.staticflickr.com/9/8122/28887298422_7461ab30a6_o.jpg,0.0,0.0,0.5,0.75,426,563,https://www.flickr.com/photos/olsenart/28887298422,https://creativecommons.org/licenses/by/2.0/,Lucky Lynda,https://www.flickr.com/people/olsenart/\n0efe0b9f4c7fbbde,https://c1.staticflickr.com/8/7271/28166356505_b2a03dda3e_o.jpg,0.28125,0.25,0.84375,1.0,933,957,https://www.flickr.com/photos/rickmccharles/28166356505,https://creativecommons.org/licenses/by/2.0/,Rick McCharles,https://www.flickr.com/people/rickmccharles/\n937ca399748151ab,https://c1.staticflickr.com/8/7368/27387537931_36c1d70c2a_o.jpg,0.501840942563,0.25,1.0,1.0,912,474,https://www.flickr.com/photos/santaolalla/27387537931,https://creativecommons.org/licenses/by/2.0/,David Santaolalla,https://www.flickr.com/people/santaolalla/\nc9d73a6dc7d2976a,https://c1.staticflickr.com/1/429/32561737455_0651c04b03_o.jpg,0.0,0.0,0.666666666667,1.0,980,865,https://www.flickr.com/photos/rexness/32561737455,https://creativecommons.org/licenses/by/2.0/,Rexness,https://www.flickr.com/people/rexness/\n6ecd7be3b9148eb6,https://c1.staticflickr.com/8/7395/27054388030_f17312443c_o.jpg,0.5,0.0,1.0,0.75,820,928,https://www.flickr.com/photos/weeklydig/27054388030/,https://creativecommons.org/licenses/by/2.0/,digboston,https://www.flickr.com/people/weeklydig/\n0fe46e75ce4b4f5b,https://c1.staticflickr.com/8/7093/27731191752_a073b3bf5c_o.jpg,0.5,0.25,1.0,1.0,950,740,https://www.flickr.com/photos/blumenbiene/27731191752,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\n7b52f5142202daae,https://c1.staticflickr.com/9/8352/29820540052_93171e6f19_o.jpg,0.280784844384,0.0,0.842354533153,1.0,913,998,https://www.flickr.com/photos/erix/29820540052/,https://creativecommons.org/licenses/by/2.0/,Erich Ferdinand,https://www.flickr.com/people/erix/\n7affc41bb3afd497,https://c1.staticflickr.com/9/8512/29680556911_0ae14a5200_o.jpg,0.4375,0.0,1.0,0.75,818,38,https://www.flickr.com/photos/zombieite/29680556911/,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/\n138c6da5418a677c,https://c1.staticflickr.com/6/5537/31298816746_dd9d8f4932_o.jpg,0.42174796748,0.0,0.843495934959,0.75,405,583,https://www.flickr.com/photos/janitors/31298816746,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\nc0cda0f5a54343b7,https://c1.staticflickr.com/1/358/31599093551_0bdc7a6c9b_o.jpg,0.295072115385,0.25,0.885216346154,1.0,512,593,https://www.flickr.com/photos/autohistorian/31599093551,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n8e74142c7309ad83,https://c1.staticflickr.com/9/8095/28536323773_562be5df8e_o.jpg,0.0,0.0,1.0,1.0,986,998,https://www.flickr.com/photos/olibac/28536323773,https://creativecommons.org/licenses/by/2.0/,OliBac,https://www.flickr.com/people/olibac/\n5ec34636f28023c4,https://c1.staticflickr.com/6/5644/30824316621_bb24e7b70e_o.jpg,0.25,0.0,0.75,0.75,973,583,https://www.flickr.com/photos/145232592@N06/30824316621,https://creativecommons.org/licenses/by/2.0/,Martin7d2,https://www.flickr.com/people/martin7d2/\n0bf0ecc2bd421ed4,https://c1.staticflickr.com/9/8109/29544815330_c50f74cb70_o.jpg,0.295454545455,0.0,1.0,1.0,431,572,http://www.flickr.com/photos/ftmeade/29544815330/,https://creativecommons.org/licenses/by/2.0/,Fort George G. Meade Public Affairs Office,https://www.flickr.com/people/ftmeade/\n3d2abcbe53ac654b,https://c1.staticflickr.com/6/5784/31233267866_96fba514ff_o.jpg,0.496696035242,0.0,0.993392070485,0.75,889,313,https://www.flickr.com/photos/sybarite48/31233267866,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nfdd851f6ae77be88,https://c1.staticflickr.com/9/8834/28307295070_7ee8deee90_o.jpg,0.148333333333,0.0,1.0,1.0,437,812,https://www.flickr.com/photos/bobtheberto/28307295070,https://creativecommons.org/licenses/by/2.0/,Rob &quot;Berto&quot; Bennett,https://www.flickr.com/people/bobtheberto/\ne3deab462fb7c09b,https://c1.staticflickr.com/9/8541/29640261375_159969f3cb_o.jpg,0.0,0.0,0.666666666667,1.0,896,629,https://www.flickr.com/photos/markyharky/29640261375,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n7878f540f14ffd97,https://c1.staticflickr.com/1/308/31812394461_f7aa941f0b_o.jpg,0.4375,0.0,1.0,0.75,615,330,http://www.flickr.com/photos/dainismatisons/31812394461/,https://creativecommons.org/licenses/by/2.0/,Dainis Matisons,https://www.flickr.com/people/dainismatisons/\n0236cfbb669df537,https://c1.staticflickr.com/8/7702/27276060153_2f4bc2727f_o.jpg,0.0,0.25,1.0,1.0,955,753,https://www.flickr.com/photos/scotnelson/27276060153,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n269a6408c3567daa,https://c1.staticflickr.com/6/5659/30201556241_40688d0574_o.jpg,0.0,0.25,0.5,1.0,581,256,https://www.flickr.com/photos/martius/30201556241/,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\n888207991e7d9a62,https://c1.staticflickr.com/1/442/32368069962_f9161bf5ca_o.jpg,0.2806640625,0.0,0.8419921875,0.75,341,280,https://www.flickr.com/photos/bazzadarambler/32368069962,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\nfffc0f50c61e3b48,https://c1.staticflickr.com/9/8050/29238106374_ed8b41008a_o.jpg,0.0,0.0,1.0,1.0,964,151,https://www.flickr.com/photos/vuarnet/29238106374,https://creativecommons.org/licenses/by/2.0/,Raul Ramirez,https://www.flickr.com/people/vuarnet/\nc7ae7f635e1f4c23,https://c1.staticflickr.com/1/620/32695541516_b69d21deb6_o.jpg,0.299878836834,0.25,0.899636510501,1.0,133,940,https://www.flickr.com/photos/ddebold/32695541516,https://creativecommons.org/licenses/by/2.0/,Don DeBold,https://www.flickr.com/people/ddebold/\nf5ef83baa43b63ab,https://c1.staticflickr.com/9/8102/27874528933_8458516b77_o.jpg,0.0,0.0,0.499263622975,0.75,13,649,https://www.flickr.com/photos/steve_childs/27874528933,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/\n75778d2f7f332f88,https://c1.staticflickr.com/9/8640/29313871471_762746eb7e_o.jpg,0.25,0.249631811487,1.0,0.748895434462,526,347,https://www.flickr.com/photos/agenciasenado/29313871471,https://creativecommons.org/licenses/by/2.0/,Senado Federal,https://www.flickr.com/people/agenciasenado/\n559f35d37c4a07bc,https://c1.staticflickr.com/6/5804/30015712255_662742b7f0_o.jpg,0.25,0.376029654036,1.0,1.0,982,242,https://www.flickr.com/photos/apardavila/30015712255,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\nf98193bb7316d308,https://c1.staticflickr.com/6/5801/30441949116_3a5f07529c_o.jpg,0.25,0.0,0.75,0.75,968,397,https://www.flickr.com/photos/30478819@N08/30441949116/in/pool-43256560@N00,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n42b3b6655dff3c11,https://c1.staticflickr.com/6/5556/30181865684_87ed30299a_o.jpg,0.0,0.25,0.5625,1.0,769,86,https://www.flickr.com/photos/stmunchins/30181865684,https://creativecommons.org/licenses/by/2.0/,St Munchin&#x27;s College,https://www.flickr.com/people/stmunchins/\n65ec917501cea531,https://c1.staticflickr.com/6/5814/29884134796_4487c7a8d4_o.jpg,0.5,0.25,1.0,1.0,512,903,https://www.flickr.com/photos/8782469@N05/29884134796,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/\neadcb6de5c696016,https://c1.staticflickr.com/1/701/31029076984_cc9e65c275_o.jpg,0.4375,0.25,1.0,1.0,108,520,https://www.flickr.com/photos/jimg944/31029076984,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n59a81dc505fa7880,https://c1.staticflickr.com/8/7799/27273146292_43651c9faa_o.jpg,0.5,0.0,1.0,0.75,16,940,https://www.flickr.com/photos/j_benson/27273146292,https://creativecommons.org/licenses/by/2.0/,John Benson,https://www.flickr.com/people/j_benson/\nef240eb72d120e2c,https://c1.staticflickr.com/9/8755/28543750790_5c78714742_o.jpg,0.0,0.0,0.5625,0.75,782,761,https://www.flickr.com/photos/smoses/28543750790,https://creativecommons.org/licenses/by/2.0/,Steve Moses,https://www.flickr.com/people/smoses/\n79b720eb49104c82,https://c1.staticflickr.com/8/7038/26339862774_f0f3e6e569_o.jpg,0.25,0.0,0.75,0.75,405,956,https://www.flickr.com/photos/km30192002/26339862774/,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/\ne72b4a53de5625eb,https://c1.staticflickr.com/8/7657/27823358415_d92d626069_o.jpg,0.0,0.0,0.6,0.75,327,416,https://www.flickr.com/photos/usdagov/27823358415,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\nc00fb01a57be369a,https://c1.staticflickr.com/9/8408/28691791931_82a3941aa5_o.jpg,0.0,0.0,1.0,1.0,469,667,https://www.flickr.com/photos/martius/28691791931,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\nb4670b193da40e71,https://c1.staticflickr.com/1/358/32646041781_b440815498_o.jpg,0.0,0.0,1.0,1.0,672,809,https://www.flickr.com/photos/glorycycles/32646041781,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n9570cf07d89eb8dc,https://c1.staticflickr.com/8/7686/27090297601_e819e000a8_o.jpg,0.4375,0.0,1.0,0.75,780,218,https://www.flickr.com/photos/thoseguys119/27090297601,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\ndfaef9bdc97b1361,https://c1.staticflickr.com/8/7421/28005743806_4d622ca4a3_o.jpg,0.0,0.0,0.524546827795,0.75,407,477,https://www.flickr.com/photos/eltb/28005743806,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n4ab364ae20108a00,https://c1.staticflickr.com/3/2371/32750716142_0743d73ee3_o.jpg,0.0,0.0527240773286,1.0,1.0,288,505,https://www.flickr.com/photos/56433265@N04/32750716142/,https://creativecommons.org/licenses/by/2.0/,webbgun,https://www.flickr.com/people/56433265@N04/\n4cf9444ad9769047,https://c1.staticflickr.com/6/5747/31028727726_f4b27be387_o.jpg,0.0,0.0,0.547453703704,0.75,356,292,https://www.flickr.com/photos/apardavila/31028727726/,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\nd478dd5c88b5989d,https://c1.staticflickr.com/8/7448/27561888023_0f31553db8_o.jpg,0.0,0.0,0.5625,0.75,278,371,https://www.flickr.com/photos/zongo/27561888023/,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\ne37e5b0c059acd02,https://c1.staticflickr.com/8/7535/27259874356_7430d654bc_o.jpg,0.206601876676,0.0,0.619805630027,0.75,477,214,https://www.flickr.com/photos/yutakaseki/27259874356,https://creativecommons.org/licenses/by/2.0/,Yutaka Seki,https://www.flickr.com/people/yutakaseki/\naa1e1c0b36552a0a,https://c1.staticflickr.com/9/8050/29300586745_cbc589a67c_o.jpg,0.0,0.25,0.5,1.0,826,581,https://www.flickr.com/photos/vahemart/29300586745,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\n28c0abf047e40045,https://c1.staticflickr.com/9/8275/29779084234_6d2646c73d_o.jpg,0.28125,0.0,0.84375,0.75,93,10,https://www.flickr.com/photos/mikeprince/29779084234,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/\n599ac6d6465bf890,https://c1.staticflickr.com/8/7794/29551203465_7308e41432_o.jpg,0.0,0.25,0.75,1.0,763,817,https://flickr.com/65638600@N05/29551203465,https://creativecommons.org/licenses/by/2.0/,Stefan Krasowski,https://www.flickr.com/people/rapidtravelchai/\n952a620d7a4f60ae,https://c1.staticflickr.com/6/5723/30318842764_fedb0c4571_o.jpg,0.25,0.0,1.0,0.574644549763,990,880,https://flickr.com/144478206@N07/30318842764,https://creativecommons.org/licenses/by/2.0/,Lala89_Photos,https://www.flickr.com/people/144478206@N07/\n66e658dada57b19b,https://c1.staticflickr.com/1/367/31753190055_6bc017906f_o.jpg,0.25,0.0,1.0,0.561328125,208,356,https://www.flickr.com/photos/collegelibrary/31753190055,https://creativecommons.org/licenses/by/2.0/,college.library,https://www.flickr.com/people/collegelibrary/\n2665962a18d430c7,https://c1.staticflickr.com/8/7037/26481733644_acd622abd3_o.jpg,0.0,0.299878836834,0.75,0.899636510501,920,403,https://www.flickr.com/photos/kjgarbutt/26481733644,https://creativecommons.org/licenses/by/2.0/,Kurtis Garbutt,https://www.flickr.com/people/kjgarbutt/\n8040781ab11d0835,https://c1.staticflickr.com/9/8408/28828162184_074ccb5d9a_o.jpg,0.0,0.25,0.5625,1.0,840,589,https://www.flickr.com/photos/cgk/28828162184,https://creativecommons.org/licenses/by/2.0/,Colby Gutierrez-Kraybill,https://www.flickr.com/people/cgk/\nd7342b38486ebb53,https://c1.staticflickr.com/6/5599/29943810933_3274973921_o.jpg,0.28125,0.25,0.84375,1.0,491,760,https://www.flickr.com/photos/preciosa-ornela/29943810933,https://creativecommons.org/licenses/by/2.0/,PRECIOSA ORNELA,https://www.flickr.com/people/preciosa-ornela/\nbd0610feded7ec1b,https://c1.staticflickr.com/1/328/32217867622_6fe759b7e5_o.jpg,0.0,0.25,0.5625,1.0,763,709,https://www.flickr.com/photos/brighton/32217867622/,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/\n6079cb82635e92ac,https://c1.staticflickr.com/8/7076/27027168645_e5b81f217c_o.jpg,0.501840942563,0.25,1.0,1.0,512,768,https://www.flickr.com/photos/128326674@N06/27027168645/,https://creativecommons.org/licenses/by/2.0/,Yahya S.,https://www.flickr.com/people/128326674@N06/\n2f424e671e404ab0,https://c1.staticflickr.com/9/8505/28970608513_cab4dfdd73_o.jpg,0.42174796748,0.0,0.843495934959,0.75,699,161,https://www.flickr.com/photos/terrazzo/28970608513,https://creativecommons.org/licenses/by/2.0/,Terrazzo,https://www.flickr.com/people/terrazzo/\n0521a4a8e93e0e4b,https://c1.staticflickr.com/8/7342/28048792285_bacd8997ab_o.jpg,0.25,0.25,1.0,1.0,968,888,https://flickr.com/34948727@N00/28048792285,https://creativecommons.org/licenses/by/2.0/,Katherine Lim,https://www.flickr.com/people/ultrakml/\n214f30a244fe72ce,https://c1.staticflickr.com/9/8827/29684851835_86ca0376cb_o.jpg,0.0,0.0,0.5,0.75,920,573,https://www.flickr.com/photos/texasbackroads/29684851835,https://creativecommons.org/licenses/by/2.0/,Nicolas Henderson,https://www.flickr.com/people/texasbackroads/\nc38fa17fa4fd04d5,https://c1.staticflickr.com/8/7669/27720287474_73d1c86b8b_o.jpg,0.4375,0.25,1.0,1.0,975,41,https://www.flickr.com/photos/jsjgeology/27720287474,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ne4ae5fc80887595b,https://c1.staticflickr.com/1/376/32778543196_8152c76dbd_o.jpg,0.0,0.0,0.739130434783,1.0,825,407,https://flickr.com/60206297@N00/32778543196,https://creativecommons.org/licenses/by/2.0/,Ben Babcock,https://www.flickr.com/people/tachyondecay/\n676e585dd6d051a5,https://c1.staticflickr.com/1/479/31658408380_98a187c130_o.jpg,0.25,0.43661971831,1.0,1.0,747,586,https://www.flickr.com/photos/mark6mauno/31658408380,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/\n74cbbe6557010b90,https://c1.staticflickr.com/8/7372/27551672686_8322c67618_o.jpg,0.0,0.0,0.608450704225,1.0,294,311,https://www.flickr.com/photos/dkeats/27551672686/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n8c2fa585600ddea5,https://c1.staticflickr.com/9/8849/28426200266_992d422ac2_o.jpg,0.333333333333,0.0,1.0,1.0,320,281,https://www.flickr.com/photos/52450054@N04/28426200266,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n54a2b9969fb46aa6,https://c1.staticflickr.com/1/272/32939631885_650114eb25_o.jpg,0.333333333333,0.0,1.0,1.0,796,867,https://www.flickr.com/photos/allagashbrewing/32939631885/,https://creativecommons.org/licenses/by/2.0/,Allagash Brewing,https://www.flickr.com/people/allagashbrewing/\n81d6069b4470d4be,https://c1.staticflickr.com/6/5578/31693045371_8443584aac_o.jpg,0.28125,0.0,0.84375,0.75,875,862,https://www.flickr.com/photos/didbygraham/31693045371,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n1b327e6ea8bd09a4,https://c1.staticflickr.com/8/7312/27163031120_532f4d1cdd_o.jpg,0.564049586777,0.0,1.0,0.75,971,387,https://www.flickr.com/photos/akashadorable/27163031120,https://creativecommons.org/licenses/by/2.0/,reverie_rambler,https://www.flickr.com/people/akashadorable/\n1f89e933953617e6,https://c1.staticflickr.com/8/7361/26847281933_37ce75c081_o.jpg,0.25,0.0,1.0,0.5625,108,759,https://www.flickr.com/photos/royluck/26847281933,https://creativecommons.org/licenses/by/2.0/,Roy Luck,https://www.flickr.com/people/royluck/\nc9c1488c58fcdcdd,https://c1.staticflickr.com/8/7411/27842914380_e209894490_o.jpg,0.0,0.0,1.0,1.0,986,788,https://www.flickr.com/photos/surveying/27842914380,https://creativecommons.org/licenses/by/2.0/,Jnzl&#x27;s Photos,https://www.flickr.com/people/surveying/\n4a641e323c76d103,https://c1.staticflickr.com/1/596/32596360476_c42efbca9e_o.jpg,0.0,0.25,0.5,1.0,821,72,https://www.flickr.com/photos/8269539@N04/32596360476,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n1d2945f5fa9243c4,https://c1.staticflickr.com/1/383/32551380376_83d79b110a_o.jpg,0.0,0.25,0.618442622951,1.0,438,577,https://www.flickr.com/photos/pagedooley/32551380376,https://creativecommons.org/licenses/by/2.0/,Kevin Dooley,https://www.flickr.com/people/pagedooley/\n6ca7c2f97cfdf88a,https://c1.staticflickr.com/6/5033/29234670074_0729424f94_o.jpg,0.28125,0.0,0.84375,0.75,937,398,https://www.flickr.com/photos/scotnelson/29234670074,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n5ac6c7b08b43d357,https://c1.staticflickr.com/6/5463/29926220843_3e13cbb84f_o.jpg,0.0,0.25,0.75,1.0,405,914,https://www.flickr.com/photos/littlepixel/29926220843,https://creativecommons.org/licenses/by/2.0/,Little Pixel,https://www.flickr.com/people/littlepixel/\ndd059db2ad7c2bbe,https://c1.staticflickr.com/1/601/31209657333_e86cacd672_o.jpg,0.0,0.25,0.5,1.0,718,685,https://www.flickr.com/photos/42220226@N07/31209657333,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\ne00e2cee784b3d64,https://c1.staticflickr.com/3/2260/32063012944_422916d362_o.jpg,0.0,0.0,0.75,0.715608465608,255,102,https://www.flickr.com/photos/rpavich/32063012944/in/pool-28342859@N00,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/\nd3f812e2792545ae,https://c1.staticflickr.com/9/8085/29038130681_19680fd4b6_o.jpg,0.0,0.25,0.5625,1.0,816,849,https://www.flickr.com/photos/fdecomite/29038130681/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\n6b9181d388823638,https://c1.staticflickr.com/9/8113/30029133521_611d62fe7e_o.jpg,0.433722527473,0.0,0.867445054945,0.75,561,859,https://www.flickr.com/photos/codnewsroom/30029133521,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\nd931e6ea6f10f794,https://c1.staticflickr.com/9/8632/28456712252_d5b0c99d2f_o.jpg,0.28125,0.25,0.84375,1.0,512,779,https://www.flickr.com/photos/daveseven/28456712252,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/\n86ff221686395d10,https://c1.staticflickr.com/8/7778/26784657156_e24e8a4393_o.jpg,0.5,0.0,1.0,0.75,548,359,https://www.flickr.com/photos/rhemkes/26784657156,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\naa599669eaf946e9,https://c1.staticflickr.com/9/8273/29428455751_04d3928fa8_o.jpg,0.110879174853,0.25,0.332637524558,1.0,896,507,https://www.flickr.com/photos/ronmacphotos/29428455751,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n189b2d6b5e40fcfe,https://c1.staticflickr.com/6/5796/30321080300_9c3126e52a_o.jpg,0.165467625899,0.0,0.496402877698,0.75,719,701,https://www.flickr.com/photos/mark-gunn/30321080300,https://creativecommons.org/licenses/by/2.0/,Mark  Gunn,https://www.flickr.com/people/mark-gunn/\n09aee3942a61d089,https://c1.staticflickr.com/9/8594/28122678171_eceed0549b_o.jpg,0.0,0.25,0.75,0.75,507,814,https://www.flickr.com/photos/bpprice/28122678171,https://creativecommons.org/licenses/by/2.0/,brando.n,https://www.flickr.com/people/bpprice/\ne9707612604d7c3f,https://c1.staticflickr.com/8/7323/27234323661_a52ed5c67c_o.jpg,0.281690140845,0.25,0.845070422535,1.0,875,235,https://www.flickr.com/photos/kieransphotostream/27234323661/,https://creativecommons.org/licenses/by/2.0/,Koex73,https://www.flickr.com/people/kieransphotostream/\na18a3ca747e9990d,https://c1.staticflickr.com/9/8794/28557064535_06c5151d04_o.jpg,0.5,0.25,1.0,1.0,662,648,https://www.flickr.com/photos/42220226@N07/28557064535,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\ndded0eae55b5c2f0,https://c1.staticflickr.com/6/5583/30386552480_5cce017915_o.jpg,0.0,0.0,0.666666666667,1.0,820,670,https://www.flickr.com/photos/usnavy/30386552480,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n0e41860a981627d1,https://c1.staticflickr.com/9/8134/30000181236_bd6790d4d3_o.jpg,0.688300349243,0.0,1.0,0.75,975,269,https://www.flickr.com/photos/39090590@N02/30000181236,https://creativecommons.org/licenses/by/2.0/,Cyril Fluck,https://www.flickr.com/people/39090590@N02/\nc14265cd7f744b28,https://c1.staticflickr.com/6/5625/30516595856_9d1207466d_o.jpg,0.25,0.0,0.75,0.75,820,864,https://www.flickr.com/photos/rollercoasterphilosophy/30516595856/,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/\n4501bbdc3b7c86bd,https://c1.staticflickr.com/1/395/31538324564_8f14f93c35_o.jpg,0.25,0.25,1.0,1.0,482,126,https://flickr.com/49048289@N00/31538324564,https://creativecommons.org/licenses/by/2.0/,Jaymis Loveday,https://www.flickr.com/people/jaymis/\n3b16ea7cd84b3f23,https://c1.staticflickr.com/8/7509/28757213003_690bd7fd23_o.jpg,0.0,0.0,0.5,0.75,629,378,https://flickr.com/132004986@N08/28757213003,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/\n08d8ffda8c34184a,https://c1.staticflickr.com/9/8129/28565513834_4526a29dcb_o.jpg,0.4375,0.25,1.0,1.0,459,532,https://www.flickr.com/photos/127226743@N02/28565513834,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n6d5fcbd90ee92ae0,https://c1.staticflickr.com/1/576/31724116814_bb81924d73_o.jpg,0.25,0.25,1.0,1.0,114,795,https://www.flickr.com/photos/nikkvalentine/31724116814,https://creativecommons.org/licenses/by/2.0/,The Manic Macrographer,https://www.flickr.com/people/nikkvalentine/\nfcfffdfa6b5c8500,https://c1.staticflickr.com/9/8167/28608321612_bfd29ca336_o.jpg,0.0,0.0,0.666666666667,1.0,490,637,https://www.flickr.com/photos/cogdog/28608321612,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n6c45e7530872effb,https://c1.staticflickr.com/6/5589/29625874934_b06433044d_o.jpg,0.25,0.0,0.75,0.75,976,352,https://www.flickr.com/photos/tipsfortravellers/29625874934,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n9774fad47495a40b,https://c1.staticflickr.com/8/7513/28472026273_0babddf802_o.jpg,0.4375,0.25,1.0,1.0,629,358,https://www.flickr.com/photos/sedoglia/28472026273,https://creativecommons.org/licenses/by/2.0/,Sergio,https://www.flickr.com/people/sedoglia/\n64316286d0342333,https://c1.staticflickr.com/1/424/31991344911_6be254bd84_o.jpg,0.4375,0.25,1.0,1.0,875,765,https://www.flickr.com/photos/didbygraham/31991344911,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n3d8d44a02f73c91c,https://c1.staticflickr.com/8/7443/27019909701_b4af197501_o.jpg,0.0,0.0,0.587060702875,0.75,688,900,https://www.flickr.com/photos/brighton/27019909701,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/\n7a92047da1d3db68,https://c1.staticflickr.com/9/8216/28993004061_27fac24cd3_o.jpg,0.25,0.25,0.75,1.0,985,918,https://www.flickr.com/photos/treeworld/28993004061,https://creativecommons.org/licenses/by/2.0/,Treeworld Wholesale,https://www.flickr.com/people/treeworld/\n609351d96ac0dfb6,https://c1.staticflickr.com/6/5338/31219731371_5ae0d364c7_o.jpg,0.0,0.0,0.5,0.75,405,932,https://www.flickr.com/photos/janitors/31219731371/,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n1023afc7eca78c9e,https://c1.staticflickr.com/1/506/32447128386_1403f97cef_o.jpg,0.0,0.25,0.5625,1.0,875,731,https://www.flickr.com/photos/69203347@N03/32447128386/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n48007e9a5ed7c30f,https://c1.staticflickr.com/9/8256/28910491822_c9583f0a50_o.jpg,0.333333333333,0.0,1.0,1.0,662,785,https://www.flickr.com/photos/greggjerdingen/28910491822,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nd345db71031aa39f,https://c1.staticflickr.com/6/5551/30548881306_bf3b213f83_o.jpg,0.25,0.0,0.75,0.75,699,43,https://www.flickr.com/photos/minoritenplatz8/30548881306,https://creativecommons.org/licenses/by/2.0/,\"Bundesministerium f\\303\\274r Europa, Integration und \\303\\204u\\303\\237eres\",https://www.flickr.com/people/minoritenplatz8/\n199c375ad2d6fdb2,https://c1.staticflickr.com/9/8407/30095240116_f33a7ba450_o.jpg,0.259962406015,0.0,0.779887218045,0.75,426,694,https://www.flickr.com/photos/60712129@N06/30095240116,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/\nf6588f74b4e9b983,https://c1.staticflickr.com/9/8847/28451770185_d02fcd2513_o.jpg,0.0,0.0,0.5625,0.75,695,117,https://www.flickr.com/photos/robthurman/28451770185/,https://creativecommons.org/licenses/by/2.0/,Rob Thurman,https://www.flickr.com/people/robthurman/\n3434117840d9d6ca,https://c1.staticflickr.com/8/7195/27808986721_4fb07fe14c_o.jpg,0.25,0.0,0.75,0.75,635,393,https://www.flickr.com/photos/texasbackroads/27808986721,https://creativecommons.org/licenses/by/2.0/,Nicolas Henderson,https://www.flickr.com/people/texasbackroads/\n50bcbeb838c1a63f,https://c1.staticflickr.com/8/7771/26876093820_50354a70db_o.jpg,0.435549525102,0.0,1.0,1.0,725,91,https://www.flickr.com/photos/ben_salter/26876093820,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/\n7996e393b5b0b30c,https://c1.staticflickr.com/3/2293/32091123753_963a0e5588_o.jpg,0.0,0.25,0.531155015198,1.0,405,96,https://www.flickr.com/photos/erussell1984/32091123753,https://creativecommons.org/licenses/by/2.0/,airbus777,https://www.flickr.com/people/erussell1984/\n3d0cccdb3a1d5e65,https://c1.staticflickr.com/3/2122/32163128993_8426f97943_o.jpg,0.25,0.25,0.75,1.0,820,576,https://www.flickr.com/photos/jus10h/32163128993,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n839d946a0d0a5663,https://c1.staticflickr.com/9/8011/29882980516_22af19caff_o.jpg,0.5,0.25,1.0,1.0,932,60,https://www.flickr.com/photos/whitefield_d/29882980516,https://creativecommons.org/licenses/by/2.0/,whity,https://www.flickr.com/people/whitefield_d/\nc4418378709b8d9b,https://c1.staticflickr.com/8/7026/26362253863_fddc38aca7_o.jpg,0.25,0.25,0.75,1.0,147,594,https://www.flickr.com/photos/shankaronline/26362253863,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\ne91feee7c50d4495,https://c1.staticflickr.com/9/8686/28858724151_eb8938466d_o.jpg,0.0,0.0,0.689655172414,1.0,281,138,https://www.flickr.com/photos/132295270@N07/28858724151,https://creativecommons.org/licenses/by/2.0/,Renee,https://www.flickr.com/people/132295270@N07/\n4e1ab845386728fe,https://c1.staticflickr.com/6/5485/30241996990_bcaa48371e_o.jpg,0.0,0.25,0.5625,1.0,937,90,https://www.flickr.com/photos/rusty_clark/30241996990/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\nd8c4089a3576443d,https://c1.staticflickr.com/6/5562/30748214112_343b8443e3_o.jpg,0.0,0.25,0.75,1.0,672,313,https://www.flickr.com/photos/glorycycles/30748214112,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\ne4bd6dffe8b8001f,https://c1.staticflickr.com/9/8396/28621942172_239d9de014_o.jpg,0.333333333333,0.0,1.0,1.0,848,662,https://www.flickr.com/photos/kecko/28621942172,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\n722d7c82f9e52277,https://c1.staticflickr.com/8/7271/26545528480_1b891167d4_o.jpg,0.0,0.4375,0.75,1.0,404,351,https://www.flickr.com/photos/cantoni/26545528480,https://creativecommons.org/licenses/by/2.0/,Brian Cantoni,https://www.flickr.com/people/cantoni/\n42478da69b1c3eff,https://c1.staticflickr.com/8/7335/27386988465_dd101df059_o.jpg,0.281690140845,0.25,0.845070422535,1.0,309,929,https://www.flickr.com/photos/treegrow/27386988465/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\ne911b78fc1055cc5,https://c1.staticflickr.com/8/7283/28238272885_2430ee56a7_o.jpg,0.5,0.0,1.0,0.75,294,644,https://www.flickr.com/photos/flowcomm/28238272885/,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\n911dab47e4328d7a,https://c1.staticflickr.com/9/8412/29097441651_dbdf3baa6b_o.jpg,0.481910274964,0.25,0.963820549928,1.0,604,286,https://www.flickr.com/photos/13476480@N07/29097441651,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n825652a2826f685e,https://c1.staticflickr.com/1/267/31938516570_e0734fa10a_o.jpg,0.0,0.0,0.75,1.0,978,101,https://www.flickr.com/photos/21218849@N03/31938516570,https://creativecommons.org/licenses/by/2.0/,Samuel Mann,https://www.flickr.com/people/21218849@N03/\nb2b636550fe63454,https://c1.staticflickr.com/6/5623/30284008400_2454fa756a_o.jpg,0.502573529412,0.0,1.0,0.75,896,66,https://www.flickr.com/photos/thenationalguard/30284008400,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/\n23840c9cc37a53c0,https://c1.staticflickr.com/9/8681/28602643166_bddce9c0e1_o.jpg,0.25,0.0,0.75,0.75,576,840,https://www.flickr.com/photos/georgiapeanuts/28602643166,https://creativecommons.org/licenses/by/2.0/,Georgia Peanut Commission,https://www.flickr.com/people/georgiapeanuts/\n8a45a1ea4a1a65cf,https://c1.staticflickr.com/6/5513/30827580826_502fbce35f_o.jpg,0.0,0.25,0.498159057437,1.0,561,892,https://www.flickr.com/photos/eaglebrook/30827580826/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/\nb4d47d94d05be00c,https://c1.staticflickr.com/8/7364/27401393906_2145f108da_o.jpg,0.280784844384,0.0,0.842354533153,1.0,390,758,https://www.flickr.com/photos/knowledge-test/27401393906,https://creativecommons.org/licenses/by/2.0/,Dan Markeye,https://www.flickr.com/people/knowledge-test/\nacc03214bc7d48af,https://c1.staticflickr.com/1/472/32390265560_4e5a13daa3_o.jpg,0.25,0.0,0.75,0.75,868,317,https://www.flickr.com/photos/76969036@N02/32390265560/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n8bdfc8e753fae72e,https://c1.staticflickr.com/9/8774/28456514846_be84e93845_o.jpg,0.0,0.0,0.75,0.5625,981,6,https://www.flickr.com/photos/31176607@N05/28456514846,https://creativecommons.org/licenses/by/2.0/,kuhnmi,https://www.flickr.com/people/31176607@N05/\n1f505a31deab676f,https://c1.staticflickr.com/1/309/31495207013_6fc614d7c1_o.jpg,0.238832853026,0.0,0.716498559078,0.75,650,886,https://www.flickr.com/photos/jlcernadas/31495207013,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\n99119015bf34c6c0,https://c1.staticflickr.com/9/8383/28451510993_90187910f5_o.jpg,0.309221311475,0.25,0.927663934426,1.0,498,879,https://www.flickr.com/photos/grassrootsgroundswell/28451510993,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/\n40b06d2896786534,https://c1.staticflickr.com/8/7049/26818295110_667b53e79c_o.jpg,0.252702702703,0.0,1.0,0.75,498,255,https://www.flickr.com/photos/bensutherland/26818295110/,https://creativecommons.org/licenses/by/2.0/,Ben Sutherland,https://www.flickr.com/people/bensutherland/\n5f0fed356dee47ea,https://c1.staticflickr.com/8/7345/26757700901_c6eb4fc802_o.jpg,0.0,0.0,0.666666666667,1.0,33,371,https://www.flickr.com/photos/52450054@N04/26757700901,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n9477f255b71f6b9a,https://c1.staticflickr.com/9/8732/28515741375_45d2b7446c_o.jpg,0.0,0.25,0.75,1.0,71,44,https://www.flickr.com/photos/orangeaurochs/28515741375,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/\n7ac0bf712465fa94,https://c1.staticflickr.com/6/5249/29761151600_c017855f01_o.jpg,0.43661971831,0.25,1.0,1.0,407,824,https://www.flickr.com/photos/eltb/29761151600,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nb84a93a43c2e6952,https://c1.staticflickr.com/6/5738/30304239583_281288ae97_o.jpg,0.0,0.25,0.75,1.0,672,305,https://www.flickr.com/photos/glorycycles/30304239583,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\nf95beb1b4c17878a,https://c1.staticflickr.com/9/8149/28535892163_d979bf03e6_o.jpg,0.0,0.0,0.666666666667,1.0,966,255,https://www.flickr.com/photos/o_0/28535892163,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n1c38a2d69363416f,https://c1.staticflickr.com/1/393/32129997635_5c5ef1c548_o.jpg,0.0,0.0,0.5625,0.75,437,243,https://www.flickr.com/photos/nzcarfreak/32129997635/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\n938a906cc0b428c9,https://c1.staticflickr.com/1/760/32410150256_63a8579323_o.jpg,0.431603773585,0.0,1.0,0.75,406,122,https://flickr.com/146272131@N07/32410150256,https://creativecommons.org/licenses/by/2.0/,foundin_a_attic,https://www.flickr.com/people/foundin_a_attic/\n29ac99f0d95cdcdd,https://c1.staticflickr.com/8/7428/27658392430_91b25f1d3f_o.jpg,0.5,0.25,1.0,1.0,625,461,https://www.flickr.com/photos/agenciabrasilia/27658392430,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\ne5f6a5ac9f490579,https://c1.staticflickr.com/6/5643/31227326132_d1fd11bc18_o.jpg,0.5,0.25,1.0,1.0,948,149,https://www.flickr.com/photos/afotador/31227326132/,https://creativecommons.org/licenses/by/2.0/,Antonio Soler,https://www.flickr.com/people/afotador/\n2a66e3683892b0bf,https://c1.staticflickr.com/9/8321/29446152012_b21bdd5386_o.jpg,0.0,0.0,1.0,0.838016528926,918,491,https://www.flickr.com/photos/39527581@N07/29446152012,https://creativecommons.org/licenses/by/2.0/,Rossano aka Bud Care,https://www.flickr.com/people/39527581@N07/\n835e24b4ed9fe89e,https://c1.staticflickr.com/8/7414/27018819202_b596beb541_o.jpg,0.28125,0.25,0.84375,1.0,875,607,https://www.flickr.com/photos/kieransphotostream/27018819202,https://creativecommons.org/licenses/by/2.0/,Koex73,https://www.flickr.com/people/kieransphotostream/\nb812fe040a59f02b,https://c1.staticflickr.com/6/5817/30128435065_b9928c6a31_o.jpg,0.0,0.0,0.745709828393,1.0,699,847,https://www.flickr.com/photos/13476480@N07/30128435065,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nc2b3d7f2a26d82b4,https://c1.staticflickr.com/8/7432/26928405236_ea330a1420_o.jpg,0.456538461538,0.25,1.0,1.0,676,745,https://www.flickr.com/photos/jeepersmedia/26928405236,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n06b1cba3db1a8469,https://c1.staticflickr.com/8/7185/27046737425_cba8e10853_o.jpg,0.25,0.0,1.0,0.75,819,805,https://www.flickr.com/photos/hubble_esa/27046737425,https://creativecommons.org/licenses/by/2.0/,Hubble ESA,https://www.flickr.com/people/hubble_esa/\n0e87ed0b347be1f5,https://c1.staticflickr.com/9/8816/28227817650_3e6e9f66d9_o.jpg,0.25,0.25,1.0,1.0,329,475,https://www.flickr.com/photos/ajari/28227817650,https://creativecommons.org/licenses/by/2.0/,ajari,https://www.flickr.com/people/ajari/\n79a52fcb62931c16,https://c1.staticflickr.com/8/7078/27032428163_f333cea8b8_o.jpg,0.446030640669,0.0,0.892061281337,0.75,320,521,https://www.flickr.com/photos/yogendra174/27032428163,https://creativecommons.org/licenses/by/2.0/,Yogendra Joshi,https://www.flickr.com/people/yogendra174/\neb422284a1db57ca,https://c1.staticflickr.com/1/610/31566618594_5585d70b93_o.jpg,0.0,0.0,0.809756097561,1.0,875,918,https://www.flickr.com/photos/didbygraham/31566618594,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\ne6557602770210ec,https://c1.staticflickr.com/8/7618/26889485530_9d881a092a_o.jpg,0.0,0.0,1.0,0.864093959732,821,853,https://www.flickr.com/photos/jsjgeology/26889485530,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ne447255d088ee0d2,https://c1.staticflickr.com/6/5347/30781945710_28289fce31_o.jpg,0.25,0.25,0.75,1.0,982,297,https://flickr.com/109289138@N06/30781945710,https://creativecommons.org/licenses/by/2.0/,Joburg Cricket Club,https://www.flickr.com/people/joburgcricketclub/\n1b735d0ca8fa4658,https://c1.staticflickr.com/8/7652/26841289895_2084a7be77_o.jpg,0.249079528719,0.0,0.747238586156,0.75,426,576,https://www.flickr.com/photos/64141731@N03/26841289895/,https://creativecommons.org/licenses/by/2.0/,EarlRShumaker,https://www.flickr.com/people/64141731@N03/\n033a52c1c012a91a,https://c1.staticflickr.com/1/393/31672716672_e940171ebc_o.jpg,0.0,0.0,0.75,0.599757673667,145,893,https://flickr.com/143049688@N08/31672716672,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/\n2d0a59ef8c6ae8c7,https://c1.staticflickr.com/8/7472/26793667800_bc330f1c6b_o.jpg,0.5,0.0,1.0,0.75,305,394,https://www.flickr.com/photos/14583963@N00/26793667800,https://creativecommons.org/licenses/by/2.0/,David Short,https://www.flickr.com/people/14583963@N00/\nb5dd4cc6c73d9ca4,https://c1.staticflickr.com/9/8622/28227149660_533b077257_o.jpg,0.319375,0.0,0.958125,0.75,310,92,https://www.flickr.com/photos/gails_pictures/28227149660/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nb75c2d7987c07de0,https://c1.staticflickr.com/9/8294/29757868145_238785614a_o.jpg,0.0,0.0,1.0,0.799676898223,484,640,https://www.flickr.com/photos/voyagesetc/29757868145/,https://creativecommons.org/licenses/by/2.0/,Voyages etc...,https://www.flickr.com/people/voyagesetc/\n2654d1714186f4cf,https://c1.staticflickr.com/6/5803/31367915755_7e6dac1a09_o.jpg,0.0,0.25,0.5,1.0,980,292,https://www.flickr.com/photos/jkirkhart35/31367915755,https://creativecommons.org/licenses/by/2.0/,Jerry Kirkhart,https://www.flickr.com/people/jkirkhart35/\n3af60dc851f08921,https://c1.staticflickr.com/8/7429/26829976903_640631837e_o.jpg,0.25,0.279641185647,1.0,0.838923556942,705,893,https://www.flickr.com/photos/bloggers/26829976903,https://creativecommons.org/licenses/by/2.0/,Reynosa Blogs,https://www.flickr.com/people/bloggers/\nb46f612b8ddf49d9,https://c1.staticflickr.com/3/2296/32883058552_1734eba9cf_o.jpg,0.0,0.0,0.75,0.618442622951,922,148,https://www.flickr.com/photos/pedrosimoes7/32883058552,https://creativecommons.org/licenses/by/2.0/,Pedro Ribeiro Sim\\303\\265es,https://www.flickr.com/people/pedrosimoes7/\n8ae07af391ffc807,https://c1.staticflickr.com/9/8884/28953729636_3d1358d264_o.jpg,0.0,0.0,1.0,0.878172588832,554,557,https://www.flickr.com/photos/55229469@N07/28953729636,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\n3ca34fa3de88cc00,https://c1.staticflickr.com/2/1542/26140721244_742d5e42f7_o.jpg,0.0,0.0,0.5,0.75,976,455,https://www.flickr.com/photos/o_0/26140721244/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\nf90b27c30ce3d0a5,https://c1.staticflickr.com/1/729/32029788255_a409dd5bbd_o.jpg,0.0,0.0,0.666666666667,1.0,747,635,https://flickr.com/130263698@N03/32029788255,https://creativecommons.org/licenses/by/2.0/,EDUSPACES / PRZESTRZENIE EDUKACJI,https://www.flickr.com/people/eduspaces/\n16299d503aca0747,https://c1.staticflickr.com/8/7779/30192276612_b2e91c77f7_o.jpg,0.0,0.4375,0.75,1.0,709,71,https://www.flickr.com/photos/127226743@N02/30192276612,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n2074bd735fbae7e6,https://c1.staticflickr.com/9/8285/29612354546_017a40684a_o.jpg,0.28125,0.25,0.84375,1.0,459,589,http://www.flickr.com/photos/publiclibrariesnsw/29612354546/,https://creativecommons.org/licenses/by/2.0/,State Library of NSW Public Library Services,https://www.flickr.com/people/publiclibrariesnsw/\n3c1b3819c671f1c7,https://c1.staticflickr.com/9/8130/28760229320_3a5ae15bd9_o.jpg,0.333333333333,0.0,1.0,1.0,404,819,https://www.flickr.com/photos/usnavy/28760229320,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n25874c497bad3513,https://c1.staticflickr.com/9/8336/29295989611_8cf777413f_o.jpg,0.28125,0.0,0.84375,0.75,331,229,https://flickr.com/48592349@N04/29295989611,https://creativecommons.org/licenses/by/2.0/,synspectrum,https://www.flickr.com/people/epector/\n360f3a52bf210786,https://c1.staticflickr.com/9/8437/29372668891_bd7b0ef31f_o.jpg,0.28125,0.0,0.84375,0.75,641,513,https://www.flickr.com/photos/12707238@N00/29372668891/,https://creativecommons.org/licenses/by/2.0/,Eric.Ray,https://www.flickr.com/people/12707238@N00/\ndfcdb56602a27874,https://c1.staticflickr.com/8/7338/27156142911_1e824ffc9a_o.jpg,0.25,0.267938931298,1.0,0.803816793893,898,454,https://www.flickr.com/photos/diegopig/27156142911,https://creativecommons.org/licenses/by/2.0/,rossomoto,https://www.flickr.com/people/diegopig/\neeb1d693013e23a3,https://c1.staticflickr.com/1/761/32130695771_8a89772f30_o.jpg,0.598814229249,0.0,0.998023715415,0.75,499,755,https://flickr.com/50780602@N04/32130695771,https://creativecommons.org/licenses/by/2.0/,U.S. Naval War College,https://www.flickr.com/people/usnavalwarcollegeri/\nff054a4d161132be,https://c1.staticflickr.com/6/5705/30907256391_a0685de1d6_o.jpg,0.0,0.0,0.406214039125,1.0,981,56,https://www.flickr.com/photos/tydence/30907256391/,https://creativecommons.org/licenses/by/2.0/,Tydence Davis,https://www.flickr.com/people/tydence/\nccebf4596e8cbda3,https://c1.staticflickr.com/9/8427/29311843692_562840db60_o.jpg,0.28125,0.0,0.84375,0.75,875,645,https://www.flickr.com/photos/wltmauc/29311843692,https://creativecommons.org/licenses/by/2.0/,Aubrey Morandarte,https://www.flickr.com/people/wltmauc/\n99805d4960192f88,https://c1.staticflickr.com/8/7107/27038132083_b15f434b57_o.jpg,0.148333333333,0.0,1.0,1.0,611,856,https://www.flickr.com/photos/moritzbarcelona/27038132083,https://creativecommons.org/licenses/by/2.0/,Moritz Barcelona,https://www.flickr.com/people/moritzbarcelona/\nd12f9a23c008d5f2,https://c1.staticflickr.com/8/7686/26693225850_e60413daed_o.jpg,0.336764705882,0.0,1.0,1.0,146,380,https://www.flickr.com/photos/shankaronline/26693225850,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n97381efa5629e7ee,https://c1.staticflickr.com/8/7483/28672006730_a3acdaf6d3_o.jpg,0.25,0.0,0.75,0.75,976,340,https://www.flickr.com/photos/o_0/28672006730/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\na9ea22a0c71efadf,https://c1.staticflickr.com/9/8245/29237800431_b00b3a9bc6_o.jpg,0.25,0.0,1.0,0.75,979,677,https://www.flickr.com/photos/trendscout/29237800431,https://creativecommons.org/licenses/by/2.0/,Matthias Mueller,https://www.flickr.com/people/trendscout/\n50bedbf72f252003,https://c1.staticflickr.com/9/8377/29030865421_d150fe2990_o.jpg,0.327407407407,0.0,1.0,1.0,138,114,https://www.flickr.com/photos/gails_pictures/29030865421,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nc51f1196222919c4,https://c1.staticflickr.com/1/310/31951828901_08cd1e28b9_o.jpg,0.25,0.0,1.0,1.0,875,484,https://flickr.com/24431382@N03/31951828901,https://creativecommons.org/licenses/by/2.0/,Eric Fischer,https://www.flickr.com/people/walkingsf/\n2095031cc22c29a6,https://c1.staticflickr.com/3/2814/33086806092_3dbf7850f2_o.jpg,0.25,0.0,1.0,1.0,416,681,https://flickr.com/34764035@N00/33086806092,https://creativecommons.org/licenses/by/2.0/,Rhian,https://www.flickr.com/people/rhian/\naca4f156b3f7a62e,https://c1.staticflickr.com/1/364/32200613363_bf5a333dc2_o.jpg,0.386029411765,0.25,1.0,1.0,310,227,https://www.flickr.com/photos/gails_pictures/32200613363,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n41576c09bbf8dc2b,https://c1.staticflickr.com/8/7283/27363759014_c1bafe475b_o.jpg,0.0,0.42174796748,0.75,0.843495934959,487,211,https://www.flickr.com/photos/patrice_calatayu/27363759014,https://creativecommons.org/licenses/by/2.0/,Patrice CALATAYU,https://www.flickr.com/people/patrice_calatayu/\nad54c1a840f1b492,https://c1.staticflickr.com/8/7512/27752785024_bf37c83f8c_o.jpg,0.482608695652,0.0,0.965217391304,0.75,407,714,https://www.flickr.com/photos/eltb/27752785024,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n60d007a49adf54f5,https://c1.staticflickr.com/6/5468/30043044433_59f61f5f0c_o.jpg,0.0,0.0,0.75,0.75,672,631,https://www.flickr.com/photos/glorycycles/30043044433,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n9a944a8589c8cbe8,https://c1.staticflickr.com/8/7298/27010907881_55eb132033_o.jpg,0.28125,0.25,0.84375,1.0,469,710,https://www.flickr.com/photos/transitomedellin/27010907881,https://creativecommons.org/licenses/by/2.0/,Secretar\\303\\255a de Movilidad de Medell\\303\\255n,https://www.flickr.com/people/transitomedellin/\n9c6dcbc0ff9ce8ca,https://c1.staticflickr.com/1/129/31435313352_bc533a7b79_o.jpg,0.25,0.25,0.75,1.0,752,227,https://flickr.com/63142286@N04/31435313352,https://creativecommons.org/licenses/by/2.0/,Arturo Hurtado,https://www.flickr.com/people/omnious100/\nd9b46861ab203acc,https://c1.staticflickr.com/9/8137/30226057285_4be8d314a1_o.jpg,0.0,0.25,0.498159057437,1.0,499,957,https://flickr.com/93839835@N04/30226057285,https://creativecommons.org/licenses/by/2.0/,Emily Mathews,https://www.flickr.com/people/eamathe/\nc7a7621b9880d3e9,https://c1.staticflickr.com/9/8004/29545188632_3315961402_o.jpg,0.358931552588,0.25,1.0,1.0,310,16,https://www.flickr.com/photos/gails_pictures/29545188632,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n6a6ad1e3a2b9277d,https://c1.staticflickr.com/4/3696/32757171431_2b8b7d3b9b_o.jpg,0.0,0.0,0.75,1.0,735,302,https://www.flickr.com/photos/27665395@N05/32757171431,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nb6d11b2c6f75bf60,https://c1.staticflickr.com/2/1585/26147188944_54548a2f5a_o.jpg,0.571911196911,0.0,0.953185328185,0.75,669,733,https://www.flickr.com/photos/vasenka/26147188944,https://creativecommons.org/licenses/by/2.0/,VasenkaPhotography,https://www.flickr.com/people/vasenka/\n1578ca19a2c0360a,https://c1.staticflickr.com/8/7326/28119610611_dab400b915_o.jpg,0.25,0.25,1.0,1.0,924,754,https://flickr.com/32031278@N03/28119610611,https://creativecommons.org/licenses/by/2.0/,Debbie Tingzon,https://www.flickr.com/people/ilove9and23/\nc9fd3859d99b4a90,https://c1.staticflickr.com/6/5810/29977128264_151d923d50_o.jpg,0.28125,0.0,0.84375,0.75,923,316,https://www.flickr.com/photos/fzhenghu/29977128264,https://creativecommons.org/licenses/by/2.0/,zhenghu feng,https://www.flickr.com/people/fzhenghu/\n936f105c7446bb29,https://c1.staticflickr.com/8/7492/27884336631_4b90b2ebcc_o.jpg,0.277173913043,0.25,0.83152173913,1.0,633,533,https://www.flickr.com/photos/textlad/27884336631,https://creativecommons.org/licenses/by/2.0/,textlad,https://www.flickr.com/people/textlad/\nc8a199f5803ee5c3,https://c1.staticflickr.com/8/7642/28458258174_1956a7bdd2_o.jpg,0.0,0.0,0.666666666667,1.0,699,426,https://www.flickr.com/photos/stevendepolo/28458258174/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nb64acf4eab440b2e,https://c1.staticflickr.com/8/7359/27216101415_841dc967bc_o.jpg,0.34375,0.25,1.0,1.0,760,251,https://www.flickr.com/photos/gaby1/27216101415,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\n7e65289742afe3c4,https://c1.staticflickr.com/6/5637/30289217513_f3a316d508_o.jpg,0.210588633288,0.25,0.631765899865,1.0,980,959,https://www.flickr.com/photos/surfergirl30/30289217513,https://creativecommons.org/licenses/by/2.0/,SurFeRGiRL30,https://www.flickr.com/people/surfergirl30/\ne3b840af402afdd3,https://c1.staticflickr.com/8/7443/27015576273_e19a5f3d57_o.jpg,0.0,0.0,0.666666666667,1.0,100,322,https://www.flickr.com/photos/happymillerman/27015576273,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\na9b9c17c560e9f2d,https://c1.staticflickr.com/6/5549/31085297735_73118807c1_o.jpg,0.0,0.0,0.910344827586,1.0,689,139,https://www.flickr.com/photos/dullhunk/31085297735,https://creativecommons.org/licenses/by/2.0/,Duncan Hull,https://www.flickr.com/people/dullhunk/\nd83601902dd0caec,https://c1.staticflickr.com/8/7694/26928048702_47ab534c5f_o.jpg,0.0,0.0,0.75,0.75,725,556,https://www.flickr.com/photos/sudeep1106/26928048702/,https://creativecommons.org/licenses/by/2.0/,NINXIVI,https://www.flickr.com/people/sudeep1106/\n0259ac3162d7a7fa,https://c1.staticflickr.com/6/5696/31084399295_30dff1afc0_o.jpg,0.499263622975,0.25,0.99852724595,1.0,520,879,https://www.flickr.com/photos/joanneum/31084399295/,https://creativecommons.org/licenses/by/2.0/,Universalmuseum Joanneum,https://www.flickr.com/people/joanneum/\n44cf1dd2658609ae,https://c1.staticflickr.com/6/5341/30852899235_fdd942db58_o.jpg,0.0,0.4375,0.75,1.0,939,717,https://www.flickr.com/photos/notionscapital/30852899235/,https://creativecommons.org/licenses/by/2.0/,Mike Licht,https://www.flickr.com/people/notionscapital/\nd06aecec9905e07a,https://c1.staticflickr.com/9/8161/29586005000_d92939076b_o.jpg,0.25,0.0,1.0,1.0,848,866,https://www.flickr.com/photos/quinet/29586005000,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nb53c546e0c820bb3,https://c1.staticflickr.com/6/5526/30302865136_084b7f60bc_o.jpg,0.0,0.0,0.75,1.0,913,728,http://www.flickr.com/photos/12707238@N00/30302865136/,https://creativecommons.org/licenses/by/2.0/,Eric.Ray,https://www.flickr.com/people/12707238@N00/\n493c91831f0ec982,https://c1.staticflickr.com/1/609/31545040516_f984d42523_o.jpg,0.28125,0.0,0.84375,0.75,780,769,https://www.flickr.com/photos/thoseguys119/31545040516,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n92af5a5cc010faa5,https://c1.staticflickr.com/9/8615/28432497356_5feb74085a_o.jpg,0.5,0.25,1.0,1.0,739,866,https://www.flickr.com/photos/blumenbiene/28432497356,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\n4721d7e8bd28c774,https://c1.staticflickr.com/6/5833/31273196086_f3d8ae7a8c_o.jpg,0.334315169367,0.0,1.0,1.0,498,849,https://flickr.com/35842362@N03/31273196086,https://creativecommons.org/licenses/by/2.0/,Fr James Bradley,https://www.flickr.com/people/jamesbradley/\n8450782fcc783297,https://c1.staticflickr.com/8/7299/28131689106_cc292d7aea_o.jpg,0.25,0.25,1.0,1.0,953,145,https://www.flickr.com/photos/tseenster/28131689106,https://creativecommons.org/licenses/by/2.0/,Tseen Khoo,https://www.flickr.com/people/tseenster/\n998a88a57b1f5866,https://c1.staticflickr.com/6/5713/31168161645_f1c2277747_o.jpg,0.25,0.250923190547,1.0,0.75276957164,407,260,https://www.flickr.com/photos/eltb/31168161645,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n792f731bef8ede95,https://c1.staticflickr.com/9/8568/29296141311_2205f92eee_o.jpg,0.0,0.0,0.75,1.0,309,134,https://www.flickr.com/photos/treegrow/29296141311/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n0b1f0c1067369bc5,https://c1.staticflickr.com/8/7797/27234854036_8e8f0f2040_o.jpg,0.25,0.0,0.75,0.75,668,344,https://www.flickr.com/photos/eberhardtschool/27234854036,https://creativecommons.org/licenses/by/2.0/,Eberhardt School,https://www.flickr.com/people/eberhardtschool/\n3657914a0279e3f4,https://c1.staticflickr.com/6/5659/22827195288_826a8dd140_o.jpg,0.0,0.25,0.497426470588,1.0,141,892,https://www.flickr.com/photos/dkeats/22827195288,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n0bb78770d50d0b08,https://c1.staticflickr.com/9/8855/27847199394_82b0112261_o.jpg,0.0,0.25,0.650420168067,1.0,923,833,https://www.flickr.com/photos/archivesnz/27847199394,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/\n249b57e677ca70b1,https://c1.staticflickr.com/8/7284/27028290533_131d119b4e_o.jpg,0.0,0.0,0.5,0.75,321,126,https://www.flickr.com/photos/52450054@N04/27028290533,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n9499bacadd0dd08c,https://c1.staticflickr.com/8/7453/27394843814_c9dcbbe0ed_o.jpg,0.4375,0.25,1.0,1.0,875,815,https://www.flickr.com/photos/69203347@N03/27394843814,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n7bca0c8e6c898cb2,https://c1.staticflickr.com/8/7370/27233994275_fedc98b696_o.jpg,0.315396113602,0.0,1.0,1.0,855,327,https://www.flickr.com/photos/bobtheberto/27233994275/,https://creativecommons.org/licenses/by/2.0/,Rob &quot;Berto&quot; Bennett,https://www.flickr.com/people/bobtheberto/\n4be4164a0ed03fd3,https://c1.staticflickr.com/8/7271/26933797270_a42909fd17_o.jpg,0.0,0.0,0.5,0.75,58,531,https://www.flickr.com/photos/gregthebusker/26933797270,https://creativecommons.org/licenses/by/2.0/,Greg Schechter,https://www.flickr.com/people/gregthebusker/\n8a8d7bb089dd305d,https://c1.staticflickr.com/8/7228/26804684992_b375b4f80c_o.jpg,0.25,0.0,1.0,0.599757673667,964,394,https://www.flickr.com/photos/55229469@N07/26804684992,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\nabed3321f9001b33,https://c1.staticflickr.com/9/8626/28913863926_41079762e3_o.jpg,0.25,0.0,1.0,0.75,806,763,https://www.flickr.com/photos/wwworks/28913863926,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/\n0fc931f15a2d8642,https://c1.staticflickr.com/6/5229/30106298771_fec9ce0c12_o.jpg,0.25,0.0,0.75,0.75,854,835,https://www.flickr.com/photos/billy1125/30106298771,https://creativecommons.org/licenses/by/2.0/,billy1125,https://www.flickr.com/people/billy1125/\ne79ae44ee3c2a62b,https://c1.staticflickr.com/1/408/32677324675_3f790abfe0_o.jpg,0.0,0.0,0.370241116751,0.75,780,663,https://www.flickr.com/photos/thoseguys119/32677324675,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\ndb3f8c29f1206c6d,https://c1.staticflickr.com/1/592/31350109004_d381562c25_o.jpg,0.513100436681,0.0,1.0,0.75,780,757,https://www.flickr.com/photos/thoseguys119/31350109004,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nc9e3bde5498910fb,https://c1.staticflickr.com/9/8030/29239632673_a83715dbb5_o.jpg,0.28125,0.0,0.84375,0.75,467,646,https://www.flickr.com/photos/pleia2/29239632673,https://creativecommons.org/licenses/by/2.0/,Elizabeth K. Joseph,https://www.flickr.com/people/pleia2/\n88e1f5aff515e97b,https://c1.staticflickr.com/1/374/32464237896_259ea58a9c_o.jpg,0.255402384501,0.0,0.766207153502,0.75,780,772,https://www.flickr.com/photos/thoseguys119/32464237896,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n9e4a8daa0cb264f3,https://c1.staticflickr.com/9/8257/29144549922_c5abc64173_o.jpg,0.0,0.0,0.75,1.0,93,679,https://www.flickr.com/photos/lunasinestrellas/29144549922/,https://creativecommons.org/licenses/by/2.0/,Luna sin estrellas,https://www.flickr.com/people/lunasinestrellas/\n217eec00b01bf033,https://c1.staticflickr.com/2/1701/26135990113_1a7f58c8c1_o.jpg,0.485426008969,0.25,1.0,1.0,885,547,http://www.flickr.com/photos/eltb/26135990113/,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n9bd7b2674aec286b,https://c1.staticflickr.com/8/7644/28405692645_6f3c0ebf74_o.jpg,0.333333333333,0.0,1.0,1.0,986,468,https://www.flickr.com/photos/cogdog/28405692645,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n355dbeaa03053d72,https://c1.staticflickr.com/8/7024/26511739334_c0bed67eab_o.jpg,0.0,0.25,0.5,1.0,402,511,https://www.flickr.com/photos/garryknight/26511739334,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\ne6ee56e07376218e,https://c1.staticflickr.com/6/5570/30231900824_f02d01330f_o.jpg,0.0,0.0,0.664212076583,1.0,561,859,https://www.flickr.com/photos/eaglebrook/30231900824/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/\na40a92752aa6ea98,https://c1.staticflickr.com/8/7265/27354265243_0a54f65750_o.jpg,0.0,0.0,0.5,0.75,401,880,https://www.flickr.com/photos/ufv/27354265243,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/\n4e600c516b012ccb,https://c1.staticflickr.com/9/8818/28234711730_7711bb03ea_o.jpg,0.0,0.0,0.5625,0.75,108,997,https://www.flickr.com/photos/jimg944/28234711730,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\nd24af6599b132df7,https://c1.staticflickr.com/8/7526/26872854330_e7530c80c2_o.jpg,0.0,0.25,0.75,1.0,934,168,https://www.flickr.com/photos/36749444@N06/26872854330/in/photolist-GkKohM-qhAiSF-GWEpmE,https://creativecommons.org/licenses/by/2.0/,Kanesue,https://www.flickr.com/people/36749444@N06/\ndd825b19ef666dfa,https://c1.staticflickr.com/6/5667/30635924806_38c33782e2_o.jpg,0.371959942775,0.0,1.0,1.0,699,741,https://www.flickr.com/photos/94941635@N07/30635924806,https://creativecommons.org/licenses/by/2.0/,Zolt\\303\\241n V\\303\\266r\\303\\266s,https://www.flickr.com/people/94941635@N07/\ne38f625efd714dd6,https://c1.staticflickr.com/9/8555/28578693850_1246a34796_o.jpg,0.0,0.25,0.5,1.0,982,1000,https://flickr.com/50264926@N02/28578693850,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/\na294d25fa47f3e0f,https://c1.staticflickr.com/9/8041/29514261752_35f6e439ce_o.jpg,0.425206124853,0.0,0.850412249706,1.0,868,907,https://www.flickr.com/photos/jeepersmedia/29514261752,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\na5cfef9ed6a8dec2,https://c1.staticflickr.com/9/8274/29149589715_d493dea8b1_o.jpg,0.0,0.25,0.75,1.0,985,76,https://www.flickr.com/photos/enneafive/29149589715,https://creativecommons.org/licenses/by/2.0/,Johan Neven,https://www.flickr.com/people/enneafive/\nbcb1fc26577fab9b,https://c1.staticflickr.com/8/7394/27748987361_e72772240f_o.jpg,0.303167420814,0.0,1.0,1.0,11,349,https://www.flickr.com/photos/sbern/27748987361/,https://creativecommons.org/licenses/by/2.0/,Stefan Berndtsson,https://www.flickr.com/people/sbern/\n5e183a0b419135cf,https://c1.staticflickr.com/6/5542/30422800205_6139ae9f4b_o.jpg,0.0,0.25,0.5625,1.0,976,703,https://www.flickr.com/photos/hinnosaar/30422800205/,https://creativecommons.org/licenses/by/2.0/,Marit &amp; Toomas Hinnosaar,https://www.flickr.com/people/hinnosaar/\nad04103e7d948c42,https://c1.staticflickr.com/8/7182/26861447261_4642e530c5_o.jpg,0.438430311231,0.0,1.0,1.0,650,310,https://www.flickr.com/photos/stonehenge-stone-circle/26861447261,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/\ndc0eec83984edb10,https://c1.staticflickr.com/6/5502/30360292444_b514812e98_o.jpg,0.28125,0.25,0.84375,1.0,11,810,https://www.flickr.com/photos/usfwsmidwest/30360292444,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n97e13da721657e0d,https://c1.staticflickr.com/6/5590/30487029583_b8853ee1de_o.jpg,0.25,0.25,1.0,1.0,787,944,https://www.flickr.com/photos/michaelpollak/30487029583/,https://creativecommons.org/licenses/by/2.0/,Michael Pollak,https://www.flickr.com/people/michaelpollak/\nb92ef31584177015,https://c1.staticflickr.com/6/5565/30644083575_1349bba3bd_o.jpg,0.0,0.25,0.75,1.0,981,123,https://www.flickr.com/photos/shakespearesmonkey/30644083575,https://creativecommons.org/licenses/by/2.0/,Shakespearesmonkey,https://www.flickr.com/people/shakespearesmonkey/\n0337e3d16cb41b21,https://c1.staticflickr.com/9/8411/30240966512_664b571e81_o.jpg,0.5,0.0,1.0,0.75,561,151,https://www.flickr.com/photos/jill_carlson/30240966512,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\n3d1263812667f066,https://c1.staticflickr.com/2/1691/26755604905_4ea4a236fc_o.jpg,0.25,0.25,0.75,1.0,95,145,https://www.flickr.com/photos/briangratwicke/26755604905,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/\n2c7ebc0931e10714,https://c1.staticflickr.com/1/404/32546963372_cb15bc4a2a_o.jpg,0.0,0.0,1.0,0.75,23,946,https://www.flickr.com/photos/theslowlane/32546963372/,https://creativecommons.org/licenses/by/2.0/,Robert Ashworth,https://www.flickr.com/people/theslowlane/\n22fadd66bd941d49,https://c1.staticflickr.com/6/5749/30464465033_e23416209f_o.jpg,0.0,0.0,1.0,1.0,909,998,https://www.flickr.com/photos/afropicmusing/30464465033,https://creativecommons.org/licenses/by/2.0/,afromusing,https://www.flickr.com/people/afropicmusing/\n3562b7816d66aa24,https://c1.staticflickr.com/8/7799/27018510983_cf20dc0d08_o.jpg,0.0,0.25,0.5625,1.0,108,778,https://www.flickr.com/photos/jimg944/27018510983/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\nd4ee46712caa11a4,https://c1.staticflickr.com/6/5470/31284834945_2c560fe4c8_o.jpg,0.0,0.0,0.75,0.75,973,628,https://www.flickr.com/photos/mcleod/31284834945,https://creativecommons.org/licenses/by/2.0/,Scott McLeod,https://www.flickr.com/people/mcleod/\n051774d307585d4e,https://c1.staticflickr.com/9/8679/29599778314_59d98842be_o.jpg,0.0,0.25,0.5,1.0,913,888,https://www.flickr.com/photos/dwhartwig/29599778314,https://creativecommons.org/licenses/by/2.0/,Daniel Hartwig,https://www.flickr.com/people/dwhartwig/\nbe48857b72c72e1e,https://c1.staticflickr.com/9/8599/28320371786_51b044002f_o.jpg,0.4375,0.0,1.0,0.75,459,424,https://www.flickr.com/photos/hockeyholic/28320371786,https://creativecommons.org/licenses/by/2.0/,Andy Blackledge,https://www.flickr.com/people/hockeyholic/\n1cd63c5a4e46c2a5,https://c1.staticflickr.com/9/8267/28494820283_8998d64d8e_o.jpg,0.25,0.49294205052,1.0,1.0,922,295,https://flickr.com/23112312@N08/28494820283,https://creativecommons.org/licenses/by/2.0/,Jeremy Crawshaw,https://www.flickr.com/people/23112312@N08/\n8650522e17b05230,https://c1.staticflickr.com/9/8533/29343681456_36741b0b62_o.jpg,0.28125,0.25,0.84375,1.0,980,865,https://www.flickr.com/photos/gromin/29343681456,https://creativecommons.org/licenses/by/2.0/,Nikolay Gromin,https://www.flickr.com/people/gromin/\nb45b8f2953395e46,https://c1.staticflickr.com/6/5832/29862667216_02c9278b84_o.jpg,0.0,0.578822733424,0.75,1.0,669,9,https://www.flickr.com/photos/ankurp/29862667216,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\na53c345afc11bbd1,https://c1.staticflickr.com/1/717/31031428114_04abae523e_o.jpg,0.376029654036,0.0,1.0,0.75,209,392,http://www.flickr.com/photos/ocalways/31031428114/,https://creativecommons.org/licenses/by/2.0/,Rain Love AMR,https://www.flickr.com/people/ocalways/\ne6ca5fecc3d5e79b,https://c1.staticflickr.com/9/8277/30016655546_b86c66b577_o.jpg,0.545358649789,0.0,1.0,0.75,563,638,https://www.flickr.com/photos/22711505@N05/30016655546,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n374d2237f8c530f0,https://c1.staticflickr.com/1/651/31813939606_93934760b9_o.jpg,0.306766917293,0.0,1.0,1.0,975,492,https://flickr.com/47445767@N05/31813939606,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n762c96c7232c41d3,https://c1.staticflickr.com/6/5566/30105991314_54bd58a449_o.jpg,0.25,0.313471502591,1.0,1.0,135,154,https://www.flickr.com/photos/usfwsmidwest/30105991314,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\nd60ea538d53c2df9,https://c1.staticflickr.com/1/264/31567101626_1a4d1206a8_o.jpg,0.485101744186,0.0,0.970203488372,0.75,920,478,https://www.flickr.com/photos/jannerboy62/31567101626,https://creativecommons.org/licenses/by/2.0/,Nick Fewings 4.5 Million views,https://www.flickr.com/people/jannerboy62/\n461514ec6fbc129d,https://c1.staticflickr.com/8/7427/27009074653_582f4f2ff1_o.jpg,0.255022321429,0.0,0.765066964286,0.75,484,712,https://www.flickr.com/photos/wm_archiv/27009074653,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/\n1b7c237e43a63caf,https://c1.staticflickr.com/9/8898/28506547841_be23964e90_o.jpg,0.0,0.0,0.535877862595,0.75,404,672,https://www.flickr.com/photos/usnavy/28506547841,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\na3ee7919f271d98d,https://c1.staticflickr.com/8/7461/26998814703_5d356ccc4d_o.jpg,0.0,0.0,0.465149359886,0.75,405,673,https://www.flickr.com/photos/8269539@N04/26998814703,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n2fc91631196a3adc,https://c1.staticflickr.com/1/716/32421990446_584b9d361a_o.jpg,0.0,0.0,0.69578313253,1.0,93,74,https://www.flickr.com/photos/dkeats/32421990446,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\na518ced9fc09eeb3,https://c1.staticflickr.com/6/5149/29351584224_93c7d9e2f9_o.jpg,0.484655688623,0.0,1.0,0.75,975,99,https://www.flickr.com/photos/jsjgeology/29351584224,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n746fb399ad9fc267,https://c1.staticflickr.com/6/5336/30231283265_14b6ee31e6_o.jpg,0.4375,0.25,1.0,1.0,114,723,https://www.flickr.com/photos/fdecomite/30231283265,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\n384b14c41908dc29,https://c1.staticflickr.com/1/585/32730398506_ddf703526f_o.jpg,0.300604229607,0.0,1.0,1.0,11,311,https://www.flickr.com/photos/93892629@N07/32730398506,https://creativecommons.org/licenses/by/2.0/,\\303\\205sa Berndtsson,https://www.flickr.com/people/93892629@N07/\nbbb0357f89274659,https://c1.staticflickr.com/9/8732/29368841321_541c7470cc_o.jpg,0.0,0.0,0.5,0.75,780,948,https://www.flickr.com/photos/vagueonthehow/29368841321/,https://creativecommons.org/licenses/by/2.0/,vagueonthehow,https://www.flickr.com/people/vagueonthehow/\nff5ddcfaa1c76900,https://c1.staticflickr.com/6/5805/22793192778_25b26d630e_o.jpg,0.578822733424,0.25,1.0,1.0,131,464,https://www.flickr.com/photos/131880272@N06/22793192778,https://creativecommons.org/licenses/by/2.0/,K M,https://www.flickr.com/people/131880272@N06/\ne5386614902f7e64,https://c1.staticflickr.com/6/5673/30078066750_f5872b14a5_o.jpg,0.210588633288,0.25,0.631765899865,1.0,59,988,https://www.flickr.com/photos/treegrow/30078066750,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n1bc32170033310e1,https://c1.staticflickr.com/6/5588/30177392281_7caf5594ce_o.jpg,0.0,0.25,0.75,1.0,963,594,https://www.flickr.com/photos/tatuaggi/30177392281,https://creativecommons.org/licenses/by/2.0/,Ettore  Bechis,https://www.flickr.com/people/tatuaggi/\n014ee52a7dd86d97,https://c1.staticflickr.com/1/311/32288188235_d355c08431_o.jpg,0.210588633288,0.0,0.631765899865,0.75,707,845,https://www.flickr.com/photos/decorativeconcrete/32288188235,https://creativecommons.org/licenses/by/2.0/,Decorative Concrete Kingdom,https://www.flickr.com/people/decorativeconcrete/\n1d22328a7d3c614b,https://c1.staticflickr.com/8/7300/27529993902_fed7cee370_o.jpg,0.508771929825,0.0,1.0,0.75,548,832,https://www.flickr.com/photos/robdammers/27529993902,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n9d9cafee70a5c36c,https://c1.staticflickr.com/6/5599/30868079715_0b9b3d9007_o.jpg,0.0,0.25,0.5,1.0,747,590,https://www.flickr.com/photos/usarak/30868079715,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/\n1868ebc9a642cdd4,https://c1.staticflickr.com/1/694/31702181972_0f94583d77_o.jpg,0.498153618907,0.0,1.0,0.75,946,59,https://www.flickr.com/photos/115537423@N04/31702181972,https://creativecommons.org/licenses/by/2.0/,Wilson leonel,https://www.flickr.com/people/115537423@N04/\nfa603ad6c8c15ffa,https://c1.staticflickr.com/8/7086/27431790074_25f39a6e35_o.jpg,0.0,0.0,0.645863570392,1.0,98,753,https://www.flickr.com/photos/56433265@N04/27431790074/,https://creativecommons.org/licenses/by/2.0/,webbgun,https://www.flickr.com/people/56433265@N04/\n0f5dd2e31d909b87,https://c1.staticflickr.com/9/8578/28647406616_ab542dd24e_o.jpg,0.0,0.0,1.0,1.0,852,251,https://flickr.com/51035644690@N01/28647406616,https://creativecommons.org/licenses/by/2.0/,evan p. cordes,https://www.flickr.com/people/pheezy/\nfc8dc0b93c18de1e,https://c1.staticflickr.com/9/8155/29534218241_63aa8aa37b_o.jpg,0.25,0.0,1.0,0.5,854,888,https://www.flickr.com/photos/quinet/29534218241,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\ne2c0772c89ba1596,https://c1.staticflickr.com/8/7411/27672740946_6cc8b73e14_o.jpg,0.5,0.0,1.0,0.75,896,793,https://www.flickr.com/photos/faceme/27672740946,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/\nf72f0436f6e41e44,https://c1.staticflickr.com/8/7454/26809610052_20270a5f53_o.jpg,0.25,0.0,1.0,1.0,934,874,https://www.flickr.com/photos/jeepersmedia/26809610052,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n0b843636fc363ee1,https://c1.staticflickr.com/9/8103/28926703856_b99063c160_o.jpg,0.253152818991,0.25,0.759458456973,1.0,876,861,https://www.flickr.com/photos/fhgitarre/28926703856/,https://creativecommons.org/licenses/by/2.0/,FHgitarre,https://www.flickr.com/people/fhgitarre/\n6b138f3aa500019c,https://c1.staticflickr.com/1/729/32189230183_d29dc75307_o.jpg,0.0,0.0,0.594707520891,1.0,566,786,https://www.flickr.com/photos/kansasscanner/32189230183/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\n3c983ed5706e47f4,https://c1.staticflickr.com/9/8568/28050869630_4608cd36b1_o.jpg,0.28125,0.25,0.84375,1.0,975,279,https://www.flickr.com/photos/jsjgeology/28050869630,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n7f22cad03f98680c,https://c1.staticflickr.com/2/1469/26481375110_e8584eb767_o.jpg,0.25,0.0,0.75,0.75,548,199,https://www.flickr.com/photos/rhemkes/26481375110,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\n8eb4269f7df9dd34,https://c1.staticflickr.com/9/8601/27738413184_c4988c50fd_o.jpg,0.0,0.0,0.696832579186,1.0,946,675,https://www.flickr.com/photos/elzey/27738413184,https://creativecommons.org/licenses/by/2.0/,Richard Elzey,https://www.flickr.com/people/elzey/\nea4d7b75b62442c3,https://c1.staticflickr.com/8/7523/29268242562_5a6de66600_o.jpg,0.499263622975,0.25,0.99852724595,1.0,459,539,https://www.flickr.com/photos/vahemart/29268242562/,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\nb487aeab486ea554,https://c1.staticflickr.com/9/8129/29153364483_7dd9d095e7_o.jpg,0.25,0.25,0.75,1.0,437,145,https://www.flickr.com/photos/greggjerdingen/29153364483,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n8f9b32c998191657,https://c1.staticflickr.com/8/7479/28144633622_7d08d2fa25_o.jpg,0.5,0.0,1.0,0.75,405,517,https://www.flickr.com/photos/7332125@N04/28144633622/,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n9f13bca209872673,https://c1.staticflickr.com/8/7460/28144985255_46bb6c33ff_o.jpg,0.0,0.5,0.75,1.0,443,454,https://www.flickr.com/photos/dordrecht-holland/28144985255,https://creativecommons.org/licenses/by/2.0/,Paul van de Velde,https://www.flickr.com/people/dordrecht-holland/\n320d9663a6005ff6,https://c1.staticflickr.com/9/8021/29297048024_9e7608376c_o.jpg,0.0,0.25,0.5,1.0,704,801,https://www.flickr.com/photos/126337928@N05/29297048024,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\naf218bccd2f180e2,https://c1.staticflickr.com/1/255/31776378102_64ca543a62_o.jpg,0.0,0.248348017621,0.75,0.745044052863,484,705,https://www.flickr.com/photos/34517490@N00/31776378102/,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/\n116032ec85db1800,https://c1.staticflickr.com/1/602/30880438894_440656f7a3_o.jpg,0.0,0.0,0.5,0.75,471,709,https://www.flickr.com/photos/kunstee/30880438894,https://creativecommons.org/licenses/by/2.0/,Kunstee,https://www.flickr.com/people/kunstee/\n37e8241784d70dc5,https://c1.staticflickr.com/9/8730/28188306564_1ecef17662_o.jpg,0.249079528719,0.0,0.747238586156,0.75,746,774,https://www.flickr.com/photos/lespetitescases/28188306564,https://creativecommons.org/licenses/by/2.0/,Gautier Poupeau,https://www.flickr.com/people/lespetitescases/\naa1fadae19ef0fab,https://c1.staticflickr.com/9/8232/28833810563_39db7f87cb_o.jpg,0.0,0.0,0.75,1.0,499,89,https://www.flickr.com/photos/southbeachcars/28833810563/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n59a63a0db488ff84,https://c1.staticflickr.com/6/5657/29898836313_d4a5a4e22f_o.jpg,0.336764705882,0.0,1.0,1.0,976,256,https://www.flickr.com/photos/jetef2/29898836313/,https://creativecommons.org/licenses/by/2.0/,E. D&#x27;Ascoli Photographies,https://www.flickr.com/people/jetef2/\n520b90ccad6c7548,https://c1.staticflickr.com/6/5585/30967336290_bcdc643cb8_o.jpg,0.0,0.0,0.75,0.5625,848,162,https://flickr.com/73162879@N06/30967336290,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/\n960ce53aec5fb183,https://c1.staticflickr.com/8/7564/27029139362_ca14fc8a16_o.jpg,0.25,0.0,1.0,1.0,735,596,https://www.flickr.com/photos/27665395@N05/27029139362,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n42a2d92e3bc25651,https://c1.staticflickr.com/6/5603/30864408346_8718889064_o.jpg,0.0,0.0,0.597580645161,0.75,9,27,https://www.flickr.com/photos/carbonnyc/30864408346/,https://creativecommons.org/licenses/by/2.0/,David Goehring,https://www.flickr.com/people/carbonnyc/\n8fdbd989dc328d5a,https://c1.staticflickr.com/1/406/20022073588_33eb5c3074_o.jpg,0.25,0.25,1.0,1.0,986,229,https://www.flickr.com/photos/zedzap/20022073588,https://creativecommons.org/licenses/by/2.0/,Nick Kenrick,https://www.flickr.com/people/zedzap/\n243cf820d9e41c55,https://c1.staticflickr.com/6/5742/30158119163_7fc22e95bc_o.jpg,0.0,0.0,0.496696035242,0.75,484,605,https://www.flickr.com/photos/sybarite48/30158119163,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n526c329e60bc418f,https://c1.staticflickr.com/9/8275/29456805432_ee6b00ba79_o.jpg,0.0,0.0,1.0,0.710806697108,923,531,https://www.flickr.com/photos/oldguardmuseum/29456805432/,https://creativecommons.org/licenses/by/2.0/,Old Guard History,https://www.flickr.com/people/oldguardmuseum/\n4105136a49187bef,https://c1.staticflickr.com/1/381/31759733072_cab4ffef66_o.jpg,0.0,0.278188180404,0.75,0.834564541213,611,948,https://www.flickr.com/photos/spreadshirt/31759733072,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/\nf1c92bd6523f45f6,https://c1.staticflickr.com/8/7569/27692283386_e2ccf8ce8f_o.jpg,0.0,0.452546296296,0.75,1.0,890,451,https://www.flickr.com/photos/143441264@N02/27692283386/,https://creativecommons.org/licenses/by/2.0/,Archive of  the Sibelius Museum,https://www.flickr.com/people/143441264@N02/\nf5ccf5074f7d6e54,https://c1.staticflickr.com/8/7283/27215297016_d0bf505d68_o.jpg,0.322864321608,0.25,0.968592964824,1.0,413,982,https://www.flickr.com/photos/morebyless/27215297016,https://creativecommons.org/licenses/by/2.0/,morebyless,https://www.flickr.com/people/morebyless/\n88551a82a47b7d36,https://c1.staticflickr.com/8/7482/27879621073_e3653e6d20_o.jpg,0.573910081744,0.25,1.0,1.0,405,599,https://www.flickr.com/photos/8269539@N04/27879621073,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n7ac1dde4600dd8bd,https://c1.staticflickr.com/6/5128/30088670415_e31221dc6e_o.jpg,0.25,0.25,1.0,1.0,680,58,https://www.flickr.com/photos/feeliz/30088670415/,https://creativecommons.org/licenses/by/2.0/,Jana Lehmann,https://www.flickr.com/people/feeliz/\n77f0896794e789ce,https://c1.staticflickr.com/1/675/32796183436_2a53cbffaa_o.jpg,0.28125,0.25,0.84375,1.0,704,319,https://www.flickr.com/photos/rjbailey/32796183436/,https://creativecommons.org/licenses/by/2.0/,Ron Bailey,https://www.flickr.com/people/rjbailey/\n1f473a12955e704d,https://c1.staticflickr.com/1/558/31995530663_2eb85f915f_o.jpg,0.25,0.29465849387,1.0,1.0,688,878,https://www.flickr.com/photos/krossbow/31995530663,https://creativecommons.org/licenses/by/2.0/,F Delventhal,https://www.flickr.com/people/krossbow/\n096b03daf4e82382,https://c1.staticflickr.com/1/548/31575343796_f12ac75663_o.jpg,0.0,0.25,0.75,0.75,499,312,https://www.flickr.com/photos/45958601@N02/31575343796,https://creativecommons.org/licenses/by/2.0/,joey  zanotti,https://www.flickr.com/people/45958601@N02/\n6367ac8abbfbee7f,https://c1.staticflickr.com/9/8025/29088179735_5417532c14_o.jpg,0.25,0.0,0.75,0.75,975,460,https://www.flickr.com/photos/carbonnyc/29088179735/,https://creativecommons.org/licenses/by/2.0/,David Goehring,https://www.flickr.com/people/carbonnyc/\na76bc8cab3c11e85,https://c1.staticflickr.com/8/7678/26851311721_835c391891_o.jpg,0.4375,0.25,1.0,1.0,699,909,https://flickr.com/7295874@N03/26851311721,https://creativecommons.org/licenses/by/2.0/,RachelH_,https://www.flickr.com/people/bagelmouse/\n7a8c8c7fa376b0a9,https://c1.staticflickr.com/9/8844/27681246153_97760ebbca_o.jpg,0.5,0.0,1.0,0.75,146,644,https://www.flickr.com/photos/laikolosse/27681246153/,https://creativecommons.org/licenses/by/2.0/,laikolosse,https://www.flickr.com/people/laikolosse/\n25ab60d9f3673538,https://c1.staticflickr.com/1/564/32537365476_2147837bc1_o.jpg,0.25,0.25,1.0,0.75,709,651,https://www.flickr.com/photos/dalbera/32537365476/,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n5d7a2a638b6bb82d,https://c1.staticflickr.com/1/406/32501864826_3c97be7d4d_o.jpg,0.0,0.25,0.5625,1.0,480,457,https://www.flickr.com/photos/truckhardware/32501864826,https://creativecommons.org/licenses/by/2.0/,Truck Hardware,https://www.flickr.com/people/truckhardware/\n1a8ce1a41fa41835,https://c1.staticflickr.com/6/5534/30193283054_6884d4a39d_o.jpg,0.0,0.217252396166,1.0,1.0,986,711,https://www.flickr.com/photos/hugostorero/30193283054,https://creativecommons.org/licenses/by/2.0/,Cesar Hugo STORERO,https://www.flickr.com/people/hugostorero/\n3763c4fde457c54e,https://c1.staticflickr.com/9/8668/30529456405_7ea2cd5bd6_o.jpg,0.210588633288,0.0,0.631765899865,0.75,752,485,https://www.flickr.com/photos/pedrik/30529456405,https://creativecommons.org/licenses/by/2.0/,pedrik,https://www.flickr.com/people/pedrik/\n57cd88b0f78f0da7,https://c1.staticflickr.com/6/5724/30470416702_971fe1301d_o.jpg,0.0,0.0,1.0,0.799676898223,702,386,https://www.flickr.com/photos/peterhess/30470416702,https://creativecommons.org/licenses/by/2.0/,Peter Alfred Hess,https://www.flickr.com/people/peterhess/\ne37fa47b70126729,https://c1.staticflickr.com/9/8417/30102225021_56e0772232_o.jpg,0.25,0.0,0.75,0.75,889,788,https://www.flickr.com/photos/barnimages/30102225021,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\n0d90cded2ee351c6,https://c1.staticflickr.com/9/8338/28986449914_81a0e47869_o.jpg,0.0,0.0,0.75,1.0,971,511,https://www.flickr.com/photos/28416709@N06/28986449914,https://creativecommons.org/licenses/by/2.0/,Stevan Nicholas,https://www.flickr.com/people/28416709@N06/\n767c7c8bd98366bf,https://c1.staticflickr.com/9/8094/28886227310_10e3958031_o.jpg,0.0,0.0,1.0,0.75,410,44,https://www.flickr.com/photos/arjanrichter/28886227310,https://creativecommons.org/licenses/by/2.0/,Arjan Richter,https://www.flickr.com/people/arjanrichter/\n10f7d3be7715ddda,https://c1.staticflickr.com/8/7618/26699437172_741b2c8520_o.jpg,0.25,0.0,0.75,0.75,469,587,https://www.flickr.com/photos/transitomedellin/26699437172,https://creativecommons.org/licenses/by/2.0/,Secretar\\303\\255a de Movilidad de Medell\\303\\255n,https://www.flickr.com/people/transitomedellin/\n31c99affa0ec993e,https://c1.staticflickr.com/6/5737/30517578140_0e8b5961e2_o.jpg,0.0,0.25,0.42174796748,1.0,976,238,https://www.flickr.com/photos/wilfred_hdez/30517578140/,https://creativecommons.org/licenses/by/2.0/,Wilfred Hdez,https://www.flickr.com/people/wilfred_hdez/\nfb9d0b6b7c769055,https://c1.staticflickr.com/9/8348/29213677625_a373258140_o.jpg,0.0,0.0,1.0,1.0,874,417,https://flickr.com/51966661@N00/29213677625,https://creativecommons.org/licenses/by/2.0/,valerialaura,https://www.flickr.com/people/valerialaura/\n8f87ac50c8e01474,https://c1.staticflickr.com/6/5741/30407672434_f1cf0253f1_o.jpg,0.25,0.0,1.0,0.5,777,775,https://www.flickr.com/photos/devdsp/30407672434,https://creativecommons.org/licenses/by/2.0/,Adam Thomas,https://www.flickr.com/people/devdsp/\nb521cfe682e3c26a,https://c1.staticflickr.com/8/7395/27787563850_489d5ec964_o.jpg,0.421177266576,0.0,0.842354533153,0.75,706,479,https://www.flickr.com/photos/12216515@N00/27787563850,https://creativecommons.org/licenses/by/2.0/,Charles Fulton,https://www.flickr.com/people/12216515@N00/\n800bbac9e2e5974d,https://c1.staticflickr.com/1/293/30961094834_95715bc054_o.jpg,0.25,0.25,0.75,1.0,470,582,https://www.flickr.com/photos/shankaronline/30961094834/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n32d6ea19973089f4,https://c1.staticflickr.com/8/7345/26831347744_a4d253db99_o.jpg,0.5,0.0,1.0,0.75,401,507,https://www.flickr.com/photos/joi/26831347744,https://creativecommons.org/licenses/by/2.0/,Joi Ito,https://www.flickr.com/people/joi/\n932324a2f222b471,https://c1.staticflickr.com/8/7252/26281652183_50755b76a6_o.jpg,0.25,0.0,0.75,0.75,405,394,https://www.flickr.com/photos/km30192002/26281652183,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/\na4e1aa5e532bc7e8,https://c1.staticflickr.com/9/8241/29657959122_a498d5474d_o.jpg,0.202420424403,0.25,0.60726127321,1.0,405,492,https://www.flickr.com/photos/hisgett/29657959122,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n5be253aedd66d5b6,https://c1.staticflickr.com/9/8142/28763062985_8c370bb541_o.jpg,0.0,0.25,0.75,0.75,764,460,https://www.flickr.com/photos/rusty_clark/28763062985,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\nd892b14aefe43916,https://c1.staticflickr.com/1/596/31714138494_4fac9eeb28_o.jpg,0.267530487805,0.25,0.802591463415,1.0,924,860,https://www.flickr.com/photos/ruthanddave/31714138494/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n87df0342c5a405d2,https://c1.staticflickr.com/9/8520/29507482162_2ab5b651e3_o.jpg,0.0,0.25,0.75,1.0,929,630,https://www.flickr.com/photos/joyosity/29507482162,https://creativecommons.org/licenses/by/2.0/,Joy,https://www.flickr.com/people/joyosity/\neec346a1a967a408,https://c1.staticflickr.com/1/446/30909014673_d4828c6944_o.jpg,0.421177266576,0.0,0.842354533153,0.75,324,82,https://flickr.com/149503105@N07/30909014673,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/\n93c222c6a2c24b65,https://c1.staticflickr.com/9/8108/28585771872_d18a7cd414_o.jpg,0.333333333333,0.0,1.0,1.0,986,923,https://www.flickr.com/photos/postmanpetecoluk/28585771872,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\ne1168b88200e4032,https://c1.staticflickr.com/8/7621/28221527962_cbb8e4c946_o.jpg,0.331130690162,0.0,0.993392070485,1.0,986,727,https://www.flickr.com/photos/sybarite48/28221527962,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nc3f0e246fc398615,https://c1.staticflickr.com/6/5557/30434868972_10f1abf010_o.jpg,0.5,0.0,1.0,0.75,821,774,https://flickr.com/48318374@N08/30434868972,https://creativecommons.org/licenses/by/2.0/,nzsteam,https://www.flickr.com/people/nzsteam/\na32d21752b6760a6,https://c1.staticflickr.com/9/8475/29647962622_02b47e8317_o.jpg,0.219917012448,0.25,0.659751037344,1.0,520,776,https://www.flickr.com/photos/navcent/29647962622,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/\n6dfb92193c305bf8,https://c1.staticflickr.com/1/617/31946745173_db8884b047_o.jpg,0.4375,0.25,1.0,1.0,569,988,https://www.flickr.com/photos/garryknight/31946745173/,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\n42218a71facb4e2e,https://c1.staticflickr.com/9/8162/29300587920_b9bb32986c_o.jpg,0.280784844384,0.0,0.842354533153,1.0,972,745,https://www.flickr.com/photos/fibonacciblue/29300587920,https://creativecommons.org/licenses/by/2.0/,Fibonacci Blue,https://www.flickr.com/people/fibonacciblue/\n4cb88aa5bfe86ef0,https://c1.staticflickr.com/9/8067/28365952413_775de417d4_o.jpg,0.437669376694,0.0,1.0,1.0,511,854,https://www.flickr.com/photos/28169156@N03/28365952413,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/\nd168fa26f75fb35a,https://c1.staticflickr.com/8/7419/27752222831_d70c650f13_o.jpg,0.0,0.0,0.515344311377,0.75,830,399,https://www.flickr.com/photos/marinelson/27752222831,https://creativecommons.org/licenses/by/2.0/,Marinelson Almeida - Traveling through Brazil,https://www.flickr.com/people/marinelson/\n53043cdddefa8193,https://c1.staticflickr.com/8/7703/26874347942_bd6276b976_o.jpg,0.0,0.0,0.465149359886,0.75,781,225,https://www.flickr.com/photos/glynlowe/26874347942,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/\n8aba9f1a3dac78f3,https://c1.staticflickr.com/9/8418/29398409330_2f5b3e66ae_o.jpg,0.5,0.0,1.0,0.75,108,424,https://www.flickr.com/photos/raita/29398409330,https://creativecommons.org/licenses/by/2.0/,Raita Futo,https://www.flickr.com/people/raita/\n5ae72bdc2348ec2f,https://c1.staticflickr.com/6/5833/29489317533_d4923336a0_o.jpg,0.333333333333,0.0,1.0,1.0,860,680,https://www.flickr.com/photos/yourbestdigs/29489317533/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\ndf65608e84f96fed,https://c1.staticflickr.com/8/7359/27268221802_f0fb74792e_o.jpg,0.25,0.0,0.75,0.75,820,781,https://www.flickr.com/photos/jus10h/27268221802,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n7270a0d2e24cb23e,https://c1.staticflickr.com/8/7286/27524507964_39f665a58a_o.jpg,0.0,0.0,0.75,1.0,997,332,https://www.flickr.com/photos/treegrow/27524507964,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n98cb2bb141a416cf,https://c1.staticflickr.com/9/8576/28193722465_7f78cda71b_o.jpg,0.25,0.0,1.0,1.0,971,517,https://www.flickr.com/photos/m_p_king/28193722465,https://creativecommons.org/licenses/by/2.0/,M. King,https://www.flickr.com/people/m_p_king/\n16e43e4c2c0f5502,https://c1.staticflickr.com/6/5675/30962143600_40ccc30555_o.jpg,0.25,0.0,0.75,0.75,147,675,http://www.flickr.com/photos/blachswan/30962143600/,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\nb1f03fd058c84618,https://c1.staticflickr.com/8/7024/26844113400_1235e6633b_o.jpg,0.486191860465,0.0,0.97238372093,0.75,437,458,https://www.flickr.com/photos/armingruber/26844113400,https://creativecommons.org/licenses/by/2.0/,Armin Gruber,https://www.flickr.com/people/armingruber/\n2a41f0ad4c85b559,https://c1.staticflickr.com/1/632/32696308045_1278aef54d_o.jpg,0.0,0.0,0.47170487106,0.75,822,909,https://www.flickr.com/photos/13476480@N07/32696308045,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n1263596b7e17d4ff,https://c1.staticflickr.com/8/7247/27842110632_8495196eb1_o.jpg,0.325801749271,0.0,0.977405247813,1.0,706,828,https://www.flickr.com/photos/robdammers/27842110632,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n3b50fc2b89c09b45,https://c1.staticflickr.com/6/5535/30232795964_0e5bc000d4_o.jpg,0.28125,0.25,0.84375,1.0,875,929,https://www.flickr.com/photos/69203347@N03/30232795964,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n8f6cb980405c2e92,https://c1.staticflickr.com/9/8686/28452846745_6344dd1cb8_o.jpg,0.0,0.0,1.0,1.0,310,814,https://www.flickr.com/photos/12463666@N03/28452846745/,https://creativecommons.org/licenses/by/2.0/,Bob  M ~,https://www.flickr.com/people/12463666@N03/\n81dfe18c7dd3deaf,https://c1.staticflickr.com/1/382/31845395606_6bff66ff46_o.jpg,0.0,0.0,1.0,1.0,563,158,https://flickr.com/98826299@N00/31845395606,https://creativecommons.org/licenses/by/2.0/,Deb Nystrom,https://www.flickr.com/people/stella12/\n6f589f53e4a555b4,https://c1.staticflickr.com/8/7241/26618242513_a6059fb3a9_o.jpg,0.28125,0.0,0.84375,0.75,780,161,https://www.flickr.com/photos/thoseguys119/26618242513,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nfcc45c8ecf9c3e09,https://c1.staticflickr.com/8/7426/27325185776_b03b5a0440_o.jpg,0.25,0.0,1.0,0.75,422,587,https://www.flickr.com/photos/rodrigoparedes/27325185776,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/\nbd9a4aad686037a8,https://c1.staticflickr.com/9/8133/29211145524_c59ecc89dd_o.jpg,0.0,0.25,0.75,0.75,980,803,https://www.flickr.com/photos/amslerpix/29211145524/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\nd8100f1cba65d977,https://c1.staticflickr.com/8/7423/27534868650_43fb11d01d_o.jpg,0.0,0.0,0.5,0.75,593,134,https://www.flickr.com/photos/esoastronomy/27534868650,https://creativecommons.org/licenses/by/2.0/,European Southern Observatory,https://www.flickr.com/people/esoastronomy/\n0f80305a421a181b,https://c1.staticflickr.com/9/8601/30297580082_d59be04f91_o.jpg,0.25,0.25,0.75,1.0,976,911,https://www.flickr.com/photos/o_0/30297580082,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n0c2a8a70b9b8bc3c,https://c1.staticflickr.com/8/7049/26848092634_a5406f8977_o.jpg,0.304268292683,0.0,0.912804878049,0.75,319,431,https://www.flickr.com/photos/gails_pictures/26848092634/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\ncf998720406428f2,https://c1.staticflickr.com/6/5804/30440480655_6ba05917fd_o.jpg,0.0,0.0,0.423913043478,0.75,780,879,https://www.flickr.com/photos/thoseguys119/30440480655,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n582914a8320bd4a9,https://c1.staticflickr.com/6/5494/30335407000_4e63b1f8bc_o.jpg,0.333333333333,0.0,1.0,1.0,519,843,https://www.flickr.com/photos/box_repsol/30335407000,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n13773eecaef83f87,https://c1.staticflickr.com/1/347/32751802035_442079b727_o.jpg,0.264605462822,0.25,0.793816388467,1.0,101,851,https://www.flickr.com/photos/wildreturn/32751802035,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\n6bc772d2517bb3ce,https://c1.staticflickr.com/1/487/31406703274_1e0b99afba_o.jpg,0.0,0.0,0.663235294118,1.0,520,862,https://www.flickr.com/photos/toomore/31406703274,https://creativecommons.org/licenses/by/2.0/,Toomore Chiang,https://www.flickr.com/people/toomore/\n7b82ff21ef498c7c,https://c1.staticflickr.com/8/7128/27293625855_0bde1d86f0_o.jpg,0.0,0.0,0.433722527473,0.75,114,824,https://www.flickr.com/photos/gaby1/27293625855,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\nb6568cb98082d52a,https://c1.staticflickr.com/9/8190/29287863204_649537e900_o.jpg,0.333333333333,0.0,1.0,1.0,480,652,https://flickr.com/38712296@N07/29287863204,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n33b29f2223cae641,https://c1.staticflickr.com/6/5574/31465401962_48fd9a8686_o.jpg,0.0,0.313471502591,0.75,1.0,558,618,https://www.flickr.com/photos/22711505@N05/31465401962,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\nac86c20e5581fc24,https://c1.staticflickr.com/1/368/31868515121_f26897d528_o.jpg,0.0,0.25,0.5625,1.0,796,72,https://www.flickr.com/photos/stevendepolo/31868515121,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nb3ce5663b62f4eed,https://c1.staticflickr.com/8/7479/26962246971_3f7ce78c62_o.jpg,0.25,0.0,1.0,0.75,982,779,https://www.flickr.com/photos/brendan-c/26962246971,https://creativecommons.org/licenses/by/2.0/,Brendan C,https://www.flickr.com/people/brendan-c/\n9121f84b22dd6eb5,https://c1.staticflickr.com/9/8356/28568404183_1e69cdc052_o.jpg,0.25,0.0,1.0,1.0,875,731,https://www.flickr.com/photos/didbygraham/28568404183,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n02d9e9b244c336c3,https://c1.staticflickr.com/9/8094/29850039242_0d4537d4b3_o.jpg,0.497426470588,0.25,0.994852941176,1.0,426,461,https://www.flickr.com/photos/60712129@N06/29850039242,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/\n1ad7add95f5b5fa3,https://c1.staticflickr.com/6/5718/30865042696_e5bb7dacd5_o.jpg,0.25,0.0,0.75,0.75,885,652,https://www.flickr.com/photos/jlascar/30865042696,https://creativecommons.org/licenses/by/2.0/,Jorge L\\303\\241scar,https://www.flickr.com/people/jlascar/\n622aaed69e07495a,https://c1.staticflickr.com/8/7552/26769229011_eedb953d03_o.jpg,0.25352897474,0.25,0.76058692422,1.0,985,451,https://www.flickr.com/photos/romanboed/26769229011,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/\n482879640e88f893,https://c1.staticflickr.com/8/7639/27983273125_26ecd630e1_o.jpg,0.255402384501,0.0,0.766207153502,0.75,662,467,https://www.flickr.com/photos/usacehq/27983273125,https://creativecommons.org/licenses/by/2.0/,U.S. Army Corps of Engineers,https://www.flickr.com/people/usacehq/\n0f2e8e58a991472b,https://c1.staticflickr.com/8/7655/27935989691_ac313d4515_o.jpg,0.0,0.0,0.701966717095,1.0,120,697,https://www.flickr.com/photos/taylar/27935989691,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/\ne55cc7469a84476a,https://c1.staticflickr.com/8/7272/27358210700_5179520305_o.jpg,0.4375,0.0,1.0,0.75,89,227,https://www.flickr.com/photos/pamelav/27358210700,https://creativecommons.org/licenses/by/2.0/,Pamela V White,https://www.flickr.com/people/pamelav/\nce99a0896f6c9277,https://c1.staticflickr.com/9/8450/29336528460_9b0afb9aa5_o.jpg,0.28125,0.0,0.84375,0.75,964,316,https://www.flickr.com/photos/linsinchen/29336528460,https://creativecommons.org/licenses/by/2.0/,Sinchen.Lin,https://www.flickr.com/people/linsinchen/\n2f606d106a854e58,https://c1.staticflickr.com/9/8325/28840808243_77e11f0538_o.jpg,0.0,0.25,0.5,1.0,563,569,https://www.flickr.com/photos/harshlight/28840808243,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\n37ba2e92645e5fdf,https://c1.staticflickr.com/8/7757/26592631594_13445d47ef_o.jpg,0.0,0.25,0.544615384615,1.0,821,354,https://www.flickr.com/photos/robdammers/26592631594,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n7f7856afe236ce4f,https://c1.staticflickr.com/6/5318/30061455171_04cdd57616_o.jpg,0.0,0.0,0.666666666667,1.0,426,798,https://www.flickr.com/photos/jcookfisher/30061455171/,https://creativecommons.org/licenses/by/2.0/,jcookfisher,https://www.flickr.com/people/jcookfisher/\ne855ba5abd770ab3,https://c1.staticflickr.com/4/3707/32425177480_44d7e0e1a1_o.jpg,0.24213836478,0.0,1.0,1.0,349,375,https://www.flickr.com/photos/erix/32425177480,https://creativecommons.org/licenses/by/2.0/,Erich Ferdinand,https://www.flickr.com/people/erix/\n55a7dbb8e91f2536,https://c1.staticflickr.com/8/7617/27258155576_535ea4969d_o.jpg,0.5,0.0,1.0,0.75,480,778,https://www.flickr.com/photos/mjtmail/27258155576,https://creativecommons.org/licenses/by/2.0/,mjtmail (tiggy),https://www.flickr.com/people/mjtmail/\nd6864c58495327f7,https://c1.staticflickr.com/9/8564/27936064894_7909854bf0_o.jpg,0.5,0.0,1.0,0.75,971,9,https://www.flickr.com/photos/davebloggs007/27936064894,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\n3de80a620a7af2ec,https://c1.staticflickr.com/1/388/31107382244_a0df541bfc_o.jpg,0.28125,0.0,0.84375,0.75,97,428,https://www.flickr.com/photos/ewolivera/31107382244,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/\n9ffdf9ac514cfba3,https://c1.staticflickr.com/6/5453/30780416321_e59d0b54a7_o.jpg,0.25,0.4375,1.0,1.0,122,136,https://www.flickr.com/photos/30478819@N08/30780416321,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\nb4ab8f1890027769,https://c1.staticflickr.com/6/5446/30867889631_d0bef56d32_o.jpg,0.0,0.0,0.56298600311,1.0,875,806,https://flickr.com/135275665@N03/30867889631,https://creativecommons.org/licenses/by/2.0/,Eddy Verschueren,https://www.flickr.com/people/traveltopper/\nacc42d38cddee1cf,https://c1.staticflickr.com/1/631/32757850631_6a2b164034_o.jpg,0.4375,0.0,1.0,0.75,865,47,https://www.flickr.com/photos/27665395@N05/32757850631/,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n954b2d556ac3fe1a,https://c1.staticflickr.com/8/7500/26774462223_1a9022705b_o.jpg,0.503303964758,0.0,1.0,0.75,310,339,https://www.flickr.com/photos/theocrazzolara/26774462223/,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/\nc3742d2b9aee03fd,https://c1.staticflickr.com/1/541/32440448362_8fbf0e683f_o.jpg,0.331617647059,0.0,0.994852941176,1.0,971,574,https://flickr.com/133488379@N08/32440448362,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\nfb55e4fe303ce588,https://c1.staticflickr.com/6/5695/31074183890_76bce0c94a_o.jpg,0.330631399317,0.0,1.0,0.75,672,309,https://www.flickr.com/photos/glorycycles/31074183890,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n309a61f58932f9d3,https://c1.staticflickr.com/8/7210/27224447633_1384ea41fe_o.jpg,0.250923190547,0.0,0.75276957164,0.75,324,68,https://www.flickr.com/photos/usfwsmidwest/27224447633,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n73add730ee6a64da,https://c1.staticflickr.com/1/497/32646040911_a77e4ef080_o.jpg,0.25,0.0,1.0,0.75,672,121,https://www.flickr.com/photos/glorycycles/32646040911,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\ndf3a6d57446e3adb,https://c1.staticflickr.com/1/517/32438911541_3c1ccc6f61_o.jpg,0.333333333333,0.0,1.0,1.0,105,875,https://www.flickr.com/photos/rexness/32438911541/,https://creativecommons.org/licenses/by/2.0/,Rexness,https://www.flickr.com/people/rexness/\n6ca9feaa8708e7e8,https://c1.staticflickr.com/1/751/32065884240_cdaff4ef66_o.jpg,0.25,0.0,1.0,1.0,735,220,https://www.flickr.com/photos/27665395@N05/32065884240,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n2692929876296ef9,https://c1.staticflickr.com/8/7122/27677841415_2db0b99cd3_o.jpg,0.25,0.25,0.75,1.0,854,692,https://www.flickr.com/photos/tjshirey/27677841415,https://creativecommons.org/licenses/by/2.0/,Trevin Shirey,https://www.flickr.com/people/tjshirey/\ne8de68d1c0953ebb,https://c1.staticflickr.com/9/8822/28310394774_47b6ca2d2f_o.jpg,0.0,0.0,0.75,0.75,498,759,https://www.flickr.com/photos/91425144@N04/28310394774,https://creativecommons.org/licenses/by/2.0/,Arran Bee,https://www.flickr.com/people/91425144@N04/\n52ce80df32914dc3,https://c1.staticflickr.com/6/5774/30437564623_84c217d22e_o.jpg,0.25,0.0,1.0,0.5,820,892,https://www.flickr.com/photos/jus10h/30437564623,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n92ea83a3d0c9e527,https://c1.staticflickr.com/8/7205/26861262392_80978e75b0_o.jpg,0.248348017621,0.25,0.745044052863,1.0,26,772,https://www.flickr.com/photos/aah-yeah/26861262392/,https://creativecommons.org/licenses/by/2.0/,Aah-Yeah,https://www.flickr.com/people/aah-yeah/\n97191f504702f144,https://c1.staticflickr.com/9/8349/28460060652_228b06bb24_o.jpg,0.333333333333,0.0,1.0,1.0,699,97,https://www.flickr.com/photos/parisharing/28460060652,https://creativecommons.org/licenses/by/2.0/,ParisSharing,https://www.flickr.com/people/parisharing/\n46599a10d96c0eb4,https://c1.staticflickr.com/8/7337/26834139236_423a8e3f43_o.jpg,0.0,0.0,1.0,1.0,792,646,https://www.flickr.com/photos/juliejordanscott/26834139236/,https://creativecommons.org/licenses/by/2.0/,Julie Jordan Scott,https://www.flickr.com/people/juliejordanscott/\n109d5ba3faba5681,https://c1.staticflickr.com/9/8679/30485799251_df0c39c8ba_o.jpg,0.25,0.0,1.0,1.0,437,30,https://www.flickr.com/photos/27665395@N05/30485799251,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nf48e17b979a7452c,https://c1.staticflickr.com/4/3903/33011767050_d7e9f02e3b_o.jpg,0.576662143826,0.0,1.0,0.75,976,850,https://www.flickr.com/photos/tdlucas5000/33011767050,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/\nacee304e6400ce8a,https://c1.staticflickr.com/3/2645/32678938611_e6a643f851_o.jpg,0.25,0.0,1.0,0.75,459,539,https://flickr.com/46262306@N04/32678938611,https://creativecommons.org/licenses/by/2.0/,Aberdeen Proving Ground,https://www.flickr.com/people/usagapg/\n58496c486d66074c,https://c1.staticflickr.com/9/8780/27829070344_d2fb385064_o.jpg,0.223015320334,0.25,0.669045961003,1.0,808,889,https://www.flickr.com/photos/rvwithtito/27829070344,https://creativecommons.org/licenses/by/2.0/,RVWithTito.com,https://www.flickr.com/people/rvwithtito/\ne9d0f9392ff838d7,https://c1.staticflickr.com/8/7514/28010171106_b5c4353457_o.jpg,0.25,0.0,0.75,0.75,896,550,https://www.flickr.com/photos/markyharky/28010171106,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n9ee06b354699f2ad,https://c1.staticflickr.com/6/5566/29915855306_64d08fe59a_o.jpg,0.0,0.25,0.561328125,1.0,384,586,https://www.flickr.com/photos/vermazeren/29915855306,https://creativecommons.org/licenses/by/2.0/,Arend,https://www.flickr.com/people/vermazeren/\nd354518b87ffbb13,https://c1.staticflickr.com/8/7774/29631250731_431446c495_o.jpg,0.0,0.0,0.666666666667,1.0,820,875,https://www.flickr.com/photos/pahudson/29631250731,https://creativecommons.org/licenses/by/2.0/,Paul Hudson,https://www.flickr.com/people/pahudson/\nee6645f71a018440,https://c1.staticflickr.com/6/5777/30672888112_f828e31701_o.jpg,0.44937150838,0.25,0.89874301676,1.0,719,762,https://www.flickr.com/photos/batjko/30672888112,https://creativecommons.org/licenses/by/2.0/,Patrick Metzdorf,https://www.flickr.com/people/batjko/\n42a19e9c01e5c21b,https://c1.staticflickr.com/9/8281/29711825985_718f24b572_o.jpg,0.0,0.0,0.741835147745,1.0,539,1000,https://www.flickr.com/photos/stefanjurca/29711825985,https://creativecommons.org/licenses/by/2.0/,\\310\\230tefan Jurc\\304\\203,https://www.flickr.com/people/stefanjurca/\nfdbe38b88ce78d48,https://c1.staticflickr.com/6/5553/30860906230_e3c4e56785_o.jpg,0.0,0.0,0.654970760234,1.0,718,815,https://flickr.com/91807507@N03/30860906230,https://creativecommons.org/licenses/by/2.0/,GPS 56,https://www.flickr.com/people/91807507@N03/\n1c01d534ef51a95b,https://c1.staticflickr.com/9/8478/29176937053_6a61ccef36_o.jpg,0.312410841655,0.0,0.937232524964,1.0,548,915,https://www.flickr.com/photos/guillermo_andre/29176937053,https://creativecommons.org/licenses/by/2.0/,EL GUILLE!,https://www.flickr.com/people/guillermo_andre/\n92898d18fe5b3878,https://c1.staticflickr.com/9/8129/27951178783_25b6df5062_o.jpg,0.0,0.0,0.5,0.75,975,529,https://www.flickr.com/photos/usdagov/27951178783/,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n5bbcb7778094b7e6,https://c1.staticflickr.com/9/8591/28057745730_85e7e6e313_o.jpg,0.249631811487,0.0,0.748895434462,0.75,323,90,https://flickr.com/37180297@N08/28057745730,https://creativecommons.org/licenses/by/2.0/,LiCheng Shih,https://www.flickr.com/people/papilioshih/\n8681f8354ddc63c2,https://c1.staticflickr.com/9/8500/29406799161_6ee6ef4711_o.jpg,0.250923190547,0.25,0.75276957164,1.0,407,637,https://www.flickr.com/photos/eltb/29406799161,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n29718ae37e7bcf85,https://c1.staticflickr.com/9/8323/28934998602_168431139b_o.jpg,0.0,0.25,0.50110619469,1.0,422,978,https://www.flickr.com/photos/dakohuang/28934998602,https://creativecommons.org/licenses/by/2.0/,Dako Huang,https://www.flickr.com/people/dakohuang/\ne42b0e5c445d64c8,https://c1.staticflickr.com/6/5171/29805978361_3b0ea12cf2_o.jpg,0.0,0.0,0.561569688769,1.0,699,913,https://www.flickr.com/photos/ankurp/29805978361,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\nccedf4668d0eb6a6,https://c1.staticflickr.com/9/8379/29135109294_477050b474_o.jpg,0.0,0.0,0.75,1.0,818,873,https://www.flickr.com/photos/zombieite/29135109294/,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/\nbdb929dd37dabb1f,https://c1.staticflickr.com/6/5511/30457121645_8bbc078a89_o.jpg,0.0,0.516304347826,0.75,1.0,709,829,https://www.flickr.com/photos/dalbera/30457121645,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n34622e0ecc448248,https://c1.staticflickr.com/6/5486/30597457194_4ddbed3fa6_o.jpg,0.0,0.0,0.75,1.0,820,801,https://flickr.com/94643613@N00/30597457194,https://creativecommons.org/licenses/by/2.0/,Bruce Matsunaga,https://www.flickr.com/people/brucematsunaga/\n8e16731930492dff,https://c1.staticflickr.com/8/7304/28159241886_cd566b2ec2_o.jpg,0.0,0.48007518797,0.75,1.0,318,300,https://www.flickr.com/photos/26138378@N03/28159241886,https://creativecommons.org/licenses/by/2.0/,Patrick Clement,https://www.flickr.com/people/26138378@N03/\nc24ccdbf81172891,https://c1.staticflickr.com/8/7463/27935986990_cf48dc6482_o.jpg,0.25,0.0,0.75,0.75,986,504,https://www.flickr.com/photos/juggernautco/27935986990,https://creativecommons.org/licenses/by/2.0/,Daniel X. O&#x27;Neil,https://www.flickr.com/people/juggernautco/\n05998799afb7ac0c,https://c1.staticflickr.com/9/8226/28886344023_2f9c499a00_o.jpg,0.25,0.0,1.0,1.0,979,59,https://www.flickr.com/photos/vastateparksstaff/28886344023/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\nff85b924d590993f,https://c1.staticflickr.com/8/7263/27216212215_08cb29f933_o.jpg,0.25,0.25,0.75,1.0,484,881,https://www.flickr.com/photos/143247890@N03/27216212215/,https://creativecommons.org/licenses/by/2.0/,Bob Jenkin,https://www.flickr.com/people/143247890@N03/\ne7833b508b1852c0,https://c1.staticflickr.com/6/5469/30276728356_34280408b2_o.jpg,0.0,0.0,0.423337856174,0.75,885,615,https://www.flickr.com/photos/eltb/30276728356,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n100723caed6d6dea,https://c1.staticflickr.com/9/8383/28370471220_42d6019d6a_o.jpg,0.43661971831,0.0,1.0,0.75,114,859,https://www.flickr.com/photos/scotnelson/28370471220,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n3a9b212f46f382c7,https://c1.staticflickr.com/9/8809/28571687610_1b40e1b9f1_o.jpg,0.25,0.576662143826,1.0,1.0,407,585,https://www.flickr.com/photos/eltb/28571687610,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\ne81841e3844ec917,https://c1.staticflickr.com/6/5817/30318536444_0623cc599a_o.jpg,0.0,0.25,0.464488636364,1.0,145,326,https://www.flickr.com/photos/jsjgeology/30318536444,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n0c13a20bdc50509d,https://c1.staticflickr.com/9/8857/27758686543_9b58fa3bb3_o.jpg,0.0,0.0,0.5,0.75,437,698,https://www.flickr.com/photos/greggjerdingen/27758686543,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n3c1a419fb63a4761,https://c1.staticflickr.com/8/7328/27154507170_ed8574ba33_o.jpg,0.25,0.0,0.75,0.75,51,171,https://www.flickr.com/photos/tipsfortravellers/27154507170,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n53953db800a896ff,https://c1.staticflickr.com/8/7734/27255732686_b711f99c35_o.jpg,0.0,0.0,0.5,0.75,548,297,https://www.flickr.com/photos/rhemkes/27255732686,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\n9179ac93ffefa78d,https://c1.staticflickr.com/8/7424/26766057214_2e713ef3f5_o.jpg,0.0,0.25,0.462765957447,1.0,752,72,http://www.flickr.com/99962592@N00/26766057214/,https://creativecommons.org/licenses/by/2.0/,Niki Odolphie,https://www.flickr.com/people/odolphie/\n4fa03bb639031370,https://c1.staticflickr.com/9/8866/28465400856_9c9caa40ed_o.jpg,0.258620689655,0.0,0.775862068966,0.75,404,31,https://www.flickr.com/photos/usnavy/28465400856,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\nda579190142584d2,https://c1.staticflickr.com/8/7425/27582329305_bf76f0573c_o.jpg,0.0,0.25,0.61620294599,1.0,309,90,https://www.flickr.com/photos/gails_pictures/27582329305,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n9fb05793b2868e38,https://c1.staticflickr.com/1/662/31696478304_a534323294_o.jpg,0.249079528719,0.25,0.747238586156,1.0,752,462,https://www.flickr.com/photos/davehamster/31696478304,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n2b955cce7381f8c3,https://c1.staticflickr.com/9/8411/28938804182_0a1b7fcb15_o.jpg,0.0,0.0,0.592295345104,0.75,309,772,https://www.flickr.com/photos/35142635@N05/28938804182/,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\n768e42796bb19958,https://c1.staticflickr.com/9/8553/29554729693_be62678ede_o.jpg,0.0,0.25,0.75,1.0,830,782,https://www.flickr.com/photos/eschipul/29554729693,https://creativecommons.org/licenses/by/2.0/,Ed Schipul,https://www.flickr.com/people/eschipul/\n5100e5e7380a77ea,https://c1.staticflickr.com/8/7298/26354547924_0e95b0619b_o.jpg,0.28125,0.0,0.84375,0.75,976,832,https://www.flickr.com/photos/discoveroregon/26354547924,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n9bc2f8d943e3915e,https://c1.staticflickr.com/8/7289/27864749046_3059d1d8b8_o.jpg,0.4375,0.0,1.0,0.75,923,563,https://www.flickr.com/photos/36668466@N05/27864749046,https://creativecommons.org/licenses/by/2.0/,Fernando Medina,https://www.flickr.com/people/36668466@N05/\n9b01c1ae12d0bddc,https://c1.staticflickr.com/9/8204/29313204124_5f2e2e0f58_o.jpg,0.0,0.0,0.669128508124,1.0,556,422,https://www.flickr.com/photos/pedrosimoes7/29313204124,https://creativecommons.org/licenses/by/2.0/,Pedro Ribeiro Sim\\303\\265es,https://www.flickr.com/people/pedrosimoes7/\nec1c634bfdffe570,https://c1.staticflickr.com/9/8656/27988047840_755fe60365_o.jpg,0.4375,0.0,1.0,0.75,570,912,https://www.flickr.com/photos/27665395@N05/27988047840,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n9cd76f824613628a,https://c1.staticflickr.com/6/5465/30772881352_5b19d004dc_o.jpg,0.0,0.25,1.0,1.0,973,392,https://www.flickr.com/photos/jsjgeology/30772881352,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n65b875a0c3287375,https://c1.staticflickr.com/8/7405/27209122780_171effda61_o.jpg,0.210588633288,0.0,0.631765899865,0.75,583,484,https://www.flickr.com/photos/stijlfoto/27209122780/,https://creativecommons.org/licenses/by/2.0/,Jan Willem van Wessel,https://www.flickr.com/people/stijlfoto/\n9507a85152aebd8d,https://c1.staticflickr.com/9/8619/28384388396_0da1827073_o.jpg,0.251849112426,0.25,0.755547337278,1.0,405,984,https://www.flickr.com/photos/barteq24/28384388396,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/\n1d2fafe35c9e1a37,https://c1.staticflickr.com/1/636/31449274014_19d0b7b0db_o.jpg,0.28125,0.0,0.84375,0.75,859,876,https://www.flickr.com/photos/smemon/31449274014,https://creativecommons.org/licenses/by/2.0/,Sean MacEntee,https://www.flickr.com/people/smemon/\n3b094b21176bb71f,https://c1.staticflickr.com/9/8573/26493767750_af674077bf_o.jpg,0.0,0.0,0.5625,0.75,962,260,https://www.flickr.com/photos/cogdog/26493767750,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nb56538d3be220376,https://c1.staticflickr.com/9/8580/30059931081_69b42d0c26_o.jpg,0.28125,0.0,0.84375,0.75,710,364,https://www.flickr.com/photos/leo_nghinphu/30059931081,https://creativecommons.org/licenses/by/2.0/,Leo Chu\\341\\273\\221i,https://www.flickr.com/people/leo_nghinphu/\n606c9a889cc714b8,https://c1.staticflickr.com/9/8818/28234712590_d5cc31be3b_o.jpg,0.0,0.25,0.5625,1.0,108,391,https://www.flickr.com/photos/jimg944/28234712590,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n8d41ed7c32623d5a,https://c1.staticflickr.com/8/7580/27616522622_723400540a_o.jpg,0.266552511416,0.0,0.799657534247,0.75,407,340,https://www.flickr.com/photos/22711505@N05/27616522622,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\nf25e1473a8117b31,https://c1.staticflickr.com/6/5718/31101332462_45130921f9_o.jpg,0.25,0.0,0.75,0.75,820,680,https://www.flickr.com/photos/jus10h/31101332462,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n64996d79666a2f72,https://c1.staticflickr.com/8/7277/27323489826_2e4e465dab_o.jpg,0.260869565217,0.0,1.0,1.0,458,197,https://www.flickr.com/photos/publicresourceorg/27323489826,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/\n95e179e395bad3da,https://c1.staticflickr.com/8/7385/26392708813_c8d4ab3c6f_o.jpg,0.333333333333,0.0,1.0,1.0,985,468,https://www.flickr.com/photos/98044123@N06/26392708813/,https://creativecommons.org/licenses/by/2.0/,morten thomsen,https://www.flickr.com/people/98044123@N06/\na993d1ee47eb1deb,https://c1.staticflickr.com/8/7400/26382293333_ab0c25523a_o.jpg,0.25,0.25,1.0,1.0,53,780,https://www.flickr.com/photos/perkovich/26382293333,https://creativecommons.org/licenses/by/2.0/,Per \\303\\205str\\303\\266m,https://www.flickr.com/people/perkovich/\n81ff39ed042bcd0b,https://c1.staticflickr.com/9/8424/29435846625_b6809f7cab_o.jpg,0.421177266576,0.0,0.842354533153,0.75,818,473,https://www.flickr.com/photos/117096107@N03/29435846625,https://creativecommons.org/licenses/by/2.0/,Kieran White,https://www.flickr.com/people/117096107@N03/\naec8b6be7171f1b0,https://c1.staticflickr.com/9/8419/29882027610_2d372fb49d_o.jpg,0.328402366864,0.0,1.0,1.0,982,84,https://flickr.com/63704136@N00/29882027610,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n34589520bdc0241a,https://c1.staticflickr.com/6/5081/30211775385_43d551de16_o.jpg,0.25,0.0,1.0,0.75,968,248,https://flickr.com/35096833@N07/30211775385,https://creativecommons.org/licenses/by/2.0/,KID the Euforia,https://www.flickr.com/people/blueberrystream/\n9ad47c37f1ad5968,https://c1.staticflickr.com/9/8012/29245448422_4d721b1df6_o.jpg,0.4375,0.25,1.0,1.0,979,417,https://www.flickr.com/photos/lofink/29245448422,https://creativecommons.org/licenses/by/2.0/,David Lofink,https://www.flickr.com/people/lofink/\nf63051413723905d,https://c1.staticflickr.com/9/8807/28419079741_b0c52a5bdb_o.jpg,0.28125,0.0,0.84375,0.75,392,936,https://www.flickr.com/photos/mypubliclands/28419079741,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n3aad3176a0b5183e,https://c1.staticflickr.com/8/7333/27185020962_d4d718c4ac_o.jpg,0.262273413897,0.25,0.786820241692,1.0,493,79,https://www.flickr.com/photos/michaelpollak/27185020962,https://creativecommons.org/licenses/by/2.0/,Michael Pollak,https://www.flickr.com/people/michaelpollak/\n2aa24b844d862881,https://c1.staticflickr.com/9/8591/28267365313_e0c4a30511_o.jpg,0.400242326333,0.0,1.0,0.75,986,627,https://www.flickr.com/photos/pavdw/28267365313,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/\na16861c334188321,https://c1.staticflickr.com/8/7706/26189359803_d4c2f4ca29_o.jpg,0.381765463918,0.25,0.763530927835,1.0,672,812,https://www.flickr.com/photos/computerhotline/26189359803,https://creativecommons.org/licenses/by/2.0/,Thomas Bresson,https://www.flickr.com/people/computerhotline/\n952cbd5b5966c92a,https://c1.staticflickr.com/8/7449/27194087184_feb1db0985_o.jpg,0.0,0.25,0.5625,1.0,820,452,https://www.flickr.com/photos/weeklydig/27194087184,https://creativecommons.org/licenses/by/2.0/,digboston,https://www.flickr.com/people/weeklydig/\n2beb0fdd6372a48e,https://c1.staticflickr.com/1/291/32732479015_a87c8fe1ac_o.jpg,0.0,0.0,0.75,1.0,875,586,https://www.flickr.com/photos/69203347@N03/32732479015/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\nb030485f194b0053,https://c1.staticflickr.com/6/5192/29685196730_0bf04b8a7a_o.jpg,0.0,0.0,0.515344311377,0.75,975,579,https://www.flickr.com/photos/jsjgeology/29685196730,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n867cd35b008ae182,https://c1.staticflickr.com/9/8253/29327869835_70db5cabe6_o.jpg,0.25,0.25,0.75,1.0,303,119,https://www.flickr.com/photos/vahemart/29327869835/,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\n759c0826c52ee872,https://c1.staticflickr.com/9/8505/29103696345_d625509442_o.jpg,0.263565891473,0.0,1.0,1.0,655,645,https://www.flickr.com/photos/karen_roe/29103696345,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/\n9a8481cf9796d0ab,https://c1.staticflickr.com/9/8323/29494543686_7cc4ef1c82_o.jpg,0.5,0.25,1.0,1.0,972,902,https://flickr.com/126540849@N02/29494543686,https://creativecommons.org/licenses/by/2.0/,Jacques Mignon,https://www.flickr.com/people/jacquesmignon/\nb7fa44c32caaffb3,https://c1.staticflickr.com/8/7341/26984977414_2e5558444c_o.jpg,0.0,0.0,0.75,1.0,763,713,https://www.flickr.com/photos/shankaronline/26984977414,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n637e6a264d6014a8,https://c1.staticflickr.com/6/5576/29766573323_e12a9b81c5_o.jpg,0.0,0.25,0.574644549763,1.0,539,696,https://www.flickr.com/photos/22711505@N05/29766573323,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\nb1efadf78cf1de1e,https://c1.staticflickr.com/1/44/31380261692_5604b80179_o.jpg,0.25,0.0,1.0,0.75,918,514,https://www.flickr.com/photos/home_of_chaos/31380261692,https://creativecommons.org/licenses/by/2.0/,thierry ehrmann,https://www.flickr.com/people/home_of_chaos/\n2e72d9445e342a0d,https://c1.staticflickr.com/6/5820/30483301745_744e943c67_o.jpg,0.25,0.25,0.75,1.0,519,986,https://www.flickr.com/photos/box_repsol/30483301745,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\neff76dc3f74bdc0f,https://c1.staticflickr.com/6/5511/30786850411_2885e1022e_o.jpg,0.0,0.25,0.5,1.0,975,753,https://www.flickr.com/photos/danielchodusov/30786850411,https://creativecommons.org/licenses/by/2.0/,Daniel Chodusov,https://www.flickr.com/people/danielchodusov/\n623301e88f850657,https://c1.staticflickr.com/6/5461/29931816924_d7f3ee9f05_o.jpg,0.284198113208,0.0,0.852594339623,0.75,763,956,https://www.flickr.com/photos/calliope/29931816924,https://creativecommons.org/licenses/by/2.0/,liz west,https://www.flickr.com/people/calliope/\n71694ee01836ed7d,https://c1.staticflickr.com/6/5508/30794665160_9ccdc813c6_o.jpg,0.0,0.0,0.75,0.501846381093,922,542,https://flickr.com/23112312@N08/30794665160,https://creativecommons.org/licenses/by/2.0/,Jeremy Crawshaw,https://www.flickr.com/people/23112312@N08/\na0fc6dbee6adb547,https://c1.staticflickr.com/9/8320/29492813276_be30f9d210_o.jpg,0.5,0.25,1.0,1.0,731,524,https://www.flickr.com/photos/o_0/29492813276,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\nb34fda89012c8bea,https://c1.staticflickr.com/6/5814/31836680684_a109c5d34c_o.jpg,0.28125,0.25,0.84375,1.0,407,10,https://www.flickr.com/photos/sheila_sund/31836680684,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/\nddb9bf0eb25bf2b0,https://c1.staticflickr.com/9/8102/29102905071_a8515700de_o.jpg,0.25,0.0,1.0,1.0,889,512,https://www.flickr.com/photos/fdecomite/29102905071/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\n5388b80c84396dd4,https://c1.staticflickr.com/9/8109/29696568495_733b79c182_o.jpg,0.0,0.0,0.395150720839,0.75,566,827,https://www.flickr.com/photos/robdammers/29696568495,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\nac1b0876bbe8e9a4,https://c1.staticflickr.com/6/5155/29903511760_495908d89b_o.jpg,0.0,0.0,0.75,1.0,426,250,http://www.flickr.com/photos/torsten-behrens/29903511760/,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/\n252f99ec5f509656,https://c1.staticflickr.com/6/5554/30912205341_5db71c4f48_o.jpg,0.591404665314,0.25,0.82796653144,1.0,719,454,https://www.flickr.com/photos/132033298@N04/30912205341,https://creativecommons.org/licenses/by/2.0/,C. P. Ewing,https://www.flickr.com/people/132033298@N04/\n9c820652a68b2d02,https://c1.staticflickr.com/6/5546/29799868360_bd503c036c_o.jpg,0.0,0.25,0.75,1.0,755,48,https://www.flickr.com/photos/40441865@N08/29799868360,https://creativecommons.org/licenses/by/2.0/,mitchell haindfield,https://www.flickr.com/people/40441865@N08/\n46e80fd106c3792b,https://c1.staticflickr.com/9/8152/28444480440_bef4fcb851_o.jpg,0.438430311231,0.0,1.0,1.0,820,836,https://flickr.com/35150587@N05/28444480440,https://creativecommons.org/licenses/by/2.0/,johnkell,https://www.flickr.com/people/johnkell/\nca105d51ad8facff,https://c1.staticflickr.com/6/5770/30118502580_afb1c2061e_o.jpg,0.5,0.25,1.0,1.0,556,620,https://www.flickr.com/photos/grahammitchellphotography/30118502580/,https://creativecommons.org/licenses/by/2.0/,Graham  Mitchell,https://www.flickr.com/people/grahammitchellphotography/\n857321cb22c1c419,https://c1.staticflickr.com/1/438/32213058236_94bd1d6bed_o.jpg,0.315088757396,0.25,0.945266272189,1.0,990,715,https://flickr.com/97121495@N03/32213058236,https://creativecommons.org/licenses/by/2.0/,Tutto Giardinaggio,https://www.flickr.com/people/giardinaggioitalia/\nd15cac710711747a,https://c1.staticflickr.com/9/8024/29622358505_19eb3d2831_o.jpg,0.0,0.0,0.666666666667,1.0,973,648,https://www.flickr.com/photos/rollercoasterphilosophy/29622358505,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/\nf6d1cf47a8aa20a8,https://c1.staticflickr.com/8/7545/28364965246_ab9af36b39_o.jpg,0.0,0.0,1.0,1.0,889,300,https://www.flickr.com/photos/grego1402/28364965246/,https://creativecommons.org/licenses/by/2.0/,grego1402,https://www.flickr.com/people/grego1402/\n86c8cd1d8f84ce8f,https://c1.staticflickr.com/8/7728/26780933470_38a1049ef4_o.jpg,0.42174796748,0.25,0.843495934959,1.0,880,448,https://www.flickr.com/photos/a-weidinger/26780933470,https://creativecommons.org/licenses/by/2.0/,Alfred Weidinger,https://www.flickr.com/people/a-weidinger/\n4ff23f2ad38fd401,https://c1.staticflickr.com/6/5737/31036804316_eaabf7c802_o.jpg,0.0,0.0,0.5,0.75,355,100,https://www.flickr.com/photos/kkoshy/31036804316,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/\n63791ac2fd017aeb,https://c1.staticflickr.com/9/8861/28137868683_42f159e76e_o.jpg,0.0036036036036,0.0,1.0,1.0,133,820,https://www.flickr.com/photos/walterpro/28137868683/,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/\n2e5c3ffd121e2f9c,https://c1.staticflickr.com/1/361/31615860221_ab561987d6_o.jpg,0.0,0.0,0.623395149786,1.0,747,808,https://flickr.com/56292751@N03/31615860221,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/\n4b74dc92cf2e80d0,https://c1.staticflickr.com/8/7523/27798676602_cf1d5af5a5_o.jpg,0.248348017621,0.25,0.745044052863,1.0,108,532,https://www.flickr.com/photos/shankaronline/27798676602,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nc782a59a82cdfb4d,https://c1.staticflickr.com/8/7118/26867449092_c44ec11a00_o.jpg,0.25,0.0,1.0,0.75,310,1,https://www.flickr.com/photos/78428166@N00/26867449092,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\n6862ec8595dc6c56,https://c1.staticflickr.com/2/1609/26747073465_95360c9138_o.jpg,0.0,0.0,0.5,0.75,976,652,https://www.flickr.com/photos/o_0/26747073465,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n3c561dbb76ca3ffa,https://c1.staticflickr.com/1/548/31803920303_0696c89603_o.jpg,0.0,0.25,0.5,1.0,516,485,https://www.flickr.com/photos/thejointstaff/31803920303/,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/\nbfc5f1a5f6095813,https://c1.staticflickr.com/9/8717/27575524434_b558a86463_o.jpg,0.28125,0.0,0.84375,0.75,448,929,https://www.flickr.com/photos/marknenadov/27575524434,https://creativecommons.org/licenses/by/2.0/,Mark Nenadov,https://www.flickr.com/people/marknenadov/\n801e83ace785d867,https://c1.staticflickr.com/9/8505/28935923203_71dbe1d802_o.jpg,0.0,0.0,0.75,1.0,662,400,https://www.flickr.com/photos/hugo90/28935923203,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n0ed1b476a8d35f07,https://c1.staticflickr.com/6/5721/30826042520_a612dbe37b_o.jpg,0.5,0.0,1.0,0.75,820,624,https://www.flickr.com/photos/worldskillsteamuk/30826042520/,https://creativecommons.org/licenses/by/2.0/,WorldSkills  UK,https://www.flickr.com/people/worldskillsteamuk/\n12f384511bfaaebf,https://c1.staticflickr.com/9/8107/29268227970_d69dbbff82_o.jpg,0.252222222222,0.25,0.756666666667,1.0,905,534,https://flickr.com/55088466@N00/29268227970,https://creativecommons.org/licenses/by/2.0/,Daniel Davis,https://www.flickr.com/people/ourmaninjapan/\n31ee0a7a8beb6ac4,https://c1.staticflickr.com/6/5452/25330696409_3891d42cf5_o.jpg,0.0,0.25,0.561328125,1.0,673,875,https://www.flickr.com/photos/85264217@N04/25330696409,https://creativecommons.org/licenses/by/2.0/,Retis,https://www.flickr.com/people/85264217@N04/\n27a61180fabb7637,https://c1.staticflickr.com/6/5623/30315995793_a463f4bdd8_o.jpg,0.28125,0.0,0.84375,0.75,582,874,https://flickr.com/93356413@N08/30315995793,https://creativecommons.org/licenses/by/2.0/,Darren765,https://www.flickr.com/people/darrencole/\n23de0d55027dc7a3,https://c1.staticflickr.com/9/8898/28738065486_c04e50b144_o.jpg,0.421177266576,0.25,0.842354533153,1.0,739,627,https://flickr.com/131880272@N06/28738065486,https://creativecommons.org/licenses/by/2.0/,K M,https://www.flickr.com/people/131880272@N06/\n737b6e38658695f2,https://c1.staticflickr.com/9/8677/28419314086_3e21638e9f_o.jpg,0.5,0.0,1.0,0.75,484,982,https://www.flickr.com/photos/tipsfortravellers/28419314086,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n610d60be726ca6d1,https://c1.staticflickr.com/9/8505/28866246713_4f0a8ca496_o.jpg,0.528969957082,0.25,1.0,1.0,566,416,https://www.flickr.com/photos/kansasscanner/28866246713/,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\n401febd3655dda02,https://c1.staticflickr.com/8/7779/29416214475_39b8239209_o.jpg,0.0,0.118644067797,1.0,1.0,151,266,https://www.flickr.com/photos/dierkschaefer/29416214475/,https://creativecommons.org/licenses/by/2.0/,dierk schaefer,https://www.flickr.com/people/dierkschaefer/\n176760ed7ff20bd7,https://c1.staticflickr.com/8/7537/30136372641_b2485a1db1_o.jpg,0.0,0.25,0.5625,1.0,975,966,https://www.flickr.com/photos/jsjgeology/30136372641,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\neaf713ec585a2754,https://c1.staticflickr.com/9/8295/29519151446_c697798142_o.jpg,0.501840942563,0.0,1.0,0.75,973,755,https://www.flickr.com/photos/jsjgeology/29519151446,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n47e0c9ee4ed42ee3,https://c1.staticflickr.com/9/8206/27841878953_437fa16780_o.jpg,0.299878836834,0.25,0.899636510501,1.0,23,225,https://www.flickr.com/photos/andymorffew/27841878953,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\n881340c29c88014c,https://c1.staticflickr.com/6/5329/30794856046_f6ac274e01_o.jpg,0.0,0.0,0.75,0.710456942004,702,922,https://www.flickr.com/photos/texaus1/30794856046/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/\nd0109fa6612128b0,https://c1.staticflickr.com/9/8469/29131834663_f11987e2a4_o.jpg,0.0,0.0,0.496696035242,0.75,323,939,https://flickr.com/25733107@N04/29131834663,https://creativecommons.org/licenses/by/2.0/,Aah-Yeah,https://www.flickr.com/people/aah-yeah/\n0a81921bed16cd9c,https://c1.staticflickr.com/8/7542/27300912264_fe44ed9a0f_o.jpg,0.335787923417,0.0,1.0,1.0,228,386,https://www.flickr.com/photos/janette990/27300912264,https://creativecommons.org/licenses/by/2.0/,janette990,https://www.flickr.com/people/janette990/\n0ef885f82d06ffca,https://c1.staticflickr.com/9/8652/30043967940_501b3de162_o.jpg,0.0,0.0,0.516116941529,0.75,760,580,https://flickr.com/25797459@N06/30043967940,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/\n7dad6bb45fecb59a,https://c1.staticflickr.com/9/8291/29003730704_c09ca28d81_o.jpg,0.225,0.25,0.675,1.0,100,267,https://www.flickr.com/photos/edenpictures/29003730704,https://creativecommons.org/licenses/by/2.0/,\"Eden, Janine and Jim\",https://www.flickr.com/people/edenpictures/\n8bc3dad95f98fe11,https://c1.staticflickr.com/9/8439/29149924172_38fa37cc50_o.jpg,0.28125,0.0,0.84375,0.75,875,586,https://www.flickr.com/photos/27665395@N05/29149924172,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nd8559b3f24b2cc69,https://c1.staticflickr.com/1/350/32272607015_5ef144a6cf_o.jpg,0.0,0.0,0.666666666667,1.0,348,159,https://flickr.com/51986662@N05/32272607015,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\ncb98933bedefe9db,https://c1.staticflickr.com/8/7012/26213386434_c865cc0876_o.jpg,0.0,0.0,1.0,1.0,480,796,https://www.flickr.com/photos/eurosporttuning/26213386434,https://creativecommons.org/licenses/by/2.0/,Frank Derks,https://www.flickr.com/people/eurosporttuning/\n8627963eacfe4668,https://c1.staticflickr.com/9/8735/28106799374_ec166f6dd5_o.jpg,0.249079528719,0.0,0.747238586156,0.75,310,859,https://www.flickr.com/photos/usfwsmtnprairie/28106799374,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\nfb24259468b0b124,https://c1.staticflickr.com/9/8275/30188082226_3dc1c4a49f_o.jpg,0.248348017621,0.0,0.745044052863,0.75,407,610,https://www.flickr.com/photos/pedrocaetano/30188082226,https://creativecommons.org/licenses/by/2.0/,Pedro,https://www.flickr.com/people/pedrocaetano/\n2e208d34ebec0c44,https://c1.staticflickr.com/6/5322/31322799915_be8b36bee4_o.jpg,0.249631811487,0.25,0.748895434462,1.0,868,903,https://www.flickr.com/photos/76969036@N02/31322799915/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\nbb200415131927ef,https://c1.staticflickr.com/6/5577/30536544566_ff5db59f54_o.jpg,0.480855855856,0.25,1.0,1.0,975,570,https://flickr.com/47445767@N05/30536544566,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ne2b54379f6c404d8,https://c1.staticflickr.com/6/5474/30281570564_4ecba92b00_o.jpg,0.332106038292,0.0,0.996318114875,1.0,712,730,https://flickr.com/145363040@N07/30281570564,https://creativecommons.org/licenses/by/2.0/,Aisha Choudhry,https://www.flickr.com/people/145363040@N07/\nb1269b46204045b6,https://c1.staticflickr.com/6/5703/30947011335_2196f2de97_o.jpg,0.501840942563,0.0,1.0,0.75,669,91,https://flickr.com/29585346@N07/30947011335,https://creativecommons.org/licenses/by/2.0/,Stefan Karpiniec,https://www.flickr.com/people/29585346@N07/\nbc15ebf673a00d0f,https://c1.staticflickr.com/9/8517/29252422732_b510bbce56_o.jpg,0.0,0.25,0.5625,1.0,966,557,https://www.flickr.com/photos/isfullofcrap/29252422732,https://creativecommons.org/licenses/by/2.0/,R. Crap Mariner,https://www.flickr.com/people/isfullofcrap/\n994a4b6f71154556,https://c1.staticflickr.com/8/7263/27408953582_de6b68faa3_o.jpg,0.502573529412,0.0,1.0,0.75,666,228,https://www.flickr.com/photos/sg2012/27408953582/,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/\n1cb76eb4560d7bd4,https://c1.staticflickr.com/6/5692/31041586391_9cebc2c511_o.jpg,0.0,0.25,0.499263622975,1.0,625,535,https://www.flickr.com/photos/usnavyresearch/31041586391,https://creativecommons.org/licenses/by/2.0/,Office of Naval Research,https://www.flickr.com/people/usnavyresearch/\n5205a1f46cba0dbe,https://c1.staticflickr.com/9/8287/29165755435_1dce1d02b2_o.jpg,0.0,0.25,0.362751256281,1.0,971,989,https://www.flickr.com/photos/mondo79/29165755435,https://creativecommons.org/licenses/by/2.0/,Mondo79,https://www.flickr.com/people/mondo79/\n08ace6c0f876e995,https://c1.staticflickr.com/8/7287/28000559881_d1612ab423_o.jpg,0.5,0.25,1.0,1.0,295,213,https://www.flickr.com/photos/janitors/28000559881,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\nb8c15598b35b2097,https://c1.staticflickr.com/8/7437/28168972922_656f6381fd_o.jpg,0.4375,0.25,1.0,1.0,874,211,https://www.flickr.com/photos/maximeraphael/28168972922,https://creativecommons.org/licenses/by/2.0/,Maxime Bober,https://www.flickr.com/people/maximeraphael/\ne67bc976a1e69a81,https://c1.staticflickr.com/8/7302/27830501441_5babb851c9_o.jpg,0.310344827586,0.0,1.0,1.0,484,456,https://www.flickr.com/photos/jdlasica/27830501441,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\n9c10b0031c416eab,https://c1.staticflickr.com/1/492/31350394054_d7c8300db7_o.jpg,0.328205128205,0.0,1.0,0.75,644,606,https://flickr.com/10390868@N07/31350394054,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\nb58de66e5b6c48fb,https://c1.staticflickr.com/8/7754/27089392201_af098b639e_o.jpg,0.202689243028,0.0,0.608067729084,0.75,780,102,https://www.flickr.com/photos/thoseguys119/27089392201,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n761c81309e376a42,https://c1.staticflickr.com/1/324/31582424873_00a0d11619_o.jpg,0.25,0.25,1.0,1.0,540,323,https://www.flickr.com/photos/58558794@N07/31582424873,https://creativecommons.org/licenses/by/2.0/,POP,https://www.flickr.com/people/58558794@N07/\n439f8f89eccccb69,https://c1.staticflickr.com/6/5458/30411450492_26a433eab7_o.jpg,0.5,0.0,1.0,0.75,431,752,https://www.flickr.com/photos/lauraanddave/30411450492,https://creativecommons.org/licenses/by/2.0/,Dave n Laura,https://www.flickr.com/people/lauraanddave/\ndc871f6ccacea74a,https://c1.staticflickr.com/8/7538/27273338061_6b2be936c3_o.jpg,0.5,0.0,1.0,0.75,820,828,https://www.flickr.com/photos/jus10h/27273338061,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n55e190b917b6f461,https://c1.staticflickr.com/6/5672/30431138402_063361b64f_o.jpg,0.0,0.25,0.642140468227,1.0,537,921,https://www.flickr.com/photos/a_little_brighter/30431138402/,https://creativecommons.org/licenses/by/2.0/,Harold Litwiler,https://www.flickr.com/people/a_little_brighter/\n3c6461e82de23815,https://c1.staticflickr.com/8/7447/27792831236_2c66352883_o.jpg,0.58040201005,0.0,0.81256281407,0.75,780,397,https://www.flickr.com/photos/thoseguys119/27792831236/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nac89d159b97cc8e5,https://c1.staticflickr.com/6/5679/30710418905_16a3507fd1_o.jpg,0.5,0.25,1.0,1.0,830,161,https://flickr.com/56537760@N03/30710418905,https://creativecommons.org/licenses/by/2.0/,Th\\303\\251o Paul,https://www.flickr.com/people/theopaul/\n23719fda32d3c31a,https://c1.staticflickr.com/9/8255/28979744361_b0405b1ece_o.jpg,0.526542324247,0.0,1.0,0.75,563,661,https://www.flickr.com/photos/51764518@N02/28979744361,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n687dc375e7a10804,https://c1.staticflickr.com/9/8620/28093988020_8e5a60c19e_o.jpg,0.0,0.0,0.75,0.75,914,817,https://www.flickr.com/photos/rapidtravelchai/28093988020/,https://creativecommons.org/licenses/by/2.0/,Stefan Krasowski,https://www.flickr.com/people/rapidtravelchai/\nf6a5c0b776c3117a,https://c1.staticflickr.com/8/7294/26233433814_0c3409e01f_o.jpg,0.0,0.0,0.75,0.5625,518,426,https://www.flickr.com/photos/mtacc-esa/26233433814,https://creativecommons.org/licenses/by/2.0/,MTA Capital Construction Mega Projects,https://www.flickr.com/people/mtacc-esa/\n990fcbea1389c21a,https://c1.staticflickr.com/6/5677/30796311156_efd0b4b9d4_o.jpg,0.0,0.25,0.593499197432,1.0,146,292,https://www.flickr.com/photos/pandora_6666/30796311156,https://creativecommons.org/licenses/by/2.0/,Jo Naylor,https://www.flickr.com/people/pandora_6666/\nb33c0003b4b57bab,https://c1.staticflickr.com/9/8188/29099527184_039d609370_o.jpg,0.25,0.0,1.0,0.75,480,44,https://www.flickr.com/photos/96774554@N03/29099527184,https://creativecommons.org/licenses/by/2.0/,Wheels ON,https://www.flickr.com/people/96774554@N03/\n174cbab4303eb662,https://c1.staticflickr.com/8/7231/26852395522_91cd577794_o.jpg,0.0,0.0,0.504444444444,0.75,896,660,https://www.flickr.com/photos/13476480@N07/26852395522,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n34642c10afe5b668,https://c1.staticflickr.com/8/7088/27400722246_cdfa0c325a_o.jpg,0.0,0.0,0.561569688769,1.0,991,737,https://www.flickr.com/photos/131880272@N06/27400722246,https://creativecommons.org/licenses/by/2.0/,K M,https://www.flickr.com/people/131880272@N06/\ncd49b70577371e58,https://c1.staticflickr.com/9/8512/28660474013_a544a299a4_o.jpg,0.28125,0.0,0.84375,0.75,975,125,https://www.flickr.com/photos/jsjgeology/28660474013,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nd22fe979979e6929,https://c1.staticflickr.com/6/5499/29844324183_55ca536efe_o.jpg,0.188470066519,0.0,0.565410199557,1.0,896,513,https://www.flickr.com/photos/8782469@N05/29844324183/,https://creativecommons.org/licenses/by/2.0/,Graham Robertson,https://www.flickr.com/people/8782469@N05/\n0893ada7694f1d7d,https://c1.staticflickr.com/3/2816/32982369791_a264397127_o.jpg,0.333333333333,0.0,1.0,1.0,25,462,https://www.flickr.com/photos/79452129@N02/32982369791,https://creativecommons.org/licenses/by/2.0/,Fyn Kynd Photography,https://www.flickr.com/people/79452129@N02/\nab20d0352c9a4071,https://c1.staticflickr.com/8/7140/26824721496_6fd64dbdb5_o.jpg,0.0,0.25,1.0,1.0,913,128,https://www.flickr.com/photos/fsnorthernregion/26824721496,https://creativecommons.org/licenses/by/2.0/,Forest Service Northern Region,https://www.flickr.com/people/fsnorthernregion/\n583cef7e46f2d7f9,https://c1.staticflickr.com/8/7307/27828990750_bd1c109bcf_o.jpg,0.42174796748,0.25,0.843495934959,1.0,761,926,https://www.flickr.com/photos/33398884@N03/27828990750/,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\n2589a2e8badc8523,https://c1.staticflickr.com/6/5622/29271598544_2f7fb35834_o.jpg,0.580971659919,0.0,1.0,0.75,456,31,https://www.flickr.com/photos/j_regan/29271598544,https://creativecommons.org/licenses/by/2.0/,regan76,https://www.flickr.com/people/j_regan/\n3ae13528c36f5149,https://c1.staticflickr.com/8/7353/27653574931_69257d47fb_o.jpg,0.0,0.25,0.5,1.0,896,411,https://www.flickr.com/photos/faceme/27653574931,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/\n27018a94efb8a53d,https://c1.staticflickr.com/9/8631/28359419373_68a72aa3d3_o.jpg,0.0,0.0,0.501846381093,0.75,489,700,https://www.flickr.com/photos/nekudo/28359419373/,https://creativecommons.org/licenses/by/2.0/,Simon Samtleben,https://www.flickr.com/people/nekudo/\na3194139bd8a5223,https://c1.staticflickr.com/9/8649/28297979531_293f53e516_o.jpg,0.333,0.0,0.999,1.0,338,639,https://www.flickr.com/photos/kjfnjy/28297979531/,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/\n5f5a8e248e949893,https://c1.staticflickr.com/1/657/32562857566_c0634c3595_o.jpg,0.2946,0.25,0.8838,1.0,426,404,http://www.flickr.com/photos/laurelrusswurm/32562857566/,https://creativecommons.org/licenses/by/2.0/,Laurel L. Russwurm,https://www.flickr.com/people/laurelrusswurm/\na8cfe84bfbb905b1,https://c1.staticflickr.com/8/7338/27564665926_9f16421c18_o.jpg,0.0,0.25,0.531155015198,1.0,405,136,https://www.flickr.com/photos/levien66/27564665926/,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/\ndaf2aff043808df2,https://c1.staticflickr.com/9/8599/28973539905_f37980b963_o.jpg,0.0,0.4375,0.75,1.0,323,504,https://www.flickr.com/photos/chaz_pics/28973539905,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\n61716ea3da29278d,https://c1.staticflickr.com/3/2936/33158217522_eb268ac14b_o.jpg,0.0,0.0,0.75,0.456981664316,70,956,https://flickr.com/47445767@N05/33158217522,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ndb170c5fd6b66050,https://c1.staticflickr.com/1/397/31584612401_fef60895b1_o.jpg,0.4375,0.25,1.0,1.0,875,355,https://www.flickr.com/photos/aswans1234567/31584612401/,https://creativecommons.org/licenses/by/2.0/,Alex Swanston&#x27;s Bus Photos,https://www.flickr.com/people/aswans1234567/\n1efec3aff39e2bbc,https://c1.staticflickr.com/2/1514/26153940013_280846a935_o.jpg,0.315396113602,0.0,1.0,1.0,680,763,https://www.flickr.com/photos/martius/26153940013,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\n6269269e08fda904,https://c1.staticflickr.com/8/7326/27021604744_3d2f64937d_o.jpg,0.0,0.0,0.75,0.75,704,590,https://www.flickr.com/photos/carlchristian/27021604744,https://creativecommons.org/licenses/by/2.0/,Carl Christian Gr\\303\\270ndahl,https://www.flickr.com/people/carlchristian/\n18771bcd1284d995,https://c1.staticflickr.com/8/7702/27788486740_dc5964a4dc_o.jpg,0.574489795918,0.25,1.0,1.0,908,724,https://www.flickr.com/photos/jdlasica/27788486740,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\nbb54947f9fd207bd,https://c1.staticflickr.com/1/712/31908547584_555dc6093f_o.jpg,0.0,0.0,0.710806697108,1.0,101,980,https://www.flickr.com/photos/wildreturn/31908547584,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\neaa88f936210e51d,https://c1.staticflickr.com/9/8279/29608950481_f9b4577e4a_o.jpg,0.0,0.0,0.5,0.75,398,953,https://www.flickr.com/photos/raita/29608950481,https://creativecommons.org/licenses/by/2.0/,Raita Futo,https://www.flickr.com/people/raita/\n279818e08074054f,https://c1.staticflickr.com/9/8276/28608195851_197743033a_o.jpg,0.25,0.25,1.0,1.0,58,385,https://www.flickr.com/photos/thart2009/28608195851,https://creativecommons.org/licenses/by/2.0/,Tom Hart,https://www.flickr.com/people/thart2009/\n80dcecc8754e64d2,https://c1.staticflickr.com/6/5573/31287999516_6ec02a7642_o.jpg,0.25,0.0,1.0,1.0,336,286,https://www.flickr.com/photos/9750464@N02/31287999516/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\n0444eecab827d9b0,https://c1.staticflickr.com/9/8189/28490896596_bc91176623_o.jpg,0.4375,0.25,1.0,1.0,441,545,https://www.flickr.com/photos/34739556@N04/28490896596,https://creativecommons.org/licenses/by/2.0/,rawdonfox,https://www.flickr.com/people/34739556@N04/\n1c285f4c1f59d391,https://c1.staticflickr.com/8/7061/26880954302_9d3a03c991_o.jpg,0.234308131241,0.25,0.702924393723,1.0,37,364,https://www.flickr.com/photos/140214426@N06/26880954302,https://creativecommons.org/licenses/by/2.0/,Lihoman...,https://www.flickr.com/people/140214426@N06/\n5920b1edf2f3fb33,https://c1.staticflickr.com/9/8304/28969393671_2c57610b0d_o.jpg,0.28125,0.25,0.84375,1.0,966,520,https://www.flickr.com/photos/jeepersmedia/28969393671,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nd29e6048ebffacbb,https://c1.staticflickr.com/8/7743/26863028052_eaf9d1f20b_o.jpg,0.25,0.0,1.0,0.499263622975,562,488,https://www.flickr.com/photos/unicefecu/26863028052/,https://creativecommons.org/licenses/by/2.0/,UNICEF Ecuador,https://www.flickr.com/people/unicefecu/\n06434ecc3ee92cab,https://c1.staticflickr.com/9/8291/28672079040_9a51442780_o.jpg,0.5,0.25,1.0,1.0,699,7,https://www.flickr.com/photos/o_0/28672079040/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n6e755ba1d50ea586,https://c1.staticflickr.com/1/424/30811297673_5e23536d37_o.jpg,0.0,0.0,0.75,0.75,906,863,https://www.flickr.com/photos/72283508@N00/30811297673/,https://creativecommons.org/licenses/by/2.0/,Rookuzz..,https://www.flickr.com/people/72283508@N00/\n64d4bf0ee1ff07d4,https://c1.staticflickr.com/9/8024/27891699514_6b7bcb6357_o.jpg,0.210588633288,0.0,0.631765899865,0.75,820,655,https://www.flickr.com/photos/ultrakml/27891699514,https://creativecommons.org/licenses/by/2.0/,Katherine Lim,https://www.flickr.com/people/ultrakml/\na2b1102ab528f653,https://c1.staticflickr.com/6/5630/30467628134_e1af38e13e_o.jpg,0.4375,0.25,1.0,1.0,840,381,https://www.flickr.com/photos/woodhead/30467628134,https://creativecommons.org/licenses/by/2.0/,jasonwoodhead23,https://www.flickr.com/people/woodhead/\n49c44b8586d3a013,https://c1.staticflickr.com/9/8267/28935595442_98fa118a43_o.jpg,0.4375,0.0,1.0,0.75,974,931,https://www.flickr.com/photos/127226743@N02/28935595442,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n6234bb935bdfa67a,https://c1.staticflickr.com/6/5622/31325933655_01aa62c019_o.jpg,0.0,0.0,0.5,0.75,981,880,https://www.flickr.com/photos/myneur/31325933655/,https://creativecommons.org/licenses/by/2.0/,Petr Meissner,https://www.flickr.com/people/myneur/\n45317bc9b4752ecd,https://c1.staticflickr.com/9/8052/29300057441_a89022d7bd_o.jpg,0.249079528719,0.25,0.747238586156,1.0,909,66,https://www.flickr.com/photos/dlr_de/29300057441,https://creativecommons.org/licenses/by/2.0/,DLR German Aerospace Center,https://www.flickr.com/people/dlr_de/\nacf33f6f612f72ba,https://c1.staticflickr.com/8/7657/26887791375_1dea874b1a_o.jpg,0.0,0.0,0.75,0.63875,602,903,https://www.flickr.com/photos/140473922@N07/26887791375/,https://creativecommons.org/licenses/by/2.0/,malnasfalu,https://www.flickr.com/people/140473922@N07/\n58c0464d894e860d,https://c1.staticflickr.com/9/8729/30061850401_aa07c74f06_o.jpg,0.25,0.0,1.0,0.75,613,464,https://www.flickr.com/photos/togawanderings/30061850401,https://creativecommons.org/licenses/by/2.0/,Thomas Galvez,https://www.flickr.com/people/togawanderings/\n789eca750611fbea,https://c1.staticflickr.com/9/8626/29644007673_8f0b5ff270_o.jpg,0.0,0.25,0.567503924647,1.0,325,68,https://www.flickr.com/photos/dany13/29644007673,https://creativecommons.org/licenses/by/2.0/,dany13,https://www.flickr.com/people/dany13/\n28b3817e7a1f79e9,https://c1.staticflickr.com/3/2674/32766398956_c2d1a0c71d_o.jpg,0.0,0.0,0.701966717095,1.0,977,465,https://www.flickr.com/photos/jordiver/32766398956/,https://creativecommons.org/licenses/by/2.0/,Jordi Verdugo,https://www.flickr.com/people/jordiver/\n536378d6ceae5752,https://c1.staticflickr.com/6/5462/30647908266_3f28c142e1_o.jpg,0.25,0.0,0.75,0.75,662,615,https://flickr.com/10013573@N05/30647908266,https://creativecommons.org/licenses/by/2.0/,Willem van Valkenburg,https://www.flickr.com/people/wfvanvalkenburg/\n73d4e85fa5b59f29,https://c1.staticflickr.com/6/5488/30316948464_17de01b64f_o.jpg,0.25,0.25,0.75,1.0,519,986,https://www.flickr.com/photos/box_repsol/30316948464,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nc6a45271363e7f04,https://c1.staticflickr.com/9/8123/29842387891_501d877c25_o.jpg,0.0,0.0,0.666666666667,1.0,662,844,https://www.flickr.com/photos/77492252@N05/29842387891,https://creativecommons.org/licenses/by/2.0/,davocano,https://www.flickr.com/people/77492252@N05/\n2c46c711457c77ec,https://c1.staticflickr.com/1/315/31879403996_985f54c131_o.jpg,0.0,0.0,0.666666666667,1.0,558,774,https://www.flickr.com/photos/ministeriodedefensaperu/31879403996,https://creativecommons.org/licenses/by/2.0/,Galeria del Ministerio de Defensa del Per\\303\\272,https://www.flickr.com/people/ministeriodedefensaperu/\nb3b7fbf89b0a7556,https://c1.staticflickr.com/9/8137/29249933864_7275736729_o.jpg,0.25,0.0,1.0,0.739247311828,800,486,https://www.flickr.com/photos/zaneology/29249933864,https://creativecommons.org/licenses/by/2.0/,Zaneology,https://www.flickr.com/people/zaneology/\nc086851283a7aacc,https://c1.staticflickr.com/8/7665/26313610194_dc87b14b5a_o.jpg,0.0,0.25,0.5,1.0,723,966,https://www.flickr.com/photos/jsenniko/26313610194,https://creativecommons.org/licenses/by/2.0/,Juris Se\\305\\206\\305\\206ikovs,https://www.flickr.com/people/jsenniko/\ne25e97b4da4dca11,https://c1.staticflickr.com/6/5601/31193975172_669d041215_o.jpg,0.25,0.0,1.0,1.0,981,126,https://www.flickr.com/photos/blmoregon/31193975172,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\n60551ce10f562a2f,https://c1.staticflickr.com/9/8616/28201270866_77169d2b43_o.jpg,0.0,0.25,0.5,1.0,699,605,https://www.flickr.com/photos/slapers/28201270866,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\nfb97af3a43925ba9,https://c1.staticflickr.com/6/5805/30472669264_962c581540_o.jpg,0.5,0.0,1.0,0.75,916,235,http://www.flickr.com/photos/ajesplugues/30472669264/,https://creativecommons.org/licenses/by/2.0/,Ajuntament d&#x27;Esplugues de Llobregat,https://www.flickr.com/people/ajesplugues/\nd34f7dee12182abe,https://c1.staticflickr.com/6/5737/31443843255_126f119dbd_o.jpg,0.5,0.25,1.0,1.0,561,905,https://www.flickr.com/photos/codnewsroom/31443843255/,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\n213180dccb79dbab,https://c1.staticflickr.com/1/780/32266535531_914d1de4f8_o.jpg,0.0,0.0,0.421177266576,0.75,932,858,https://www.flickr.com/photos/ekigyuu/32266535531,https://creativecommons.org/licenses/by/2.0/,California Cow,https://www.flickr.com/people/ekigyuu/\neb3f60c3e0eb5675,https://c1.staticflickr.com/9/8537/28606389864_7a625438a9_o.jpg,0.0,0.0,0.5,0.75,405,442,https://www.flickr.com/photos/markyharky/28606389864/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\ne3938807514f8af3,https://c1.staticflickr.com/8/7070/26876369605_1c0b58e022_o.jpg,0.0,0.0,0.5625,0.75,972,902,https://www.flickr.com/photos/ethanhein/26876369605,https://creativecommons.org/licenses/by/2.0/,Ethan Hein,https://www.flickr.com/people/ethanhein/\n11463c81b0f19280,https://c1.staticflickr.com/8/7409/27194030834_587632b7aa_o.jpg,0.0,0.0,0.5625,0.75,826,468,https://www.flickr.com/photos/jsjgeology/27194030834,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nd46bda0f98ffd223,https://c1.staticflickr.com/1/717/31805621711_da0f339f2a_o.jpg,0.25,0.541313559322,1.0,1.0,888,933,https://www.flickr.com/photos/dalbera/31805621711,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n7c2bad6bd8baab07,https://c1.staticflickr.com/9/8254/29380005704_83b348ea96_o.jpg,0.0,0.0,0.7484375,1.0,874,909,https://flickr.com/146689017@N06/29380005704,https://creativecommons.org/licenses/by/2.0/,Omar Salvatierra Gracida,https://www.flickr.com/people/omarsg/\n8933d2aabaf4dfaf,https://c1.staticflickr.com/6/5614/30551743646_f5241b75cb_o.jpg,0.287671232877,0.0,0.86301369863,1.0,780,467,https://www.flickr.com/photos/thoseguys119/30551743646,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n6cc3b846932214d3,https://c1.staticflickr.com/1/307/30908389114_09f4d6d259_o.jpg,0.28125,0.0,0.84375,0.75,976,624,https://www.flickr.com/photos/auntylaurie/30908389114,https://creativecommons.org/licenses/by/2.0/,Laurie Avocado,https://www.flickr.com/people/auntylaurie/\n755ad78ea92cb11f,https://c1.staticflickr.com/1/536/32823412236_e11f9dd6a3_o.jpg,0.0,0.0,0.5,0.75,355,632,https://www.flickr.com/photos/cmichel67/32823412236,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/\n5b55f8116ca730aa,https://c1.staticflickr.com/9/8138/28755052770_ed159a3a94_o.jpg,0.28125,0.25,0.84375,1.0,709,392,https://www.flickr.com/photos/127226743@N02/28755052770,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\nd2186fe6529885bf,https://c1.staticflickr.com/9/8516/29300966580_e3628e21ba_o.jpg,0.498153618907,0.25,1.0,1.0,361,216,https://www.flickr.com/photos/bottesini/29300966580/,https://creativecommons.org/licenses/by/2.0/,Carl Hinde,https://www.flickr.com/people/bottesini/\n5c9d17909af242f1,https://c1.staticflickr.com/9/8310/29439863240_94936370d8_o.jpg,0.0,0.281690140845,0.75,0.845070422535,998,446,https://www.flickr.com/photos/treegrow/29439863240,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n14608181de580cd1,https://c1.staticflickr.com/8/7693/26685191040_c344a00d79_o.jpg,0.0,0.0,0.5625,0.75,738,799,https://www.flickr.com/photos/jeepersmedia/26685191040,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n0eef2b93e7c79a50,https://c1.staticflickr.com/6/5622/29912896226_6dafcd621b_o.jpg,0.25,0.25,0.75,1.0,680,441,https://www.flickr.com/photos/slgc/29912896226,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\na02ea721a8e22a81,https://c1.staticflickr.com/9/8163/29006650060_719fec9008_o.jpg,0.299878836834,0.25,0.899636510501,1.0,441,799,https://www.flickr.com/photos/edenpictures/29006650060/,https://creativecommons.org/licenses/by/2.0/,\"Eden, Janine and Jim\",https://www.flickr.com/people/edenpictures/\n45f25eb5cf5e1817,https://c1.staticflickr.com/8/7083/27083758675_ca01de522e_o.jpg,0.0,0.0,0.666666666667,1.0,782,630,https://www.flickr.com/photos/deniwlp84/27083758675,https://creativecommons.org/licenses/by/2.0/,Deni Williams,https://www.flickr.com/people/deniwlp84/\n037605e380e74b3d,https://c1.staticflickr.com/8/7316/27535047834_84be398e92_o.jpg,0.496696035242,0.25,0.993392070485,1.0,980,94,https://www.flickr.com/photos/peuplier/27535047834/,https://creativecommons.org/licenses/by/2.0/,peuplier,https://www.flickr.com/people/peuplier/\n4608535c5f81bf16,https://c1.staticflickr.com/8/7719/27861554981_6e505299e7_o.jpg,0.0,0.265577507599,0.75,0.796732522796,755,825,https://www.flickr.com/photos/51764518@N02/27861554981,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\na603cbb7f45040e6,https://c1.staticflickr.com/6/5559/30982399701_4555e35818_o.jpg,0.25,0.25,1.0,1.0,936,8,https://flickr.com/89575217@N00/30982399701,https://creativecommons.org/licenses/by/2.0/,Sean Hackbarth,https://www.flickr.com/people/seanhackbarth/\nabff9a4488c6e34a,https://c1.staticflickr.com/8/7216/26599258800_48d8040e17_o.jpg,0.0,0.0,0.75,0.75,885,779,https://www.flickr.com/photos/pagedooley/26599258800,https://creativecommons.org/licenses/by/2.0/,Kevin Dooley,https://www.flickr.com/people/pagedooley/\n8a20fba052c91fef,https://c1.staticflickr.com/6/5631/30713916761_f72ee66eea_o.jpg,0.0,0.440540540541,1.0,1.0,518,219,https://flickr.com/34034435@N00/30713916761,https://creativecommons.org/licenses/by/2.0/,charlene mcbride,https://www.flickr.com/people/ursonate/\nbe41bd184b764bf9,https://c1.staticflickr.com/1/357/32195526361_11bd66c116_o.jpg,0.330871491876,0.0,1.0,1.0,507,607,http://www.flickr.com/photos/byzantiumbooks/32195526361/,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/\n4f3f8aad1011d96b,https://c1.staticflickr.com/9/8191/29494467880_92c889fef9_o.jpg,0.0424028268551,0.0,1.0,1.0,310,759,https://www.flickr.com/photos/gails_pictures/29494467880/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n705436bd09b51c8a,https://c1.staticflickr.com/8/7541/28102794341_3cd2ce0b73_o.jpg,0.350925925926,0.0,0.701851851852,0.75,348,979,https://www.flickr.com/photos/dennisredfield/28102794341/,https://creativecommons.org/licenses/by/2.0/,cloud2013,https://www.flickr.com/people/dennisredfield/\na409f86891d38546,https://c1.staticflickr.com/9/8141/28672318593_e6ebce766e_o.jpg,0.0,0.25,0.5625,1.0,944,189,https://www.flickr.com/photos/sakena/28672318593,https://creativecommons.org/licenses/by/2.0/,Sakena,https://www.flickr.com/people/sakena/\n0131e33e1fb8e4de,https://c1.staticflickr.com/6/5513/30392703730_5b17ceef76_o.jpg,0.0,0.0,1.0,0.805510534846,683,130,http://www.flickr.com/photos/socsci/30392703730/,https://creativecommons.org/licenses/by/2.0/,Mr. Gray,https://www.flickr.com/people/socsci/\n3eeaf2616d093b3b,https://c1.staticflickr.com/8/7394/27048842461_c128a19fb2_o.jpg,0.4375,0.0,1.0,0.75,110,60,https://www.flickr.com/photos/132646954@N02/27048842461/,https://creativecommons.org/licenses/by/2.0/,dronepicr,https://www.flickr.com/people/132646954@N02/\n769693c4690e455e,https://c1.staticflickr.com/9/8745/28344168252_7701492f98_o.jpg,0.0,0.25,0.5,1.0,985,603,https://www.flickr.com/photos/silkebaron/28344168252/,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/\ndc9bd10190ea94fe,https://c1.staticflickr.com/6/5542/30728276060_666cebb8c5_o.jpg,0.0,0.0,1.0,0.773015873016,573,568,https://www.flickr.com/photos/zeevveez/30728276060/,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/\n62836d9f411d3e4e,https://c1.staticflickr.com/8/7413/27480747053_17bf037e80_o.jpg,0.5,0.25,1.0,1.0,512,3,https://www.flickr.com/photos/u07ch/27480747053,https://creativecommons.org/licenses/by/2.0/,Chris Hoare,https://www.flickr.com/people/u07ch/\n586bc62010e36052,https://c1.staticflickr.com/9/8544/29533915266_73b21578b8_o.jpg,0.496696035242,0.0,0.993392070485,0.75,484,863,https://www.flickr.com/photos/sybarite48/29533915266,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n2bd761902ddc0465,https://c1.staticflickr.com/9/8323/29234492521_15421294e1_o.jpg,0.0,0.0,0.666666666667,1.0,426,519,https://www.flickr.com/photos/60712129@N06/29234492521/,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/\n518b92fced5b37c0,https://c1.staticflickr.com/6/5789/30029731443_b72cfcb099_o.jpg,0.25,0.499263622975,1.0,0.99852724595,443,492,https://www.flickr.com/photos/_pavan_/30029731443/,https://creativecommons.org/licenses/by/2.0/,_paVan_,https://www.flickr.com/people/_pavan_/\ncbc94e0ed022e3f7,https://c1.staticflickr.com/2/1484/26171544903_cc6f95bcec_o.jpg,0.25,0.0,1.0,0.75,986,823,https://www.flickr.com/photos/clairity/26171544903,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\n3e80d889502d35ec,https://c1.staticflickr.com/6/5328/29922029184_a4c33e19cc_o.jpg,0.0,0.0,0.5,0.75,428,220,https://flickr.com/32916425@N04/29922029184,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/\n467f986653331c23,https://c1.staticflickr.com/8/7376/27237214941_a7b34764bd_o.jpg,0.0,0.0,0.666666666667,1.0,976,491,https://www.flickr.com/photos/wm_archiv/27237214941,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/\n69024468d3f55fe5,https://c1.staticflickr.com/9/8222/28762319423_7ffbe8506d_o.jpg,0.248348017621,0.0,0.745044052863,0.75,484,702,https://www.flickr.com/photos/sybarite48/28762319423,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n8441b479f7e09fa8,https://c1.staticflickr.com/8/7278/27724505412_da1d61a874_o.jpg,0.333333333333,0.0,1.0,1.0,320,887,http://www.flickr.com/photos/10459174@N03/27724505412/,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/\nc58a10f77aa98ddb,https://c1.staticflickr.com/8/7449/26842767434_6e9e22ec4c_o.jpg,0.25,0.0,1.0,0.75,818,878,https://www.flickr.com/photos/moto_club4ag/26842767434,https://creativecommons.org/licenses/by/2.0/,Moto &quot;Club4AG&quot; Miwa,https://www.flickr.com/people/moto_club4ag/\nf21635f78f294334,https://c1.staticflickr.com/1/586/31273448830_c991a21a24_o.jpg,0.0,0.25,0.5,1.0,147,468,https://www.flickr.com/photos/blachswan/31273448830,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\nd4136db90952dbc5,https://c1.staticflickr.com/9/8268/28777773716_7f7cc40dbc_o.jpg,0.486899563319,0.25,0.973799126638,1.0,752,106,https://www.flickr.com/photos/8269539@N04/28777773716,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\ne1db6c0ddd408559,https://c1.staticflickr.com/8/7665/27446274476_bb5105c6da_o.jpg,0.5,0.0,1.0,0.75,976,656,https://www.flickr.com/photos/134741223@N04/27446274476,https://creativecommons.org/licenses/by/2.0/,Paulius Malinovskis,https://www.flickr.com/people/134741223@N04/\nff403c29ed79f115,https://c1.staticflickr.com/8/7326/27568783281_3c1d7b407e_o.jpg,0.281690140845,0.0,0.845070422535,0.75,896,827,https://www.flickr.com/photos/28169156@N03/27568783281,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/\ne3115a1ae84d4989,https://c1.staticflickr.com/1/592/33208479161_cf837d7dbe_o.jpg,0.0,0.0,0.75,0.684051724138,292,380,https://flickr.com/49399018@N00/33208479161,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\nbb4ef961035d26ec,https://c1.staticflickr.com/8/7522/26275989454_f0232d8b1a_o.jpg,0.25,0.25,0.75,1.0,815,728,https://www.flickr.com/photos/usefulguy/26275989454,https://creativecommons.org/licenses/by/2.0/,Daren,https://www.flickr.com/people/usefulguy/\ncc6227957262c76f,https://c1.staticflickr.com/9/8722/29291665122_90ddd7f8e7_o.jpg,0.161983471074,0.0,1.0,1.0,725,845,https://www.flickr.com/photos/mypubliclands/29291665122,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n1a0c8fa341b4a37c,https://c1.staticflickr.com/9/8664/29044209355_684f07b964_o.jpg,0.302066450567,0.0,0.906199351702,0.75,309,953,https://www.flickr.com/photos/35142635@N05/29044209355,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\n8172f0fdfb6fb9b8,https://c1.staticflickr.com/8/7344/27238563335_9d773f7a7c_o.jpg,0.0,0.0,0.666666666667,1.0,59,326,https://www.flickr.com/photos/quinet/27238563335,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n4338f8cd922c074f,https://c1.staticflickr.com/8/7156/26535332614_d72af19ac9_o.jpg,0.0,0.112244897959,1.0,1.0,923,718,https://www.flickr.com/photos/djquietstorm/26535332614,https://creativecommons.org/licenses/by/2.0/,DJ Quietstorm,https://www.flickr.com/people/djquietstorm/\n59031e05dbbc3f52,https://c1.staticflickr.com/8/7559/28797948012_f0de374436_o.jpg,0.254086181278,0.25,0.762258543834,1.0,144,20,https://www.flickr.com/photos/mypubliclands/28797948012,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\nb4415c65baed7516,https://c1.staticflickr.com/8/7460/27416443420_160df9300e_o.jpg,0.25,0.0,0.75,0.75,405,856,https://www.flickr.com/photos/alessandroambrosetti/27416443420,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/\n54f7c8c5af370662,https://c1.staticflickr.com/6/5718/30987348636_8b1ebd1173_o.jpg,0.276744186047,0.25,0.83023255814,1.0,854,904,https://www.flickr.com/photos/13476480@N07/30987348636,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n92c199c38dbc2802,https://c1.staticflickr.com/9/8321/29216321204_94b1532d99_o.jpg,0.4375,0.0,1.0,0.75,407,809,https://www.flickr.com/photos/davidwilson1949/29216321204/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\nf103ec5f8357c447,https://c1.staticflickr.com/1/313/31913141411_edc733f89d_o.jpg,0.25,0.4375,1.0,1.0,108,945,https://www.flickr.com/photos/jimg944/31913141411/,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n1c3f91ef1f361819,https://c1.staticflickr.com/8/7464/27903634184_202525d0ef_o.jpg,0.0,0.0,1.0,1.0,310,785,https://www.flickr.com/photos/62720583@N06/27903634184/,https://creativecommons.org/licenses/by/2.0/,Kelly Parker McPherson,https://www.flickr.com/people/kellymcpherson/\n0f83fac8ce824ddd,https://c1.staticflickr.com/1/665/31833889074_a9ed658ce2_o.jpg,0.0,0.25,0.598790322581,1.0,879,169,https://www.flickr.com/photos/stevendepolo/31833889074,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n0a5db53c7286f8ab,https://c1.staticflickr.com/9/8129/30203486926_ebb34a4e75_o.jpg,0.326939291737,0.0,0.980817875211,0.75,980,777,https://www.flickr.com/photos/vastateparksstaff/30203486926/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\nff679db22657fe1c,https://c1.staticflickr.com/3/2076/32046560293_5feb85b55b_o.jpg,0.249079528719,0.0,0.747238586156,0.75,311,434,http://www.flickr.com/photos/mikehawkwind/32046560293/,https://creativecommons.org/licenses/by/2.0/,Mike Smith,https://www.flickr.com/people/mikehawkwind/\n278bb871aaf429b9,https://c1.staticflickr.com/9/8310/29798300156_0d39313c57_o.jpg,0.5,0.0,1.0,0.75,651,557,https://www.flickr.com/photos/agriculturasp/29798300156/,https://creativecommons.org/licenses/by/2.0/,Secretaria de Agricultura e Abastecimento,https://www.flickr.com/people/agriculturasp/\n499ab46642b7c8e8,https://c1.staticflickr.com/8/7753/27455889495_5e7ecc7ec3_o.jpg,0.0,0.0,0.75786163522,1.0,31,298,https://www.flickr.com/photos/28242319@N03/27455889495/,https://creativecommons.org/licenses/by/2.0/,Dennis Heller,https://www.flickr.com/people/28242319@N03/\n58bedbc44c1d3279,https://c1.staticflickr.com/8/7382/26947350914_10dca1c24f_o.jpg,0.4375,0.0,1.0,0.75,305,679,https://www.flickr.com/photos/dhobern/26947350914/,https://creativecommons.org/licenses/by/2.0/,Donald Hobern,https://www.flickr.com/people/dhobern/\n12f8ccfb229bfab4,https://c1.staticflickr.com/8/7455/26669167474_3f8211e2f4_o.jpg,0.0,0.25,0.5,1.0,321,826,https://www.flickr.com/photos/52450054@N04/26669167474,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n2c8632e077d08768,https://c1.staticflickr.com/8/7713/27761158160_0f86b286b7_o.jpg,0.248348017621,0.0,0.745044052863,0.75,702,797,https://www.flickr.com/photos/sterlic/27761158160,https://creativecommons.org/licenses/by/2.0/,Scott Akerman,https://www.flickr.com/people/sterlic/\n0bf52174bd593307,https://c1.staticflickr.com/9/8244/28141665420_9d90e80539_o.jpg,0.0,0.0,0.5625,0.75,975,269,https://www.flickr.com/photos/jsjgeology/28141665420,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n41576c6c2a85cceb,https://c1.staticflickr.com/8/7284/28072330396_708b7ef791_o.jpg,0.25,0.25,0.75,1.0,548,472,https://www.flickr.com/photos/belurashok/28072330396,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/\n058fcadc77642930,https://c1.staticflickr.com/8/7790/27969356691_6c65125966_o.jpg,0.0,0.0,0.666666666667,1.0,896,283,https://www.flickr.com/photos/clemensv/27969356691,https://creativecommons.org/licenses/by/2.0/,Clemens Vasters,https://www.flickr.com/people/clemensv/\n36d189bc2a99ccaf,https://c1.staticflickr.com/3/2520/32729382131_f4e1177e1c_o.jpg,0.0,0.0,0.75,1.0,553,320,https://www.flickr.com/photos/marsupilami92/32729382131,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\nddd2025eb6b6a931,https://c1.staticflickr.com/6/5568/30168416874_247e2af36d_o.jpg,0.333333333333,0.0,1.0,1.0,971,106,https://flickr.com/20980483@N04/30168416874,https://creativecommons.org/licenses/by/2.0/,Ed Ogle,https://www.flickr.com/people/20980483@N04/\ne193bcfccec4dbc6,https://c1.staticflickr.com/9/8806/29481984513_2eff7c2f51_o.jpg,0.279203539823,0.0,1.0,0.75,304,399,https://www.flickr.com/photos/33398884@N03/29481984513,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\nacd617ee5f3f23a0,https://c1.staticflickr.com/6/5494/29995539834_b98dc5da0f_o.jpg,0.0,0.0,0.45,0.75,98,392,https://www.flickr.com/photos/atoach/29995539834/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n916a04ddc8731c46,https://c1.staticflickr.com/6/5536/30660371276_db25dd9373_o.jpg,0.438671875,0.25,1.0,1.0,808,85,https://flickr.com/68132273@N00/30660371276,https://creativecommons.org/licenses/by/2.0/,Stephan Ridgway,https://www.flickr.com/people/stephanridgway/\n209a178bfb1091e8,https://c1.staticflickr.com/6/5780/31286927062_c01607b9a4_o.jpg,0.322436849926,0.0,1.0,1.0,934,899,http://www.flickr.com/photos/playamongfriends/31286927062/,https://creativecommons.org/licenses/by/2.0/,Play Among Friends Paf,https://www.flickr.com/people/playamongfriends/\n822758c7af4d8b7b,https://c1.staticflickr.com/8/7458/28069567296_b94851cec3_o.jpg,0.25,0.0,1.0,1.0,512,529,https://www.flickr.com/photos/daveseven/28069567296,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/\n9b00a102463c1ad1,https://c1.staticflickr.com/6/5572/31662101102_dd08fec03d_o.jpg,0.249079528719,0.25,0.747238586156,1.0,875,474,https://www.flickr.com/photos/didbygraham/31662101102,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n0cb2feb744266fd0,https://c1.staticflickr.com/1/238/31631328665_5e73ddf5a7_o.jpg,0.0,0.0,0.556376360809,0.75,719,561,https://www.flickr.com/photos/telecastered/31631328665,https://creativecommons.org/licenses/by/2.0/,C. J. Lee,https://www.flickr.com/people/telecastered/\n0791499bcccabe52,https://c1.staticflickr.com/6/5831/30542504142_1929d64178_o.jpg,0.421177266576,0.0,0.842354533153,0.75,699,431,https://www.flickr.com/photos/erikkristensen/30542504142/,https://creativecommons.org/licenses/by/2.0/,Erik Cleves Kristensen,https://www.flickr.com/people/erikkristensen/\nd575d34d10aeb7e5,https://c1.staticflickr.com/9/8742/28232027000_2bbe5e89f8_o.jpg,0.25,0.25,0.75,1.0,449,632,https://www.flickr.com/photos/o_0/28232027000,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n94c8d6071e8e0881,https://c1.staticflickr.com/1/434/32270312545_5ae81bc3db_o.jpg,0.25,0.5,1.0,1.0,609,998,https://www.flickr.com/photos/markusspiske/32270312545/,https://creativecommons.org/licenses/by/2.0/,Markus Spiske,https://www.flickr.com/people/markusspiske/\nf05b4dd9abfa8fd2,https://c1.staticflickr.com/9/8122/29155178825_742da07639_o.jpg,0.0,0.0,0.75,0.570472440945,885,675,https://www.flickr.com/photos/dakone2k/29155178825/,https://creativecommons.org/licenses/by/2.0/,Daniel Cruz Valle,https://www.flickr.com/people/dakone2k/\n57689c97605feac9,https://c1.staticflickr.com/1/471/31991763546_5c22639fe6_o.jpg,0.284198113208,0.0,0.852594339623,0.75,933,706,https://www.flickr.com/photos/dierkschaefer/31991763546/,https://creativecommons.org/licenses/by/2.0/,dierk schaefer,https://www.flickr.com/people/dierkschaefer/\n82731c5828cb765e,https://c1.staticflickr.com/9/8230/29701176162_fff3e110d2_o.jpg,0.455384615385,0.25,1.0,1.0,310,223,https://www.flickr.com/photos/gails_pictures/29701176162/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\ne80e79c24965c1c4,https://c1.staticflickr.com/9/8450/29078155744_bb4b4b7052_o.jpg,0.4375,0.25,1.0,1.0,484,613,https://www.flickr.com/photos/garryknight/29078155744,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\n59be20b9e3e5bff8,https://c1.staticflickr.com/9/8809/28361911572_4b0f0125d5_o.jpg,0.258164852255,0.0,1.0,1.0,976,147,https://www.flickr.com/photos/29780474@N02/28361911572,https://creativecommons.org/licenses/by/2.0/,Phil Gayton,https://www.flickr.com/people/29780474@N02/\n9920295723999e88,https://c1.staticflickr.com/1/383/32382765811_d88c81ddfa_o.jpg,0.4375,0.25,1.0,1.0,971,866,http://www.flickr.com/photos/dlnorman/32382765811/,https://creativecommons.org/licenses/by/2.0/,D&#x27;Arcy Norman,https://www.flickr.com/people/dlnorman/\n73cfc43f614e9a7d,https://c1.staticflickr.com/1/777/32368474241_d7b6000fb7_o.jpg,0.244897959184,0.0,1.0,1.0,574,952,https://www.flickr.com/photos/hugo90/32368474241,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n075ef6f6e5a662c8,https://c1.staticflickr.com/9/8879/28447740005_93cd42414b_o.jpg,0.0,0.0,1.0,0.68005952381,539,933,https://www.flickr.com/photos/duncanh1/28447740005/,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\n769591275a3ce53a,https://c1.staticflickr.com/8/7617/27165103061_786b79b4f4_o.jpg,0.207382550336,0.25,0.622147651007,1.0,986,931,https://www.flickr.com/photos/nordique/27165103061/,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/\n6334ed4e7576b0ce,https://c1.staticflickr.com/9/8336/28779067996_7a08d9387f_o.jpg,0.163782816229,0.25,0.491348448687,1.0,815,960,https://www.flickr.com/photos/watts_photos/28779067996/,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/\n634a907608769906,https://c1.staticflickr.com/9/8351/29797714791_196e00f076_o.jpg,0.0,0.25,0.53506097561,1.0,780,636,https://www.flickr.com/photos/thoseguys119/29797714791,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n9322abcfde22c582,https://c1.staticflickr.com/1/682/32440530263_32a0e585b8_o.jpg,0.297768479777,0.0,0.893305439331,1.0,973,401,https://flickr.com/47445767@N05/32440530263,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n6ed60a4ef590f818,https://c1.staticflickr.com/8/7259/27353806003_e1ec2e55c9_o.jpg,0.308073654391,0.0,0.924220963173,1.0,896,572,https://www.flickr.com/photos/hisgett/27353806003/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n8ef45f7fd1349e5e,https://c1.staticflickr.com/9/8450/29274193644_83a359ea05_o.jpg,0.297226688103,0.25,0.891680064309,1.0,671,456,https://www.flickr.com/photos/hisgett/29274193644,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n65187b0210245a1a,https://c1.staticflickr.com/9/8817/28253135653_aaa7a4c09d_o.jpg,0.25,0.0,0.75,0.75,820,825,https://www.flickr.com/photos/oakfieldfestival/28253135653/,https://creativecommons.org/licenses/by/2.0/,Oakfield Festival,https://www.flickr.com/people/oakfieldfestival/\nce2bf4cb7697367d,https://c1.staticflickr.com/9/8091/29092250034_209b197b0e_o.jpg,0.0,0.333333333333,1.0,1.0,779,505,https://www.flickr.com/photos/quinet/29092250034,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nc96cd01115bc0d75,https://c1.staticflickr.com/6/5511/30434287803_d625d494c6_o.jpg,0.0,0.0,0.5,0.75,763,632,https://www.flickr.com/photos/jseita/30434287803,https://creativecommons.org/licenses/by/2.0/,Jun Seita,https://www.flickr.com/people/jseita/\n09d9e27638cfd149,https://c1.staticflickr.com/6/5569/30559613291_5fa48f672a_o.jpg,0.0,0.25,0.600969305331,1.0,702,758,https://www.flickr.com/photos/jlcernadas/30559613291,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\nebf67c819ecd79b0,https://c1.staticflickr.com/9/8020/28641898590_535c9e3022_o.jpg,0.503303964758,0.0,1.0,0.75,771,934,https://www.flickr.com/photos/spera-designerschuhe/28641898590,https://creativecommons.org/licenses/by/2.0/,\"SPERA.de Designerschuhe, Taschen und Accessoires\",https://www.flickr.com/people/spera-designerschuhe/\n38818dfe6c3d7f17,https://c1.staticflickr.com/3/2749/32849632742_3dc695bb90_o.jpg,0.0,0.0,0.75,0.572555205047,740,3,https://www.flickr.com/photos/archivesnz/32849632742,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/\ndb176954ac86b5de,https://c1.staticflickr.com/1/631/32225125016_01333c67be_o.jpg,0.0,0.25,0.497426470588,1.0,686,918,https://www.flickr.com/photos/agenciabrasilia/32225125016,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n672b81e790820689,https://c1.staticflickr.com/9/8501/29851837016_6e547ed3f2_o.jpg,0.0,0.0,0.75,0.75,672,313,https://www.flickr.com/photos/glorycycles/29851837016,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n43d75375c9dd3331,https://c1.staticflickr.com/4/3806/33050883126_0c5f49a3b5_o.jpg,0.0,0.0,0.659745762712,0.75,582,862,https://www.flickr.com/photos/andreboeni/33050883126,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n8b9e22fd818eedd1,https://c1.staticflickr.com/9/8045/29263007246_d555ab3dfc_o.jpg,0.334315169367,0.0,1.0,1.0,875,231,https://www.flickr.com/photos/76969036@N02/29263007246,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n201082ea98a3f4ad,https://c1.staticflickr.com/9/8365/28397101873_cf2e69e456_o.jpg,0.333333333333,0.0,1.0,1.0,618,165,https://www.flickr.com/photos/presidentialoffice/28397101873/,https://creativecommons.org/licenses/by/2.0/,\\347\\270\\275\\347\\265\\261\\345\\272\\234,https://www.flickr.com/people/presidentialoffice/\n4d5edc24f7e5730c,https://c1.staticflickr.com/8/7342/27329983715_fe7c660857_o.jpg,0.249631811487,0.0,0.748895434462,0.75,512,757,https://www.flickr.com/photos/greggjerdingen/27329983715,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n581715a637a8cb4c,https://c1.staticflickr.com/6/5553/30493046420_1bb6b3b694_o.jpg,0.25,0.25,0.75,1.0,747,515,https://www.flickr.com/photos/mindahaas/30493046420/,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/\nf892160406f2ff91,https://c1.staticflickr.com/8/7496/27516720291_998fc9818c_o.jpg,0.0,0.0,0.663235294118,1.0,756,632,https://www.flickr.com/photos/pedrik/27516720291/,https://creativecommons.org/licenses/by/2.0/,pedrik,https://www.flickr.com/people/pedrik/\n18c4ea8fcb592141,https://c1.staticflickr.com/8/7518/26746692071_5cc62265ee_o.jpg,0.25,0.5,1.0,1.0,13,452,https://www.flickr.com/photos/quinet/26746692071,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nc1e771277b4d0541,https://c1.staticflickr.com/8/7404/26613570814_3f0701b636_o.jpg,0.28125,0.0,0.84375,0.75,979,624,https://www.flickr.com/photos/backbone_campaign/26613570814,https://creativecommons.org/licenses/by/2.0/,Backbone Campaign,https://www.flickr.com/people/backbone_campaign/\n675a51b2ea9bd4b1,https://c1.staticflickr.com/8/7067/27115230165_fd9bfacc7b_o.jpg,0.25,0.400242326333,1.0,1.0,85,984,https://www.flickr.com/photos/kellymcpherson/27115230165,https://creativecommons.org/licenses/by/2.0/,Kelly Parker McPherson,https://www.flickr.com/people/kellymcpherson/\n99f7551240ade96e,https://c1.staticflickr.com/9/8062/29124935683_d7639b44ec_o.jpg,0.0,0.25,0.5625,1.0,719,447,https://www.flickr.com/photos/conner395/29124935683,https://creativecommons.org/licenses/by/2.0/,Dave Conner,https://www.flickr.com/people/conner395/\n714c77cf3886ec6e,https://c1.staticflickr.com/9/8166/28980411972_c2df5fbc6c_o.jpg,0.0,0.0,0.96975088968,1.0,305,427,https://www.flickr.com/photos/gails_pictures/28980411972/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nc505df8155f1b395,https://c1.staticflickr.com/8/7466/29063982836_0147f8ba93_o.jpg,0.25,0.0,1.0,0.5625,631,618,https://www.flickr.com/photos/treevillage/29063982836/,https://creativecommons.org/licenses/by/2.0/,kimubert,https://www.flickr.com/people/treevillage/\ncc7e3206cc2e9e07,https://c1.staticflickr.com/9/8279/28397640321_dae26e7250_o.jpg,0.48007518797,0.25,1.0,1.0,405,447,https://www.flickr.com/photos/erussell1984/28397640321/,https://creativecommons.org/licenses/by/2.0/,airbus777,https://www.flickr.com/people/erussell1984/\n5f5eeebd137e944d,https://c1.staticflickr.com/6/5793/31334694395_37fc326469_o.jpg,0.25,0.0,0.75,0.75,405,854,https://www.flickr.com/photos/janitors/31334694395,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n9da9b01db1ad7d5c,https://c1.staticflickr.com/6/5520/31022826954_00514ec7cf_o.jpg,0.28125,0.25,0.84375,1.0,204,256,https://www.flickr.com/photos/cosmicherb70/31022826954,https://creativecommons.org/licenses/by/2.0/,Chris Combe,https://www.flickr.com/people/cosmicherb70/\n6708845c27e55878,https://c1.staticflickr.com/6/5803/30984144345_228926d7c8_o.jpg,0.25,0.0,1.0,0.45,739,508,https://www.flickr.com/photos/sebilden/30984144345/,https://creativecommons.org/licenses/by/2.0/,David J,https://www.flickr.com/people/sebilden/\nf1ede6125f7961ae,https://c1.staticflickr.com/9/8090/29453485415_b70db26831_o.jpg,0.0,0.25,0.5,1.0,844,239,https://www.flickr.com/photos/jetheriot/29453485415,https://creativecommons.org/licenses/by/2.0/,J E Theriot,https://www.flickr.com/people/jetheriot/\ncb30f24673a58ea7,https://c1.staticflickr.com/8/7552/27678728434_b5d07d9ec0_o.jpg,0.28125,0.25,0.84375,1.0,454,968,https://www.flickr.com/photos/serdal/27678728434,https://creativecommons.org/licenses/by/2.0/,Abdulla Al Muhairi,https://www.flickr.com/people/serdal/\n7f9994ebd0bfdaf0,https://c1.staticflickr.com/3/2706/32790667811_5de75a9833_o.jpg,0.0,0.25,0.5,1.0,405,830,https://flickr.com/65265630@N03/32790667811,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n9a1605b991c3f3a6,https://c1.staticflickr.com/8/7044/27015764431_c191dab476_o.jpg,0.0,0.0,0.666666666667,1.0,980,22,https://www.flickr.com/photos/davebloggs007/27015764431,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\n7ae071239f7a5528,https://c1.staticflickr.com/8/7315/28107544656_f0593b8f27_o.jpg,0.0,0.25,0.5625,1.0,110,222,https://www.flickr.com/photos/131967103@N02/28107544656/,https://creativecommons.org/licenses/by/2.0/,Ryan McMinds,https://www.flickr.com/people/131967103@N02/\nf9593ce618d910d1,https://c1.staticflickr.com/6/5563/31031386562_893033d841_o.jpg,0.0,0.5,0.75,1.0,273,254,https://www.flickr.com/photos/usdagov/31031386562,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n18b996ac3a3a73f3,https://c1.staticflickr.com/9/8039/29497816625_a4409030ae_o.jpg,0.334315169367,0.0,1.0,1.0,752,268,https://flickr.com/136709227@N02/29497816625,https://creativecommons.org/licenses/by/2.0/,m_momii,https://www.flickr.com/people/136709227@N02/\n2be29cc87e84c697,https://c1.staticflickr.com/1/279/32762996296_a87c27f895_o.jpg,0.333333333333,0.0,1.0,1.0,431,243,https://www.flickr.com/photos/codnewsroom/32762996296,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\nfafeb5faebffec24,https://c1.staticflickr.com/1/661/31713411775_c7309be837_o.jpg,0.5,0.25,1.0,1.0,820,967,https://www.flickr.com/photos/stevendepolo/31713411775/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n7c4f51f4657f51a2,https://c1.staticflickr.com/9/8774/27922652264_32e3f5094e_o.jpg,0.25,0.0,1.0,0.75,780,654,https://www.flickr.com/photos/78428166@N00/27922652264,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\nbb6d792f6abb5ca0,https://c1.staticflickr.com/8/7562/27496984413_a9ed59944a_o.jpg,0.46104815864,0.0,0.92209631728,0.75,672,78,https://www.flickr.com/photos/glorycycles/27496984413,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\ne63f759e388ededb,https://c1.staticflickr.com/1/601/31943939430_45aba24a42_o.jpg,0.438430311231,0.0,1.0,1.0,490,62,https://flickr.com/144695422@N04/31943939430,https://creativecommons.org/licenses/by/2.0/,Th\\317\\265Ts\\312\\213nd\\317\\265r\\317\\265Dem\\303\\270n,https://www.flickr.com/people/144695422@N04/\ndca9590ea4ed637c,https://c1.staticflickr.com/8/7551/26842648490_74d5185a86_o.jpg,0.0,0.0,0.5,0.75,100,287,https://www.flickr.com/photos/30478819@N08/26842648490/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n54680c73474e09e7,https://c1.staticflickr.com/6/5207/30148967406_9a99755637_o.jpg,0.4375,0.25,1.0,1.0,975,165,https://flickr.com/47445767@N05/30148967406,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n29a22db782d2fd6a,https://c1.staticflickr.com/6/5659/30657101871_a197dd1a00_o.jpg,0.0,0.0,0.5625,0.75,529,833,https://www.flickr.com/photos/mwichary/30657101871/,https://creativecommons.org/licenses/by/2.0/,Marcin Wichary,https://www.flickr.com/people/mwichary/\ne35ccc6d5a39ae8d,https://c1.staticflickr.com/9/8505/28725082423_234b20f019_o.jpg,0.248713235294,0.0,0.746139705882,0.75,822,688,https://www.flickr.com/photos/usacehq/28725082423/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Corps of Engineers,https://www.flickr.com/people/usacehq/\n8a5606fe892457f1,https://c1.staticflickr.com/6/5529/30360519474_a2b78e1e75_o.jpg,0.083044982699,0.0,1.0,1.0,539,436,https://www.flickr.com/photos/duncanh1/30360519474,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\n29c35e11a1e141c4,https://c1.staticflickr.com/1/590/32020854563_237be539e1_o.jpg,0.333333333333,0.0,1.0,1.0,327,674,https://www.flickr.com/photos/patrick_k59/32020854563/,https://creativecommons.org/licenses/by/2.0/,patrickkavanagh,https://www.flickr.com/people/patrick_k59/\n078f21706b83641b,https://c1.staticflickr.com/6/5601/31476511485_0b0a25cd35_o.jpg,0.4375,0.25,1.0,1.0,855,743,https://www.flickr.com/photos/sixteenmilesofstring/31476511485,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/\n7c31443d709ab381,https://c1.staticflickr.com/6/5484/29918739171_18b9d7fcfa_o.jpg,0.0,0.0,0.505555555556,0.75,896,717,https://www.flickr.com/photos/13476480@N07/29918739171,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\ne02d997b35e0b442,https://c1.staticflickr.com/9/8829/28875801295_6a5db65071_o.jpg,0.462962962963,0.0,1.0,1.0,704,835,https://www.flickr.com/photos/rooky_yootz/28875801295,https://creativecommons.org/licenses/by/2.0/,Rooky Yootz,https://www.flickr.com/people/rooky_yootz/\naaa4f3f9d6d61aa9,https://c1.staticflickr.com/1/340/31682668600_41752f303d_o.jpg,0.0,0.0,0.75,0.5625,442,583,https://flickr.com/10688882@N00/31682668600,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/\nfd141236af663861,https://c1.staticflickr.com/9/8262/29077105653_dea183b629_o.jpg,0.5,0.0,1.0,0.75,467,836,https://www.flickr.com/photos/86624586@N00/29077105653,https://creativecommons.org/licenses/by/2.0/,Kevin Walsh,https://www.flickr.com/people/86624586@N00/\n5d8b8eefc5c0e432,https://c1.staticflickr.com/8/7515/26696826553_5d59b2dc95_o.jpg,0.25,0.0,1.0,0.5625,683,511,https://www.flickr.com/photos/edenpictures/26696826553,https://creativecommons.org/licenses/by/2.0/,\"Eden, Janine and Jim\",https://www.flickr.com/people/edenpictures/\n1b40881dc6a8432d,https://c1.staticflickr.com/9/8682/28536791495_fcee082121_o.jpg,0.500736377025,0.25,1.0,1.0,990,77,https://www.flickr.com/photos/kopyshev/28536791495/,https://creativecommons.org/licenses/by/2.0/,E.Kopyszew,https://www.flickr.com/people/kopyshev/\n95b222eee8a7dbbd,https://c1.staticflickr.com/6/5711/29990952485_a5624c590d_o.jpg,0.248713235294,0.25,0.746139705882,1.0,694,821,https://flickr.com/8598276@N07/29990952485,https://creativecommons.org/licenses/by/2.0/,St. George&#x27;s School,https://www.flickr.com/people/stgeorgesschool/\ne6a5beaa1fa36656,https://c1.staticflickr.com/9/8238/29224288344_65154fca8f_o.jpg,0.0,0.0,0.5,0.75,752,874,https://www.flickr.com/photos/janitors/29224288344,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\nc57895292cecec98,https://c1.staticflickr.com/9/8541/28989012934_33cd25c9c8_o.jpg,0.0,0.00759493670886,1.0,1.0,979,402,https://www.flickr.com/photos/bethscupham/28989012934/,https://creativecommons.org/licenses/by/2.0/,Beth Scupham,https://www.flickr.com/people/bethscupham/\n8eaf4d45708d75bd,https://c1.staticflickr.com/6/5563/30913874193_f8f2373f42_o.jpg,0.333333333333,0.0,1.0,1.0,778,520,https://www.flickr.com/photos/quinet/30913874193,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nc596ed9fb2fee4ce,https://c1.staticflickr.com/1/491/31750724314_6f17e31706_o.jpg,0.25,0.0,1.0,0.5,499,764,https://www.flickr.com/photos/emilykneeter/31750724314/,https://creativecommons.org/licenses/by/2.0/,emilykneeter,https://www.flickr.com/people/emilykneeter/\n7143949bc3ad8c18,https://c1.staticflickr.com/8/7662/27294270804_381776b550_o.jpg,0.594621513944,0.0,1.0,0.75,317,561,https://www.flickr.com/photos/jsjgeology/27294270804,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n1a3bb0bb352b223d,https://c1.staticflickr.com/9/8663/28931914290_2dd75e3a4b_o.jpg,0.0,0.0,0.75,1.0,818,761,https://www.flickr.com/photos/moto_club4ag/28931914290,https://creativecommons.org/licenses/by/2.0/,Moto &quot;Club4AG&quot; Miwa,https://www.flickr.com/people/moto_club4ag/\nf586ddfe0bb4f4eb,https://c1.staticflickr.com/9/8069/28945270681_65307a24f8_o.jpg,0.578822733424,0.0,1.0,0.75,820,800,https://www.flickr.com/photos/playamongfriends/28945270681,https://creativecommons.org/licenses/by/2.0/,Play Among Friends Paf,https://www.flickr.com/people/playamongfriends/\nbe8169acb356b8c4,https://c1.staticflickr.com/9/8338/28290206163_f6ce0f8480_o.jpg,0.0,0.0,0.5,0.75,986,123,https://www.flickr.com/photos/cogdog/28290206163/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nf2f23a36004eb557,https://c1.staticflickr.com/8/7536/28689212552_a32e91803e_o.jpg,0.5,0.0,1.0,0.75,550,524,https://flickr.com/133138807@N08/28689212552,https://creativecommons.org/licenses/by/2.0/,Historic Bremen,https://www.flickr.com/people/historicbremen/\n9dcd438de5967196,https://c1.staticflickr.com/8/7660/26648941734_ee43c8a571_o.jpg,0.279801324503,0.0,0.559602649007,0.75,780,213,https://www.flickr.com/photos/thoseguys119/26648941734,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n9e4c88faac7f0c2b,https://c1.staticflickr.com/9/8765/28381940401_4d0071e61a_o.jpg,0.0,0.0,0.666666666667,1.0,973,325,https://www.flickr.com/photos/clairity/28381940401,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\n74fabf1e134c271f,https://c1.staticflickr.com/8/7435/26239306373_b4ca5cd42c_o.jpg,0.333333333333,0.0,1.0,1.0,981,853,https://www.flickr.com/photos/64933790@N00/26239306373,https://creativecommons.org/licenses/by/2.0/,Pato Novoa,https://www.flickr.com/people/64933790@N00/\na64251f6e28fad37,https://c1.staticflickr.com/9/8285/29511081261_9fea85d5a0_o.jpg,0.333333333333,0.0,1.0,1.0,566,219,https://flickr.com/28101583@N07/29511081261,https://creativecommons.org/licenses/by/2.0/,Drew  Jacksich,https://www.flickr.com/people/28101583@N07/\n32e12d8a103a439b,https://c1.staticflickr.com/8/7424/27695645882_a02f95f495_o.jpg,0.28125,0.0,0.84375,0.75,418,841,https://www.flickr.com/photos/stevendepolo/27695645882,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\ne0bb60dbb996bb51,https://c1.staticflickr.com/8/7306/27441406082_dbf935a198_o.jpg,0.0,0.0,0.75,1.0,991,419,https://flickr.com/29780474@N02/27441406082,https://creativecommons.org/licenses/by/2.0/,Phil Gayton,https://www.flickr.com/people/29780474@N02/\n3e88ded0184e1da6,https://c1.staticflickr.com/8/7288/28198881602_fd7ae2ac8a_o.jpg,0.0,0.0,0.5625,0.75,706,689,https://www.flickr.com/photos/brownpau/28198881602,https://creativecommons.org/licenses/by/2.0/,brownpau,https://www.flickr.com/people/brownpau/\na56287783b967908,https://c1.staticflickr.com/1/693/31719272195_30087b55c3_o.jpg,0.250923190547,0.0,0.75276957164,0.75,699,893,https://flickr.com/149503105@N07/31719272195,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/\nc163ddca3134248b,https://c1.staticflickr.com/6/5686/30896562702_e7a9d676fb_o.jpg,0.333333333333,0.0,1.0,1.0,981,326,https://www.flickr.com/photos/amslerpix/30896562702/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n4cd2891a67234792,https://c1.staticflickr.com/9/8001/29706605152_6566120f18_o.jpg,0.0,0.0,0.46875,0.75,739,874,https://flickr.com/97121495@N03/29706605152,https://creativecommons.org/licenses/by/2.0/,Tutto Giardinaggio,https://www.flickr.com/people/giardinaggioitalia/\n7ce92093adc792ae,https://c1.staticflickr.com/8/7775/28468263366_4e06033d75_o.jpg,0.0,0.0,0.522193211488,1.0,630,52,https://www.flickr.com/photos/cosdentbyslc/28468263366,https://creativecommons.org/licenses/by/2.0/,Sansern Kiattivejsoonthorn,https://www.flickr.com/people/cosdentbyslc/\n72bb08865292f257,https://c1.staticflickr.com/9/8267/30288769481_08099c71ae_o.jpg,0.0,0.25,0.5625,1.0,59,873,https://www.flickr.com/photos/treegrow/30288769481,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\na898c71911d849ac,https://c1.staticflickr.com/6/5833/30603905364_dc629d4578_o.jpg,0.0,0.0,0.423337856174,0.75,407,583,https://www.flickr.com/photos/eltb/30603905364,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n13f692e45aad3439,https://c1.staticflickr.com/8/7664/27109080771_106d18b888_o.jpg,0.438430311231,0.0,1.0,1.0,534,879,https://www.flickr.com/photos/annethelibrarian/27109080771,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/\ndc4ba9edda1e2a75,https://c1.staticflickr.com/6/5330/31024497612_503f07c3de_o.jpg,0.0,0.330871491876,1.0,1.0,407,637,https://www.flickr.com/photos/eltb/31024497612,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n98021ee63a92ccc4,https://c1.staticflickr.com/9/8879/28442080432_94aa5a289b_o.jpg,0.250923190547,0.25,0.75276957164,1.0,141,862,https://www.flickr.com/photos/25553993@N02/28442080432/,https://creativecommons.org/licenses/by/2.0/,Kev Chapman,https://www.flickr.com/people/25553993@N02/\ndca89b06c4ffbc15,https://c1.staticflickr.com/6/5496/30222849782_bbf1a5c8b3_o.jpg,0.0,0.0,1.0,0.681073025335,885,392,http://www.flickr.com/photos/90692748@N04/30222849782,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/\na930d9874c433701,https://c1.staticflickr.com/8/7569/28787709541_2f346aab39_o.jpg,0.0,0.25,0.497426470588,1.0,467,977,https://www.flickr.com/photos/toomore/28787709541,https://creativecommons.org/licenses/by/2.0/,Toomore Chiang,https://www.flickr.com/people/toomore/\ncba9c58bf6cddf57,https://c1.staticflickr.com/2/1538/26164372383_ed53df377a_o.jpg,0.276162790698,0.25,0.828488372093,1.0,22,846,https://www.flickr.com/photos/8269539@N04/26164372383,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n55cd954af11a1391,https://c1.staticflickr.com/6/5298/30123941021_be376bdc46_o.jpg,0.333333333333,0.0,1.0,1.0,561,292,https://www.flickr.com/photos/jill_carlson/30123941021,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\n761868af156972e8,https://c1.staticflickr.com/8/7744/28020662230_ab0a84d9ab_o.jpg,0.33185840708,0.0,1.0,1.0,401,620,https://www.flickr.com/photos/manunimaths/28020662230,https://creativecommons.org/licenses/by/2.0/,Manchester University Maths,https://www.flickr.com/people/manunimaths/\n0bc3e3100208ad72,https://c1.staticflickr.com/8/7377/27562233120_65ffcec8fe_o.jpg,0.0,0.473571428571,0.75,0.947142857143,524,803,https://www.flickr.com/photos/135431875@N04/27562233120,https://creativecommons.org/licenses/by/2.0/,jackcast2015,https://www.flickr.com/people/135431875@N04/\nae9c0ecb71672968,https://c1.staticflickr.com/8/7562/26918785252_19d103b332_o.jpg,0.0,0.25,0.5,1.0,806,904,https://www.flickr.com/photos/claude_wians/26918785252,https://creativecommons.org/licenses/by/2.0/,Claude Wians,https://www.flickr.com/people/claude_wians/\nd9a5854111e30c65,https://c1.staticflickr.com/1/383/30974094703_62880af999_o.jpg,0.28125,0.25,0.84375,1.0,875,474,https://www.flickr.com/photos/69203347@N03/30974094703,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n33d6e7cdca94542f,https://c1.staticflickr.com/8/7439/27569464966_f8b471ac72_o.jpg,0.312874251497,0.0,1.0,1.0,971,517,https://www.flickr.com/photos/tobinielsen/27569464966/,https://creativecommons.org/licenses/by/2.0/,Tobias Nielsen,https://www.flickr.com/people/tobinielsen/\n0b01ab8cf99dfbab,https://c1.staticflickr.com/8/7461/28261627474_eb047c1b7e_o.jpg,0.0,0.0,0.562330623306,1.0,971,759,https://www.flickr.com/photos/cristian_ibarra_santillan/28261627474,https://creativecommons.org/licenses/by/2.0/,Cristian Ibarra Santillan,https://www.flickr.com/people/cristian_ibarra_santillan/\n25c7e296f795b08e,https://c1.staticflickr.com/8/7322/27370359631_0264e691a4_o.jpg,0.0,0.0,0.5,0.75,706,911,https://www.flickr.com/photos/elsie/27370359631/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\n04f10fd536f3e07f,https://c1.staticflickr.com/8/7462/27569220896_fe1acae550_o.jpg,0.0,0.25,0.5,1.0,662,679,https://www.flickr.com/photos/yavuzcan/27569220896,https://creativecommons.org/licenses/by/2.0/,John Y. Can,https://www.flickr.com/people/yavuzcan/\ne8b38a1d7b60e6c6,https://c1.staticflickr.com/8/7302/27348447160_7bee20af71_o.jpg,0.0,0.25,0.5,1.0,875,484,https://www.flickr.com/photos/zigazou76/27348447160,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n5b279adcd2ec003f,https://c1.staticflickr.com/9/8526/28964407676_9395781cc8_o.jpg,0.25,0.28125,1.0,0.84375,739,618,https://www.flickr.com/photos/45909111@N00/28964407676,https://creativecommons.org/licenses/by/2.0/,Gwydion M. Williams,https://www.flickr.com/people/45909111@N00/\nceb2f3c043943789,https://c1.staticflickr.com/6/5648/31181552702_511d80d972_o.jpg,0.0,0.0,1.0,0.729938271605,532,396,https://www.flickr.com/photos/51764518@N02/31181552702,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n8b4dff4c47bbf9b5,https://c1.staticflickr.com/1/585/31651368356_f5b0811e4d_o.jpg,0.25,0.457373271889,1.0,1.0,324,870,https://www.flickr.com/photos/usfws_pacificsw/31651368356/,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/\n64e242996bb97f02,https://c1.staticflickr.com/9/8498/29496864004_ce8b1501ea_o.jpg,0.0,0.25,0.75,1.0,960,501,https://www.flickr.com/photos/naotakem/29496864004,https://creativecommons.org/licenses/by/2.0/,Naotake Murayama,https://www.flickr.com/people/naotakem/\n444c1d7cdc1fa734,https://c1.staticflickr.com/6/5692/30908652785_a638b2b43c_o.jpg,0.438671875,0.25,1.0,1.0,971,883,https://flickr.com/28435100@N00/30908652785,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/\n660d8f9f7e462b98,https://c1.staticflickr.com/1/481/32161070440_454711da70_o.jpg,0.249079528719,0.0,0.747238586156,0.75,752,873,https://www.flickr.com/photos/davehamster/32161070440,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n4220aef5af49487e,https://c1.staticflickr.com/6/5811/30537968012_75b06d5a12_o.jpg,0.0,0.0,0.75786163522,1.0,717,36,https://www.flickr.com/photos/benoit59/30537968012,https://creativecommons.org/licenses/by/2.0/,Benoit Brouillette,https://www.flickr.com/people/benoit59/\n125f61debb1abcf0,https://c1.staticflickr.com/8/7399/27589709090_6523758fbc_o.jpg,0.0,0.0,0.75,0.75,438,797,https://www.flickr.com/photos/mcleod/27589709090,https://creativecommons.org/licenses/by/2.0/,Scott McLeod,https://www.flickr.com/people/mcleod/\n113e0b0600756089,https://c1.staticflickr.com/1/426/31203834233_ab6fbffd99_o.jpg,0.0,0.0,0.666666666667,1.0,976,245,https://www.flickr.com/photos/mseeley1/31203834233,https://creativecommons.org/licenses/by/2.0/,Michael Seeley,https://www.flickr.com/people/mseeley1/\n8b1c711ecf5052a2,https://c1.staticflickr.com/1/270/32309116380_22a868035f_o.jpg,0.266552511416,0.25,0.799657534247,1.0,33,510,https://flickr.com/95098864@N08/32309116380,https://creativecommons.org/licenses/by/2.0/,S. Rohrlach,https://www.flickr.com/people/95098864@N08/\ne17b93ee3cbe1f0c,https://c1.staticflickr.com/6/5540/31861199675_8fb2ac831b_o.jpg,0.0,0.415071770335,0.75,1.0,438,582,https://www.flickr.com/photos/telecastered/31861199675,https://creativecommons.org/licenses/by/2.0/,C. J. Lee,https://www.flickr.com/people/telecastered/\n3290f9013579708e,https://c1.staticflickr.com/9/8289/28481003462_d56fdea7b8_o.jpg,0.0,0.0,0.747269890796,1.0,520,815,https://www.flickr.com/photos/13476480@N07/28481003462,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n225a3247d50b337e,https://c1.staticflickr.com/6/5477/30503009703_1a96f88ef4_o.jpg,0.544126884422,0.25,0.906878140704,1.0,405,679,https://www.flickr.com/photos/hisgett/30503009703,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\na5d3dac18308ce56,https://c1.staticflickr.com/9/8249/28563027224_36acb53ed0_o.jpg,0.0,0.25,0.498159057437,1.0,402,579,https://www.flickr.com/photos/revenidas/28563027224/,https://creativecommons.org/licenses/by/2.0/,Festival Revenidas Vilaxo\\303\\241n - Vilagarc\\303\\255a de Arousa,https://www.flickr.com/people/revenidas/\n08becc57d8b4e09f,https://c1.staticflickr.com/8/7121/27190874346_d6f125af53_o.jpg,0.5,0.25,1.0,1.0,321,626,https://www.flickr.com/photos/markyharky/27190874346,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n9513eb11008f881b,https://c1.staticflickr.com/9/8727/28110642194_b054e181d2_o.jpg,0.0,0.25,0.5,1.0,984,894,https://www.flickr.com/photos/flowcomm/28110642194,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\nc5a8c57a4182713e,https://c1.staticflickr.com/8/7498/29052466924_c816d86684_o.jpg,0.0,0.25,0.5,1.0,653,596,https://www.flickr.com/photos/agenciabrasilia/29052466924,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n46be04fec5396821,https://c1.staticflickr.com/9/8840/28397721992_5366cf2ab4_o.jpg,0.25,0.0,1.0,1.0,373,62,https://flickr.com/21822583@N08/28397721992,https://creativecommons.org/licenses/by/2.0/,Chuck Moravec,https://www.flickr.com/people/21822583@N08/\n53f943edb8b87a88,https://c1.staticflickr.com/1/719/30787951403_33d5430476_o.jpg,0.331130690162,0.0,0.993392070485,1.0,891,517,https://www.flickr.com/photos/inzingvolley/30787951403/,https://creativecommons.org/licenses/by/2.0/,inzingvolley,https://www.flickr.com/people/inzingvolley/\n76c5c3f0b1e42013,https://c1.staticflickr.com/8/7170/27462433602_b856145314_o.jpg,0.4108,0.25,1.0,1.0,976,918,http://www.flickr.com/photos/david_e_smith/27462433602/,https://creativecommons.org/licenses/by/2.0/,Dave_S.,https://www.flickr.com/people/david_e_smith/\n839486be1b6a3958,https://c1.staticflickr.com/1/656/32355061431_23c51ae2be_o.jpg,0.283163265306,0.0,0.849489795918,0.75,304,929,https://www.flickr.com/photos/33398884@N03/32355061431,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\n95317842bb643029,https://c1.staticflickr.com/1/269/31690663903_3b564b163a_o.jpg,0.0,0.0,0.508928571429,0.75,699,805,https://www.flickr.com/photos/hisgett/31690663903/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\nd64963a602d283d6,https://c1.staticflickr.com/9/8850/28474636751_6fe57426bb_o.jpg,0.5,0.0,1.0,0.75,512,796,http://www.flickr.com/photos/daveseven/28474636751/,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/\nd29d5de4b2500582,https://c1.staticflickr.com/3/2928/32889519271_f75f051fef_o.jpg,0.0,0.25,1.0,1.0,254,203,https://www.flickr.com/photos/70253321@N00/32889519271,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/\n4f757f02399f7557,https://c1.staticflickr.com/6/5828/31143216666_b9f9349c4a_o.jpg,0.0,0.0,0.5625,0.75,875,621,https://flickr.com/36548767@N08/31143216666,https://creativecommons.org/licenses/by/2.0/,Matt Davis,https://www.flickr.com/people/pics-by-mpd/\n855e732b98135dc5,https://c1.staticflickr.com/9/8640/27615857214_76b77ca7f3_o.jpg,0.28125,0.0,0.84375,0.75,922,806,https://www.flickr.com/photos/13476480@N07/27615857214,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n52c3048559795aea,https://c1.staticflickr.com/6/5209/29437493514_1678c5b498_o.jpg,0.5,0.25,1.0,1.0,699,620,https://www.flickr.com/photos/dakone2k/29437493514,https://creativecommons.org/licenses/by/2.0/,Daniel Cruz Valle,https://www.flickr.com/people/dakone2k/\nd8e20d55405079b6,https://c1.staticflickr.com/6/5665/31350189855_51f5a4d267_o.jpg,0.25,0.0,1.0,0.468616262482,400,88,https://www.flickr.com/photos/abukij/31350189855,https://creativecommons.org/licenses/by/2.0/,Paolo Gamba,https://www.flickr.com/people/abukij/\ndc6c693d02709dc7,https://c1.staticflickr.com/9/8757/28162619984_060ef8a7ef_o.jpg,0.333333333333,0.0,1.0,1.0,971,338,https://www.flickr.com/photos/kittysfotos/28162619984/,https://creativecommons.org/licenses/by/2.0/,Kitty Terwolbeck,https://www.flickr.com/people/kittysfotos/\n7701a1fab5ff274d,https://c1.staticflickr.com/8/7116/26195328093_f0a46639ea_o.jpg,0.0,0.0,0.666666666667,1.0,769,797,https://www.flickr.com/photos/132091501@N05/26195328093,https://creativecommons.org/licenses/by/2.0/,Saffar Abdalah,https://www.flickr.com/people/132091501@N05/\ndaa305a15b3b2bf6,https://c1.staticflickr.com/6/5488/31175178596_37396d227d_o.jpg,0.28125,0.25,0.84375,1.0,335,108,https://www.flickr.com/photos/lotzman/31175178596/,https://creativecommons.org/licenses/by/2.0/,Lotzman Katzman,https://www.flickr.com/people/lotzman/\n7dbee05936bc2af5,https://c1.staticflickr.com/9/8811/28768874571_682cf179ba_o.jpg,0.25,0.25,1.0,1.0,641,701,https://flickr.com/79121338@N05/28768874571,https://creativecommons.org/licenses/by/2.0/,molybdena,https://www.flickr.com/people/molybdena/\nf5938c0ba2671127,https://c1.staticflickr.com/6/5832/30657356552_fff86def79_o.jpg,0.265174506829,0.25,0.795523520486,1.0,704,396,https://www.flickr.com/photos/fade_to_gray/30657356552/,https://creativecommons.org/licenses/by/2.0/,Steve Gray,https://www.flickr.com/people/fade_to_gray/\n2cf1890535bdfe45,https://c1.staticflickr.com/9/8244/29100529872_548883758d_o.jpg,0.25,0.5,1.0,1.0,341,569,https://www.flickr.com/photos/flowcomm/29100529872,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\n3970125c7f3845c2,https://c1.staticflickr.com/2/1504/26498565700_f171b2fb50_o.jpg,0.0,0.0,0.666666666667,1.0,78,189,https://www.flickr.com/photos/scubabix/26498565700/,https://creativecommons.org/licenses/by/2.0/,Rob Bixby,https://www.flickr.com/people/scubabix/\n6b7268b84c3d1ff3,https://c1.staticflickr.com/8/7360/28042045755_1ab9c8e7bf_o.jpg,0.0,0.0,0.622507122507,1.0,437,652,https://www.flickr.com/photos/autohistorian/28042045755,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\na0ecb562faed7578,https://c1.staticflickr.com/6/5793/31288187911_686f8cfe36_o.jpg,0.0,0.0,1.0,1.0,986,866,https://www.flickr.com/photos/church4u2/31288187911,https://creativecommons.org/licenses/by/2.0/,Church Iglesia,https://www.flickr.com/people/church4u2/\nbc9e06df87a9fd67,https://c1.staticflickr.com/6/5735/30124758512_9d0b4cff09_o.jpg,0.0,0.0,0.5625,0.75,294,34,http://www.flickr.com/photos/41173345@N03/30124758512/,https://creativecommons.org/licenses/by/2.0/,stuart Burns,https://www.flickr.com/people/41173345@N03/\n4a9b2d0b72843b1a,https://c1.staticflickr.com/6/5333/30022388233_d0b05760bd_o.jpg,0.0,0.0,0.5625,0.75,699,123,http://www.flickr.com/photos/viewpix69/30022388233/,https://creativecommons.org/licenses/by/2.0/,Torsten Scholz,https://www.flickr.com/people/viewpix69/\ne3fb28cd64b13ed5,https://c1.staticflickr.com/6/5742/29926834175_394bee9b22_o.jpg,0.0,0.331771720613,0.75,1.0,595,759,https://www.flickr.com/photos/dalbera/29926834175/,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n9d664c2b5f04ebac,https://c1.staticflickr.com/8/7406/27927833412_5dcfcebcb7_o.jpg,0.0,0.0,0.666666666667,1.0,921,565,https://www.flickr.com/photos/dietertimmerman/27927833412,https://creativecommons.org/licenses/by/2.0/,dietertimmerman,https://www.flickr.com/people/dietertimmerman/\nafdbbb7c7e048430,https://c1.staticflickr.com/9/8294/29813211935_24b0c3e629_o.jpg,0.0,0.0,1.0,1.0,942,327,https://www.flickr.com/photos/55229469@N07/29813211935,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\n988b109a1bcce5f5,https://c1.staticflickr.com/8/7321/27128939333_ba9e5df069_o.jpg,0.0,0.25,0.506305637982,1.0,133,122,https://www.flickr.com/photos/mark-gunn/27128939333,https://creativecommons.org/licenses/by/2.0/,Mark  Gunn,https://www.flickr.com/people/mark-gunn/\n3c542a0f17fe5a24,https://c1.staticflickr.com/8/7113/26487835633_159d4fdf55_o.jpg,0.0,0.0,0.5,0.75,100,372,https://www.flickr.com/photos/watts_photos/26487835633,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/\na7216f09bce63dd1,https://c1.staticflickr.com/9/8223/28996170696_3f12744f92_o.jpg,0.333333333333,0.0,1.0,1.0,896,889,https://www.flickr.com/photos/markyharky/28996170696/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\ncef05ec921473b84,https://c1.staticflickr.com/4/3936/33113926401_9f4286510b_o.jpg,0.0,0.25,0.5,1.0,613,886,https://www.flickr.com/photos/31029865@N06/33113926401/,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/\ncf63d8a5d9d6d393,https://c1.staticflickr.com/9/8771/28268880026_aba3f8ed40_o.jpg,0.421177266576,0.0,0.842354533153,0.75,400,478,https://www.flickr.com/photos/anakbrunei/28268880026,https://creativecommons.org/licenses/by/2.0/,Reedz Malik,https://www.flickr.com/people/anakbrunei/\nb301910b6e183645,https://c1.staticflickr.com/6/5598/30868276785_c936fd9735_o.jpg,0.5,0.0,1.0,0.75,747,507,https://www.flickr.com/photos/usarak/30868276785,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/\n17a41a693e97f9c6,https://c1.staticflickr.com/1/631/32284537270_083ebd8c88_o.jpg,0.0,0.0,0.499263622975,0.75,98,560,https://www.flickr.com/photos/markyharky/32284537270/,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n648eea4c3f83d4c3,https://c1.staticflickr.com/8/7417/26989227990_21f257d6ee_o.jpg,0.280784844384,0.0,0.842354533153,1.0,580,481,https://www.flickr.com/photos/mujitra/26989227990,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/\nf126713ff16704b1,https://c1.staticflickr.com/6/5558/30889292972_6bc38b4942_o.jpg,0.5,0.25,1.0,1.0,519,111,https://www.flickr.com/photos/box_repsol/30889292972,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n72ade9dab2795e3d,https://c1.staticflickr.com/9/8479/29020117825_0ebf1c0f37_o.jpg,0.28125,0.25,0.84375,1.0,498,926,https://www.flickr.com/photos/nh53/29020117825/,https://creativecommons.org/licenses/by/2.0/,NH53,https://www.flickr.com/people/nh53/\nd089896392c68f10,https://c1.staticflickr.com/8/7676/27575473564_8a07db0c9f_o.jpg,0.0,0.0,0.663235294118,1.0,928,796,https://www.flickr.com/photos/theocrazzolara/27575473564,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/\n736bde2d77ab76cf,https://c1.staticflickr.com/9/8657/28092660714_e2ed20c007_o.jpg,0.0,0.25,0.5,1.0,431,749,https://www.flickr.com/photos/fotosagenciabrasil/28092660714,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/\n590d117da8cecf09,https://c1.staticflickr.com/9/8178/28139411434_40ca93b550_o.jpg,0.711926091825,0.25,1.0,1.0,859,346,https://www.flickr.com/photos/zeevveez/28139411434,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/\n5600931b0bc5e2ff,https://c1.staticflickr.com/8/7787/28643992233_072b3bc01c_o.jpg,0.0,0.0,0.75,0.503698224852,888,979,https://www.flickr.com/photos/eltb/28643992233,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n41de765272d2dd41,https://c1.staticflickr.com/8/7320/27288641451_aee0a9e29f_o.jpg,0.25,0.25,1.0,1.0,442,518,https://www.flickr.com/photos/byzantiumbooks/27288641451,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/\n95df6185b3ae3155,https://c1.staticflickr.com/9/8640/29967406040_bdabba2067_o.jpg,0.248713235294,0.25,0.746139705882,1.0,758,531,https://www.flickr.com/photos/12463666@N03/29967406040,https://creativecommons.org/licenses/by/2.0/,Bob  M ~,https://www.flickr.com/people/12463666@N03/\na82d167901459bcd,https://c1.staticflickr.com/6/5560/30883303462_a6ed36361c_o.jpg,0.25,0.0,1.0,1.0,818,774,https://www.flickr.com/photos/kbl_luccia/30883303462,https://creativecommons.org/licenses/by/2.0/,\"K.B.L. Luccia Por ahora , descanso\",https://www.flickr.com/people/kbl_luccia/\n5741a8c17c8ccced,https://c1.staticflickr.com/1/422/31743804854_e09252dd9a_o.jpg,0.421177266576,0.0,0.842354533153,0.75,953,72,https://www.flickr.com/photos/plants_of_russian_in_brazil/31743804854,https://creativecommons.org/licenses/by/2.0/,\"Alex Popovkin, Bahia, Brazil\",https://www.flickr.com/people/plants_of_russian_in_brazil/\n1b1a987b0254baa2,https://c1.staticflickr.com/8/7231/26354225584_cb3d0f65d4_o.jpg,0.4375,0.0,1.0,0.75,484,146,https://www.flickr.com/photos/ewolivera/26354225584,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/\n09fab8b52e474cb8,https://c1.staticflickr.com/6/5489/30780404330_7267843fc4_o.jpg,0.0,0.0,0.666666666667,1.0,340,524,https://www.flickr.com/photos/effjohn/30780404330,https://creativecommons.org/licenses/by/2.0/,Hammerin Man,https://www.flickr.com/people/effjohn/\nfbe31e931a5f5f3b,https://c1.staticflickr.com/8/7446/27844620366_ff816b2bf3_o.jpg,0.25,0.0,1.0,0.75,672,892,https://www.flickr.com/photos/glorycycles/27844620366,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\nca843c9c5c17f7e5,https://c1.staticflickr.com/9/8626/29490045166_6aac914572_o.jpg,0.249631811487,0.0,0.748895434462,0.75,880,114,https://www.flickr.com/photos/85264217@N04/29490045166,https://creativecommons.org/licenses/by/2.0/,Retis,https://www.flickr.com/people/85264217@N04/\nf59a36bf29009362,https://c1.staticflickr.com/6/5504/30313485110_3160cef910_o.jpg,0.5,0.0,1.0,0.75,468,625,https://www.flickr.com/photos/dany13/30313485110,https://creativecommons.org/licenses/by/2.0/,dany13,https://www.flickr.com/people/dany13/\ne5a2371748adebab,https://c1.staticflickr.com/9/8357/27757009513_7f1c780ced_o.jpg,0.28125,0.0,0.84375,0.75,735,877,https://www.flickr.com/photos/27665395@N05/27757009513,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nd4b04154ee8a4bcb,https://c1.staticflickr.com/6/5547/30492629744_1436527d03_o.jpg,0.28125,0.0,0.84375,0.75,866,70,https://www.flickr.com/photos/r00s/30492629744/,https://creativecommons.org/licenses/by/2.0/,Ro\\315\\254\\315\\254\\315\\240\\315\\240\\315\\241\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240s\\315\\254\\315\\254\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240a\\315\\254\\315\\254\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240\\315\\240 Menkman,https://www.flickr.com/people/r00s/\n310573b6fff96f0e,https://c1.staticflickr.com/9/8677/28011856750_2ae9f1e05a_o.jpg,0.25,0.25,0.75,1.0,618,630,https://www.flickr.com/photos/praxinoscope/28011856750/,https://creativecommons.org/licenses/by/2.0/,David Wagner,https://www.flickr.com/people/praxinoscope/\n7584feefb592d76c,https://c1.staticflickr.com/8/7786/27131835606_7a834e911f_o.jpg,0.25,0.0,0.75,0.75,914,536,https://www.flickr.com/photos/80901381@N04/27131835606,https://creativecommons.org/licenses/by/2.0/,A Guy Taking Pictures,https://www.flickr.com/people/80901381@N04/\ndcd002b4437c9c41,https://c1.staticflickr.com/6/5474/30922908345_b205f0c3fd_o.jpg,0.25,0.5,1.0,1.0,341,491,https://www.flickr.com/photos/happymillerman/30922908345,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\n86f7a83daf4d76a2,https://c1.staticflickr.com/9/8251/29554135635_35275fe21b_o.jpg,0.0,0.25,0.510044642857,1.0,561,285,https://www.flickr.com/photos/jill_carlson/29554135635,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\n15c16cd33dfde1e1,https://c1.staticflickr.com/9/8819/29346895372_4f8855895f_o.jpg,0.0,0.264758497317,0.75,1.0,511,470,http://www.flickr.com/photos/39410905@N06/29346895372,https://creativecommons.org/licenses/by/2.0/,LetNoun,https://www.flickr.com/people/lasuperlili/\n9953ce985663bdaf,https://c1.staticflickr.com/9/8223/29337902040_0005a3a69c_o.jpg,0.0,0.0,0.5625,0.75,826,820,https://www.flickr.com/photos/eamoncurry/29337902040/,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/\n765773377a788933,https://c1.staticflickr.com/6/5762/30010694073_19645072fe_o.jpg,0.381557377049,0.0,1.0,0.75,310,49,https://flickr.com/59324099@N02/30010694073,https://creativecommons.org/licenses/by/2.0/,joe m devereux,https://www.flickr.com/people/joe_devereux/\n9de01e91313544a4,https://c1.staticflickr.com/9/8078/29676826672_a122a792b1_o.jpg,0.25,0.0,0.75,0.75,570,711,https://www.flickr.com/photos/shankaronline/29676826672,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n0dfc61f215f7eeec,https://c1.staticflickr.com/9/8584/28742993973_7119246944_o.jpg,0.0,0.0,0.666666666667,1.0,480,626,https://www.flickr.com/photos/concavowheels/28742993973,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/\n2687739254a5129d,https://c1.staticflickr.com/8/7167/26579413503_e17338db9d_o.jpg,0.0,0.0,0.767405063291,1.0,820,759,https://www.flickr.com/photos/julioenriquez/26579413503,https://creativecommons.org/licenses/by/2.0/,Julio Enriquez,https://www.flickr.com/people/julioenriquez/\n3aec0246db973517,https://c1.staticflickr.com/6/5340/30294553360_7614ed3a96_o.jpg,0.210588633288,0.25,0.631765899865,1.0,977,577,https://flickr.com/38986305@N06/30294553360,https://creativecommons.org/licenses/by/2.0/,Andrew,https://www.flickr.com/people/arg_flickr/\n6c878ddd0f6f0958,https://c1.staticflickr.com/6/5331/30493495430_48f246cd4e_o.jpg,0.25,0.0,1.0,0.75,979,850,https://www.flickr.com/photos/valerialaura/30493495430/,https://creativecommons.org/licenses/by/2.0/,valerialaura,https://www.flickr.com/people/valerialaura/\n401b50207045097d,https://c1.staticflickr.com/8/7502/26591831144_741826ddb9_o.jpg,0.0,0.25,0.5625,1.0,964,842,https://www.flickr.com/photos/isfullofcrap/26591831144/,https://creativecommons.org/licenses/by/2.0/,R. Crap Mariner,https://www.flickr.com/people/isfullofcrap/\n8dd602811685ff81,https://c1.staticflickr.com/9/8386/29292009991_ae11c9561c_o.jpg,0.286971830986,0.0,1.0,0.75,324,964,https://www.flickr.com/photos/usfws_pacificsw/29292009991,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/\n00e0c970bacdb5a6,https://c1.staticflickr.com/9/8379/29650047461_935c6027b3_o.jpg,0.0,0.0,0.75,0.75,672,513,https://www.flickr.com/photos/glorycycles/29650047461,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n0a8efb41714a2de5,https://c1.staticflickr.com/6/5787/30401929714_61ca8d97e9_o.jpg,0.0,0.0,0.411096256684,0.75,979,319,https://www.flickr.com/photos/walterpro/30401929714,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/\ne14b7963298b695b,https://c1.staticflickr.com/9/8554/29738031844_b0ab0c77a0_o.jpg,0.4375,0.25,1.0,1.0,270,422,https://www.flickr.com/photos/torsten-behrens/29738031844,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/\n02627b4c9daac07a,https://c1.staticflickr.com/6/5786/30421357366_c9c2b3546d_o.jpg,0.238832853026,0.25,0.716498559078,1.0,821,791,https://www.flickr.com/photos/robalter/30421357366/,https://creativecommons.org/licenses/by/2.0/,Rob Alter,https://www.flickr.com/people/robalter/\nf56006c1bcc52633,https://c1.staticflickr.com/8/7577/27091204584_1603d409f0_o.jpg,0.0,0.0,1.0,0.666666666667,702,773,https://www.flickr.com/photos/7armyjmtc/27091204584/,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n8b21342e13cfee01,https://c1.staticflickr.com/1/740/32388874626_01894de438_o.jpg,0.0,0.0,0.666666666667,1.0,897,771,https://www.flickr.com/photos/franganillo/32388874626,https://creativecommons.org/licenses/by/2.0/,Jorge Franganillo,https://www.flickr.com/people/franganillo/\n2c01bbf8f18cb741,https://c1.staticflickr.com/8/7425/27801100261_2dfa7f0042_o.jpg,0.25,0.0,1.0,1.0,476,498,https://www.flickr.com/photos/eekim/27801100261/,https://creativecommons.org/licenses/by/2.0/,Eugene Kim,https://www.flickr.com/people/eekim/\n6b2f7747b363c30a,https://c1.staticflickr.com/9/8003/29316372461_4b4e01e58f_o.jpg,0.498153618907,0.25,1.0,1.0,998,322,https://www.flickr.com/photos/frankdouwes/29316372461/,https://creativecommons.org/licenses/by/2.0/,Frank Douwes,https://www.flickr.com/people/frankdouwes/\n715e4536de9f5369,https://c1.staticflickr.com/6/5593/30047484064_774e7a2c7c_o.jpg,0.4375,0.0,1.0,0.75,874,574,https://flickr.com/43547009@N00/30047484064,https://creativecommons.org/licenses/by/2.0/,Alejandro,https://www.flickr.com/people/43547009@N00/\n605a84176c6c8a0c,https://c1.staticflickr.com/9/8184/29320183365_52da3e9f93_o.jpg,0.0,0.0,0.666666666667,1.0,735,619,https://www.flickr.com/photos/kecko/29320183365,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\nf6ebb8d09dbdcaa5,https://c1.staticflickr.com/8/7109/26279538634_49a705183f_o.jpg,0.337738619677,0.0,1.0,1.0,980,243,https://www.flickr.com/photos/eguidetravel/26279538634/,https://creativecommons.org/licenses/by/2.0/,eGuide Travel,https://www.flickr.com/people/eguidetravel/\n6939eaa8c39f0522,https://c1.staticflickr.com/6/5820/30486735176_fd6438c9be_o.jpg,0.0,0.25,0.75,1.0,108,747,https://flickr.com/13939889@N07/30486735176,https://creativecommons.org/licenses/by/2.0/,Bodie Strain,https://www.flickr.com/people/pumpkinmook/\n123341246bb60f7f,https://c1.staticflickr.com/6/5600/30985472490_267649bea4_o.jpg,0.249079528719,0.25,0.747238586156,1.0,980,472,https://flickr.com/91171949@N06/30985472490,https://creativecommons.org/licenses/by/2.0/,Kyle Hartshorn,https://www.flickr.com/people/kylehartshorn/\ncbf7967ec4655bff,https://c1.staticflickr.com/9/8642/28183893325_69a4b7e3c0_o.jpg,0.0,0.0,0.75,1.0,346,522,https://www.flickr.com/photos/pollybear/28183893325/,https://creativecommons.org/licenses/by/2.0/,Paula J Andrews,https://www.flickr.com/people/pollybear/\n885505ab0dd7ebe1,https://c1.staticflickr.com/1/381/31552945352_e2131d5e3b_o.jpg,0.0,0.0,0.526475037821,0.75,991,712,https://flickr.com/141324643@N05/31552945352,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/\n3b66afbab247b85a,https://c1.staticflickr.com/6/5581/30789369671_c41ca1b33d_o.jpg,0.25,0.0,1.0,0.75,934,436,https://www.flickr.com/photos/lablasco/30789369671,https://creativecommons.org/licenses/by/2.0/,Lablascovegmenu,https://www.flickr.com/people/lablasco/\n00d3094857416925,https://c1.staticflickr.com/8/7194/26261734164_eed31f0632_o.jpg,0.28125,0.0,0.84375,0.75,821,691,https://www.flickr.com/photos/shankaronline/26261734164,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nd273531739675b8a,https://c1.staticflickr.com/6/5790/25327963819_b3bee7e712_o.jpg,0.0,0.0,0.75,1.0,577,971,https://www.flickr.com/photos/127226743@N02/25327963819,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\nbdb527a37a5a1fe9,https://c1.staticflickr.com/6/5475/30284059325_548287ab94_o.jpg,0.0,0.318903318903,1.0,0.95670995671,93,391,https://www.flickr.com/photos/kkoshy/30284059325,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/\n622bc4c3996a2699,https://c1.staticflickr.com/8/7073/27050479131_eb8dff661d_o.jpg,0.187296416938,0.0,1.0,1.0,566,703,https://www.flickr.com/photos/jsjgeology/27050479131,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ne50f8c658d6132e7,https://c1.staticflickr.com/8/7087/26993333580_bbe962f87e_o.jpg,0.0,0.0,0.868686868687,1.0,22,940,https://www.flickr.com/photos/lakeworth/26993333580,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/\nf2de6d42f72a1600,https://c1.staticflickr.com/6/5484/30178740233_23de43eed5_o.jpg,0.0,0.0,0.5625,0.75,769,618,https://www.flickr.com/photos/stmunchins/30178740233/,https://creativecommons.org/licenses/by/2.0/,St Munchin&#x27;s College,https://www.flickr.com/people/stmunchins/\n29a1066827fcfaca,https://c1.staticflickr.com/8/7035/26986322956_7b5f1678ab_o.jpg,0.333333333333,0.0,1.0,1.0,450,360,https://www.flickr.com/photos/gammaman/26986322956,https://creativecommons.org/licenses/by/2.0/,Eli Christman,https://www.flickr.com/people/gammaman/\nd69035d8ddf0c6c4,https://c1.staticflickr.com/1/736/31550457204_d8f481759a_o.jpg,0.524100719424,0.25,1.0,1.0,972,451,https://www.flickr.com/photos/jlcernadas/31550457204,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\n629dbc90ddc898c7,https://c1.staticflickr.com/6/5510/30483562636_229be5d554_o.jpg,0.333333333333,0.0,1.0,1.0,494,903,https://www.flickr.com/photos/quinet/30483562636,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nd8770dd36b042d91,https://c1.staticflickr.com/6/5591/31650977595_53dc0a2cbe_o.jpg,0.285496183206,0.0,1.0,1.0,461,739,https://www.flickr.com/photos/ruthanddave/31650977595,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n05f38bd1f0b31576,https://c1.staticflickr.com/6/5191/29462715614_a2ea879645_o.jpg,0.5,0.0,1.0,0.75,920,739,https://www.flickr.com/photos/phalinn/29462715614,https://creativecommons.org/licenses/by/2.0/,Phalinn Ooi,https://www.flickr.com/people/phalinn/\nbdbb2bec25a83a24,https://c1.staticflickr.com/8/7301/28138669285_b4b3d4592a_o.jpg,0.4375,0.0,1.0,0.75,921,407,https://www.flickr.com/photos/nostri-imago/28138669285,https://creativecommons.org/licenses/by/2.0/,Cliff,https://www.flickr.com/people/nostri-imago/\n625fb77a09573694,https://c1.staticflickr.com/1/357/32049332851_3db63ae9d5_o.jpg,0.0,0.0,0.5,0.75,113,713,https://www.flickr.com/photos/30478819@N08/32049332851,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n830df6c646b6bd0f,https://c1.staticflickr.com/8/7569/26723298433_c9c7cc45f0_o.jpg,0.333333333333,0.0,1.0,1.0,519,61,https://www.flickr.com/photos/box_repsol/26723298433,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n44fe36c085b818f3,https://c1.staticflickr.com/6/5641/30470585256_5f73640eeb_o.jpg,0.333333333333,0.0,1.0,1.0,976,82,https://flickr.com/22539273@N00/30470585256,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n8a416ae789510724,https://c1.staticflickr.com/6/5344/30267876071_d23abec4c5_o.jpg,0.0,0.333333333333,1.0,1.0,662,832,https://www.flickr.com/photos/136315829@N03/30267876071,https://creativecommons.org/licenses/by/2.0/,Steven Penton,https://www.flickr.com/people/136315829@N03/\n6050642b5cfe714b,https://c1.staticflickr.com/1/574/32106171394_bdc35c3fbc_o.jpg,0.322931785196,0.0,0.968795355588,1.0,437,795,https://flickr.com/51811543@N08/32106171394,https://creativecommons.org/licenses/by/2.0/,FotoSleuth,https://www.flickr.com/people/51811543@N08/\nd3937b9667d93809,https://c1.staticflickr.com/1/413/30787682764_b52b058206_o.jpg,0.5,0.25,1.0,1.0,974,814,https://flickr.com/39136124@N00/30787682764,https://creativecommons.org/licenses/by/2.0/,Paul Asman and Jill Lenoble,https://www.flickr.com/people/pauljill/\nf76279266a6916d7,https://c1.staticflickr.com/8/7398/28053745062_2022a29ef6_o.jpg,0.331130690162,0.0,0.993392070485,1.0,391,873,https://www.flickr.com/photos/usfwsmidwest/28053745062,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n11c3e8529b2def7b,https://c1.staticflickr.com/1/322/31464098074_3c4e917dd4_o.jpg,0.0,0.25,0.5,1.0,760,738,https://www.flickr.com/photos/andrikoolme/31464098074/,https://creativecommons.org/licenses/by/2.0/,Andri Koolme,https://www.flickr.com/people/andrikoolme/\n6ef643e8694cd3ca,https://c1.staticflickr.com/9/8732/28090605564_53e043c41c_o.jpg,0.421177266576,0.0,0.842354533153,0.75,909,821,https://www.flickr.com/photos/mickaeltr/28090605564/,https://creativecommons.org/licenses/by/2.0/,Micka\\303\\253l T.,https://www.flickr.com/people/mickaeltr/\n3c6d10d940fe8dae,https://c1.staticflickr.com/1/498/31621281492_86e87aeb01_o.jpg,0.0,0.0,0.5,0.75,735,682,https://www.flickr.com/photos/andreastrojak/31621281492/,https://creativecommons.org/licenses/by/2.0/,Andreas Trojak,https://www.flickr.com/people/andreastrojak/\n45620678a9586d99,https://c1.staticflickr.com/1/282/31791435121_0150b5a858_o.jpg,0.28125,0.25,0.84375,1.0,670,145,https://www.flickr.com/photos/zeevveez/31791435121,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/\n9c58d57a28c355aa,https://c1.staticflickr.com/6/5825/31259630645_87bd1af7d8_o.jpg,0.431603773585,0.0,1.0,0.75,881,699,https://www.flickr.com/photos/29233640@N07/31259630645,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/\nf120df4b3b09b289,https://c1.staticflickr.com/6/5480/30057646853_6fe3c055a2_o.jpg,0.491071428571,0.0,1.0,0.75,780,883,https://www.flickr.com/photos/thoseguys119/30057646853,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nf941b668a6c3d49a,https://c1.staticflickr.com/1/469/31467759930_533c55f54d_o.jpg,0.0,0.0,0.87037037037,1.0,981,503,https://www.flickr.com/photos/shakespearesmonkey/31467759930/,https://creativecommons.org/licenses/by/2.0/,Shakespearesmonkey,https://www.flickr.com/people/shakespearesmonkey/\nf7d47df278bcf02c,https://c1.staticflickr.com/9/8776/28835389986_9502897177_o.jpg,0.331617647059,0.0,0.994852941176,1.0,699,909,https://www.flickr.com/photos/13476480@N07/28835389986,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n5bb9b1b99c966d31,https://c1.staticflickr.com/8/7539/26290478514_1121af27f2_o.jpg,0.267938931298,0.25,0.803816793893,1.0,499,178,https://www.flickr.com/photos/jus10h/26290478514,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n66f0351d17fa2cd1,https://c1.staticflickr.com/6/5601/31340350990_67947d33b8_o.jpg,0.25,0.25,0.75,1.0,820,529,https://www.flickr.com/photos/stevendepolo/31340350990,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n9b1049873f0ab9f3,https://c1.staticflickr.com/8/7458/27587559942_b200c05823_o.jpg,0.28125,0.0,0.84375,0.75,611,818,https://www.flickr.com/photos/nazareth_college/27587559942,https://creativecommons.org/licenses/by/2.0/,Nazareth College,https://www.flickr.com/people/nazareth_college/\n86a083993a32fc75,https://c1.staticflickr.com/8/7397/27016363550_4ff8625113_o.jpg,0.0,0.0,0.75,1.0,539,631,https://www.flickr.com/photos/127226743@N02/27016363550/,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\nf7d7f686b5d95aae,https://c1.staticflickr.com/8/7151/27113004365_42cb0fb79a_o.jpg,0.271172638436,0.25,0.542345276873,1.0,923,716,https://www.flickr.com/photos/stellahyc/27113004365,https://creativecommons.org/licenses/by/2.0/,stellahyc910,https://www.flickr.com/people/stellahyc/\n977016c8bea39636,https://c1.staticflickr.com/8/7265/26617705603_92f67e7199_o.jpg,0.421177266576,0.25,0.842354533153,1.0,845,591,https://www.flickr.com/photos/dentonpotter/26617705603,https://creativecommons.org/licenses/by/2.0/,Karen Cropper,https://www.flickr.com/people/dentonpotter/\neef937c8aa20ed76,https://c1.staticflickr.com/6/5633/30051440121_594aa67a5a_o.jpg,0.28125,0.25,0.84375,1.0,518,728,https://www.flickr.com/photos/massdep/30051440121/,https://creativecommons.org/licenses/by/2.0/,Massachusetts Dept. of Environmental Protection,https://www.flickr.com/people/massdep/\n0ba038ded83e661d,https://c1.staticflickr.com/6/5599/29693511873_a4618b5932_o.jpg,0.0,0.25,0.561328125,1.0,324,722,https://www.flickr.com/photos/mypubliclands/29693511873,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\ncedae8d11071cac5,https://c1.staticflickr.com/8/7041/27244390333_634e03954d_o.jpg,0.0,0.0,0.666666666667,1.0,661,795,https://www.flickr.com/photos/eddiesfisheriesfws/27244390333,https://creativecommons.org/licenses/by/2.0/,USFWS Fish and Aquatic Conservation,https://www.flickr.com/people/eddiesfisheriesfws/\n68bc9458ed38ec6a,https://c1.staticflickr.com/6/5717/29767428694_4625be4356_o.jpg,0.0,0.0,0.75,1.0,802,314,https://www.flickr.com/photos/lgoub/29767428694,https://creativecommons.org/licenses/by/2.0/,Laila Goubran,https://www.flickr.com/people/lgoub/\n61ff1f478123c668,https://c1.staticflickr.com/8/7734/26527531874_c954c544ce_o.jpg,0.25,0.0,1.0,0.75,310,903,https://www.flickr.com/photos/orangeaurochs/26527531874/,https://creativecommons.org/licenses/by/2.0/,Orangeaurochs,https://www.flickr.com/people/orangeaurochs/\n8454f7a45f0dd053,https://c1.staticflickr.com/9/8330/29733284941_94fa9c56ae_o.jpg,0.0,0.0,0.666666666667,1.0,704,65,https://www.flickr.com/photos/126337928@N05/29733284941,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\n8bbe22161f2e85b1,https://c1.staticflickr.com/8/7262/27628783521_5c4c8ddedf_o.jpg,0.5,0.25,1.0,1.0,702,767,https://www.flickr.com/photos/7armyjmtc/27628783521,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\nfd3fd6e398f271b3,https://c1.staticflickr.com/8/7647/28107537083_1d9c4fb81f_o.jpg,0.493694362018,0.25,1.0,1.0,848,676,https://www.flickr.com/photos/13476480@N07/28107537083,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\ne95f62ce9a2ee998,https://c1.staticflickr.com/8/7245/27014923936_e079e743d8_o.jpg,0.25,0.4375,1.0,1.0,864,371,https://www.flickr.com/photos/beaugiles/27014923936,https://creativecommons.org/licenses/by/2.0/,Beau Giles,https://www.flickr.com/people/beaugiles/\n92ed204124303bb2,https://c1.staticflickr.com/8/7401/26749845333_71e2df1668_o.jpg,0.260752688172,0.0,1.0,0.75,558,613,https://www.flickr.com/photos/jkirkhart35/26749845333,https://creativecommons.org/licenses/by/2.0/,Jerry Kirkhart,https://www.flickr.com/people/jkirkhart35/\n8d5b3dbded7a0595,https://c1.staticflickr.com/8/7439/27391182212_4cdda4f378_o.jpg,0.0,0.0,0.75,0.75,822,551,https://www.flickr.com/photos/vernieman/27391182212,https://creativecommons.org/licenses/by/2.0/,Vernon Chan,https://www.flickr.com/people/vernieman/\nf216be07cebc16a3,https://c1.staticflickr.com/9/8171/29307622755_055cc1635b_o.jpg,0.248713235294,0.25,0.746139705882,1.0,555,818,https://www.flickr.com/photos/shankaronline/29307622755/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n2fc661ad755dc857,https://c1.staticflickr.com/8/7726/27090264692_0f375ec88d_o.jpg,0.410547396529,0.0,0.821094793057,0.75,780,504,https://www.flickr.com/photos/thoseguys119/27090264692,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n86bcad5ba380259f,https://c1.staticflickr.com/9/8179/28968182021_8525c9b65f_o.jpg,0.0,0.279141104294,1.0,1.0,437,460,https://www.flickr.com/photos/91591049@N00/28968182021,https://creativecommons.org/licenses/by/2.0/,SenseiAlan,https://www.flickr.com/people/91591049@N00/\ndd1b0ef0a3c584a2,https://c1.staticflickr.com/8/7403/27499439816_bd20b40482_o.jpg,0.578822733424,0.0,1.0,0.75,979,903,https://www.flickr.com/photos/98675081@N00/27499439816,https://creativecommons.org/licenses/by/2.0/,Anna Oakley,https://www.flickr.com/people/98675081@N00/\nc3f0f41bdfd36a82,https://c1.staticflickr.com/6/5549/30255848674_c49ecd778d_o.jpg,0.253152818991,0.25,0.759458456973,1.0,982,778,https://www.flickr.com/photos/mwlguide/30255848674,https://creativecommons.org/licenses/by/2.0/,Joel Dinda,https://www.flickr.com/people/mwlguide/\n9791d11db5513795,https://c1.staticflickr.com/9/8696/29037019686_98def79ecd_o.jpg,0.0,0.0,0.805510534846,1.0,310,80,https://www.flickr.com/photos/gails_pictures/29037019686,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nf405dea69c780578,https://c1.staticflickr.com/8/7353/27129124166_81bc6ef230_o.jpg,0.28125,0.0,0.84375,0.75,979,767,https://www.flickr.com/photos/juliejordanscott/27129124166,https://creativecommons.org/licenses/by/2.0/,Julie Jordan Scott,https://www.flickr.com/people/juliejordanscott/\n42940e3f96359320,https://c1.staticflickr.com/6/5778/31314101442_d0bb3af055_o.jpg,0.0,0.0,0.75,0.75,592,582,https://www.flickr.com/photos/filterforge/31314101442,https://creativecommons.org/licenses/by/2.0/,Filter Forge,https://www.flickr.com/people/filterforge/\n81942894b7b3c115,https://c1.staticflickr.com/6/5780/30845236836_e025d239b5_o.jpg,0.0,0.0,0.857859531773,1.0,79,590,http://www.flickr.com/photos/43272765@N04/30845236836,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n062bf47af7f52604,https://c1.staticflickr.com/8/7424/26979411690_acb3ca9d17_o.jpg,0.0,0.0,0.419028340081,0.75,629,395,https://www.flickr.com/photos/jdlasica/26979411690,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\ncf428c506eff7104,https://c1.staticflickr.com/6/5459/30289373942_87d4bb172f_o.jpg,0.28125,0.25,0.84375,1.0,973,720,https://flickr.com/34010087@N07/30289373942,https://creativecommons.org/licenses/by/2.0/,Christian Piatt,https://www.flickr.com/people/christianpiatt/\na30f360abc69dc12,https://c1.staticflickr.com/9/8440/29651032582_40602c17f3_o.jpg,0.0,0.0,0.692708333333,0.75,310,563,https://www.flickr.com/photos/gails_pictures/29651032582/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n33be82306df4c00c,https://c1.staticflickr.com/8/7507/28722621054_2152cb08a9_o.jpg,0.5,0.25,1.0,1.0,359,5,https://flickr.com/79183573@N08/28722621054,https://creativecommons.org/licenses/by/2.0/,Phil Fiddes,https://www.flickr.com/people/philjose1878/\n749373e842edd27b,https://c1.staticflickr.com/9/8362/30005817905_17ce4004d0_o.jpg,0.0,0.0,0.521837349398,0.75,404,356,https://www.flickr.com/photos/usnavy/30005817905,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n2ce6b7bdfdf5f96c,https://c1.staticflickr.com/9/8266/28889699014_4b6721712d_o.jpg,0.0,0.25,0.496696035242,1.0,437,652,https://www.flickr.com/photos/autohistorian/28889699014/,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n8b1855cf34eae35a,https://c1.staticflickr.com/1/782/32163037380_04dfc73b7b_o.jpg,0.0,0.25,0.5,1.0,561,819,https://www.flickr.com/photos/sfupamr/32163037380,https://creativecommons.org/licenses/by/2.0/,Simon Fraser University -  University Communications,https://www.flickr.com/people/sfupamr/\n5cfff41bf415805f,https://c1.staticflickr.com/8/7605/26696558710_2180523bb6_o.jpg,0.25,0.25,0.75,1.0,662,729,https://www.flickr.com/photos/prayitnophotography/26696558710,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\n3d0258aa3a8b32b1,https://c1.staticflickr.com/1/341/31807620256_0d15a8508c_o.jpg,0.0,0.0,0.5,0.75,704,377,https://www.flickr.com/photos/o_0/31807620256,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n4922e1444dc1385a,https://c1.staticflickr.com/8/7597/28685563825_b3303a19ee_o.jpg,0.0,0.0,0.666666666667,1.0,512,529,https://www.flickr.com/photos/greggjerdingen/28685563825,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n017bb07a4814ab6a,https://c1.staticflickr.com/9/8569/28113937623_12f3f6d2b1_o.jpg,0.539603960396,0.0,1.0,0.75,405,852,https://flickr.com/60911558@N04/28113937623,https://creativecommons.org/licenses/by/2.0/,Ian Gratton,https://www.flickr.com/people/ian_a_gratton/\nf5ba5a70e11f20e9,https://c1.staticflickr.com/8/7495/28802345175_0155e4a49c_o.jpg,0.234308131241,0.0,0.702924393723,0.75,719,446,https://flickr.com/27656017@N02/28802345175,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/\n2ba9c4307341325e,https://c1.staticflickr.com/6/5733/30284227376_4a3ce35991_o.jpg,0.0,0.0,0.5,0.75,539,851,https://www.flickr.com/photos/cafoscari/30284227376,https://creativecommons.org/licenses/by/2.0/,Universit\\303\\240 Ca&#x27; Foscari Venezia,https://www.flickr.com/people/cafoscari/\n2017ad9d93729323,https://c1.staticflickr.com/9/8630/28534030921_ee6f456746_o.jpg,0.0,0.25,0.561258278146,1.0,304,113,http://www.flickr.com/photos/9243304@N04/28534030921,https://creativecommons.org/licenses/by/2.0/,Amante Darmanin,https://www.flickr.com/people/amantedar/\ne0291acff90415c4,https://c1.staticflickr.com/9/8062/29469303750_b95f5bbc63_o.jpg,0.28125,0.25,0.84375,1.0,981,435,https://www.flickr.com/photos/moonlightbulb/29469303750,https://creativecommons.org/licenses/by/2.0/,Selena N. B. H.,https://www.flickr.com/people/moonlightbulb/\n7540cf61176c2e5d,https://c1.staticflickr.com/6/5548/30456492284_498ddd6882_o.jpg,0.5,0.25,1.0,1.0,407,713,https://www.flickr.com/photos/johnragai/30456492284/,https://creativecommons.org/licenses/by/2.0/,John Ragai,https://www.flickr.com/people/johnragai/\n9097ae5ddf38dfa7,https://c1.staticflickr.com/8/7162/26716026093_99be06ab4b_o.jpg,0.25,0.25,0.75,1.0,699,1000,https://www.flickr.com/photos/ian_d/26716026093,https://creativecommons.org/licenses/by/2.0/,Ian Dick,https://www.flickr.com/people/ian_d/\n2def3fa0f5a6ba73,https://c1.staticflickr.com/8/7097/27602560786_3c531a663a_o.jpg,0.25,0.0,0.75,0.75,861,411,https://flickr.com/53301297@N00/27602560786,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n0add4c212ed9dc80,https://c1.staticflickr.com/1/472/32543997391_6bf46cd743_o.jpg,0.0,0.0,0.611745513866,0.75,335,810,https://www.flickr.com/photos/usfwsmidwest/32543997391,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\nd7e05de399d70c88,https://c1.staticflickr.com/9/8736/28233395290_1e619439b5_o.jpg,0.25,0.38379705401,1.0,1.0,442,552,https://www.flickr.com/photos/flikr/28233395290,https://creativecommons.org/licenses/by/2.0/,flikr,https://www.flickr.com/people/flikr/\nd749af72ed0f0a11,https://c1.staticflickr.com/6/5449/29843745134_4d6fedba4d_o.jpg,0.0,0.0,1.0,0.75,443,638,https://www.flickr.com/photos/127226743@N02/29843745134,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n7236c8b9ab4975cb,https://c1.staticflickr.com/1/440/32462176115_e3b5908e10_o.jpg,0.405292479109,0.0,1.0,1.0,93,379,https://flickr.com/93242958@N00/32462176115,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n5c3c45a992401cba,https://c1.staticflickr.com/6/5554/30948339575_67375d482a_o.jpg,0.28125,0.0,0.84375,0.75,566,759,https://www.flickr.com/photos/railwayofaustralia/30948339575/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/\ncfe7166100bff495,https://c1.staticflickr.com/9/8259/29868078442_eeacd410d5_o.jpg,0.0,0.0,0.663235294118,1.0,519,861,https://www.flickr.com/photos/box_repsol/29868078442,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n95f30065cebf3486,https://c1.staticflickr.com/6/5827/30798447586_4493a2624e_o.jpg,0.0,0.0,0.75,1.0,651,496,https://flickr.com/43851301@N02/30798447586,https://creativecommons.org/licenses/by/2.0/,tony_duell,https://www.flickr.com/people/tony_duell/\na2053e5e1279a9de,https://c1.staticflickr.com/6/5731/30684597062_9e5dfb124b_o.jpg,0.0,0.0,0.5,0.75,484,405,https://www.flickr.com/photos/renaud-camus/30684597062,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/\n95d22c402431c2db,https://c1.staticflickr.com/8/7282/27473132640_513ef8fb8d_o.jpg,0.5,0.25,1.0,1.0,558,958,https://www.flickr.com/photos/10459174@N03/27473132640/,https://creativecommons.org/licenses/by/2.0/,Fred Faulkner,https://www.flickr.com/people/10459174@N03/\n0697055bfec70334,https://c1.staticflickr.com/9/8036/29112922486_f75ae0ac88_o.jpg,0.0,0.0,0.5,0.75,561,721,https://www.flickr.com/photos/trainor/29112922486,https://creativecommons.org/licenses/by/2.0/,John Trainor,https://www.flickr.com/people/trainor/\n7921383e82316dc9,https://c1.staticflickr.com/6/5697/29657965284_24eb18bb64_o.jpg,0.330396475771,0.0,0.991189427313,1.0,548,472,https://www.flickr.com/photos/seraveenl/29657965284/,https://creativecommons.org/licenses/by/2.0/,Stefan Geertsen,https://www.flickr.com/people/seraveenl/\n704325129815cf96,https://c1.staticflickr.com/8/7395/27360421241_41cd000bc2_o.jpg,0.0,0.0,0.5625,0.75,719,786,https://www.flickr.com/photos/conner395/27360421241,https://creativecommons.org/licenses/by/2.0/,Dave Conner,https://www.flickr.com/people/conner395/\n37d0b8d3e70bb6bc,https://c1.staticflickr.com/9/8662/30384498016_706ef1ccfa_o.jpg,0.0,0.25,0.5,1.0,561,610,https://www.flickr.com/photos/116153846@N06/30384498016/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/\ne4d57580ed1bd5a2,https://c1.staticflickr.com/8/7411/27827702971_be7991bfb5_o.jpg,0.0,0.25,0.5,1.0,971,767,https://www.flickr.com/photos/paxson_woelber/27827702971,https://creativecommons.org/licenses/by/2.0/,Paxson Woelber,https://www.flickr.com/people/paxson_woelber/\n2f17f0487e864757,https://c1.staticflickr.com/6/5677/31045303180_c7f06a69f0_o.jpg,0.0,0.259009009009,0.75,0.777027027027,526,802,https://www.flickr.com/photos/88589253@N05/31045303180/,https://creativecommons.org/licenses/by/2.0/,lmbythesea,https://www.flickr.com/people/88589253@N05/\n5034d259fe9dd9e7,https://c1.staticflickr.com/4/3844/32892909231_d0cd48d7cc_o.jpg,0.0,0.248348017621,0.75,0.745044052863,536,709,https://www.flickr.com/photos/glorycycles/32892909231,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n27b9e505c9a5b3ba,https://c1.staticflickr.com/6/5332/31167303901_73e69516c0_o.jpg,0.333333333333,0.0,1.0,1.0,769,64,https://www.flickr.com/photos/istolethetv/31167303901,https://creativecommons.org/licenses/by/2.0/,istolethetv,https://www.flickr.com/people/istolethetv/\n8d68d99f89311645,https://c1.staticflickr.com/6/5761/31059182386_63bcc78c7b_o.jpg,0.332842415317,0.0,0.99852724595,1.0,971,738,https://www.flickr.com/photos/us_embassy_newzealand/31059182386/,https://creativecommons.org/licenses/by/2.0/,US Embassy,https://www.flickr.com/people/us_embassy_newzealand/\n63ee7db07226dd8d,https://c1.staticflickr.com/6/5829/30795744461_3252719e8d_o.jpg,0.0,0.0,0.75,0.674229452055,131,96,https://www.flickr.com/photos/pokerbrit/30795744461,https://creativecommons.org/licenses/by/2.0/,Steve Wilson - over 8 million views Thanks !!,https://www.flickr.com/people/pokerbrit/\n0b1198e99bc896dd,https://c1.staticflickr.com/6/5708/31449154875_e7c635c58f_o.jpg,0.25,0.0,1.0,0.535877862595,747,210,https://www.flickr.com/photos/cinqmars/31449154875/,https://creativecommons.org/licenses/by/2.0/,Pierre Cinq-Mars,https://www.flickr.com/people/cinqmars/\n1bdc93510c8175da,https://c1.staticflickr.com/8/7618/26896634526_e324402c8c_o.jpg,0.28125,0.0,0.84375,0.75,896,730,https://www.flickr.com/photos/51811543@N08/26896634526,https://creativecommons.org/licenses/by/2.0/,FotoSleuth,https://www.flickr.com/people/51811543@N08/\n71b36f834c4fe9ad,https://c1.staticflickr.com/9/8462/29435818381_9592a44734_o.jpg,0.0,0.0,0.5,0.75,411,21,https://www.flickr.com/photos/soso__1991/29435818381/,https://creativecommons.org/licenses/by/2.0/,SALoOM,https://www.flickr.com/people/soso__1991/\n4f26d0dd34a2128a,https://c1.staticflickr.com/1/589/31597452790_463cdcaae4_o.jpg,0.0,0.25,1.0,1.0,441,347,https://flickr.com/38488245@N00/31597452790,https://creativecommons.org/licenses/by/2.0/,Sam Cavenagh,https://www.flickr.com/people/cavenagh/\n5c9c84b07e6a0ba2,https://c1.staticflickr.com/9/8768/27790828624_71420c0e31_o.jpg,0.202689243028,0.25,0.608067729084,1.0,405,712,https://www.flickr.com/photos/hisgett/27790828624,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n96c07d57f5ab319a,https://c1.staticflickr.com/9/8431/28306541391_9350b8c291_o.jpg,0.25,0.25,1.0,1.0,302,469,https://www.flickr.com/photos/kqraaa/28306541391/,https://creativecommons.org/licenses/by/2.0/,Chris S,https://www.flickr.com/people/kqraaa/\nd49d90866f3a46ed,https://c1.staticflickr.com/8/7423/27253810781_6d526373b4_o.jpg,0.210588633288,0.25,0.631765899865,1.0,707,805,https://www.flickr.com/photos/31176607@N05/27253810781/,https://creativecommons.org/licenses/by/2.0/,kuhnmi,https://www.flickr.com/people/31176607@N05/\n1fb90a36bb80d22d,https://c1.staticflickr.com/9/8458/29612595426_b6960aa3e7_o.jpg,0.0,0.0,0.75,1.0,113,805,https://www.flickr.com/photos/jsjgeology/29612595426,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n609b6273efd6adec,https://c1.staticflickr.com/1/521/31566671824_f43e430e03_o.jpg,0.25,0.0,1.0,1.0,719,800,https://www.flickr.com/photos/infrogmation/31566671824,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/\n2cba9e43beb4fd97,https://c1.staticflickr.com/8/7305/27735849832_aa4ba16532_o.jpg,0.25,0.0,1.0,0.75,932,37,https://www.flickr.com/photos/sfslim/27735849832,https://creativecommons.org/licenses/by/2.0/,Aaron Muszalski,https://www.flickr.com/people/sfslim/\n25aea50decd062f8,https://c1.staticflickr.com/8/7244/27165835960_a3756ec597_o.jpg,0.0,0.0,0.75,0.75,909,541,https://www.flickr.com/photos/tonycecala/27165835960,https://creativecommons.org/licenses/by/2.0/,Tony Cecala,https://www.flickr.com/people/tonycecala/\n71408d60417f0883,https://c1.staticflickr.com/9/8222/28979929986_cd3608d864_o.jpg,0.0,0.25,0.5,1.0,662,596,https://www.flickr.com/photos/greggjerdingen/28979929986,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nb98b0e34e3d9e381,https://c1.staticflickr.com/6/5657/31200495721_24cc544859_o.jpg,0.0,0.0,0.5,0.75,854,555,https://www.flickr.com/photos/jamesbradley/31200495721/,https://creativecommons.org/licenses/by/2.0/,Fr James Bradley,https://www.flickr.com/people/jamesbradley/\nd01f359a941dd6bf,https://c1.staticflickr.com/9/8777/28916375241_34f3ff7deb_o.jpg,0.0,0.25,0.5,1.0,986,10,https://www.flickr.com/photos/cogdog/28916375241,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nd88d5813b2f1a82b,https://c1.staticflickr.com/6/5529/30157707413_7c86546963_o.jpg,0.25,0.5,1.0,1.0,993,17,https://flickr.com/59462388@N00/30157707413,https://creativecommons.org/licenses/by/2.0/,chiron3636,https://www.flickr.com/people/59462388@N00/\n01c0e6fbf97538ea,https://c1.staticflickr.com/1/351/31791191375_60171a90a9_o.jpg,0.201612903226,0.0,1.0,1.0,755,222,https://www.flickr.com/photos/51764518@N02/31791191375,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n31123c5bc8af86a9,https://c1.staticflickr.com/1/636/31652473345_b6935aaf69_o.jpg,0.0,0.0,1.0,0.662261380323,762,145,https://www.flickr.com/photos/zionfiction/31652473345,https://creativecommons.org/licenses/by/2.0/,r. nial bradshaw,https://www.flickr.com/people/zionfiction/\ne32c057735faf1a7,https://c1.staticflickr.com/9/8539/29946036322_aaf1918bcd_o.jpg,0.0,0.0,1.0,0.96975088968,323,524,https://flickr.com/33398884@N03/29946036322,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\n0e96ff091098f82a,https://c1.staticflickr.com/9/8410/30349540721_472050c417_o.jpg,0.0,0.25,0.75,1.0,920,894,https://www.flickr.com/photos/courtbean/30349540721/,https://creativecommons.org/licenses/by/2.0/,Courtney Boyd Myers,https://www.flickr.com/people/courtbean/\n53e8b5032fcbb2de,https://c1.staticflickr.com/9/8849/28600169140_180fe9f189_o.jpg,0.28125,0.25,0.84375,1.0,964,7,https://www.flickr.com/photos/cogdog/28600169140,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nf1d599dca5acb19e,https://c1.staticflickr.com/6/5478/31011617565_7fe68f7d9e_o.jpg,0.28125,0.25,0.84375,1.0,629,686,https://www.flickr.com/photos/sharonhahndarlin/31011617565,https://creativecommons.org/licenses/by/2.0/,Sharon Hahn Darlin,https://www.flickr.com/people/sharonhahndarlin/\n635c6bf4f8bcd077,https://c1.staticflickr.com/8/7795/28761312960_3f68475de8_o.jpg,0.25,0.0,1.0,0.75,274,717,https://www.flickr.com/photos/jenrobinson/28761312960/,https://creativecommons.org/licenses/by/2.0/,jen robinson,https://www.flickr.com/people/jenrobinson/\na4855965f0ee1892,https://c1.staticflickr.com/9/8104/29161920474_be9412c264_o.jpg,0.5,0.0,1.0,0.75,548,481,https://www.flickr.com/photos/shankaronline/29161920474,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\na35a30a62237a8a0,https://c1.staticflickr.com/9/8153/28907773382_ac9bbc1f4c_o.jpg,0.25,0.0,1.0,0.503698224852,646,611,https://flickr.com/12950131@N06/28907773382,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n2095797bdc1aa426,https://c1.staticflickr.com/1/548/31293109024_012160440b_o.jpg,0.210588633288,0.0,0.631765899865,0.75,848,581,https://www.flickr.com/photos/shankaronline/31293109024,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nd21a0c974022fa0f,https://c1.staticflickr.com/9/8812/28832221254_6761ed3159_o.jpg,0.333333333333,0.0,1.0,1.0,739,788,https://www.flickr.com/photos/sterlic/28832221254,https://creativecommons.org/licenses/by/2.0/,Scott Akerman,https://www.flickr.com/people/sterlic/\n4df435083af9a4e7,https://c1.staticflickr.com/9/8243/27780524793_3acdf6c7de_o.jpg,0.624125874126,0.0,0.936188811189,0.75,976,529,https://www.flickr.com/photos/chad_sparkes/27780524793,https://creativecommons.org/licenses/by/2.0/,Chad Sparkes,https://www.flickr.com/people/chad_sparkes/\n021b4cf0ac86d356,https://c1.staticflickr.com/6/5613/32068228285_b74d049d0c_o.jpg,0.421703296703,0.0,1.0,1.0,815,558,https://www.flickr.com/photos/walterpro/32068228285,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/\n9b716a09c14f9b79,https://c1.staticflickr.com/1/698/32031478785_d3ec0e5283_o.jpg,0.333333333333,0.0,1.0,1.0,512,547,https://flickr.com/42220226@N07/32031478785,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\ne373c220d13963c4,https://c1.staticflickr.com/8/7519/27260754646_63d7886040_o.jpg,0.211382113821,0.25,0.634146341463,1.0,704,535,https://www.flickr.com/photos/discoveroregon/27260754646/,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n41a80d706ef7edf0,https://c1.staticflickr.com/6/5447/31179835181_03bee90365_o.jpg,0.341370558376,0.25,1.0,1.0,310,767,https://www.flickr.com/photos/gails_pictures/31179835181,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n7e692e0e390b9b79,https://c1.staticflickr.com/6/5746/29798457144_ce55255572_o.jpg,0.0,0.25,0.524546827795,1.0,889,871,https://www.flickr.com/photos/sheila_sund/29798457144,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/\n4f6a453057497d30,https://c1.staticflickr.com/9/8139/29747036901_3af6edd308_o.jpg,0.249631811487,0.0,0.748895434462,0.75,820,64,https://www.flickr.com/photos/usafe/29747036901/,https://creativecommons.org/licenses/by/2.0/,USAFE AFAFRICA,https://www.flickr.com/people/usafe/\n557043e33f3d9cd3,https://c1.staticflickr.com/9/8505/29122062136_855c238dd9_o.jpg,0.0,0.0,0.666666666667,1.0,471,697,https://www.flickr.com/photos/dakone2k/29122062136/,https://creativecommons.org/licenses/by/2.0/,Daniel Cruz Valle,https://www.flickr.com/people/dakone2k/\n47207907c465be67,https://c1.staticflickr.com/8/7608/26456720594_83b156b928_o.jpg,0.499263622975,0.0,0.99852724595,0.75,718,630,https://www.flickr.com/photos/greggjerdingen/26456720594,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n4d0900d4af0d62c0,https://c1.staticflickr.com/8/7469/30162157755_a6e46bbc9d_o.jpg,0.292867981791,0.0,1.0,1.0,657,263,https://www.flickr.com/photos/hugo90/30162157755,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n1a7dbfb5bceafa76,https://c1.staticflickr.com/9/8797/27918323460_131c1e9a9a_o.jpg,0.0,0.0,0.561569688769,1.0,980,355,https://www.flickr.com/photos/mypubliclands/27918323460,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\nb906fb0529eba9b9,https://c1.staticflickr.com/8/7403/27410948676_c23d8ebcc0_o.jpg,0.578822733424,0.0,1.0,0.75,329,886,https://www.flickr.com/photos/jphotos/27410948676,https://creativecommons.org/licenses/by/2.0/,jeff~,https://www.flickr.com/people/jphotos/\nfa6bae54bd5d8b13,https://c1.staticflickr.com/9/8701/29869312901_58c5874fe9_o.jpg,0.0,0.0,0.739130434783,1.0,806,609,https://www.flickr.com/photos/jamesboyes/29869312901/,https://creativecommons.org/licenses/by/2.0/,James Boyes,https://www.flickr.com/people/jamesboyes/\n065099b7ac9d9ac4,https://c1.staticflickr.com/6/5291/30056411952_8032975faa_o.jpg,0.156031468531,0.25,0.468094405594,1.0,459,348,https://flickr.com/131810676@N03/30056411952,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/\n4c9f8d9523ac6a84,https://c1.staticflickr.com/9/8729/29099570322_dfc0178c76_o.jpg,0.25,0.0,1.0,1.0,937,955,https://www.flickr.com/photos/scotnelson/29099570322,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n0b9f31fb286716b2,https://c1.staticflickr.com/9/8124/29761838330_29b733a1ae_o.jpg,0.0,0.0,0.75,0.56338028169,407,146,https://www.flickr.com/photos/eltb/29761838330,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nd74d464c3bb94dab,https://c1.staticflickr.com/9/8557/28449325394_75ec4bd407_o.jpg,0.0,0.248348017621,0.75,0.745044052863,672,812,https://www.flickr.com/photos/transitomedellin/28449325394,https://creativecommons.org/licenses/by/2.0/,Secretar\\303\\255a de Movilidad de Medell\\303\\255n,https://www.flickr.com/people/transitomedellin/\n4c15e269fe7c2e3d,https://c1.staticflickr.com/1/634/32178917860_920284d9f9_o.jpg,0.285496183206,0.0,1.0,1.0,971,108,https://www.flickr.com/photos/ruthanddave/32178917860/,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n551d323118fb54d3,https://c1.staticflickr.com/8/7408/26252524554_a5b27529ba_o.jpg,0.249631811487,0.25,0.748895434462,1.0,896,746,https://www.flickr.com/photos/markyharky/26252524554,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n7a697e8aef963f7f,https://c1.staticflickr.com/8/7786/28379740245_cc1a2b42cd_o.jpg,0.0,0.25,0.75,1.0,761,124,https://www.flickr.com/photos/78428166@N00/28379740245,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\nfc51851f4ac3ae08,https://c1.staticflickr.com/8/7577/27062589082_9b035cdbf0_o.jpg,0.244897959184,0.0,1.0,1.0,780,450,https://www.flickr.com/photos/thoseguys119/27062589082,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nad563ec3390b141f,https://c1.staticflickr.com/8/7697/26223793944_637294d2c9_o.jpg,0.285496183206,0.0,1.0,1.0,820,817,https://www.flickr.com/photos/navcent/26223793944,https://creativecommons.org/licenses/by/2.0/,U.S. Naval Forces Central Command/U.S. Fifth Fleet,https://www.flickr.com/people/navcent/\n56324fd47cabe469,https://c1.staticflickr.com/6/5479/30642699254_863593ae59_o.jpg,0.25,0.25,0.75,1.0,519,863,https://www.flickr.com/photos/box_repsol/30642699254,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n1387bd48d85a2c59,https://c1.staticflickr.com/9/8244/28804495004_ce1951a97c_o.jpg,0.0,0.0,0.666666666667,1.0,519,858,https://www.flickr.com/photos/box_repsol/28804495004/,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n5d6c2dd080e5c1e5,https://c1.staticflickr.com/9/8017/29248624862_3cda9dbcea_o.jpg,0.309221311475,0.25,0.927663934426,1.0,992,843,https://www.flickr.com/photos/ligthelm/29248624862,https://creativecommons.org/licenses/by/2.0/,Rick Ligthelm,https://www.flickr.com/people/ligthelm/\n4babfa35488d92cf,https://c1.staticflickr.com/9/8233/29485956555_0753b2a769_o.jpg,0.25,0.0,1.0,0.599757673667,324,765,https://www.flickr.com/photos/kpaulus/29485956555/,https://creativecommons.org/licenses/by/2.0/,Kristine Paulus,https://www.flickr.com/people/kpaulus/\ned30aa76cd2d284c,https://c1.staticflickr.com/8/7238/26271296103_ae90e20bde_o.jpg,0.2806640625,0.25,0.8419921875,1.0,922,183,https://www.flickr.com/photos/lenore-m/26271296103,https://creativecommons.org/licenses/by/2.0/,Lenore Edman,https://www.flickr.com/people/lenore-m/\n828d4f903e05e6f0,https://c1.staticflickr.com/9/8799/27677199993_f94c61f064_o.jpg,0.333333333333,0.0,1.0,1.0,971,377,https://www.flickr.com/photos/davebloggs007/27677199993,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\ned73eddb69f25ccb,https://c1.staticflickr.com/9/8701/28819142265_54eb1bae5c_o.jpg,0.28125,0.0,0.84375,0.75,635,983,https://www.flickr.com/photos/suncon/28819142265,https://creativecommons.org/licenses/by/2.0/,SunCon Photos,https://www.flickr.com/people/suncon/\n6087cb0f92f43db3,https://c1.staticflickr.com/8/7303/26738900854_5e7081c97e_o.jpg,0.337738619677,0.0,1.0,1.0,519,742,https://www.flickr.com/photos/seymour-pics/26738900854,https://creativecommons.org/licenses/by/2.0/,Mark Seymour,https://www.flickr.com/people/seymour-pics/\n11c4b54a964ff082,https://c1.staticflickr.com/1/505/31675351916_b4bb9bf8d0_o.jpg,0.330871491876,0.0,1.0,1.0,309,371,https://www.flickr.com/photos/42244964@N03/31675351916,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/\n6eb88bb1279e92f9,https://c1.staticflickr.com/9/8758/28618213615_57a4e23a00_o.jpg,0.462765957447,0.25,0.925531914894,1.0,718,897,https://www.flickr.com/photos/daveseven/28618213615,https://creativecommons.org/licenses/by/2.0/,dave_7,https://www.flickr.com/people/daveseven/\n7e9c6c3dd01bf1a7,https://c1.staticflickr.com/6/5832/31094839330_0a18e42eaf_o.jpg,0.0,0.0,0.498159057437,0.75,752,207,https://www.flickr.com/photos/davehamster/31094839330,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n703a0b79ba9ffb4c,https://c1.staticflickr.com/8/7774/26806215681_d5a47093e3_o.jpg,0.225,0.25,0.675,1.0,459,943,https://www.flickr.com/photos/atoach/26806215681,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n4fa2cad0c899eb41,https://c1.staticflickr.com/9/8233/28387591075_c68dede447_o.jpg,0.25,0.25,0.75,1.0,875,883,https://www.flickr.com/photos/kieransphotostream/28387591075,https://creativecommons.org/licenses/by/2.0/,Koex73,https://www.flickr.com/people/kieransphotostream/\n458ed56f7c7297d5,https://c1.staticflickr.com/1/605/30834214894_dddb4f9a40_o.jpg,0.470789074355,0.25,1.0,1.0,540,403,https://www.flickr.com/photos/45958601@N02/30834214894/,https://creativecommons.org/licenses/by/2.0/,joey  zanotti,https://www.flickr.com/people/45958601@N02/\nb67c95a6acb2f02b,https://c1.staticflickr.com/9/8716/30023250666_2dd2d23a80_o.jpg,0.336764705882,0.0,1.0,1.0,782,995,https://www.flickr.com/photos/channingsmith/30023250666,https://creativecommons.org/licenses/by/2.0/,Channing Smith,https://www.flickr.com/people/channingsmith/\nadaf622244796430,https://c1.staticflickr.com/9/8413/30170200465_42e748ba7e_o.jpg,0.0,0.0,0.75,1.0,110,138,https://www.flickr.com/photos/148005384@N04/30170200465,https://creativecommons.org/licenses/by/2.0/,Editions Photoart,https://www.flickr.com/people/148005384@N04/\n73c353583783476f,https://c1.staticflickr.com/9/8610/29818492514_52e6502013_o.jpg,0.0,0.25,0.75,1.0,980,972,https://flickr.com/34803371@N02/29818492514,https://creativecommons.org/licenses/by/2.0/,Briles Takes Pictures,https://www.flickr.com/people/brilestakespictures/\n5e351af6e1cd3ce2,https://c1.staticflickr.com/8/7156/27494783335_7ca9db9125_o.jpg,0.0,0.25,0.75,1.0,566,837,https://www.flickr.com/photos/bowbrick/27494783335,https://creativecommons.org/licenses/by/2.0/,Steve  Bowbrick,https://www.flickr.com/people/bowbrick/\n19eb49485b6e5015,https://c1.staticflickr.com/6/5604/30159632373_802808e2f1_o.jpg,0.281802120141,0.0,1.0,0.75,615,76,https://www.flickr.com/photos/publicresourceorg/30159632373/,https://creativecommons.org/licenses/by/2.0/,Public.Resource.Org,https://www.flickr.com/people/publicresourceorg/\n95dda69567aaa13b,https://c1.staticflickr.com/1/363/31888298916_76241d118a_o.jpg,0.480855855856,0.0,1.0,0.75,336,137,https://flickr.com/52378535@N06/31888298916,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\nf2a4ed91400f4aaf,https://c1.staticflickr.com/9/8372/29329694571_4304a18a22_o.jpg,0.346067134269,0.25,0.576778557114,1.0,880,99,https://www.flickr.com/photos/pyride/29329694571,https://creativecommons.org/licenses/by/2.0/,Julie anne Johnson,https://www.flickr.com/people/pyride/\n17e615d63e051882,https://c1.staticflickr.com/8/7441/26486494613_d7e5563071_o.jpg,0.0,0.0,1.0,1.0,968,280,https://www.flickr.com/photos/journeyscoffee/26486494613,https://creativecommons.org/licenses/by/2.0/,Dan Lacher,https://www.flickr.com/people/journeyscoffee/\nb3391a4cc5e10c01,https://c1.staticflickr.com/1/289/31999369380_b6752d02a0_o.jpg,0.0,0.25,0.5,1.0,971,459,https://www.flickr.com/photos/davebloggs007/31999369380,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\n223bdf7f77e44be1,https://c1.staticflickr.com/8/7283/27201240734_3d3930778c_o.jpg,0.333333333333,0.0,1.0,1.0,461,741,http://www.flickr.com/photos/133488379@N08/27201240734,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\ne1b5aab2028d990a,https://c1.staticflickr.com/8/7715/26878843412_bc0b1f2297_o.jpg,0.431603773585,0.25,1.0,1.0,321,122,https://www.flickr.com/photos/gails_pictures/26878843412,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\ncb88fc99e5f3a57d,https://c1.staticflickr.com/6/5466/30531998210_45e98c8987_o.jpg,0.0,0.0,1.0,0.7484375,410,624,https://www.flickr.com/photos/arjanrichter/30531998210,https://creativecommons.org/licenses/by/2.0/,Arjan Richter,https://www.flickr.com/people/arjanrichter/\n63bfcdfc84fbf0a7,https://c1.staticflickr.com/6/5788/30871293190_c7f8bafe9c_o.jpg,0.0,0.0,0.75,0.75,935,757,https://www.flickr.com/photos/lachlanhardy/30871293190,https://creativecommons.org/licenses/by/2.0/,Lachlan Hardy,https://www.flickr.com/people/lachlanhardy/\na3d15a4d57c98093,https://c1.staticflickr.com/8/7418/27090299961_44369d50ea_o.jpg,0.549781181619,0.0,0.824671772429,0.75,780,85,https://www.flickr.com/photos/thoseguys119/27090299961,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\ne2bfc8982f2857d7,https://c1.staticflickr.com/8/7621/28090174073_374097ded2_o.jpg,0.249079528719,0.0,0.747238586156,0.75,699,331,https://www.flickr.com/photos/christophsammer/28090174073,https://creativecommons.org/licenses/by/2.0/,Christoph Sammer,https://www.flickr.com/people/christophsammer/\n32014e1dcbcd9667,https://c1.staticflickr.com/9/8207/29638594705_bc4d85ce20_o.jpg,0.248713235294,0.25,0.746139705882,1.0,547,401,https://www.flickr.com/photos/mangakamaidenphotography/29638594705,https://creativecommons.org/licenses/by/2.0/,MangakaMaiden Photography,https://www.flickr.com/people/mangakamaidenphotography/\n1bfe3bd5bb6d6461,https://c1.staticflickr.com/8/7184/27441879452_d414df01a6_o.jpg,0.5,0.0,1.0,0.75,702,847,https://www.flickr.com/photos/7armyjmtc/27441879452,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n19106fcec4aa5edc,https://c1.staticflickr.com/6/5504/30325036203_275ce60af1_o.jpg,0.28125,0.25,0.84375,1.0,669,820,https://www.flickr.com/photos/96223380@N02/30325036203,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/\n3737c579f8fcd381,https://c1.staticflickr.com/1/530/31912109384_d220aacc63_o.jpg,0.0,0.0,0.7484375,1.0,971,161,https://www.flickr.com/photos/snowboardguides/31912109384/,https://creativecommons.org/licenses/by/2.0/,SNOWBOARDGUIDES.COM,https://www.flickr.com/people/snowboardguides/\n279c74d94797c6ae,https://c1.staticflickr.com/2/1644/26715774676_fea10bedcf_o.jpg,0.477665706052,0.25,0.955331412104,1.0,971,825,https://www.flickr.com/photos/nordique/26715774676,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/\nf7f85c56122216e0,https://c1.staticflickr.com/8/7344/27503130195_fc23c31689_o.jpg,0.333333333333,0.0,1.0,1.0,524,352,https://www.flickr.com/photos/rockincast/27503130195,https://creativecommons.org/licenses/by/2.0/,4x4king10,https://www.flickr.com/people/rockincast/\nb9949f9c2f3ccebf,https://c1.staticflickr.com/1/284/31789944763_0dcb472076_o.jpg,0.333333333333,0.0,1.0,1.0,24,178,https://flickr.com/22592971@N04/31789944763,https://creativecommons.org/licenses/by/2.0/,Mark  Gunn,https://www.flickr.com/people/mark-gunn/\nd58fcfdea2c4fe2a,https://c1.staticflickr.com/6/5445/30401489156_86521b2481_o.jpg,0.0,0.0089928057554,1.0,1.0,651,805,https://www.flickr.com/photos/johningb/30401489156/,https://creativecommons.org/licenses/by/2.0/,John Begalke,https://www.flickr.com/people/johningb/\n9fcf2c59ff0ff9b6,https://c1.staticflickr.com/9/8098/28516976536_3f929208b7_o.jpg,0.254464285714,0.0,0.763392857143,0.75,975,483,https://www.flickr.com/photos/jsjgeology/28516976536,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n32bd822fbc041589,https://c1.staticflickr.com/6/5689/30337601954_369f207eaa_o.jpg,0.43661971831,0.25,1.0,1.0,832,756,https://flickr.com/10373806@N05/30337601954,https://creativecommons.org/licenses/by/2.0/,Xavier Damman,https://www.flickr.com/people/xdamman/\n236f3abf63755e51,https://c1.staticflickr.com/1/706/31735168541_83771bc72c_o.jpg,0.242550872093,0.0,0.727652616279,0.75,975,786,https://www.flickr.com/photos/jsjgeology/31735168541,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n5216c0cab635d220,https://c1.staticflickr.com/9/8666/28478165335_f3f7ef5a01_o.jpg,0.175679851669,0.0,0.527039555006,0.75,975,757,https://www.flickr.com/photos/jsjgeology/28478165335,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n39f53cb1c128d893,https://c1.staticflickr.com/8/7484/29547882593_344301227d_o.jpg,0.25,0.4375,1.0,1.0,608,177,https://www.flickr.com/photos/annaustin/29547882593,https://creativecommons.org/licenses/by/2.0/,Anna Hanks,https://www.flickr.com/people/annaustin/\nab1b0fdece18272a,https://c1.staticflickr.com/8/7576/28116360546_7f8ddfcea2_o.jpg,0.31726618705,0.0,0.951798561151,1.0,971,143,https://www.flickr.com/photos/peuplier/28116360546,https://creativecommons.org/licenses/by/2.0/,peuplier,https://www.flickr.com/people/peuplier/\n76a2bbf100fcadde,https://c1.staticflickr.com/8/7320/27925241631_cfaaf24317_o.jpg,0.0,0.0,1.0,0.75,995,586,https://www.flickr.com/photos/scotnelson/27925241631,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\nb9f2c3848fe3407b,https://c1.staticflickr.com/8/7190/27586654126_4a760fb6e5_o.jpg,0.0,0.0,0.670648464164,0.75,145,782,https://www.flickr.com/photos/ben124/27586654126,https://creativecommons.org/licenses/by/2.0/,Berit Watkin,https://www.flickr.com/people/ben124/\n233c35b0a46f0650,https://c1.staticflickr.com/9/8856/28270472106_bdd28ce6c2_o.jpg,0.4375,0.0,1.0,0.75,974,355,https://www.flickr.com/photos/noaaphotolib/28270472106,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\n69940d6366b8a9c0,https://c1.staticflickr.com/6/5125/29544515263_1620526d79_o.jpg,0.0,0.318416523236,0.75,1.0,539,983,https://www.flickr.com/photos/budellison/29544515263,https://creativecommons.org/licenses/by/2.0/,Bud Ellison,https://www.flickr.com/people/budellison/\n3b901740be8a60fc,https://c1.staticflickr.com/9/8737/28418226135_3864a397c2_o.jpg,0.0,0.25,0.5625,1.0,31,761,https://www.flickr.com/photos/nature80020/28418226135,https://creativecommons.org/licenses/by/2.0/,nature80020,https://www.flickr.com/people/nature80020/\n5da6d6d3b4389389,https://c1.staticflickr.com/3/2068/32863788222_f83b55d5d6_o.jpg,0.248348017621,0.0,0.745044052863,0.75,672,319,https://www.flickr.com/photos/glorycycles/32863788222,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n43bb823efbd6a7a1,https://c1.staticflickr.com/9/8227/28361569183_bd19cf29a9_o.jpg,0.0,0.0,1.0,1.0,442,640,https://www.flickr.com/photos/alper/28361569183,https://creativecommons.org/licenses/by/2.0/,Alper \\303\\207u\\304\\237un,https://www.flickr.com/people/alper/\n87ef2b672d461f5b,https://c1.staticflickr.com/9/8706/29465792200_966086f08a_o.jpg,0.0,0.0,0.56338028169,0.75,507,530,https://www.flickr.com/photos/zongo/29465792200,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\nd3cf0ce47b4ea472,https://c1.staticflickr.com/9/8306/29482445285_f2a9c9d5d5_o.jpg,0.306766917293,0.0,1.0,1.0,896,445,https://www.flickr.com/photos/8269539@N04/29482445285,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n69631aa30fb20981,https://c1.staticflickr.com/9/8835/28661400036_449ea08a6f_o.jpg,0.25,0.0,0.75,0.75,982,568,https://www.flickr.com/photos/usembassytokyo/28661400036,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tokyo,https://www.flickr.com/people/usembassytokyo/\n236f28c544ebd76e,https://c1.staticflickr.com/8/7558/27354993266_888cd610ae_o.jpg,0.421177266576,0.25,0.842354533153,1.0,699,58,https://www.flickr.com/photos/ankurp/27354993266,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\n05fe1ace8eecf93e,https://c1.staticflickr.com/8/7349/27235506583_8172423525_o.jpg,0.0,0.300604229607,1.0,1.0,808,481,https://www.flickr.com/photos/lge/27235506583,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n33e2a1137737fe19,https://c1.staticflickr.com/8/7310/27481466185_2df07379f5_o.jpg,0.25,0.0,1.0,1.0,848,708,http://www.flickr.com/photos/35334437@N05/27481466185/,https://creativecommons.org/licenses/by/2.0/,VanLap Ho\\303\\240ng,https://www.flickr.com/people/vanlaphoang1945/\nd3fe594ab94ac801,https://c1.staticflickr.com/8/7061/26889596602_5747b96676_o.jpg,0.0,0.0,0.666666666667,1.0,848,866,https://www.flickr.com/photos/7armyjmtc/26889596602,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\nd46ecc546b5424f2,https://c1.staticflickr.com/8/7402/27082317204_932f825601_o.jpg,0.468616262482,0.0,0.937232524964,0.75,95,107,https://www.flickr.com/photos/rockyraybell/27082317204,https://creativecommons.org/licenses/by/2.0/,Rocky Raybell,https://www.flickr.com/people/rockyraybell/\n833ab2c44f79e8ae,https://c1.staticflickr.com/9/8871/28210823271_2a9128b4d0_o.jpg,0.0,0.0,0.75,0.5,870,370,https://www.flickr.com/photos/gylesglover/28210823271,https://creativecommons.org/licenses/by/2.0/,Gyles Glover,https://www.flickr.com/people/gylesglover/\nf049191158adf9ff,https://c1.staticflickr.com/8/7651/26510530204_1a2287b421_o.jpg,0.25,0.0,1.0,1.0,17,118,https://www.flickr.com/photos/9750464@N02/26510530204,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\n11de929e16ef2777,https://c1.staticflickr.com/6/5561/31643466182_d526d7d5a1_o.jpg,0.504405286344,0.0,1.0,0.75,548,157,https://www.flickr.com/photos/robdammers/31643466182,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\ne6ed833eb6ed8761,https://c1.staticflickr.com/4/3152/3065021991_bfd932644e_o.jpg,0.499263622975,0.25,0.99852724595,1.0,931,677,https://www.flickr.com/photos/photofarmer/3065021991,https://creativecommons.org/licenses/by/2.0/,Dwight Sipler,https://www.flickr.com/people/photofarmer/\nbffd3b358af9eb37,https://c1.staticflickr.com/8/7459/27155696693_3cba7c100e_o.jpg,0.334315169367,0.0,1.0,1.0,971,405,https://www.flickr.com/photos/104544784@N04/27155696693/,https://creativecommons.org/licenses/by/2.0/,Kevin Funk,https://www.flickr.com/people/104544784@N04/\n0d344499a7cec5a3,https://c1.staticflickr.com/8/7390/27264754735_73c458ba36_o.jpg,0.512008733624,0.0,1.0,0.75,318,870,https://www.flickr.com/photos/26138378@N03/27264754735,https://creativecommons.org/licenses/by/2.0/,Patrick Clement,https://www.flickr.com/people/26138378@N03/\n6ec9a8e619129d4a,https://c1.staticflickr.com/9/8830/28284956061_84e914c06e_o.jpg,0.0,0.0,0.5625,0.75,442,521,https://www.flickr.com/photos/kidayasuo/28284956061/,https://creativecommons.org/licenses/by/2.0/,Yasuo Kida,https://www.flickr.com/people/kidayasuo/\nc05bd28b99c8cb4c,https://c1.staticflickr.com/3/2257/32690058362_744cc09823_o.jpg,0.5,0.0,1.0,0.75,116,373,https://www.flickr.com/photos/silkebaron/32690058362,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/\n9d57650f90765950,https://c1.staticflickr.com/9/8567/28436805255_3b08ae85b7_o.jpg,0.0,0.0,0.5625,0.75,975,467,https://www.flickr.com/photos/jsjgeology/28436805255/?rb=1,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n8443ace4c1a96b02,https://c1.staticflickr.com/9/8448/29687551075_193edaef3f_o.jpg,0.0,0.0,0.496696035242,0.75,484,843,https://www.flickr.com/photos/34517490@N00/29687551075,https://creativecommons.org/licenses/by/2.0/,Nick,https://www.flickr.com/people/34517490@N00/\nad597652b035a9e8,https://c1.staticflickr.com/2/1581/26146502613_2c86c80ae2_o.jpg,0.4375,0.0,1.0,0.75,771,407,https://www.flickr.com/photos/wza/26146502613,https://creativecommons.org/licenses/by/2.0/,Warren R.M. Stuart,https://www.flickr.com/people/wza/\nd16c914a6b4ca249,https://c1.staticflickr.com/9/8386/28769311134_7b78765846_o.jpg,0.475453172205,0.0,1.0,0.75,580,638,https://www.flickr.com/photos/fotosagenciabrasil/28769311134/,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/\n5f468c9a129383c4,https://c1.staticflickr.com/8/7350/27231547892_01dda93fd8_o.jpg,0.269908116386,0.0,0.809724349158,0.75,822,510,https://www.flickr.com/photos/johnkell/27231547892,https://creativecommons.org/licenses/by/2.0/,johnkell,https://www.flickr.com/people/johnkell/\nf99913c57ac0de88,https://c1.staticflickr.com/6/5453/30783128830_89da72d013_o.jpg,0.0,0.0,0.485101744186,0.75,353,537,https://www.flickr.com/photos/kkoshy/30783128830,https://creativecommons.org/licenses/by/2.0/,Koshy Koshy,https://www.flickr.com/people/kkoshy/\n17989af4989cae2a,https://c1.staticflickr.com/8/7605/27090298831_90a81a7aa9_o.jpg,0.204227696405,0.0,0.612683089214,0.75,780,465,https://www.flickr.com/photos/thoseguys119/27090298831,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n3c9b88db5e066169,https://c1.staticflickr.com/6/5726/30285166324_3223b1d3e1_o.jpg,0.25,0.25,1.0,0.75,518,638,https://www.flickr.com/photos/elsie/30285166324/,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\n16975e74dfbd7402,https://c1.staticflickr.com/6/5345/30068832962_ae67543f73_o.jpg,0.0,0.25,0.5625,1.0,975,292,https://flickr.com/47445767@N05/30068832962,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ne45f7f995e5a62d9,https://c1.staticflickr.com/8/7672/26707937963_3341f083af_o.jpg,0.503303964758,0.25,1.0,1.0,752,318,https://www.flickr.com/photos/seymour-pics/26707937963,https://creativecommons.org/licenses/by/2.0/,Mark Seymour,https://www.flickr.com/people/seymour-pics/\n63f59cc3cd6df3f0,https://c1.staticflickr.com/8/7683/28093467915_b1297bca78_o.jpg,0.234308131241,0.0,0.702924393723,0.75,606,462,https://www.flickr.com/photos/lge/28093467915,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n337e039b052d3566,https://c1.staticflickr.com/8/7304/28070536882_3a548f8f2d_o.jpg,0.0,0.0,0.497426470588,0.75,526,691,https://www.flickr.com/photos/usfwsmidwest/28070536882,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\ndf157b14ea171e02,https://c1.staticflickr.com/8/7533/26773587510_5999cba210_o.jpg,0.28125,0.0,0.84375,0.75,583,433,https://www.flickr.com/photos/wdm/26773587510,https://creativecommons.org/licenses/by/2.0/,Global Justice Now,https://www.flickr.com/people/wdm/\necdab98dacbe3d58,https://c1.staticflickr.com/8/7320/28305777715_355e845db5_o.jpg,0.0,0.25,0.75,1.0,519,952,https://www.flickr.com/photos/cdorobek/28305777715,https://creativecommons.org/licenses/by/2.0/,cdorobek,https://www.flickr.com/people/cdorobek/\na0f9e48e416b9c5e,https://c1.staticflickr.com/9/8624/28626740361_c855b93286_o.jpg,0.28125,0.25,0.84375,1.0,978,603,https://www.flickr.com/photos/rubenholthuijsen/28626740361,https://creativecommons.org/licenses/by/2.0/,Ruben Holthuijsen,https://www.flickr.com/people/rubenholthuijsen/\n7857c2b2999b6b0d,https://c1.staticflickr.com/3/2906/32558384970_ceb24c1d54_o.jpg,0.278188180404,0.0,0.834564541213,0.75,672,556,https://www.flickr.com/photos/glorycycles/32558384970,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n030299994195bfce,https://c1.staticflickr.com/1/778/31882074812_e60fd2cf6f_o.jpg,0.0,0.4375,0.75,1.0,108,742,https://www.flickr.com/photos/jimg944/31882074812,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n83cda72183d07403,https://c1.staticflickr.com/1/442/31774644395_23edfde293_o.jpg,0.0,0.0,0.666666666667,1.0,662,272,https://flickr.com/52900873@N07/31774644395,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n66c944832f2dff9b,https://c1.staticflickr.com/9/8713/28072908740_31a0ed3822_o.jpg,0.37517831669,0.0,1.0,1.0,986,998,https://www.flickr.com/photos/tdlucas5000/28072908740,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/\ncbc736fa6c22c310,https://c1.staticflickr.com/9/8795/29006826755_35d62f18b9_o.jpg,0.279641185647,0.25,0.838923556942,1.0,672,814,https://www.flickr.com/photos/glorycycles/29006826755,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n3325c4a2925a340e,https://c1.staticflickr.com/1/771/32998643591_910b4b3beb_o.jpg,0.5,0.25,1.0,1.0,960,199,https://www.flickr.com/photos/nebulux/32998643591/in/pool-43256560@N00,https://creativecommons.org/licenses/by/2.0/,Luca Nebuloni,https://www.flickr.com/people/nebulux/\n1b8d39f69d5e8c3f,https://c1.staticflickr.com/6/5801/30290607124_72fa7250f1_o.jpg,0.0,0.25,0.501846381093,1.0,844,447,https://www.flickr.com/photos/79157069@N03/30290607124,https://creativecommons.org/licenses/by/2.0/,Matthew Paul  Argall,https://www.flickr.com/people/79157069@N03/\n72fe8329bb9774c9,https://c1.staticflickr.com/8/7362/27440539410_a768de9340_o.jpg,0.4375,0.0,1.0,0.75,960,554,https://www.flickr.com/photos/garysoup/27440539410,https://creativecommons.org/licenses/by/2.0/,Gary Stevens,https://www.flickr.com/people/garysoup/\ndb81b88f999b32f6,https://c1.staticflickr.com/9/8231/29099596116_99fbcccbd1_o.jpg,0.25,0.0,1.0,0.75,312,548,https://www.flickr.com/photos/michperu/29099596116,https://creativecommons.org/licenses/by/2.0/,Manuel Iglesias,https://www.flickr.com/people/michperu/\n8c1296e3fc73bb1a,https://c1.staticflickr.com/9/8441/29179315444_06a54e7436_o.jpg,0.282874617737,0.0,1.0,1.0,361,386,https://www.flickr.com/photos/david_e_smith/29179315444,https://creativecommons.org/licenses/by/2.0/,Dave_S.,https://www.flickr.com/people/david_e_smith/\n70b0e2cc661a63f0,https://c1.staticflickr.com/9/8488/29104573545_a377f7e200_o.jpg,0.25,0.0,1.0,1.0,579,254,https://www.flickr.com/photos/jeanlouis_zimmermann/29104573545/,https://creativecommons.org/licenses/by/2.0/,jean-louis Zimmermann,https://www.flickr.com/people/jeanlouis_zimmermann/\n1b8260275b57ce4b,https://c1.staticflickr.com/3/2029/31970322924_372c8919ba_o.jpg,0.0,0.0,1.0,1.0,220,819,https://www.flickr.com/photos/neilconway/31970322924/,https://creativecommons.org/licenses/by/2.0/,Neil Conway,https://www.flickr.com/people/neilconway/\n679b40aa6d623f1f,https://c1.staticflickr.com/8/7419/27369234931_9fbf5366c3_o.jpg,0.0,0.0,0.75,1.0,278,549,https://www.flickr.com/photos/x1brett/27369234931,https://creativecommons.org/licenses/by/2.0/,brett jordan,https://www.flickr.com/people/x1brett/\n473fd74f857f489f,https://c1.staticflickr.com/9/8849/28177283111_a368e3a29f_o.jpg,0.0,0.25,0.56338028169,1.0,309,899,https://www.flickr.com/photos/treegrow/28177283111/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n13fa007af4c90377,https://c1.staticflickr.com/9/8114/28747696454_f816655fdf_o.jpg,0.5,0.25,1.0,1.0,480,114,https://www.flickr.com/photos/concavowheels/28747696454,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/\nf583ebbd91c7d891,https://c1.staticflickr.com/8/7692/27208977994_f5e5309957_o.jpg,0.28125,0.0,0.84375,0.75,459,807,https://www.flickr.com/photos/24701549@N07/27208977994,https://creativecommons.org/licenses/by/2.0/,Spudgun67,https://www.flickr.com/people/24701549@N07/\n0c864e8f9f7216d0,https://c1.staticflickr.com/9/8542/29761231960_324c7a4c76_o.jpg,0.0,0.43661971831,0.75,1.0,407,465,https://www.flickr.com/photos/eltb/29761231960,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n5c2c04b0db771072,https://c1.staticflickr.com/1/264/31923137994_eafe8e62ec_o.jpg,0.486899563319,0.0,0.973799126638,0.75,548,689,https://www.flickr.com/photos/robdammers/31923137994,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n3cbf354dcd0b36e8,https://c1.staticflickr.com/8/7320/26224776183_07d754f1cd_o.jpg,0.0,0.0,0.5,0.75,968,435,https://www.flickr.com/photos/barnimages/26224776183,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\n004c8b201b15928f,https://c1.staticflickr.com/3/2286/32230204114_571f186095_o.jpg,0.5,0.0,1.0,0.75,568,665,https://www.flickr.com/photos/yourbestdigs/32230204114/,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\n0c3e91cefdad2428,https://c1.staticflickr.com/8/7659/26771331246_cbc82f8b7b_o.jpg,0.443623639191,0.25,1.0,1.0,614,487,https://www.flickr.com/photos/cinz/26771331246,https://creativecommons.org/licenses/by/2.0/,Shinji,https://www.flickr.com/people/cinz/\n96b1b786ac09a1ac,https://c1.staticflickr.com/9/8414/30276301361_eabd80eff1_o.jpg,0.0,0.0,0.69578313253,1.0,848,161,https://www.flickr.com/photos/13476480@N07/30276301361,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\ndc0efd47be5140b1,https://c1.staticflickr.com/6/5195/30053789425_38e265540a_o.jpg,0.502573529412,0.0,1.0,0.75,347,115,https://www.flickr.com/photos/agenciabrasilia/30053789425,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n58530618c15ff420,https://c1.staticflickr.com/8/7300/27200571160_2b28c7a3a1_o.jpg,0.28125,0.25,0.84375,1.0,321,887,https://www.flickr.com/photos/12394349@N06/27200571160/,https://creativecommons.org/licenses/by/2.0/,Bryn Pinzgauer,https://www.flickr.com/people/12394349@N06/\n87877cf959f78732,https://c1.staticflickr.com/1/506/31605514081_7261f85462_o.jpg,0.25,0.0,1.0,1.0,99,759,https://www.flickr.com/photos/16801915@N06/31605514081,https://creativecommons.org/licenses/by/2.0/,Reading Tom,https://www.flickr.com/people/16801915@N06/\n45d73dda35861874,https://c1.staticflickr.com/3/2902/33062377700_13413c8ca8_o.jpg,0.0,0.0,1.0,1.0,672,364,https://www.flickr.com/photos/glorycycles/33062377700,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\nd2ef8ec7dd167c76,https://c1.staticflickr.com/6/5586/30370381796_9d2a7b4181_o.jpg,0.0,0.0,0.5625,0.75,16,282,https://www.flickr.com/photos/mikeprince/30370381796,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/\n799da227df8b4e77,https://c1.staticflickr.com/1/575/31476000773_4fc5727559_o.jpg,0.25,0.0,1.0,0.47170487106,85,967,https://www.flickr.com/photos/amyn-design/31476000773/,https://creativecommons.org/licenses/by/2.0/,Amy Nelson,https://www.flickr.com/people/amyn-design/\n88f0980e97356399,https://c1.staticflickr.com/1/273/31817774171_eae4ec5b6f_o.jpg,0.24882629108,0.0,1.0,1.0,976,709,https://www.flickr.com/photos/kudumomo/31817774171,https://creativecommons.org/licenses/by/2.0/,momo,https://www.flickr.com/people/kudumomo/\ndb76bccee82f7f8f,https://c1.staticflickr.com/6/5711/30482708996_e96c060825_o.jpg,0.0,0.0,0.720858895706,1.0,325,169,https://www.flickr.com/photos/42244964@N03/30482708996,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/\n1b77d21b74e2dc35,https://c1.staticflickr.com/8/7176/27262771224_303bfcdf9a_o.jpg,0.499263622975,0.0,0.99852724595,0.75,596,114,https://www.flickr.com/photos/inra_dist/27262771224/,https://creativecommons.org/licenses/by/2.0/,INRA DIST,https://www.flickr.com/people/inra_dist/\n703e9ef52c2e04bd,https://c1.staticflickr.com/9/8857/27752788674_fa4bc852ba_o.jpg,0.0,0.536576704545,0.75,1.0,407,544,https://www.flickr.com/photos/eltb/27752788674,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nd44afe32a7287d09,https://c1.staticflickr.com/8/7290/26961936063_7f09dc37b1_o.jpg,0.0,0.330871491876,1.0,1.0,407,971,https://www.flickr.com/photos/eltb/26961936063,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n65c6c3c590b66871,https://c1.staticflickr.com/9/8173/29046672406_7bd75f14a8_o.jpg,0.4375,0.25,1.0,1.0,920,761,https://www.flickr.com/photos/satguru/29046672406,https://creativecommons.org/licenses/by/2.0/,David Howard,https://www.flickr.com/people/satguru/\nc6a4a4eca84a2e21,https://c1.staticflickr.com/6/5565/30593356672_bdd01715ac_o.jpg,0.200323101777,0.0,1.0,1.0,629,843,https://www.flickr.com/photos/prayitnophotography/30593356672,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\na8f2ebbeccc63abe,https://c1.staticflickr.com/1/483/31438856353_12ea40b059_o.jpg,0.5,0.25,1.0,1.0,546,570,https://www.flickr.com/photos/quinet/31438856353,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n3ff325032a8ab559,https://c1.staticflickr.com/8/7536/26963595501_eef8836169_o.jpg,0.502573529412,0.0,1.0,0.75,405,599,https://www.flickr.com/photos/levien66/26963595501,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/\n4d49879177e0eea6,https://c1.staticflickr.com/8/7341/26963890305_59e15c769c_o.jpg,0.57825203252,0.0,1.0,0.75,405,471,https://www.flickr.com/photos/n28307/26963890305,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/\n5f144a84f5d75a9c,https://c1.staticflickr.com/6/5476/30112378190_854945314a_o.jpg,0.28125,0.0,0.84375,0.75,320,452,https://www.flickr.com/photos/mikeprince/30112378190,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/\ndac06b10238a4a49,https://c1.staticflickr.com/3/2133/32131147354_94e2f50a17_o.jpg,0.497411242604,0.0,1.0,0.75,405,429,http://www.flickr.com/photos/barteq24/32131147354/,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/\n609cf244157cba54,https://c1.staticflickr.com/1/670/31654292734_c3d48747cf_o.jpg,0.25,0.0,1.0,0.75,91,353,https://www.flickr.com/photos/30478819@N08/31654292734,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n54fb3570cb5977a3,https://c1.staticflickr.com/9/8495/28953033861_2e516546db_o.jpg,0.0,0.0,0.5,0.75,896,979,https://www.flickr.com/photos/markyharky/28953033861,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\ne2ef4b83d2de4828,https://c1.staticflickr.com/9/8045/28966409603_c77747ae7d_o.jpg,0.255402384501,0.25,0.766207153502,1.0,875,583,https://www.flickr.com/photos/bazzadarambler/28966409603,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\n0be8905339fd536e,https://c1.staticflickr.com/9/8707/29057281054_cbb0122650_o.jpg,0.0,0.0,0.75,0.75,920,766,https://www.flickr.com/photos/ruthanddave/29057281054,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n7896d3b14fb5538d,https://c1.staticflickr.com/8/7484/27250922062_bd821b922d_o.jpg,0.0,0.0,0.75,0.5,558,837,https://www.flickr.com/photos/dfmagazine/27250922062,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/\n7ff9b7f8f29873c9,https://c1.staticflickr.com/9/8457/28607014944_91a3542f58_o.jpg,0.25,0.0,0.75,0.75,662,667,https://www.flickr.com/photos/sg2012/28607014944,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/\n41c3b2d9446bbaed,https://c1.staticflickr.com/9/8689/30107432471_d4c4c3930e_o.jpg,0.0,0.0,0.496696035242,0.75,896,280,https://www.flickr.com/photos/ganatlguard/30107432471/,https://creativecommons.org/licenses/by/2.0/,Georgia National Guard,https://www.flickr.com/people/ganatlguard/\nd3b759942f8ab20c,https://c1.staticflickr.com/6/5831/30468139805_0f0765fb43_o.jpg,0.0,0.25,0.5,1.0,760,493,https://www.flickr.com/photos/janitors/30468139805,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n0b2ebcad9b6b04ed,https://c1.staticflickr.com/9/8618/29600991024_9d6581352e_o.jpg,0.25,0.0,0.75,0.75,252,706,https://flickr.com/36967498@N00/29600991024,https://creativecommons.org/licenses/by/2.0/,Stewart Black,https://www.flickr.com/people/s2ublack/\nac24675cc7fc5ccf,https://c1.staticflickr.com/1/711/32082259560_0ec4c89ee9_o.jpg,0.238832853026,0.25,0.716498559078,1.0,706,633,https://www.flickr.com/photos/robdammers/32082259560/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n529f436e2f35d426,https://c1.staticflickr.com/2/1610/26699474741_6e62f96180_o.jpg,0.25,0.0,1.0,1.0,459,748,https://www.flickr.com/photos/21022123@N04/26699474741,https://creativecommons.org/licenses/by/2.0/,Mike Steele,https://www.flickr.com/people/21022123@N04/\n62c135af8db76c3a,https://c1.staticflickr.com/6/5264/29447017183_28f447f3ae_o.jpg,0.0,0.0,0.75,0.599757673667,442,630,https://www.flickr.com/photos/bluemarleysabyss/29447017183,https://creativecommons.org/licenses/by/2.0/,Julia S.,https://www.flickr.com/people/bluemarleysabyss/\nf72e3fd7f727c2a6,https://c1.staticflickr.com/6/5730/31178847936_b0c3a77627_o.jpg,0.25,0.25,0.75,1.0,971,584,https://www.flickr.com/photos/lwpkommunikacio/31178847936,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\n30f328f660014029,https://c1.staticflickr.com/9/8439/28427979614_a1a0d819a2_o.jpg,0.46493902439,0.25,1.0,1.0,426,555,https://www.flickr.com/photos/aasenhistorie/28427979614,https://creativecommons.org/licenses/by/2.0/,\\303\\205sen Museum og Historielag,https://www.flickr.com/people/aasenhistorie/\nb50533e1634a8943,https://c1.staticflickr.com/6/5519/30105715123_8f491caa5e_o.jpg,0.0,0.0,1.0,0.75117370892,407,901,https://www.flickr.com/photos/tracyhunter/30105715123,https://creativecommons.org/licenses/by/2.0/,Tracy Hunter,https://www.flickr.com/people/tracyhunter/\n81c07da07223ed89,https://c1.staticflickr.com/9/8730/28570210961_6d7733f1b8_o.jpg,0.25,0.0,0.75,0.75,555,269,https://www.flickr.com/photos/newsoresund/28570210961,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/\n3448804066f16c37,https://c1.staticflickr.com/9/8349/28946165353_336da3277a_o.jpg,0.475899280576,0.0,0.951798561151,0.75,512,434,https://www.flickr.com/photos/autohistorian/28946165353,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\na6c510df520914c6,https://c1.staticflickr.com/9/8506/28677341724_7cee37d92e_o.jpg,0.0,0.0,0.5,0.75,539,668,https://www.flickr.com/photos/eyeliam/28677341724/,https://creativecommons.org/licenses/by/2.0/,Jason Lander,https://www.flickr.com/people/eyeliam/\n78bb3a8208f47f7b,https://c1.staticflickr.com/3/2948/33000958675_e69128b8c5_o.jpg,0.0,0.0,0.666666666667,1.0,699,626,https://www.flickr.com/photos/markwatmough/33000958675/,https://creativecommons.org/licenses/by/2.0/,mark.watmough,https://www.flickr.com/people/markwatmough/\na78590cc28b07258,https://c1.staticflickr.com/6/5696/30634620062_38c9afa452_o.jpg,0.0,0.0,1.0,0.88926746167,611,496,https://flickr.com/128305985@N02/30634620062,https://creativecommons.org/licenses/by/2.0/,Varevo Designs,https://www.flickr.com/people/128305985@N02/\n7a30de2397718aa2,https://c1.staticflickr.com/8/7750/29099960354_0191f35723_o.jpg,0.0,0.25,0.5,1.0,973,768,https://www.flickr.com/photos/blmoregon/29099960354,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\n33adc352db08207f,https://c1.staticflickr.com/8/7335/26932729984_78b316ab0c_o.jpg,0.335459183673,0.0,1.0,0.75,309,759,https://www.flickr.com/photos/gails_pictures/26932729984,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n3bd230a5c748b967,https://c1.staticflickr.com/1/546/31693442786_5d260caf61_o.jpg,0.0,0.0,0.75,1.0,612,457,https://flickr.com/65490292@N04/31693442786,https://creativecommons.org/licenses/by/2.0/,Ralph Bean,https://www.flickr.com/people/65490292@N04/\nd7150179f6c4fe3c,https://c1.staticflickr.com/3/2496/32790746532_1be412e76a_o.jpg,0.0,0.264758497317,0.75,1.0,512,863,https://www.flickr.com/photos/benoit59/32790746532/,https://creativecommons.org/licenses/by/2.0/,Benoit Brouillette,https://www.flickr.com/people/benoit59/\ncf9d921917a6554c,https://c1.staticflickr.com/1/580/31661883220_3f8caab15a_o.jpg,0.0,0.0,0.5625,0.75,850,515,https://www.flickr.com/photos/dalbera/31661883220,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n0cf2914d57489e56,https://c1.staticflickr.com/8/7512/27082092650_0f9cc7f7b4_o.jpg,0.0,0.25,0.421177266576,1.0,26,857,https://www.flickr.com/photos/aries_tottle/27082092650,https://creativecommons.org/licenses/by/2.0/,Miltos Gikas,https://www.flickr.com/people/aries_tottle/\n175b1b150b013730,https://c1.staticflickr.com/9/8695/29523879682_7533c08fcb_o.jpg,0.491827637444,0.0,1.0,0.75,760,457,https://www.flickr.com/photos/25797459@N06/29523879682,https://creativecommons.org/licenses/by/2.0/,zaphad1,https://www.flickr.com/people/25797459@N06/\n1c425046c735e989,https://c1.staticflickr.com/1/745/32677244540_d6ff6400ae_o.jpg,0.522334293948,0.0,1.0,0.75,114,921,https://www.flickr.com/photos/gaby1/32677244540,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\n1ac9e0c3d0e14268,https://c1.staticflickr.com/9/8709/29085635210_85c9c5714c_o.jpg,0.478162650602,0.25,1.0,1.0,437,795,https://www.flickr.com/photos/autohistorian/29085635210,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n4252ecd59afccd3f,https://c1.staticflickr.com/8/7481/27010291333_882a14eac4_o.jpg,0.5,0.25,1.0,1.0,820,167,https://www.flickr.com/photos/144048739@N03/27010291333/,https://creativecommons.org/licenses/by/2.0/,Welcome2 Stay,https://www.flickr.com/people/144048739@N03/\n15553549d8ba09db,https://c1.staticflickr.com/1/491/32622491025_bfc461fe60_o.jpg,0.531383737518,0.0,1.0,0.75,986,442,https://www.flickr.com/photos/tdlucas5000/32622491025,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/\n61f540b31d01d04d,https://c1.staticflickr.com/6/5640/31291683871_81530936dc_o.jpg,0.0,0.25,0.5625,1.0,980,982,https://www.flickr.com/photos/amanderson/31291683871,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n3481a5377492c949,https://c1.staticflickr.com/1/561/31459916693_1fdedb7e70_o.jpg,0.25,0.25,1.0,1.0,605,641,https://flickr.com/137731904@N05/31459916693,https://creativecommons.org/licenses/by/2.0/,Natalia Medd,https://www.flickr.com/people/137731904@N05/\n7445dda526ef4e1a,https://c1.staticflickr.com/8/7348/27422909344_016e63cd7b_o.jpg,0.246162280702,0.25,0.738486842105,1.0,971,898,https://www.flickr.com/photos/67769979@N06/27422909344,https://creativecommons.org/licenses/by/2.0/,Robert J Heath,https://www.flickr.com/people/67769979@N06/\n4758e82e4d0eae1e,https://c1.staticflickr.com/8/7513/27440705685_948b30fa4c_o.jpg,0.421177266576,0.25,0.842354533153,1.0,792,546,https://www.flickr.com/photos/126337928@N05/27440705685,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\n2505e254190fe9d4,https://c1.staticflickr.com/1/290/32211735440_48219aa2e8_o.jpg,0.0,0.25,0.56338028169,1.0,309,245,https://www.flickr.com/photos/treegrow/32211735440,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\na96760eb484b75fb,https://c1.staticflickr.com/8/7490/29293364683_5668ef3b8d_o.jpg,0.0,0.0,1.0,0.666666666667,820,446,https://www.flickr.com/photos/danielecirillo/29293364683,https://creativecommons.org/licenses/by/2.0/,Daniele Cirillo,https://www.flickr.com/people/danielecirillo/\n938bea8b4ab594bd,https://c1.staticflickr.com/1/570/32266031296_27a364c086_o.jpg,0.394886363636,0.0,1.0,0.75,437,777,https://flickr.com/65344061@N06/32266031296,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\neb1856e56e61fab8,https://c1.staticflickr.com/9/8095/29161283935_536097e8b5_o.jpg,0.0,0.25,0.421177266576,1.0,625,617,https://www.flickr.com/photos/biblincoln/29161283935,https://creativecommons.org/licenses/by/2.0/,Biblioteca Centro Lincoln,https://www.flickr.com/people/biblincoln/\n0a15b5d1c46c744d,https://c1.staticflickr.com/6/5758/31148022711_c6bf92f9bc_o.jpg,0.4375,0.25,1.0,1.0,426,739,https://www.flickr.com/photos/dave_mcmt/31148022711/,https://creativecommons.org/licenses/by/2.0/,David Schott,https://www.flickr.com/people/dave_mcmt/\ncf19139ce2adc82b,https://c1.staticflickr.com/1/392/32273907362_0741221913_o.jpg,0.419316375199,0.25,1.0,1.0,323,860,https://www.flickr.com/photos/gails_pictures/32273907362,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n13e7182ba061a3c4,https://c1.staticflickr.com/9/8589/28841296862_f840d0085b_o.jpg,0.0,0.0,0.666666666667,1.0,979,88,https://www.flickr.com/photos/byjpan/28841296862/,https://creativecommons.org/licenses/by/2.0/,Jack P.,https://www.flickr.com/people/byjpan/\n8dd5fbee4eb2386b,https://c1.staticflickr.com/9/8208/29852137561_e2e9180845_o.jpg,0.4375,0.0,1.0,0.75,891,886,https://www.flickr.com/photos/79649963@N05/29852137561,https://creativecommons.org/licenses/by/2.0/,Ian Smith,https://www.flickr.com/people/79649963@N05/\n3880e42cb2bfbb5b,https://c1.staticflickr.com/1/383/31462149674_2ee56fc772_o.jpg,0.25,0.25,1.0,1.0,970,983,https://flickr.com/7961680@N07/31462149674,https://creativecommons.org/licenses/by/2.0/,Per \\303\\205str\\303\\266m,https://www.flickr.com/people/perkovich/\n436e41e357a9a835,https://c1.staticflickr.com/9/8271/29684141221_a8435f2798_o.jpg,0.0,0.0,0.5625,0.75,672,847,https://www.flickr.com/photos/minnellium/29684141221,https://creativecommons.org/licenses/by/2.0/,Dave Haygarth,https://www.flickr.com/people/minnellium/\n5aab23ea4c920648,https://c1.staticflickr.com/3/2077/32924780511_0acf6402dc_o.jpg,0.333333333333,0.0,1.0,1.0,822,487,https://www.flickr.com/photos/jafsegal/32924780511,https://creativecommons.org/licenses/by/2.0/,Juan Antonio F. Segal,https://www.flickr.com/people/jafsegal/\n9939c12d26d8ab14,https://c1.staticflickr.com/8/7270/27346074952_1ae70d0378_o.jpg,0.0,0.0,0.5625,0.75,489,40,https://www.flickr.com/photos/jeepersmedia/27346074952,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nc660ae3e8f58c5a3,https://c1.staticflickr.com/2/1562/26160109253_b3cce3ffc9_o.jpg,0.0,0.0,0.75,0.547453703704,901,532,https://www.flickr.com/photos/kansallisarkisto/26160109253/,https://creativecommons.org/licenses/by/2.0/,Kansallisarkisto,https://www.flickr.com/people/kansallisarkisto/\ne5f0c68c9b17a3eb,https://c1.staticflickr.com/9/8587/27921604110_536872cda6_o.jpg,0.0,0.0,0.669128508124,1.0,407,10,https://www.flickr.com/photos/eltb/27921604110,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\na9968b7846f88291,https://c1.staticflickr.com/8/7455/27980114145_35b1d0cabe_o.jpg,0.0,0.25,0.599757673667,1.0,22,246,https://www.flickr.com/photos/andymorffew/27980114145,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\n930f631e3e4149be,https://c1.staticflickr.com/9/8553/29990415070_574c7905e3_o.jpg,0.0,0.0,0.75,1.0,336,183,https://www.flickr.com/photos/lisazins/29990415070,https://creativecommons.org/licenses/by/2.0/,Lisa Zins,https://www.flickr.com/people/lisazins/\n7127ae7a57a114d7,https://c1.staticflickr.com/8/7353/27534651771_77bf747d62_o.jpg,0.25,0.330508474576,1.0,0.991525423729,672,346,https://www.flickr.com/photos/dotcycling/27534651771,https://creativecommons.org/licenses/by/2.0/,Edward Madden,https://www.flickr.com/people/dotcycling/\nf95073995e824c79,https://c1.staticflickr.com/8/7642/28271573451_59ca11a3d3_o.jpg,0.386138613861,0.0,1.0,1.0,31,657,https://www.flickr.com/photos/22711505@N05/28271573451,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n22aae574860f7707,https://c1.staticflickr.com/8/7665/27997660340_840a807eb2_o.jpg,0.0,0.0,0.666666666667,1.0,563,121,https://www.flickr.com/photos/harshlight/27997660340,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\n83e5531f7a7bf763,https://c1.staticflickr.com/9/8335/29071834671_4bf25f0f50_o.jpg,0.0,0.0,0.75,0.75,437,177,https://www.flickr.com/photos/moto_club4ag/29071834671/,https://creativecommons.org/licenses/by/2.0/,Moto &quot;Club4AG&quot; Miwa,https://www.flickr.com/people/moto_club4ag/\nd24b711676595550,https://c1.staticflickr.com/9/8602/28370802293_10265f8778_o.jpg,0.0,0.0,0.75,1.0,846,709,https://www.flickr.com/photos/kozemchuk/28370802293/,https://creativecommons.org/licenses/by/2.0/,Cat Branchman,https://www.flickr.com/people/kozemchuk/\nffbd496a3773f272,https://c1.staticflickr.com/6/5459/29898011053_2579ca21d2_o.jpg,0.43661971831,0.0,1.0,0.75,699,913,https://www.flickr.com/photos/arjanrichter/29898011053,https://creativecommons.org/licenses/by/2.0/,Arjan Richter,https://www.flickr.com/people/arjanrichter/\n13ae47106ae4c6eb,https://c1.staticflickr.com/6/5455/31318534216_ba4f34ae37_o.jpg,0.0,0.25,0.545454545455,1.0,322,20,https://www.flickr.com/photos/gails_pictures/31318534216,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n3308d968dc5088ba,https://c1.staticflickr.com/2/1483/26170739964_ee08c5de3c_o.jpg,0.28125,0.25,0.84375,1.0,920,318,https://www.flickr.com/photos/raver_mikey/26170739964/,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/\n761e179b569cbb65,https://c1.staticflickr.com/8/7310/27459603174_df7f2cfaab_o.jpg,0.385686528497,0.25,0.771373056995,1.0,976,85,https://www.flickr.com/photos/bryce_edwards/27459603174,https://creativecommons.org/licenses/by/2.0/,Bryce Edwards,https://www.flickr.com/people/bryce_edwards/\nd55601ee34e61506,https://c1.staticflickr.com/1/732/32601252675_89d0ddb6a2_o.jpg,0.484397677794,0.0,0.968795355588,0.75,657,443,https://www.flickr.com/photos/nrmadriversseat/32601252675,https://creativecommons.org/licenses/by/2.0/,The NRMA,https://www.flickr.com/people/nrmadriversseat/\n4686354ec238f7fb,https://c1.staticflickr.com/1/264/31534645452_013364e969_o.jpg,0.496696035242,0.25,0.993392070485,1.0,699,383,https://www.flickr.com/photos/sybarite48/31534645452/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n943821e9d8495b9a,https://c1.staticflickr.com/1/547/31889107843_618ae4b2c6_o.jpg,0.0,0.299878836834,0.75,0.899636510501,714,586,https://flickr.com/89214878@N00/31889107843,https://creativecommons.org/licenses/by/2.0/,Mike P.,https://www.flickr.com/people/ncmichael2k3/\n0fd57e89e1f770a5,https://c1.staticflickr.com/8/7377/27802238295_88764abd6d_o.jpg,0.0,0.0,0.693233082707,1.0,556,2,https://www.flickr.com/photos/alan-light/27802238295/,https://creativecommons.org/licenses/by/2.0/,Alan Light,https://www.flickr.com/people/alan-light/\na3eb4aa2487253b8,https://c1.staticflickr.com/9/8156/29163978463_aa190b7c63_o.jpg,0.25,0.25,0.75,1.0,920,746,https://www.flickr.com/photos/shankaronline/29163978463,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n78f92d7dc8fefe9d,https://c1.staticflickr.com/9/8269/30167528292_da6c18aa78_o.jpg,0.0,0.0,0.75,0.56015625,429,146,https://www.flickr.com/photos/usfwsmtnprairie/30167528292,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n74a81b0154ea464c,https://c1.staticflickr.com/8/7020/26868558415_05d919684d_o.jpg,0.348396501458,0.0,1.0,1.0,822,570,https://www.flickr.com/photos/109484664@N04/26868558415,https://creativecommons.org/licenses/by/2.0/,\\345\\220\\263\\346\\255\\243\\345\\275\\245,https://www.flickr.com/people/109484664@N04/\nb95d98b194ffd652,https://c1.staticflickr.com/9/8654/28328913461_e88822fe56_o.jpg,0.467549476135,0.0,0.779249126892,0.75,405,888,https://www.flickr.com/photos/hisgett/28328913461/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n4b74a811cccfe27c,https://c1.staticflickr.com/6/5819/29487034154_bc83ff5ab8_o.jpg,0.0,0.25,0.5,1.0,909,190,https://www.flickr.com/photos/docsearls/29487034154/,https://creativecommons.org/licenses/by/2.0/,Doc Searls,https://www.flickr.com/people/docsearls/\n022464a6b73ac78f,https://c1.staticflickr.com/1/335/32308860330_9db300711d_o.jpg,0.400242326333,0.25,1.0,1.0,747,767,https://www.flickr.com/photos/mark6mauno/32308860330,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/\n830f84f8ff5f8624,https://c1.staticflickr.com/8/7559/29572697533_022c278169_o.jpg,0.0,0.0,0.681583476764,0.75,739,789,https://flickr.com/33497841@N02/29572697533,https://creativecommons.org/licenses/by/2.0/,Andrey Zharkikh,https://www.flickr.com/people/zharkikh/\nee25ae4ed614485f,https://c1.staticflickr.com/9/8838/28758406970_66f6582fd4_o.jpg,0.25,0.25,1.0,1.0,986,727,https://www.flickr.com/photos/12463666@N03/28758406970,https://creativecommons.org/licenses/by/2.0/,Bob  M ~,https://www.flickr.com/people/12463666@N03/\nd1626847eb98b247,https://c1.staticflickr.com/6/5063/29568931484_b3c42d4148_o.jpg,0.0,0.0,0.5,0.75,297,667,https://www.flickr.com/photos/happymillerman/29568931484,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\n48bd18a61e43362e,https://c1.staticflickr.com/6/5540/31051504785_5a5359ab3d_o.jpg,0.0,0.0,0.75,0.695187165775,922,239,https://www.flickr.com/photos/puzzlemaster/31051504785,https://creativecommons.org/licenses/by/2.0/,Dave Miller,https://www.flickr.com/people/puzzlemaster/\ndf0a452152aefa20,https://c1.staticflickr.com/9/8553/30239978231_86d090f5ec_o.jpg,0.519869942197,0.0,1.0,0.75,780,219,https://www.flickr.com/photos/thoseguys119/30239978231,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nab9e5f0b8cd457be,https://c1.staticflickr.com/8/7704/28201446563_2e0b0f516d_o.jpg,0.24882629108,0.0,1.0,1.0,324,371,https://www.flickr.com/photos/treegrow/28201446563/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n00f30b1ace5ae152,https://c1.staticflickr.com/6/5490/31088690622_9d19050fe4_o.jpg,0.443623639191,0.25,1.0,1.0,978,757,https://www.flickr.com/photos/paytonc/31088690622/,https://creativecommons.org/licenses/by/2.0/,Payton Chung,https://www.flickr.com/people/paytonc/\n624f4ad22b2a5bdd,https://c1.staticflickr.com/9/8191/29205519803_16fe3aa9e7_o.jpg,0.0,0.0,0.63184079602,0.75,998,127,https://www.flickr.com/photos/35142635@N05/29205519803,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\nb829eb1561287f6f,https://c1.staticflickr.com/4/3950/32454933064_4df0afa09f_o.jpg,0.0,0.0,0.5,0.75,998,850,https://flickr.com/74747209@N05/32454933064,https://creativecommons.org/licenses/by/2.0/,David Lochlin,https://www.flickr.com/people/dlochlin/\nfe72e21a5d16f001,https://c1.staticflickr.com/9/8203/28034675473_144f9e33c5_o.jpg,0.0,0.0,0.5,0.75,971,106,https://www.flickr.com/photos/sheila_sund/28034675473,https://creativecommons.org/licenses/by/2.0/,Sheila Sund,https://www.flickr.com/people/sheila_sund/\n1e02553088db06e3,https://c1.staticflickr.com/8/7291/27318215660_97391b6f8f_o.jpg,0.4375,0.0,1.0,0.75,909,658,https://www.flickr.com/photos/shankaronline/27318215660/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n0d370461dfbb6f78,https://c1.staticflickr.com/8/7204/27652338732_3cc9e7e348_o.jpg,0.0,0.0,0.662261380323,1.0,23,511,https://www.flickr.com/photos/robbertholf/27652338732/,https://creativecommons.org/licenses/by/2.0/,Rob Bertholf,https://www.flickr.com/people/robbertholf/\n92c8b80c0405671e,https://c1.staticflickr.com/6/5531/31038812965_4ca96063df_o.jpg,0.25,0.25,0.75,1.0,981,795,https://www.flickr.com/photos/amslerpix/31038812965/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n51b9093b57d20ebe,https://c1.staticflickr.com/6/5555/30544141035_c9959e867e_o.jpg,0.0,0.0,0.666666666667,1.0,512,318,https://www.flickr.com/photos/gee01/30544141035/,https://creativecommons.org/licenses/by/2.0/,Graeme Maclean,https://www.flickr.com/people/gee01/\n448c21b53f99400c,https://c1.staticflickr.com/9/8742/29102656201_0b787e2ca0_o.jpg,0.28125,0.25,0.84375,1.0,889,659,https://www.flickr.com/photos/fdecomite/29102656201/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\nc209cb0358249ce7,https://c1.staticflickr.com/8/7368/26794305835_9e36031c97_o.jpg,0.328402366864,0.0,1.0,1.0,699,798,https://www.flickr.com/photos/lac-bac/26794305835,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/\nee3b28e75e65908a,https://c1.staticflickr.com/8/7298/27492883865_04c618b397_o.jpg,0.0,0.25,0.42174796748,1.0,4,334,https://www.flickr.com/photos/wilfred_hdez/27492883865/,https://creativecommons.org/licenses/by/2.0/,Wilfred Hdez,https://www.flickr.com/people/wilfred_hdez/\n388afbac9bd4e1b7,https://c1.staticflickr.com/9/8889/28101646034_15960cbc8c_o.jpg,0.25,0.25,0.75,1.0,699,482,https://www.flickr.com/photos/renaud-camus/28101646034,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/\nce6a112449ace122,https://c1.staticflickr.com/6/5338/30689455610_d4e8f21f57_o.jpg,0.25,0.0,0.75,0.75,840,852,https://www.flickr.com/photos/subharnab/30689455610/,https://creativecommons.org/licenses/by/2.0/,Subharnab Majumdar,https://www.flickr.com/people/subharnab/\n0bbf6087d1544642,https://c1.staticflickr.com/1/486/31615343902_c1f810ddef_o.jpg,0.4375,0.0,1.0,0.75,628,575,https://flickr.com/27665395@N05/31615343902,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n77bf5d409965f13c,https://c1.staticflickr.com/9/8118/29370307653_669bdf9f16_o.jpg,0.0,0.0,0.666666666667,1.0,406,580,https://flickr.com/49969498@N02/29370307653,https://creativecommons.org/licenses/by/2.0/,Robert Bell,https://www.flickr.com/people/roberttbell/\n31ace54344e225ec,https://c1.staticflickr.com/1/320/31213770534_06e172c749_o.jpg,0.0,0.0,1.0,1.0,441,663,https://flickr.com/125112383@N06/31213770534,https://creativecommons.org/licenses/by/2.0/,Shelby Bell,https://www.flickr.com/people/vwcampin/\na4877b3f0b5e4c64,https://c1.staticflickr.com/9/8480/28734303610_0109d83a82_o.jpg,0.28125,0.0,0.84375,0.75,763,576,https://www.flickr.com/photos/andrewmilligansumo/28734303610,https://creativecommons.org/licenses/by/2.0/,Andrew Milligan Sumo,https://www.flickr.com/people/andrewmilligansumo/\n2cd4f0f862b967ed,https://c1.staticflickr.com/6/5800/30170623111_3fe4f7d579_o.jpg,0.4375,0.0,1.0,0.75,570,543,https://www.flickr.com/photos/27665395@N05/30170623111,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n433d908574893a88,https://c1.staticflickr.com/8/7253/27448977372_9ce72750d8_o.jpg,0.5,0.0,1.0,0.75,405,416,https://www.flickr.com/photos/alessandroambrosetti/27448977372,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/\n82dc0005f56c5499,https://c1.staticflickr.com/8/7655/27692948024_ae66e47c06_o.jpg,0.272727272727,0.0,1.0,1.0,548,831,https://www.flickr.com/photos/mtacc-esa/27692948024,https://creativecommons.org/licenses/by/2.0/,MTA Capital Construction Mega Projects,https://www.flickr.com/people/mtacc-esa/\nc32895e1183e0bcc,https://c1.staticflickr.com/6/5481/31308520082_f2fc661083_o.jpg,0.5,0.25,1.0,1.0,699,447,https://www.flickr.com/photos/shankaronline/31308520082,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nbeab23c3bd78ee31,https://c1.staticflickr.com/9/8270/30100945556_52b57cc499_o.jpg,0.337738619677,0.0,1.0,1.0,763,155,https://www.flickr.com/photos/ilri/30100945556,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/\na188e7eecac298c9,https://c1.staticflickr.com/9/8759/27916461194_f9ae15ec67_o.jpg,0.25,0.2806640625,1.0,0.8419921875,106,843,https://www.flickr.com/photos/icte-uq/27916461194,https://creativecommons.org/licenses/by/2.0/,ICTE-UQ,https://www.flickr.com/people/icte-uq/\nee0ca63700e017cf,https://c1.staticflickr.com/6/5518/30876259314_7f62b073d5_o.jpg,0.28125,0.0,0.84375,0.75,469,685,https://www.flickr.com/photos/27665395@N05/30876259314,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\ne753147a26dc7476,https://c1.staticflickr.com/1/575/31667531984_ebc2d85a0c_o.jpg,0.0,0.0,1.0,0.892491467577,314,297,https://www.flickr.com/photos/jsjgeology/31667531984,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n980bee466fe5c980,https://c1.staticflickr.com/6/5551/29766174040_1b52689746_o.jpg,0.4453125,0.25,0.890625,1.0,88,735,https://www.flickr.com/photos/usfwshq/29766174040,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/\nd32f8fed46bda042,https://c1.staticflickr.com/9/8307/28566983863_0d4cfffb1c_o.jpg,0.25,0.0,1.0,1.0,664,556,https://www.flickr.com/photos/127226743@N02/28566983863,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n363cdf064b191be6,https://c1.staticflickr.com/9/8657/29734087243_771e4dee66_o.jpg,0.0,0.25,0.75,1.0,825,998,https://flickr.com/52066925@N00/29734087243,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/\ncab419eb5d18f714,https://c1.staticflickr.com/6/5491/31201579991_26064abfc9_o.jpg,0.0,0.0,0.714503816794,1.0,404,70,https://www.flickr.com/photos/usnavy/31201579991,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n7389c22c093b8d92,https://c1.staticflickr.com/8/7320/27196339156_9287fc2d41_o.jpg,0.0,0.280226209048,0.75,0.840678627145,498,463,https://www.flickr.com/photos/adonmetcalfe/27196339156/,https://creativecommons.org/licenses/by/2.0/,Adon Metcalfe,https://www.flickr.com/people/adonmetcalfe/\n3e9ff6fcffd8a215,https://c1.staticflickr.com/8/7257/27583687250_fde805472c_o.jpg,0.0,0.0,1.0,0.75,953,278,https://www.flickr.com/photos/scotnelson/27583687250,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n6bfac6c17b68514e,https://c1.staticflickr.com/6/5657/31200173845_dcfd9baab4_o.jpg,0.38379705401,0.25,1.0,1.0,402,743,https://www.flickr.com/photos/arbron/31200173845,https://creativecommons.org/licenses/by/2.0/,Jeff Hitchcock,https://www.flickr.com/people/arbron/\n7feb0e015d912a52,https://c1.staticflickr.com/1/400/31689010341_9d4c68311b_o.jpg,0.249079528719,0.0,0.747238586156,0.75,768,542,https://www.flickr.com/photos/fukapon/31689010341,https://creativecommons.org/licenses/by/2.0/,Ryo FUKAsawa,https://www.flickr.com/people/fukapon/\n1c0a194ed36b0d9b,https://c1.staticflickr.com/1/564/32372194010_2a90b203e8_o.jpg,0.28125,0.0,0.84375,0.75,12,227,https://www.flickr.com/photos/9750464@N02/32372194010/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\nc4e68fafdab6b9fe,https://c1.staticflickr.com/1/439/31737271212_bfec6aa02f_o.jpg,0.25,0.0,0.75,0.75,788,808,https://www.flickr.com/photos/hinnosaar/31737271212/,https://creativecommons.org/licenses/by/2.0/,Marit &amp; Toomas Hinnosaar,https://www.flickr.com/people/hinnosaar/\nbf962faabe206781,https://c1.staticflickr.com/9/8514/29112927886_0fcb140c97_o.jpg,0.25,0.0,0.75,0.75,561,282,https://www.flickr.com/photos/trainor/29112927886,https://creativecommons.org/licenses/by/2.0/,John Trainor,https://www.flickr.com/people/trainor/\n1a6271e261fdfdf9,https://c1.staticflickr.com/9/8883/27906130124_49051d6888_o.jpg,0.25,0.0,1.0,1.0,983,798,https://flickr.com/87308807@N02/27906130124,https://creativecommons.org/licenses/by/2.0/,Iv\\303\\241n G\\303\\266ldner,https://www.flickr.com/people/goldnerivan/\nc585e06197b8c84a,https://c1.staticflickr.com/6/5453/30756196555_de7fdbc963_o.jpg,0.0,0.0,0.75,1.0,789,482,https://www.flickr.com/photos/southbeachcars/30756196555,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\ne0d9092114d277ec,https://c1.staticflickr.com/8/7265/26598960830_999907788f_o.jpg,0.0,0.0,0.75,1.0,441,915,https://www.flickr.com/photos/adactio/26598960830,https://creativecommons.org/licenses/by/2.0/,Jeremy Keith,https://www.flickr.com/people/adactio/\n1e8904b120e1f284,https://c1.staticflickr.com/9/8207/29915403766_aaae2f6871_o.jpg,0.0,0.25,0.5,1.0,696,396,https://www.flickr.com/photos/ratsiola/29915403766/,https://creativecommons.org/licenses/by/2.0/,Carole Ratcliffe,https://www.flickr.com/people/ratsiola/\ndaa831434205f3c3,https://c1.staticflickr.com/6/5481/30585811573_a82004afbb_o.jpg,0.486146095718,0.0,0.972292191436,1.0,514,490,https://flickr.com/7660730@N08/30585811573,https://creativecommons.org/licenses/by/2.0/,Jeremy Sutcliffe,https://www.flickr.com/people/jmts/\nf867b767f6b245cb,https://c1.staticflickr.com/6/5700/22845875308_0d921bb472_o.jpg,0.25578358209,0.0,0.767350746269,0.75,848,770,https://www.flickr.com/photos/13476480@N07/22845875308,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\naab252999b9b9014,https://c1.staticflickr.com/8/7259/26837019160_c030da6fe2_o.jpg,0.333333333333,0.0,1.0,1.0,440,317,https://www.flickr.com/photos/agenciabrasilia/26837019160,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n1a4a654761add5b3,https://c1.staticflickr.com/9/8835/27592931573_0760985b65_o.jpg,0.0,0.25,0.5625,1.0,970,634,https://www.flickr.com/photos/28655296@N05/27592931573,https://creativecommons.org/licenses/by/2.0/,Daniel Zemans,https://www.flickr.com/people/28655296@N05/\na0d5fed0fea4b616,https://c1.staticflickr.com/8/7449/27146181675_730600ae0b_o.jpg,0.248713235294,0.0,0.746139705882,0.75,536,894,https://flickr.com/41819313@N02/27146181675,https://creativecommons.org/licenses/by/2.0/,Kullez,https://www.flickr.com/people/kullez/\n9d243db2a0bf7869,https://c1.staticflickr.com/9/8119/28282479934_09da66c0e9_o.jpg,0.305872756933,0.25,0.917618270799,1.0,935,258,https://www.flickr.com/photos/personalcreations/28282479934,https://creativecommons.org/licenses/by/2.0/,Personal Creations,https://www.flickr.com/people/personalcreations/\n3a7bc8ed4b6dc324,https://c1.staticflickr.com/8/7216/27992528095_e4bf69b603_o.jpg,0.0,0.0,0.549459041731,0.75,672,216,https://www.flickr.com/photos/glorycycles/27992528095,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n008406d8927fdbcc,https://c1.staticflickr.com/6/5478/31105278941_fa9e75b0e4_o.jpg,0.0,0.0,1.0,1.0,734,397,https://www.flickr.com/photos/stoneysteiner/31105278941,https://creativecommons.org/licenses/by/2.0/,Urs Steiner,https://www.flickr.com/people/stoneysteiner/\nebeebcaa29004e3e,https://c1.staticflickr.com/6/5794/30525253662_7a30a520c3_o.jpg,0.400242326333,0.0,1.0,0.75,760,730,https://www.flickr.com/photos/29233640@N07/30525253662,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/\n0a99995ddb1867f3,https://c1.staticflickr.com/8/7403/28077883525_2bd2dcbca1_o.jpg,0.4375,0.0,1.0,0.75,728,167,https://www.flickr.com/photos/sansebastian2016/28077883525,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/\nf379d6c61b7a04ac,https://c1.staticflickr.com/8/7432/27059543105_d8e13c9f7a_o.jpg,0.0,0.25,0.347358722359,1.0,798,662,https://www.flickr.com/photos/22711505@N05/27059543105,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n31a1725470c1488a,https://c1.staticflickr.com/9/8411/30029130861_7b54ea1d60_o.jpg,0.0,0.0,0.657393850659,1.0,561,935,https://www.flickr.com/photos/codnewsroom/30029130861,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\n3fadb3547b49e42b,https://c1.staticflickr.com/1/329/30762790953_28b393240e_o.jpg,0.25,0.0,1.0,0.75,873,875,https://www.flickr.com/photos/brickset/30762790953,https://creativecommons.org/licenses/by/2.0/,Brickset,https://www.flickr.com/people/brickset/\nbb96c34e00d38548,https://c1.staticflickr.com/9/8415/29737698241_f8cf12c2b9_o.jpg,0.271313364055,0.25,0.813940092166,1.0,672,799,https://www.flickr.com/photos/minnellium/29737698241,https://creativecommons.org/licenses/by/2.0/,Dave Haygarth,https://www.flickr.com/people/minnellium/\n80c585c5254c437e,https://c1.staticflickr.com/9/8697/27905149733_516f45a4e3_o.jpg,0.530714285714,0.0,1.0,0.75,890,370,https://www.flickr.com/photos/130531732@N06/27905149733,https://creativecommons.org/licenses/by/2.0/,blake martin,https://www.flickr.com/people/130531732@N06/\n0930b8ffd43f34b1,https://c1.staticflickr.com/6/5519/30039197060_c1e5faa34e_o.jpg,0.333333333333,0.0,1.0,1.0,854,118,https://www.flickr.com/photos/slapers/30039197060,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\nc63cc3767c524369,https://c1.staticflickr.com/6/5468/31128860712_23523a37a2_o.jpg,0.249631811487,0.0,0.748895434462,0.75,405,473,https://www.flickr.com/photos/ronmacphotos/31128860712,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n0afba967c45abe04,https://c1.staticflickr.com/9/8548/29339278920_8609ec36b7_o.jpg,0.25,0.25,0.75,1.0,437,887,https://www.flickr.com/photos/greggjerdingen/29339278920,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n6981ca9d69e64abd,https://c1.staticflickr.com/6/5603/30480823370_46686876a0_o.jpg,0.279641185647,0.0,0.838923556942,0.75,566,926,https://www.flickr.com/photos/loshak/30480823370,https://creativecommons.org/licenses/by/2.0/,Daniel ............,https://www.flickr.com/people/loshak/\ncaddbedf7c8f6773,https://c1.staticflickr.com/2/1481/26682525762_24842d3ede_o.jpg,0.277173913043,0.25,0.83152173913,1.0,896,258,https://www.flickr.com/photos/watts_photos/26682525762/,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/\nf3a7808e587dfa4b,https://c1.staticflickr.com/9/8068/29607892536_c32a3c9625_o.jpg,0.0,0.0,0.710456942004,0.75,982,426,https://www.flickr.com/photos/apardavila/29607892536,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n4a79f29049b0a1f9,https://c1.staticflickr.com/8/7708/27426104300_1476f7bf87_o.jpg,0.0,0.0,0.665684830633,1.0,702,396,https://www.flickr.com/photos/7armyjmtc/27426104300/,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\nf2649bdb297c53a9,https://c1.staticflickr.com/8/7634/28075098296_a1161927d4_o.jpg,0.4435,0.25,1.0,1.0,338,451,https://www.flickr.com/photos/usdagov/28075098296,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n43c64978d0fbb6b8,https://c1.staticflickr.com/8/7214/26944572074_a2764006f3_o.jpg,0.4375,0.25,1.0,1.0,485,405,https://www.flickr.com/photos/mike_on_maui/26944572074,https://creativecommons.org/licenses/by/2.0/,Mike On Maui,https://www.flickr.com/people/mike_on_maui/\naa7bdaac048582b6,https://c1.staticflickr.com/6/5349/30840873650_452a29ab39_o.jpg,0.0,0.0,0.346012269939,0.75,780,866,https://www.flickr.com/photos/thoseguys119/30840873650/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n93935ce715ae7fbb,https://c1.staticflickr.com/6/5779/30658908161_ef8145c265_o.jpg,0.25,0.0,1.0,0.5625,973,509,https://www.flickr.com/photos/jsjgeology/30658908161,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n87eb904de9b971b6,https://c1.staticflickr.com/9/8708/29230988931_1fa482f1cd_o.jpg,0.333333333333,0.0,1.0,1.0,548,866,https://www.flickr.com/photos/rhemkes/29230988931,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\nd043e3efb7bec65b,https://c1.staticflickr.com/1/409/32368343910_00c1869788_o.jpg,0.25,0.0,0.75,0.75,324,79,https://www.flickr.com/photos/usfws_pacificsw/32368343910/,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/\n2d0db6d4241331e5,https://c1.staticflickr.com/8/7427/27202888920_8c18eebd4d_o.jpg,0.0,0.0,0.663235294118,1.0,583,285,https://www.flickr.com/photos/agenciabrasilia/27202888920,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\nd58141fef36305cc,https://c1.staticflickr.com/8/7183/27128807654_41bb42e10d_o.jpg,0.25,0.0,0.75,0.75,367,449,https://www.flickr.com/photos/tiborbkovacs/27128807654,https://creativecommons.org/licenses/by/2.0/,Tibor Kovacs,https://www.flickr.com/people/tiborbkovacs/\n5f2a8fc47dfdcb89,https://c1.staticflickr.com/3/2246/31996755134_c6f0bcb556_o.jpg,0.346121416526,0.0,1.0,0.75,304,660,https://www.flickr.com/photos/33398884@N03/31996755134/,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\n7c70bfac0d9e87f6,https://c1.staticflickr.com/8/7423/27409898083_7637e62431_o.jpg,0.25,0.0,1.0,0.599757673667,524,340,https://www.flickr.com/photos/jeffmarquis/27409898083/,https://creativecommons.org/licenses/by/2.0/,Jeff Marquis,https://www.flickr.com/people/jeffmarquis/\n52793d6197d6aa0f,https://c1.staticflickr.com/6/5499/30755112636_8d002b7c0f_o.jpg,0.25,0.0,0.75,0.75,760,385,http://www.flickr.com/photos/ronaldc5/30755112636/,https://creativecommons.org/licenses/by/2.0/,Ronald van der Graaf,https://www.flickr.com/people/ronaldc5/\nc5a8ac6184d5c69f,https://c1.staticflickr.com/9/8719/28884591926_fbc5cd67a9_o.jpg,0.28125,0.25,0.84375,1.0,896,739,https://www.flickr.com/photos/codnewsroom/28884591926,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\nb47f9e26e1ec653b,https://c1.staticflickr.com/9/8624/27623886903_bb07e068ea_o.jpg,0.25,0.0,0.75,0.75,905,60,https://www.flickr.com/photos/ben_salter/27623886903,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/\n1f6f48e7c81f5e25,https://c1.staticflickr.com/9/8186/28956447210_fb9b378044_o.jpg,0.333333333333,0.0,1.0,1.0,979,81,https://www.flickr.com/photos/steve_in_atlanta/28956447210,https://creativecommons.org/licenses/by/2.0/,Steve,https://www.flickr.com/people/steve_in_atlanta/\n13a6c001cdcc1c70,https://c1.staticflickr.com/9/8847/27880411473_b599b38056_o.jpg,0.0,0.0,0.666666666667,1.0,407,903,https://www.flickr.com/photos/larry1732/27880411473/,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/\nc9a443a5cc1acfdf,https://c1.staticflickr.com/9/8431/29010176581_6da873f60e_o.jpg,0.248348017621,0.25,0.745044052863,1.0,498,768,https://www.flickr.com/photos/sybarite48/29010176581,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nac360a84897a9bd5,https://c1.staticflickr.com/9/8303/29752226911_d87a3448c3_o.jpg,0.0,0.0,1.0,1.0,704,873,https://www.flickr.com/photos/mpclemens/29752226911,https://creativecommons.org/licenses/by/2.0/,mpclemens,https://www.flickr.com/people/mpclemens/\ne05d35da9e624c73,https://c1.staticflickr.com/9/8587/28595409065_2e029b5172_o.jpg,0.0,0.267938931298,0.75,0.803816793893,279,8,https://www.flickr.com/photos/blmidaho/28595409065,https://creativecommons.org/licenses/by/2.0/,BLMIdaho,https://www.flickr.com/people/blmidaho/\nb8f16a207bf4bbc4,https://c1.staticflickr.com/8/7477/27909350633_4c12522e42_o.jpg,0.25,0.25,0.75,1.0,820,97,https://www.flickr.com/photos/mtnorton/27909350633,https://creativecommons.org/licenses/by/2.0/,Mike Norton,https://www.flickr.com/people/mtnorton/\n3b6295b6cca8f76b,https://c1.staticflickr.com/6/5097/29423061494_de8a7f66d4_o.jpg,0.4375,0.25,1.0,1.0,941,65,https://www.flickr.com/photos/krossbow/29423061494,https://creativecommons.org/licenses/by/2.0/,F Delventhal,https://www.flickr.com/people/krossbow/\nf25c33076f4bd633,https://c1.staticflickr.com/9/8506/29978737455_88f9cd0cb4_o.jpg,0.500736377025,0.25,1.0,1.0,875,511,https://www.flickr.com/photos/brisbanecitycouncil/29978737455,https://creativecommons.org/licenses/by/2.0/,Brisbane City Council,https://www.flickr.com/people/brisbanecitycouncil/\n4ad26f8dec139f8a,https://c1.staticflickr.com/6/5648/30596701323_8aee729710_o.jpg,0.25,0.272307692308,1.0,0.816923076923,431,424,https://www.flickr.com/photos/klemencic/30596701323/,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/\na01282c9feab6368,https://c1.staticflickr.com/3/2745/32942643125_0c8f6c79f4_o.jpg,0.25,0.0,1.0,1.0,973,710,https://www.flickr.com/photos/woodhead/32942643125/,https://creativecommons.org/licenses/by/2.0/,jasonwoodhead23,https://www.flickr.com/people/woodhead/\n60af2cce23d19d1e,https://c1.staticflickr.com/9/8085/29345609630_2cc66ba555_o.jpg,0.25,0.502573529412,1.0,1.0,920,801,https://www.flickr.com/photos/slgc/29345609630,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\nc04f67393c22131f,https://c1.staticflickr.com/8/7327/26670688254_b6bbc5680d_o.jpg,0.4375,0.25,1.0,1.0,780,58,https://www.flickr.com/photos/thoseguys119/26670688254,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nc6471a50c7d67adb,https://c1.staticflickr.com/1/558/32159828690_5d79cce558_o.jpg,0.249631811487,0.0,0.748895434462,0.75,526,329,https://flickr.com/94132145@N04/32159828690,https://creativecommons.org/licenses/by/2.0/,Arjan,https://www.flickr.com/people/94132145@N04/\n204972369ced810e,https://c1.staticflickr.com/9/8885/28678093464_23e92d78fb_o.jpg,0.0,0.304782608696,0.75,1.0,707,698,https://www.flickr.com/photos/peterhess/28678093464,https://creativecommons.org/licenses/by/2.0/,Peter Alfred Hess,https://www.flickr.com/people/peterhess/\n9066202fcefbca71,https://c1.staticflickr.com/8/7406/27401837481_87a1de8737_o.jpg,0.5,0.0,1.0,0.75,874,906,https://www.flickr.com/photos/o_0/27401837481,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\nfb0092e7515cc5ea,https://c1.staticflickr.com/9/8700/29506539155_471666c5a8_o.jpg,0.25,0.25,0.75,1.0,896,438,https://www.flickr.com/photos/ronmacphotos/29506539155,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\nacee4c464ce69a1b,https://c1.staticflickr.com/6/5345/29225997854_2b6f804054_o.jpg,0.0,0.0,0.75,1.0,699,618,https://www.flickr.com/photos/davidstanleytravel/29225997854,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\nca71835f0e94262f,https://c1.staticflickr.com/6/5313/30078258712_607bf4b9a3_o.jpg,0.333333333333,0.0,1.0,1.0,704,731,https://www.flickr.com/photos/120663298@N03/30078258712/,https://creativecommons.org/licenses/by/2.0/,Gabriel Cabral,https://www.flickr.com/people/120663298@N03/\n3a6fdb1fd754242b,https://c1.staticflickr.com/9/8429/28645788784_bd0b30acfe_o.jpg,0.0,0.0,0.75,0.75,986,614,https://www.flickr.com/photos/atoach/28645788784,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n2138d0c3f771a3ea,https://c1.staticflickr.com/8/7210/27200101776_5aab37cda3_o.jpg,0.25,0.25,0.75,1.0,477,372,https://www.flickr.com/photos/houserockr/27200101776,https://creativecommons.org/licenses/by/2.0/,Frank Meffert,https://www.flickr.com/people/houserockr/\nfdf5aaf12ca3a826,https://c1.staticflickr.com/1/614/31450822432_cedbb905a2_o.jpg,0.499263622975,0.25,0.99852724595,1.0,820,473,https://www.flickr.com/photos/7armyjmtc/31450822432/,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n707aaa7ea7229969,https://c1.staticflickr.com/9/8746/28387810034_cbae424600_o.jpg,0.500736377025,0.25,1.0,1.0,356,459,https://www.flickr.com/photos/markyharky/28387810034,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\nbadccceef4df3cd4,https://c1.staticflickr.com/6/5658/29990241343_e59f1a0c02_o.jpg,0.0,0.330871491876,1.0,1.0,498,587,https://www.flickr.com/photos/quinet/29990241343,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nef48a3c4d4c1aebe,https://c1.staticflickr.com/9/8471/28939285881_8557e7cb0a_o.jpg,0.5,0.25,1.0,1.0,662,701,https://www.flickr.com/photos/greggjerdingen/28939285881,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n146a662dab4e1136,https://c1.staticflickr.com/6/5011/30033414011_123935b028_o.jpg,0.27032208589,0.25,0.810966257669,1.0,885,445,https://www.flickr.com/photos/dalbera/30033414011,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n5f94856814c2d6d8,https://c1.staticflickr.com/8/7547/26956803836_fd7ff54f2f_o.jpg,0.5,0.25,1.0,1.0,699,757,https://www.flickr.com/photos/quinet/26956803836/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n2a486b3d640e9352,https://c1.staticflickr.com/3/2089/32757850831_5d5f1e1fdd_o.jpg,0.0,0.25,0.5625,1.0,735,517,https://www.flickr.com/photos/27665395@N05/32757850831,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n19ae72975d9b23e8,https://c1.staticflickr.com/9/8134/29339188186_264ebc8f71_o.jpg,0.0,0.0,0.75,0.75,402,539,https://www.flickr.com/photos/142129088@N03/29339188186,https://creativecommons.org/licenses/by/2.0/,Paul Bischoff,https://www.flickr.com/people/142129088@N03/\n26ebae87051d30b4,https://c1.staticflickr.com/8/7368/26873141942_186eb38b69_o.jpg,0.0,0.25,0.5,1.0,818,976,https://www.flickr.com/photos/jaguarcarsmena/26873141942/,https://creativecommons.org/licenses/by/2.0/,Jaguar MENA,https://www.flickr.com/people/jaguarcarsmena/\n2fd6612a2097bdc0,https://c1.staticflickr.com/6/5655/29692093420_e8d0892705_o.jpg,0.0,0.0,0.5,0.75,560,476,https://www.flickr.com/photos/auburnalumniassociation/29692093420,https://creativecommons.org/licenses/by/2.0/,Auburn Alumni Association,https://www.flickr.com/people/auburnalumniassociation/\nfe1e574cec7ca19f,https://c1.staticflickr.com/9/8415/29056638823_f12e5a242f_o.jpg,0.25,0.0,1.0,0.5,88,163,https://www.flickr.com/photos/usfwshq/29056638823,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/\ndeb2311cdf19a0d4,https://c1.staticflickr.com/6/5722/30174629172_4eca1fff94_o.jpg,0.332842415317,0.0,0.99852724595,1.0,820,273,https://www.flickr.com/photos/agenciabrasilia/30174629172/,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n8b2e77f4c3e29b95,https://c1.staticflickr.com/9/8318/29472078206_9ff67af178_o.jpg,0.0,0.0,0.5,0.75,896,376,https://www.flickr.com/photos/ronmacphotos/29472078206,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n22011cb97c752dac,https://c1.staticflickr.com/8/7108/26380756034_280dcf12f0_o.jpg,0.25,0.0,1.0,0.5,422,778,https://www.flickr.com/photos/cohenvandervelde/26380756034,https://creativecommons.org/licenses/by/2.0/,Cohen Van der Velde,https://www.flickr.com/people/cohenvandervelde/\nd13fca34f5207720,https://c1.staticflickr.com/6/5762/30386317111_91f9155463_o.jpg,0.0,0.0,0.7484375,1.0,948,564,https://www.flickr.com/photos/vermazeren/30386317111/in/photostream/,https://creativecommons.org/licenses/by/2.0/,Arend,https://www.flickr.com/people/vermazeren/\n46bf6c496ff2d429,https://c1.staticflickr.com/8/7145/28268880796_8943906645_o.jpg,0.210588633288,0.0,0.631765899865,0.75,400,164,https://www.flickr.com/photos/anakbrunei/28268880796,https://creativecommons.org/licenses/by/2.0/,Reedz Malik,https://www.flickr.com/people/anakbrunei/\n15e7b277cdea5985,https://c1.staticflickr.com/8/7375/27733231050_345e4ae385_o.jpg,0.462155963303,0.0,1.0,0.75,133,383,https://www.flickr.com/photos/taylar/27733231050,https://creativecommons.org/licenses/by/2.0/,Ingrid Taylar,https://www.flickr.com/people/taylar/\n6319d8a3f0340262,https://c1.staticflickr.com/8/7276/27089952992_ff499217a8_o.jpg,0.43661971831,0.0,1.0,0.75,309,300,https://www.flickr.com/photos/treegrow/27089952992/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n7fbb8fd74193ec21,https://c1.staticflickr.com/8/7132/27607256635_151ffa151f_o.jpg,0.400242326333,0.0,1.0,0.75,986,781,https://www.flickr.com/photos/143049688@N08/27607256635/,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/\n42037326706ff094,https://c1.staticflickr.com/1/562/31118615674_e994602beb_o.jpg,0.25,0.0,1.0,1.0,539,949,https://www.flickr.com/photos/127226743@N02/31118615674/,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\ne1d0a5989d08d8d9,https://c1.staticflickr.com/6/5788/30435125102_25b0d745cf_o.jpg,0.2515625,0.0,1.0,1.0,976,49,https://www.flickr.com/photos/docentjoyce/30435125102,https://creativecommons.org/licenses/by/2.0/,docentjoyce,https://www.flickr.com/people/docentjoyce/\n5f7bac93f275858e,https://c1.staticflickr.com/1/744/31730099583_ace5e9ed02_o.jpg,0.0,0.25,0.442094313454,1.0,561,926,https://www.flickr.com/photos/sfupamr/31730099583,https://creativecommons.org/licenses/by/2.0/,Simon Fraser University -  University Communications,https://www.flickr.com/people/sfupamr/\n8487e1e6c56c0744,https://c1.staticflickr.com/8/7360/26557446393_32d960f375_o.jpg,0.333333333333,0.0,1.0,1.0,437,147,https://www.flickr.com/photos/greggjerdingen/26557446393,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nec00b250649db024,https://c1.staticflickr.com/1/615/32618222115_31f2f95243_o.jpg,0.0,0.25,0.5,1.0,898,86,https://www.flickr.com/photos/lge/32618222115,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\naa80dc6c1115e998,https://c1.staticflickr.com/9/8269/28527436475_12327283e3_o.jpg,0.0,0.25,0.5,1.0,405,470,https://www.flickr.com/photos/jamesabbott1963/28527436475,https://creativecommons.org/licenses/by/2.0/,James Abbott,https://www.flickr.com/people/jamesabbott1963/\nd39d55a48261734f,https://c1.staticflickr.com/9/8220/28523020533_a73b2d8acf_o.jpg,0.25,0.0,1.0,0.5,558,957,https://flickr.com/87533529@N00/28523020533,https://creativecommons.org/licenses/by/2.0/,Joel Dinda,https://www.flickr.com/people/mwlguide/\n9f7ee96eb0d4f98a,https://c1.staticflickr.com/1/282/31584711634_8551e59e07_o.jpg,0.4108,0.0,1.0,0.75,511,594,https://www.flickr.com/photos/armymaterielcommand/31584711634/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/\nef1846af3e7a330b,https://c1.staticflickr.com/9/8644/27862254563_08bcf26a1b_o.jpg,0.0,0.25,0.533105022831,1.0,95,89,https://www.flickr.com/photos/usfwsmtnprairie/27862254563,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n94d48df37fbc104a,https://c1.staticflickr.com/8/7046/27192748371_ca86d857bd_o.jpg,0.25,0.267938931298,1.0,0.803816793893,611,600,https://www.flickr.com/photos/spreadshirt/27192748371,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/\n80a131e73a3c8cf7,https://c1.staticflickr.com/9/8111/28067149344_17906865d9_o.jpg,0.0,0.0,0.666666666667,1.0,662,923,https://www.flickr.com/photos/greggjerdingen/28067149344,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nf754f9bf19b69b3f,https://c1.staticflickr.com/8/7292/26702521944_0a1f6d242b_o.jpg,0.0,0.0,0.473457675753,0.75,100,399,https://flickr.com/7138083@N04/26702521944,https://creativecommons.org/licenses/by/2.0/,xiquinhosilva,https://www.flickr.com/people/xiquinho/\na959719b8ad773bb,https://c1.staticflickr.com/6/5739/30062522396_b0c32fb59e_o.jpg,0.258620689655,0.25,0.775862068966,1.0,830,236,https://www.flickr.com/photos/robdammers/30062522396/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n307a646d5907399b,https://c1.staticflickr.com/8/7439/27802389360_68e7ee2011_o.jpg,0.0,0.0,0.5,0.75,718,275,https://www.flickr.com/photos/greggjerdingen/27802389360/,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n3e69002b10ae1ac2,https://c1.staticflickr.com/9/8170/29385452862_73f8628514_o.jpg,0.498153618907,0.25,1.0,1.0,566,424,https://www.flickr.com/photos/28101583@N07/29385452862,https://creativecommons.org/licenses/by/2.0/,Drew  Jacksich,https://www.flickr.com/people/28101583@N07/\nd1a47e5b24283cbf,https://c1.staticflickr.com/8/7697/26831428854_09debea7b8_o.jpg,0.25,0.25,0.75,1.0,739,571,http://www.flickr.com/photos/blumenbiene/26831428854/,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\nac81b69c57b36643,https://c1.staticflickr.com/9/8777/29553052506_abf6154dde_o.jpg,0.25,0.25,0.75,1.0,577,816,https://www.flickr.com/photos/24326549@N04/29553052506,https://creativecommons.org/licenses/by/2.0/,Alan Farhadi,https://www.flickr.com/people/24326549@N04/\n901d0ef47db97d24,https://c1.staticflickr.com/1/198/30723885964_9eb35f498e_o.jpg,0.0,0.25,0.75,1.0,634,993,https://www.flickr.com/photos/church4u2/30723885964,https://creativecommons.org/licenses/by/2.0/,Church Iglesia,https://www.flickr.com/people/church4u2/\nab98e77562b54546,https://c1.staticflickr.com/6/5682/31219758961_971bb9d3ee_o.jpg,0.0,0.0,0.5,0.75,405,351,https://www.flickr.com/photos/janitors/31219758961,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n623b2e5402d57bee,https://c1.staticflickr.com/9/8129/29400877184_87a8ae4e33_o.jpg,0.25,0.25,1.0,0.75,709,365,https://www.flickr.com/photos/cwpt/29400877184,https://creativecommons.org/licenses/by/2.0/,Civil War Trust,https://www.flickr.com/people/cwpt/\n1916f530c6d2d9e4,https://c1.staticflickr.com/8/7472/27937780372_d6b5209ab5_o.jpg,0.249079528719,0.25,0.747238586156,1.0,407,911,https://www.flickr.com/photos/eltb/27937780372,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nae6d7204c6a7bf9f,https://c1.staticflickr.com/6/5514/30437523714_6c268d73ea_o.jpg,0.0,0.0,0.666666666667,1.0,979,962,https://www.flickr.com/photos/markwatmough/30437523714/,https://creativecommons.org/licenses/by/2.0/,mark.watmough,https://www.flickr.com/people/markwatmough/\nf7fb7eec15f029c4,https://c1.staticflickr.com/9/8751/28206568651_b4f618383b_o.jpg,0.25,0.25,0.75,1.0,918,664,https://www.flickr.com/photos/inucara/28206568651,https://creativecommons.org/licenses/by/2.0/,Kentaro Ohno,https://www.flickr.com/people/inucara/\n9e9121bdae2c27ad,https://c1.staticflickr.com/8/7176/26995500171_5bba705a27_o.jpg,0.0,0.0,0.75,1.0,886,687,https://flickr.com/95259583@N07/26995500171,https://creativecommons.org/licenses/by/2.0/,Luna Tick,https://www.flickr.com/people/gryffindorhermione/\nca0319c371bebe83,https://c1.staticflickr.com/6/5530/31192976426_a85bb45c64_o.jpg,0.0,0.25,0.5,1.0,719,348,https://www.flickr.com/photos/asiandevelopmentbank/31192976426,https://creativecommons.org/licenses/by/2.0/,Asian Development Bank,https://www.flickr.com/people/asiandevelopmentbank/\ndc7426826012c210,https://c1.staticflickr.com/1/596/32628983432_1cd51300fa_o.jpg,0.330871491876,0.0,1.0,1.0,24,916,https://www.flickr.com/photos/usfwsmidwest/32628983432,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n2757ae4fe8cbd972,https://c1.staticflickr.com/6/5040/30009355305_c3b41316c5_o.jpg,0.0,0.0,0.75,1.0,990,965,https://www.flickr.com/photos/104342908@N08/30009355305,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/\n355a44797aab094f,https://c1.staticflickr.com/6/5660/31839329502_e4074fe69f_o.jpg,0.25,0.0,0.75,0.75,706,651,https://www.flickr.com/photos/126337928@N05/31839329502,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\n54b2ba38ef3afa24,https://c1.staticflickr.com/9/8111/28503803912_d92ecb56e7_o.jpg,0.482608695652,0.0,0.965217391304,0.75,780,352,https://www.flickr.com/photos/thoseguys119/28503803912,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nb8b9c72bfbce7c69,https://c1.staticflickr.com/2/1447/26152597154_570c522764_o.jpg,0.25,0.4375,1.0,1.0,323,409,https://www.flickr.com/photos/chaz_pics/26152597154,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\nf3115d87f72e548d,https://c1.staticflickr.com/3/2603/32886440142_197d8d41e4_o.jpg,0.25,0.0,0.75,0.75,706,689,https://www.flickr.com/photos/126337928@N05/32886440142/,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\n3e095a43e7443694,https://c1.staticflickr.com/9/8894/29732005106_9dc78bf27a_o.jpg,0.0,0.0,0.5,0.75,699,456,https://www.flickr.com/photos/o_0/29732005106/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n95d9b51b721cddd7,https://c1.staticflickr.com/8/7245/26856729915_9fe9b57534_o.jpg,0.333333333333,0.0,1.0,1.0,512,655,https://www.flickr.com/photos/42220226@N07/26856729915,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\n6c46143971987fc2,https://c1.staticflickr.com/8/7301/27465602125_57f6085011_o.jpg,0.501840942563,0.0,1.0,0.75,820,481,https://www.flickr.com/photos/136804067@N08/27465602125/,https://creativecommons.org/licenses/by/2.0/,austin Lan,https://www.flickr.com/people/136804067@N08/\nb472c12a56756eb7,https://c1.staticflickr.com/1/717/31766109604_6e79bd5edd_o.jpg,0.28125,0.0,0.84375,0.75,644,138,https://www.flickr.com/photos/garryknight/31766109604,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\nfa66718eb93baaab,https://c1.staticflickr.com/6/5619/30582869910_dc84cf08ba_o.jpg,0.318416523236,0.0,1.0,0.75,650,728,https://www.flickr.com/photos/gruenemann/30582869910,https://creativecommons.org/licenses/by/2.0/,John W. Schulze,https://www.flickr.com/people/gruenemann/\n419a316206121b96,https://c1.staticflickr.com/8/7114/26281651903_e44a9a1536_o.jpg,0.5,0.0,1.0,0.75,405,763,https://www.flickr.com/photos/km30192002/26281651903,https://creativecommons.org/licenses/by/2.0/,km30192002,https://www.flickr.com/people/km30192002/\n7fe904ea203ca17c,https://c1.staticflickr.com/9/8084/29739894401_623d5d2c36_o.jpg,0.0,0.333333333333,1.0,1.0,459,895,https://www.flickr.com/photos/daveynin/29739894401,https://creativecommons.org/licenses/by/2.0/,daveynin,https://www.flickr.com/people/daveynin/\n4bc3c70084c781d4,https://c1.staticflickr.com/8/7465/27073285610_327a271aaf_o.jpg,0.424446202532,0.0,1.0,0.75,653,566,https://www.flickr.com/photos/dfmagazine/27073285610,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/\n9d74c0605512a0a8,https://c1.staticflickr.com/8/7377/27687844380_448207c3a0_o.jpg,0.320534223706,0.25,0.961602671119,1.0,896,46,https://www.flickr.com/photos/hisgett/27687844380/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\nc63383968413f24b,https://c1.staticflickr.com/8/7165/27369877691_eea8c23530_o.jpg,0.214651639344,0.0,0.643954918033,0.75,780,872,https://www.flickr.com/photos/thoseguys119/27369877691,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n6ce6140a490806e8,https://c1.staticflickr.com/9/8159/27802218013_dd9872e273_o.jpg,0.25,0.0,1.0,0.5625,922,665,https://www.flickr.com/photos/58558794@N07/27802218013/,https://creativecommons.org/licenses/by/2.0/,POP,https://www.flickr.com/people/58558794@N07/\n4c51277a353a059a,https://c1.staticflickr.com/9/8067/29087524365_3dc1651954_o.jpg,0.0,0.25,0.5625,1.0,954,87,https://www.flickr.com/photos/rusty_clark/29087524365,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n368fdd8d9aae2dd1,https://c1.staticflickr.com/8/7492/27253982663_461d471d6d_o.jpg,0.25,0.28125,1.0,0.84375,755,414,https://www.flickr.com/photos/jeepersmedia/27253982663,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nb5e514d487628ebb,https://c1.staticflickr.com/8/7707/27403849115_e4154dcb28_o.jpg,0.210588633288,0.0,0.631765899865,0.75,889,342,https://www.flickr.com/photos/dullhunk/27403849115,https://creativecommons.org/licenses/by/2.0/,Duncan Hull,https://www.flickr.com/people/dullhunk/\n57ba4da971ad416a,https://c1.staticflickr.com/1/657/31596158335_ef1ee49e49_o.jpg,0.0,0.0,0.5625,0.75,848,725,http://www.flickr.com/photos/mohit_s/31596158335/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/\n9bc2d85b65e15d25,https://c1.staticflickr.com/8/7561/28712646042_3c4130b767_o.jpg,0.28125,0.25,0.84375,1.0,947,92,https://www.flickr.com/photos/herry/28712646042/,https://creativecommons.org/licenses/by/2.0/,Herry Lawford,https://www.flickr.com/people/herry/\nb037ebf0ef784c2d,https://c1.staticflickr.com/9/8492/29906041891_073f990f20_o.jpg,0.0,0.25,1.0,1.0,826,169,https://www.flickr.com/photos/54084906@N04/29906041891,https://creativecommons.org/licenses/by/2.0/,Gilbert-No\\303\\253l Sfeir Mont-Liban,https://www.flickr.com/people/54084906@N04/\n77a1541f0ef4d328,https://c1.staticflickr.com/9/8820/29945265936_d4be6b8c32_o.jpg,0.0,0.0,0.5625,0.75,735,859,https://www.flickr.com/photos/27665395@N05/29945265936,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n10990baed92440ef,https://c1.staticflickr.com/8/7429/27554603131_750b64dc5c_o.jpg,0.25,0.0,1.0,0.634136212625,566,683,https://www.flickr.com/photos/nowlearn/27554603131/,https://creativecommons.org/licenses/by/2.0/,Jeff Martin - CAU and J&amp;S Maritime Ltd,https://www.flickr.com/people/nowlearn/\n3bedd25b5a1dad51,https://c1.staticflickr.com/8/7569/29304925624_0e9747f7f1_o.jpg,0.0,0.299878836834,0.75,0.899636510501,982,242,https://www.flickr.com/photos/slgc/29304925624/,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\n568bc38f3ca1e354,https://c1.staticflickr.com/6/5821/30103756603_88b875b8fc_o.jpg,0.25,0.25,1.0,1.0,680,849,https://www.flickr.com/photos/27353377@N04/30103756603/,https://creativecommons.org/licenses/by/2.0/,Carrie A.,https://www.flickr.com/people/27353377@N04/\n42ad77983e246cca,https://c1.staticflickr.com/8/7025/26407952433_6ae7d784ed_o.jpg,0.333333333333,0.0,1.0,1.0,830,342,https://www.flickr.com/photos/transitomedellin/26407952433,https://creativecommons.org/licenses/by/2.0/,Secretar\\303\\255a de Movilidad de Medell\\303\\255n,https://www.flickr.com/people/transitomedellin/\na12f6199b2c667d5,https://c1.staticflickr.com/6/5645/29605699993_bb50407790_o.jpg,0.0,0.0,0.666666666667,1.0,848,729,https://www.flickr.com/photos/kecko/29605699993,https://creativecommons.org/licenses/by/2.0/,Kecko,https://www.flickr.com/people/kecko/\na95f9e82901ab8c9,https://c1.staticflickr.com/1/633/33152660395_650e4ab9a0_o.jpg,0.421177266576,0.25,0.842354533153,1.0,971,445,https://www.flickr.com/photos/kostas-limitsios/33152660395/,https://creativecommons.org/licenses/by/2.0/,Kostas Limitsios,https://www.flickr.com/people/kostas-limitsios/\nc04dba1c30396f33,https://c1.staticflickr.com/9/8440/29091456221_a027a53968_o.jpg,0.25,0.267938931298,1.0,0.803816793893,411,503,https://www.flickr.com/photos/oakleyoriginals/29091456221,https://creativecommons.org/licenses/by/2.0/,OakleyOriginals,https://www.flickr.com/people/oakleyoriginals/\nd480b61578fa74a4,https://c1.staticflickr.com/6/5574/30165301924_3b567fc7dd_o.jpg,0.4375,0.0,1.0,0.75,12,443,https://www.flickr.com/photos/9750464@N02/30165301924/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\n8d21497598f9c54b,https://c1.staticflickr.com/6/5610/31815129672_3cda2c0f12_o.jpg,0.248348017621,0.0,0.745044052863,0.75,826,467,https://www.flickr.com/photos/sybarite48/31815129672,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n10e4d986f4bbfe6a,https://c1.staticflickr.com/9/8751/28922184676_fb6c0ce644_o.jpg,0.221875,0.25,0.665625,1.0,320,161,https://www.flickr.com/photos/gaby1/28922184676,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\ne0fde6c71ffc5dc1,https://c1.staticflickr.com/8/7728/27634291804_2779b6ba62_o.jpg,0.0,0.25,0.75,0.75,820,436,https://www.flickr.com/photos/lza_axlwd/27634291804,https://creativecommons.org/licenses/by/2.0/,Liza Agsalud,https://www.flickr.com/people/lza_axlwd/\n79077d06b543c5cf,https://c1.staticflickr.com/1/478/32252587246_fd3d242805_o.jpg,0.0,0.0,1.0,1.0,25,961,https://flickr.com/93057803@N06/32252587246,https://creativecommons.org/licenses/by/2.0/,Colby Stopa,https://www.flickr.com/people/photographybycolby/\n909f0c7a73750bef,https://c1.staticflickr.com/9/8843/28507915340_0ba2798efd_o.jpg,0.0,0.0,0.75,1.0,868,270,https://www.flickr.com/photos/jeepersmedia/28507915340,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n2f8c16f6142539c8,https://c1.staticflickr.com/8/7078/26901099741_0cb824b728_o.jpg,0.0,0.25,0.486191860465,1.0,976,802,https://flickr.com/34608255@N08/26901099741,https://creativecommons.org/licenses/by/2.0/,The City of Toronto,https://www.flickr.com/people/cityoftoronto/\ndcf6ae375b14e62f,https://c1.staticflickr.com/6/5344/30611253866_f2abf5769d_o.jpg,0.28125,0.0,0.84375,0.75,702,658,https://www.flickr.com/photos/jlcernadas/30611253866/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\ndd372ed75e49a8ce,https://c1.staticflickr.com/9/8698/27934635143_a0fa80b923_o.jpg,0.25,0.0,1.0,1.0,686,97,https://www.flickr.com/photos/merfam/27934635143/,https://creativecommons.org/licenses/by/2.0/,Jason Meredith,https://www.flickr.com/people/merfam/\n510c2df6eeb585ad,https://c1.staticflickr.com/9/8066/29093727944_a9388aed93_o.jpg,0.0,0.0,0.421177266576,0.75,950,518,https://www.flickr.com/photos/danielmee/29093727944,https://creativecommons.org/licenses/by/2.0/,Daniel Mee,https://www.flickr.com/people/danielmee/\n8a11c8622b2678f7,https://c1.staticflickr.com/8/7747/26727111141_d8c99bc87a_o.jpg,0.25,0.25,1.0,1.0,558,885,https://www.flickr.com/photos/thenationalguard/26727111141,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/\n80005e21c8a8e217,https://c1.staticflickr.com/9/8297/28695694754_e3f20672b8_o.jpg,0.264758497317,0.0,1.0,0.75,456,666,https://www.flickr.com/photos/34739556@N04/28695694754/,https://creativecommons.org/licenses/by/2.0/,rawdonfox,https://www.flickr.com/people/34739556@N04/\nbc41c2f5094ab5e7,https://c1.staticflickr.com/1/323/31617512960_c867ceef2d_o.jpg,0.0,0.0,0.666666666667,1.0,611,700,https://www.flickr.com/photos/aloha75/31617512960/,https://creativecommons.org/licenses/by/2.0/,Sam Howzit,https://www.flickr.com/people/aloha75/\ncdd8abc6793962de,https://c1.staticflickr.com/8/7350/27093155493_93f90ba402_o.jpg,0.0,0.0,0.5,0.75,702,797,https://www.flickr.com/photos/7armyjmtc/27093155493,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n8f00068bfa273349,https://c1.staticflickr.com/9/8395/29161263610_72158f8308_o.jpg,0.0,0.25,0.5,1.0,718,862,https://www.flickr.com/photos/greggjerdingen/29161263610,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nf6c3b02f6a8b042a,https://c1.staticflickr.com/6/5730/30527016340_bed8e823a8_o.jpg,0.0,0.0,0.75,0.5625,459,177,https://www.flickr.com/photos/davidwilson1949/30527016340/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n0e5b6760664ca045,https://c1.staticflickr.com/8/7085/27787175441_97a9d0dd7c_o.jpg,0.25,0.307291666667,1.0,1.0,618,154,https://www.flickr.com/photos/presidenciamx/27787175441,https://creativecommons.org/licenses/by/2.0/,Presidencia de la Rep\\303\\272blica Mexicana,https://www.flickr.com/people/presidenciamx/\n2c42804370532894,https://c1.staticflickr.com/8/7501/26478351773_ae9a210ba1_o.jpg,0.25,0.0,1.0,0.5,826,417,https://www.flickr.com/photos/drumminhands/26478351773,https://creativecommons.org/licenses/by/2.0/,Chris Evans,https://www.flickr.com/people/drumminhands/\nac3e90067e79542f,https://c1.staticflickr.com/8/7427/27174031464_3172a46b8a_o.jpg,0.28125,0.0,0.84375,0.75,718,666,https://www.flickr.com/photos/daveparker/27174031464,https://creativecommons.org/licenses/by/2.0/,Dave Parker,https://www.flickr.com/people/daveparker/\n49b87b7372212580,https://c1.staticflickr.com/9/8845/29161737252_a456a57084_o.jpg,0.0,0.282719435737,0.75,0.84815830721,407,529,https://www.flickr.com/photos/eltb/29161737252,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n2f10e44665917d99,https://c1.staticflickr.com/8/7418/27271771523_ba4ee103a6_o.jpg,0.471590909091,0.25,1.0,1.0,407,713,https://www.flickr.com/photos/martius/27271771523,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\neac352a0c1b0b1e5,https://c1.staticflickr.com/9/8472/29756357101_5f9d8a02f2_o.jpg,0.5,0.0,1.0,0.75,312,519,https://www.flickr.com/photos/gaby1/29756357101/,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\n6466852837ac322a,https://c1.staticflickr.com/9/8257/29695988410_2baef05910_o.jpg,0.0,0.200323101777,1.0,1.0,884,637,https://flickr.com/41645374@N04/29695988410,https://creativecommons.org/licenses/by/2.0/,-Ebelien-,https://www.flickr.com/people/-ebelien-/\nd423e96d69d1c214,https://c1.staticflickr.com/8/7305/26976656566_e1ba2ca946_o.jpg,0.0,0.28125,0.75,0.84375,402,428,https://www.flickr.com/photos/alessandrogalantucci/26976656566,https://creativecommons.org/licenses/by/2.0/,Alessandro Galantucci,https://www.flickr.com/people/alessandrogalantucci/\n41c70c3afeb54d03,https://c1.staticflickr.com/6/5686/30573995365_fb8d5748c5_o.jpg,0.332106038292,0.0,0.996318114875,1.0,820,474,https://www.flickr.com/photos/zigazou76/30573995365/,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n94bcb98ebdec94d0,https://c1.staticflickr.com/8/7619/27394295464_3c9f427d41_o.jpg,0.0,0.0,0.5625,0.75,875,714,https://www.flickr.com/photos/69203347@N03/27394295464,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\nd0380db027ab1ada,https://c1.staticflickr.com/6/5491/30520385950_13d1ceae4b_o.jpg,0.5,0.0,1.0,0.75,565,267,https://www.flickr.com/photos/schaerer/30520385950,https://creativecommons.org/licenses/by/2.0/,Walter Sch\\303\\244rer,https://www.flickr.com/people/schaerer/\nc6e86a4417e2573c,https://c1.staticflickr.com/8/7441/27851648801_b1d9294508_o.jpg,0.522334293948,0.0,1.0,0.75,979,963,https://www.flickr.com/photos/106896789@N08/27851648801,https://creativecommons.org/licenses/by/2.0/,Chris Hood,https://www.flickr.com/people/106896789@N08/\n231ff35ddc2e3552,https://c1.staticflickr.com/9/8770/28175549182_a796964e54_o.jpg,0.0,0.0,0.666666666667,1.0,693,879,https://www.flickr.com/photos/130075348@N08/28175549182,https://creativecommons.org/licenses/by/2.0/,Rokok Indonesia,https://www.flickr.com/people/130075348@N08/\n8a6b72ebdc3c524b,https://c1.staticflickr.com/9/8732/28329388192_78b22818a6_o.jpg,0.212755102041,0.0,0.638265306122,0.75,896,434,https://www.flickr.com/photos/usnavy/28329388192,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n8973cc874509375d,https://c1.staticflickr.com/6/5459/30454863711_85efce5db4_o.jpg,0.0,0.0,0.5,0.75,982,584,https://www.flickr.com/photos/armymaterielcommand/30454863711/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/\n488c8126ce45b354,https://c1.staticflickr.com/8/7711/26838679665_9908602e5e_o.jpg,0.28125,0.0,0.84375,0.75,442,49,https://www.flickr.com/photos/squirrel02/26838679665,https://creativecommons.org/licenses/by/2.0/,squirrel83,https://www.flickr.com/people/squirrel02/\nd90a377775ac7b4d,https://c1.staticflickr.com/8/7116/27368589265_72303cec5c_o.jpg,0.25,0.25,1.0,1.0,405,753,https://www.flickr.com/photos/changyisheng/27368589265,https://creativecommons.org/licenses/by/2.0/,Blowing Puffer Fish,https://www.flickr.com/people/changyisheng/\nb34cecc8defdc40c,https://c1.staticflickr.com/8/7447/26750827574_19b7f640f0_o.jpg,0.0,0.4375,0.75,1.0,895,900,https://www.flickr.com/photos/quinet/26750827574,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n2f39565faa7939e8,https://c1.staticflickr.com/6/5816/31423201746_8b268d2958_o.jpg,0.25,0.0,0.75,0.75,562,758,https://www.flickr.com/photos/zero_org/31423201746/,https://creativecommons.org/licenses/by/2.0/,Zero Emission Resource Organisation,https://www.flickr.com/people/zero_org/\nc2d8eb67b5902e00,https://c1.staticflickr.com/9/8315/29578948420_fba72dae55_o.jpg,0.578822733424,0.0,1.0,0.75,650,666,https://www.flickr.com/photos/stonehenge-stone-circle/29578948420,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/\nd256a4bba52eabfa,https://c1.staticflickr.com/8/7004/26872692972_0a7d0a9d50_o.jpg,0.0,0.0,0.513452914798,0.75,756,793,https://www.flickr.com/photos/13476480@N07/26872692972,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n1cfaab4663107b32,https://c1.staticflickr.com/9/8515/29191985621_a089def60a_o.jpg,0.25,0.434561128527,1.0,1.0,407,827,https://www.flickr.com/photos/eltb/29191985621,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n7c6571d95eb491fc,https://c1.staticflickr.com/9/8121/28473158694_a729f82e07_o.jpg,0.248713235294,0.25,0.746139705882,1.0,978,596,https://www.flickr.com/photos/vialbost/28473158694,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251rique Voisin-Demery,https://www.flickr.com/people/vialbost/\n9949334d8edeaf04,https://c1.staticflickr.com/8/7552/26978734142_b9624f1dd1_o.jpg,0.0,0.0,0.745709828393,1.0,706,555,https://www.flickr.com/photos/jsjgeology/26978734142,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n017c2614bea347c2,https://c1.staticflickr.com/9/8121/28143708583_8bb74d8a59_o.jpg,0.0,0.281690140845,0.75,0.845070422535,826,267,https://flickr.com/64337707@N07/28143708583,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/\neb3637dd97f1c4b7,https://c1.staticflickr.com/8/7505/29900074791_9c6df6e9c7_o.jpg,0.43661971831,0.25,1.0,1.0,32,108,https://www.flickr.com/photos/usfwsmidwest/29900074791,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\na4a883dba7e08feb,https://c1.staticflickr.com/9/8587/27925696413_4ba7957f92_o.jpg,0.0,0.0,0.625,1.0,686,419,https://www.flickr.com/photos/automobileitalia/27925696413,https://creativecommons.org/licenses/by/2.0/,Automobile Italia,https://www.flickr.com/people/automobileitalia/\n9ebba1495870c71a,https://c1.staticflickr.com/6/5471/30682327145_b83e2bc4e8_o.jpg,0.0354609929078,0.0,1.0,1.0,310,914,https://flickr.com/148662629@N08/30682327145,https://creativecommons.org/licenses/by/2.0/,Dirk Pons,https://www.flickr.com/people/148662629@N08/\n4268c10b52f44ba7,https://c1.staticflickr.com/8/7459/27590337182_fc1a343f92_o.jpg,0.28125,0.0,0.84375,0.75,550,843,https://www.flickr.com/photos/rusty_clark/27590337182,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n5ead095bf5abbeef,https://c1.staticflickr.com/8/7423/27620536711_246133847e_o.jpg,0.4375,0.0,1.0,0.75,608,333,https://www.flickr.com/photos/fdecomite/27620536711,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\nbefcda5d74032d37,https://c1.staticflickr.com/6/5604/29991010606_95ecbdce22_o.jpg,0.0,0.333333333333,1.0,1.0,653,429,http://www.flickr.com/photos/quinet/29991010606/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n5e44641cb22233ce,https://c1.staticflickr.com/6/5819/30299857341_b494a91410_o.jpg,0.25,0.25,0.75,1.0,519,68,https://www.flickr.com/photos/box_repsol/30299857341,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n235fc31903c86566,https://c1.staticflickr.com/8/7409/27759748700_a68130e51e_o.jpg,0.5,0.25,1.0,1.0,407,660,https://www.flickr.com/photos/eltb/27759748700,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nacf4220d2fca61a7,https://c1.staticflickr.com/9/8610/28149371951_76fac93eec_o.jpg,0.0,0.0,0.5,0.75,338,731,https://www.flickr.com/photos/kj-an/28149371951,https://creativecommons.org/licenses/by/2.0/,Kevin Jones,https://www.flickr.com/people/kj-an/\nac2a1bfa0ce9cf58,https://c1.staticflickr.com/6/5214/30108604641_2365066e36_o.jpg,0.25,0.25,0.75,1.0,404,471,https://www.flickr.com/photos/usnavy/30108604641,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n3194a4c7c666e443,https://c1.staticflickr.com/9/8250/29625062766_a27a976c88_o.jpg,0.0,0.25,0.512686567164,1.0,848,227,https://www.flickr.com/photos/zachievenor/29625062766/,https://creativecommons.org/licenses/by/2.0/,Zachi Evenor,https://www.flickr.com/people/zachievenor/\nb4921bbd1e5f5906,https://c1.staticflickr.com/9/8866/29657161405_44f2076e15_o.jpg,0.292867981791,0.0,1.0,1.0,699,779,https://www.flickr.com/photos/stefanjurca/29657161405,https://creativecommons.org/licenses/by/2.0/,\\310\\230tefan Jurc\\304\\203,https://www.flickr.com/people/stefanjurca/\nc9c6985172ec4afa,https://c1.staticflickr.com/9/8463/27928710194_43dc85409d_o.jpg,0.0,0.0,1.0,0.75,441,491,https://flickr.com/38488245@N00/27928710194,https://creativecommons.org/licenses/by/2.0/,Sam Cavenagh,https://www.flickr.com/people/cavenagh/\nbab00c4c30935179,https://c1.staticflickr.com/8/7568/27729578026_1cae86e505_o.jpg,0.5,0.0,1.0,0.75,431,504,https://www.flickr.com/photos/usarjnco/27729578026,https://creativecommons.org/licenses/by/2.0/,USARJ NCO CORPS,https://www.flickr.com/people/usarjnco/\n744fa984f0a7cf3d,https://c1.staticflickr.com/9/8729/27737681764_5a96582d54_o.jpg,0.421177266576,0.0,0.842354533153,0.75,437,458,https://www.flickr.com/photos/117096107@N03/27737681764,https://creativecommons.org/licenses/by/2.0/,Kieran White,https://www.flickr.com/people/117096107@N03/\nb09a2051d9ce8673,https://c1.staticflickr.com/9/8445/29486674715_79a41542cc_o.jpg,0.25,0.423337856174,1.0,0.846675712347,443,892,https://www.flickr.com/photos/eltb/29486674715/,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n74cc8f7eb50b5c8c,https://c1.staticflickr.com/6/5456/31194915425_b774b63d64_o.jpg,0.374521072797,0.25,0.749042145594,1.0,971,3,https://www.flickr.com/photos/127130111@N06/31194915425,https://creativecommons.org/licenses/by/2.0/,john mcsporran,https://www.flickr.com/people/127130111@N06/\ne1eb18e3c44ac514,https://c1.staticflickr.com/1/706/32327357611_e6d8c969f0_o.jpg,0.4375,0.25,1.0,1.0,875,608,https://www.flickr.com/photos/69203347@N03/32327357611/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n6e71074210b14311,https://c1.staticflickr.com/9/8138/29557058646_e9ce6ea45f_o.jpg,0.31726618705,0.0,0.951798561151,1.0,821,861,https://www.flickr.com/photos/robdammers/29557058646,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n70c1ef3568b3679c,https://c1.staticflickr.com/6/5587/31407169076_edb2c229b0_o.jpg,0.0,0.0,0.5,0.75,561,964,https://www.flickr.com/photos/codnewsroom/31407169076,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\n829c775eeed836fd,https://c1.staticflickr.com/1/511/32535140296_69891b5c62_o.jpg,0.333333333333,0.0,1.0,1.0,405,535,http://www.flickr.com/photos/alessandroambrosetti/32535140296/,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/\ne35f59f712f7264e,https://c1.staticflickr.com/8/7231/27048186341_884f252f48_o.jpg,0.5,0.25,1.0,1.0,548,199,https://www.flickr.com/photos/rhemkes/27048186341,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\n90aff731f3c23326,https://c1.staticflickr.com/6/5340/30870134946_9583ab4bcc_o.jpg,0.0,0.0,0.5,0.75,558,593,https://www.flickr.com/photos/leeco/30870134946,https://creativecommons.org/licenses/by/2.0/,Lee Coursey,https://www.flickr.com/people/leeco/\n8a439737928eca5a,https://c1.staticflickr.com/1/750/32778356176_0719af3dc9_o.jpg,0.0,0.0,1.0,0.752351097179,498,210,https://flickr.com/15558944@N00/32778356176,https://creativecommons.org/licenses/by/2.0/,Bill Showalter,https://www.flickr.com/people/wrshow/\n8f7aea5334a1c175,https://c1.staticflickr.com/6/5689/30469942780_e63c7c1cd6_o.jpg,0.25,0.25,0.75,1.0,744,145,https://www.flickr.com/photos/lwpkommunikacio/30469942780,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\n8c72b6de257893ea,https://c1.staticflickr.com/1/751/31862015772_5cfc92cc5a_o.jpg,0.333333333333,0.0,1.0,1.0,973,597,https://www.flickr.com/photos/larry1732/31862015772/,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/\n42b036f1d2d7caaa,https://c1.staticflickr.com/8/7505/27524712033_317aef63c3_o.jpg,0.2515625,0.0,1.0,1.0,80,33,https://www.flickr.com/photos/treegrow/27524712033,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\ne6291351de0db95f,https://c1.staticflickr.com/1/295/31919399845_43fdfc8ca2_o.jpg,0.22009569378,0.0,1.0,1.0,70,852,https://www.flickr.com/photos/jsjgeology/31919399845,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\naf2d226ebe750c36,https://c1.staticflickr.com/8/7280/27005396566_c03cdae50e_o.jpg,0.0,0.0,0.592295345104,0.75,22,482,https://www.flickr.com/photos/78428166@N00/27005396566,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\nf29cfc6cff019a05,https://c1.staticflickr.com/9/8099/29661311005_6fa52938b4_o.jpg,0.4375,0.25,1.0,1.0,699,550,https://www.flickr.com/photos/westher/29661311005,https://creativecommons.org/licenses/by/2.0/,Esther Westerveld,https://www.flickr.com/people/westher/\ne7ed3360bfd141be,https://c1.staticflickr.com/9/8049/29776095146_f45b9b8d0c_o.jpg,0.0,0.0,0.5625,0.75,821,315,https://flickr.com/28682774@N00/29776095146,https://creativecommons.org/licenses/by/2.0/,FotoGuy 49057,https://www.flickr.com/people/fotoguy49057/\nacfee3a2e85fa407,https://c1.staticflickr.com/1/659/31760075203_37a1e3fb54_o.jpg,0.363112391931,0.0,1.0,1.0,885,876,https://www.flickr.com/photos/fusion_of_horizons/31760075203,https://creativecommons.org/licenses/by/2.0/,fusion-of-horizons,https://www.flickr.com/people/fusion_of_horizons/\naf47658929e9e020,https://c1.staticflickr.com/1/577/31967366991_58798baeaa_o.jpg,0.333333333333,0.0,1.0,1.0,815,797,https://www.flickr.com/photos/yamahawatercraft/31967366991,https://creativecommons.org/licenses/by/2.0/,Yamaha Watercraft Group,https://www.flickr.com/people/yamahawatercraft/\nfe92e5551b34f1c5,https://c1.staticflickr.com/1/702/32352488230_2b73a684c1_o.jpg,0.5,0.25,1.0,1.0,706,630,https://www.flickr.com/photos/126337928@N05/32352488230,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\n164966eefc92c694,https://c1.staticflickr.com/1/354/31449575194_9845e57517_o.jpg,0.25,0.25,0.75,1.0,484,661,https://www.flickr.com/photos/big-ashb/31449575194,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/\n1affe53c24b027f1,https://c1.staticflickr.com/6/5466/30765889565_c646c9529a_o.jpg,0.0,0.25,0.498159057437,1.0,973,755,https://www.flickr.com/photos/jsjgeology/30765889565,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n675a4b8b7af6106a,https://c1.staticflickr.com/6/5588/31333559071_3f6cffdf73_o.jpg,0.481144343303,0.0,1.0,1.0,815,930,https://www.flickr.com/photos/presidenciamx/31333559071,https://creativecommons.org/licenses/by/2.0/,Presidencia de la Rep\\303\\272blica Mexicana,https://www.flickr.com/people/presidenciamx/\n74adf7af9ec2061d,https://c1.staticflickr.com/9/8865/28327014811_00b5b075fc_o.jpg,0.0,0.5,0.75,1.0,859,759,https://www.flickr.com/photos/66755335@N05/28327014811,https://creativecommons.org/licenses/by/2.0/,Geneva Vanderzeil apairandasparediy.com,https://www.flickr.com/people/66755335@N05/\na03e75c9b79f8555,https://c1.staticflickr.com/8/7559/28000932813_3e92668dcd_o.jpg,0.4375,0.25,1.0,1.0,423,597,https://www.flickr.com/photos/paulosena/28000932813,https://creativecommons.org/licenses/by/2.0/,Paulo Sena,https://www.flickr.com/people/paulosena/\n1391997e4493b593,https://c1.staticflickr.com/6/5772/29674747743_ab1d3c5123_o.jpg,0.515602322206,0.25,1.0,1.0,407,886,https://www.flickr.com/photos/13476480@N07/29674747743,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n45f677941f8ac69e,https://c1.staticflickr.com/1/594/31686072453_a4ae47f52a_o.jpg,0.5,0.25,1.0,1.0,416,621,https://www.flickr.com/photos/30478819@N08/31686072453/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n30d3d719e61e2072,https://c1.staticflickr.com/9/8468/29637624805_48467d46ca_o.jpg,0.280784844384,0.0,0.842354533153,1.0,322,524,https://www.flickr.com/photos/postmanpetecoluk/29637624805/,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\nec03f2e34af2ddbd,https://c1.staticflickr.com/8/7314/27595115836_357ff1bcbd_o.jpg,0.281690140845,0.25,0.845070422535,1.0,896,445,https://www.flickr.com/photos/28169156@N03/27595115836/,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/\nb1eb3f59c3692f57,https://c1.staticflickr.com/9/8097/28653696183_60b7f67f1c_o.jpg,0.0,0.25,0.5,1.0,561,513,https://www.flickr.com/photos/jill_carlson/28653696183,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\n346580ba3d8e02a9,https://c1.staticflickr.com/8/7709/27686852390_59392af4d3_o.jpg,0.377884615385,0.0,0.755769230769,0.75,896,972,https://www.flickr.com/photos/hisgett/27686852390/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n8d85544963a43b69,https://c1.staticflickr.com/9/8898/29489485226_d150ebf0e4_o.jpg,0.0,0.0,0.75,0.75,820,803,https://www.flickr.com/photos/vuarnet/29489485226,https://creativecommons.org/licenses/by/2.0/,Raul Ramirez,https://www.flickr.com/people/vuarnet/\n9078599081607fe1,https://c1.staticflickr.com/8/7673/26721329371_06c1f2d17c_o.jpg,0.25,0.25,0.75,1.0,806,520,https://www.flickr.com/photos/immergutrocken/26721329371/,https://creativecommons.org/licenses/by/2.0/,Immergut Festival,https://www.flickr.com/people/immergutrocken/\na11c084117146f12,https://c1.staticflickr.com/8/7563/28643840043_c9820e02dd_o.jpg,0.0,0.0,0.714503816794,1.0,830,402,https://www.flickr.com/photos/prayitnophotography/28643840043,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\ne842142a00e888b5,https://c1.staticflickr.com/8/7576/28179611191_7846edf099_o.jpg,0.4375,0.0,1.0,0.75,920,454,https://www.flickr.com/photos/cogdog/28179611191,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n86b35699d93b0e1f,https://c1.staticflickr.com/8/7655/29353113395_b162766c12_o.jpg,0.0,0.25,0.5625,1.0,792,762,https://www.flickr.com/photos/juliejordanscott/29353113395/,https://creativecommons.org/licenses/by/2.0/,Julie Jordan Scott,https://www.flickr.com/people/juliejordanscott/\nb7649740b8d2fed4,https://c1.staticflickr.com/6/5705/30148393994_a934f72eb6_o.jpg,0.0,0.0,0.427111716621,0.75,780,532,https://www.flickr.com/photos/thoseguys119/30148393994,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nc548155c68fc31d4,https://c1.staticflickr.com/6/5542/30500459720_e6d9bdcaa2_o.jpg,0.4375,0.25,1.0,1.0,913,545,https://www.flickr.com/photos/llstalteri/30500459720/,https://creativecommons.org/licenses/by/2.0/,Lori L. Stalteri,https://www.flickr.com/people/llstalteri/\n1b7509773259af3c,https://c1.staticflickr.com/9/8890/29360152820_f6d26a3465_o.jpg,0.0,0.0,0.662261380323,1.0,915,60,https://www.flickr.com/photos/regattajugend/29360152820,https://creativecommons.org/licenses/by/2.0/,Felix Somm,https://www.flickr.com/people/regattajugend/\nb4f745516df9099b,https://c1.staticflickr.com/6/5345/30204127300_04b6170fcc_o.jpg,0.5,0.25,1.0,1.0,806,380,https://www.flickr.com/photos/stevendepolo/30204127300,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n4ed47c104d2238d5,https://c1.staticflickr.com/6/5684/31235817595_cb3b080fe1_o.jpg,0.248936170213,0.0,1.0,1.0,437,224,https://flickr.com/65843623@N02/31235817595,https://creativecommons.org/licenses/by/2.0/,Alberto from Spain,https://www.flickr.com/people/65843623@N02/\n34a5f4d37ac36c16,https://c1.staticflickr.com/9/8394/29228351141_bb891902ab_o.jpg,0.415322580645,0.0,0.83064516129,0.75,702,788,https://www.flickr.com/photos/texaus1/29228351141/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/\nd41b2a2d4d0f53cb,https://c1.staticflickr.com/6/5343/30535910711_bf7b798298_o.jpg,0.333333333333,0.0,1.0,1.0,960,306,https://www.flickr.com/photos/o_0/30535910711,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n641577c50b8633ed,https://c1.staticflickr.com/9/8831/28522457480_07891fdb5e_o.jpg,0.475899280576,0.0,0.951798561151,0.75,574,145,https://www.flickr.com/photos/8269539@N04/28522457480,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\na4e2e1f6635dcc3b,https://c1.staticflickr.com/8/7056/27479626916_13e4ac79f8_o.jpg,0.0,0.25,0.5,1.0,625,540,https://www.flickr.com/photos/jeremylevinedesign/27479626916,https://creativecommons.org/licenses/by/2.0/,Jeremy Levine,https://www.flickr.com/people/jeremylevinedesign/\n13b271083da464a9,https://c1.staticflickr.com/4/3874/32273070114_97a9c5f849_o.jpg,0.25,0.28125,1.0,0.84375,985,517,https://www.flickr.com/photos/conifer/32273070114/,https://creativecommons.org/licenses/by/2.0/,coniferconifer,https://www.flickr.com/people/conifer/\n449c8886e3986a46,https://c1.staticflickr.com/8/7238/26863824635_a3cb9c29b7_o.jpg,0.25,0.25,0.75,1.0,820,315,https://www.flickr.com/photos/jus10h/26863824635,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n3ea9d08d84186ec4,https://c1.staticflickr.com/8/7698/26655404210_d2f08a1d28_o.jpg,0.28125,0.25,0.84375,1.0,924,3,https://www.flickr.com/photos/68147320@N02/26655404210,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\n0c7aae4cbca2f522,https://c1.staticflickr.com/8/7549/26271766943_3e9c633f0f_o.jpg,0.0,0.25,0.495594713656,1.0,72,408,https://www.flickr.com/photos/amslerpix/26271766943,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\nb54f7ef1f66c047d,https://c1.staticflickr.com/9/8330/29655755141_3655e7d0a4_o.jpg,0.0,0.0,0.75,1.0,141,682,https://www.flickr.com/photos/15016964@N02/29655755141,https://creativecommons.org/licenses/by/2.0/,Marie Hale,https://www.flickr.com/people/15016964@N02/\n74637a7b643ab194,https://c1.staticflickr.com/8/7356/26807511285_ed8ba40aff_o.jpg,0.4375,0.25,1.0,1.0,459,970,https://www.flickr.com/photos/cabanillas2012/26807511285,https://creativecommons.org/licenses/by/2.0/,Juan Cabanillas,https://www.flickr.com/people/cabanillas2012/\nca6ad83e69143e79,https://c1.staticflickr.com/6/5757/31123726885_3a8dea4924_o.jpg,0.0,0.0,0.666666666667,1.0,806,284,https://www.flickr.com/photos/stevendepolo/31123726885/,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n15bce12814b6e4cc,https://c1.staticflickr.com/8/7287/27326496343_fc929927fc_o.jpg,0.274729520866,0.25,0.824188562597,1.0,875,512,https://www.flickr.com/photos/97934454@N06/27326496343,https://creativecommons.org/licenses/by/2.0/,danielhak,https://www.flickr.com/people/97934454@N06/\n57118088b4317074,https://c1.staticflickr.com/6/5345/30735776551_24b8489cdc_o.jpg,0.4375,0.0,1.0,0.75,499,494,https://www.flickr.com/photos/davidberkowitz/30735776551/,https://creativecommons.org/licenses/by/2.0/,David Berkowitz,https://www.flickr.com/people/davidberkowitz/\nea97ab7e4697a529,https://c1.staticflickr.com/9/8365/27823532723_212c933e75_o.jpg,0.0,0.25,0.75,1.0,978,159,https://www.flickr.com/photos/rapidtravelchai/27823532723,https://creativecommons.org/licenses/by/2.0/,Stefan Krasowski,https://www.flickr.com/people/rapidtravelchai/\nae575cd3e22a6865,https://c1.staticflickr.com/9/8414/28288685530_fd7e7b7bfc_o.jpg,0.4375,0.25,1.0,1.0,459,246,https://www.flickr.com/photos/rheba/28288685530,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/\nd1d0311a9272deb4,https://c1.staticflickr.com/6/5654/29420480034_241847dd09_o.jpg,0.43661971831,0.25,1.0,1.0,407,886,https://www.flickr.com/photos/eltb/29420480034,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n0c4219f2a19b5dc3,https://c1.staticflickr.com/8/7285/26942499112_a27fcfc6e9_o.jpg,0.0,0.0,0.922010398614,1.0,459,236,https://www.flickr.com/photos/discoveroregon/26942499112,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n264621e12ba00a08,https://c1.staticflickr.com/8/7384/27699103315_858f35751a_o.jpg,0.25,0.0,1.0,0.599757673667,888,509,https://www.flickr.com/photos/tatlongmaria/27699103315,https://creativecommons.org/licenses/by/2.0/,Vin Sotto,https://www.flickr.com/people/tatlongmaria/\nb2332b90769a75da,https://c1.staticflickr.com/9/8251/28927941210_70d19d5ed0_o.jpg,0.180225281602,0.0,0.540675844806,0.75,971,515,https://www.flickr.com/photos/nordique/28927941210,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/\n5c2232293e164671,https://c1.staticflickr.com/9/8470/29581274652_8fe413e5d6_o.jpg,0.0,0.25,0.566326530612,1.0,115,252,https://www.flickr.com/photos/marknenadov/29581274652,https://creativecommons.org/licenses/by/2.0/,Mark Nenadov,https://www.flickr.com/people/marknenadov/\nadfbd490615460cd,https://c1.staticflickr.com/8/7391/27829320260_055300b7e7_o.jpg,0.313471502591,0.25,1.0,1.0,851,778,https://www.flickr.com/photos/archier/27829320260,https://creativecommons.org/licenses/by/2.0/,Archie,https://www.flickr.com/people/archier/\ne20bc9f95c411494,https://c1.staticflickr.com/8/7557/27519562064_b1460fff21_o.jpg,0.25,0.25,0.75,1.0,818,679,https://www.flickr.com/photos/thecarspy/27519562064,https://creativecommons.org/licenses/by/2.0/,The Car Spy,https://www.flickr.com/people/thecarspy/\ne5215b5d4cd82cbf,https://c1.staticflickr.com/9/8657/28705646522_de6ed7800d_o.jpg,0.332106038292,0.0,0.996318114875,1.0,976,112,https://www.flickr.com/photos/zigazou76/28705646522,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\nad7086670219e564,https://c1.staticflickr.com/9/8556/29776514680_6f29e9ab44_o.jpg,0.0,0.0,1.0,0.669128508124,459,503,https://www.flickr.com/photos/eltb/29776514680,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n177502506a526672,https://c1.staticflickr.com/6/5530/22832510208_7ba877334c_o.jpg,0.5,0.0,1.0,0.75,273,979,https://www.flickr.com/photos/larry1732/22832510208/,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/\n2d8ed6f718970a3e,https://c1.staticflickr.com/9/8771/27633978383_eacd8b4a21_o.jpg,0.0,0.0,0.75,1.0,459,488,https://flickr.com/72756774@N00/27633978383,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/\nabbe78acf1622947,https://c1.staticflickr.com/6/5745/31076781051_5a5c2b8b98_o.jpg,0.267938931298,0.0,0.803816793893,0.75,138,47,https://flickr.com/143049688@N08/31076781051,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/\n30c6878430e6cdf6,https://c1.staticflickr.com/6/5746/30768321930_0a0fafa498_o.jpg,0.25,0.0,1.0,1.0,990,66,http://www.flickr.com/photos/torsten-behrens/30768321930/,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/\n0266ecc7811833f2,https://c1.staticflickr.com/8/7211/27180762323_54ffeae169_o.jpg,0.25,0.25,1.0,1.0,929,136,https://www.flickr.com/photos/danielchownet/27180762323,https://creativecommons.org/licenses/by/2.0/,Daniel Chow,https://www.flickr.com/people/danielchownet/\n3222f14dd1938ce2,https://c1.staticflickr.com/8/7524/27389743494_877a33f594_o.jpg,0.0,0.495594713656,0.75,0.991189427313,146,123,https://www.flickr.com/photos/noaaphotolib/27389743494,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\n37f1e5313e0e0954,https://c1.staticflickr.com/8/7251/27987303076_c267353ab3_o.jpg,0.0,0.0,0.75,0.5625,995,582,https://www.flickr.com/photos/scotnelson/27987303076,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n61894431d41c4000,https://c1.staticflickr.com/6/5617/31024055500_ea956fc0a7_o.jpg,0.327407407407,0.0,1.0,1.0,821,739,https://www.flickr.com/photos/8269539@N04/31024055500,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\nfe480382c631a180,https://c1.staticflickr.com/8/7728/27921270692_8bf89ff93f_o.jpg,0.0,0.25,0.718197879859,1.0,16,638,https://flickr.com/9494793@N06/27921270692,https://creativecommons.org/licenses/by/2.0/,shrikant rao,https://www.flickr.com/people/9494793@N06/\n83b622f9b15d6474,https://c1.staticflickr.com/9/8127/30048848135_6e90b46907_o.jpg,0.5,0.0,1.0,0.75,309,780,https://www.flickr.com/photos/pamas/30048848135,https://creativecommons.org/licenses/by/2.0/,Esin \\303\\234st\\303\\274n,https://www.flickr.com/people/pamas/\n8ce8787f64f14b53,https://c1.staticflickr.com/8/7688/27847610175_cbeea0dc26_o.jpg,0.333333333333,0.0,1.0,1.0,537,752,https://www.flickr.com/photos/pavdw/27847610175,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/\ncf4a85abf1666800,https://c1.staticflickr.com/9/8582/30490693995_0c24607786_o.jpg,0.25,0.0,1.0,0.75,792,63,https://www.flickr.com/photos/rodrigoparedes/30490693995,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/\n40759c2d17fb6c94,https://c1.staticflickr.com/8/7343/27366674203_e1261fcc0f_o.jpg,0.578822733424,0.0,1.0,0.75,669,21,https://flickr.com/131810676@N03/27366674203,https://creativecommons.org/licenses/by/2.0/,baka_neko_baka,https://www.flickr.com/people/131810676@N03/\n325789b40f7da9e0,https://c1.staticflickr.com/6/5828/30300835496_e419a1ab96_o.jpg,0.25,0.0,0.75,0.75,854,573,https://www.flickr.com/photos/slapers/30300835496,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\n8fddc65ec86fce04,https://c1.staticflickr.com/1/543/32442267191_37e83c6ae8_o.jpg,0.25,0.0,1.0,0.75,760,584,https://www.flickr.com/photos/raneko/32442267191,https://creativecommons.org/licenses/by/2.0/,raneko,https://www.flickr.com/people/raneko/\n44b379bf815e1746,https://c1.staticflickr.com/6/5550/30477586123_85be15da2a_o.jpg,0.28125,0.25,0.84375,1.0,484,496,https://www.flickr.com/photos/davidstanleytravel/30477586123,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n516bc0104a91474a,https://c1.staticflickr.com/1/270/31435292163_1413ec34b7_o.jpg,0.376029654036,0.0,1.0,0.75,310,542,https://www.flickr.com/photos/gails_pictures/31435292163,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nf49ec243edd7f49d,https://c1.staticflickr.com/8/7420/27382495811_69422822ee_o.jpg,0.5,0.0,1.0,0.75,908,740,https://www.flickr.com/photos/34739556@N04/27382495811,https://creativecommons.org/licenses/by/2.0/,rawdonfox,https://www.flickr.com/people/34739556@N04/\n09e2a86d93e696c2,https://c1.staticflickr.com/9/8729/27645665963_17a51e5b5b_o.jpg,0.422764227642,0.0,0.845528455285,0.75,548,363,https://www.flickr.com/photos/ed_webster/27645665963,https://creativecommons.org/licenses/by/2.0/,Ed Webster,https://www.flickr.com/people/ed_webster/\n5bdcb6829f8f9132,https://c1.staticflickr.com/6/5343/30334617984_bb0a7b3a00_o.jpg,0.5,0.25,1.0,1.0,310,529,https://www.flickr.com/photos/dordrecht-holland/30334617984,https://creativecommons.org/licenses/by/2.0/,Paul van de Velde,https://www.flickr.com/people/dordrecht-holland/\n1d43c97815370034,https://c1.staticflickr.com/8/7536/27283005492_2b39c3252e_o.jpg,0.0,0.0,0.527272727273,0.75,780,680,https://www.flickr.com/photos/thoseguys119/27283005492/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nbecef3a2170582bb,https://c1.staticflickr.com/8/7395/27503522300_f0297718ab_o.jpg,0.25,0.0,1.0,1.0,980,405,https://www.flickr.com/photos/jsjgeology/27503522300,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nffea2ed2fcef0dd0,https://c1.staticflickr.com/9/8659/29238139265_4a79ddee01_o.jpg,0.0,0.493768328446,0.75,0.987536656891,699,461,https://www.flickr.com/photos/stefanjurca/29238139265,https://creativecommons.org/licenses/by/2.0/,\\310\\230tefan Jurc\\304\\203,https://www.flickr.com/people/stefanjurca/\n13bf676e06991bce,https://c1.staticflickr.com/9/8732/28326370375_230235317b_o.jpg,0.25,0.0,0.75,0.75,625,441,https://www.flickr.com/photos/transitomedellin/28326370375,https://creativecommons.org/licenses/by/2.0/,Secretar\\303\\255a de Movilidad de Medell\\303\\255n,https://www.flickr.com/people/transitomedellin/\n9526e7c0bd2fc81a,https://c1.staticflickr.com/6/5504/31108872031_07a6a32891_o.jpg,0.0,0.267938931298,0.75,0.803816793893,145,92,https://www.flickr.com/photos/walterpro/31108872031,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/\ncda202022420496e,https://c1.staticflickr.com/7/6136/6020181362_f2f76c8183_o.jpg,0.489195230999,0.25,1.0,1.0,875,184,https://www.flickr.com/photos/davidwilson1949/6020181362,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n727c9a66ec99a467,https://c1.staticflickr.com/6/5790/30942351326_987fbf8685_o.jpg,0.5,0.25,1.0,1.0,618,693,https://www.flickr.com/photos/itupictures/30942351326,https://creativecommons.org/licenses/by/2.0/,ITU Pictures,https://www.flickr.com/people/itupictures/\n3335e065145de529,https://c1.staticflickr.com/9/8226/29437478951_e39066951e_o.jpg,0.303094233474,0.0,0.909282700422,1.0,702,706,https://www.flickr.com/photos/texaus1/29437478951/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/\n49d917b291a57947,https://c1.staticflickr.com/6/5771/30781442070_83f99e828a_o.jpg,0.0,0.0,0.669128508124,1.0,407,630,https://www.flickr.com/photos/eltb/30781442070,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n3e7e8fa4d177c7be,https://c1.staticflickr.com/8/7107/26268000374_d88c56c63c_o.jpg,0.502573529412,0.0,1.0,0.75,955,843,https://www.flickr.com/photos/ecristescu/26268000374,https://creativecommons.org/licenses/by/2.0/,Eva Cristescu,https://www.flickr.com/people/ecristescu/\na2dcc313d858bc7b,https://c1.staticflickr.com/1/466/32629095521_f3639f3e37_o.jpg,0.277173913043,0.0,0.83152173913,0.75,332,291,https://www.flickr.com/photos/usfwsmtnprairie/32629095521,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n66c62c878d251400,https://c1.staticflickr.com/1/301/32592336745_70f59500cc_o.jpg,0.5,0.0,1.0,0.75,753,913,https://flickr.com/95467082@N08/32592336745,https://creativecommons.org/licenses/by/2.0/,England Squash Masters,https://www.flickr.com/people/squashdev/\nb5acd06ef02c5a28,https://c1.staticflickr.com/1/267/31465632643_9e5a84e0fd_o.jpg,0.318416523236,0.25,1.0,1.0,581,538,https://www.flickr.com/photos/55229469@N07/31465632643,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\nf7e21aa5b89dc479,https://c1.staticflickr.com/6/5716/30454914174_39d30615ca_o.jpg,0.0,0.333333333333,1.0,1.0,611,48,https://www.flickr.com/photos/aloha75/30454914174,https://creativecommons.org/licenses/by/2.0/,Sam Howzit,https://www.flickr.com/people/aloha75/\nfff5cd6df399473f,https://c1.staticflickr.com/9/8225/28835100212_71f39b2124_o.jpg,0.0,0.25,0.75,1.0,563,634,https://www.flickr.com/photos/cybrgrl/28835100212/,https://creativecommons.org/licenses/by/2.0/,cybrgrl,https://www.flickr.com/people/cybrgrl/\n4a1de381f4cce999,https://c1.staticflickr.com/3/2768/32550534510_7919a589f5_o.jpg,0.0,0.0,0.666666666667,1.0,532,978,https://www.flickr.com/photos/janitors/32550534510,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\nf6ab199663a8f33d,https://c1.staticflickr.com/1/289/31663704593_1250e752c0_o.jpg,0.0,0.0,0.5625,0.75,735,523,https://www.flickr.com/photos/27665395@N05/31663704593,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n93f2a5812ca3241f,https://c1.staticflickr.com/9/8203/29412690446_fc09deb07c_o.jpg,0.29093799682,0.25,0.872813990461,1.0,980,472,https://flickr.com/54327644@N04/29412690446,https://creativecommons.org/licenses/by/2.0/,Robert Montgomery,https://www.flickr.com/people/rmonty119/\n17c4092d035bde96,https://c1.staticflickr.com/9/8662/28692072351_c5ed514d18_o.jpg,0.287776898734,0.25,0.863330696203,1.0,821,944,https://www.flickr.com/photos/56433265@N04/28692072351/,https://creativecommons.org/licenses/by/2.0/,webbgun,https://www.flickr.com/people/56433265@N04/\n4840dfe43ea37b95,https://c1.staticflickr.com/8/7656/27148870722_13641b0319_o.jpg,0.0,0.25,0.5,1.0,973,478,https://www.flickr.com/photos/gammaman/27148870722,https://creativecommons.org/licenses/by/2.0/,Eli Christman,https://www.flickr.com/people/gammaman/\nffd985c4cf5478f7,https://c1.staticflickr.com/8/7333/27220237694_8a9334860c_o.jpg,0.248348017621,0.0,0.745044052863,0.75,979,392,https://www.flickr.com/photos/bensutherland/27220237694,https://creativecommons.org/licenses/by/2.0/,Ben Sutherland,https://www.flickr.com/people/bensutherland/\n7695d21604f149c8,https://c1.staticflickr.com/9/8270/29741307952_232b36fb12_o.jpg,0.0,0.0,1.0,0.666666666667,558,873,https://www.flickr.com/photos/dfmagazine/29741307952,https://creativecommons.org/licenses/by/2.0/,Irish Defence Forces,https://www.flickr.com/people/dfmagazine/\n7c286d90b45671b7,https://c1.staticflickr.com/6/5480/30720787031_b8dfa7860f_o.jpg,0.25,0.0,0.75,0.75,760,284,https://www.flickr.com/photos/30478819@N08/30720787031/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\na8b3dcdc20299873,https://c1.staticflickr.com/8/7476/27081615680_ee8e13c8ee_o.jpg,0.2515625,0.0,1.0,1.0,100,785,https://www.flickr.com/photos/flk/27081615680,https://creativecommons.org/licenses/by/2.0/,falkowata,https://www.flickr.com/people/flk/\nbe1b8285b79e828b,https://c1.staticflickr.com/8/7048/27229102475_6922f37ee0_o.jpg,0.0,0.0,0.75,1.0,880,401,https://www.flickr.com/photos/herry/27229102475/,https://creativecommons.org/licenses/by/2.0/,Herry Lawford,https://www.flickr.com/people/herry/\nec193cf149b9fc18,https://c1.staticflickr.com/1/776/32301128931_9167c4fff9_o.jpg,0.200323101777,0.0,1.0,1.0,709,342,https://flickr.com/64018555@N03/32301128931,https://creativecommons.org/licenses/by/2.0/,Maryland GovPics,https://www.flickr.com/people/mdgovpics/\n176d426593e9c926,https://c1.staticflickr.com/1/261/31921036984_b161453163_o.jpg,0.0,0.0,0.799676898223,1.0,582,146,https://www.flickr.com/photos/prayitnophotography/31921036984,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\n5f65d30425e66456,https://c1.staticflickr.com/8/7388/27944256761_7fcbaca010_o.jpg,0.0,0.0,0.75,0.5625,995,6,https://www.flickr.com/photos/scotnelson/27944256761,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n0ef77c2553050c35,https://c1.staticflickr.com/8/7074/27662519362_8c920c2a06_o.jpg,0.4375,0.0,1.0,0.75,539,866,https://www.flickr.com/photos/cogdog/27662519362,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n5ffc4a696ce4a5e7,https://c1.staticflickr.com/8/7522/27802698000_13c988b321_o.jpg,0.0,0.0,1.0,0.669128508124,132,313,https://www.flickr.com/photos/92252798@N07/27802698000,https://creativecommons.org/licenses/by/2.0/,Dick Culbert,https://www.flickr.com/people/92252798@N07/\nd5a9b43c6257b3ac,https://c1.staticflickr.com/6/5643/31158952182_09fca710fb_o.jpg,0.28125,0.25,0.84375,1.0,311,138,http://www.flickr.com/photos/_hq_/31158952182/,https://creativecommons.org/licenses/by/2.0/,_hq_,https://www.flickr.com/people/_hq_/\nc0360639cfab955a,https://c1.staticflickr.com/1/407/32185311074_cbdbab65e4_o.jpg,0.297202797203,0.0,1.0,0.75,889,144,https://www.flickr.com/photos/iainmerchant/32185311074/,https://creativecommons.org/licenses/by/2.0/,Iain Merchant,https://www.flickr.com/people/iainmerchant/\n4cfbbed21f47e316,https://c1.staticflickr.com/9/8391/29333612546_5e8a07d994_o.jpg,0.0,0.0,1.0,0.666666666667,579,362,https://www.flickr.com/photos/quinet/29333612546,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n8a38e4b8439b15c1,https://c1.staticflickr.com/6/5338/31260856321_aebeb5a60a_o.jpg,0.0,0.0,0.75,0.75,625,493,https://www.flickr.com/photos/135302410@N02/31260856321/,https://creativecommons.org/licenses/by/2.0/,Libraries Taskforce,https://www.flickr.com/people/135302410@N02/\n8bd41e07bbd1ff71,https://c1.staticflickr.com/8/7121/26885021811_90519f0097_o.jpg,0.25,0.400242326333,1.0,1.0,498,134,https://www.flickr.com/photos/taymazvalley/26885021811,https://creativecommons.org/licenses/by/2.0/,Taymaz Valley,https://www.flickr.com/people/taymazvalley/\n581ca0ff906e8dae,https://c1.staticflickr.com/9/8208/29648449920_18b0d94def_o.jpg,0.0,0.25,0.5625,1.0,470,814,https://www.flickr.com/photos/asdsoupdsa/29648449920,https://creativecommons.org/licenses/by/2.0/,brett Vachon,https://www.flickr.com/people/asdsoupdsa/\na3ccc58e78fdf13f,https://c1.staticflickr.com/6/5810/30030758064_d83b51e6c1_o.jpg,0.0,0.0,0.5,0.75,561,711,https://flickr.com/53276480@N07/30030758064,https://creativecommons.org/licenses/by/2.0/,Maize &amp; Blue Nation,https://www.flickr.com/people/maizenbluenation/\n52deba153ed4e0d2,https://c1.staticflickr.com/8/7546/27021893442_f881ac93c9_o.jpg,0.190882731959,0.0,0.572648195876,0.75,780,39,https://www.flickr.com/photos/thoseguys119/27021893442/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n0cb005f7eeccb80a,https://c1.staticflickr.com/8/7213/26898155986_aa8d3db608_o.jpg,0.0,0.25,0.75,1.0,868,370,https://www.flickr.com/photos/stevendepolo/26898155986,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n746cdec58e3555ba,https://c1.staticflickr.com/8/7507/27244044704_7af542878d_o.jpg,0.400242326333,0.0,1.0,0.75,556,682,https://www.flickr.com/photos/mdgovpics/27244044704,https://creativecommons.org/licenses/by/2.0/,Maryland GovPics,https://www.flickr.com/people/mdgovpics/\n8eaa89fd0bb46b1f,https://c1.staticflickr.com/3/2618/32210749254_3e1c83c592_o.jpg,0.0,0.0,0.75,0.497426470588,760,500,https://www.flickr.com/photos/mdpettitt/32210749254,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/\n6e4e81bfd69686b9,https://c1.staticflickr.com/6/5598/30928947635_5812d0401e_o.jpg,0.25,0.0,1.0,1.0,975,757,http://www.flickr.com/photos/jsjgeology/30928947635/,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n71683b3b80fcf92a,https://c1.staticflickr.com/9/8880/28862164822_5393446462_o.jpg,0.66188304721,0.0,0.926636266094,0.75,826,943,https://www.flickr.com/photos/anandajoti/28862164822,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/\n3423264d6c9b8baf,https://c1.staticflickr.com/1/258/31998508826_99facbcabd_o.jpg,0.309659090909,0.0,0.928977272727,1.0,437,776,https://www.flickr.com/photos/autohistorian/31998508826,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\nfb3c12256f23989b,https://c1.staticflickr.com/8/7402/27118673643_0fdd3f89d9_o.jpg,0.0,0.25,0.75,1.0,810,513,https://www.flickr.com/photos/paleogrubs/27118673643,https://creativecommons.org/licenses/by/2.0/,Jess (Paleo Grubs),https://www.flickr.com/people/paleogrubs/\n0da13c7b05715592,https://c1.staticflickr.com/8/7054/27503912205_a9efe10e81_o.jpg,0.333333333333,0.0,1.0,1.0,519,318,https://www.flickr.com/photos/box_repsol/27503912205,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n4186e729dbcd65ad,https://c1.staticflickr.com/1/126/31586240016_9077ec5fdf_o.jpg,0.28125,0.0,0.84375,0.75,990,670,http://www.flickr.com/photos/torsten-behrens/31586240016/,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/\n951c95dc11b7431d,https://c1.staticflickr.com/9/8450/29170472241_5c555474f8_o.jpg,0.5,0.25,1.0,1.0,548,462,https://www.flickr.com/photos/rhemkes/29170472241,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\nb58545f2b0d5d165,https://c1.staticflickr.com/8/7448/26724828724_eee9f4867b_o.jpg,0.0,0.0,1.0,1.0,671,714,https://www.flickr.com/photos/ronald_menti/26724828724,https://creativecommons.org/licenses/by/2.0/,Ronald Menti,https://www.flickr.com/people/ronald_menti/\nbf5b8c9ce69cbb96,https://c1.staticflickr.com/8/7722/27925424645_05beaf3a3c_o.jpg,0.0,0.498153618907,0.75,1.0,888,155,https://www.flickr.com/photos/eltb/27925424645,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n29ccc9a7f7a5c7e9,https://c1.staticflickr.com/8/7485/27328874180_42fff8ed1b_o.jpg,0.0,0.28125,0.75,0.84375,909,151,https://www.flickr.com/photos/jorge-11/27328874180,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/\n25191e656692499e,https://c1.staticflickr.com/9/8220/29214416310_f61c9fa775_o.jpg,0.335787923417,0.0,1.0,1.0,347,222,https://www.flickr.com/photos/13476480@N07/29214416310,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\ne4d94a69f8fafdd0,https://c1.staticflickr.com/1/741/31105681693_b87e102a3a_o.jpg,0.25,0.0,0.75,0.75,405,982,https://flickr.com/132004986@N08/31105681693,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/\n001c4d1e70f7847d,https://c1.staticflickr.com/8/7483/26824988452_452302846f_o.jpg,0.495555555556,0.0,1.0,0.75,98,510,https://www.flickr.com/photos/usfwsmtnprairie/26824988452,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n8b661b3e287c2cf5,https://c1.staticflickr.com/8/7330/27213065113_cd19dfce23_o.jpg,0.25,0.0,0.75,0.75,896,558,https://www.flickr.com/photos/8269539@N04/27213065113,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\ndf914a8593278b9f,https://c1.staticflickr.com/1/588/32242349735_1402bfb74c_o.jpg,0.0,0.0,0.5,0.75,145,118,https://flickr.com/53454613@N06/32242349735,https://creativecommons.org/licenses/by/2.0/,Vikash Prasad,https://www.flickr.com/people/vikash_prasad/\n9217c179a59aa290,https://c1.staticflickr.com/1/744/31973559064_d39daf1f37_o.jpg,0.0,0.0,0.992805755396,1.0,499,506,http://www.flickr.com/photos/acsonline/31973559064/,https://creativecommons.org/licenses/by/2.0/,Regione Umbria News -  Agenzia informazione istituzionale Assemblea legislativa,https://www.flickr.com/people/acsonline/\na4df17c393427e52,https://c1.staticflickr.com/6/5751/30885576092_0fb2da5d1d_o.jpg,0.0,0.0,0.75,1.0,548,833,https://www.flickr.com/photos/belurashok/30885576092/,https://creativecommons.org/licenses/by/2.0/,Belur Ashok,https://www.flickr.com/people/belurashok/\n6dc31579f851ead0,https://c1.staticflickr.com/8/7449/27961024125_12aebe2bbf_o.jpg,0.25,0.25,1.0,1.0,40,334,https://www.flickr.com/photos/tatuaggi/27961024125,https://creativecommons.org/licenses/by/2.0/,Ettore  Bechis,https://www.flickr.com/people/tatuaggi/\nb677ba49b3e290df,https://c1.staticflickr.com/9/8315/29648630762_e9568c1cec_o.jpg,0.25,0.0,0.75,0.75,672,998,https://www.flickr.com/photos/swampa/29648630762/,https://creativecommons.org/licenses/by/2.0/,Steve Collis,https://www.flickr.com/people/swampa/\nc4633134a9d9e7a1,https://c1.staticflickr.com/6/5322/30187971926_7e259dc9c6_o.jpg,0.333333333333,0.0,1.0,1.0,556,36,https://www.flickr.com/photos/grahammitchellphotography/30187971926/,https://creativecommons.org/licenses/by/2.0/,Graham  Mitchell,https://www.flickr.com/people/grahammitchellphotography/\n1813f9d6e6e8fe6f,https://c1.staticflickr.com/8/7713/26894830826_a3bf6b1505_o.jpg,0.4375,0.0,1.0,0.75,709,598,https://flickr.com/24470821@N04/26894830826,https://creativecommons.org/licenses/by/2.0/,Andrew Milligan Sumo,https://www.flickr.com/people/andrewmilligansumo/\n20393f1b7875359b,https://c1.staticflickr.com/8/7449/27348974995_af9e6a0a59_o.jpg,0.333333333333,0.0,1.0,1.0,777,922,https://www.flickr.com/photos/devdsp/27348974995,https://creativecommons.org/licenses/by/2.0/,Adam Thomas,https://www.flickr.com/people/devdsp/\nc8af18e5b7802daa,https://c1.staticflickr.com/1/467/32536056851_422bccdc83_o.jpg,0.0,0.0,0.606331168831,0.75,938,62,https://www.flickr.com/photos/30478819@N08/32536056851,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\nd8e10d91ca06f8a5,https://c1.staticflickr.com/9/8515/29372466910_57aa97ac13_o.jpg,0.28125,0.0,0.84375,0.75,418,568,https://www.flickr.com/photos/ewolivera/29372466910,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/\n0ababfda44ebb517,https://c1.staticflickr.com/8/7213/27525586092_578f80ffdb_o.jpg,0.25,0.25,1.0,1.0,923,771,https://www.flickr.com/photos/stellahyc/27525586092/in/dateposted-public/,https://creativecommons.org/licenses/by/2.0/,stellahyc910,https://www.flickr.com/people/stellahyc/\n89fba1b9f530ae70,https://c1.staticflickr.com/8/7574/27115480444_11f4c317a8_o.jpg,0.25,0.25,0.75,1.0,896,856,https://www.flickr.com/photos/faceme/27115480444,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/\n5d587eaa33f6efec,https://c1.staticflickr.com/6/5753/30246020403_be930e6573_o.jpg,0.0,0.0,1.0,1.0,986,521,https://www.flickr.com/photos/32020964@N08/30246020403,https://creativecommons.org/licenses/by/2.0/,Ms. Phoenix,https://www.flickr.com/people/32020964@N08/\n245d9fddf4882422,https://c1.staticflickr.com/9/8492/29653146791_b10d08a7bc_o.jpg,0.25,0.0,1.0,0.75,558,949,https://www.flickr.com/photos/jeepersmedia/29653146791,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nbd6dc8bdbcb0b831,https://c1.staticflickr.com/6/5525/30235545433_95cbeaa40b_o.jpg,0.4375,0.25,1.0,1.0,88,272,https://www.flickr.com/photos/saiberiac/30235545433/,https://creativecommons.org/licenses/by/2.0/,saiberiac,https://www.flickr.com/people/saiberiac/\n22d1d72a1cc5785d,https://c1.staticflickr.com/9/8552/29033913772_15b3dc502c_o.jpg,0.0,0.0,0.5625,0.75,874,31,https://www.flickr.com/photos/ewolivera/29033913772,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/\nd3966ff1b248339d,https://c1.staticflickr.com/6/5627/30700166756_29f5f795f9_o.jpg,0.0,0.25,0.498159057437,1.0,752,690,https://www.flickr.com/photos/davehamster/30700166756,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\ne4a52d140ec95442,https://c1.staticflickr.com/8/7438/27485835504_09b66c9d7d_o.jpg,0.25,0.0,1.0,1.0,459,483,https://www.flickr.com/photos/77175657@N00/27485835504,https://creativecommons.org/licenses/by/2.0/,Graham Tiller,https://www.flickr.com/people/77175657@N00/\nf8a1d40087c108da,https://c1.staticflickr.com/8/7305/27403949490_e1057517fc_o.jpg,0.25,0.25,1.0,1.0,340,406,https://www.flickr.com/photos/imagesbywestfall/27403949490,https://creativecommons.org/licenses/by/2.0/,greg westfall,https://www.flickr.com/people/imagesbywestfall/\n4cf942f7c681656b,https://c1.staticflickr.com/9/8097/28588027803_26dc651bde_o.jpg,0.5,0.25,1.0,1.0,94,79,https://www.flickr.com/photos/flowcomm/28588027803,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\n298df01e71810e92,https://c1.staticflickr.com/9/8062/28850621350_9a22040434_o.jpg,0.0,0.0,0.666666666667,1.0,820,465,https://www.flickr.com/photos/mwf2005/28850621350/,https://creativecommons.org/licenses/by/2.0/,muffinn,https://www.flickr.com/people/mwf2005/\n7c6dbdec07d0acf5,https://c1.staticflickr.com/9/8560/29503772490_ed22583915_o.jpg,0.333333333333,0.0,1.0,1.0,896,859,https://www.flickr.com/photos/cerdec/29503772490/,https://creativecommons.org/licenses/by/2.0/,U.S. Army CERDEC,https://www.flickr.com/people/cerdec/\n142e658c9367945b,https://c1.staticflickr.com/8/7549/30165158471_03f5960ba0_o.jpg,0.0,0.0,0.5,0.75,990,117,https://www.flickr.com/photos/jsorbie/30165158471,https://creativecommons.org/licenses/by/2.0/,Jim Sorbie,https://www.flickr.com/people/jsorbie/\n967f1a790c941a63,https://c1.staticflickr.com/6/5732/30388082743_78fedd2304_o.jpg,0.25,0.25,1.0,0.75,472,583,https://flickr.com/89965037@N07/30388082743,https://creativecommons.org/licenses/by/2.0/,Lee Russell,https://www.flickr.com/people/outpost51/\nf7ddc4c989a9e4b5,https://c1.staticflickr.com/8/7416/27252602345_c945e3d8b1_o.jpg,0.475215517241,0.25,0.950431034483,1.0,980,404,http://www.flickr.com/photos/43931507@N00/27252602345,https://creativecommons.org/licenses/by/2.0/,minniemouseaunt,https://www.flickr.com/people/minniemouseaunt/\n43c8b56758e6b0c7,https://c1.staticflickr.com/8/7634/26604549764_e2f8eedf36_o.jpg,0.0,0.0,0.666666666667,1.0,416,667,https://www.flickr.com/photos/jdlasica/26604549764,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\n1db62ba481fd1af8,https://c1.staticflickr.com/6/5761/30977743075_47af5c998b_o.jpg,0.25,0.0,1.0,0.720796460177,558,129,http://www.flickr.com/photos/davepotwin/30977743075/,https://creativecommons.org/licenses/by/2.0/,PleaseRomaineCalm,https://www.flickr.com/people/davepotwin/\n465f14c48a632760,https://c1.staticflickr.com/8/7237/26628163524_d1009c6dd2_o.jpg,0.0,0.0,0.342490842491,0.75,821,488,https://www.flickr.com/photos/jsjgeology/26628163524,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n5800f0555b4ad847,https://c1.staticflickr.com/9/8885/29659665666_313a59612f_o.jpg,0.0,0.25,0.5,1.0,981,462,https://www.flickr.com/photos/pinboke/29659665666,https://creativecommons.org/licenses/by/2.0/,pinboke_planet,https://www.flickr.com/people/pinboke/\n2811d9fb17320d92,https://c1.staticflickr.com/6/5598/30130313291_c434911558_o.jpg,0.0,0.0,0.666666666667,1.0,437,30,https://www.flickr.com/photos/sg2012/30130313291,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/\n5e0c4d4825aee892,https://c1.staticflickr.com/1/394/32500626382_729c3b9c1e_o.jpg,0.0,0.0,0.693233082707,1.0,821,739,https://www.flickr.com/photos/8269539@N04/32500626382,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n42eae55796d97d80,https://c1.staticflickr.com/9/8627/27801929884_e1a28543d7_o.jpg,0.25,0.0,1.0,0.75,934,1000,https://www.flickr.com/photos/personalcreations/27801929884,https://creativecommons.org/licenses/by/2.0/,Personal Creations,https://www.flickr.com/people/personalcreations/\n165f1657664921d2,https://c1.staticflickr.com/6/5520/30658638931_674c9b0472_o.jpg,0.0,0.0,0.652554744526,1.0,982,460,https://www.flickr.com/photos/apardavila/30658638931,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\ndb84ea60134f9620,https://c1.staticflickr.com/8/7793/26551537394_70c5d60a23_o.jpg,0.25,0.5,1.0,1.0,780,670,https://flickr.com/119921578@N08/26551537394,https://creativecommons.org/licenses/by/2.0/,Shauna Karren,https://www.flickr.com/people/119921578@N08/\ne8b06b6a62a6ba8a,https://c1.staticflickr.com/9/8614/30555395836_bd793539b5_o.jpg,0.255402384501,0.0,0.766207153502,0.75,628,765,https://flickr.com/138532424@N02/30555395836,https://creativecommons.org/licenses/by/2.0/,Australian Embassy Jakarta,https://www.flickr.com/people/kedubesaustralia/\na8cfdf9c34e0a2d9,https://c1.staticflickr.com/8/7691/27087118310_696af659ea_o.jpg,0.25,0.0,1.0,0.56338028169,688,44,https://www.flickr.com/photos/xenocrates/27087118310/,https://creativecommons.org/licenses/by/2.0/,Shriram Rajagopalan,https://www.flickr.com/people/xenocrates/\ncde1c3c60736172f,https://c1.staticflickr.com/1/723/31995310840_6e1bc09ab7_o.jpg,0.501840942563,0.0,1.0,0.75,763,769,https://flickr.com/45532942@N08/31995310840,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/\nd0d06d0b4adde069,https://c1.staticflickr.com/9/8282/29816630481_e333a2a194_o.jpg,0.25,0.281690140845,1.0,0.845070422535,407,224,https://www.flickr.com/photos/eltb/29816630481,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n2d1337e832e6fe6f,https://c1.staticflickr.com/9/8651/29182292624_e60247b542_o.jpg,0.25,0.0,0.75,0.75,699,889,https://www.flickr.com/photos/tipsfortravellers/29182292624,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n920ad3984ccec82f,https://c1.staticflickr.com/1/416/31606445890_7804e967b6_o.jpg,0.0,0.4375,0.75,1.0,883,416,https://flickr.com/60904035@N00/31606445890,https://creativecommons.org/licenses/by/2.0/,Ryan McBride,https://www.flickr.com/people/randomidea/\n808e9c7d014889d3,https://c1.staticflickr.com/9/8875/28734551356_0955dd5a2f_o.jpg,0.267938931298,0.25,0.803816793893,1.0,966,441,https://www.flickr.com/photos/ruthanddave/28734551356,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n8a49344047a5588b,https://c1.staticflickr.com/1/443/32132267962_1e28eaf5bc_o.jpg,0.25,0.28125,1.0,0.84375,650,757,https://www.flickr.com/photos/stonehenge-stone-circle/32132267962,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/\ned8e7a3d3c20f3d3,https://c1.staticflickr.com/1/504/31837345982_3baa01e3c8_o.jpg,0.0,0.0,0.75,0.469285714286,323,776,https://flickr.com/13497267@N04/31837345982,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\na9f3c1bde134189c,https://c1.staticflickr.com/8/7757/26883263780_13bfd4cd9f_o.jpg,0.0,0.0,1.0,0.666666666667,780,59,https://flickr.com/119921578@N08/26883263780,https://creativecommons.org/licenses/by/2.0/,Shauna Karren,https://www.flickr.com/people/119921578@N08/\n13d0357b6f74c9a1,https://c1.staticflickr.com/6/5465/30465251960_4f9a815547_o.jpg,0.0,0.25,0.498159057437,1.0,973,31,https://www.flickr.com/photos/jsjgeology/30465251960,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n1f10c46a2add3154,https://c1.staticflickr.com/8/7493/27937773852_b7573a8ab7_o.jpg,0.0,0.0,0.732612055641,1.0,407,754,https://www.flickr.com/photos/eltb/27937773852,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nc45815b2680d4091,https://c1.staticflickr.com/8/7033/26847100771_f7975ee16c_o.jpg,0.433673469388,0.25,1.0,1.0,145,269,https://www.flickr.com/photos/lakeworth/26847100771/,https://creativecommons.org/licenses/by/2.0/,Henry,https://www.flickr.com/people/lakeworth/\n4d6ea4a22304f6a3,https://c1.staticflickr.com/6/5765/30445790094_530ba6be7b_o.jpg,0.25,0.0,1.0,1.0,976,633,https://flickr.com/136319147@N08/30445790094,https://creativecommons.org/licenses/by/2.0/,Andrew Harvey,https://www.flickr.com/people/136319147@N08/\n5e193f640e7a14e8,https://c1.staticflickr.com/1/611/31582176402_97b2094baa_o.jpg,0.264204545455,0.25,0.792613636364,1.0,918,863,https://www.flickr.com/photos/13476480@N07/31582176402,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n6c7ade28cd53fb63,https://c1.staticflickr.com/9/8872/28508128535_94aa81cde1_o.jpg,0.0,0.0,0.75,0.75,820,843,https://www.flickr.com/photos/ultrakml/28508128535,https://creativecommons.org/licenses/by/2.0/,Katherine Lim,https://www.flickr.com/people/ultrakml/\nca88af482ad8a06f,https://c1.staticflickr.com/8/7480/27302076643_050bb3431a_o.jpg,0.453219927096,0.0,0.906439854192,1.0,980,588,https://www.flickr.com/photos/nullawar/27302076643,https://creativecommons.org/licenses/by/2.0/,Mike Russell,https://www.flickr.com/people/nullawar/\n9b721117fc400fba,https://c1.staticflickr.com/8/7412/27027318824_1049060977_o.jpg,0.0,0.0,0.75,0.745945945946,450,586,https://www.flickr.com/photos/pussreboots/27027318824,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/\nc0df62a82cafe1e9,https://c1.staticflickr.com/9/8502/28909144032_c39f154a89_o.jpg,0.281690140845,0.0,0.845070422535,0.75,309,873,https://www.flickr.com/photos/treegrow/28909144032,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nfedefb8996e29d17,https://c1.staticflickr.com/9/8482/28342708511_0616b54825_o.jpg,0.25,0.0,1.0,0.75,598,883,https://www.flickr.com/photos/78428166@N00/28342708511,https://creativecommons.org/licenses/by/2.0/,Tony Alter,https://www.flickr.com/people/78428166@N00/\n9f4985797fa1d8ff,https://c1.staticflickr.com/9/8661/27816777924_23d5171937_o.jpg,0.0,0.0,0.75,0.423337856174,518,932,https://www.flickr.com/photos/ben_salter/27816777924,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/\ne40743c521088a46,https://c1.staticflickr.com/6/5814/30199467743_0356a2b7a4_o.jpg,0.249631811487,0.0,0.748895434462,0.75,558,467,https://www.flickr.com/photos/7armyjmtc/30199467743,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n7892e215793a52ba,https://c1.staticflickr.com/8/7543/26868867966_fb37f346dc_o.jpg,0.4375,0.0,1.0,0.75,336,201,https://www.flickr.com/photos/epector/26868867966/,https://creativecommons.org/licenses/by/2.0/,synspectrum,https://www.flickr.com/people/epector/\n1546e92bc6a7b022,https://c1.staticflickr.com/9/8409/29163039733_15b02066c8_o.jpg,0.28125,0.0,0.84375,0.75,430,646,https://www.flickr.com/photos/stevendepolo/29163039733,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n75a87ac21ad2e102,https://c1.staticflickr.com/4/3819/32404940724_d63f934fe5_o.jpg,0.25,0.25,0.75,1.0,563,105,http://www.flickr.com/photos/wendelinjacober/32404940724/,https://creativecommons.org/licenses/by/2.0/,Wendelin Jacober,https://www.flickr.com/people/wendelinjacober/\n0f045b490c3114d1,https://c1.staticflickr.com/2/1472/26739533465_54d714a5e7_o.jpg,0.2806640625,0.25,0.8419921875,1.0,145,150,https://www.flickr.com/photos/kpaulus/26739533465,https://creativecommons.org/licenses/by/2.0/,Kristine Paulus,https://www.flickr.com/people/kpaulus/\naf9e74a075ac85af,https://c1.staticflickr.com/9/8877/28420485825_c05f70ef9a_o.jpg,0.25,0.5,1.0,1.0,418,659,https://www.flickr.com/photos/david_a_l/28420485825,https://creativecommons.org/licenses/by/2.0/,David \\303\\201lvarez L\\303\\263pez,https://www.flickr.com/people/david_a_l/\n2eb4e79648604ce8,https://c1.staticflickr.com/1/687/31689111765_9edb7e27b9_o.jpg,0.249079528719,0.0,0.747238586156,0.75,804,861,https://www.flickr.com/photos/oregondot/31689111765,https://creativecommons.org/licenses/by/2.0/,Oregon Department of Transportation,https://www.flickr.com/people/oregondot/\n894d73b393644096,https://c1.staticflickr.com/6/5640/30819180405_a10fce675d_o.jpg,0.321697324415,0.25,0.965091973244,1.0,651,727,https://www.flickr.com/photos/jus10h/30819180405,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\ndbd5f5702c93d034,https://c1.staticflickr.com/6/5613/29951142783_3c84dbf4a5_o.jpg,0.25,0.25,1.0,1.0,884,279,https://www.flickr.com/photos/eeko/29951142783,https://creativecommons.org/licenses/by/2.0/,Easa Shamih,https://www.flickr.com/people/eeko/\n168d2537c53e700a,https://c1.staticflickr.com/8/7297/26898505771_a6e899cf76_o.jpg,0.5,0.25,1.0,1.0,752,952,https://www.flickr.com/photos/joe_labrie_photographe/26898505771/,https://creativecommons.org/licenses/by/2.0/,Joe Labrie,https://www.flickr.com/people/joe_labrie_photographe/\n20a0f33c27319e22,https://c1.staticflickr.com/6/5349/29914100011_df73f1e645_o.jpg,0.25,0.0,1.0,1.0,455,821,https://www.flickr.com/photos/43547009@N00/29914100011,https://creativecommons.org/licenses/by/2.0/,Alejandro,https://www.flickr.com/people/43547009@N00/\nc68023eba7275883,https://c1.staticflickr.com/9/8516/29040164810_bdcb906ee2_o.jpg,0.25,0.0,1.0,0.5,304,235,https://www.flickr.com/photos/vahemart/29040164810,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\n56c4132c88e2ed95,https://c1.staticflickr.com/6/5624/30343150400_da5e738a7d_o.jpg,0.25,0.25,1.0,1.0,922,794,https://flickr.com/64648244@N04/30343150400,https://creativecommons.org/licenses/by/2.0/,Ulf K,https://www.flickr.com/people/ulfk/\n4ddc5798f1064e63,https://c1.staticflickr.com/1/455/32798759792_39b67d5e08_o.jpg,0.0,0.2921875,0.75,0.8765625,254,270,http://www.flickr.com/photos/70253321@N00/32798759792/,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/\n77372caa2e431497,https://c1.staticflickr.com/3/2233/32810582941_4dc4d253b2_o.jpg,0.258620689655,0.25,0.775862068966,1.0,288,720,https://www.flickr.com/photos/56433265@N04/32810582941/,https://creativecommons.org/licenses/by/2.0/,webbgun,https://www.flickr.com/people/56433265@N04/\n3907155845aacc98,https://c1.staticflickr.com/1/725/32128693256_9ff9386c39_o.jpg,0.249079528719,0.25,0.747238586156,1.0,752,3,https://www.flickr.com/photos/davehamster/32128693256,https://creativecommons.org/licenses/by/2.0/,David Merrett,https://www.flickr.com/people/davehamster/\n5b163efae2531296,https://c1.staticflickr.com/6/5457/30527015730_0a47f991fa_o.jpg,0.0,0.0,0.75,0.5625,638,379,https://www.flickr.com/photos/davidwilson1949/30527015730,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n1e206ad4145c0550,https://c1.staticflickr.com/1/416/32543608055_15f03da798_o.jpg,0.500736377025,0.0,1.0,0.75,909,976,https://www.flickr.com/photos/wwworks/32543608055/,https://creativecommons.org/licenses/by/2.0/,woodleywonderworks,https://www.flickr.com/people/wwworks/\nef2dd0a40f9eb549,https://c1.staticflickr.com/9/8596/28316352061_4101702259_o.jpg,0.4375,0.0,1.0,0.75,518,893,https://www.flickr.com/photos/zongo/28316352061,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\na88a23bb48fef5ab,https://c1.staticflickr.com/6/5649/31675014742_7bd1404bb5_o.jpg,0.25,0.25,1.0,1.0,699,524,https://www.flickr.com/photos/83015819@N00/31675014742,https://creativecommons.org/licenses/by/2.0/,Jon Worth,https://www.flickr.com/people/83015819@N00/\ncd40089255f3e954,https://c1.staticflickr.com/1/639/32597319832_fb1fae8a6e_o.jpg,0.256726457399,0.25,0.770179372197,1.0,921,912,https://flickr.com/139421366@N03/32597319832,https://creativecommons.org/licenses/by/2.0/,Chris Bee,https://www.flickr.com/people/139421366@N03/\nfbda5ca921c03edd,https://c1.staticflickr.com/9/8524/29608377340_ce9b29e56f_o.jpg,0.0,0.0,0.501846381093,0.75,97,985,https://www.flickr.com/photos/amslerpix/29608377340/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n30389445f3947947,https://c1.staticflickr.com/6/5558/30981863726_345b0ee521_o.jpg,0.0,0.0,0.75,1.0,820,604,https://www.flickr.com/photos/j_regan/30981863726,https://creativecommons.org/licenses/by/2.0/,regan76,https://www.flickr.com/people/j_regan/\nc606961aed093fc6,https://c1.staticflickr.com/6/5832/30705472991_32b2d24dbf_o.jpg,0.5,0.0,1.0,0.75,747,215,https://www.flickr.com/photos/mindahaas/30705472991/,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/\n5e6d3ce36813f328,https://c1.staticflickr.com/6/5577/30294594921_3896e83b14_o.jpg,0.248713235294,0.0,0.746139705882,0.75,950,58,https://www.flickr.com/photos/barnimages/30294594921,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\nc1a578c938add7dd,https://c1.staticflickr.com/8/7527/26263014723_16931450f7_o.jpg,0.502573529412,0.0,1.0,0.75,459,847,https://www.flickr.com/photos/shankaronline/26263014723,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nb0b956df9bb694b5,https://c1.staticflickr.com/6/5748/31070607730_e3dbe9c896_o.jpg,0.210588633288,0.25,0.631765899865,1.0,875,522,http://www.flickr.com/photos/aswans1234567/31070607730/,https://creativecommons.org/licenses/by/2.0/,Alex Swanston&#x27;s Bus Photos,https://www.flickr.com/people/aswans1234567/\n7000bf5f979d6820,https://c1.staticflickr.com/9/8332/29873471852_7b0e3f52d9_o.jpg,0.4375,0.0,1.0,0.75,718,722,https://www.flickr.com/photos/truckhardware/29873471852,https://creativecommons.org/licenses/by/2.0/,Truck Hardware,https://www.flickr.com/people/truckhardware/\na58ddae3378df587,https://c1.staticflickr.com/8/7417/27305675741_e78da24597_o.jpg,0.25,0.0,0.75,0.75,51,393,https://www.flickr.com/photos/tipsfortravellers/27305675741,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n46a77a6a837577ae,https://c1.staticflickr.com/3/2534/32741715042_cf17efd441_o.jpg,0.438671875,0.0,1.0,0.75,889,85,http://www.flickr.com/photos/135123601@N08/32741715042,https://creativecommons.org/licenses/by/2.0/,Iain Merchant,https://www.flickr.com/people/iainmerchant/\n4a5952a5d4b57592,https://c1.staticflickr.com/9/8123/28370529884_392d7f31dd_o.jpg,0.572888283379,0.0,1.0,0.75,407,572,https://www.flickr.com/photos/eltb/28370529884,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nff27bf6aa84e6259,https://c1.staticflickr.com/8/7550/26912267132_7293f9ec75_o.jpg,0.280784844384,0.0,0.842354533153,1.0,789,521,https://www.flickr.com/photos/sheilaellen/26912267132,https://creativecommons.org/licenses/by/2.0/,Sheila Thomson,https://www.flickr.com/people/sheilaellen/\n3fa5028cf4f8ba2c,https://c1.staticflickr.com/9/8280/27926586644_42a579895d_o.jpg,0.5,0.0,1.0,0.75,647,951,https://www.flickr.com/photos/unb_agencia/27926586644,https://creativecommons.org/licenses/by/2.0/,Secom UnB,https://www.flickr.com/people/unb_agencia/\n84ac2949eec4c848,https://c1.staticflickr.com/9/8541/30024614922_ae26962220_o.jpg,0.0763888888889,0.0,1.0,1.0,775,833,https://www.flickr.com/photos/atoach/30024614922,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n43692809404c2d2d,https://c1.staticflickr.com/9/8399/28809717223_c1f4ea19f3_o.jpg,0.180225281602,0.0,0.540675844806,0.75,780,784,https://www.flickr.com/photos/thoseguys119/28809717223/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nb6800449b18b4a4d,https://c1.staticflickr.com/6/5340/30068133376_2800644f3f_o.jpg,0.0,0.25,0.748646209386,1.0,809,545,https://www.flickr.com/photos/13476480@N07/30068133376,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n95decb1c7f103716,https://c1.staticflickr.com/9/8640/28451285815_dfd9901e94_o.jpg,0.267938931298,0.25,0.803816793893,1.0,563,634,https://www.flickr.com/photos/jpstjohn/28451285815,https://creativecommons.org/licenses/by/2.0/,John St John,https://www.flickr.com/people/jpstjohn/\nd5a6d3ff26f5aee3,https://c1.staticflickr.com/8/7429/26702998642_b02d4c0f19_o.jpg,0.25,0.25,0.75,1.0,512,748,https://www.flickr.com/photos/135553449@N08/26702998642/,https://creativecommons.org/licenses/by/2.0/,Steve Ginn,https://www.flickr.com/people/135553449@N08/\neceb77cce5f6b545,https://c1.staticflickr.com/1/583/31465196773_814262f726_o.jpg,0.0,0.25,0.718197879859,1.0,52,633,https://www.flickr.com/photos/jsjgeology/31465196773,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n7608022af9de0911,https://c1.staticflickr.com/9/8669/28346022974_586470b74b_o.jpg,0.225,0.25,0.675,1.0,437,945,https://www.flickr.com/photos/51811543@N08/28346022974,https://creativecommons.org/licenses/by/2.0/,FotoSleuth,https://www.flickr.com/people/51811543@N08/\n6345939a69bbcd9f,https://c1.staticflickr.com/9/8878/28327476194_8048ba973e_o.jpg,0.25,0.299878836834,1.0,0.899636510501,982,265,https://www.flickr.com/photos/slgc/28327476194/,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\n35362d276b96493a,https://c1.staticflickr.com/9/8093/29140632692_d048e65eff_o.jpg,0.0,0.0,0.666666666667,1.0,820,399,http://www.flickr.com/photos/34203205@N00/29140632692,https://creativecommons.org/licenses/by/2.0/,michael dornbierer,https://www.flickr.com/people/ausnahmezustand/\n43fa7681ff455067,https://c1.staticflickr.com/1/604/32384468300_622ef05e1f_o.jpg,0.328696925329,0.0,0.986090775988,1.0,404,283,https://flickr.com/56594044@N06/32384468300,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\ne3e48bbc18512d8b,https://c1.staticflickr.com/1/664/31944680043_994ed0ef67_o.jpg,0.0,0.25,0.5,1.0,752,756,https://www.flickr.com/photos/bpprice/31944680043,https://creativecommons.org/licenses/by/2.0/,brando.n,https://www.flickr.com/people/bpprice/\n729d9a32a3aed341,https://c1.staticflickr.com/9/8552/29685024330_47306c2d34_o.jpg,0.5,0.25,1.0,1.0,875,454,https://www.flickr.com/photos/brisbanecitycouncil/29685024330,https://creativecommons.org/licenses/by/2.0/,Brisbane City Council,https://www.flickr.com/people/brisbanecitycouncil/\n9a4abb4f1c8b6a40,https://c1.staticflickr.com/9/8461/29333983472_50e8ff4499_o.jpg,0.57825203252,0.0,1.0,0.75,880,450,https://www.flickr.com/photos/danramarch/29333983472,https://creativecommons.org/licenses/by/2.0/,Daniel Ramirez,https://www.flickr.com/people/danramarch/\n62943f3ebd229c97,https://c1.staticflickr.com/1/509/31604986414_71d9dc6baf_o.jpg,0.28125,0.0,0.84375,0.75,875,162,https://www.flickr.com/photos/69203347@N03/31604986414,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\n176661d425ada84d,https://c1.staticflickr.com/9/8408/29017413622_62b8e6f79f_o.jpg,0.25,0.0,1.0,0.75,323,835,https://www.flickr.com/photos/jedrecord/29017413622,https://creativecommons.org/licenses/by/2.0/,Jed Record,https://www.flickr.com/people/jedrecord/\nc3563115b7782179,https://c1.staticflickr.com/6/5808/29872632613_a8d3e09c4f_o.jpg,0.284198113208,0.0,0.852594339623,0.75,982,142,https://www.flickr.com/photos/apardavila/29872632613,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n4c9a630a85867657,https://c1.staticflickr.com/8/7746/27252116771_9ee431696f_o.jpg,0.297768479777,0.0,0.893305439331,1.0,699,813,https://www.flickr.com/photos/ian_d/27252116771,https://creativecommons.org/licenses/by/2.0/,Ian Dick,https://www.flickr.com/people/ian_d/\n376f72d7db053e97,https://c1.staticflickr.com/6/5588/29922613536_78a740046d_o.jpg,0.25,0.0,1.0,1.0,625,865,https://www.flickr.com/photos/tslac/29922613536,https://creativecommons.org/licenses/by/2.0/,Texas State Library and Archives Commission,https://www.flickr.com/people/tslac/\nf65cdc11b6b64455,https://c1.staticflickr.com/6/5662/30630043532_1b75017d72_o.jpg,0.305722891566,0.0,1.0,1.0,982,532,https://www.flickr.com/photos/apardavila/30630043532/,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\ncc62a2cec0d7d24d,https://c1.staticflickr.com/9/8650/30420241085_24eafa244f_o.jpg,0.0,0.0,0.75,0.75,672,691,https://www.flickr.com/photos/glorycycles/30420241085,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n09ed6b229a742b79,https://c1.staticflickr.com/8/7408/27766557031_d39401b621_o.jpg,0.0,0.0,0.75,0.75,742,526,https://www.flickr.com/photos/el_cajon_yacht_club/27766557031,https://creativecommons.org/licenses/by/2.0/,el cajon yacht club,https://www.flickr.com/people/el_cajon_yacht_club/\n2d8d28903d67e4e9,https://c1.staticflickr.com/8/7561/26963610801_572e0ee4c7_o.jpg,0.232244318182,0.0,0.696732954545,0.75,405,576,https://flickr.com/34200064@N08/26963610801,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/\n4d10858914409bc3,https://c1.staticflickr.com/8/7483/26546059003_8bd6ecbc48_o.jpg,0.24882629108,0.0,1.0,1.0,111,83,https://flickr.com/70804987@N00/26546059003,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/\n28b8e5c3fc0fdc74,https://c1.staticflickr.com/8/7503/29473531483_406ed8a956_o.jpg,0.0,0.0,0.666666666667,1.0,623,326,https://flickr.com/23928430@N05/29473531483,https://creativecommons.org/licenses/by/2.0/,eduardo.ferron,https://www.flickr.com/people/23928430@N05/\n32581cf019042e32,https://c1.staticflickr.com/9/8630/29467085285_91879b00d6_o.jpg,0.5,0.0,1.0,0.75,986,883,https://www.flickr.com/photos/cogdog/29467085285,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\nda9f4f268f299bfc,https://c1.staticflickr.com/9/8621/27633111553_4f11c06e3a_o.jpg,0.475899280576,0.0,0.951798561151,0.75,699,808,https://www.flickr.com/photos/67117584@N04/27633111553,https://creativecommons.org/licenses/by/2.0/,Aleah Phils,https://www.flickr.com/people/67117584@N04/\nbb1471310a7905c9,https://c1.staticflickr.com/9/8314/29191758144_c44f945d59_o.jpg,0.197411003236,0.0,1.0,1.0,918,724,https://www.flickr.com/photos/chrstphre/29191758144/,https://creativecommons.org/licenses/by/2.0/,chrstphr\\303\\251  c\\303\\246mpb\\303\\253ll,https://www.flickr.com/people/chrstphre/\n9653a6a7de9efcc9,https://c1.staticflickr.com/9/8400/29498634994_1ed877e277_o.jpg,0.0,0.0,0.7484375,1.0,822,622,https://www.flickr.com/photos/linsinchen/29498634994,https://creativecommons.org/licenses/by/2.0/,Sinchen.Lin,https://www.flickr.com/people/linsinchen/\n208a1e2ea402251f,https://c1.staticflickr.com/6/5443/30119348680_527172cd04_o.jpg,0.25,0.279205607477,1.0,0.83761682243,407,600,https://www.flickr.com/photos/eltb/30119348680,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nc74d247a0927c95f,https://c1.staticflickr.com/8/7747/26548563113_4776647bd8_o.jpg,0.333333333333,0.0,1.0,1.0,480,37,https://www.flickr.com/photos/luxurydesigner/26548563113,https://creativecommons.org/licenses/by/2.0/,Brandon Bailey,https://www.flickr.com/people/luxurydesigner/\ncaf2e98bf1caae20,https://c1.staticflickr.com/8/7458/27860791762_e671d93eb5_o.jpg,0.4375,0.25,1.0,1.0,820,965,https://www.flickr.com/photos/paulcarless/27860791762/,https://creativecommons.org/licenses/by/2.0/,Paul Carless,https://www.flickr.com/people/paulcarless/\n0fa46fff42d072a8,https://c1.staticflickr.com/8/7014/26218524153_5b1e86b08a_o.jpg,0.330871491876,0.0,1.0,1.0,27,409,https://www.flickr.com/photos/vastateparksstaff/26218524153,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\na579a2a0e34a70fe,https://c1.staticflickr.com/9/8306/27900114863_c826b3d227_o.jpg,0.503303964758,0.25,1.0,1.0,704,535,https://www.flickr.com/photos/mks_s2is/27900114863,https://creativecommons.org/licenses/by/2.0/,Manish Srivastava,https://www.flickr.com/people/mks_s2is/\n55cd7bd3ca55d413,https://c1.staticflickr.com/8/7537/28073649482_4ee00c28b4_o.jpg,0.252222222222,0.25,0.756666666667,1.0,405,416,https://www.flickr.com/photos/barteq24/28073649482,https://creativecommons.org/licenses/by/2.0/,Bartlomiej Mostek,https://www.flickr.com/people/barteq24/\n9ca2a73879f15f6b,https://c1.staticflickr.com/9/8207/28742793560_ff0a0ecc66_o.jpg,0.0,0.25,0.498159057437,1.0,826,795,https://www.flickr.com/photos/zigazou76/28742793560,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n75f15badd0ee2b81,https://c1.staticflickr.com/9/8728/28910624571_ac6b2e55a9_o.jpg,0.0,0.0,0.5,0.75,438,593,https://www.flickr.com/photos/bumeister/28910624571,https://creativecommons.org/licenses/by/2.0/,John Buie,https://www.flickr.com/people/bumeister/\nb7fdc64ea8d656a7,https://c1.staticflickr.com/1/496/32119006770_3dca38ff55_o.jpg,0.25,0.25,1.0,1.0,91,111,https://www.flickr.com/photos/30478819@N08/32119006770,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n2eb27f0707abb813,https://c1.staticflickr.com/6/5827/30132402646_6a9d4b4ebf_o.jpg,0.25,0.25,0.75,1.0,536,563,https://www.flickr.com/photos/67338640@N04/30132402646,https://creativecommons.org/licenses/by/2.0/,Billy Meinke,https://www.flickr.com/people/67338640@N04/\n22b826285fdf981d,https://c1.staticflickr.com/1/408/31753241363_c65b7a19de_o.jpg,0.0,0.0,0.651603498542,1.0,292,143,https://www.flickr.com/photos/13476480@N07/31753241363,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nff262013963d745a,https://c1.staticflickr.com/1/594/31944475485_707dd45b66_o.jpg,0.0,0.25,0.494868035191,1.0,499,678,https://www.flickr.com/photos/duncanh1/31944475485,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\n7e67be74a6a84ae2,https://c1.staticflickr.com/9/8742/28322612182_356d5978f0_o.jpg,0.333333333333,0.0,1.0,1.0,806,734,https://www.flickr.com/photos/143135875@N03/28322612182,https://creativecommons.org/licenses/by/2.0/,Save the Dream,https://www.flickr.com/people/143135875@N03/\n2b431f2d4e46dd5b,https://c1.staticflickr.com/9/8806/29320944834_861d10ab03_o.jpg,0.25,0.0,0.75,0.75,340,217,https://www.flickr.com/photos/blmoregon/29320944834,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\nd8be262e7018a4c5,https://c1.staticflickr.com/9/8559/29648194554_be791830c0_o.jpg,0.4375,0.25,1.0,1.0,820,295,https://flickr.com/126953417@N02/29648194554,https://creativecommons.org/licenses/by/2.0/,Philip Terry Graham,https://www.flickr.com/people/philipterrygraham/\nb9e92b1fa6b249d0,https://c1.staticflickr.com/9/8086/29212850355_09e70e1ee0_o.jpg,0.4375,0.25,1.0,1.0,707,851,https://www.flickr.com/photos/davidwilson1949/29212850355,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\nea32dde60c4c2efc,https://c1.staticflickr.com/9/8188/29374608790_de510dc1aa_o.jpg,0.0,0.0,0.5625,0.75,986,134,https://www.flickr.com/photos/swallowtailgardenseeds/29374608790,https://creativecommons.org/licenses/by/2.0/,Swallowtail Garden Seeds,https://www.flickr.com/people/swallowtailgardenseeds/\nd9d151273d6ded24,https://c1.staticflickr.com/9/8104/28400865306_a6b9d8cdb8_o.jpg,0.25,0.25,0.75,1.0,518,703,https://www.flickr.com/photos/ben_salter/28400865306,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/\n5e18d65c2e4175d4,https://c1.staticflickr.com/1/404/31651307103_e78e74a17d_o.jpg,0.5,0.25,1.0,1.0,875,1000,https://www.flickr.com/photos/didbygraham/31651307103,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n51fd398284ce6523,https://c1.staticflickr.com/9/8673/28077722833_fe82806df9_o.jpg,0.0,0.25,0.5,1.0,982,634,https://www.flickr.com/photos/usembassytokyo/28077722833,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tokyo,https://www.flickr.com/people/usembassytokyo/\nab37fcb40fbd9661,https://c1.staticflickr.com/8/7768/27120250072_f91393db94_o.jpg,0.304763843648,0.0,0.914291530945,0.75,254,921,https://www.flickr.com/photos/70253321@N00/27120250072,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/\n1422b69d5aeb4fef,https://c1.staticflickr.com/8/7515/27446869975_5162fa4871_o.jpg,0.5,0.0,1.0,0.75,854,814,https://www.flickr.com/photos/boblinsdell/27446869975,https://creativecommons.org/licenses/by/2.0/,Robert Linsdell,https://www.flickr.com/people/boblinsdell/\nf345951b2d143381,https://c1.staticflickr.com/6/5648/30450489713_02f33ddc47_o.jpg,0.421177266576,0.0,0.842354533153,0.75,672,248,https://flickr.com/67338640@N04/30450489713,https://creativecommons.org/licenses/by/2.0/,Billy Meinke,https://www.flickr.com/people/67338640@N04/\n8c191e8a556be591,https://c1.staticflickr.com/8/7699/26262891823_27730e2a4e_o.jpg,0.28125,0.25,0.84375,1.0,548,973,https://www.flickr.com/photos/shankaronline/26262891823,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nb442981d75e8827c,https://c1.staticflickr.com/9/8552/29484516382_34ea047795_o.jpg,0.0,0.25,0.5,1.0,826,543,https://www.flickr.com/photos/mypubliclands/29484516382,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\ned42252ca0c0fca5,https://c1.staticflickr.com/9/8882/29637622941_a0525ba07e_o.jpg,0.0,0.0,1.0,0.666666666667,542,439,https://www.flickr.com/photos/fifeanddrum/29637622941/,https://creativecommons.org/licenses/by/2.0/,U. S. Army Old Guard Fife and Drum Corps,https://www.flickr.com/people/fifeanddrum/\n96b491f175b8cf59,https://c1.staticflickr.com/8/7461/27116998031_2a6938ac23_o.jpg,0.28125,0.0,0.84375,0.75,780,346,https://www.flickr.com/photos/thoseguys119/27116998031,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n1bdc84d77ef6eeb4,https://c1.staticflickr.com/9/8666/28872550855_8e61387f71_o.jpg,0.0,0.0,0.75,1.0,947,946,https://www.flickr.com/photos/herry/28872550855/,https://creativecommons.org/licenses/by/2.0/,Herry Lawford,https://www.flickr.com/people/herry/\n6d04a7f9909af6f9,https://c1.staticflickr.com/8/7236/27249387145_d98251094c_o.jpg,0.0,0.0,0.590144230769,0.75,672,812,https://www.flickr.com/photos/glorycycles/27249387145,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n8ade41da3cce419e,https://c1.staticflickr.com/8/7356/28058022675_1b60877b5f_o.jpg,0.0,0.0,0.75,0.5,890,532,https://www.flickr.com/photos/harpgirl207/28058022675,https://creativecommons.org/licenses/by/2.0/,Daryne Rockett,https://www.flickr.com/people/harpgirl207/\n92e1e5bc406bc176,https://c1.staticflickr.com/6/5542/31132614095_a8beb6ea92_o.jpg,0.0,0.0,0.483695652174,0.75,822,119,https://www.flickr.com/photos/13476480@N07/31132614095,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n6c80a0c05a8801cb,https://c1.staticflickr.com/8/7760/26976115054_df1363f4b8_o.jpg,0.224162011173,0.25,0.67248603352,1.0,294,377,https://www.flickr.com/photos/dkeats/26976115054,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\nbd7e87b9dd13f030,https://c1.staticflickr.com/9/8612/28274676694_1840f44362_o.jpg,0.25,0.28125,1.0,0.84375,526,510,https://www.flickr.com/photos/usfwsnortheast/28274676694,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Northeast Region,https://www.flickr.com/people/usfwsnortheast/\n08bf33bd0196b604,https://c1.staticflickr.com/9/8363/28483507140_8a98e2f2f4_o.jpg,0.0,0.0,0.75,0.75,922,741,https://www.flickr.com/photos/blmurch/28483507140,https://creativecommons.org/licenses/by/2.0/,Beatrice Murch,https://www.flickr.com/people/blmurch/\n95611cfe1e1e783d,https://c1.staticflickr.com/6/5706/30330860025_207ac529f1_o.jpg,0.0,0.0,0.5,0.75,302,793,https://www.flickr.com/photos/133415851@N08/30330860025,https://creativecommons.org/licenses/by/2.0/,Federico Ettlin,https://www.flickr.com/people/ettlin/\n5dc0418b00b6801a,https://c1.staticflickr.com/8/7519/26825284972_26239c59fa_o.jpg,0.421177266576,0.0,0.842354533153,0.75,605,272,https://www.flickr.com/photos/serdal/26825284972,https://creativecommons.org/licenses/by/2.0/,Abdulla Al Muhairi,https://www.flickr.com/people/serdal/\n250a4e78694d57b2,https://c1.staticflickr.com/8/7412/27882769711_d05842dbe1_o.jpg,0.0,0.0,0.75,1.0,114,824,https://www.flickr.com/photos/eddiesfisheriesfws/27882769711/,https://creativecommons.org/licenses/by/2.0/,USFWS Fish and Aquatic Conservation,https://www.flickr.com/people/eddiesfisheriesfws/\n28e7a2f7b78f10d4,https://c1.staticflickr.com/8/7283/28045851021_f26efcff08_o.jpg,0.486899563319,0.25,0.973799126638,1.0,323,764,https://www.flickr.com/photos/postmanpetecoluk/28045851021,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\n8271f93f3e75a983,https://c1.staticflickr.com/9/8073/29101100124_3ddd63b029_o.jpg,0.25,0.0,0.75,0.75,821,860,https://www.flickr.com/photos/60900612@N08/29101100124,https://creativecommons.org/licenses/by/2.0/,Thomas&#x27;s Pics,https://www.flickr.com/people/60900612@N08/\n864681a079ae9c4a,https://c1.staticflickr.com/4/3665/33401371052_8da279ae97_o.jpg,0.299878836834,0.25,0.899636510501,1.0,747,658,https://flickr.com/98147195@N00/33401371052,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/\n4e4629ba89c48e20,https://c1.staticflickr.com/8/7582/26861699723_58905c7e5c_o.jpg,0.5,0.25,1.0,1.0,348,377,https://www.flickr.com/photos/16725630@N00/26861699723/,https://creativecommons.org/licenses/by/2.0/,Matt Zimmerman,https://www.flickr.com/people/16725630@N00/\n7bf8a73c6a3e6f6e,https://c1.staticflickr.com/9/8553/29469226676_795a7000dc_o.jpg,0.0,0.0,0.666666666667,1.0,848,718,https://www.flickr.com/photos/13476480@N07/29469226676,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nc9f6ade8fe7e47da,https://c1.staticflickr.com/8/7744/29895497901_2e3722e850_o.jpg,0.0,0.25,0.499263622975,1.0,875,111,https://www.flickr.com/photos/brisbanecitycouncil/29895497901,https://creativecommons.org/licenses/by/2.0/,Brisbane City Council,https://www.flickr.com/people/brisbanecitycouncil/\n71661c85a5364f1c,https://c1.staticflickr.com/1/494/31278219683_25d9d5be39_o.jpg,0.0,0.4375,0.75,1.0,874,886,http://www.flickr.com/photos/mmmavocado/31278219683/,https://creativecommons.org/licenses/by/2.0/,Malcolm Manners,https://www.flickr.com/people/mmmavocado/\n02d6357b81a19f7a,https://c1.staticflickr.com/1/520/31587792501_0db6a658f5_o.jpg,0.0,0.0,0.5,0.75,208,224,http://www.flickr.com/photos/25168691@N06/31587792501/,https://creativecommons.org/licenses/by/2.0/,Franco Vannini,https://www.flickr.com/people/25168691@N06/\nbdb3ac2bcadc18b7,https://c1.staticflickr.com/9/8084/29090403712_05914cf758_o.jpg,0.28125,0.25,0.84375,1.0,884,728,https://flickr.com/127226743@N02/29090403712,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n561bd73158765c4c,https://c1.staticflickr.com/1/492/31637173050_c5bd237641_o.jpg,0.273726851852,0.0,0.821180555556,0.75,866,843,https://www.flickr.com/photos/79157069@N03/31637173050/,https://creativecommons.org/licenses/by/2.0/,Matthew Paul  Argall,https://www.flickr.com/people/79157069@N03/\n17117816e00663b1,https://c1.staticflickr.com/9/8701/29178739824_bc403d6d19_o.jpg,0.25,0.25,0.75,1.0,548,977,https://www.flickr.com/photos/136315829@N03/29178739824,https://creativecommons.org/licenses/by/2.0/,Steven Penton,https://www.flickr.com/people/136315829@N03/\ne92cb3a7a3e7acd1,https://c1.staticflickr.com/9/8017/27795197394_009b984478_o.jpg,0.0,0.0,0.715608465608,0.75,426,865,https://www.flickr.com/photos/grassrootsgroundswell/27795197394,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/\n9c299f3d9437b395,https://c1.staticflickr.com/8/7509/29632773266_e12418eb3a_o.jpg,0.0,0.25,0.5,1.0,561,315,https://www.flickr.com/photos/jill_carlson/29632773266/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\nf94f7c692f320d53,https://c1.staticflickr.com/9/8123/28807487474_9549d0fa65_o.jpg,0.0,0.25,0.5,1.0,959,438,https://www.flickr.com/photos/glenbowman/28807487474/,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/\n3b8c55210036a111,https://c1.staticflickr.com/9/8362/28773653415_e9cf008826_o.jpg,0.5,0.0,1.0,0.75,976,820,https://www.flickr.com/photos/mypubliclands/28773653415,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\nb609ddb87e56efb9,https://c1.staticflickr.com/8/7718/27117514014_5b261bfa7f_o.jpg,0.0,0.0,0.669128508124,1.0,699,779,https://www.flickr.com/photos/jorge-11/27117514014,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/\n8c71fe2036787ecc,https://c1.staticflickr.com/1/564/31865098294_d4c342acdf_o.jpg,0.625956632653,0.25,1.0,1.0,980,803,https://www.flickr.com/photos/mpaulmd/31865098294,https://creativecommons.org/licenses/by/2.0/,\"See1,Do1,Teach1\",https://www.flickr.com/people/mpaulmd/\n69f7ca8a56bd02e1,https://c1.staticflickr.com/8/7663/28148115113_ea0dc499b8_o.jpg,0.333333333333,0.0,1.0,1.0,519,346,https://www.flickr.com/photos/janitors/28148115113,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n34cd73dae4d33894,https://c1.staticflickr.com/3/2459/32645460182_e6eb087e6c_o.jpg,0.0,0.25,0.496696035242,1.0,20,237,https://www.flickr.com/photos/sybarite48/32645460182/,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n2d344176720d5113,https://c1.staticflickr.com/8/7313/27988711545_7e27d7c595_o.jpg,0.0,0.0,0.5,0.75,978,337,https://www.flickr.com/photos/mypubliclands/27988711545,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\nd70af0d8b15c9049,https://c1.staticflickr.com/1/294/32050275290_1eaa9383d1_o.jpg,0.25,0.0,1.0,0.75,976,508,https://www.flickr.com/photos/neilconway/32050275290/,https://creativecommons.org/licenses/by/2.0/,Neil Conway,https://www.flickr.com/people/neilconway/\nd92cfc146d9b3c62,https://c1.staticflickr.com/6/5775/31360565036_d17521125d_o.jpg,0.25,0.0,1.0,0.75,437,698,https://www.flickr.com/photos/vitofun/31360565036/,https://creativecommons.org/licenses/by/2.0/,Vito  Fun,https://www.flickr.com/people/vitofun/\nf493729343334619,https://c1.staticflickr.com/1/686/32630596735_7d75386fb3_o.jpg,0.25,0.256744604317,1.0,1.0,495,753,https://www.flickr.com/photos/pagedooley/32630596735,https://creativecommons.org/licenses/by/2.0/,Kevin Dooley,https://www.flickr.com/people/pagedooley/\n5ae100fdc51dfe53,https://c1.staticflickr.com/6/5603/31637845721_3fb25b5706_o.jpg,0.0,0.312283737024,0.75,1.0,746,454,https://www.flickr.com/photos/lge/31637845721,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n43ce20ed448debc8,https://c1.staticflickr.com/8/7493/26553609544_b032bfc9ed_o.jpg,0.299878836834,0.0,0.899636510501,0.75,882,370,https://www.flickr.com/photos/david_martin_foto/26553609544/,https://creativecommons.org/licenses/by/2.0/,David D,https://www.flickr.com/people/david_martin_foto/\n78ee388a64d86450,https://c1.staticflickr.com/8/7494/27158530492_fc78b95948_o.jpg,0.715833333333,0.0,1.0,0.75,780,148,https://www.flickr.com/photos/thoseguys119/27158530492,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\naecd74be9b2a3c11,https://c1.staticflickr.com/9/8636/28613835790_8156d52767_o.jpg,0.423259493671,0.0,1.0,0.75,135,255,https://www.flickr.com/photos/usfwsmtnprairie/28613835790,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n3590bef0978e22f6,https://c1.staticflickr.com/9/8337/29586455466_c3868fdb73_o.jpg,0.4375,0.0,1.0,0.75,455,865,https://www.flickr.com/photos/boscdanjou/29586455466/,https://creativecommons.org/licenses/by/2.0/,Bosc d&#x27;Anjou,https://www.flickr.com/people/boscdanjou/\nab7359c299f91d54,https://c1.staticflickr.com/1/298/31600597854_21ebc4bf7c_o.jpg,0.28125,0.25,0.84375,1.0,512,586,https://www.flickr.com/photos/27665395@N05/31600597854,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n2ef4afb5b9e236ce,https://c1.staticflickr.com/1/553/32609352821_93a1c4f1aa_o.jpg,0.0,0.0,0.5,0.75,980,705,https://flickr.com/133461395@N08/32609352821,https://creativecommons.org/licenses/by/2.0/,ian_woodhead1,https://www.flickr.com/people/133461395@N08/\n5c89f0eb592da419,https://c1.staticflickr.com/9/8328/28662281513_46751c45cc_o.jpg,0.0,0.25,0.75,1.0,93,797,https://www.flickr.com/photos/andymorffew/28662281513,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\n5e9bf4a72dc082d6,https://c1.staticflickr.com/1/683/32251942630_39f9bb533e_o.jpg,0.0,0.25,0.5625,1.0,469,314,https://www.flickr.com/photos/27665395@N05/32251942630,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n5e88f291092f01f2,https://c1.staticflickr.com/6/5453/30610573186_e81d93777d_o.jpg,0.23377318117,0.25,0.701319543509,1.0,120,622,https://www.flickr.com/photos/puliarfanita/30610573186,https://creativecommons.org/licenses/by/2.0/,Anita Ritenour,https://www.flickr.com/people/puliarfanita/\n32c431261eb28350,https://c1.staticflickr.com/6/5493/30963439266_1acac78138_o.jpg,0.222705146036,0.0,0.668115438108,0.75,604,259,https://www.flickr.com/photos/13476480@N07/30963439266,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\ndf0223e48056caf1,https://c1.staticflickr.com/3/2576/32913772002_c43a2d28fc_o.jpg,0.0,0.0,1.0,1.0,971,398,http://www.flickr.com/photos/chreegou/32913772002/,https://creativecommons.org/licenses/by/2.0/,Christian Scheidegger,https://www.flickr.com/people/chreegou/\n094024fbdaa5e05d,https://c1.staticflickr.com/9/8790/27693088764_0a78f351f8_o.jpg,0.5,0.25,1.0,1.0,896,484,https://www.flickr.com/photos/ronmacphotos/27693088764,https://creativecommons.org/licenses/by/2.0/,Ronnie Macdonald,https://www.flickr.com/people/ronmacphotos/\n8aacd37898e16d74,https://c1.staticflickr.com/9/8420/29516799382_31e27a091d_o.jpg,0.5,0.0,1.0,0.75,986,491,https://www.flickr.com/photos/aldenchadwick/29516799382,https://creativecommons.org/licenses/by/2.0/,Alden Chadwick,https://www.flickr.com/people/aldenchadwick/\nee80eba791d1f3e5,https://c1.staticflickr.com/8/7268/27444227902_12c1235f69_o.jpg,0.0,0.25,0.496696035242,1.0,976,658,https://www.flickr.com/photos/sybarite48/27444227902,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nd82621c4f54a5692,https://c1.staticflickr.com/9/8149/28649039143_4ab9d19f1f_o.jpg,0.25,0.282719435737,1.0,0.84815830721,407,592,https://www.flickr.com/photos/eltb/28649039143,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nc1405ddda82f64a0,https://c1.staticflickr.com/8/7029/26676407780_55d7898ec3_o.jpg,0.5,0.25,1.0,1.0,848,203,https://www.flickr.com/photos/7armyjmtc/26676407780/,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n42d97cc2d5f30194,https://c1.staticflickr.com/6/5577/31090918090_48b4824988_o.jpg,0.28125,0.25,0.84375,1.0,897,746,https://www.flickr.com/photos/49078795@N07/31090918090,https://creativecommons.org/licenses/by/2.0/,DuPont Surfaces,https://www.flickr.com/people/49078795@N07/\nbffd8d313c3ddf01,https://c1.staticflickr.com/8/7513/27217563956_5d56ed383c_o.jpg,0.28125,0.0,0.84375,0.75,404,203,https://www.flickr.com/photos/apreche/27217563956,https://creativecommons.org/licenses/by/2.0/,Scott Rubin,https://www.flickr.com/people/apreche/\na25d6d151c52f190,https://c1.staticflickr.com/9/8881/28332021542_0462976846_o.jpg,0.4375,0.25,1.0,1.0,975,854,https://www.flickr.com/photos/jsjgeology/28332021542,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n3ec9ee64f4139b22,https://c1.staticflickr.com/9/8265/29109707465_ea591e45ec_o.jpg,0.0,0.0,0.75,0.565438871473,407,519,https://www.flickr.com/photos/eltb/29109707465,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n2f989dacfb8917ac,https://c1.staticflickr.com/9/8155/29380286205_5828d944af_o.jpg,0.0,0.25,0.5625,1.0,676,788,https://www.flickr.com/photos/27665395@N05/29380286205,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n81d98abfe5f68239,https://c1.staticflickr.com/6/5587/30880863674_02082fa52b_o.jpg,0.0,0.0,0.564263322884,0.75,580,571,https://www.flickr.com/photos/eebeephoto/30880863674/,https://creativecommons.org/licenses/by/2.0/,Ed Berger,https://www.flickr.com/people/eebeephoto/\n3a790519df1cf445,https://c1.staticflickr.com/8/7424/27170809691_0b0d4714f6_o.jpg,0.252730109204,0.0,1.0,1.0,484,801,https://www.flickr.com/photos/andreboeni/27170809691,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n783baac4919dbfdc,https://c1.staticflickr.com/9/8599/28246501132_7cf85a6595_o.jpg,0.0,0.0,0.75,0.494868035191,472,469,https://www.flickr.com/photos/mypubliclands/28246501132,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n222d963ec296ba85,https://c1.staticflickr.com/8/7403/27002667152_9c61e1534a_o.jpg,0.412939297125,0.25,1.0,1.0,982,715,https://www.flickr.com/photos/royluck/27002667152,https://creativecommons.org/licenses/by/2.0/,Roy Luck,https://www.flickr.com/people/royluck/\n6ead8e7bdc86de20,https://c1.staticflickr.com/1/387/31542908683_3487752baa_o.jpg,0.0,0.0,0.666666666667,1.0,861,231,https://www.flickr.com/photos/sebaso/31542908683,https://creativecommons.org/licenses/by/2.0/,sebaso,https://www.flickr.com/people/sebaso/\n1b2127870b62dae3,https://c1.staticflickr.com/8/7402/26753003614_915daa1311_o.jpg,0.0,0.25,0.5,1.0,780,437,https://www.flickr.com/photos/ufv/26753003614/,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/\nb4732f355fd2b5b3,https://c1.staticflickr.com/6/5552/29844074114_5f71079779_o.jpg,0.0,0.0,0.448324022346,0.75,848,3,https://www.flickr.com/photos/ministreiodadefesa/29844074114,https://creativecommons.org/licenses/by/2.0/,Minist\\303\\251rio da Defesa,https://www.flickr.com/people/ministreiodadefesa/\n597b8ad18ff252c6,https://c1.staticflickr.com/8/7312/27533218336_7071e03e77_o.jpg,0.2946,0.0,0.8838,0.75,653,780,https://flickr.com/50426192@N04/27533218336,https://creativecommons.org/licenses/by/2.0/,Virginia Department of Education,https://www.flickr.com/people/vdoe/\naf5a6a757ef0acb0,https://c1.staticflickr.com/8/7554/29850590502_994f4b8eff_o.jpg,0.0,0.0,0.666666666667,1.0,629,591,https://www.flickr.com/photos/aotaro/29850590502,https://creativecommons.org/licenses/by/2.0/,aotaro,https://www.flickr.com/people/aotaro/\n32b9a80dc976a368,https://c1.staticflickr.com/6/5487/29928209424_3ce2eafbd5_o.jpg,0.28125,0.0,0.84375,0.75,808,679,https://www.flickr.com/photos/usdagov/29928209424,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\nce8a7701855a2561,https://c1.staticflickr.com/6/5830/30675470066_5090bdbe8e_o.jpg,0.0,0.25,0.5625,1.0,985,667,https://www.flickr.com/photos/usdagov/30675470066,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n7d4a6a1713f78894,https://c1.staticflickr.com/8/7535/27149507485_4c871ddf91_o.jpg,0.497411242604,0.25,1.0,1.0,404,418,https://www.flickr.com/photos/13476480@N07/27149507485,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nbc1abd715b444c62,https://c1.staticflickr.com/8/7648/27055435895_8f7bae2717_o.jpg,0.25,0.281690140845,1.0,0.845070422535,840,230,https://www.flickr.com/photos/tobiasberchtold/27055435895/,https://creativecommons.org/licenses/by/2.0/,Tobias Berchtold,https://www.flickr.com/people/tobiasberchtold/\nbd54ec9eb8d55c34,https://c1.staticflickr.com/8/7449/26946510591_e12b6ddc98_o.jpg,0.0,0.0,0.75,1.0,699,620,https://www.flickr.com/photos/ewolivera/26946510591,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/\naedf6b0e9499dcb4,https://c1.staticflickr.com/8/7474/27946937835_713e1c3320_o.jpg,0.0,0.25,0.75,0.75,709,92,https://www.flickr.com/photos/dalbera/27946937835,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n7be6cc04e2a38ce2,https://c1.staticflickr.com/8/7289/27515222750_8316d647fc_o.jpg,0.25,0.440717628705,1.0,1.0,806,489,https://www.flickr.com/photos/usarjnco/27515222750,https://creativecommons.org/licenses/by/2.0/,USARJ NCO CORPS,https://www.flickr.com/people/usarjnco/\nb5350cf7e4c962d3,https://c1.staticflickr.com/1/673/30712941753_223bb49917_o.jpg,0.0,0.0,0.5625,0.75,975,830,https://www.flickr.com/photos/jsjgeology/30712941753,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n0084cdbc80386c03,https://c1.staticflickr.com/9/8745/28860515581_0dab76f3e6_o.jpg,0.333333333333,0.0,1.0,1.0,484,393,https://www.flickr.com/photos/quinet/28860515581,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\naf33866cff2fdc18,https://c1.staticflickr.com/8/7286/27148267714_98d7c58198_o.jpg,0.0,0.0,0.905498281787,1.0,332,201,https://www.flickr.com/photos/jkirkhart35/27148267714,https://creativecommons.org/licenses/by/2.0/,Jerry Kirkhart,https://www.flickr.com/people/jkirkhart35/\ncfa458167126a6a4,https://c1.staticflickr.com/1/469/32123669275_3e405a4513_o.jpg,0.32332761578,0.0,1.0,0.75,310,21,https://www.flickr.com/photos/gails_pictures/32123669275,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n2fa68f7af7259361,https://c1.staticflickr.com/8/7422/27545136195_91ae4899be_o.jpg,0.457373271889,0.0,1.0,0.75,672,910,https://www.flickr.com/photos/glorycycles/27545136195,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\ne36d0d9b34bb6f58,https://c1.staticflickr.com/6/5685/30728334372_3cb8615582_o.jpg,0.48007518797,0.25,1.0,1.0,702,761,https://www.flickr.com/photos/armymaterielcommand/30728334372/,https://creativecommons.org/licenses/by/2.0/,U.S. Army Materiel Command,https://www.flickr.com/people/armymaterielcommand/\nc956f208fde26a4b,https://c1.staticflickr.com/9/8470/29116487944_daff479690_o.jpg,0.5,0.25,1.0,1.0,920,853,https://www.flickr.com/photos/o_0/29116487944,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\na0d4ee1135a5d361,https://c1.staticflickr.com/8/7784/26725162231_179f2de2de_o.jpg,0.4375,0.25,1.0,1.0,526,620,https://www.flickr.com/photos/kbl_luccia/26725162231,https://creativecommons.org/licenses/by/2.0/,\"K.B.L. Luccia Por ahora , descanso\",https://www.flickr.com/people/kbl_luccia/\n45a86dc3bd654366,https://c1.staticflickr.com/9/8536/29090279983_df67de66d3_o.jpg,0.0,0.0,0.75,0.713028169014,443,816,https://www.flickr.com/photos/michaelpollak/29090279983/,https://creativecommons.org/licenses/by/2.0/,Michael Pollak,https://www.flickr.com/people/michaelpollak/\nce9b28872b72e44d,https://c1.staticflickr.com/6/5649/30724838251_1f5f420165_o.jpg,0.333333333333,0.0,1.0,1.0,978,840,https://flickr.com/117403948@N03/30724838251,https://creativecommons.org/licenses/by/2.0/,Mark Vincent Aposaga,https://www.flickr.com/people/117403948@N03/\nbc7267914a88b740,https://c1.staticflickr.com/8/7797/26929964411_4c8f7681b4_o.jpg,0.0,0.333333333333,1.0,1.0,573,728,https://www.flickr.com/photos/tbasilio/26929964411,https://creativecommons.org/licenses/by/2.0/,Tony Basilio,https://www.flickr.com/people/tbasilio/\n784f42c90503b81f,https://c1.staticflickr.com/1/512/32488273901_aa3f40f976_o.jpg,0.0,0.0,0.75,1.0,735,90,https://www.flickr.com/photos/27665395@N05/32488273901,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\ne47838725351d9a2,https://c1.staticflickr.com/9/8052/29253715734_b15bf78fb9_o.jpg,0.0,0.0,0.531155015198,0.75,780,247,https://www.flickr.com/photos/thoseguys119/29253715734/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nd0eec007b7373a0d,https://c1.staticflickr.com/6/5664/30892480826_62bc9643eb_o.jpg,0.43661971831,0.25,1.0,1.0,980,352,https://www.flickr.com/photos/blmoregon/30892480826/,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\nbf97225b5998fde6,https://c1.staticflickr.com/9/8386/29773943985_5408330c2d_o.jpg,0.25,0.0,0.75,0.75,704,903,https://flickr.com/144204694@N04/29773943985,https://creativecommons.org/licenses/by/2.0/,philippe cotin,https://www.flickr.com/people/formes_et_couleurs/\n854ddb294e1fe61e,https://c1.staticflickr.com/9/8748/28421948532_2104108b9b_o.jpg,0.25,0.0,1.0,0.75,938,787,https://www.flickr.com/photos/joyosity/28421948532,https://creativecommons.org/licenses/by/2.0/,Joy,https://www.flickr.com/people/joyosity/\n1ca91b9d12409cea,https://c1.staticflickr.com/8/7096/27292799692_35257eafdb_o.jpg,0.210588633288,0.0,0.631765899865,0.75,979,82,https://www.flickr.com/photos/ankurp/27292799692,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\nebb320416ed271b1,https://c1.staticflickr.com/1/408/32296767052_f1f4d9b7e8_o.jpg,0.249631811487,0.25,0.748895434462,1.0,407,635,https://www.flickr.com/photos/martius/32296767052,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\n7e868e34d22a1583,https://c1.staticflickr.com/8/7570/27597944483_8bb0edbe7b_o.jpg,0.25,0.25,0.75,1.0,699,456,https://www.flickr.com/photos/99092496@N00/27597944483,https://creativecommons.org/licenses/by/2.0/,Klim Levene,https://www.flickr.com/people/99092496@N00/\n3978244b78c9b4f1,https://c1.staticflickr.com/9/8679/29181962833_df1d5fb7e1_o.jpg,0.450540958269,0.25,1.0,1.0,426,522,https://www.flickr.com/photos/cmichel67/29181962833,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/\n68b005dd7d18b431,https://c1.staticflickr.com/9/8622/28555897732_129b6345ca_o.jpg,0.257009345794,0.0,1.0,1.0,326,179,https://www.flickr.com/photos/52450054@N04/28555897732/,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\nbff44e5ba0d28c5d,https://c1.staticflickr.com/8/7104/27011000256_314a201760_o.jpg,0.0,0.25,0.5625,1.0,407,465,https://www.flickr.com/photos/davidstanleytravel/27011000256,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\nbbb5cd17bb4eacc7,https://c1.staticflickr.com/1/758/30909330293_3fdf8f4377_o.jpg,0.421177266576,0.0,0.842354533153,0.75,974,784,https://flickr.com/149503105@N07/30909330293,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/\n269c7e4cf57800d5,https://c1.staticflickr.com/9/8556/29560871171_15a7c3a682_o.jpg,0.0,0.25,0.5625,1.0,921,757,https://www.flickr.com/photos/raver_mikey/29560871171,https://creativecommons.org/licenses/by/2.0/,Mikey,https://www.flickr.com/people/raver_mikey/\n6c382691bec0c10b,https://c1.staticflickr.com/9/8607/27627123353_044805c3af_o.jpg,0.258620689655,0.0,0.775862068966,0.75,22,40,https://www.flickr.com/photos/wildreturn/27627123353,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\nd56b5a8c1cd4ee6d,https://c1.staticflickr.com/9/8382/28818021894_170010d050_o.jpg,0.0,0.0,0.75,1.0,972,627,https://www.flickr.com/photos/shakespearesmonkey/28818021894,https://creativecommons.org/licenses/by/2.0/,Shakespearesmonkey,https://www.flickr.com/people/shakespearesmonkey/\ne189d252b8295754,https://c1.staticflickr.com/8/7608/26894381016_e9471f8f16_o.jpg,0.25,0.0,1.0,1.0,968,678,https://flickr.com/68147320@N02/26894381016,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\n31e7031fe880f995,https://c1.staticflickr.com/6/5590/30642795614_5d4bf71828_o.jpg,0.0,0.25,0.5,1.0,629,673,https://www.flickr.com/photos/prayitnophotography/30642795614,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\n2e6aabd0b8acd7c6,https://c1.staticflickr.com/8/7595/29019426706_3764803aaf_o.jpg,0.0,0.25,0.75,0.75,893,894,https://www.flickr.com/photos/zigazou76/29019426706,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\ncade077e78573e42,https://c1.staticflickr.com/9/8197/29680463372_e8760d231b_o.jpg,0.0,0.25,0.568396226415,1.0,470,504,https://www.flickr.com/photos/eoskins/29680463372,https://creativecommons.org/licenses/by/2.0/,Plum leaves,https://www.flickr.com/people/eoskins/\ndb3bf7e96f0b20fc,https://c1.staticflickr.com/8/7284/26595264580_925e393f40_o.jpg,0.0,0.0,0.561569688769,1.0,148,526,https://www.flickr.com/photos/vilipix/26595264580/,https://creativecommons.org/licenses/by/2.0/,Vilmos Vincze,https://www.flickr.com/people/vilipix/\n9643e0538c34d55c,https://c1.staticflickr.com/1/467/32192657610_27068e1bc1_o.jpg,0.363112391931,0.0,1.0,1.0,885,710,https://www.flickr.com/photos/fusion_of_horizons/32192657610,https://creativecommons.org/licenses/by/2.0/,fusion-of-horizons,https://www.flickr.com/people/fusion_of_horizons/\n3ad380edbfa892ea,https://c1.staticflickr.com/1/331/32977613111_dbf6e52412_o.jpg,0.0,0.0,0.5,0.75,418,41,https://www.flickr.com/photos/linvoyage/32977613111,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/\nb73beefdcd290af3,https://c1.staticflickr.com/8/7222/27823356811_5b3f8ea528_o.jpg,0.248348017621,0.0,0.745044052863,0.75,108,745,https://flickr.com/77742560@N06/27823356811,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n2b8aeb7eaf1efe31,https://c1.staticflickr.com/8/7574/27209556370_cdc99ae9fa_o.jpg,0.5,0.25,1.0,1.0,76,91,https://www.flickr.com/photos/dhobern/27209556370/,https://creativecommons.org/licenses/by/2.0/,Donald Hobern,https://www.flickr.com/people/dhobern/\n69eeb6a30ecc6b1f,https://c1.staticflickr.com/9/8025/29024257203_a8535c7d6b_o.jpg,0.4375,0.25,1.0,1.0,997,339,https://www.flickr.com/photos/jsjgeology/29024257203,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n7e881033e1b234cc,https://c1.staticflickr.com/8/7380/27419259762_5033e066d0_o.jpg,0.0,0.0,0.5,0.75,924,644,https://www.flickr.com/photos/janitors/27419259762,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\nbe9aaa2b5a32fe9b,https://c1.staticflickr.com/8/7657/27077246962_874156feaa_o.jpg,0.463423295455,0.0,0.926846590909,0.75,405,374,https://www.flickr.com/photos/oatsy40/27077246962,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/\n3f383b3561775231,https://c1.staticflickr.com/1/246/31613056515_379da189b8_o.jpg,0.28125,0.25,0.84375,1.0,780,102,https://www.flickr.com/photos/thoseguys119/31613056515,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n792b6efd553dd3cf,https://c1.staticflickr.com/9/8612/28549507635_7f05a3caa9_o.jpg,0.0,0.25,0.540644171779,1.0,975,825,https://www.flickr.com/photos/jsjgeology/28549507635,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ndf852fb48bede2a9,https://c1.staticflickr.com/9/8256/28427788693_4829da65b0_o.jpg,0.4375,0.25,1.0,1.0,966,647,https://www.flickr.com/photos/jeepersmedia/28427788693/,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n6fcac250af31685f,https://c1.staticflickr.com/9/8276/29694691923_53aa715999_o.jpg,0.377884615385,0.0,0.755769230769,0.75,780,139,https://www.flickr.com/photos/thoseguys119/29694691923/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n575824ceabc98bcd,https://c1.staticflickr.com/9/8546/29953219172_1e90d7f9ff_o.jpg,0.478354978355,0.0,0.95670995671,0.75,426,778,https://www.flickr.com/photos/60712129@N06/29953219172,https://creativecommons.org/licenses/by/2.0/,Dianne Lacourciere,https://www.flickr.com/people/60712129@N06/\n3b463373122c996a,https://c1.staticflickr.com/8/7169/27156803215_e35c790ece_o.jpg,0.25,0.0,1.0,1.0,780,504,https://www.flickr.com/photos/thoseguys119/27156803215,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n88df9e5e1ae459a7,https://c1.staticflickr.com/9/8117/29057355155_5e09753a15_o.jpg,0.0,0.0,0.75,1.0,548,512,https://www.flickr.com/photos/davidwilson1949/29057355155,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n0de2cadaaa0de6ef,https://c1.staticflickr.com/8/7506/26957596576_dfd67e64d0_o.jpg,0.248348017621,0.25,0.745044052863,1.0,484,465,https://www.flickr.com/photos/sybarite48/26957596576,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nc6b127ac8de0db8d,https://c1.staticflickr.com/9/8402/29652822520_fd1f223e3b_o.jpg,0.0,0.25,0.5,1.0,719,513,https://www.flickr.com/photos/97408942@N04/29652822520,https://creativecommons.org/licenses/by/2.0/,Chetiya Sahabandu,https://www.flickr.com/people/97408942@N04/\na55936fa9c0aa228,https://c1.staticflickr.com/1/608/32002428345_d2c10254af_o.jpg,0.0,0.4375,0.75,1.0,498,240,https://www.flickr.com/photos/faceme/32002428345,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/\n55ef6e4f15698ca5,https://c1.staticflickr.com/9/8253/29194771176_f625f0b3f2_o.jpg,0.5,0.0,1.0,0.75,405,394,https://www.flickr.com/photos/markyharky/29194771176,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n5f10b5aa2522e092,https://c1.staticflickr.com/6/5510/30834692845_90e189de3c_o.jpg,0.25,0.25,1.0,1.0,980,894,https://www.flickr.com/photos/18614695@N00/30834692845,https://creativecommons.org/licenses/by/2.0/,Xavi,https://www.flickr.com/people/18614695@N00/\n0ba4d274b2d60b12,https://c1.staticflickr.com/6/5821/30118810995_41d8a59440_o.jpg,0.25,0.0,1.0,1.0,780,385,https://www.flickr.com/photos/thoseguys119/30118810995,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n440965de463fd5db,https://c1.staticflickr.com/6/5562/30007181413_5d01e67cba_o.jpg,0.0,0.0,0.501846381093,0.75,920,506,https://www.flickr.com/photos/79157069@N03/30007181413/,https://creativecommons.org/licenses/by/2.0/,Matthew Paul  Argall,https://www.flickr.com/people/79157069@N03/\nbccfb9266ed73fef,https://c1.staticflickr.com/9/8365/29300785871_52772251c8_o.jpg,0.0,0.0,0.666666666667,1.0,625,880,https://www.flickr.com/photos/ter-burg/29300785871,https://creativecommons.org/licenses/by/2.0/,Sebastiaan ter Burg,https://www.flickr.com/people/ter-burg/\nbc9a92929bf09b9b,https://c1.staticflickr.com/1/731/31890720530_6bb72da71f_o.jpg,0.0,0.25,0.658629441624,1.0,311,49,https://www.flickr.com/photos/gails_pictures/31890720530,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\ndfbd74d60056bae0,https://c1.staticflickr.com/8/7433/27009450954_092df2cf42_o.jpg,0.0,0.0,0.496696035242,0.75,950,654,https://www.flickr.com/photos/theocrazzolara/27009450954,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/\n777c15a9f1bb7a0a,https://c1.staticflickr.com/9/8873/27986366240_408635acb0_o.jpg,0.210588633288,0.0,0.631765899865,0.75,706,149,https://www.flickr.com/photos/psd/27986366240,https://creativecommons.org/licenses/by/2.0/,Paul Downey,https://www.flickr.com/people/psd/\n26b01f31089459d0,https://c1.staticflickr.com/9/8128/28683417152_4f2fc6f7e3_o.jpg,0.0,0.25,0.360902255639,1.0,980,499,https://www.flickr.com/photos/vastateparksstaff/28683417152/in/photolist-cyLTp3-KGE1B3-JVmZPY-KGDG1A-JVmFTh-JVBa2X-JVmEG9-KK7WzD,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n53856a8157b05f90,https://c1.staticflickr.com/8/7533/29405687984_945f6ba351_o.jpg,0.333333333333,0.0,1.0,1.0,964,990,https://www.flickr.com/photos/earn31/29405687984,https://creativecommons.org/licenses/by/2.0/,Eugenio Rada,https://www.flickr.com/people/earn31/\ne1a7288ef3c4fcd7,https://c1.staticflickr.com/8/7397/27256819761_f8780d065e_o.jpg,0.325327510917,0.0,0.975982532751,1.0,914,176,https://www.flickr.com/photos/13476480@N07/27256819761,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n50e5f9745773bb30,https://c1.staticflickr.com/8/7379/26428727033_73b68d0c0a_o.jpg,0.2806640625,0.25,0.8419921875,1.0,459,677,https://www.flickr.com/photos/slgc/26428727033,https://creativecommons.org/licenses/by/2.0/,slgckgc,https://www.flickr.com/people/slgc/\n3c6166d16738ff8c,https://c1.staticflickr.com/9/8541/30173105805_6f6768688a_o.jpg,0.28125,0.25,0.84375,1.0,896,737,https://www.flickr.com/photos/thenationalguard/30173105805,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/\nd2a828e9b4d02942,https://c1.staticflickr.com/9/8631/28763409292_2c66af5d1c_o.jpg,0.302264808362,0.0,1.0,0.75,310,835,https://www.flickr.com/photos/gails_pictures/28763409292/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n69af2793a77c93db,https://c1.staticflickr.com/8/7365/26921795183_7fff86d53a_o.jpg,0.0,0.0,1.0,1.0,429,887,https://www.flickr.com/photos/sixmilliondollardan/26921795183,https://creativecommons.org/licenses/by/2.0/,danjo paluska,https://www.flickr.com/people/sixmilliondollardan/\ndeee1f1106038ed0,https://c1.staticflickr.com/9/8688/28357083891_46d3cb477f_o.jpg,0.0,0.0,0.5,0.75,723,569,https://www.flickr.com/photos/tsengphotos/28357083891,https://creativecommons.org/licenses/by/2.0/,Tony Tseng,https://www.flickr.com/people/tsengphotos/\ncb41beb7a08a001a,https://c1.staticflickr.com/1/296/32560158336_692847da9e_o.jpg,0.0,0.25,0.5,1.0,865,30,https://flickr.com/53301297@N00/32560158336,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n0d9442cdca7cf0e0,https://c1.staticflickr.com/6/5482/30608431946_42712a931d_o.jpg,0.25,0.25,1.0,1.0,820,449,https://flickr.com/144874482@N06/30608431946,https://creativecommons.org/licenses/by/2.0/,Morrigan Penninck,https://www.flickr.com/people/144874482@N06/\n7eb0d09a0918698c,https://c1.staticflickr.com/8/7685/27694216640_2756043091_o.jpg,0.0,0.0,0.5625,0.75,964,330,https://www.flickr.com/photos/cogdog/27694216640,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n4d02246d1efeeeb7,https://c1.staticflickr.com/8/7294/27311380960_fef4b1da99_o.jpg,0.421177266576,0.0,0.842354533153,0.75,509,613,https://www.flickr.com/photos/143269811@N04/27311380960,https://creativecommons.org/licenses/by/2.0/,Karl Hols,https://www.flickr.com/people/143269811@N04/\n35e53f00caed5c09,https://c1.staticflickr.com/9/8010/28941495244_5c78bfa532_o.jpg,0.0,0.0,0.561569688769,1.0,771,887,https://www.flickr.com/photos/blondinrikard/28941495244,https://creativecommons.org/licenses/by/2.0/,Blondinrikard Fr\\303\\266berg,https://www.flickr.com/people/blondinrikard/\nd75f78cdcdb9d285,https://c1.staticflickr.com/8/7171/26704450524_d6c04bc536_o.jpg,0.0,0.0,1.0,1.0,85,877,https://www.flickr.com/photos/icstefanescu/26704450524,https://creativecommons.org/licenses/by/2.0/,Cristian Iohan \\305\\236tef\\304\\203nescu,https://www.flickr.com/people/icstefanescu/\ncb1b2242d46ffaec,https://c1.staticflickr.com/3/2528/31962752584_e285442eac_o.jpg,0.332842415317,0.0,0.99852724595,1.0,831,674,https://www.flickr.com/photos/13476480@N07/31962752584/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nc32750a1b84530c2,https://c1.staticflickr.com/9/8809/28354240903_4f5340f7be_o.jpg,0.333333333333,0.0,1.0,1.0,467,808,https://www.flickr.com/photos/sodaigomi/28354240903,https://creativecommons.org/licenses/by/2.0/,sodai gomi,https://www.flickr.com/people/sodaigomi/\nad10a067473a6dec,https://c1.staticflickr.com/6/5699/29680168353_0ca00c5e80_o.jpg,0.289148351648,0.0,0.867445054945,1.0,821,872,https://www.flickr.com/photos/archivesnz/29680168353,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/\nb174b02144086ff6,https://c1.staticflickr.com/1/405/31627292696_3105523a0e_o.jpg,0.0,0.0,0.5,0.75,23,249,https://www.flickr.com/photos/usfwsmidwest/31627292696,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n201b01e9636f1489,https://c1.staticflickr.com/8/7647/28644903536_29d5087074_o.jpg,0.503303964758,0.0,1.0,0.75,31,959,https://www.flickr.com/photos/longitudelatitude/28644903536/,https://creativecommons.org/licenses/by/2.0/,LongitudeLatitude,https://www.flickr.com/people/longitudelatitude/\n3b7596444ea0aa75,https://c1.staticflickr.com/8/7580/27820089130_4cb8a12668_o.jpg,0.28125,0.25,0.84375,1.0,459,148,https://www.flickr.com/photos/77175657@N00/27820089130,https://creativecommons.org/licenses/by/2.0/,Graham Tiller,https://www.flickr.com/people/77175657@N00/\n437cbb1ae069fc78,https://c1.staticflickr.com/9/8484/29500015272_fd5255ba11_o.jpg,0.333333333333,0.0,1.0,1.0,519,779,https://www.flickr.com/photos/box_repsol/29500015272,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n84c758b3135e0302,https://c1.staticflickr.com/6/5475/30968470430_37b763440e_o.jpg,0.0,0.318926974665,1.0,1.0,954,931,https://www.flickr.com/photos/biodivlibrary/30968470430/,https://creativecommons.org/licenses/by/2.0/,Biodiversity Heritage Library,https://www.flickr.com/people/biodivlibrary/\n9264110456876b6b,https://c1.staticflickr.com/9/8283/29630926285_6d5ae6b2fe_o.jpg,0.280226209048,0.25,0.840678627145,1.0,469,107,https://www.flickr.com/photos/andreboeni/29630926285,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n58bc3400a089c8a1,https://c1.staticflickr.com/9/8261/28507961393_5facb13b91_o.jpg,0.498153618907,0.25,1.0,1.0,547,745,https://www.flickr.com/photos/100739735@N06/28507961393,https://creativecommons.org/licenses/by/2.0/,interestedbystandr,https://www.flickr.com/people/100739735@N06/\n8d98c633aa35523b,https://c1.staticflickr.com/1/653/32522348120_b86629cbbd_o.jpg,0.5,0.0,1.0,0.75,404,79,https://flickr.com/46886434@N04/32522348120,https://creativecommons.org/licenses/by/2.0/,U.S. Embassy Tel Aviv,https://www.flickr.com/people/usembassyta/\n5346c241e4a3db3e,https://c1.staticflickr.com/8/7442/27703112896_e7b2074923_o.jpg,0.25,0.0,0.75,0.75,818,559,https://www.flickr.com/photos/thecvf/27703112896,https://creativecommons.org/licenses/by/2.0/,Climate Vulnerable Forum (CVF),https://www.flickr.com/people/thecvf/\nc712cc9afaa22a99,https://c1.staticflickr.com/6/5541/30446877326_e3f46cbf35_o.jpg,0.25,0.0,0.75,0.75,519,538,https://www.flickr.com/photos/box_repsol/30446877326,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nfcf19e03aa2008e4,https://c1.staticflickr.com/8/7280/27784553555_0b9fbf1071_o.jpg,0.25,0.0,0.75,0.75,512,685,https://www.flickr.com/photos/greggjerdingen/27784553555,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nc597ee71ab653ced,https://c1.staticflickr.com/1/680/32023247346_e5e4f88710_o.jpg,0.28125,0.25,0.84375,1.0,875,918,http://www.flickr.com/photos/aswans1234567/32023247346/,https://creativecommons.org/licenses/by/2.0/,Alex Swanston&#x27;s Bus Photos,https://www.flickr.com/people/aswans1234567/\nca097940a11c6de5,https://c1.staticflickr.com/6/5584/31657305175_f204e6bb4b_o.jpg,0.43661971831,0.25,1.0,1.0,702,366,https://www.flickr.com/photos/7armyjmtc/31657305175,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n0bee475ac8da9317,https://c1.staticflickr.com/9/8821/28841269416_30215dee2d_o.jpg,0.0,0.304654442877,1.0,0.913963328632,23,624,https://www.flickr.com/photos/mypubliclands/28841269416,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\nd96010b74c910b62,https://c1.staticflickr.com/8/7713/26774992933_df01890394_o.jpg,0.0,0.0,1.0,0.75,883,724,https://www.flickr.com/photos/byzantiumbooks/26774992933,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/\n7453af03daf0ad97,https://c1.staticflickr.com/6/5471/30886295245_37abf81bf5_o.jpg,0.0,0.0,0.75,1.0,437,621,https://www.flickr.com/photos/nzcarfreak/30886295245,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\n7a59363114f0794d,https://c1.staticflickr.com/9/8811/27688525584_860a9320bb_o.jpg,0.28125,0.25,0.84375,1.0,984,590,https://www.flickr.com/photos/noaaphotolib/27688525584,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\na860af65a323ede5,https://c1.staticflickr.com/8/7476/28353011365_6f280587a6_o.jpg,0.0,0.0,0.75,1.0,854,697,https://flickr.com/95212304@N00/28353011365,https://creativecommons.org/licenses/by/2.0/,Ken Ratcliff,https://www.flickr.com/people/kenspix/\n4b116f872dd54eed,https://c1.staticflickr.com/8/7383/27564580095_febdace845_o.jpg,0.0,0.0,0.666666666667,1.0,36,697,https://www.flickr.com/photos/usfwsmidwest/27564580095,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n6c361399e24c419b,https://c1.staticflickr.com/1/676/32037217680_91257f4fe2_o.jpg,0.0,0.0,0.75,1.0,909,376,https://flickr.com/47514124@N02/32037217680,https://creativecommons.org/licenses/by/2.0/,Geoffrey Franklin,https://www.flickr.com/people/47514124@N02/\ne212d738cc76c621,https://c1.staticflickr.com/9/8614/30304985301_f793b97cd8_o.jpg,0.0,0.25,0.572555205047,1.0,826,909,https://www.flickr.com/photos/redi-rock/30304985301/,https://creativecommons.org/licenses/by/2.0/,Redi-Rock International,https://www.flickr.com/people/redi-rock/\nf9aad5d01a236f81,https://c1.staticflickr.com/8/7006/26526542504_274282fc0e_o.jpg,0.0,0.0,0.666666666667,1.0,519,442,https://www.flickr.com/photos/box_repsol/26526542504,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nc8caae14a8638107,https://c1.staticflickr.com/6/5447/31035252022_a63169f347_o.jpg,0.499263622975,0.0,0.99852724595,0.75,885,37,https://flickr.com/43714545@N06/31035252022,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/\n4041bedaba64e6fe,https://c1.staticflickr.com/9/8411/30078072080_a117444aa2_o.jpg,0.0,0.25,0.5625,1.0,59,41,https://www.flickr.com/photos/treegrow/30078072080,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n8919aa6ab76b8a13,https://c1.staticflickr.com/6/5498/31484833275_6e8c9d4998_o.jpg,0.333333333333,0.0,1.0,1.0,706,874,https://flickr.com/53301297@N00/31484833275,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n9583fea45a09016e,https://c1.staticflickr.com/8/7686/26834686306_b3f11d359e_o.jpg,0.0,0.0,0.798387096774,1.0,532,577,https://www.flickr.com/photos/janitors/26834686306,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\nccaa15b8875c1f4a,https://c1.staticflickr.com/6/5624/31240977195_4a56b25e3a_o.jpg,0.0,0.0,0.5625,0.75,437,685,https://www.flickr.com/photos/nzcarfreak/31240977195,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\n3c9dc9c6e2bf704a,https://c1.staticflickr.com/3/2842/33135689682_6229485512_o.jpg,0.0,0.2515625,1.0,1.0,739,276,https://flickr.com/62295966@N07/33135689682,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n3b4ec3925667d5f7,https://c1.staticflickr.com/6/5710/30488712372_a417e5f49b_o.jpg,0.0,0.0,0.799676898223,1.0,653,976,https://www.flickr.com/photos/navfac/30488712372/,https://creativecommons.org/licenses/by/2.0/,NAVFAC,https://www.flickr.com/people/navfac/\n4fe72ed6fe5bd450,https://c1.staticflickr.com/9/8046/29749021231_f36d5a8055_o.jpg,0.393668831169,0.0,1.0,0.75,320,415,https://flickr.com/35142635@N05/29749021231,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\n3fd42c4bb42750ab,https://c1.staticflickr.com/9/8648/29836407406_e82ba55f4b_o.jpg,0.249631811487,0.0,0.748895434462,0.75,322,70,https://www.flickr.com/photos/metay/29836407406/,https://creativecommons.org/licenses/by/2.0/,fidber,https://www.flickr.com/people/metay/\n6f6674f380c0614d,https://c1.staticflickr.com/8/7597/27723115991_d71d65224a_o.jpg,0.25,0.25,1.0,1.0,991,855,https://www.flickr.com/photos/woolgenie/27723115991,https://creativecommons.org/licenses/by/2.0/,Heather,https://www.flickr.com/people/woolgenie/\n8c02c0ff6bb5e052,https://c1.staticflickr.com/6/5679/30769980615_c83dc6b25e_o.jpg,0.0,0.0,0.75,1.0,875,473,https://www.flickr.com/photos/27665395@N05/30769980615,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n4e4cf49ec8861b2f,https://c1.staticflickr.com/8/7431/27725908611_95a155940f_o.jpg,0.318219633943,0.0,0.95465890183,0.75,309,563,https://www.flickr.com/photos/35142635@N05/27725908611,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\n47daf63f216338fd,https://c1.staticflickr.com/9/8732/28364129093_f44d1b9604_o.jpg,0.0,0.28125,0.75,0.84375,540,651,https://www.flickr.com/photos/sebilden/28364129093,https://creativecommons.org/licenses/by/2.0/,David J,https://www.flickr.com/people/sebilden/\n601e52be13b4578e,https://c1.staticflickr.com/9/8716/29535640101_589449d176_o.jpg,0.0,0.25,0.75,0.75,888,638,https://www.flickr.com/photos/quinet/29535640101/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n14c446b00e333eeb,https://c1.staticflickr.com/1/478/32804423766_f21eafed4f_o.jpg,0.333333333333,0.0,1.0,1.0,116,489,https://www.flickr.com/photos/silkebaron/32804423766,https://creativecommons.org/licenses/by/2.0/,prilfish,https://www.flickr.com/people/silkebaron/\n1ac22958b49228f2,https://c1.staticflickr.com/9/8676/29534026000_6366a5f344_o.jpg,0.293530351438,0.25,0.880591054313,1.0,18,308,https://flickr.com/7706348@N04/29534026000,https://creativecommons.org/licenses/by/2.0/,caligula1995,https://www.flickr.com/people/pussreboots/\ne2a477d6b7bc9197,https://c1.staticflickr.com/1/373/32840214286_4993d22320_o.jpg,0.25,0.0,1.0,1.0,977,364,https://www.flickr.com/photos/davidstanleytravel/32840214286,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n2ec28ff082dd9ddc,https://c1.staticflickr.com/9/8204/28853565856_2e73ab3f9e_o.jpg,0.25,0.25,0.75,1.0,986,199,https://www.flickr.com/photos/juggernautco/28853565856,https://creativecommons.org/licenses/by/2.0/,Daniel X. O&#x27;Neil,https://www.flickr.com/people/juggernautco/\n3a8a057da1d510ce,https://c1.staticflickr.com/8/7597/27209166915_26a794ac4b_o.jpg,0.530714285714,0.25,1.0,1.0,58,967,https://www.flickr.com/photos/gregthebusker/27209166915,https://creativecommons.org/licenses/by/2.0/,Greg Schechter,https://www.flickr.com/people/gregthebusker/\na2d746298fbd4acd,https://c1.staticflickr.com/9/8277/30028648140_dc7a7b5494_o.jpg,0.35861423221,0.0,0.717228464419,0.75,780,909,https://www.flickr.com/photos/thoseguys119/30028648140,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n7f71ff13debf3fb1,https://c1.staticflickr.com/9/8669/28894508901_a45158a6a3_o.jpg,0.5,0.0,1.0,0.75,662,487,https://www.flickr.com/photos/42220226@N07/28894508901,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\n8cbd8ce73f487119,https://c1.staticflickr.com/1/268/31672453021_292d2351b5_o.jpg,0.18137254902,0.0,1.0,1.0,821,714,https://www.flickr.com/photos/45131642@N00/31672453021,https://creativecommons.org/licenses/by/2.0/,Phil Parker,https://www.flickr.com/people/45131642@N00/\n4a31c2b3e69d2231,https://c1.staticflickr.com/9/8574/29664426340_0b0c76022f_o.jpg,0.4375,0.0,1.0,0.75,865,162,https://flickr.com/27665395@N05/29664426340,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nd173ff3d2e9a8e40,https://c1.staticflickr.com/8/7685/26461065754_a2fe1dbc5a_o.jpg,0.0,0.0,0.666666666667,1.0,80,624,https://www.flickr.com/photos/quinet/26461065754,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n55432f696cdf4194,https://c1.staticflickr.com/9/8499/29877127275_43e254b348_o.jpg,0.0,0.25,0.75,1.0,680,902,https://www.flickr.com/photos/feeliz/29877127275/,https://creativecommons.org/licenses/by/2.0/,Jana Lehmann,https://www.flickr.com/people/feeliz/\n397791423a75a4cd,https://c1.staticflickr.com/9/8385/29195474363_0c7df11c70_o.jpg,0.28125,0.0,0.84375,0.75,459,29,https://www.flickr.com/photos/eamoncurry/29195474363,https://creativecommons.org/licenses/by/2.0/,Eamon Curry,https://www.flickr.com/people/eamoncurry/\n79ea5c288768456d,https://c1.staticflickr.com/6/5533/30525211896_0f1469362e_o.jpg,0.0,0.0,0.5625,0.75,669,189,https://www.flickr.com/photos/davidstanleytravel/30525211896,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\nfc75ccf2e8873c0e,https://c1.staticflickr.com/6/5755/30186546880_512dfd4287_o.jpg,0.28125,0.25,0.84375,1.0,866,560,https://www.flickr.com/photos/tiseb/30186546880/,https://creativecommons.org/licenses/by/2.0/,S\\303\\251bastien Bertrand,https://www.flickr.com/people/tiseb/\ne59c5712d92ba11b,https://c1.staticflickr.com/1/444/31331556080_b2fa2db56c_o.jpg,0.438430311231,0.0,1.0,1.0,459,998,https://www.flickr.com/photos/119886413@N05/31331556080,https://creativecommons.org/licenses/by/2.0/,Michel Curi,https://www.flickr.com/people/119886413@N05/\n4a023ebd4d3723c4,https://c1.staticflickr.com/3/2445/32629582630_208255690f_o.jpg,0.25,0.0,0.75,0.75,347,127,http://www.flickr.com/photos/124790945@N06/32629582630,https://creativecommons.org/licenses/by/2.0/,Phuket@photographer.net,https://www.flickr.com/people/linvoyage/\n06887ee9ae768ef5,https://c1.staticflickr.com/6/5745/29910058033_b02ee0e638_o.jpg,0.249631811487,0.0,0.748895434462,0.75,780,555,https://www.flickr.com/photos/thoseguys119/29910058033,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\na8863e5280101672,https://c1.staticflickr.com/9/8378/29701381952_540f2b6d06_o.jpg,0.5,0.0,1.0,0.75,604,863,https://www.flickr.com/photos/faceme/29701381952,https://creativecommons.org/licenses/by/2.0/,FaceMePLS,https://www.flickr.com/people/faceme/\n0d017eaf9d87f850,https://c1.staticflickr.com/1/698/32077123330_b141d01b15_o.jpg,0.5,0.0,1.0,0.75,976,3,https://www.flickr.com/photos/gaby1/32077123330/,https://creativecommons.org/licenses/by/2.0/,Gabriel Gonz\\303\\241lez,https://www.flickr.com/people/gaby1/\n75cf1a71613f680f,https://c1.staticflickr.com/8/7236/26990079665_6b0c8c980b_o.jpg,0.25,0.0,0.75,0.75,971,493,https://www.flickr.com/photos/90975693@N05/26990079665,https://creativecommons.org/licenses/by/2.0/,tommy@chau,https://www.flickr.com/people/90975693@N05/\nead99079711f1bdc,https://c1.staticflickr.com/9/8075/29364386676_c1f182916f_o.jpg,0.25,0.0,0.75,0.75,855,701,https://www.flickr.com/photos/presidentialoffice/29364386676/,https://creativecommons.org/licenses/by/2.0/,\\347\\270\\275\\347\\265\\261\\345\\272\\234,https://www.flickr.com/people/presidentialoffice/\nc5c8119554ab6d40,https://c1.staticflickr.com/9/8719/28415695145_418e3a3205_o.jpg,0.0,0.0,0.666666666667,1.0,975,517,https://www.flickr.com/photos/jsjgeology/28415695145,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n3feb0fdcea7e02ad,https://c1.staticflickr.com/9/8305/29168872094_9498e22d59_o.jpg,0.0,0.25,0.5,1.0,909,720,https://www.flickr.com/photos/fun_flying/29168872094,https://creativecommons.org/licenses/by/2.0/,D. Miller,https://www.flickr.com/people/fun_flying/\nd9feb7ea8d9cfbef,https://c1.staticflickr.com/8/7513/29580546065_f2dfd74de0_o.jpg,0.391463414634,0.25,1.0,1.0,320,269,https://www.flickr.com/photos/47602497@N06/29580546065,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/\necc0e8f17ae91854,https://c1.staticflickr.com/9/8300/29112354294_4c43811145_o.jpg,0.511297376093,0.25,1.0,1.0,699,288,https://www.flickr.com/photos/pavelcab/29112354294,https://creativecommons.org/licenses/by/2.0/,Pablo Cabezos,https://www.flickr.com/people/pavelcab/\ne5d57ebd448af74e,https://c1.staticflickr.com/6/5568/30141750756_5a1dd3583e_o.jpg,0.247797356828,0.25,0.743392070485,1.0,875,425,https://www.flickr.com/photos/vitordias_/30141750756,https://creativecommons.org/licenses/by/2.0/,V\\303\\255tor Dias,https://www.flickr.com/people/vitordias_/\ne523da536c95ebd8,https://c1.staticflickr.com/8/7437/26880197382_a25e04f8a2_o.jpg,0.0,0.0,0.5625,0.75,336,68,https://www.flickr.com/photos/peter-trimming/26880197382,https://creativecommons.org/licenses/by/2.0/,Peter Trimming,https://www.flickr.com/people/peter-trimming/\nc67f05a920cf737b,https://c1.staticflickr.com/8/7015/26980673560_50608fed35_o.jpg,0.25,0.0,1.0,0.501846381093,836,676,https://www.flickr.com/photos/quinet/26980673560,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n93c7262b60ac6495,https://c1.staticflickr.com/6/5585/30807410480_aab1627005_o.jpg,0.25,0.0,0.75,0.75,820,927,https://www.flickr.com/photos/unfccc/30807410480/,https://creativecommons.org/licenses/by/2.0/,UNclimatechange,https://www.flickr.com/people/unfccc/\n01e8808fc4a0308b,https://c1.staticflickr.com/1/329/31808071892_8c99152900_o.jpg,0.0,0.0,0.75,1.0,820,463,https://www.flickr.com/photos/davidcjones/31808071892,https://creativecommons.org/licenses/by/2.0/,David Jones,https://www.flickr.com/people/davidcjones/\nb5d3870d0d477956,https://c1.staticflickr.com/9/8751/29824845605_5ab78717de_o.jpg,0.0,0.267530487805,0.75,0.802591463415,412,495,https://www.flickr.com/photos/allanhenderson/29824845605/,https://creativecommons.org/licenses/by/2.0/,Allan Henderson,https://www.flickr.com/people/allanhenderson/\nbe6f9889835ebd58,https://c1.staticflickr.com/6/5764/30259404674_b82bcd795c_o.jpg,0.0,0.267410714286,0.75,1.0,348,34,https://flickr.com/49481946@N00/30259404674,https://creativecommons.org/licenses/by/2.0/,Ty Nigh,https://www.flickr.com/people/tynigh/\nb28ac335e561c764,https://c1.staticflickr.com/8/7281/27055269902_963dede960_o.jpg,0.24882629108,0.0,1.0,1.0,15,966,https://www.flickr.com/photos/mikeprince/27055269902/,https://creativecommons.org/licenses/by/2.0/,Mike Prince,https://www.flickr.com/people/mikeprince/\ncfdff9987d0051df,https://c1.staticflickr.com/3/2376/32646486092_968ffd379d_o.jpg,0.0,0.25,0.46688034188,1.0,889,808,https://www.flickr.com/photos/133461395@N08/32646486092/,https://creativecommons.org/licenses/by/2.0/,ian_woodhead1,https://www.flickr.com/people/133461395@N08/\n9d66180f12ebcdac,https://c1.staticflickr.com/9/8056/30012234655_7b571924bb_o.jpg,0.0,0.0,0.5,0.75,982,512,https://flickr.com/63704136@N00/30012234655,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n11c47f1a3ee71773,https://c1.staticflickr.com/3/2637/32762757636_62d3be3950_o.jpg,0.25,0.0,1.0,1.0,442,577,https://www.flickr.com/photos/gromin/32762757636/,https://creativecommons.org/licenses/by/2.0/,Nikolay Gromin,https://www.flickr.com/people/gromin/\na6bb7d44778cdc42,https://c1.staticflickr.com/6/5690/30238050171_30a44ed38a_o.jpg,0.0,0.400242326333,0.75,1.0,680,220,https://www.flickr.com/photos/kayadams/30238050171,https://creativecommons.org/licenses/by/2.0/,Kay Adams,https://www.flickr.com/people/kayadams/\n95b2017ab1f90452,https://c1.staticflickr.com/1/550/31959811195_85f3ca48ce_o.jpg,0.43661971831,0.25,1.0,1.0,459,998,https://www.flickr.com/photos/southbeachcars/31959811195,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\na4c9ad41dbba56e0,https://c1.staticflickr.com/9/8538/28650793644_02013c6c09_o.jpg,0.25,0.25,0.75,1.0,664,426,https://www.flickr.com/photos/wm_archiv/28650793644/,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/\nfcc6e88fe224437e,https://c1.staticflickr.com/1/446/32445415926_21dab2884e_o.jpg,0.25,0.2806640625,1.0,0.8419921875,93,982,https://www.flickr.com/photos/dkeats/32445415926,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n0e5e8a2c5035f402,https://c1.staticflickr.com/9/8630/30427680371_56bd18bb51_o.jpg,0.25,0.0,1.0,0.630794701987,875,468,https://www.flickr.com/photos/didbygraham/30427680371,https://creativecommons.org/licenses/by/2.0/,Graham Richardson,https://www.flickr.com/people/didbygraham/\n5f197075f483b809,https://c1.staticflickr.com/9/8005/29011424435_d9ca607669_o.jpg,0.0,0.0,0.666666666667,1.0,662,707,https://www.flickr.com/photos/greggjerdingen/29011424435,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n84eaa7c8e6f876fc,https://c1.staticflickr.com/9/8787/28255538194_7e1607ef39_o.jpg,0.210588633288,0.25,0.631765899865,1.0,960,543,https://www.flickr.com/photos/jeffreyww/28255538194,https://creativecommons.org/licenses/by/2.0/,jeffreyw,https://www.flickr.com/people/jeffreyww/\n861b455d7d006c22,https://c1.staticflickr.com/6/5321/30551374723_5673642632_o.jpg,0.404589371981,0.0,1.0,0.75,672,851,https://www.flickr.com/photos/glorycycles/30551374723,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n7978466c40c2a174,https://c1.staticflickr.com/6/5489/30920462645_7436820516_o.jpg,0.0,0.0,0.76062992126,1.0,20,242,https://www.flickr.com/photos/grant_subaru/30920462645/,https://creativecommons.org/licenses/by/2.0/,Grant.C,https://www.flickr.com/people/grant_subaru/\na893274232e3718f,https://c1.staticflickr.com/8/7761/30229577882_d6885b0180_o.jpg,0.0,0.0,0.782747603834,1.0,325,66,https://flickr.com/33398884@N03/30229577882,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\nfe562d4c59491d3b,https://c1.staticflickr.com/8/7691/27302324302_a8be9d4d38_o.jpg,0.244351311953,0.25,0.73305393586,1.0,699,416,https://www.flickr.com/photos/glynlowe/27302324302,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/\n87260733eda62b68,https://c1.staticflickr.com/6/5552/31535452072_f650c9b7b4_o.jpg,0.501840942563,0.0,1.0,0.75,580,765,https://www.flickr.com/photos/eaglebrook/31535452072/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/\n92e524e48eb2e745,https://c1.staticflickr.com/8/7115/26661802563_db82afaf44_o.jpg,0.210588633288,0.25,0.631765899865,1.0,563,147,https://www.flickr.com/photos/thomasleuthard/26661802563,https://creativecommons.org/licenses/by/2.0/,Thomas Leuthard,https://www.flickr.com/people/thomasleuthard/\n0b428b3c371c490f,https://c1.staticflickr.com/8/7386/28027172462_693af72f43_o.jpg,0.0,0.25,0.535877862595,1.0,324,339,https://www.flickr.com/photos/usfwsmidwest/28027172462,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\nf6c20d2b0ef80fef,https://c1.staticflickr.com/1/260/31676056622_6bd0e27bf7_o.jpg,0.557905686546,0.0,1.0,0.75,459,295,https://www.flickr.com/photos/summonedbyfells/31676056622/,https://creativecommons.org/licenses/by/2.0/,summonedbyfells,https://www.flickr.com/people/summonedbyfells/\n79ed351fedfe7b1d,https://c1.staticflickr.com/8/7296/26634891254_2d3a262e95_o.jpg,0.25,0.25,0.75,1.0,971,613,https://www.flickr.com/photos/freaky_designz/26634891254/,https://creativecommons.org/licenses/by/2.0/,David Schiersner,https://www.flickr.com/people/freaky_designz/\n183cfabe5b28b34d,https://c1.staticflickr.com/1/328/32594930856_fb66f1c6b5_o.jpg,0.0,0.0,1.0,0.980322003578,830,540,https://www.flickr.com/photos/duncanh1/32594930856,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\n8961930591589be6,https://c1.staticflickr.com/9/8388/28523176143_57a99da19d_o.jpg,0.48007518797,0.0,1.0,0.75,725,408,https://flickr.com/124793433@N06/28523176143,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/124793433@N06/\nc1d4f8be5e3d36a4,https://c1.staticflickr.com/9/8593/28006305640_5a73612a69_o.jpg,0.0,0.0,0.5625,0.75,322,523,https://www.flickr.com/photos/nikonvscanon/28006305640/,https://creativecommons.org/licenses/by/2.0/,David Blaikie,https://www.flickr.com/people/nikonvscanon/\n85c5f8527f8641c2,https://c1.staticflickr.com/1/625/32331797566_1e8b24a8a3_o.jpg,0.25,0.0,1.0,1.0,780,340,https://www.flickr.com/photos/thoseguys119/32331797566,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n17f07a1a4674ccde,https://c1.staticflickr.com/1/521/32414981521_8f1deabf8f_o.jpg,0.0,0.0,0.666666666667,1.0,542,727,https://www.flickr.com/photos/fifeanddrum/32414981521/,https://creativecommons.org/licenses/by/2.0/,U. S. Army Old Guard Fife and Drum Corps,https://www.flickr.com/people/fifeanddrum/\nec222b5925c37fd9,https://c1.staticflickr.com/6/5560/30347376530_e8c0e9ea43_o.jpg,0.0,0.25,0.5,1.0,986,685,https://www.flickr.com/photos/syuu/30347376530/,https://creativecommons.org/licenses/by/2.0/,Takuya ASADA,https://www.flickr.com/people/syuu/\n23e2aac70e110c1c,https://c1.staticflickr.com/9/8307/28397929524_4085dd5875_o.jpg,0.0,0.0,0.58864265928,1.0,959,703,https://www.flickr.com/photos/sansebastian2016/28397929524,https://creativecommons.org/licenses/by/2.0/,Donostia/San Sebastian 2016,https://www.flickr.com/people/sansebastian2016/\na53d59cff2545efd,https://c1.staticflickr.com/9/8525/29633899796_747fca00ca_o.jpg,0.285496183206,0.0,1.0,1.0,340,368,https://flickr.com/40441865@N08/29633899796,https://creativecommons.org/licenses/by/2.0/,mitchell haindfield,https://www.flickr.com/people/40441865@N08/\na406058a14d88fe0,https://c1.staticflickr.com/9/8448/29510775121_d23bcbe711_o.jpg,0.0,0.25,0.5,1.0,874,967,https://www.flickr.com/photos/renaissancechambara/29510775121/,https://creativecommons.org/licenses/by/2.0/,Ged Carroll,https://www.flickr.com/people/renaissancechambara/\nef7c16e6bb2f2071,https://c1.staticflickr.com/8/7584/27192617901_cd6c602e1f_o.jpg,0.0,0.25,0.592295345104,1.0,564,740,https://www.flickr.com/photos/68704638@N04/27192617901,https://creativecommons.org/licenses/by/2.0/,M Dreibelbis,https://www.flickr.com/people/68704638@N04/\n9d999d84e8a019b3,https://c1.staticflickr.com/9/8523/29268594282_5ff202bc94_o.jpg,0.5,0.0,1.0,0.75,662,719,https://www.flickr.com/photos/vahemart/29268594282,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\nf17337f9682d04b9,https://c1.staticflickr.com/6/5771/31345763525_14a3ee850d_o.jpg,0.25,0.0,0.75,0.75,952,222,https://www.flickr.com/photos/pedrik/31345763525,https://creativecommons.org/licenses/by/2.0/,pedrik,https://www.flickr.com/people/pedrik/\n0fc1d8174c68ba8c,https://c1.staticflickr.com/9/8718/28800342585_8067d311be_o.jpg,0.25,0.0,1.0,0.75,386,842,https://www.flickr.com/photos/pleia2/28800342585,https://creativecommons.org/licenses/by/2.0/,Elizabeth K. Joseph,https://www.flickr.com/people/pleia2/\nc8c09c61bcd69de1,https://c1.staticflickr.com/1/370/32710903382_b680677460_o.jpg,0.0,0.0,0.666666666667,1.0,98,693,https://www.flickr.com/photos/russ-w/32710903382,https://creativecommons.org/licenses/by/2.0/,Russ,https://www.flickr.com/people/russ-w/\n4e87baa84a5467bd,https://c1.staticflickr.com/9/8355/28796146563_a46144a810_o.jpg,0.25,0.497411242604,1.0,1.0,32,747,https://www.flickr.com/photos/52450054@N04/28796146563,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n673cf06123470f89,https://c1.staticflickr.com/8/7380/26648708923_5eac53062e_o.jpg,0.249631811487,0.0,0.748895434462,0.75,512,766,https://www.flickr.com/photos/greggjerdingen/26648708923,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n78561cc1c31ca1f2,https://c1.staticflickr.com/8/7441/27529666561_f7ac25df65_o.jpg,0.0,0.5,0.75,1.0,407,340,https://www.flickr.com/photos/wm_archiv/27529666561/,https://creativecommons.org/licenses/by/2.0/,Allie_Caulfield,https://www.flickr.com/people/wm_archiv/\n635086adcb51daf4,https://c1.staticflickr.com/8/7325/27736304942_cc5f4b7274_o.jpg,0.25,0.25,0.75,1.0,950,576,https://flickr.com/133488379@N08/27736304942,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\n7b2cdbb3c5396efa,https://c1.staticflickr.com/8/7451/27675344505_ab9f482951_o.jpg,0.494444444444,0.25,1.0,1.0,467,895,https://www.flickr.com/photos/robdammers/27675344505,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n6cb14870eaa6c645,https://c1.staticflickr.com/8/7354/26773108623_08fe876c4f_o.jpg,0.0,0.25,0.5625,1.0,341,759,https://www.flickr.com/photos/amanderson/26773108623,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n2d9c24b55f9f5600,https://c1.staticflickr.com/1/256/32435872790_9210f6c752_o.jpg,0.28125,0.25,0.84375,1.0,971,805,https://www.flickr.com/photos/ea1aer/32435872790,https://creativecommons.org/licenses/by/2.0/,Juan Carlos Llamazares,https://www.flickr.com/people/ea1aer/\n57361c2a80851ef5,https://c1.staticflickr.com/6/5518/30095827741_98c904cf2f_o.jpg,0.4375,0.25,1.0,1.0,973,589,https://www.flickr.com/photos/woodhead/30095827741/,https://creativecommons.org/licenses/by/2.0/,jasonwoodhead23,https://www.flickr.com/people/woodhead/\nd1475e5f49a8a055,https://c1.staticflickr.com/9/8793/28191301701_28276a3d15_o.jpg,0.4375,0.25,1.0,1.0,880,740,https://www.flickr.com/photos/zongo/28191301701,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n86495a368aea25a3,https://c1.staticflickr.com/8/7245/26518368564_87a52c22f7_o.jpg,0.28125,0.0,0.84375,0.75,583,764,https://www.flickr.com/photos/cm_john/26518368564,https://creativecommons.org/licenses/by/2.0/,John Shedrick,https://www.flickr.com/people/cm_john/\nf8fba0d3db0d5d2f,https://c1.staticflickr.com/8/7185/26442283653_9388d33b05_o.jpg,0.0,0.0,0.666666666667,1.0,739,578,https://www.flickr.com/photos/blumenbiene/26442283653/,https://creativecommons.org/licenses/by/2.0/,Maja Dumat,https://www.flickr.com/people/blumenbiene/\n27c5c50657f5faa7,https://c1.staticflickr.com/9/8213/28937552950_74cd83b239_o.jpg,0.28125,0.25,0.84375,1.0,459,774,https://www.flickr.com/photos/londonmatt/28937552950,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\nf82e861fb16031d0,https://c1.staticflickr.com/8/7534/27823464091_6fc45562a7_o.jpg,0.496696035242,0.0,0.993392070485,0.75,974,555,https://www.flickr.com/photos/shankaronline/27823464091/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n7b1e8dddc4d3dd95,https://c1.staticflickr.com/8/7635/26353007433_eb53f1a1b7_o.jpg,0.22531512605,0.25,0.675945378151,1.0,143,287,https://www.flickr.com/photos/wildreturn/26353007433/,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\ne6f13db7d1680531,https://c1.staticflickr.com/8/7463/26706688022_f9e1ec928f_o.jpg,0.349579831933,0.25,1.0,1.0,780,513,https://www.flickr.com/photos/thoseguys119/26706688022/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nc3bf4ec302d53ef7,https://c1.staticflickr.com/6/5580/30908371675_ceb0986b93_o.jpg,0.4375,0.0,1.0,0.75,780,784,https://www.flickr.com/photos/thoseguys119/30908371675,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\na86acfa6207b308a,https://c1.staticflickr.com/6/5455/30996301646_a04c9cfda2_o.jpg,0.25,0.0,0.75,0.75,48,221,https://www.flickr.com/photos/ansk/30996301646,https://creativecommons.org/licenses/by/2.0/,arian.suresh,https://www.flickr.com/people/ansk/\n6c8fcaa13e251164,https://c1.staticflickr.com/8/7383/27090081584_1882baa432_o.jpg,0.0,0.250923190547,0.75,0.75276957164,443,308,https://www.flickr.com/photos/quinet/27090081584/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n53dc555cdd85abef,https://c1.staticflickr.com/1/277/32468089466_df257aeca3_o.jpg,0.0,0.25,0.499263622975,1.0,480,6,https://www.flickr.com/photos/nrmadriversseat/32468089466,https://creativecommons.org/licenses/by/2.0/,The NRMA,https://www.flickr.com/people/nrmadriversseat/\nc3cc1fa93d4a2453,https://c1.staticflickr.com/9/8832/28146551543_a6892aeeab_o.jpg,0.210588633288,0.25,0.631765899865,1.0,562,723,https://www.flickr.com/photos/usnavy/28146551543,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n32befe5dc22bd051,https://c1.staticflickr.com/9/8889/28357952464_ea4f884dcb_o.jpg,0.333333333333,0.0,1.0,1.0,618,422,https://www.flickr.com/photos/joi/28357952464,https://creativecommons.org/licenses/by/2.0/,Joi Ito,https://www.flickr.com/people/joi/\nac9e647370a28e04,https://c1.staticflickr.com/8/7095/27196621386_239b7a036f_o.jpg,0.363112391931,0.0,1.0,1.0,556,944,https://www.flickr.com/photos/kansasscanner/27196621386,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\nba812f1941dad8e4,https://c1.staticflickr.com/1/545/31575903830_1a7c03c3bf_o.jpg,0.0,0.0,0.5625,0.75,985,111,https://flickr.com/73840284@N04/31575903830,https://creativecommons.org/licenses/by/2.0/,Harry Rose,https://www.flickr.com/people/macleaygrassman/\n7140c179d142da77,https://c1.staticflickr.com/6/5448/30478861881_4764d7599b_o.jpg,0.333333333333,0.0,1.0,1.0,511,449,https://flickr.com/22539273@N00/30478861881,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n209b8da99842fe37,https://c1.staticflickr.com/8/7350/27295268816_34d9fa5504_o.jpg,0.0,0.0,0.484397677794,0.75,699,428,https://www.flickr.com/photos/134758269@N08/27295268816,https://creativecommons.org/licenses/by/2.0/,Rajiv Bhuttan,https://www.flickr.com/people/134758269@N08/\nf45206f28e07ec34,https://c1.staticflickr.com/4/3930/32498547130_ee1165444f_o.jpg,0.464122137405,0.25,1.0,1.0,404,81,https://www.flickr.com/photos/usnavy/32498547130,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n87f9358b5861dbbf,https://c1.staticflickr.com/9/8043/28396031325_ec2405a924_o.jpg,0.4375,0.0,1.0,0.75,975,622,https://www.flickr.com/photos/jsjgeology/28396031325,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nadfe2b59b8780bfb,https://c1.staticflickr.com/8/7490/28154852885_9898cab628_o.jpg,0.0,0.25,0.61620294599,1.0,536,216,https://www.flickr.com/photos/glorycycles/28154852885,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n810f62a554bfb7a5,https://c1.staticflickr.com/8/7363/27957544700_4b128efda0_o.jpg,0.333333333333,0.0,1.0,1.0,294,164,https://www.flickr.com/photos/flowcomm/27957544700/,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\nbc6b4fadf870b27e,https://c1.staticflickr.com/4/3827/14315035062_122bbd691b_o.jpg,0.447674418605,0.25,1.0,1.0,403,785,https://www.flickr.com/photos/24580165@N03/14315035062,https://creativecommons.org/licenses/by/2.0/,Tom Driggers,https://www.flickr.com/people/24580165@N03/\n521f0d5721da30fb,https://c1.staticflickr.com/6/5523/30579874132_71388d17e0_o.jpg,0.0,0.0,0.439226519337,0.75,34,92,https://www.flickr.com/photos/usfws_pacificsw/30579874132,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/\nffe3277517ead6a4,https://c1.staticflickr.com/3/2186/32785407392_9a17961a13_o.jpg,0.464122137405,0.0,1.0,0.75,672,691,https://www.flickr.com/photos/glorycycles/32785407392,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n9c39596ac2e848e1,https://c1.staticflickr.com/9/8292/29153795893_c55984127a_o.jpg,0.28125,0.25,0.84375,1.0,336,23,https://www.flickr.com/photos/kirbyurner/29153795893,https://creativecommons.org/licenses/by/2.0/,thekirbster,https://www.flickr.com/people/kirbyurner/\n2f4f43114e7f1a50,https://c1.staticflickr.com/8/7392/26773675672_2f2bb77797_o.jpg,0.248713235294,0.0,0.746139705882,0.75,821,737,https://www.flickr.com/photos/shankaronline/26773675672,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\na74536baf84ffa47,https://c1.staticflickr.com/8/7433/27449716073_f300f0cf06_o.jpg,0.0,0.0,0.666666666667,1.0,655,320,https://www.flickr.com/photos/karen_roe/27449716073,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/\n20af4ed230d2fa6d,https://c1.staticflickr.com/8/7393/28170477705_b273a32a02_o.jpg,0.28125,0.25,0.84375,1.0,443,837,https://www.flickr.com/photos/brighton/28170477705,https://creativecommons.org/licenses/by/2.0/,Jim Linwood,https://www.flickr.com/people/brighton/\n8ebc8cec7101f303,https://c1.staticflickr.com/1/377/32141992950_567a87bb34_o.jpg,0.28125,0.0,0.84375,0.75,437,823,https://www.flickr.com/photos/moto_club4ag/32141992950,https://creativecommons.org/licenses/by/2.0/,Moto &quot;Club4AG&quot; Miwa,https://www.flickr.com/people/moto_club4ag/\n80263724e6cdce6b,https://c1.staticflickr.com/8/7570/26498125284_c342337f37_o.jpg,0.0,0.0,0.494868035191,0.75,780,219,https://www.flickr.com/photos/thoseguys119/26498125284,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\naf523031bd895ae8,https://c1.staticflickr.com/9/8600/28793857501_c0863b5e6a_o.jpg,0.0,0.0,0.561569688769,1.0,582,895,https://www.flickr.com/photos/lwpkommunikacio/28793857501,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\n6122da83df7830ea,https://c1.staticflickr.com/6/5280/30055432155_c1bd11386d_o.jpg,0.0,0.24882629108,1.0,1.0,407,656,https://www.flickr.com/photos/eltb/30055432155,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n96d24344662221e3,https://c1.staticflickr.com/6/5517/30906480590_471cbb3712_o.jpg,0.249631811487,0.25,0.748895434462,1.0,402,486,https://flickr.com/26777097@N03/30906480590,https://creativecommons.org/licenses/by/2.0/,Jan Hammershaug,https://www.flickr.com/people/hammershaug/\n38bb1b6eaf964555,https://c1.staticflickr.com/8/7430/27393709643_ff6f6dd94f_o.jpg,0.0,0.25,0.5625,1.0,875,647,https://www.flickr.com/photos/69203347@N03/27393709643,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\nd7174b9e051bcd3a,https://c1.staticflickr.com/6/5604/31129861554_456b3017a0_o.jpg,0.25,0.25,1.0,1.0,497,790,https://www.flickr.com/photos/rodrigoparedes/31129861554,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/\ne1b5ee712df8da6e,https://c1.staticflickr.com/6/5349/29903541543_11f6d9e511_o.jpg,0.331130690162,0.0,0.993392070485,1.0,310,65,https://flickr.com/141324643@N05/29903541543,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/\n0f456984116da83d,https://c1.staticflickr.com/6/5569/30472788684_c93eccc262_o.jpg,0.0,0.25,0.5,1.0,479,504,https://flickr.com/21178495@N06/30472788684,https://creativecommons.org/licenses/by/2.0/,Tiago Cassol  Schvarstzhaupt,https://www.flickr.com/people/eletrosonico/\n2854711a9c3f6af3,https://c1.staticflickr.com/1/437/32606040886_96d990e698_o.jpg,0.323406040268,0.0,0.970218120805,0.75,204,742,https://flickr.com/10390868@N07/32606040886,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\nd0e1684c86af2b7e,https://c1.staticflickr.com/9/8507/29618228806_b2b7b2e31d_o.jpg,0.172413793103,0.0,1.0,1.0,318,165,https://www.flickr.com/photos/gails_pictures/29618228806/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n2b5debaf5ede2df6,https://c1.staticflickr.com/9/8307/29147694073_c9066a082c_o.jpg,0.0,0.25,0.5,1.0,977,551,https://www.flickr.com/photos/cosmicherb70/29147694073,https://creativecommons.org/licenses/by/2.0/,Chris Combe,https://www.flickr.com/people/cosmicherb70/\n27e9d57623e1a427,https://c1.staticflickr.com/8/7348/27303616163_cdb7f436db_o.jpg,0.0,0.0,0.5,0.75,896,595,https://www.flickr.com/photos/armydre2008/27303616163,https://creativecommons.org/licenses/by/2.0/,frankieleon,https://www.flickr.com/people/armydre2008/\n12b9c1e328276b63,https://c1.staticflickr.com/1/283/30781645604_c07ca7beb6_o.jpg,0.0,0.0,0.662261380323,1.0,704,732,https://www.flickr.com/photos/sybarite48/30781645604,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\ne35a62cecba4f329,https://c1.staticflickr.com/9/8707/29138838834_7237dfc169_o.jpg,0.28125,0.25,0.84375,1.0,131,498,https://www.flickr.com/photos/rainsong/29138838834/,https://creativecommons.org/licenses/by/2.0/,Ali - \\330\\271\\331\\204\\331\\212 from Riyadh - \\331\\205\\331\\206 \\330\\247\\331\\204\\330\\261\\331\\212\\330\\247\\330\\266,https://www.flickr.com/people/rainsong/\nf631571777573628,https://c1.staticflickr.com/1/716/31783715436_e368df4fcb_o.jpg,0.25,0.0,1.0,1.0,309,122,https://flickr.com/86548370@N00/31783715436,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nee79e46544264524,https://c1.staticflickr.com/1/595/32502011735_edfbc2a2cc_o.jpg,0.420238095238,0.0,1.0,0.75,760,445,https://www.flickr.com/photos/51764518@N02/32502011735,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n5a68669994383786,https://c1.staticflickr.com/6/5344/31176239492_26175d67de_o.jpg,0.0,0.25,0.5625,1.0,933,113,https://www.flickr.com/photos/qubodup/31176239492,https://creativecommons.org/licenses/by/2.0/,Iwan Gabovitch,https://www.flickr.com/people/qubodup/\n40fcc76e432b01fc,https://c1.staticflickr.com/8/7348/26492514804_df88f4402f_o.jpg,0.468844984802,0.25,1.0,1.0,459,819,https://www.flickr.com/photos/atoach/26492514804,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\nd9771ae7f74f08d9,https://c1.staticflickr.com/8/7538/26220445614_2c9293e39f_o.jpg,0.501840942563,0.0,1.0,0.75,971,440,https://www.flickr.com/photos/bravenboer/26220445614,https://creativecommons.org/licenses/by/2.0/,Martin Bravenboer,https://www.flickr.com/people/bravenboer/\nf0e41c05fd793215,https://c1.staticflickr.com/9/8594/27720860714_308330cbc1_o.jpg,0.28125,0.25,0.84375,1.0,975,728,https://www.flickr.com/photos/jsjgeology/27720860714,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n3866d9b7432dbfc4,https://c1.staticflickr.com/8/7687/26333540933_2a3273b6fc_o.jpg,0.4375,0.0,1.0,0.75,981,832,https://www.flickr.com/photos/usdagov/26333540933,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\nc5b76cf4305f173e,https://c1.staticflickr.com/9/8759/28422226950_1e746485e7_o.jpg,0.0,0.25,0.5625,1.0,699,541,https://www.flickr.com/photos/wlappe/28422226950,https://creativecommons.org/licenses/by/2.0/,Wilhelm Lappe,https://www.flickr.com/people/wlappe/\nfe91741b82eba4ec,https://c1.staticflickr.com/8/7591/26984514731_f6161a2b74_o.jpg,0.27268683274,0.0,1.0,0.75,348,893,https://www.flickr.com/photos/lac-bac/26984514731,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/\n8895afed34028858,https://c1.staticflickr.com/9/8752/29854456230_c0a62d8b43_o.jpg,0.0,0.0,0.666666666667,1.0,561,624,https://flickr.com/100379608@N08/29854456230,https://creativecommons.org/licenses/by/2.0/,Bob Gibbs,https://www.flickr.com/people/100379608@N08/\n3ffba53e459caaf0,https://c1.staticflickr.com/1/392/32227854771_97ebf12169_o.jpg,0.0,0.0,0.570472440945,0.75,760,561,https://www.flickr.com/photos/51764518@N02/32227854771,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\nfc87ccf8b9ada033,https://c1.staticflickr.com/8/7322/28153022261_d3b6fff8bb_o.jpg,0.0,0.0,0.642140468227,0.75,761,162,https://www.flickr.com/photos/lge/28153022261,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n4b519a84a5a4c30e,https://c1.staticflickr.com/1/398/32183446082_fe56889da6_o.jpg,0.25,0.379310344828,1.0,1.0,95,132,http://www.flickr.com/photos/winnu/32183446082/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/\nea9f35646c8e9570,https://c1.staticflickr.com/9/8887/28306146124_218779fb16_o.jpg,0.497426470588,0.25,0.994852941176,1.0,820,978,https://www.flickr.com/photos/agenciabrasilia/28306146124,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n3cb4532bf414a515,https://c1.staticflickr.com/8/7450/27167741494_a38db3eefb_o.jpg,0.0,0.25,0.478354978355,1.0,821,402,https://www.flickr.com/photos/jsjgeology/27167741494,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nb675bbcced4c7bd8,https://c1.staticflickr.com/1/735/31769630380_fa3864b703_o.jpg,0.28125,0.0,0.84375,0.75,661,633,https://www.flickr.com/photos/oregondot/31769630380,https://creativecommons.org/licenses/by/2.0/,Oregon Department of Transportation,https://www.flickr.com/people/oregondot/\nd5692729bde701c6,https://c1.staticflickr.com/9/8139/28497848343_72d335efb4_o.jpg,0.281690140845,0.0,0.845070422535,0.75,459,784,https://www.flickr.com/photos/22711505@N05/28497848343,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n9639607d0fed2e8c,https://c1.staticflickr.com/9/8743/28077310474_36d02b9b23_o.jpg,0.25,0.0,1.0,1.0,980,906,https://www.flickr.com/photos/dimsis/28077310474,https://creativecommons.org/licenses/by/2.0/,Dimitris Siskopoulos,https://www.flickr.com/people/dimsis/\n3956b14e795bc466,https://c1.staticflickr.com/8/7280/27238395594_48a46ae600_o.jpg,0.5,0.25,1.0,1.0,820,266,https://www.flickr.com/photos/newsoresund/27238395594,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/\n17fc25caafb04f5d,https://c1.staticflickr.com/3/2926/32052890643_0862b1e3e3_o.jpg,0.254464285714,0.0,0.763392857143,0.75,80,644,https://www.flickr.com/photos/52450054@N04/32052890643,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n86e2cc9ff257a089,https://c1.staticflickr.com/8/7565/27031249106_22ae20bcc3_o.jpg,0.0,0.0,0.5625,0.75,821,232,https://www.flickr.com/photos/jsjgeology/27031249106,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\na96da51ddd63adfb,https://c1.staticflickr.com/9/8309/29816474492_54dbf0451b_o.jpg,0.25,0.25,0.75,1.0,459,538,https://www.flickr.com/photos/discoveroregon/29816474492/,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n78f2d589ebd4366c,https://c1.staticflickr.com/9/8760/28248937781_7682c21dc7_o.jpg,0.498159057437,0.25,0.996318114875,1.0,50,933,https://www.flickr.com/photos/zigazou76/28248937781,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\nd22af1dfeeb82555,https://c1.staticflickr.com/9/8491/29274401565_47e2e93c9f_o.jpg,0.0,0.25,0.645728643216,1.0,821,148,https://www.flickr.com/photos/60900612@N08/29274401565/,https://creativecommons.org/licenses/by/2.0/,Thomas&#x27;s Pics,https://www.flickr.com/people/60900612@N08/\naa9ff9f26c5d938f,https://c1.staticflickr.com/9/8720/27576217074_2538cf4529_o.jpg,0.5,0.0,1.0,0.75,810,506,https://www.flickr.com/photos/o_0/27576217074,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\nd19c8dfe7292aaf4,https://c1.staticflickr.com/9/8607/28004811134_46c4e6009f_o.jpg,0.4375,0.0,1.0,0.75,780,241,https://www.flickr.com/photos/thoseguys119/28004811134,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nfa3b98f68a4b7a37,https://c1.staticflickr.com/8/7376/27855995961_caa986046b_o.jpg,0.5,0.0,1.0,0.75,519,396,https://www.flickr.com/photos/box_repsol/27855995961,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\nd56b109bb8dd4006,https://c1.staticflickr.com/8/7429/26441907504_d37123f1a3_o.jpg,0.28125,0.25,0.84375,1.0,437,897,https://www.flickr.com/photos/nzcarfreak/26441907504,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\n173b3f63e7674dcc,https://c1.staticflickr.com/1/248/30675681254_a0975d6aa7_o.jpg,0.317068106312,0.0,0.951204318937,0.75,459,517,https://www.flickr.com/photos/22711505@N05/30675681254,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n85ec66858f670b92,https://c1.staticflickr.com/6/5771/30868515665_34b1b54cd2_o.jpg,0.0,0.333333333333,1.0,1.0,782,521,https://www.flickr.com/photos/usarak/30868515665,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/\n8c2c05db689e26d5,https://c1.staticflickr.com/6/5789/30302273482_0138e2e3d1_o.jpg,0.0,0.25,0.497426470588,1.0,379,349,https://flickr.com/38305988@N08/30302273482,https://creativecommons.org/licenses/by/2.0/,ilouque,https://www.flickr.com/people/ilouque/\n2576ac80d7c2a215,https://c1.staticflickr.com/8/7065/26234783973_a7aa088e9f_o.jpg,0.498159057437,0.25,0.996318114875,1.0,443,565,https://www.flickr.com/photos/ajhanson/26234783973/,https://creativecommons.org/licenses/by/2.0/,Alex Hanson,https://www.flickr.com/people/ajhanson/\n61cb5847bb51a894,https://c1.staticflickr.com/9/8070/28413609294_663087dccc_o.jpg,0.28125,0.25,0.84375,1.0,899,601,https://www.flickr.com/photos/jeepersmedia/28413609294,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n38e63155310eb242,https://c1.staticflickr.com/6/5569/30623556255_26e988b5d2_o.jpg,0.245614035088,0.0,0.736842105263,0.75,918,516,https://www.flickr.com/photos/chrstphre/30623556255/,https://creativecommons.org/licenses/by/2.0/,chrstphr\\303\\251  c\\303\\246mpb\\303\\253ll,https://www.flickr.com/people/chrstphre/\n7c8a0f9661c6d7bf,https://c1.staticflickr.com/9/8438/29248787301_32eb8b5100_o.jpg,0.25,0.5,1.0,1.0,304,34,https://www.flickr.com/photos/vahemart/29248787301,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\n82996d5a78866f57,https://c1.staticflickr.com/8/7520/27663225994_7ebc3bc3b8_o.jpg,0.0,0.0,0.666666666667,1.0,563,569,https://www.flickr.com/photos/harshlight/27663225994,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\n7b2da05adcfd033f,https://c1.staticflickr.com/8/7354/27532748786_ccf1cc75a0_o.jpg,0.25,0.25,0.75,1.0,556,834,https://flickr.com/64000826@N08/27532748786,https://creativecommons.org/licenses/by/2.0/,Fort George G. Meade Public Affairs Office,https://www.flickr.com/people/ftmeade/\n208d350e55a8e26a,https://c1.staticflickr.com/8/7083/27891386595_2e044e666f_o.jpg,0.275310834813,0.25,1.0,1.0,931,563,https://www.flickr.com/photos/70253321@N00/27891386595/,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/\n1980d25958fdcf64,https://c1.staticflickr.com/9/8623/30499709501_d68b8f14e1_o.jpg,0.25,0.25,0.75,1.0,992,983,https://www.flickr.com/photos/mpa/30499709501,https://creativecommons.org/licenses/by/2.0/,marissa anderson,https://www.flickr.com/people/mpa/\n800da7030f9f9460,https://c1.staticflickr.com/8/7020/26905189152_463ac81ab7_o.jpg,0.25,0.25,1.0,1.0,418,577,https://www.flickr.com/photos/inmobili-ariascamargo/26905189152,https://creativecommons.org/licenses/by/2.0/,Quelverd Arias Camargo,https://www.flickr.com/people/inmobili-ariascamargo/\nf28750fef7ca6e6b,https://c1.staticflickr.com/1/564/32417091736_afa3720e68_o.jpg,0.25,0.350840336134,1.0,1.0,498,565,https://www.flickr.com/photos/iainmerchant/32417091736,https://creativecommons.org/licenses/by/2.0/,Iain Merchant,https://www.flickr.com/people/iainmerchant/\nac6e0c07c374d5d3,https://c1.staticflickr.com/9/8360/29038177971_c2f67450a5_o.jpg,0.4375,0.0,1.0,0.75,816,831,https://www.flickr.com/photos/fdecomite/29038177971,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\n5a62711d5e0f0adc,https://c1.staticflickr.com/6/5814/31208269065_c74e126cd2_o.jpg,0.28125,0.0,0.84375,0.75,145,102,https://www.flickr.com/photos/rickmccharles/31208269065/,https://creativecommons.org/licenses/by/2.0/,Rick McCharles,https://www.flickr.com/people/rickmccharles/\n8cbe44c97ed45f34,https://c1.staticflickr.com/6/5501/30759666341_3fe99784c2_o.jpg,0.25,0.25,0.75,1.0,702,864,https://www.flickr.com/photos/texaus1/30759666341/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/\n9f9fc4d6c6c6fcfa,https://c1.staticflickr.com/9/8214/29925814991_2d4e3cb227_o.jpg,0.0,0.25,0.5625,1.0,975,353,https://www.flickr.com/photos/jsjgeology/29925814991,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n7287b9b362cc61a5,https://c1.staticflickr.com/6/5615/30584920006_a157ecd0b3_o.jpg,0.0,0.0,1.0,0.799676898223,664,467,https://www.flickr.com/photos/aforero/30584920006/,https://creativecommons.org/licenses/by/2.0/,Alejandro Forero Cuervo,https://www.flickr.com/people/aforero/\ndd1560fbd6119b61,https://c1.staticflickr.com/8/7445/28073276775_e6edfd3eea_o.jpg,0.0,0.488702623907,0.75,0.977405247813,308,994,https://www.flickr.com/photos/52450054@N04/28073276775,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n12d50502e2fb1911,https://c1.staticflickr.com/8/7364/26690521483_fe62c1021e_o.jpg,0.28125,0.0,0.84375,0.75,931,89,https://www.flickr.com/photos/sixteenmilesofstring/26690521483,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/\n05b5f69b956e07ee,https://c1.staticflickr.com/8/7331/27718146426_acc324f39e_o.jpg,0.5,0.0,1.0,0.75,405,734,https://www.flickr.com/photos/zengame/27718146426,https://creativecommons.org/licenses/by/2.0/,Zengame,https://www.flickr.com/people/zengame/\n5e35a9a011f89f3b,https://c1.staticflickr.com/6/5801/30056220132_290c8bb742_o.jpg,0.25,0.25,1.0,1.0,479,946,https://www.flickr.com/photos/glorycycles/30056220132,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n0bd1babfde3be2ec,https://c1.staticflickr.com/8/7461/27449105252_fc95c9db86_o.jpg,0.0,0.0,0.822950819672,1.0,17,144,https://www.flickr.com/photos/nrgoodrum/27449105252,https://creativecommons.org/licenses/by/2.0/,nick goodrum,https://www.flickr.com/people/nrgoodrum/\nf21fbc874dfea6b9,https://c1.staticflickr.com/8/7339/26410545204_5871fede9f_o.jpg,0.25,0.0,0.75,0.75,787,891,https://www.flickr.com/photos/heartfullofpoison/26410545204,https://creativecommons.org/licenses/by/2.0/,The  Dark Veil \\342\\200\\240,https://www.flickr.com/people/heartfullofpoison/\n998c0550e278f26c,https://c1.staticflickr.com/8/7473/30059928211_7dfebe4b5e_o.jpg,0.28125,0.25,0.84375,1.0,749,524,https://www.flickr.com/photos/leo_nghinphu/30059928211,https://creativecommons.org/licenses/by/2.0/,Leo Chu\\341\\273\\221i,https://www.flickr.com/people/leo_nghinphu/\n003c056cf6b2aeae,https://c1.staticflickr.com/9/8769/29494200112_e7340ceec0_o.jpg,0.5,0.25,1.0,1.0,972,126,https://www.flickr.com/photos/136477533@N06/29494200112,https://creativecommons.org/licenses/by/2.0/,Thijs Paanakker,https://www.flickr.com/people/136477533@N06/\n02122859268d46a1,https://c1.staticflickr.com/8/7325/26815306694_a93f8fdb6a_o.jpg,0.0,0.0,0.663235294118,1.0,459,959,https://www.flickr.com/photos/agenciabrasilia/26815306694/,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\nf318efdfc1370cef,https://c1.staticflickr.com/9/8379/29645869986_b72f6403b5_o.jpg,0.0,0.25,0.75,1.0,292,385,https://www.flickr.com/photos/usfwshq/29645869986,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/\n648eeec8e7b78aa2,https://c1.staticflickr.com/9/8305/29282103545_b2fc595083_o.jpg,0.4375,0.25,1.0,1.0,975,882,https://flickr.com/47445767@N05/29282103545,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n3b80464e9583378b,https://c1.staticflickr.com/9/8766/29236005783_3fdc7abf90_o.jpg,0.208445491252,0.25,0.625336473755,1.0,848,860,https://www.flickr.com/photos/22711505@N05/29236005783,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n4163f4caf249e8c4,https://c1.staticflickr.com/9/8376/29803639452_8bb391459a_o.jpg,0.0,0.25,0.421177266576,1.0,459,62,https://www.flickr.com/photos/mecklenburg/29803639452,https://creativecommons.org/licenses/by/2.0/,Thomas Kohler,https://www.flickr.com/people/mecklenburg/\n3a46c9b0fe7d0f79,https://c1.staticflickr.com/8/7431/26667704324_73456373fa_o.jpg,0.25,0.0,0.75,0.75,699,541,https://www.flickr.com/photos/estudiante/26667704324,https://creativecommons.org/licenses/by/2.0/,Dan,https://www.flickr.com/people/estudiante/\n1755ddf241af4505,https://c1.staticflickr.com/9/8754/28164380572_da2f005d20_o.jpg,0.0,0.25,0.496696035242,1.0,484,546,https://www.flickr.com/photos/sybarite48/28164380572,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\nd934102016d20d52,https://c1.staticflickr.com/6/5039/29311889333_3d2d3c1e8b_o.jpg,0.250319284802,0.0,0.750957854406,1.0,405,838,https://www.flickr.com/photos/dosenphoto/29311889333,https://creativecommons.org/licenses/by/2.0/,DosenPhoto,https://www.flickr.com/people/dosenphoto/\n5d62e7027cfe4925,https://c1.staticflickr.com/9/8625/28712984370_3417f7b09c_o.jpg,0.484655688623,0.25,1.0,1.0,563,569,https://www.flickr.com/photos/governosp/28712984370/,https://creativecommons.org/licenses/by/2.0/,Governo do Estado de S\\303\\243o Paulo,https://www.flickr.com/people/governosp/\na52b3d711260e805,https://c1.staticflickr.com/1/583/32388002131_01e25b39ef_o.jpg,0.0,0.0,0.75,1.0,650,935,https://www.flickr.com/photos/nat507/32388002131,https://creativecommons.org/licenses/by/2.0/,Nathan Hughes Hamilton,https://www.flickr.com/people/nat507/\n94d0d06e8e109684,https://c1.staticflickr.com/9/8284/28947671403_93432a40db_o.jpg,0.578822733424,0.0,1.0,0.75,418,582,https://www.flickr.com/photos/blmnevada/28947671403/,https://creativecommons.org/licenses/by/2.0/,BLM Nevada,https://www.flickr.com/people/blmnevada/\n4aaf5c978d0bb204,https://c1.staticflickr.com/8/7288/27554544452_771239fc26_o.jpg,0.0,0.25,0.645728643216,1.0,672,170,https://www.flickr.com/photos/22711505@N05/27554544452,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n4fb6733e39dc9cfb,https://c1.staticflickr.com/6/5327/30092850412_50359bfc62_o.jpg,0.0,0.0,0.437586206897,0.75,816,257,https://www.flickr.com/photos/picturepursuit/30092850412,https://creativecommons.org/licenses/by/2.0/,ashish saswadkar,https://www.flickr.com/people/picturepursuit/\n5608f0c330dc494c,https://c1.staticflickr.com/6/5550/29931437273_4bf9a574a8_o.jpg,0.0,0.0,0.710806697108,1.0,512,696,https://www.flickr.com/photos/andreboeni/29931437273,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\na55b22ca0a780465,https://c1.staticflickr.com/8/7645/27723860481_2c970a78b6_o.jpg,0.256744604317,0.25,1.0,1.0,309,300,https://www.flickr.com/photos/35142635@N05/27723860481,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\n72248dbfe2d1d1e8,https://c1.staticflickr.com/9/8490/28800314540_dff1cc6a56_o.jpg,0.28125,0.0,0.84375,0.75,826,111,https://www.flickr.com/photos/12394349@N06/28800314540,https://creativecommons.org/licenses/by/2.0/,Bryn Pinzgauer,https://www.flickr.com/people/12394349@N06/\n5389a1eead466376,https://c1.staticflickr.com/9/8357/28872219474_8fc245ebcc_o.jpg,0.248713235294,0.25,0.746139705882,1.0,570,707,https://www.flickr.com/photos/agenciabrasilia/28872219474,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n4b0428d9db2b4c9d,https://c1.staticflickr.com/6/5582/30804988505_d2bbba8f2b_o.jpg,0.278188180404,0.0,0.834564541213,0.75,20,605,https://www.flickr.com/photos/kjfnjy/30804988505,https://creativecommons.org/licenses/by/2.0/,Ken and Nyetta,https://www.flickr.com/people/kjfnjy/\n504df132be02269c,https://c1.staticflickr.com/8/7192/26711386690_df438beaa1_o.jpg,0.0,0.0,0.666666666667,1.0,848,837,https://www.flickr.com/photos/7armyjmtc/26711386690,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n67fca6cfaddf27a2,https://c1.staticflickr.com/9/8353/29273681124_4afe777c50_o.jpg,0.314256198347,0.0,0.942768595041,0.75,327,373,https://www.flickr.com/photos/jlcernadas/29273681124,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\nc155b7769c861c84,https://c1.staticflickr.com/9/8720/28278086872_bee2b13d6c_o.jpg,0.0,0.0,0.5,0.75,976,248,https://www.flickr.com/photos/o_0/28278086872,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\neb05a6e535dc1fd2,https://c1.staticflickr.com/6/5497/29889387963_9e671b5095_o.jpg,0.5,0.0,1.0,0.75,405,632,https://www.flickr.com/photos/levien66/29889387963/,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/\nd199ca1974153643,https://c1.staticflickr.com/1/674/32794109632_fc07f9fa12_o.jpg,0.0,0.0,0.666666666667,1.0,830,983,https://www.flickr.com/photos/andreastrojak/32794109632/,https://creativecommons.org/licenses/by/2.0/,Andreas Trojak,https://www.flickr.com/people/andreastrojak/\nac6fb643c41cc4ca,https://c1.staticflickr.com/8/7370/27290719733_f11530ee33_o.jpg,0.498153618907,0.25,1.0,1.0,407,870,https://www.flickr.com/photos/eltb/27290719733,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nc63221f76cec0a93,https://c1.staticflickr.com/8/7514/28487192012_67c3b07b59_o.jpg,0.217975206612,0.25,0.653925619835,1.0,542,798,https://www.flickr.com/photos/donaldjudge/28487192012,https://creativecommons.org/licenses/by/2.0/,Donald Judge,https://www.flickr.com/people/donaldjudge/\n72497df63e83f849,https://c1.staticflickr.com/8/7400/27985558622_3d5f02cfbf_o.jpg,0.0,0.121827411168,1.0,1.0,880,686,https://www.flickr.com/photos/fand_photography/27985558622,https://creativecommons.org/licenses/by/2.0/,Fan  D,https://www.flickr.com/people/fand_photography/\n378695a059974e60,https://c1.staticflickr.com/6/5791/31129149785_65fc745f99_o.jpg,0.210588633288,0.0,0.631765899865,0.75,650,906,https://www.flickr.com/photos/enez35/31129149785/,https://creativecommons.org/licenses/by/2.0/,Jean-Michel Moullec,https://www.flickr.com/people/enez35/\n70f9b30de479eff7,https://c1.staticflickr.com/1/267/31246794594_e398ae6022_o.jpg,0.0,0.285496183206,1.0,1.0,442,746,https://www.flickr.com/photos/ruthanddave/31246794594,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n8625147470d9de41,https://c1.staticflickr.com/8/7182/26911591696_7a588e548a_o.jpg,0.5,0.0,1.0,0.75,982,879,https://www.flickr.com/photos/mindahaas/26911591696,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/\ndd437845995bde0e,https://c1.staticflickr.com/9/8169/29829179572_d8a4f02421_o.jpg,0.0,0.25,0.5625,1.0,707,855,https://www.flickr.com/photos/seattleparks/29829179572,https://creativecommons.org/licenses/by/2.0/,Seattle Parks,https://www.flickr.com/people/seattleparks/\n8d84bc4e09806502,https://c1.staticflickr.com/9/8800/28419050580_eef8d9a4ac_o.jpg,0.248713235294,0.0,0.746139705882,0.75,896,858,https://www.flickr.com/photos/thenationalguard/28419050580,https://creativecommons.org/licenses/by/2.0/,The National Guard,https://www.flickr.com/people/thenationalguard/\ncbd9875f2249282e,https://c1.staticflickr.com/9/8726/28291254775_ba96651168_o.jpg,0.333333333333,0.0,1.0,1.0,548,422,https://www.flickr.com/photos/chaz_pics/28291254775/,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\nfe5ee84e6897bc4c,https://c1.staticflickr.com/8/7784/28775568452_580f596543_o.jpg,0.0,0.25,0.497426470588,1.0,848,721,https://www.flickr.com/photos/oregonmildep/28775568452/,https://creativecommons.org/licenses/by/2.0/,Oregon National Guard,https://www.flickr.com/people/oregonmildep/\nffd75e49a6c6cb04,https://c1.staticflickr.com/1/606/31383944361_c628579db1_o.jpg,0.255395683453,0.25,1.0,1.0,638,946,https://www.flickr.com/photos/13476480@N07/31383944361,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nf91efff38d3c0cfe,https://c1.staticflickr.com/8/7253/26812232304_f1008402af_o.jpg,0.0,0.0,0.723502304147,1.0,635,164,https://www.flickr.com/photos/mtacc-esa/26812232304,https://creativecommons.org/licenses/by/2.0/,MTA Capital Construction Mega Projects,https://www.flickr.com/people/mtacc-esa/\n61c2ed7c5aa4bda1,https://c1.staticflickr.com/9/8394/29963567071_b189048b9d_o.jpg,0.0,0.0,0.5625,0.75,410,494,https://www.flickr.com/photos/ands78/29963567071,https://creativecommons.org/licenses/by/2.0/,ands78,https://www.flickr.com/people/ands78/\nf8d2a8a2cd0f3a0b,https://c1.staticflickr.com/9/8279/28317574234_27b5f730bd_o.jpg,0.0,0.0,0.75,0.75,979,850,https://www.flickr.com/photos/muraterturk/28317574234,https://creativecommons.org/licenses/by/2.0/,Murat Ert\\303\\274rk,https://www.flickr.com/people/muraterturk/\nf2f9d5a3d8285aaa,https://c1.staticflickr.com/6/5448/29959463670_8b1be9965b_o.jpg,0.25,0.25,1.0,1.0,693,602,https://www.flickr.com/photos/mrsdkrebs/29959463670/,https://creativecommons.org/licenses/by/2.0/,Denise Krebs,https://www.flickr.com/people/mrsdkrebs/\ne43946ff747a33b3,https://c1.staticflickr.com/6/5707/30270819836_bd9df436a0_o.jpg,0.25,0.237607758621,1.0,0.712823275862,918,565,https://www.flickr.com/photos/12832008@N04/30270819836,https://creativecommons.org/licenses/by/2.0/,Bryan Ward,https://www.flickr.com/people/12832008@N04/\nb996815182342f86,https://c1.staticflickr.com/8/7600/28264012902_25bd77bf9f_o.jpg,0.25,0.25,0.75,1.0,405,554,https://www.flickr.com/photos/aphid00/28264012902/,https://creativecommons.org/licenses/by/2.0/,Dave Sizer,https://www.flickr.com/people/aphid00/\n56dd80dbd1fceb2b,https://c1.staticflickr.com/8/7386/27921034445_f14f8576bb_o.jpg,0.0,0.251353790614,0.75,1.0,290,411,https://flickr.com/37804979@N00/27921034445,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n8daad6acac9c637d,https://c1.staticflickr.com/1/405/32646439546_7f61719a2b_o.jpg,0.339207048458,0.0,1.0,1.0,480,704,https://www.flickr.com/photos/134741223@N04/32646439546,https://creativecommons.org/licenses/by/2.0/,Paulius Malinovskis,https://www.flickr.com/people/134741223@N04/\n4bfcefcad83f0b72,https://c1.staticflickr.com/1/388/31927294034_424182e511_o.jpg,0.25,0.0,0.75,0.75,868,257,https://www.flickr.com/photos/76969036@N02/31927294034,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n69002cbe14c5cc6c,https://c1.staticflickr.com/8/7492/27496341713_bbd60a8234_o.jpg,0.500736377025,0.0,1.0,0.75,434,22,https://www.flickr.com/photos/familymwr/27496341713,https://creativecommons.org/licenses/by/2.0/,U.S. Army,https://www.flickr.com/people/familymwr/\n5982d677296085ef,https://c1.staticflickr.com/8/7372/26784300650_b171ec4a7e_o.jpg,0.362193362193,0.0,1.0,1.0,309,418,https://www.flickr.com/photos/42244964@N03/26784300650,https://creativecommons.org/licenses/by/2.0/,Frank Vassen,https://www.flickr.com/people/42244964@N03/\n9a809d620d80929e,https://c1.staticflickr.com/9/8013/28715757904_4440ee78f1_o.jpg,0.0,0.0,0.433722527473,0.75,830,461,https://www.flickr.com/photos/robdammers/28715757904,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n5b3de4b8bf838dc7,https://c1.staticflickr.com/9/8468/28976195970_a2fd8c51db_o.jpg,0.0,0.0,0.439520958084,1.0,416,306,https://flickr.com/77551055@N00/28976195970,https://creativecommons.org/licenses/by/2.0/,Nick Hubbard,https://www.flickr.com/people/nickhubbard/\n08d0efde3accd444,https://c1.staticflickr.com/1/328/31708424581_ab48beb40e_o.jpg,0.0,0.0,1.0,0.666666666667,956,931,https://flickr.com/64586261@N02/31708424581,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n9955f022d4ee93c4,https://c1.staticflickr.com/1/605/31884150595_ec27e4c2c2_o.jpg,0.0,0.0,0.560452418097,0.75,970,948,https://www.flickr.com/photos/theocrazzolara/31884150595/,https://creativecommons.org/licenses/by/2.0/,Theo Crazzolara,https://www.flickr.com/people/theocrazzolara/\nb7dc7340063f7b69,https://c1.staticflickr.com/8/7607/26998711456_d9309964d2_o.jpg,0.491071428571,0.25,1.0,1.0,405,960,https://flickr.com/34200064@N08/26998711456,https://creativecommons.org/licenses/by/2.0/,Aero Pixels,https://www.flickr.com/people/levien66/\n2188f85066df06cf,https://c1.staticflickr.com/9/8428/28734323122_3ed894966c_o.jpg,0.288292253521,0.0,1.0,0.75,133,238,https://www.flickr.com/photos/navaneethkn/28734323122,https://creativecommons.org/licenses/by/2.0/,Navaneeth KN,https://www.flickr.com/people/navaneethkn/\n41f32af105cda09e,https://c1.staticflickr.com/9/8687/28783232052_2e1c281cde_o.jpg,0.0,0.0,0.5625,0.75,459,586,https://www.flickr.com/photos/londonmatt/28783232052,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\nf718eba111750d6b,https://c1.staticflickr.com/8/7596/27194747033_75665e3472_o.jpg,0.0,0.0,0.75,1.0,826,865,https://www.flickr.com/photos/jsjgeology/27194747033,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nb4b986457511f4e1,https://c1.staticflickr.com/4/3892/33151541576_ae00b19406_o.jpg,0.0,0.25,0.5,1.0,348,477,https://www.flickr.com/photos/usfwsmtnprairie/33151541576/,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n09e5dcdfcd57f556,https://c1.staticflickr.com/9/8657/29449199776_b68b34c62f_o.jpg,0.273978685613,0.0,1.0,0.75,402,606,https://flickr.com/146566355@N07/29449199776,https://creativecommons.org/licenses/by/2.0/,Reid Pinkham,https://www.flickr.com/people/reidpinkham/\n8eebfed494c53072,https://c1.staticflickr.com/8/7429/26261772924_d405e76b13_o.jpg,0.0,0.0,0.75,1.0,496,413,https://www.flickr.com/photos/shankaronline/26261772924,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nbda6cc14029884ab,https://c1.staticflickr.com/8/7798/27687355726_5f4099ecf2_o.jpg,0.0,0.0,0.5625,0.75,821,737,https://www.flickr.com/photos/jsjgeology/27687355726,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n8a7eb981c4fc0228,https://c1.staticflickr.com/6/5684/30299328084_1e944f5043_o.jpg,0.0,0.0,0.75,1.0,973,364,https://www.flickr.com/photos/jsjgeology/30299328084,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n1d58f139878c4c69,https://c1.staticflickr.com/1/635/30791620033_15f57a9056_o.jpg,0.486547085202,0.0,1.0,0.75,973,406,https://www.flickr.com/photos/guldem/30791620033,https://creativecommons.org/licenses/by/2.0/,G\\303\\274ldem \\303\\234st\\303\\274n,https://www.flickr.com/people/guldem/\n57f28dc94726d941,https://c1.staticflickr.com/8/7317/27617413431_3cbde473cd_o.jpg,0.258620689655,0.0,0.775862068966,0.75,459,991,https://www.flickr.com/photos/mtaphotos/27617413431,https://creativecommons.org/licenses/by/2.0/,Metropolitan Transportation Authority of the State of New York,https://www.flickr.com/people/mtaphotos/\n347569208b3ed636,https://c1.staticflickr.com/9/8188/28576830912_61e0c27c6f_o.jpg,0.25,0.25,1.0,1.0,699,7,https://www.flickr.com/photos/eaviles/28576830912/,https://creativecommons.org/licenses/by/2.0/,Edgardo Avil\\303\\251s-L\\303\\263pez,https://www.flickr.com/people/eaviles/\n83d13b8d51027bf4,https://c1.staticflickr.com/8/7250/26951359202_8047412582_o.jpg,0.438671875,0.0,1.0,0.75,968,462,https://www.flickr.com/photos/133267756@N03/26951359202,https://creativecommons.org/licenses/by/2.0/,GastroyPolitica By FB,https://www.flickr.com/people/133267756@N03/\n72734737ec7c8fe7,https://c1.staticflickr.com/8/7053/26571375504_a6d21e97b5_o.jpg,0.4375,0.25,1.0,1.0,950,903,https://www.flickr.com/photos/alfreddiem/26571375504,https://creativecommons.org/licenses/by/2.0/,weisserstier,https://www.flickr.com/people/alfreddiem/\nd070268f5a91fe9f,https://c1.staticflickr.com/9/8365/29475149362_82abccc4a4_o.jpg,0.25,0.0,0.75,0.75,973,614,https://www.flickr.com/photos/quinet/29475149362,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n71e8af9d2a1988bc,https://c1.staticflickr.com/8/7247/27267615940_656c0741ec_o.jpg,0.351794554455,0.0,0.703589108911,0.75,780,532,https://www.flickr.com/photos/thoseguys119/27267615940,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n7033d6df6bbaa215,https://c1.staticflickr.com/9/8651/27902480084_fe52febff6_o.jpg,0.281690140845,0.25,0.845070422535,1.0,313,391,https://www.flickr.com/photos/treegrow/27902480084/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n13e483428d2745b5,https://c1.staticflickr.com/9/8569/28363679020_bd9477018b_o.jpg,0.25,0.400242326333,1.0,1.0,443,31,https://flickr.com/24429508@N00/28363679020,https://creativecommons.org/licenses/by/2.0/,Ricardo Ricote Rodr\\303\\255guez,https://www.flickr.com/people/ricote/\na3867bee6ce78597,https://c1.staticflickr.com/8/7357/26848886496_86e9425b73_o.jpg,0.0,0.0,0.75117370892,1.0,490,809,https://www.flickr.com/photos/cogdog/26848886496/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n4e1753b82eb653f0,https://c1.staticflickr.com/6/5537/29760461864_f5d01fd478_o.jpg,0.286277602524,0.25,0.858832807571,1.0,536,409,https://www.flickr.com/photos/glorycycles/29760461864/,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n4327b7433fba451e,https://c1.staticflickr.com/6/5685/29881432846_dd785fb0c1_o.jpg,0.578822733424,0.25,1.0,1.0,418,940,https://www.flickr.com/photos/pavdw/29881432846/,https://creativecommons.org/licenses/by/2.0/,Paul VanDerWerf,https://www.flickr.com/people/pavdw/\n8b6f5223270a700a,https://c1.staticflickr.com/6/5466/30219527350_cf570c56ae_o.jpg,0.0,0.28125,0.75,0.84375,997,440,https://flickr.com/8558643@N06/30219527350,https://creativecommons.org/licenses/by/2.0/,Christophe Delaere,https://www.flickr.com/people/delaere/\n77c3221737498807,https://c1.staticflickr.com/1/548/30753625814_4f671ca952_o.jpg,0.0,0.440717628705,0.75,1.0,842,476,https://www.flickr.com/photos/spreadshirt/30753625814/,https://creativecommons.org/licenses/by/2.0/,Spreadshirt,https://www.flickr.com/people/spreadshirt/\n05572755761528f6,https://c1.staticflickr.com/6/5748/30899068750_0303b03d96_o.jpg,0.306766917293,0.0,1.0,1.0,512,249,https://www.flickr.com/photos/91807507@N03/30899068750/,https://creativecommons.org/licenses/by/2.0/,GPS 56,https://www.flickr.com/people/91807507@N03/\nce9c92ebce809cba,https://c1.staticflickr.com/9/8306/29931317495_dc2ceb9cf5_o.jpg,0.25,0.384217335058,1.0,0.768434670116,898,423,https://www.flickr.com/photos/lge/29931317495,https://creativecommons.org/licenses/by/2.0/,LG\\354\\240\\204\\354\\236\\220,https://www.flickr.com/people/lge/\n9b709088a2f03110,https://c1.staticflickr.com/6/5661/30813023595_f7a855839d_o.jpg,0.25,0.25,1.0,1.0,672,559,https://www.flickr.com/photos/glorycycles/30813023595,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\nc6a60dc9c86aadfd,https://c1.staticflickr.com/8/7319/27003333941_63eb2c5b46_o.jpg,0.0,0.0,0.741835147745,1.0,448,607,https://www.flickr.com/photos/kurdishstruggle/27003333941,https://creativecommons.org/licenses/by/2.0/,Kurdishstruggle,https://www.flickr.com/people/kurdishstruggle/\ndeec01858c086bda,https://c1.staticflickr.com/8/7552/26835726151_37be564abb_o.jpg,0.0,0.0,0.75,1.0,934,767,https://www.flickr.com/photos/jeepersmedia/26835726151,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nfe9abe86e0d88fda,https://c1.staticflickr.com/8/7423/27896777831_65214843c7_o.jpg,0.4375,0.0,1.0,0.75,964,501,https://www.flickr.com/photos/68147320@N02/27896777831,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\nd0b89e10cecb7aa0,https://c1.staticflickr.com/6/5546/30428322001_72cf79eeb2_o.jpg,0.333333333333,0.0,1.0,1.0,821,651,https://www.flickr.com/photos/robdammers/30428322001/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\nd25f61e1ea150da9,https://c1.staticflickr.com/8/7457/26914158412_6d19225acb_o.jpg,0.322436849926,0.0,1.0,1.0,986,725,https://www.flickr.com/photos/postmanpetecoluk/26914158412,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\n1be6ad048381c5c3,https://c1.staticflickr.com/8/7408/27389872095_09583ac9a2_o.jpg,0.701539338655,0.25,1.0,1.0,699,854,https://www.flickr.com/photos/springfeld/27389872095,https://creativecommons.org/licenses/by/2.0/,Udo Springfeld,https://www.flickr.com/people/springfeld/\n38d2d4a051c4efe3,https://c1.staticflickr.com/8/7059/27198260930_b1bfaf65f4_o.jpg,0.0,0.0,0.671794871795,0.75,507,452,https://www.flickr.com/photos/ipdegirl/27198260930,https://creativecommons.org/licenses/by/2.0/,Jenni C,https://www.flickr.com/people/ipdegirl/\n8f1441c5170fca94,https://c1.staticflickr.com/6/5727/31853067675_6005f4e27a_o.jpg,0.0,0.0,0.75,1.0,844,419,https://flickr.com/42814909@N00/31853067675,https://creativecommons.org/licenses/by/2.0/,notnef,https://www.flickr.com/people/fentonetal/\nd7c5128807020c2a,https://c1.staticflickr.com/1/636/32313145852_892cd2a4e6_o.jpg,0.346121416526,0.25,1.0,1.0,786,222,https://www.flickr.com/photos/izik/32313145852,https://creativecommons.org/licenses/by/2.0/,Isaac Wedin,https://www.flickr.com/people/izik/\n5f5e6433287436ac,https://c1.staticflickr.com/9/8636/28553423952_5c6d9e1361_o.jpg,0.0,0.0,0.508928571429,0.75,635,905,https://www.flickr.com/photos/rich701/28553423952,https://creativecommons.org/licenses/by/2.0/,Richard,https://www.flickr.com/people/rich701/\nd65932969a9e8803,https://c1.staticflickr.com/9/8016/28801988160_5c61d684dd_o.jpg,0.0,0.310344827586,1.0,1.0,310,914,https://www.flickr.com/photos/steve_childs/28801988160,https://creativecommons.org/licenses/by/2.0/,Steve Childs,https://www.flickr.com/people/steve_childs/\n51baf5e5f90f810c,https://c1.staticflickr.com/6/5457/30145431863_d316145b7d_o.jpg,0.0,0.0,0.254731861199,0.75,405,201,https://www.flickr.com/photos/hisgett/30145431863,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n53a2a10b08046bdd,https://c1.staticflickr.com/8/7424/27913666531_72b983437e_o.jpg,0.28125,0.0,0.84375,0.75,738,571,https://www.flickr.com/photos/jeepersmedia/27913666531,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\ncbfe39911750e709,https://c1.staticflickr.com/9/8582/30212230582_9326b0e59a_o.jpg,0.263416815742,0.25,1.0,1.0,739,568,https://www.flickr.com/photos/pagedooley/30212230582,https://creativecommons.org/licenses/by/2.0/,Kevin Dooley,https://www.flickr.com/people/pagedooley/\n3144b9b78f859d84,https://c1.staticflickr.com/9/8071/29613871671_a0719dd53c_o.jpg,0.25,0.25,0.75,1.0,972,230,https://www.flickr.com/photos/trocaire/29613871671/,https://creativecommons.org/licenses/by/2.0/,Trocaire,https://www.flickr.com/people/trocaire/\nd9e987a5da26eabf,https://c1.staticflickr.com/6/5805/31095472086_3e62d3f89b_o.jpg,0.28125,0.0,0.84375,0.75,669,654,https://www.flickr.com/photos/96223380@N02/31095472086,https://creativecommons.org/licenses/by/2.0/,Mighty Travels,https://www.flickr.com/people/96223380@N02/\n8e1f0785633f79cf,https://c1.staticflickr.com/8/7368/26952205554_83edefc43d_o.jpg,0.25,0.28125,1.0,0.84375,981,993,https://www.flickr.com/photos/usdagov/26952205554,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n595bc900aed081eb,https://c1.staticflickr.com/9/8780/28396201165_15d4dd4f48_o.jpg,0.475453172205,0.25,1.0,1.0,975,696,https://www.flickr.com/photos/jsjgeology/28396201165,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nb533bbcb401f917a,https://c1.staticflickr.com/6/5325/30568210361_161210d896_o.jpg,0.25,0.25,0.75,1.0,662,562,https://www.flickr.com/photos/42220226@N07/30568210361,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\n5ae47e362a9b8981,https://c1.staticflickr.com/1/571/32144012890_15d90da862_o.jpg,0.0,0.267938931298,0.75,0.803816793893,292,300,https://www.flickr.com/photos/happymillerman/32144012890,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\n571e5770023c1fbf,https://c1.staticflickr.com/1/87/30785181093_ed769fd36c_o.jpg,0.0,0.25,0.75,1.0,644,365,https://www.flickr.com/photos/home_of_chaos/30785181093/,https://creativecommons.org/licenses/by/2.0/,thierry ehrmann,https://www.flickr.com/people/home_of_chaos/\n69703e94581c4bbb,https://c1.staticflickr.com/1/88/31518437085_c2c7aaf1be_o.jpg,0.0,0.175409836066,1.0,1.0,948,642,https://www.flickr.com/photos/ewolivera/31518437085,https://creativecommons.org/licenses/by/2.0/,Edgardo W. Olivera,https://www.flickr.com/people/ewolivera/\ne748441c5edb53f1,https://c1.staticflickr.com/9/8216/29697785962_2a37130207_o.jpg,0.0,0.25,0.5,1.0,363,833,https://flickr.com/95230066@N07/29697785962,https://creativecommons.org/licenses/by/2.0/,British Pest Control  Association,https://www.flickr.com/people/95230066@N07/\ne211bee025d645b7,https://c1.staticflickr.com/6/5751/31214702724_3138cdf75c_o.jpg,0.0,0.0,0.666666666667,1.0,706,683,https://www.flickr.com/photos/126337928@N05/31214702724,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\nc8c7c057fc99c1e7,https://c1.staticflickr.com/9/8484/29100969591_bafd541d85_o.jpg,0.28125,0.25,0.84375,1.0,920,801,https://www.flickr.com/photos/fdecomite/29100969591/,https://creativecommons.org/licenses/by/2.0/,fdecomite,https://www.flickr.com/people/fdecomite/\na48e5f86b258c6da,https://c1.staticflickr.com/9/8309/29189128341_9473877e3f_o.jpg,0.0,0.25,0.561328125,1.0,875,412,https://www.flickr.com/photos/dariuspinkston/29189128341/,https://creativecommons.org/licenses/by/2.0/,Darius Pinkston,https://www.flickr.com/people/dariuspinkston/\n146738934b811e79,https://c1.staticflickr.com/6/5598/30291340334_b6a21fd38c_o.jpg,0.0,0.0,1.0,0.666666666667,980,683,https://www.flickr.com/photos/yahl/30291340334/,https://creativecommons.org/licenses/by/2.0/,Keith Yahl,https://www.flickr.com/people/yahl/\ncd7adb9c241f3645,https://c1.staticflickr.com/8/7489/27064481800_085a40270a_o.jpg,0.0,0.25,0.5,1.0,558,353,https://www.flickr.com/photos/greggjerdingen/27064481800,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n5806b424ac9725d4,https://c1.staticflickr.com/9/8562/28418299406_a47453b751_o.jpg,0.249079528719,0.25,0.747238586156,1.0,737,779,http://www.flickr.com/photos/oliver_clarke/28418299406/,https://creativecommons.org/licenses/by/2.0/,Oliver Clarke,https://www.flickr.com/people/oliver_clarke/\n953c5a4e009dee96,https://c1.staticflickr.com/6/5714/30166822763_bcc9331952_o.jpg,0.25,0.0,1.0,0.499263622975,402,725,https://flickr.com/96656936@N06/30166822763,https://creativecommons.org/licenses/by/2.0/,Ken Srail,https://www.flickr.com/people/srail/\n415fd08b8c01f727,https://c1.staticflickr.com/6/5833/30633649165_20bc29181e_o.jpg,0.258620689655,0.0,0.775862068966,0.75,662,831,https://www.flickr.com/photos/autohistorian/30633649165,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\n06d494302ee4db6d,https://c1.staticflickr.com/6/5333/31178749265_bce3ee01a5_o.jpg,0.4375,0.0,1.0,0.75,875,714,https://www.flickr.com/photos/pics-by-mpd/31178749265,https://creativecommons.org/licenses/by/2.0/,Matt Davis,https://www.flickr.com/people/pics-by-mpd/\n86a230447f7cf26e,https://c1.staticflickr.com/8/7791/26619767854_59e265449d_o.jpg,0.5,0.0,1.0,0.75,985,131,https://www.flickr.com/photos/cosmicherb70/26619767854,https://creativecommons.org/licenses/by/2.0/,Chris Combe,https://www.flickr.com/people/cosmicherb70/\n63e3c3a5f22bf329,https://c1.staticflickr.com/9/8275/30284786161_6a846c3d2c_o.jpg,0.273726851852,0.0,0.821180555556,0.75,539,342,https://www.flickr.com/photos/22711505@N05/30284786161,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n64abe707b275f393,https://c1.staticflickr.com/8/7022/26786139643_cce5fb31a1_o.jpg,0.5,0.0,1.0,0.75,821,736,https://www.flickr.com/photos/ben_salter/26786139643/,https://creativecommons.org/licenses/by/2.0/,Ben Salter,https://www.flickr.com/people/ben_salter/\nde8f1ffffbc2df44,https://c1.staticflickr.com/6/5486/30607905945_2edab25ed0_o.jpg,0.25,0.0,1.0,0.75,499,277,https://www.flickr.com/photos/pasa/30607905945/,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n11d005a268fd88ba,https://c1.staticflickr.com/9/8114/28659243534_82234bd854_o.jpg,0.28125,0.0,0.84375,0.75,975,786,https://www.flickr.com/photos/jsjgeology/28659243534,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n0f47efde6dd91f2c,https://c1.staticflickr.com/8/7401/26795524443_94e1db1ddf_o.jpg,0.248348017621,0.25,0.745044052863,1.0,26,420,https://www.flickr.com/photos/aah-yeah/26795524443/,https://creativecommons.org/licenses/by/2.0/,Aah-Yeah,https://www.flickr.com/people/aah-yeah/\n938fa87cabe4e761,https://c1.staticflickr.com/6/5455/30341869553_da042ec292_o.jpg,0.250923190547,0.25,0.75276957164,1.0,407,736,https://www.flickr.com/photos/eltb/30341869553,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\ne8fa2ab28c6c1ea6,https://c1.staticflickr.com/8/7396/28016693425_b21de8076d_o.jpg,0.5,0.25,1.0,1.0,874,926,https://www.flickr.com/photos/120106679@N03/28016693425,https://creativecommons.org/licenses/by/2.0/,Wirsinda Llefreaks,https://www.flickr.com/people/120106679@N03/\n108ffa60f554773b,https://c1.staticflickr.com/9/8283/28992131264_0f2fdc7fe3_o.jpg,0.43661971831,0.25,1.0,1.0,932,315,https://www.flickr.com/photos/joyosity/28992131264,https://creativecommons.org/licenses/by/2.0/,Joy,https://www.flickr.com/people/joyosity/\ncbcaa587c96b599b,https://c1.staticflickr.com/1/737/31479454161_2f79c92e03_o.jpg,0.0,0.0,0.75,0.5,777,430,https://www.flickr.com/photos/itupictures/31479454161/,https://creativecommons.org/licenses/by/2.0/,ITU Pictures,https://www.flickr.com/people/itupictures/\n76fb8c847f49c306,https://c1.staticflickr.com/8/7531/30021707680_4c9d179dc0_o.jpg,0.0,0.0,0.421177266576,0.75,405,662,https://www.flickr.com/photos/dlr_de/30021707680,https://creativecommons.org/licenses/by/2.0/,DLR German Aerospace Center,https://www.flickr.com/people/dlr_de/\n788c1d25cd754a0d,https://c1.staticflickr.com/6/5548/31013354062_662fd907a7_o.jpg,0.0,0.0,0.671794871795,0.75,538,105,https://www.flickr.com/photos/usfwshq/31013354062,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/\nb668baac594faa38,https://c1.staticflickr.com/9/8340/28520762406_0d2979980f_o.jpg,0.25,0.0,0.75,0.75,971,983,https://www.flickr.com/photos/davebloggs007/28520762406,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\nb4dc104497190b6e,https://c1.staticflickr.com/9/8128/28888836620_f9b56a54ba_o.jpg,0.25,0.25,0.75,1.0,835,565,https://www.flickr.com/photos/31029865@N06/28888836620,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/\ne5098db03fc02a79,https://c1.staticflickr.com/6/5630/30605394902_3f09e28475_o.jpg,0.0,0.0,0.666666666667,1.0,100,493,https://flickr.com/22539273@N00/30605394902,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\n0bdc3c04749c45d0,https://c1.staticflickr.com/6/5736/30488992510_5fe16b3ee5_o.jpg,0.25,0.254086181278,1.0,0.762258543834,725,66,https://flickr.com/37804979@N00/30488992510,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\na73d3d29520b1712,https://c1.staticflickr.com/8/7381/26985745404_73c9d3554e_o.jpg,0.498153618907,0.25,1.0,1.0,699,907,https://www.flickr.com/photos/jorge-11/26985745404,https://creativecommons.org/licenses/by/2.0/,George M. Groutas,https://www.flickr.com/people/jorge-11/\n4c0e68bdcbbacce4,https://c1.staticflickr.com/6/5701/30438346713_a4438530ce_o.jpg,0.28125,0.25,0.84375,1.0,699,607,https://www.flickr.com/photos/davidstanleytravel/30438346713,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\nf80300f5bf40e2d7,https://c1.staticflickr.com/9/8038/29227020654_507848bce1_o.jpg,0.28125,0.25,0.84375,1.0,699,265,https://www.flickr.com/photos/davidstanleytravel/29227020654,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n60343acbb6bcfaea,https://c1.staticflickr.com/9/8561/27776427244_025e1761eb_o.jpg,0.0,0.0,0.566326530612,0.75,878,806,https://www.flickr.com/photos/mtaphotos/27776427244,https://creativecommons.org/licenses/by/2.0/,Metropolitan Transportation Authority of the State of New York,https://www.flickr.com/people/mtaphotos/\nf4e292f525995b23,https://c1.staticflickr.com/9/8553/28429103321_4ee38161c8_o.jpg,0.4375,0.25,1.0,1.0,920,430,https://www.flickr.com/photos/cogdog/28429103321,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n5bec01749b815c47,https://c1.staticflickr.com/1/686/31913197024_fdcfa8db76_o.jpg,0.0,0.351744186047,1.0,1.0,550,565,https://www.flickr.com/photos/archivesnz/31913197024,https://creativecommons.org/licenses/by/2.0/,Archives New Zealand,https://www.flickr.com/people/archivesnz/\nfda4e25b87f5b5da,https://c1.staticflickr.com/8/7599/27133304130_ef2c5445e4_o.jpg,0.263636363636,0.0,0.790909090909,0.75,672,398,https://www.flickr.com/photos/28521130@N02/27133304130/,https://creativecommons.org/licenses/by/2.0/,Chris Crook,https://www.flickr.com/people/28521130@N02/\nba4b493ff7d68164,https://c1.staticflickr.com/8/7535/27682537101_346b014495_o.jpg,0.4375,0.25,1.0,1.0,644,106,https://www.flickr.com/photos/jdlasica/27682537101,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\n13cd5034357cbe65,https://c1.staticflickr.com/9/8576/28740181022_d642a5f729_o.jpg,0.549090909091,0.0,1.0,1.0,815,52,https://www.flickr.com/photos/watts_photos/28740181022,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/\nb510f33fae2f9400,https://c1.staticflickr.com/9/8700/29042405395_39c138e7ca_o.jpg,0.0,0.25,0.601941747573,1.0,510,785,https://www.flickr.com/photos/56041749@N02/29042405395/,https://creativecommons.org/licenses/by/2.0/,Denise Krebs,https://www.flickr.com/people/mrsdkrebs/\nd42e528c08041e23,https://c1.staticflickr.com/8/7426/27725918656_7b03c99843_o.jpg,0.25,0.25,1.0,1.0,909,679,https://www.flickr.com/photos/upsticksngo/27725918656,https://creativecommons.org/licenses/by/2.0/,UpSticksNGo Crew,https://www.flickr.com/people/upsticksngo/\n29d771df4d8ff3d5,https://c1.staticflickr.com/9/8530/29144030334_70c81c07d5_o.jpg,0.314256198347,0.0,0.942768595041,0.75,309,563,https://www.flickr.com/photos/35142635@N05/29144030334,https://creativecommons.org/licenses/by/2.0/,S. Rae,https://www.flickr.com/people/35142635@N05/\n18ce1a3099ee3dac,https://c1.staticflickr.com/6/5525/30134863003_7e48ecb9b8_o.jpg,0.25,0.25,0.75,1.0,629,600,https://www.flickr.com/photos/prayitnophotography/30134863003,https://creativecommons.org/licenses/by/2.0/,Prayitno / Thank you for (12 millions +) view,https://www.flickr.com/people/prayitnophotography/\nf4581d9d59df389a,https://c1.staticflickr.com/1/414/32162742470_48de3815b2_o.jpg,0.28125,0.25,0.84375,1.0,471,778,https://flickr.com/98302443@N00/32162742470,https://creativecommons.org/licenses/by/2.0/,Shalu Sharma,https://www.flickr.com/people/98302443@N00/\n89c95e9fd2627a1b,https://c1.staticflickr.com/9/8427/29225569961_f9298baf1b_o.jpg,0.5,0.0,1.0,0.75,664,454,https://flickr.com/129665369@N02/29225569961,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\n78ff5f2c96e44f1e,https://c1.staticflickr.com/6/5531/30783189196_c16415aec8_o.jpg,0.25,0.0,0.75,0.75,556,236,https://www.flickr.com/photos/grahammitchellphotography/30783189196,https://creativecommons.org/licenses/by/2.0/,Graham  Mitchell,https://www.flickr.com/people/grahammitchellphotography/\n20ecc8cb65aa2020,https://c1.staticflickr.com/9/8379/28969019944_1e1c84d082_o.jpg,0.0,0.25,0.5,1.0,512,837,https://www.flickr.com/photos/greggjerdingen/28969019944,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n8e08a9b7438577a5,https://c1.staticflickr.com/9/8580/30141256612_d584a7bc99_o.jpg,0.333333333333,0.0,1.0,1.0,629,808,https://www.flickr.com/photos/tipsfortravellers/30141256612,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\ne97f8f90bb7a6a98,https://c1.staticflickr.com/8/7398/27195102153_3f6db208fc_o.jpg,0.0,0.25,0.5,1.0,986,607,https://www.flickr.com/photos/leandromartinez/27195102153/,https://creativecommons.org/licenses/by/2.0/,Leandro Martinez,https://www.flickr.com/people/leandromartinez/\n14d7d18ea74f2130,https://c1.staticflickr.com/6/5741/30207778941_a5fdd276ef_o.jpg,0.0,0.0,0.75,0.75,686,678,https://www.flickr.com/photos/vernieman/30207778941,https://creativecommons.org/licenses/by/2.0/,Vernon Chan,https://www.flickr.com/people/vernieman/\na5dd43e48b5d29f3,https://c1.staticflickr.com/8/7621/26292015064_7e0642dfe0_o.jpg,0.37517831669,0.0,1.0,1.0,781,73,https://www.flickr.com/photos/mmichaelis/26292015064,https://creativecommons.org/licenses/by/2.0/,Mark Michaelis,https://www.flickr.com/people/mmichaelis/\n42e919a86440eb84,https://c1.staticflickr.com/2/1473/26708830161_2a5ca65c4b_o.jpg,0.0,0.0,0.499263622975,0.75,404,250,https://www.flickr.com/photos/usnavy/26708830161,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\nce128dca3dc000a2,https://c1.staticflickr.com/6/5531/30571417641_c9e2880fae_o.jpg,0.31098615917,0.0,1.0,0.75,309,55,http://www.flickr.com/photos/130093583@N04/30571417641/,https://creativecommons.org/licenses/by/2.0/,Janet Graham,https://www.flickr.com/people/130093583@N04/\n2144bc7e66913d11,https://c1.staticflickr.com/6/5745/31279509622_59aac261ea_o.jpg,0.0,0.0,1.0,0.75,806,6,https://www.flickr.com/photos/8136496@N05/31279509622,https://creativecommons.org/licenses/by/2.0/,terren in Virginia,https://www.flickr.com/people/8136496@N05/\n9b681ef3ebf922a3,https://c1.staticflickr.com/9/8432/28598969353_edf48de69a_o.jpg,0.0,0.0,0.5625,0.75,367,364,https://flickr.com/64997835@N08/28598969353,https://creativecommons.org/licenses/by/2.0/,Mark Jordahl,https://www.flickr.com/people/conservationconcepts/\n63dd73566b9d3056,https://c1.staticflickr.com/6/5586/31114557706_61bb13175d_o.jpg,0.28125,0.25,0.84375,1.0,469,561,https://www.flickr.com/photos/27665395@N05/31114557706,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\n7315c5eb1b1d24a5,https://c1.staticflickr.com/9/8127/29041878946_6ae5d6492d_o.jpg,0.0,0.25,0.499263622975,1.0,328,675,https://www.flickr.com/photos/scanudas/29041878946,https://creativecommons.org/licenses/by/2.0/,scanudas,https://www.flickr.com/people/scanudas/\na4e57dcec71c1ca5,https://c1.staticflickr.com/6/5451/30203075730_024cc1d5a5_o.jpg,0.211267605634,0.0,0.633802816901,0.75,980,806,https://flickr.com/28435100@N00/30203075730,https://creativecommons.org/licenses/by/2.0/,Peter Stevens,https://www.flickr.com/people/nordique/\n4204788f288f0a3f,https://c1.staticflickr.com/9/8548/30380542766_9b4cdae0e4_o.jpg,0.0,0.0,0.664212076583,1.0,556,637,https://www.flickr.com/photos/chicagofd1996/30380542766,https://creativecommons.org/licenses/by/2.0/,Arvell Dorsey Jr.,https://www.flickr.com/people/chicagofd1996/\n56cd087311fc7aa3,https://c1.staticflickr.com/9/8526/28279673710_a5ff61f9c6_o.jpg,0.0,0.0,0.670118343195,1.0,913,613,https://www.flickr.com/photos/mikevines/28279673710,https://creativecommons.org/licenses/by/2.0/,Michael Vines,https://www.flickr.com/people/mikevines/\ncccd3907158215eb,https://c1.staticflickr.com/9/8717/29648201905_166a22f07c_o.jpg,0.249079528719,0.0,0.747238586156,0.75,920,110,https://www.flickr.com/photos/zigazou76/29648201905,https://creativecommons.org/licenses/by/2.0/,Fr\\303\\251d\\303\\251ric BISSON,https://www.flickr.com/people/zigazou76/\n62f1ea06dd035411,https://c1.staticflickr.com/9/8487/29164599321_a8d731a072_o.jpg,0.503303964758,0.0,1.0,0.75,558,136,https://www.flickr.com/photos/bensutherland/29164599321/,https://creativecommons.org/licenses/by/2.0/,Ben Sutherland,https://www.flickr.com/people/bensutherland/\nbf9772a06e6bd842,https://c1.staticflickr.com/8/7315/27414153246_b55027fc98_o.jpg,0.43661971831,0.0,1.0,0.75,920,786,https://www.flickr.com/photos/cogdog/27414153246,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n9948070c7eb241cb,https://c1.staticflickr.com/1/397/31799195482_ea6a9b7948_o.jpg,0.281690140845,0.25,0.845070422535,1.0,459,371,https://www.flickr.com/photos/southbeachcars/31799195482/,https://creativecommons.org/licenses/by/2.0/,Phillip Pessar,https://www.flickr.com/people/southbeachcars/\n79076158fba7a39d,https://c1.staticflickr.com/9/8224/28906604211_2d45aba340_o.jpg,0.25,0.0,1.0,1.0,585,663,https://www.flickr.com/photos/29233640@N07/28906604211,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/\n3364515343243bae,https://c1.staticflickr.com/6/5343/30819612231_1ab0929f5f_o.jpg,0.244708029197,0.25,0.734124087591,1.0,780,338,https://www.flickr.com/photos/thoseguys119/30819612231,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n371f777dda9cd5f2,https://c1.staticflickr.com/9/8032/29124912696_d646a40c99_o.jpg,0.28125,0.0,0.84375,0.75,548,760,https://www.flickr.com/photos/marsupilami92/29124912696,https://creativecommons.org/licenses/by/2.0/,patrick janicek,https://www.flickr.com/people/marsupilami92/\n0f84a04a79317573,https://c1.staticflickr.com/9/8070/29255976990_81b8e72fb8_o.jpg,0.469650986343,0.25,1.0,1.0,349,855,https://www.flickr.com/photos/allanhenderson/29255976990,https://creativecommons.org/licenses/by/2.0/,Allan Henderson,https://www.flickr.com/people/allanhenderson/\n933f8a330a000d59,https://c1.staticflickr.com/9/8583/28241037270_7739bda028_o.jpg,0.25,0.401209677419,1.0,1.0,975,548,https://www.flickr.com/photos/jsjgeology/28241037270,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nc0c524882c16f45e,https://c1.staticflickr.com/1/738/32978160830_4d801ecc54_o.jpg,0.4375,0.25,1.0,1.0,985,77,https://www.flickr.com/photos/29233640@N07/32978160830/,https://creativecommons.org/licenses/by/2.0/,Robert Couse-Baker,https://www.flickr.com/people/29233640@N07/\n25751a37d6eb7739,https://c1.staticflickr.com/8/7370/27426742961_bbe898417b_o.jpg,0.256343283582,0.25,0.769029850746,1.0,308,803,https://www.flickr.com/photos/52450054@N04/27426742961,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\na49df2e07d174af7,https://c1.staticflickr.com/9/8448/29922523135_8174e0f943_o.jpg,0.2806640625,0.25,0.8419921875,1.0,373,767,https://flickr.com/31712587@N04/29922523135,https://creativecommons.org/licenses/by/2.0/,Micka\\303\\253l T.,https://www.flickr.com/people/mickaeltr/\ne696bf8fe883ed39,https://c1.staticflickr.com/8/7389/27420246256_b6f7d34604_o.jpg,0.25,0.0,1.0,1.0,404,538,https://www.flickr.com/photos/royluck/27420246256,https://creativecommons.org/licenses/by/2.0/,Roy Luck,https://www.flickr.com/people/royluck/\nb2aaad12ebac992a,https://c1.staticflickr.com/6/5780/31335424802_8a8640b947_o.jpg,0.333333333333,0.0,1.0,1.0,484,513,https://www.flickr.com/photos/renaud-camus/31335424802,https://creativecommons.org/licenses/by/2.0/,Renaud Camus,https://www.flickr.com/people/renaud-camus/\n873c37abe611d1fb,https://c1.staticflickr.com/3/2884/32717868852_b869e9da2e_o.jpg,0.0,0.0,1.0,1.0,13,749,http://www.flickr.com/photos/dfaulder/32717868852/,https://creativecommons.org/licenses/by/2.0/,dfaulder,https://www.flickr.com/people/dfaulder/\na70e96b60eca3a96,https://c1.staticflickr.com/9/8062/28519062462_5505cf870f_o.jpg,0.332106038292,0.0,0.996318114875,1.0,968,654,https://www.flickr.com/photos/rainsong/28519062462/,https://creativecommons.org/licenses/by/2.0/,Ali - \\330\\271\\331\\204\\331\\212 from Riyadh - \\331\\205\\331\\206 \\330\\247\\331\\204\\330\\261\\331\\212\\330\\247\\330\\266,https://www.flickr.com/people/rainsong/\n94af6f5825ff1572,https://c1.staticflickr.com/6/5552/31016672313_5baf276018_o.jpg,0.0,0.0,0.5625,0.75,327,409,https://flickr.com/86548370@N00/31016672313,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n3380e4cc39a4dab0,https://c1.staticflickr.com/1/345/32468565175_54a6f13b7e_o.jpg,0.0,0.25,0.5625,1.0,796,477,https://www.flickr.com/photos/summonedbyfells/32468565175,https://creativecommons.org/licenses/by/2.0/,summonedbyfells,https://www.flickr.com/people/summonedbyfells/\nc0307fa56264c9bb,https://c1.staticflickr.com/6/5601/15120292444_9e37f86c00_o.jpg,0.0,0.0,0.75,0.75,874,548,https://www.flickr.com/photos/zedzap/15120292444,https://creativecommons.org/licenses/by/2.0/,Nick Kenrick,https://www.flickr.com/people/zedzap/\n986e14bd6ae80609,https://c1.staticflickr.com/8/7381/27521892384_554504b2f0_o.jpg,0.0,0.0,1.0,0.943859649123,418,307,https://flickr.com/41431665@N07/27521892384,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\n9fded22b79506a09,https://c1.staticflickr.com/8/7282/27354642564_e39fd7f2e1_o.jpg,0.302264808362,0.25,1.0,1.0,896,217,https://www.flickr.com/photos/hisgett/27354642564,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n7a78a62689165294,https://c1.staticflickr.com/6/5523/30364402276_46f3da8c37_o.jpg,0.287776898734,0.25,0.863330696203,1.0,780,664,https://www.flickr.com/photos/dkelly1126/30364402276/,https://creativecommons.org/licenses/by/2.0/,Diana Kelly,https://www.flickr.com/people/dkelly1126/\ndad43c6ae87e0927,https://c1.staticflickr.com/9/8268/29163369571_f6136ba560_o.jpg,0.28125,0.0,0.84375,0.75,548,346,https://www.flickr.com/photos/trolleway/29163369571/,https://creativecommons.org/licenses/by/2.0/,Artem Svetlov,https://www.flickr.com/people/trolleway/\n832d5de57a52b684,https://c1.staticflickr.com/8/7444/27810689071_5f349c068e_o.jpg,0.332842415317,0.0,0.99852724595,1.0,867,837,https://www.flickr.com/photos/finchlake/27810689071/,https://creativecommons.org/licenses/by/2.0/,finchlake2000,https://www.flickr.com/people/finchlake/\ndb69026788bf39b2,https://c1.staticflickr.com/9/8006/29304387226_63afe36fda_o.jpg,0.496696035242,0.0,0.993392070485,0.75,484,513,https://www.flickr.com/photos/sybarite48/29304387226,https://creativecommons.org/licenses/by/2.0/,Daniel Jolivet,https://www.flickr.com/people/sybarite48/\n052be5dc0166cdc6,https://c1.staticflickr.com/8/7528/27932366904_9bde2b50bc_o.jpg,0.25,0.0,1.0,0.75,938,278,https://www.flickr.com/photos/joyosity/27932366904,https://creativecommons.org/licenses/by/2.0/,Joy,https://www.flickr.com/people/joyosity/\n7208eab14503deda,https://c1.staticflickr.com/9/8421/29146009174_e0f0fe3fbe_o.jpg,0.281690140845,0.25,0.845070422535,1.0,318,716,https://www.flickr.com/photos/treegrow/29146009174,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nbeae2ac1b950174f,https://c1.staticflickr.com/9/8688/28194418523_7cb21fc5b5_o.jpg,0.5,0.0,1.0,0.75,561,276,https://www.flickr.com/photos/thomasjhannigan/28194418523,https://creativecommons.org/licenses/by/2.0/,Tom Hannigan,https://www.flickr.com/people/thomasjhannigan/\ncf1cc361a000f8a6,https://c1.staticflickr.com/9/8648/29939073166_120a14a928_o.jpg,0.248348017621,0.0,0.745044052863,0.75,699,871,https://www.flickr.com/photos/pedrocaetano/29939073166,https://creativecommons.org/licenses/by/2.0/,Pedro,https://www.flickr.com/people/pedrocaetano/\n7ae9e7b56127f0d8,https://c1.staticflickr.com/6/5507/30360040950_37fb5a00e5_o.jpg,0.0,0.0,0.640173410405,1.0,548,629,https://www.flickr.com/photos/robdammers/30360040950/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\ndd8ccc83592bf69b,https://c1.staticflickr.com/8/7565/28949578652_6951b623a3_o.jpg,0.496696035242,0.25,0.993392070485,1.0,404,867,https://www.flickr.com/photos/portofsandiego/28949578652,https://creativecommons.org/licenses/by/2.0/,Port of San Diego,https://www.flickr.com/people/portofsandiego/\na1a2fa098fc4fc3c,https://c1.staticflickr.com/8/7467/26593529263_357a50aa58_o.jpg,0.0,0.0,0.75,1.0,428,982,https://www.flickr.com/photos/guldem/26593529263,https://creativecommons.org/licenses/by/2.0/,G\\303\\274ldem \\303\\234st\\303\\274n,https://www.flickr.com/people/guldem/\n6a42993e4bd7652b,https://c1.staticflickr.com/9/8318/29386275485_40da1d0497_o.jpg,0.0,0.0,0.499263622975,0.75,983,744,https://www.flickr.com/photos/financialtimes/29386275485,https://creativecommons.org/licenses/by/2.0/,Financial Times,https://www.flickr.com/people/financialtimes/\nefc6df602eede117,https://c1.staticflickr.com/1/434/32107205765_d7ee78b496_o.jpg,0.55851800554,0.0,1.0,0.75,405,541,https://flickr.com/37804979@N00/32107205765,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n1283f76b7311e2e6,https://c1.staticflickr.com/8/7617/26855646820_e49af75ca8_o.jpg,0.409,0.0,0.818,0.75,780,597,https://www.flickr.com/photos/thoseguys119/26855646820,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n4dd9e222da4ae04f,https://c1.staticflickr.com/1/693/31741654584_a88ee8c393_o.jpg,0.330631399317,0.25,1.0,1.0,309,367,https://www.flickr.com/photos/gails_pictures/31741654584,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n73f56da232a8e86c,https://c1.staticflickr.com/8/7334/26475894743_6c4a0bce0c_o.jpg,0.25,0.0,0.75,0.75,409,492,https://www.flickr.com/photos/byzantiumbooks/26475894743/,https://creativecommons.org/licenses/by/2.0/,Bill Smith,https://www.flickr.com/people/byzantiumbooks/\n08784f3f5caf20bd,https://c1.staticflickr.com/9/8646/28328054482_62c3ed4a69_o.jpg,0.0,0.0,0.75,1.0,484,661,https://www.flickr.com/photos/grassrootsgroundswell/28328054482,https://creativecommons.org/licenses/by/2.0/,grassrootsgroundswell,https://www.flickr.com/people/grassrootsgroundswell/\nb4f8e13a9894328b,https://c1.staticflickr.com/9/8399/29987363721_23194e8239_o.jpg,0.464488636364,0.25,0.928977272727,1.0,292,946,https://www.flickr.com/photos/dkeats/29987363721/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\nb20d32b794d781f7,https://c1.staticflickr.com/9/8327/28106197624_620f46c25f_o.jpg,0.256726457399,0.0,0.770179372197,0.75,139,52,https://www.flickr.com/photos/dkeats/28106197624,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\ncb5c719eb9342ca4,https://c1.staticflickr.com/6/5695/30492253795_a7028302d4_o.jpg,0.248713235294,0.25,0.746139705882,1.0,666,161,https://www.flickr.com/photos/sg2012/30492253795,https://creativecommons.org/licenses/by/2.0/,Steve Glover,https://www.flickr.com/people/sg2012/\nf00fe3ed04a247a6,https://c1.staticflickr.com/8/7160/27361709666_6f76912533_o.jpg,0.0,0.0,0.666666666667,1.0,760,235,https://www.flickr.com/photos/janitors/27361709666,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n099dd8638d5b1b90,https://c1.staticflickr.com/8/7338/27126345262_1385d44e63_o.jpg,0.0,0.0,0.474137931034,0.75,548,815,https://www.flickr.com/photos/robdammers/27126345262,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\neaf3a39db70f1b1c,https://c1.staticflickr.com/8/7660/27751997323_bfdb0afc93_o.jpg,0.248348017621,0.25,0.745044052863,1.0,986,955,https://www.flickr.com/photos/konfourier/27751997323,https://creativecommons.org/licenses/by/2.0/,Bastien  Konfourier,https://www.flickr.com/people/konfourier/\n486d49986d58de99,https://c1.staticflickr.com/8/7416/27543726913_8a2a7d990b_o.jpg,0.25,0.25,0.75,1.0,940,329,https://www.flickr.com/photos/47283811@N06/27543726913,https://creativecommons.org/licenses/by/2.0/,Cornelia Kopp,https://www.flickr.com/people/47283811@N06/\n065c2292b52e9a5f,https://c1.staticflickr.com/9/8316/28976743180_b20cf89476_o.jpg,0.25,0.496301775148,1.0,1.0,407,106,https://www.flickr.com/photos/eltb/28976743180,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n569659e75e0e41b2,https://c1.staticflickr.com/6/5760/30454891041_c5f3ff3cfc_o.jpg,0.25,0.0,0.75,0.75,980,804,https://www.flickr.com/photos/henry_hemming/30454891041/,https://creativecommons.org/licenses/by/2.0/,Henry Hemming,https://www.flickr.com/people/henry_hemming/\n543f819b48fd3793,https://c1.staticflickr.com/9/8779/29619650321_38ba7cea69_o.jpg,0.194489465154,0.0,1.0,1.0,806,829,https://www.flickr.com/photos/dirkhansen/29619650321,https://creativecommons.org/licenses/by/2.0/,SD Dirk,https://www.flickr.com/people/dirkhansen/\n4e63180f8290db66,https://c1.staticflickr.com/6/5787/29592265593_b799822ecb_o.jpg,0.28125,0.0,0.84375,0.75,975,846,https://www.flickr.com/photos/jsjgeology/29592265593,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n86a933ec3675aef9,https://c1.staticflickr.com/9/8515/29496890760_d05222072b_o.jpg,0.0,0.0,0.56338028169,0.75,608,930,https://www.flickr.com/photos/rusty_clark/29496890760/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\nc47bf7985b789cc9,https://c1.staticflickr.com/9/8547/29959306941_6d26ff1f6b_o.jpg,0.0,0.0,0.75,1.0,704,842,https://www.flickr.com/photos/andyarthur/29959306941,https://creativecommons.org/licenses/by/2.0/,Andy Arthur,https://www.flickr.com/people/andyarthur/\ne0832b8ff59e9b4b,https://c1.staticflickr.com/9/8196/29392948526_be2cf50f89_o.jpg,0.296147672552,0.25,0.888443017657,1.0,311,38,https://www.flickr.com/photos/gails_pictures/29392948526,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nfa6dd8395db3c0ef,https://c1.staticflickr.com/9/8849/28853827912_741ca3c350_o.jpg,0.0,0.0,0.666666666667,1.0,976,515,https://www.flickr.com/photos/o_0/28853827912,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\ndf624a1163d16448,https://c1.staticflickr.com/6/5582/30852047003_011b7c76ed_o.jpg,0.333333333333,0.0,1.0,1.0,297,998,https://flickr.com/145745023@N04/30852047003,https://creativecommons.org/licenses/by/2.0/,Jacob Dawson,https://www.flickr.com/people/jacobdawson/\n7cf5d1811b244ea3,https://c1.staticflickr.com/9/8601/27655067304_d4cf229436_o.jpg,0.5,0.0,1.0,0.75,512,696,https://www.flickr.com/photos/nielsautos/27655067304,https://creativecommons.org/licenses/by/2.0/,Niels de Wit,https://www.flickr.com/people/nielsautos/\n3d3e89e496f5127d,https://c1.staticflickr.com/6/5055/29591741454_8c2cee1451_o.jpg,0.25,0.0,1.0,1.0,975,570,https://www.flickr.com/photos/jsjgeology/29591741454,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n7e238605be116a2c,https://c1.staticflickr.com/8/7614/27342898111_dc64b3cfbd_o.jpg,0.0,0.0,0.75,0.526475037821,918,789,https://www.flickr.com/photos/egizu/27342898111,https://creativecommons.org/licenses/by/2.0/,EGIZU Getxo Euskaldun Elkartea,https://www.flickr.com/people/egizu/\n07e44b6351ae7c0e,https://c1.staticflickr.com/8/7162/26514541484_2d525146f7_o.jpg,0.561004784689,0.0,1.0,1.0,821,765,https://www.flickr.com/photos/jsjgeology/26514541484,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n8faba74de473fecf,https://c1.staticflickr.com/9/8627/28003286624_e8a84b2e5a_o.jpg,0.25,0.25,1.0,1.0,992,887,https://www.flickr.com/photos/treegrow/28003286624,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nb0eb2b45ea61d526,https://c1.staticflickr.com/1/576/31741942984_550a4af723_o.jpg,0.5,0.25,1.0,1.0,581,672,https://www.flickr.com/photos/glenbowman/31741942984/,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/\n4f96a53846ad8fd6,https://c1.staticflickr.com/9/8114/29865783120_6b044a040f_o.jpg,0.0,0.0,0.666666666667,1.0,618,889,https://www.flickr.com/photos/rdecom/29865783120,https://creativecommons.org/licenses/by/2.0/,U.S. Army RDECOM,https://www.flickr.com/people/rdecom/\n38951edc87604648,https://c1.staticflickr.com/9/8550/28990372682_b754ee408e_o.jpg,0.25,0.25,0.75,1.0,448,273,https://www.flickr.com/photos/usfws_pacificsw/28990372682,https://creativecommons.org/licenses/by/2.0/,Pacific Southwest Region USFWS,https://www.flickr.com/people/usfws_pacificsw/\n8e7f94eeded8fede,https://c1.staticflickr.com/9/8518/29707080782_b58dd6fff8_o.jpg,0.578822733424,0.25,1.0,1.0,512,868,https://www.flickr.com/photos/119886413@N05/29707080782,https://creativecommons.org/licenses/by/2.0/,Michel Curi,https://www.flickr.com/people/119886413@N05/\na4f4f4b3d31bf054,https://c1.staticflickr.com/6/5657/30260567744_baf4c5c5e6_o.jpg,0.0,0.0,0.75,1.0,618,901,https://www.flickr.com/photos/zeevveez/30260567744/,https://creativecommons.org/licenses/by/2.0/,zeevveez,https://www.flickr.com/people/zeevveez/\na80cfadffd1c9ef3,https://c1.staticflickr.com/9/8890/28467737901_ae7eaa6832_o.jpg,0.28125,0.0,0.84375,0.75,880,52,https://www.flickr.com/photos/38508395@N08/28467737901,https://creativecommons.org/licenses/by/2.0/,Wind&amp;Wuthering,https://www.flickr.com/people/38508395@N08/\n9297c7a168159867,https://c1.staticflickr.com/6/5511/31442990336_8acb326976_o.jpg,0.0,0.25,0.5,1.0,763,669,https://www.flickr.com/photos/lwpkommunikacio/31442990336,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\n55b99265ed64ede0,https://c1.staticflickr.com/9/8689/28303248802_85cece4991_o.jpg,0.427694406548,0.25,0.855388813097,1.0,405,918,https://www.flickr.com/photos/hisgett/28303248802,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n63cefb8737267f76,https://c1.staticflickr.com/9/8623/27975020643_7243731904_o.jpg,0.25,0.0,1.0,1.0,662,408,https://www.flickr.com/photos/quinet/27975020643,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nc93a9fa0ccd5444b,https://c1.staticflickr.com/9/8837/28154650460_2cbbd24f7f_o.jpg,0.0,0.0,1.0,1.0,204,322,https://www.flickr.com/photos/55229469@N07/28154650460,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\n9838ed8186ab0392,https://c1.staticflickr.com/1/511/32162105601_3bf4030aaa_o.jpg,0.210588633288,0.0,0.631765899865,0.75,650,894,https://www.flickr.com/photos/stonehenge-stone-circle/32162105601,https://creativecommons.org/licenses/by/2.0/,Stonehenge Stone Circle,https://www.flickr.com/people/stonehenge-stone-circle/\n9238840b7104b607,https://c1.staticflickr.com/9/8874/28462364052_e9296014d5_o.jpg,0.25,0.280530973451,1.0,1.0,842,589,https://www.flickr.com/photos/zongo/28462364052,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n7a8b855d28159640,https://c1.staticflickr.com/6/5329/30063772605_f61935188a_o.jpg,0.210588633288,0.25,0.631765899865,1.0,686,945,https://www.flickr.com/photos/mujitra/30063772605/,https://creativecommons.org/licenses/by/2.0/,MIKI Yoshihito,https://www.flickr.com/people/mujitra/\n9396f851c71f9afa,https://c1.staticflickr.com/6/5466/30617917356_780219dfea_o.jpg,0.28125,0.0,0.84375,0.75,820,879,https://flickr.com/38377150@N04/30617917356,https://creativecommons.org/licenses/by/2.0/,H. Doug Matsuoka,https://www.flickr.com/people/hdoug/\n9a036ab3a1d8e28c,https://c1.staticflickr.com/1/400/31530794544_d955610c44_o.jpg,0.28125,0.25,0.84375,1.0,652,862,https://flickr.com/23994900@N02/31530794544,https://creativecommons.org/licenses/by/2.0/,John Coley,https://www.flickr.com/people/lakemartinvoice/\n5e1c56cdfaf1e343,https://c1.staticflickr.com/8/7649/26539713373_f78c56bb07_o.jpg,0.396914446003,0.0,1.0,1.0,963,766,https://www.flickr.com/photos/djackmanson/26539713373,https://creativecommons.org/licenses/by/2.0/,David Jackmanson,https://www.flickr.com/people/djackmanson/\n7db587c09275bf41,https://c1.staticflickr.com/9/8798/28606938861_4c67b7d5d8_o.jpg,0.5,0.25,1.0,1.0,125,239,https://www.flickr.com/photos/j_regan/28606938861/,https://creativecommons.org/licenses/by/2.0/,regan76,https://www.flickr.com/people/j_regan/\n60c9302d50f9a1d4,https://c1.staticflickr.com/8/7371/27196733850_d754c8512c_o.jpg,0.692196531792,0.25,1.0,1.0,405,632,https://www.flickr.com/photos/epicfireworks/27196733850/,https://creativecommons.org/licenses/by/2.0/,Epic Fireworks,https://www.flickr.com/people/epicfireworks/\n023c23b2329a90ca,https://c1.staticflickr.com/9/8289/29279398816_c960409e25_o.jpg,0.168039538715,0.0,1.0,1.0,545,860,https://flickr.com/10390868@N07/29279398816,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\n68a9ac8758c57aa9,https://c1.staticflickr.com/8/7547/26756372954_b98d5685d8_o.jpg,0.0,0.0,0.666666666667,1.0,662,470,https://www.flickr.com/photos/greggjerdingen/26756372954,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n824e1d499f83a4e9,https://c1.staticflickr.com/1/311/32754272056_1eec3c54dd_o.jpg,0.4375,0.25,1.0,1.0,458,557,https://www.flickr.com/photos/stevendepolo/32754272056,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n51e3dfa6c7a5a223,https://c1.staticflickr.com/9/8008/28802904060_eb01f6a0d5_o.jpg,0.0,0.25,0.5,1.0,519,960,https://www.flickr.com/photos/box_repsol/28802904060,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n2c72943c853dfa8c,https://c1.staticflickr.com/6/5814/30715570335_733db7b624_o.jpg,0.0,0.0,0.747269890796,1.0,563,425,https://www.flickr.com/photos/30478819@N08/30715570335/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n02aa6c6397869b17,https://c1.staticflickr.com/1/446/32102284791_1b0f61eb68_o.jpg,0.0,0.0,0.666666666667,1.0,980,745,https://www.flickr.com/photos/sergiosf/32102284791,https://creativecommons.org/licenses/by/2.0/,Serge Saint,https://www.flickr.com/people/sergiosf/\nc74096d2012341e0,https://c1.staticflickr.com/8/7396/26592307230_2258140b9f_o.jpg,0.2806640625,0.25,0.8419921875,1.0,976,46,https://www.flickr.com/photos/ashleyt/26592307230,https://creativecommons.org/licenses/by/2.0/,Lim Ashley,https://www.flickr.com/people/ashleyt/\na07cc0a744c8d5e0,https://c1.staticflickr.com/8/7437/27207741233_82c2fa8c88_o.jpg,0.0,0.0,0.5625,0.75,763,480,https://www.flickr.com/photos/thinkgeoenergy/27207741233/,https://creativecommons.org/licenses/by/2.0/,ThinkGeoEnergy,https://www.flickr.com/people/thinkgeoenergy/\nc543121724c27808,https://c1.staticflickr.com/1/450/31863260782_2df91c6029_o.jpg,0.0,0.25,0.5,1.0,511,576,https://www.flickr.com/photos/45958601@N02/31863260782,https://creativecommons.org/licenses/by/2.0/,joey  zanotti,https://www.flickr.com/people/45958601@N02/\n409746e2fff0e9e5,https://c1.staticflickr.com/9/8204/29238217966_8b18ea4c29_o.jpg,0.0,0.0,0.666666666667,1.0,431,355,https://flickr.com/143676616@N05/29238217966,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\ndc0ce6bfee8ddde6,https://c1.staticflickr.com/9/8222/29271590834_bc97f9e932_o.jpg,0.0,0.25,0.5,1.0,456,748,https://flickr.com/54524572@N00/29271590834,https://creativecommons.org/licenses/by/2.0/,regan76,https://www.flickr.com/people/j_regan/\n891786588190cfee,https://c1.staticflickr.com/8/7208/27190901460_983b972e7b_o.jpg,0.0,0.0,0.5625,0.75,780,443,https://www.flickr.com/photos/thoseguys119/27190901460,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nf8e9e8559fd3f46e,https://c1.staticflickr.com/6/5728/30282426530_609e4d758d_o.jpg,0.25,0.0,0.75,0.75,818,556,https://www.flickr.com/photos/automobileitalia/30282426530,https://creativecommons.org/licenses/by/2.0/,Automobile Italia,https://www.flickr.com/people/automobileitalia/\n266b4cb5bf151576,https://c1.staticflickr.com/8/7252/27300445970_5722920e1f_o.jpg,0.0,0.0,0.5,0.75,848,3,https://www.flickr.com/photos/janitors/27300445970,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n0989e38b3e764952,https://c1.staticflickr.com/6/5513/30544468814_a29884c072_o.jpg,0.25,0.0,1.0,0.75,693,572,https://flickr.com/99453901@N00/30544468814,https://creativecommons.org/licenses/by/2.0/,Emily Allen,https://www.flickr.com/people/empracht/\n384910de87f4bec5,https://c1.staticflickr.com/9/8611/27979936513_5b88d16a7c_o.jpg,0.25,0.0,1.0,1.0,512,766,https://www.flickr.com/photos/hugo90/27979936513/,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\ned311c9c1ba3be3c,https://c1.staticflickr.com/8/7509/27181093226_2e53954f96_o.jpg,0.53125,0.0,1.0,0.75,738,790,https://www.flickr.com/photos/nazionalecalcio/27181093226,https://creativecommons.org/licenses/by/2.0/,Nazionale Calcio,https://www.flickr.com/people/nazionalecalcio/\nd6ce7645627ccb4c,https://c1.staticflickr.com/8/7386/27126499933_cd1cb15bd8_o.jpg,0.0,0.0,0.704545454545,1.0,821,408,https://www.flickr.com/photos/jsjgeology/27126499933,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n1ab396f9a7dabcc6,https://c1.staticflickr.com/8/7528/27309832621_338f6f3917_o.jpg,0.503303964758,0.0,1.0,0.75,752,489,https://www.flickr.com/photos/seymour-pics/27309832621,https://creativecommons.org/licenses/by/2.0/,Mark Seymour,https://www.flickr.com/people/seymour-pics/\ndae039f249108b78,https://c1.staticflickr.com/4/3749/33253836391_4e905abc56_o.jpg,0.25,0.25,1.0,1.0,471,150,https://flickr.com/94212497@N00/33253836391,https://creativecommons.org/licenses/by/2.0/,Rosmarie Voegtli,https://www.flickr.com/people/rvoegtli/\n76994fc6350a86b6,https://c1.staticflickr.com/9/8116/28625065272_ed3934e0d5_o.jpg,0.5,0.0,1.0,0.75,450,408,https://www.flickr.com/photos/davebloggs007/28625065272,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\nd6dd1fe210ed7066,https://c1.staticflickr.com/2/1618/26495255280_24c7e801b2_o.jpg,0.405546623794,0.25,1.0,1.0,559,751,https://www.flickr.com/photos/sinnfeinireland/26495255280,https://creativecommons.org/licenses/by/2.0/,Sinn F\\303\\251in,https://www.flickr.com/people/sinnfeinireland/\ndfb284ac7a5e1db5,https://c1.staticflickr.com/8/7470/30068687015_d0eccc7c0f_o.jpg,0.333333333333,0.0,1.0,1.0,519,923,https://www.flickr.com/photos/box_repsol/30068687015,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n6609a57fa378c03e,https://c1.staticflickr.com/6/5677/30952782772_a899d381bb_o.jpg,0.333333333333,0.0,1.0,1.0,548,583,https://www.flickr.com/photos/rhemkes/30952782772,https://creativecommons.org/licenses/by/2.0/,Roel Hemkes,https://www.flickr.com/people/rhemkes/\ndc96a0be0c1573de,https://c1.staticflickr.com/6/5447/30371311393_05afd72fd8_o.jpg,0.0,0.28125,0.75,0.84375,438,594,https://www.flickr.com/photos/142799281@N02/30371311393,https://creativecommons.org/licenses/by/2.0/,_hq_,https://www.flickr.com/people/_hq_/\naca0f7bb5634215e,https://c1.staticflickr.com/8/7724/27058933660_9656bb7a47_o.jpg,0.0,0.25,0.537844036697,1.0,448,139,https://www.flickr.com/photos/51764518@N02/27058933660,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n3206953b67268a91,https://c1.staticflickr.com/8/7778/28303777932_fd1d286dee_o.jpg,0.0,0.25,0.50110619469,1.0,971,22,https://www.flickr.com/photos/matsen/28303777932/,https://creativecommons.org/licenses/by/2.0/,Mats Sk\\303\\266lving,https://www.flickr.com/people/matsen/\n237e4f52095aa09e,https://c1.staticflickr.com/8/7677/27869446396_ac1a864c9c_o.jpg,0.0,0.25,0.423913043478,1.0,885,589,https://www.flickr.com/photos/eltb/27869446396,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n4fd4885be5338a57,https://c1.staticflickr.com/9/8586/28724211260_530486a4bc_o.jpg,0.28125,0.25,0.84375,1.0,666,824,https://www.flickr.com/photos/22510321@N08/28724211260,https://creativecommons.org/licenses/by/2.0/,E.Zorrilla,https://www.flickr.com/people/22510321@N08/\nc7f667b10a9cdd04,https://c1.staticflickr.com/8/7038/27201839735_b2db9bb65a_o.jpg,0.5,0.25,1.0,1.0,820,865,https://www.flickr.com/photos/strelka/27201839735,https://creativecommons.org/licenses/by/2.0/,\"Strelka Institute for Media, Architecture and Design\",https://www.flickr.com/people/strelka/\n8d37465546a95616,https://c1.staticflickr.com/8/7673/27547477780_099375b44c_o.jpg,0.0,0.0,0.75,1.0,437,284,https://www.flickr.com/photos/zombieite/27547477780/,https://creativecommons.org/licenses/by/2.0/,zombieite,https://www.flickr.com/people/zombieite/\n0f3914b5e7ec8e33,https://c1.staticflickr.com/9/8643/30167041025_4844f5266f_o.jpg,0.25,0.25,0.75,1.0,407,886,https://flickr.com/43714545@N06/30167041025,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/\n11bd90ea5ca8f6f1,https://c1.staticflickr.com/8/7132/26758410771_6329d0739b_o.jpg,0.25,0.0,1.0,1.0,673,440,https://www.flickr.com/photos/bravenboer/26758410771,https://creativecommons.org/licenses/by/2.0/,Martin Bravenboer,https://www.flickr.com/people/bravenboer/\nf8079884a0f650c7,https://c1.staticflickr.com/8/7162/27101372196_7dc435625b_o.jpg,0.294385432473,0.0,1.0,1.0,98,779,https://www.flickr.com/photos/usfwsmtnprairie/27101372196,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n38a26523bd4229a9,https://c1.staticflickr.com/9/8268/29436310370_0ddbe96f13_o.jpg,0.25,0.25,1.0,1.0,418,836,https://www.flickr.com/photos/clairity/29436310370/,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\nb3d201e0a3e939b4,https://c1.staticflickr.com/9/8065/29895084306_6d25f60eb3_o.jpg,0.248348017621,0.25,0.745044052863,1.0,699,868,https://www.flickr.com/photos/pedrocaetano/29895084306/,https://creativecommons.org/licenses/by/2.0/,Pedro,https://www.flickr.com/people/pedrocaetano/\ndf99ed0da6515572,https://c1.staticflickr.com/2/1542/26762390325_c8dcc829c3_o.jpg,0.25,0.0,0.75,0.75,512,631,https://www.flickr.com/photos/42220226@N07/26762390325,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\n3556700af6826a6e,https://c1.staticflickr.com/4/3876/32879535311_dec10b4ee0_o.jpg,0.488702623907,0.25,0.977405247813,1.0,980,352,https://flickr.com/145712985@N08/32879535311,https://creativecommons.org/licenses/by/2.0/,Tinker &amp; Rove,https://www.flickr.com/people/tinkerandrove/\nb07b0ac3ed31ace9,https://c1.staticflickr.com/8/7295/27725844795_06cd6c63da_o.jpg,0.0,0.0,0.666666666667,1.0,848,72,https://www.flickr.com/photos/janitors/27725844795,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\n081806d391df2390,https://c1.staticflickr.com/9/8874/28367452733_30ee590efd_o.jpg,0.0,0.0,0.75,0.75,719,678,https://www.flickr.com/photos/discoveroregon/28367452733/,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n822297a0cbf32b88,https://c1.staticflickr.com/8/7309/26961888755_1f75345c85_o.jpg,0.238832853026,0.0,0.716498559078,0.75,676,459,https://www.flickr.com/photos/jeepersmedia/26961888755,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nbe4ffdd4e0d99b31,https://c1.staticflickr.com/1/678/31460907262_0289b9d746_o.jpg,0.0,0.0,0.5625,0.75,875,554,https://www.flickr.com/photos/69203347@N03/31460907262/,https://creativecommons.org/licenses/by/2.0/,AmigoDeBusesEMT3,https://www.flickr.com/people/69203347@N03/\nd81db4769aa15b96,https://c1.staticflickr.com/3/2807/32948842081_faed92e444_o.jpg,0.333333333333,0.0,1.0,1.0,568,107,https://www.flickr.com/photos/yourbestdigs/32948842081,https://creativecommons.org/licenses/by/2.0/,Your Best Digs,https://www.flickr.com/people/yourbestdigs/\n8b6b25e9ff49e9b5,https://c1.staticflickr.com/9/8402/29477196100_e9785a792f_o.jpg,0.0,0.0,0.5,0.75,699,550,https://www.flickr.com/photos/o_0/29477196100,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\nbf10efe12d1e0dab,https://c1.staticflickr.com/1/706/31613882224_5cc230d979_o.jpg,0.280226209048,0.0,0.840678627145,0.75,563,129,https://www.flickr.com/photos/129657405@N05/31613882224/,https://creativecommons.org/licenses/by/2.0/,Tilly Sfortunato,https://www.flickr.com/people/129657405@N05/\n096b5029e028b8f9,https://c1.staticflickr.com/1/487/32225593260_1231d03f7f_o.jpg,0.28125,0.0,0.84375,0.75,820,680,https://www.flickr.com/photos/philliecasablanca/32225593260/,https://creativecommons.org/licenses/by/2.0/,Phil Whitehouse,https://www.flickr.com/people/philliecasablanca/\nfe6744c008d45d8f,https://c1.staticflickr.com/9/8013/28628989292_7fd5bc6843_o.jpg,0.0,0.25,0.5625,1.0,866,950,https://www.flickr.com/photos/rollercoasterphilosophy/28628989292,https://creativecommons.org/licenses/by/2.0/,Jeremy Thompson,https://www.flickr.com/people/rollercoasterphilosophy/\n7c8a01ae3f94e659,https://c1.staticflickr.com/8/7645/27486654783_797af732b3_o.jpg,0.275735294118,0.25,0.827205882353,1.0,669,392,https://www.flickr.com/photos/jdlasica/27486654783,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\nbd647214a1ae577f,https://c1.staticflickr.com/1/559/31143298614_d04af7febb_o.jpg,0.0,0.400242326333,0.75,1.0,484,128,https://www.flickr.com/photos/77423179@N02/31143298614/,https://creativecommons.org/licenses/by/2.0/,Melissa Hillier,https://www.flickr.com/people/77423179@N02/\n73ad049bc5f146ea,https://c1.staticflickr.com/8/7513/28091756891_4c20dc1593_o.jpg,0.254086181278,0.0,0.762258543834,0.75,848,475,https://www.flickr.com/photos/13476480@N07/28091756891,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n95b93ca38c465268,https://c1.staticflickr.com/6/5676/29732226764_25d9891e96_o.jpg,0.333333333333,0.0,1.0,1.0,683,605,https://www.flickr.com/photos/thejointstaff/29732226764,https://creativecommons.org/licenses/by/2.0/,Chairman of the Joint Chiefs of Staff,https://www.flickr.com/people/thejointstaff/\na3843f42dd00e6fd,https://c1.staticflickr.com/8/7392/27168716050_cc70b5a5ab_o.jpg,0.25,0.409855769231,1.0,1.0,499,291,https://www.flickr.com/photos/telecastered/27168716050,https://creativecommons.org/licenses/by/2.0/,C. J. Lee,https://www.flickr.com/people/telecastered/\n5364866bfc6312df,https://c1.staticflickr.com/8/7459/26827307085_8707297f43_o.jpg,0.0,0.25,0.475215517241,1.0,896,619,https://www.flickr.com/photos/34153108@N06/26827307085,https://creativecommons.org/licenses/by/2.0/,Gerard van der Schaaf,https://www.flickr.com/people/34153108@N06/\n155cd7ab1bfc5a25,https://c1.staticflickr.com/8/7666/28603343172_c6d09ab4ba_o.jpg,0.0,0.0,0.75,1.0,822,862,https://www.flickr.com/photos/jdlasica/28603343172,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\nc4bdb43ad16185d7,https://c1.staticflickr.com/8/7567/26271179253_b8fe02d86d_o.jpg,0.25,0.0,1.0,0.5625,323,899,https://www.flickr.com/photos/chaz_pics/26271179253,https://creativecommons.org/licenses/by/2.0/,Charlie Jackson,https://www.flickr.com/people/chaz_pics/\n9ec0db73dc71e450,https://c1.staticflickr.com/6/5698/30344565330_5248256034_o.jpg,0.0,0.0,1.0,0.75,976,161,https://www.flickr.com/photos/wwarby/30344565330,https://creativecommons.org/licenses/by/2.0/,William Warby,https://www.flickr.com/people/wwarby/\ne6bea491b7b39c9d,https://c1.staticflickr.com/9/8477/28487302991_df096a8ac8_o.jpg,0.0,0.348396501458,1.0,1.0,923,25,https://www.flickr.com/photos/lac-bac/28487302991,https://creativecommons.org/licenses/by/2.0/,BiblioArchives / LibraryArchives,https://www.flickr.com/people/lac-bac/\n293f76237070c32b,https://c1.staticflickr.com/6/5608/30563417220_ac0e48c340_o.jpg,0.0,0.0,1.0,1.0,672,483,https://www.flickr.com/photos/glorycycles/30563417220,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\na8cffac6950f35cc,https://c1.staticflickr.com/6/5798/29571368013_b2972d303e_o.jpg,0.0,0.0,0.75,0.75,672,671,https://www.flickr.com/photos/glorycycles/29571368013,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n45c94010912bc366,https://c1.staticflickr.com/9/8533/30168037975_1d617a70c5_o.jpg,0.25,0.25,0.75,1.0,874,586,https://flickr.com/133488379@N08/30168037975,https://creativecommons.org/licenses/by/2.0/,barnimages.com,https://www.flickr.com/people/barnimages/\n5a6a98ba9accb03d,https://c1.staticflickr.com/1/608/31114810934_2b38208d62_o.jpg,0.0,0.0,0.739130434783,1.0,854,212,https://flickr.com/13476480@N07/31114810934,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n801da2880d3020e2,https://c1.staticflickr.com/9/8161/28623947984_37510a6889_o.jpg,0.0,0.0,1.0,1.0,558,588,https://www.flickr.com/photos/us_mission_canada/28623947984,https://creativecommons.org/licenses/by/2.0/,US Embassy Canada,https://www.flickr.com/people/us_mission_canada/\nc9b88e9170f68f43,https://c1.staticflickr.com/1/598/30997903794_9d05ae2c09_o.jpg,0.4375,0.0,1.0,0.75,960,59,https://flickr.com/8996753@N06/30997903794,https://creativecommons.org/licenses/by/2.0/,MiNe,https://www.flickr.com/people/sfmine79/\nc2d51a897ca62786,https://c1.staticflickr.com/9/8415/29578628651_925aa2c330_o.jpg,0.43661971831,0.0,1.0,0.75,297,193,https://flickr.com/143363015@N06/29578628651,https://creativecommons.org/licenses/by/2.0/,Tobias Begemann,https://www.flickr.com/people/tobiasbegemann/\n4d4036763558c2b3,https://c1.staticflickr.com/8/7213/27681849505_37918cfaee_o.jpg,0.298790322581,0.0,0.896370967742,0.75,896,785,https://www.flickr.com/photos/13476480@N07/27681849505,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\na573b8ca54f3ac26,https://c1.staticflickr.com/1/736/31406996843_d86b711fd0_o.jpg,0.249631811487,0.0,0.748895434462,0.75,20,147,https://www.flickr.com/photos/birdbrian/31406996843/,https://creativecommons.org/licenses/by/2.0/,Brian Ralphs,https://www.flickr.com/people/birdbrian/\nbe1554f765f0782f,https://c1.staticflickr.com/8/7789/28849608790_2d277f0323_o.jpg,0.421177266576,0.0,0.842354533153,0.75,976,705,https://www.flickr.com/photos/wuerzburg_tg/28849608790,https://creativecommons.org/licenses/by/2.0/,ssabineteigelkmper,https://www.flickr.com/people/wuerzburg_tg/\n84e35b4740958d4c,https://c1.staticflickr.com/8/7403/27089871841_1b286687e6_o.jpg,0.4375,0.25,1.0,1.0,780,919,https://www.flickr.com/photos/thoseguys119/27089871841/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n8e985ccb88dc8141,https://c1.staticflickr.com/8/7027/26748475792_6b5bfb1887_o.jpg,0.0,0.25,0.539816232772,1.0,141,487,https://www.flickr.com/photos/winnu/26748475792/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/\n6f02e50dd98765b7,https://c1.staticflickr.com/9/8532/29511028682_e85a300749_o.jpg,0.500736377025,0.25,1.0,1.0,566,274,https://www.flickr.com/photos/kansasscanner/29511028682,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\n61e2fbffc6975c45,https://c1.staticflickr.com/6/5777/30657355572_1e8c138189_o.jpg,0.0977701543739,0.0,1.0,1.0,95,755,https://www.flickr.com/photos/usfwsmtnprairie/30657355572,https://creativecommons.org/licenses/by/2.0/,USFWS Mountain-Prairie,https://www.flickr.com/people/usfwsmtnprairie/\n21b0a03adfe01811,https://c1.staticflickr.com/8/7260/27026875233_8a6381ed51_o.jpg,0.25,0.25,1.0,1.0,909,580,https://www.flickr.com/photos/stevensnodgrass/27026875233,https://creativecommons.org/licenses/by/2.0/,Steve Snodgrass,https://www.flickr.com/people/stevensnodgrass/\n033646d2530c0a1c,https://c1.staticflickr.com/8/7630/28026241731_2bcb016e84_o.jpg,0.0,0.25,0.543461538462,1.0,320,693,https://www.flickr.com/photos/47602497@N06/28026241731,https://creativecommons.org/licenses/by/2.0/,patricia pierce,https://www.flickr.com/people/47602497@N06/\n845b8719fe64a756,https://c1.staticflickr.com/9/8400/29658924786_e9035b2901_o.jpg,0.0,0.0,0.75,1.0,481,818,https://www.flickr.com/photos/jeepersmedia/29658924786,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n46eb5b02b6dab007,https://c1.staticflickr.com/6/5818/31187085512_2fd4584709_o.jpg,0.21087398374,0.0,0.63262195122,0.75,147,909,http://www.flickr.com/photos/blachswan/31187085512/,https://creativecommons.org/licenses/by/2.0/,Ed Dunens,https://www.flickr.com/people/blachswan/\n982dada7e8bf2b34,https://c1.staticflickr.com/3/2108/32727356202_9e10724895_o.jpg,0.0,0.0945017182131,1.0,1.0,18,144,https://www.flickr.com/photos/49963509@N00/32727356202/,https://creativecommons.org/licenses/by/2.0/,John Fogarty,https://www.flickr.com/people/49963509@N00/\n9c2ce96b55282297,https://c1.staticflickr.com/6/5594/31066499201_360b07fdac_o.jpg,0.0,0.333333333333,1.0,1.0,672,568,https://flickr.com/68777082@N00/31066499201,https://creativecommons.org/licenses/by/2.0/,Flowizm ...,https://www.flickr.com/people/flowizm/\n9fa6d395396668eb,https://c1.staticflickr.com/9/8244/28322409363_284770d64c_o.jpg,0.25,0.0,0.75,0.75,699,730,https://www.flickr.com/photos/gildardo/28322409363,https://creativecommons.org/licenses/by/2.0/,Gildardo S\\303\\241nchez,https://www.flickr.com/people/gildardo/\nde2ec27ed1edbc33,https://c1.staticflickr.com/6/5153/29955257172_8f29f222f4_o.jpg,0.5,0.25,1.0,1.0,519,581,https://www.flickr.com/photos/box_repsol/29955257172,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n3a93a4dc2c8c866a,https://c1.staticflickr.com/1/697/31538317141_99541f0e95_o.jpg,0.0,0.25,0.5,1.0,25,470,https://www.flickr.com/photos/kamcmillan/31538317141/,https://creativecommons.org/licenses/by/2.0/,Ken McMillan,https://www.flickr.com/people/kamcmillan/\n9ace66f6b97ef68d,https://c1.staticflickr.com/8/7472/29851578962_bc4b58e1d2_o.jpg,0.438430311231,0.0,1.0,1.0,991,614,https://www.flickr.com/photos/mauroguanandi/29851578962/,https://creativecommons.org/licenses/by/2.0/,mauroguanandi,https://www.flickr.com/people/mauroguanandi/\n3d519d9cde00b9ff,https://c1.staticflickr.com/6/5565/30818457422_3ee7fb1357_o.jpg,0.333333333333,0.0,1.0,1.0,810,29,https://www.flickr.com/photos/o_0/30818457422,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\ne7c04e8d9c810ed0,https://c1.staticflickr.com/8/7598/26783988296_e574d0a2d1_o.jpg,0.499263622975,0.0,0.99852724595,0.75,981,648,https://www.flickr.com/photos/manu_praba_dissanayake/26783988296,https://creativecommons.org/licenses/by/2.0/,Manu Praba,https://www.flickr.com/people/manu_praba_dissanayake/\nc0629d8ca76b7d4c,https://c1.staticflickr.com/6/5750/29791589544_d4b09c5e08_o.jpg,0.0,0.25,0.5625,1.0,975,570,https://www.flickr.com/photos/jsjgeology/29791589544,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nbccba8785faf326f,https://c1.staticflickr.com/8/7452/27420975771_93a07ed520_o.jpg,0.0,0.25,0.421177266576,1.0,4,712,https://www.flickr.com/photos/wilfred_hdez/27420975771/,https://creativecommons.org/licenses/by/2.0/,Wilfred Hdez,https://www.flickr.com/people/wilfred_hdez/\nc33de864bf6054de,https://c1.staticflickr.com/9/8012/29379222006_de0fa9b05d_o.jpg,0.250391236307,0.0,1.0,1.0,815,472,https://www.flickr.com/photos/67165210@N00/29379222006,https://creativecommons.org/licenses/by/2.0/,horslips5,https://www.flickr.com/people/67165210@N00/\n6d0ace8f643e933f,https://c1.staticflickr.com/1/409/32697536260_b61ce714f3_o.jpg,0.4375,0.0,1.0,0.75,691,360,https://www.flickr.com/photos/davidstanleytravel/32697536260,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\nd3a52dec3597b33b,https://c1.staticflickr.com/8/7396/27904829001_514bb5006d_o.jpg,0.0,0.25,0.496696035242,1.0,320,428,https://www.flickr.com/photos/usfwsmidwest/27904829001,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\nd6f196a9850c32ee,https://c1.staticflickr.com/9/8029/29856931862_26db02aa44_o.jpg,0.0,0.25,0.599757673667,1.0,458,317,https://www.flickr.com/photos/asuenglish/29856931862,https://creativecommons.org/licenses/by/2.0/,ASU Department of English,https://www.flickr.com/people/asuenglish/\n6c0079a07ca91e27,https://c1.staticflickr.com/8/7247/26676847930_fc3166d93b_o.jpg,0.25,0.0,1.0,0.599757673667,771,634,https://www.flickr.com/photos/haxpett/26676847930,https://creativecommons.org/licenses/by/2.0/,Axel Pettersson,https://www.flickr.com/people/haxpett/\nad7ea659e7388a75,https://c1.staticflickr.com/6/5564/30525161525_56a1eaed53_o.jpg,0.2515625,0.0,1.0,1.0,982,166,https://www.flickr.com/photos/apardavila/30525161525,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n3610fa43d5f330cd,https://c1.staticflickr.com/9/8307/29371779515_6176ee5a4b_o.jpg,0.0,0.0,0.5,0.75,566,424,https://www.flickr.com/photos/concavowheels/29371779515,https://creativecommons.org/licenses/by/2.0/,CONCAVO WHEELS,https://www.flickr.com/people/concavowheels/\n85c3a34ef80646ff,https://c1.staticflickr.com/8/7060/27682536091_e782d9e970_o.jpg,0.0,0.25,0.5,1.0,644,340,https://www.flickr.com/photos/jdlasica/27682536091,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\n214f5e19afc69a80,https://c1.staticflickr.com/8/7681/27804063085_7b9ac8d32f_o.jpg,0.0,0.0,0.75,0.75,807,89,https://www.flickr.com/photos/trilliumdesign/27804063085,https://creativecommons.org/licenses/by/2.0/,Trilliumdesign ~ Caroline,https://www.flickr.com/people/trilliumdesign/\n01286c51d69d22c7,https://c1.staticflickr.com/6/5325/30710847566_148ce4d1bc_o.jpg,0.0,0.0,0.5,0.75,412,491,https://www.flickr.com/photos/ubudwritersfest/30710847566,https://creativecommons.org/licenses/by/2.0/,Ubud Writers &amp; Readers Festival,https://www.flickr.com/people/ubudwritersfest/\n30fc7df9512a11fc,https://c1.staticflickr.com/1/421/32304006235_c8a947a8a5_o.jpg,0.332106038292,0.0,0.996318114875,1.0,98,178,http://www.flickr.com/photos/136804067@N08/32304006235/,https://creativecommons.org/licenses/by/2.0/,austin Lan,https://www.flickr.com/people/136804067@N08/\n3ea10f5dbf40c0d9,https://c1.staticflickr.com/3/2076/32726800431_3bd5f94b6e_o.jpg,0.0,0.0,0.7484375,1.0,965,328,https://www.flickr.com/photos/68147320@N02/32726800431,https://creativecommons.org/licenses/by/2.0/,T.Tseng,https://www.flickr.com/people/68147320@N02/\ne46f32ee2a471099,https://c1.staticflickr.com/9/8621/28571156650_d9dfb4c931_o.jpg,0.211382113821,0.25,0.634146341463,1.0,617,952,https://www.flickr.com/photos/epicantus/28571156650,https://creativecommons.org/licenses/by/2.0/,Epicantus,https://www.flickr.com/people/epicantus/\nf5d216121d5a7ee4,https://c1.staticflickr.com/9/8712/28878921452_6d0beb21f8_o.jpg,0.0,0.0,0.5,0.75,760,568,https://www.flickr.com/photos/rafiot/28878921452,https://creativecommons.org/licenses/by/2.0/,Rapha\\303\\253l Vinot,https://www.flickr.com/people/rafiot/\na00828cce794420e,https://c1.staticflickr.com/8/7578/27987773565_e609085d74_o.jpg,0.0,0.25,0.5625,1.0,449,346,https://www.flickr.com/photos/jeanbaptistem/27987773565,https://creativecommons.org/licenses/by/2.0/,JeanbaptisteM,https://www.flickr.com/people/jeanbaptistem/\n004f4dada5838d75,https://c1.staticflickr.com/9/8556/29881342191_ec70fdb0c2_o.jpg,0.0,0.0,0.75,1.0,859,658,https://www.flickr.com/photos/quirky/29881342191/,https://creativecommons.org/licenses/by/2.0/,Wendy Harman,https://www.flickr.com/people/quirky/\n8d2bea8e702e82cf,https://c1.staticflickr.com/8/7450/27061820631_2b236867cc_o.jpg,0.0,0.0,1.0,1.0,922,638,https://www.flickr.com/photos/agfanclub/27061820631,https://creativecommons.org/licenses/by/2.0/,AJ Gulyas,https://www.flickr.com/people/agfanclub/\n655548fae336baed,https://c1.staticflickr.com/9/8782/29306804352_03d25ce870_o.jpg,0.25,0.25,0.75,1.0,664,490,http://www.flickr.com/photos/prof_richard/29306804352/,https://creativecommons.org/licenses/by/2.0/,Richard Mortel,https://www.flickr.com/people/prof_richard/\n615e495418e3a05c,https://c1.staticflickr.com/4/3947/32902081952_4986583f9d_o.jpg,0.0,0.25,0.75,1.0,118,659,http://www.flickr.com/photos/35693053@N04/32902081952,https://creativecommons.org/licenses/by/2.0/,Ross Elliott,https://www.flickr.com/people/ross_elliott/\nd8da85f009866249,https://c1.staticflickr.com/6/5751/30488108604_58337db71d_o.jpg,0.0,0.25,0.5,1.0,459,398,https://www.flickr.com/photos/shankaronline/30488108604/,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\nb021e837a38887ad,https://c1.staticflickr.com/6/5334/30653769375_f6efbfffb7_o.jpg,0.0,0.25,1.0,1.0,644,457,https://www.flickr.com/photos/tomronworldwide/30653769375/,https://creativecommons.org/licenses/by/2.0/,Ron Frazier,https://www.flickr.com/people/tomronworldwide/\n699488b43a12598f,https://c1.staticflickr.com/1/253/31488185906_57f7d6666c_o.jpg,0.0178890876565,0.0,1.0,1.0,545,804,https://www.flickr.com/photos/13476480@N07/31488185906,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n27eec8105515a1db,https://c1.staticflickr.com/1/588/32358895423_67268af0ec_o.jpg,0.511297376093,0.0,1.0,0.75,653,298,https://flickr.com/40994485@N04/32358895423,https://creativecommons.org/licenses/by/2.0/,Georgia National Guard,https://www.flickr.com/people/ganatlguard/\nf613452e95564242,https://c1.staticflickr.com/6/5691/30811964902_74270d7f1d_o.jpg,0.333333333333,0.0,1.0,1.0,840,697,https://www.flickr.com/photos/lisamilas/30811964902/,https://creativecommons.org/licenses/by/2.0/,Lisa Milas,https://www.flickr.com/people/lisamilas/\n3bf189e89600fab7,https://c1.staticflickr.com/8/7630/27335824192_fcbf9aeb62_o.jpg,0.210588633288,0.0,0.631765899865,0.75,704,744,https://www.flickr.com/photos/131880272@N06/27335824192,https://creativecommons.org/licenses/by/2.0/,K M,https://www.flickr.com/people/131880272@N06/\nd40343ec11465b3c,https://c1.staticflickr.com/1/483/32266689106_4ebbda6714_o.jpg,0.0,0.25,0.547453703704,1.0,875,231,https://www.flickr.com/photos/bazzadarambler/32266689106,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\n11876431739271f6,https://c1.staticflickr.com/8/7281/27209646476_f14ff59be1_o.jpg,0.321697324415,0.25,0.965091973244,1.0,309,224,https://www.flickr.com/photos/gails_pictures/27209646476/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n4a202c4d2ec8cb94,https://c1.staticflickr.com/9/8311/29808469505_030287bb55_o.jpg,0.49889380531,0.25,1.0,1.0,625,955,https://www.flickr.com/photos/uni-salzburg/29808469505,https://creativecommons.org/licenses/by/2.0/,Universit\\303\\244t Salzburg (PR),https://www.flickr.com/people/uni-salzburg/\n980ffe7b5dac5792,https://c1.staticflickr.com/8/7217/26575984800_0197c49f49_o.jpg,0.28125,0.25,0.84375,1.0,440,810,https://www.flickr.com/photos/slapers/26575984800,https://creativecommons.org/licenses/by/2.0/,Paul Arps,https://www.flickr.com/people/slapers/\n6eb464ba280d3883,https://c1.staticflickr.com/1/176/30709324723_a9058b46e6_o.jpg,0.25,0.0,1.0,1.0,840,568,https://www.flickr.com/photos/amanderson/30709324723/,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\n18ea2ea49b265d37,https://c1.staticflickr.com/9/8487/29452967005_e11e45dee0_o.jpg,0.25,0.25,1.0,1.0,914,9,https://www.flickr.com/photos/carlchristian/29452967005,https://creativecommons.org/licenses/by/2.0/,Carl Christian Gr\\303\\270ndahl,https://www.flickr.com/people/carlchristian/\n1804bb73960ecdea,https://c1.staticflickr.com/8/7066/27117274255_b3e3c9b035_o.jpg,0.28125,0.25,0.84375,1.0,974,931,https://www.flickr.com/photos/132646954@N02/27117274255/,https://creativecommons.org/licenses/by/2.0/,dronepicr,https://www.flickr.com/people/132646954@N02/\n526ad50c19fcb8b7,https://c1.staticflickr.com/3/2083/32026569874_9575ec3cef_o.jpg,0.425510204082,0.0,0.851020408163,0.75,407,50,https://www.flickr.com/photos/eltb/32026569874,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n897a3c48e2481149,https://c1.staticflickr.com/8/7345/27211435212_93490f6729_o.jpg,0.0,0.0,0.666666666667,1.0,752,757,https://www.flickr.com/photos/eksrx/27211435212/,https://creativecommons.org/licenses/by/2.0/,EKSRX,https://www.flickr.com/people/eksrx/\n1c92bf4ac0318c5c,https://c1.staticflickr.com/9/8342/29157833276_0dda95eefc_o.jpg,0.0,0.0,0.75,0.75,869,812,https://flickr.com/27963141@N00/29157833276,https://creativecommons.org/licenses/by/2.0/,Courtney Boyd Myers,https://www.flickr.com/people/courtbean/\nf06d24f1e3b09d90,https://c1.staticflickr.com/9/8077/29031588504_069c98d905_o.jpg,0.438671875,0.0,1.0,0.75,418,953,https://www.flickr.com/photos/xingxiyang/29031588504/,https://creativecommons.org/licenses/by/2.0/,Kiefer,https://www.flickr.com/people/xingxiyang/\n24a5746629ee7f3a,https://c1.staticflickr.com/6/5702/30894949235_2b36d46cac_o.jpg,0.28125,0.0,0.84375,0.75,285,373,https://flickr.com/36686400@N00/30894949235,https://creativecommons.org/licenses/by/2.0/,shellac,https://www.flickr.com/people/pldms/\nba8243f5066ab428,https://c1.staticflickr.com/8/7534/28060427926_4686971fd6_o.jpg,0.0,0.0,0.5625,0.75,998,741,https://www.flickr.com/photos/treegrow/28060427926/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n4a5012b748c480fd,https://c1.staticflickr.com/9/8387/29265133865_f093ee98ac_o.jpg,0.0,0.496301775148,0.75,1.0,407,561,https://www.flickr.com/photos/eltb/29265133865,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n35b7318798733412,https://c1.staticflickr.com/3/2865/33164098205_07dbedd1d3_o.jpg,0.269333843798,0.0,0.808001531394,0.75,848,907,https://www.flickr.com/photos/13476480@N07/33164098205/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n6b2ea691643f6f25,https://c1.staticflickr.com/8/7117/27697276410_51efe2c75a_o.jpg,0.0,0.23937007874,1.0,1.0,254,845,https://www.flickr.com/photos/70253321@N00/27697276410,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/\n7ffa6205e4379a9a,https://c1.staticflickr.com/9/8544/28512913754_fb5ede00ed_o.jpg,0.25,0.25,1.0,1.0,406,535,https://www.flickr.com/photos/exurban/28512913754,https://creativecommons.org/licenses/by/2.0/,Jayson Shenk,https://www.flickr.com/people/exurban/\n29410bdb64265c89,https://c1.staticflickr.com/6/5686/30744262330_328e081bef_o.jpg,0.25,0.0,0.75,0.75,806,994,https://www.flickr.com/photos/twan74/30744262330/,https://creativecommons.org/licenses/by/2.0/,Twan Van Dongen,https://www.flickr.com/people/twan74/\nd59e996d3462f970,https://c1.staticflickr.com/9/8558/29607216714_41ebbc9a5f_o.jpg,0.501840942563,0.25,1.0,1.0,561,643,https://www.flickr.com/photos/eaglebrook/29607216714/,https://creativecommons.org/licenses/by/2.0/,EaglebrookSchool,https://www.flickr.com/people/eaglebrook/\n60190bcf2ad06e96,https://c1.staticflickr.com/8/7420/26367907063_ca611a227a_o.jpg,0.0,0.0,0.871838111298,1.0,310,557,https://www.flickr.com/photos/gails_pictures/26367907063,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\ncb97dc7df4864b90,https://c1.staticflickr.com/6/5533/30919026221_6f3fb9a209_o.jpg,0.28125,0.25,0.84375,1.0,760,737,https://www.flickr.com/photos/augustksphotos/30919026221/,https://creativecommons.org/licenses/by/2.0/,August Kelm,https://www.flickr.com/people/augustksphotos/\n4e179bf6c5a9f998,https://c1.staticflickr.com/8/7664/26352238873_8f77c357c5_o.jpg,0.0,0.0,1.0,1.0,986,781,https://www.flickr.com/photos/jhtaylor/26352238873,https://creativecommons.org/licenses/by/2.0/,Julia Taylor,https://www.flickr.com/people/jhtaylor/\n95a1d81b5ccf8c13,https://c1.staticflickr.com/9/8446/28871217906_471052562c_o.jpg,0.4375,0.25,1.0,1.0,780,698,https://www.flickr.com/photos/thoseguys119/28871217906,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nfc8a8385ad487520,https://c1.staticflickr.com/9/8064/29602941756_04c36e3d0c_o.jpg,0.200323101777,0.0,1.0,1.0,95,304,https://www.flickr.com/photos/andymorffew/29602941756,https://creativecommons.org/licenses/by/2.0/,Andy  Morffew,https://www.flickr.com/people/andymorffew/\nf6a7dd4d677e62ae,https://c1.staticflickr.com/8/7057/27403439775_6f2e0689f3_o.jpg,0.0,0.25,0.490510948905,1.0,979,28,https://www.flickr.com/photos/johnshortland/27403439775,https://creativecommons.org/licenses/by/2.0/,john shortland,https://www.flickr.com/people/johnshortland/\n7aa6239440552d1e,https://c1.staticflickr.com/1/407/31455997020_a88c07a527_o.jpg,0.0,0.440717628705,0.75,1.0,114,713,https://www.flickr.com/photos/scotnelson/31455997020,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n688aca7fa5bffa73,https://c1.staticflickr.com/4/3923/33180907756_a64297d858_o.jpg,0.201612903226,0.0,1.0,1.0,519,538,https://www.flickr.com/photos/box_repsol/33180907756/,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\neb9efb2bd798eac8,https://c1.staticflickr.com/9/8368/28874857510_b068c9665f_o.jpg,0.25,0.25,0.75,1.0,404,832,https://www.flickr.com/photos/usnavy/28874857510,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n333323be56c0589d,https://c1.staticflickr.com/8/7444/27121910060_acfc66e8a3_o.jpg,0.5,0.0,1.0,0.75,405,151,https://www.flickr.com/photos/newsoresund/27121910060,https://creativecommons.org/licenses/by/2.0/,News Oresund,https://www.flickr.com/people/newsoresund/\n949b6656c77fc44c,https://c1.staticflickr.com/9/8419/29633802674_db7b847f6e_o.jpg,0.340175953079,0.0,1.0,1.0,548,361,https://www.flickr.com/photos/robdammers/29633802674,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n429d39104d553887,https://c1.staticflickr.com/1/730/32634846712_dbddcd8a1a_o.jpg,0.25,0.314766839378,1.0,1.0,324,807,https://www.flickr.com/photos/puliarfanita/32634846712,https://creativecommons.org/licenses/by/2.0/,Anita Ritenour,https://www.flickr.com/people/puliarfanita/\ncf76444721b06c6f,https://c1.staticflickr.com/3/2915/33037948775_6f4fb65dbf_o.jpg,0.247797356828,0.0,0.743392070485,0.75,548,976,https://www.flickr.com/photos/robdammers/33037948775/,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n847bfbb83034c673,https://c1.staticflickr.com/9/8793/28816297605_eef8a68d8d_o.jpg,0.4375,0.0,1.0,0.75,127,220,https://flickr.com/86548370@N00/28816297605,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\nc818e4dd21e80d0b,https://c1.staticflickr.com/1/331/31894377736_da36dafa6d_o.jpg,0.0,0.25,0.568396226415,1.0,806,491,https://flickr.com/143135875@N03/31894377736,https://creativecommons.org/licenses/by/2.0/,Save the Dream,https://www.flickr.com/people/143135875@N03/\n17655256e9e840db,https://c1.staticflickr.com/9/8506/29353868725_d6f269bff4_o.jpg,0.0,0.0,0.666666666667,1.0,484,841,https://www.flickr.com/photos/harshlight/29353868725,https://creativecommons.org/licenses/by/2.0/,HarshLight,https://www.flickr.com/people/harshlight/\n74ec5e9086ad260b,https://c1.staticflickr.com/1/697/31687423702_b20d0a28ac_o.jpg,0.0,0.0,1.0,1.0,539,779,https://www.flickr.com/photos/vitroids/31687423702/,https://creativecommons.org/licenses/by/2.0/,Masakazu Matsumoto,https://www.flickr.com/people/vitroids/\n1ed9d0097c8f4ac8,https://c1.staticflickr.com/6/5708/31195717806_0248e22819_o.jpg,0.0,0.0,0.5625,0.75,763,337,https://www.flickr.com/photos/moverelbigote/31195717806,https://creativecommons.org/licenses/by/2.0/,Mover el Bigote,https://www.flickr.com/people/moverelbigote/\nbc6d4701b1e74505,https://c1.staticflickr.com/9/8107/29013707233_c92f7210c2_o.jpg,0.324925816024,0.0,1.0,1.0,548,485,https://www.flickr.com/photos/8269539@N04/29013707233,https://creativecommons.org/licenses/by/2.0/,Paul Lucas,https://www.flickr.com/people/8269539@N04/\n2e20a18deb1216ad,https://c1.staticflickr.com/1/367/32131991750_50301ce3a2_o.jpg,0.225,0.0,0.675,0.75,133,954,https://www.flickr.com/photos/rusty_clark/32131991750,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\nb9a2de97d7ac1c34,https://c1.staticflickr.com/8/7392/27710327815_3373449a3a_o.jpg,0.503303964758,0.0,1.0,0.75,331,66,https://www.flickr.com/photos/usfwsmidwest/27710327815,https://creativecommons.org/licenses/by/2.0/,USFWSmidwest,https://www.flickr.com/people/usfwsmidwest/\n63570a584cc2c5c2,https://c1.staticflickr.com/9/8262/28857174883_1f150beb98_o.jpg,0.25,0.0,1.0,0.5,889,801,https://www.flickr.com/photos/atoach/28857174883/,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n455e0d28b61e5d77,https://c1.staticflickr.com/9/8525/29621105616_a6a85e6f08_o.jpg,0.25,0.25,0.75,1.0,578,32,https://www.flickr.com/photos/quinet/29621105616/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n4d6ec01f10988b30,https://c1.staticflickr.com/9/8237/28458447001_2b6eaed3a7_o.jpg,0.28125,0.0,0.84375,0.75,815,418,https://www.flickr.com/photos/nikonvscanon/28458447001,https://creativecommons.org/licenses/by/2.0/,David Blaikie,https://www.flickr.com/people/nikonvscanon/\n2bdbffb29d3a775c,https://c1.staticflickr.com/9/8552/29937703371_78fc337a2b_o.jpg,0.0,0.0,0.502588757396,0.75,844,555,https://www.flickr.com/photos/martius/29937703371,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\n4ae1e87e1855a760,https://c1.staticflickr.com/8/7570/29468158715_2b97f02bc0_o.jpg,0.25,0.25,0.75,1.0,662,460,https://www.flickr.com/photos/42220226@N07/29468158715,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\nbad9465acdcdc1ad,https://c1.staticflickr.com/8/7740/27009854992_92d873b440_o.jpg,0.4375,0.0,1.0,0.75,965,559,https://www.flickr.com/photos/39551170@N02/27009854992,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/\n073b699ce2135571,https://c1.staticflickr.com/9/8509/29433308770_32feeb0bd0_o.jpg,0.0,0.0,0.5,0.75,459,853,https://www.flickr.com/photos/80340800@N05/29433308770,https://creativecommons.org/licenses/by/2.0/,Peter,https://www.flickr.com/people/80340800@N05/\n242471eacd6a30fb,https://c1.staticflickr.com/1/773/31757271514_eed661d058_o.jpg,0.0,0.250923190547,0.75,0.75276957164,888,482,https://www.flickr.com/photos/eltb/31757271514,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n034f77eae2228f33,https://c1.staticflickr.com/6/5484/30468956330_fafdf7255f_o.jpg,0.5,0.25,1.0,1.0,699,911,https://www.flickr.com/photos/tipsfortravellers/30468956330,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\nadc6b364404bde53,https://c1.staticflickr.com/9/8374/29863343296_574e3b8297_o.jpg,0.0,0.421177266576,0.75,0.842354533153,874,789,https://www.flickr.com/photos/ankurp/29863343296,https://creativecommons.org/licenses/by/2.0/,Ankur P,https://www.flickr.com/people/ankurp/\nc3ea33d2e15d202d,https://c1.staticflickr.com/9/8606/27791184724_847315c035_o.jpg,0.25,0.25,1.0,1.0,392,572,https://www.flickr.com/photos/mamnaimie/27791184724,https://creativecommons.org/licenses/by/2.0/,piotr mamnaimie,https://www.flickr.com/people/mamnaimie/\n6376137590e81be5,https://c1.staticflickr.com/8/7362/27077720003_68aae9ec05_o.jpg,0.306930693069,0.0,0.920792079208,1.0,304,387,https://www.flickr.com/photos/m-a-r-t-i-n/27077720003,https://creativecommons.org/licenses/by/2.0/,Martin Cooper,https://www.flickr.com/people/m-a-r-t-i-n/\n9ce1eab2e8a89a50,https://c1.staticflickr.com/6/5544/31245586366_f6c39f6b92_o.jpg,0.5,0.25,1.0,1.0,769,676,https://www.flickr.com/photos/jill_carlson/31245586366/,https://creativecommons.org/licenses/by/2.0/,Jill Carlson (jillcarlson.org),https://www.flickr.com/people/jill_carlson/\n278ef4fc6c9ff3bd,https://c1.staticflickr.com/8/7793/26970017146_ca13ed9cc5_o.jpg,0.5,0.25,1.0,1.0,806,221,https://www.flickr.com/photos/stabakcomeback/26970017146,https://creativecommons.org/licenses/by/2.0/,Stab\\303\\246k Comeback Team,https://www.flickr.com/people/stabakcomeback/\n03b8c0d800873383,https://c1.staticflickr.com/9/8642/28927887276_4f02407854_o.jpg,0.337738619677,0.0,1.0,1.0,771,632,https://www.flickr.com/photos/spera-designerschuhe/28927887276,https://creativecommons.org/licenses/by/2.0/,\"SPERA.de Designerschuhe, Taschen und Accessoires\",https://www.flickr.com/people/spera-designerschuhe/\nfb72826ed52164d8,https://c1.staticflickr.com/6/5649/30468919110_2ae742121d_o.jpg,0.25,0.0,0.75,0.75,699,515,https://www.flickr.com/photos/tipsfortravellers/30468919110/,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n24afcbc942da4f1d,https://c1.staticflickr.com/8/7337/26821533233_c5f568c219_o.jpg,0.0,0.0,0.666666666667,1.0,321,572,https://www.flickr.com/photos/52450054@N04/26821533233,https://creativecommons.org/licenses/by/2.0/,Judy Gallagher,https://www.flickr.com/people/52450054@N04/\n873da6fb94924159,https://c1.staticflickr.com/9/8658/28336534461_07be273f45_o.jpg,0.269333843798,0.25,0.808001531394,1.0,975,532,https://www.flickr.com/photos/jsjgeology/28336534461,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n45b463a50e07f882,https://c1.staticflickr.com/8/7574/28720436840_3b7859c286_o.jpg,0.333333333333,0.0,1.0,1.0,320,988,https://www.flickr.com/photos/tejvan/28720436840,https://creativecommons.org/licenses/by/2.0/,Tejvan Pettinger,https://www.flickr.com/people/tejvan/\n60bad371625ab964,https://c1.staticflickr.com/9/8217/29265526604_d43161bcb9_o.jpg,0.543661971831,0.0,1.0,0.75,702,493,https://www.flickr.com/photos/texaus1/29265526604/,https://creativecommons.org/licenses/by/2.0/,texaus1,https://www.flickr.com/people/texaus1/\nd1d4e9e224332afb,https://c1.staticflickr.com/6/5831/31047829881_0d5e75063d_o.jpg,0.0,0.285686119874,0.75,0.857058359621,142,642,https://www.flickr.com/photos/dkeats/31047829881/,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n0c9b2c4eb592ba42,https://c1.staticflickr.com/9/8256/28919935500_339f23b367_o.jpg,0.499375,0.25,1.0,1.0,806,95,https://www.flickr.com/photos/143134916@N06/28919935500/,https://creativecommons.org/licenses/by/2.0/,Miranda Mylne,https://www.flickr.com/people/143134916@N06/\n17395bc0a3ed6388,https://c1.staticflickr.com/8/7555/26500044183_4ee8b79838_o.jpg,0.25,0.0,1.0,0.599757673667,422,839,https://www.flickr.com/photos/peterhess/26500044183,https://creativecommons.org/licenses/by/2.0/,Peter Alfred Hess,https://www.flickr.com/people/peterhess/\n77da99df706fe501,https://c1.staticflickr.com/8/7456/27603917315_96ab8da5d6_o.jpg,0.0,0.326388888889,0.75,0.979166666667,788,91,https://www.flickr.com/photos/conner395/27603917315,https://creativecommons.org/licenses/by/2.0/,Dave Conner,https://www.flickr.com/people/conner395/\n195f6b93ce83d376,https://c1.staticflickr.com/1/407/32235056900_e892940325_o.jpg,0.333333333333,0.0,1.0,1.0,868,966,https://www.flickr.com/photos/76969036@N02/32235056900,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n8eb8699863591e64,https://c1.staticflickr.com/8/7794/26892523043_5373c83de0_o.jpg,0.0,0.25,0.5,1.0,512,984,https://www.flickr.com/photos/greggjerdingen/26892523043,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n95cb84a8cd49955b,https://c1.staticflickr.com/6/5329/31244584072_80df6dce7a_o.jpg,0.0,0.0,0.666666666667,1.0,556,721,https://www.flickr.com/photos/rpavich/31244584072,https://creativecommons.org/licenses/by/2.0/,rpavich,https://www.flickr.com/people/rpavich/\n39e679dd1fb167f9,https://c1.staticflickr.com/9/8771/28874428046_e37fbca3a5_o.jpg,0.5,0.0,1.0,0.75,982,573,https://www.flickr.com/photos/mindahaas/28874428046,https://creativecommons.org/licenses/by/2.0/,Minda Haas Kuhlmann,https://www.flickr.com/people/mindahaas/\n8b41cf5c37d1e806,https://c1.staticflickr.com/9/8354/27749850074_26f1a5bfbe_o.jpg,0.0,0.0,0.5625,0.75,976,859,https://www.flickr.com/photos/jeffhollettvancouverwa/27749850074,https://creativecommons.org/licenses/by/2.0/,Jeff Hollett,https://www.flickr.com/people/jeffhollettvancouverwa/\n7813339c05a069fe,https://c1.staticflickr.com/8/7786/27050345992_fbc4baa162_o.jpg,0.421177266576,0.0,0.842354533153,0.75,985,263,https://www.flickr.com/photos/sauterel/27050345992,https://creativecommons.org/licenses/by/2.0/,J\\303\\251r\\303\\251my Sauterel,https://www.flickr.com/people/sauterel/\n0c8ddf3813edea99,https://c1.staticflickr.com/9/8630/28976073876_6160c47ca1_o.jpg,0.331130690162,0.0,0.993392070485,1.0,920,910,https://flickr.com/144551102@N07/28976073876,https://creativecommons.org/licenses/by/2.0/,Investment Zen,https://www.flickr.com/people/investmentzen/\n01b2592eec61252d,https://c1.staticflickr.com/8/7530/26568065093_ecd3bb9ae1_o.jpg,0.0,0.0,0.421177266576,0.75,977,557,https://www.flickr.com/photos/oatsy40/26568065093/,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/\n7b6ba615471d32ed,https://c1.staticflickr.com/1/589/33247617972_04f139e4fe_o.jpg,0.0,0.0,0.75,0.5,964,613,https://www.flickr.com/photos/_-o-_/33247617972/,https://creativecommons.org/licenses/by/2.0/,Thomas,https://www.flickr.com/people/_-o-_/\naeb1e681ad1ec720,https://c1.staticflickr.com/9/8222/29831695975_b847a52057_o.jpg,0.37517831669,0.0,1.0,1.0,979,388,https://www.flickr.com/photos/tdlucas5000/29831695975,https://creativecommons.org/licenses/by/2.0/,tdlucas5000,https://www.flickr.com/people/tdlucas5000/\nb6d39b42bd4c4f1b,https://c1.staticflickr.com/9/8145/29519095115_48722b84f1_o.jpg,0.0,0.25,0.75,1.0,196,373,https://flickr.com/52066925@N00/29519095115,https://creativecommons.org/licenses/by/2.0/,anneheathen,https://www.flickr.com/people/annethelibrarian/\nc491d498a63f5d04,https://c1.staticflickr.com/6/5771/30566724705_126975b83c_o.jpg,0.5,0.0,1.0,0.75,511,410,https://flickr.com/22539273@N00/30566724705,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\nc68a7f95358d000e,https://c1.staticflickr.com/8/7551/26553707663_7df942348d_o.jpg,0.25,0.0,1.0,0.740574506284,780,845,https://www.flickr.com/photos/thoseguys119/26553707663,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n991023218c5bc04c,https://c1.staticflickr.com/6/5621/29827832963_a456a1d146_o.jpg,0.25,0.0,1.0,1.0,459,535,https://www.flickr.com/photos/davidwilson1949/29827832963/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n37cf19b4c1a7c320,https://c1.staticflickr.com/9/8741/27914336480_5e944bf24b_o.jpg,0.112244897959,0.0,1.0,1.0,86,904,https://www.flickr.com/photos/winnu/27914336480/,https://creativecommons.org/licenses/by/2.0/,Nigel,https://www.flickr.com/people/winnu/\n1ed36bcbf5dcaad2,https://c1.staticflickr.com/9/8568/28402665310_7f39ac77bd_o.jpg,0.454545454545,0.25,1.0,1.0,874,925,https://www.flickr.com/photos/infrogmation/28402665310,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/\n344c3091a2cf05b1,https://c1.staticflickr.com/9/8518/29425205001_03ca5a12c2_o.jpg,0.324925816024,0.0,1.0,1.0,920,541,https://www.flickr.com/photos/duncanh1/29425205001,https://creativecommons.org/licenses/by/2.0/,Dun.can,https://www.flickr.com/people/duncanh1/\n078c928a70ed1118,https://c1.staticflickr.com/9/8637/28562284352_df677874fc_o.jpg,0.0,0.0,0.75,0.5,777,201,https://www.flickr.com/photos/24365773@N03/28562284352,https://creativecommons.org/licenses/by/2.0/,Man Alive!,https://www.flickr.com/people/24365773@N03/\n3ca6dfbeffec15d8,https://c1.staticflickr.com/6/5709/22845615358_4dbece279f_o.jpg,0.286971830986,0.25,1.0,1.0,721,227,https://www.flickr.com/photos/usdagov/22845615358,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n1971b87c6680235e,https://c1.staticflickr.com/3/2475/32810778076_cf7d87f2d7_o.jpg,0.0,0.25,0.608536585366,1.0,887,444,https://www.flickr.com/photos/vitroids/32810778076,https://creativecommons.org/licenses/by/2.0/,Masakazu Matsumoto,https://www.flickr.com/people/vitroids/\n1a554d01773b4b91,https://c1.staticflickr.com/6/5769/29680929103_f05a1b3972_o.jpg,0.421177266576,0.0,0.842354533153,0.75,780,397,https://www.flickr.com/photos/119034083@N02/29680929103/,https://creativecommons.org/licenses/by/2.0/,nybuspics,https://www.flickr.com/people/119034083@N02/\n22803820be0e282a,https://c1.staticflickr.com/8/7793/27919179674_d07328a8cd_o.jpg,0.0,0.25,0.553488372093,1.0,472,956,https://www.flickr.com/photos/jlcernadas/27919179674/,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\n35ad6492796c6da6,https://c1.staticflickr.com/8/7645/28724984041_afb8265da5_o.jpg,0.25,0.0,0.75,0.75,465,875,https://flickr.com/21712103@N06/28724984041,https://creativecommons.org/licenses/by/2.0/,media.digest,https://www.flickr.com/people/photo-digest/\nd709b3b07426a833,https://c1.staticflickr.com/6/5275/29951542811_f83d2af94e_o.jpg,0.28125,0.25,0.84375,1.0,923,43,https://www.flickr.com/photos/wfryer/29951542811,https://creativecommons.org/licenses/by/2.0/,Wesley Fryer,https://www.flickr.com/people/wfryer/\n2cda2bc7950d1803,https://c1.staticflickr.com/8/7472/26432450134_4897a866a5_o.jpg,0.0,0.0,0.75,0.75,760,301,https://www.flickr.com/photos/vienois/26432450134,https://creativecommons.org/licenses/by/2.0/,Traveling Darkroom,https://www.flickr.com/people/vienois/\n0760df7b9f52457d,https://c1.staticflickr.com/9/8846/28747826542_68979fe362_o.jpg,0.4375,0.0,1.0,0.75,822,575,https://www.flickr.com/photos/zongo/28747826542,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\ndecae972dfb0388d,https://c1.staticflickr.com/9/8129/30110286906_f6cc5c2d28_o.jpg,0.25,0.517391304348,1.0,1.0,113,866,https://www.flickr.com/photos/jsjgeology/30110286906,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n2415686df039fdbc,https://c1.staticflickr.com/8/7408/26713896834_35fe074816_o.jpg,0.0,0.0,0.562330623306,1.0,542,670,https://www.flickr.com/photos/gonmi/26713896834,https://creativecommons.org/licenses/by/2.0/,Nacho,https://www.flickr.com/people/gonmi/\nf12d9fb74d93ac1b,https://c1.staticflickr.com/8/7524/29248924341_341c681c07_o.jpg,0.25,0.25,0.75,1.0,148,414,https://flickr.com/23524762@N00/29248924341,https://creativecommons.org/licenses/by/2.0/,Artie Kopelman,https://www.flickr.com/people/ah_kopelman/\na8d24cae46f367f8,https://c1.staticflickr.com/1/332/32190482520_35c146ac90_o.jpg,0.0,0.25,0.5,1.0,880,990,https://www.flickr.com/photos/31029865@N06/32190482520,https://creativecommons.org/licenses/by/2.0/,Dick Thomas Johnson,https://www.flickr.com/people/31029865@N06/\nd0e72f1ac9850b1b,https://c1.staticflickr.com/9/8401/28943173665_455984fc52_o.jpg,0.0,0.0,0.663412563667,0.75,672,54,https://www.flickr.com/photos/glorycycles/28943173665,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n5f844c8eecf60283,https://c1.staticflickr.com/3/2402/32563390420_867be07e42_o.jpg,0.2515625,0.0,1.0,1.0,305,124,http://www.flickr.com/photos/treegrow/32563390420/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n3fa6bf8463f5f498,https://c1.staticflickr.com/6/5666/30858423940_09a8fb8ff4_o.jpg,0.25,0.25,0.75,1.0,873,577,https://www.flickr.com/photos/presidentialoffice/30858423940,https://creativecommons.org/licenses/by/2.0/,\\347\\270\\275\\347\\265\\261\\345\\272\\234,https://www.flickr.com/people/presidentialoffice/\nd441eb660d2c9b7a,https://c1.staticflickr.com/1/657/32224351623_83ae2382c4_o.jpg,0.25,0.0,1.0,0.736583184258,978,256,https://www.flickr.com/photos/jlcernadas/32224351623,https://creativecommons.org/licenses/by/2.0/,Jose Luis Cernadas Iglesias,https://www.flickr.com/people/jlcernadas/\n4ca8c4a7f7322ee8,https://c1.staticflickr.com/9/8620/27980886830_1ce1fa3740_o.jpg,0.248713235294,0.25,0.746139705882,1.0,625,793,https://www.flickr.com/photos/vvbad/27980886830,https://creativecommons.org/licenses/by/2.0/,VVBAD,https://www.flickr.com/people/vvbad/\n6ff6a4993c9e296c,https://c1.staticflickr.com/6/5635/30741341732_a1eed2f0c4_o.jpg,0.25,0.25,0.75,1.0,949,328,https://www.flickr.com/photos/watts_photos/30741341732/,https://creativecommons.org/licenses/by/2.0/,C Watts,https://www.flickr.com/people/watts_photos/\n3002c7a80e250ffe,https://c1.staticflickr.com/1/525/31074822804_0b75bd3791_o.jpg,0.0,0.0,0.75,0.674229452055,533,757,https://flickr.com/47544036@N03/31074822804,https://creativecommons.org/licenses/by/2.0/,Indo Gemstone IndoGemstone,https://www.flickr.com/people/indogemstone/\n6896681fcd9aa109,https://c1.staticflickr.com/6/5833/30193550762_122b9a626f_o.jpg,0.0561403508772,0.0,1.0,1.0,982,503,https://www.flickr.com/photos/apardavila/30193550762,https://creativecommons.org/licenses/by/2.0/,Arturo Pardavila III,https://www.flickr.com/people/apardavila/\n76d4df36ca6fd78b,https://c1.staticflickr.com/8/7124/27193861553_f19b7205cd_o.jpg,0.281690140845,0.0,0.845070422535,0.75,986,825,https://www.flickr.com/photos/swallowtailgardenseeds/27193861553,https://creativecommons.org/licenses/by/2.0/,Swallowtail Garden Seeds,https://www.flickr.com/people/swallowtailgardenseeds/\n3358bb7f4c17c8a4,https://c1.staticflickr.com/6/5333/30345489662_a39c2201ce_o.jpg,0.0,0.400242326333,0.75,1.0,973,646,https://flickr.com/26547429@N02/30345489662,https://creativecommons.org/licenses/by/2.0/,Ghost Behind The Lens,https://www.flickr.com/people/ocheen/\n62b90b5ae8ac685e,https://c1.staticflickr.com/8/7406/26190703664_9e626bb83f_o.jpg,0.25,0.0,1.0,1.0,622,428,https://www.flickr.com/photos/amslerpix/26190703664/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n21eb821ccf42813a,https://c1.staticflickr.com/6/5466/29997226772_1d8a3f9d47_o.jpg,0.5,0.25,1.0,1.0,561,564,https://www.flickr.com/photos/116153846@N06/29997226772/,https://creativecommons.org/licenses/by/2.0/,mike dupris,https://www.flickr.com/people/116153846@N06/\n6ed4a29b181dc758,https://c1.staticflickr.com/9/8136/29162731380_6953c4661f_o.jpg,0.0,0.0,0.666666666667,1.0,512,506,https://www.flickr.com/photos/greggjerdingen/29162731380/,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\ne36dddff51b421e2,https://c1.staticflickr.com/6/5707/30312980204_4d56d92f23_o.jpg,0.0,0.0,0.561569688769,1.0,511,808,https://www.flickr.com/photos/oatsy40/30312980204/,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/\ned3f7f459c209ab8,https://c1.staticflickr.com/9/8348/28253462770_ec6806ed8a_o.jpg,0.429527559055,0.25,1.0,1.0,473,147,https://www.flickr.com/photos/bdom/28253462770/,https://creativecommons.org/licenses/by/2.0/,bDom - artiste - www.bdom.info,https://www.flickr.com/people/bdom/\nfc22fbca42cf2960,https://c1.staticflickr.com/1/287/31882075412_582e1f992a_o.jpg,0.25,0.0,1.0,0.5625,108,299,https://www.flickr.com/photos/jimg944/31882075412,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n963869f9295298d5,https://c1.staticflickr.com/9/8183/28832932845_2d58a0f0bd_o.jpg,0.25,0.0,1.0,0.75,512,547,https://www.flickr.com/photos/atoach/28832932845,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\n95615275d19f5ada,https://c1.staticflickr.com/9/8243/28075375513_8670476428_o.jpg,0.0,0.25,0.5,1.0,625,858,https://www.flickr.com/photos/icte-uq/28075375513,https://creativecommons.org/licenses/by/2.0/,ICTE-UQ,https://www.flickr.com/people/icte-uq/\n602e769ee7e788de,https://c1.staticflickr.com/6/5834/30937916961_8a8121dffd_o.jpg,0.0,0.0,0.501846381093,0.75,459,549,https://www.flickr.com/photos/francisvallance/30937916961/,https://creativecommons.org/licenses/by/2.0/,Francis Vallance (Heritage Warrior),https://www.flickr.com/people/francisvallance/\nf107b64f254b2358,https://c1.staticflickr.com/8/7097/26936899386_d00cf2d1f6_o.jpg,0.421177266576,0.25,0.842354533153,1.0,566,646,https://www.flickr.com/photos/thepassengertrain/26936899386/in/dateposted-friend/,https://creativecommons.org/licenses/by/2.0/,Jos\\303\\251 Pereda,https://www.flickr.com/people/thepassengertrain/\naa40a2b3c3669785,https://c1.staticflickr.com/1/435/32446527496_4811f3c2d8_o.jpg,0.0,0.0,0.792604501608,1.0,951,461,https://flickr.com/17467193@N00/32446527496,https://creativecommons.org/licenses/by/2.0/,jesse1dog,https://www.flickr.com/people/jesseflickrdog/\n4b6dc719bde7e53e,https://c1.staticflickr.com/1/264/31641355323_3a420df6aa_o.jpg,0.518089725036,0.0,1.0,0.75,82,854,https://flickr.com/75576067@N03/31641355323,https://creativecommons.org/licenses/by/2.0/,Always a birder!,https://www.flickr.com/people/alwaysabirder/\n8b67e578f558cbd1,https://c1.staticflickr.com/1/381/32251290882_909fca8244_o.jpg,0.0,0.0,0.623970345964,0.75,326,750,https://www.flickr.com/photos/gails_pictures/32251290882/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\ne3199060826add66,https://c1.staticflickr.com/8/7521/26469172193_89c7521397_o.jpg,0.63211125158,0.25,1.0,1.0,706,541,https://www.flickr.com/photos/jsjgeology/26469172193,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nfcb8b89aec2bfbf9,https://c1.staticflickr.com/9/8292/29025884234_5b495ca77b_o.jpg,0.248713235294,0.0,0.746139705882,0.75,748,755,https://www.flickr.com/photos/holiday-extras/29025884234,https://creativecommons.org/licenses/by/2.0/,Holidayextras,https://www.flickr.com/people/holiday-extras/\nafea02f4b5067a0d,https://c1.staticflickr.com/1/458/32153923192_e4132b3168_o.jpg,0.341370558376,0.0,1.0,0.75,327,743,http://www.flickr.com/photos/gails_pictures/32153923192/,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n282bc03cc2a5c35f,https://c1.staticflickr.com/6/5832/30963414056_c210351727_o.jpg,0.25,0.0,1.0,0.744604316547,604,470,https://www.flickr.com/photos/13476480@N07/30963414056,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n4d8738f69fe30804,https://c1.staticflickr.com/1/525/31927294734_8952a51131_o.jpg,0.25,0.0,0.75,0.75,868,842,https://www.flickr.com/photos/76969036@N02/31927294734/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n8c25acb3c180ab09,https://c1.staticflickr.com/1/320/32417107542_6491c19115_o.jpg,0.25,0.0,0.75,0.75,600,659,https://www.flickr.com/photos/karen_roe/32417107542,https://creativecommons.org/licenses/by/2.0/,Karen Roe,https://www.flickr.com/people/karen_roe/\n890f2cab34341428,https://c1.staticflickr.com/9/8605/28213111224_2086c4af60_o.jpg,0.4375,0.25,1.0,1.0,563,451,https://www.flickr.com/photos/36668466@N05/28213111224,https://creativecommons.org/licenses/by/2.0/,Fernando Medina,https://www.flickr.com/people/36668466@N05/\na1d70e8b6062e228,https://c1.staticflickr.com/9/8556/29775848175_65f31f79d7_o.jpg,0.0,0.0,0.496696035242,0.75,625,868,https://www.flickr.com/photos/pedrocaetano/29775848175,https://creativecommons.org/licenses/by/2.0/,Pedro,https://www.flickr.com/people/pedrocaetano/\n0f3917a53d9af1b1,https://c1.staticflickr.com/8/7545/27467654966_00bdba7fa3_o.jpg,0.25,0.0,1.0,0.75,845,726,https://flickr.com/41898857@N04/27467654966,https://creativecommons.org/licenses/by/2.0/,SparkFun Electronics,https://www.flickr.com/people/sparkfun/\n4fa1b6ed1ac46c13,https://c1.staticflickr.com/6/5823/31007561916_a985bd7ed8_o.jpg,0.128161888702,0.0,1.0,1.0,820,481,https://www.flickr.com/photos/tomronworldwide/31007561916/,https://creativecommons.org/licenses/by/2.0/,Ron Frazier,https://www.flickr.com/people/tomronworldwide/\nd96aa254a9d06f19,https://c1.staticflickr.com/8/7247/26466263693_df0e519a95_o.jpg,0.25,0.25,1.0,1.0,968,649,https://www.flickr.com/photos/journeyscoffee/26466263693,https://creativecommons.org/licenses/by/2.0/,Dan Lacher,https://www.flickr.com/people/journeyscoffee/\nbc3c605c14599dc9,https://c1.staticflickr.com/9/8308/27956576013_2f9f7a8657_o.jpg,0.421177266576,0.0,0.842354533153,0.75,980,40,https://www.flickr.com/photos/blmoregon/27956576013,https://creativecommons.org/licenses/by/2.0/,Bureau of Land Management Oregon and Washington,https://www.flickr.com/people/blmoregon/\nb96a687a469af6b3,https://c1.staticflickr.com/6/5698/31207832001_99ed65c6c4_o.jpg,0.0,0.0,0.5,0.75,868,273,https://www.flickr.com/photos/76969036@N02/31207832001,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\nd00e37994716353a,https://c1.staticflickr.com/8/7597/27481303810_790d4028a1_o.jpg,0.21087398374,0.25,0.63262195122,1.0,976,692,https://www.flickr.com/photos/heyitsbenrobinson/27481303810,https://creativecommons.org/licenses/by/2.0/,Ben Robinson,https://www.flickr.com/people/heyitsbenrobinson/\n5b478f16b99ee75e,https://c1.staticflickr.com/8/7433/27355223014_d074395808_o.jpg,0.0,0.0,0.666666666667,1.0,668,613,https://www.flickr.com/photos/ufv/27355223014,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/\n8bf626dff1c0cede,https://c1.staticflickr.com/8/7135/27419669343_23d4403dda_o.jpg,0.0,0.25,0.75,1.0,461,627,https://www.flickr.com/photos/idovermani/27419669343/,https://creativecommons.org/licenses/by/2.0/,Dov Harrington,https://www.flickr.com/people/idovermani/\nf93154f181883e71,https://c1.staticflickr.com/8/7157/26708144763_7b0e8d12a7_o.jpg,0.0,0.25,0.502588757396,1.0,604,9,https://www.flickr.com/photos/edenpictures/26708144763,https://creativecommons.org/licenses/by/2.0/,\"Eden, Janine and Jim\",https://www.flickr.com/people/edenpictures/\n6d1bfad890b0b1c2,https://c1.staticflickr.com/8/7569/28771176582_32b5156f0c_o.jpg,0.288109756098,0.0,1.0,1.0,561,580,https://www.flickr.com/photos/klemencic/28771176582,https://creativecommons.org/licenses/by/2.0/,K.M. Klemencic,https://www.flickr.com/people/klemencic/\nf408f6a2edee1f3f,https://c1.staticflickr.com/8/7795/26823623503_287f53558c_o.jpg,0.25,0.0,1.0,0.75,778,827,https://www.flickr.com/photos/moto_club4ag/26823623503,https://creativecommons.org/licenses/by/2.0/,Moto &quot;Club4AG&quot; Miwa,https://www.flickr.com/people/moto_club4ag/\nf5cd3e269b0f388e,https://c1.staticflickr.com/8/7013/27070641421_f49b733b7d_o.jpg,0.25,0.0,0.75,0.75,301,768,https://www.flickr.com/photos/briangratwicke/27070641421,https://creativecommons.org/licenses/by/2.0/,Brian Gratwicke,https://www.flickr.com/people/briangratwicke/\n0611703cbfcefc21,https://c1.staticflickr.com/1/558/32471056652_29d76e0150_o.jpg,0.0,0.25,0.5,1.0,473,850,https://www.flickr.com/photos/30478819@N08/32471056652,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\nd4c06c1da1658af6,https://c1.staticflickr.com/8/7249/27041481226_3ecd5d2bc7_o.jpg,0.25,0.2806640625,1.0,0.8419921875,558,607,https://www.flickr.com/photos/dainismatisons/27041481226,https://creativecommons.org/licenses/by/2.0/,Dainis Matisons,https://www.flickr.com/people/dainismatisons/\n49dcebfc5f06cf7b,https://c1.staticflickr.com/9/8192/29182858674_cc3a87e959_o.jpg,0.0,0.0,0.5,0.75,405,393,https://www.flickr.com/photos/alessandroambrosetti/29182858674/,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/\n1376d42862646478,https://c1.staticflickr.com/1/490/32016746180_e4fc8acb29_o.jpg,0.5,0.25,1.0,1.0,731,830,https://www.flickr.com/photos/quinet/32016746180,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\n90ec4bfe75a1d915,https://c1.staticflickr.com/1/274/32581927456_a7ed3391ab_o.jpg,0.0,0.0,0.75,0.599757673667,747,99,https://www.flickr.com/photos/mark6mauno/32581927456,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/\nc8cef686ffba362d,https://c1.staticflickr.com/9/8248/28374641312_8c77c363cc_o.jpg,0.0,0.0,0.75,1.0,527,357,https://www.flickr.com/photos/cambodia4kidsorg/28374641312,https://creativecommons.org/licenses/by/2.0/,Cambodia4kids.org Beth Kanter,https://www.flickr.com/people/cambodia4kidsorg/\nee6009e30c777a0c,https://c1.staticflickr.com/6/5572/29487040554_da789c18a4_o.jpg,0.0,0.0,0.5625,0.75,975,354,https://flickr.com/47445767@N05/29487040554,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\n807a428d832e68d3,https://c1.staticflickr.com/8/7499/27490061826_df9bab0294_o.jpg,0.0,0.25,0.543461538462,1.0,651,749,https://flickr.com/132839593@N02/27490061826,https://creativecommons.org/licenses/by/2.0/,Riberto Frederico,https://www.flickr.com/people/132839593@N02/\nf7707d76d59b537d,https://c1.staticflickr.com/8/7197/27220170255_f20eab87ef_o.jpg,0.578822733424,0.0,1.0,0.75,629,898,https://www.flickr.com/photos/patrice_calatayu/27220170255,https://creativecommons.org/licenses/by/2.0/,Patrice CALATAYU,https://www.flickr.com/people/patrice_calatayu/\n18315f3ae78391e5,https://c1.staticflickr.com/9/8573/27804481733_67c82e98bd_o.jpg,0.0,0.0,0.640173410405,1.0,975,479,https://www.flickr.com/photos/jsjgeology/27804481733,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nbfca9c790fc8c01b,https://c1.staticflickr.com/1/522/32555560306_923eb4e177_o.jpg,0.25,0.0,0.75,0.75,484,832,https://www.flickr.com/photos/gravitat-off/32555560306,https://creativecommons.org/licenses/by/2.0/,gravitat-OFF,https://www.flickr.com/people/gravitat-off/\n49e82d2b96bc223a,https://c1.staticflickr.com/6/5681/30268264846_246ab880b5_o.jpg,0.333333333333,0.0,1.0,1.0,835,525,https://www.flickr.com/photos/avedaphotos/30268264846,https://creativecommons.org/licenses/by/2.0/,Aveda Corporation,https://www.flickr.com/people/avedaphotos/\ndb540b162d21f131,https://c1.staticflickr.com/9/8257/29674247336_6b1775e7c7_o.jpg,0.0,0.0,0.75,1.0,459,649,https://www.flickr.com/photos/rheba/29674247336,https://creativecommons.org/licenses/by/2.0/,Rheba,https://www.flickr.com/people/rheba/\na43196bcf70e3d1b,https://c1.staticflickr.com/8/7314/27753523935_727cb8e35c_o.jpg,0.0,0.0,0.75,1.0,24,967,https://www.flickr.com/photos/amanderson/27753523935,https://creativecommons.org/licenses/by/2.0/,amanderson2,https://www.flickr.com/people/amanderson/\nb2e89d2d86fb11fd,https://c1.staticflickr.com/8/7372/28038354721_f8691750eb_o.jpg,0.333333333333,0.0,1.0,1.0,980,495,https://www.flickr.com/photos/davebloggs007/28038354721,https://creativecommons.org/licenses/by/2.0/,Thank you for visiting my page,https://www.flickr.com/people/davebloggs007/\n6f4a4af6fe6af183,https://c1.staticflickr.com/8/7067/27153599051_b7522e0f30_o.jpg,0.4375,0.25,1.0,1.0,966,308,https://www.flickr.com/photos/55229469@N07/27153599051,https://creativecommons.org/licenses/by/2.0/,Forsaken Fotos,https://www.flickr.com/people/55229469@N07/\nf4d150c15cf1dbae,https://c1.staticflickr.com/1/289/31513756992_0cf2b5ec9b_o.jpg,0.0,0.0,0.518018018018,0.75,973,427,https://www.flickr.com/photos/clairity/31513756992,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\n1d73de0c6e148cc5,https://c1.staticflickr.com/1/358/32329710092_ea5d41d96e_o.jpg,0.297226688103,0.0,0.891680064309,0.75,311,764,https://www.flickr.com/photos/gails_pictures/32329710092,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n55ffe38dfe142a62,https://c1.staticflickr.com/8/7190/27892448656_3093a4e3c2_o.jpg,0.25,0.4375,1.0,1.0,459,656,https://www.flickr.com/photos/16894927@N08/27892448656/,https://creativecommons.org/licenses/by/2.0/,todd.vision,https://www.flickr.com/people/16894927@N08/\nb621fed904bb921c,https://c1.staticflickr.com/8/7443/27479683111_66cb66a7ed_o.jpg,0.25,0.0,1.0,0.75,611,118,https://www.flickr.com/photos/hmk/27479683111,https://creativecommons.org/licenses/by/2.0/,H. Michael Karshis,https://www.flickr.com/people/hmk/\nd841169bb11cd083,https://c1.staticflickr.com/8/7321/26792025860_6ccff53fa4_o.jpg,0.29465849387,0.0,1.0,0.75,323,120,https://www.flickr.com/photos/33398884@N03/26792025860,https://creativecommons.org/licenses/by/2.0/,Ben Sale,https://www.flickr.com/people/33398884@N03/\n5f995220f250d08d,https://c1.staticflickr.com/8/7553/28120915535_3dd5604d97_o.jpg,0.25,0.0,1.0,1.0,735,517,https://www.flickr.com/photos/27665395@N05/28120915535,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nba5b137369090cd4,https://c1.staticflickr.com/6/5642/30586137583_df7a540357_o.jpg,0.0,0.0,0.501846381093,0.75,971,670,http://www.flickr.com/photos/flightlog/30586137583/,https://creativecommons.org/licenses/by/2.0/,flightlog,https://www.flickr.com/people/flightlog/\n961a16572c6a2132,https://c1.staticflickr.com/1/718/33055344860_28dd9fb708_o.jpg,0.256343283582,0.0,0.769029850746,0.75,908,794,https://www.flickr.com/photos/30478819@N08/33055344860/,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\nd57b6311f42ceb01,https://c1.staticflickr.com/8/7363/26537126553_b687ced39b_o.jpg,0.252730109204,0.0,1.0,1.0,780,491,https://www.flickr.com/photos/thoseguys119/26537126553,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n08d9ab4f6006ddd1,https://c1.staticflickr.com/1/322/31451801080_558139f5a1_o.jpg,0.25,0.0,1.0,0.5625,952,109,https://www.flickr.com/photos/garlandcannon/31451801080,https://creativecommons.org/licenses/by/2.0/,garlandcannon,https://www.flickr.com/people/garlandcannon/\nc22d948aeb29b6bc,https://c1.staticflickr.com/9/8401/28357145384_10bbb0bee0_o.jpg,0.55851800554,0.25,1.0,1.0,971,398,https://www.flickr.com/photos/70253321@N00/28357145384,https://creativecommons.org/licenses/by/2.0/,fugzu,https://www.flickr.com/people/70253321@N00/\n348eb05801aa42d2,https://c1.staticflickr.com/9/8609/28783232702_7f490bc841_o.jpg,0.4375,0.0,1.0,0.75,459,386,https://www.flickr.com/photos/londonmatt/28783232702,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\n8cc69ca06eefaef6,https://c1.staticflickr.com/9/8019/29591673661_8c3eb406cc_o.jpg,0.2806640625,0.25,0.8419921875,1.0,310,779,https://www.flickr.com/photos/pondapple/29591673661,https://creativecommons.org/licenses/by/2.0/,Bob Peterson,https://www.flickr.com/people/pondapple/\n5ac33c67c22cf9d7,https://c1.staticflickr.com/9/8535/29974986986_4083624408_o.jpg,0.0,0.0,0.5,0.75,672,1,https://www.flickr.com/photos/garryknight/29974986986,https://creativecommons.org/licenses/by/2.0/,Garry Knight,https://www.flickr.com/people/garryknight/\n551d5e48a210d941,https://c1.staticflickr.com/8/7043/27725852465_e1959d4a3a_o.jpg,0.333333333333,0.0,1.0,1.0,848,787,https://www.flickr.com/photos/janitors/27725852465,https://creativecommons.org/licenses/by/2.0/,K\\304\\201rlis Dambr\\304\\201ns,https://www.flickr.com/people/janitors/\nd3128343721d72f0,https://c1.staticflickr.com/8/7524/29945297200_5a58c0c082_o.jpg,0.25,0.25,0.75,1.0,519,841,https://www.flickr.com/photos/tangi_bertin/29945297200/,https://creativecommons.org/licenses/by/2.0/,tangi bertin,https://www.flickr.com/people/tangi_bertin/\n0f2fbc71ee00fa31,https://c1.staticflickr.com/9/8045/28565290083_78b045c5ff_o.jpg,0.4375,0.25,1.0,1.0,923,786,https://flickr.com/127226743@N02/28565290083,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n31132b257261e655,https://c1.staticflickr.com/9/8222/29341814513_6c6a72c557_o.jpg,0.331771720613,0.25,1.0,1.0,459,148,https://www.flickr.com/photos/22711505@N05/29341814513,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n125e9559c680d818,https://c1.staticflickr.com/8/7338/27398775121_764ef27fdf_o.jpg,0.0,0.0,1.0,1.0,463,551,https://www.flickr.com/photos/epicfireworks/27398775121,https://creativecommons.org/licenses/by/2.0/,Epic Fireworks,https://www.flickr.com/people/epicfireworks/\n8d20add7d43244ef,https://c1.staticflickr.com/6/5795/31393791525_b182ba39d6_o.jpg,0.0,0.25,0.5,1.0,906,132,http://www.flickr.com/photos/boneball/31393791525/,https://creativecommons.org/licenses/by/2.0/,Endre Majoros,https://www.flickr.com/people/boneball/\n02ba3db93b1b350f,https://c1.staticflickr.com/9/8554/29694697643_9a9f471f3b_o.jpg,0.0,0.0,0.75,1.0,780,414,https://www.flickr.com/photos/thoseguys119/29694697643,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n0e72c48ea2b788c0,https://c1.staticflickr.com/9/8668/29396924254_228a003269_o.jpg,0.210588633288,0.25,0.631765899865,1.0,426,194,https://www.flickr.com/photos/larry1732/29396924254/,https://creativecommons.org/licenses/by/2.0/,Larry Lamsa,https://www.flickr.com/people/larry1732/\n07a1784e76b608c6,https://c1.staticflickr.com/9/8667/27622799234_3f39c71ff1_o.jpg,0.5,0.0,1.0,0.75,294,175,https://www.flickr.com/photos/flowcomm/27622799234/,https://creativecommons.org/licenses/by/2.0/,flowcomm,https://www.flickr.com/people/flowcomm/\n53d84f767c2c751b,https://c1.staticflickr.com/9/8876/28799517836_2c9a77e6f4_o.jpg,0.28882725832,0.0,0.86648177496,0.75,309,903,https://www.flickr.com/photos/gails_pictures/28799517836,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n45d0fa3ee3c946f8,https://c1.staticflickr.com/8/7792/26511285184_61546c2d9d_o.jpg,0.5,0.25,1.0,1.0,100,842,https://flickr.com/30478819@N08/26511285184,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\n771a3735ff67b691,https://c1.staticflickr.com/8/7797/27686605332_6a3f0f2733_o.jpg,0.333333333333,0.0,1.0,1.0,971,492,https://www.flickr.com/photos/quinet/27686605332/,https://creativecommons.org/licenses/by/2.0/,Thomas Quine,https://www.flickr.com/people/quinet/\nce9a23ece1fa977e,https://c1.staticflickr.com/1/424/32932227076_bdeac7d0c7_o.jpg,0.471030042918,0.25,0.942060085837,1.0,539,497,https://www.flickr.com/photos/eltb/32932227076,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n53c34e3ae2536b64,https://c1.staticflickr.com/1/452/32358418221_839bf47300_o.jpg,0.340328467153,0.25,0.680656934307,1.0,481,129,https://flickr.com/36217981@N02/32358418221,https://creativecommons.org/licenses/by/2.0/,Tim Adams,https://www.flickr.com/people/36217981@N02/\na750589299278c07,https://c1.staticflickr.com/6/5570/31023343101_06d4b394f6_o.jpg,0.0,0.333333333333,1.0,1.0,855,258,https://www.flickr.com/photos/stevieawards/31023343101/,https://creativecommons.org/licenses/by/2.0/,mikeg44311,https://www.flickr.com/people/stevieawards/\nbf2fda9ba8d52410,https://c1.staticflickr.com/1/382/32200613252_a54c82bf0d_o.jpg,0.0,0.0,0.561569688769,1.0,328,321,https://flickr.com/65847118@N06/32200613252,https://creativecommons.org/licenses/by/2.0/,Maarten Heerlien,https://www.flickr.com/people/65847118@N06/\ncb803f98cb1e1f72,https://c1.staticflickr.com/1/682/31545042966_77958e7b67_o.jpg,0.25,0.0,1.0,1.0,780,214,https://www.flickr.com/photos/thoseguys119/31545042966/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nc1cbef6ab5c90c6c,https://c1.staticflickr.com/6/5222/29216320604_2753d1609e_o.jpg,0.4375,0.0,1.0,0.75,407,844,https://www.flickr.com/photos/davidwilson1949/29216320604,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\n7076116f57181197,https://c1.staticflickr.com/9/8764/28168978570_db6949020a_o.jpg,0.0,0.0,0.75,0.5,484,128,https://www.flickr.com/photos/tipsfortravellers/28168978570,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\n5eabe8dd27005858,https://c1.staticflickr.com/1/288/32995484935_6e2ec71dd9_o.jpg,0.21087398374,0.0,0.63262195122,0.75,405,774,https://flickr.com/99041966@N06/32995484935,https://creativecommons.org/licenses/by/2.0/,Nicky Boogaard,https://www.flickr.com/people/n-bphotography/\nc37b0265424953d4,https://c1.staticflickr.com/1/549/31961098985_a4abee7d00_o.jpg,0.0,0.25,0.519144144144,1.0,975,397,https://www.flickr.com/photos/hisgett/31961098985,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n8a00786f3d86419b,https://c1.staticflickr.com/1/647/31353558614_515be9f889_o.jpg,0.0,0.25,0.75,0.75,747,113,https://www.flickr.com/photos/usarak/31353558614,https://creativecommons.org/licenses/by/2.0/,U.S. Army Alaska (USARAK),https://www.flickr.com/people/usarak/\nb3eb8facaf02aa42,https://c1.staticflickr.com/9/8415/30308230371_4c49b02b29_o.jpg,0.0,0.0,0.5625,0.75,20,296,https://www.flickr.com/photos/9750464@N02/30308230371,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\nc86e563dd593428c,https://c1.staticflickr.com/6/5830/30702606771_20c2ae69a5_o.jpg,0.0,0.0,0.75,0.75,438,350,https://www.flickr.com/photos/glynlowe/30702606771,https://creativecommons.org/licenses/by/2.0/,www.GlynLowe.com,https://www.flickr.com/people/glynlowe/\nfb86659c6be78d78,https://c1.staticflickr.com/9/8142/29357161641_0ce40c60e5_o.jpg,0.25,0.0,0.75,0.75,650,197,https://flickr.com/129665369@N02/29357161641,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\n2d50e34985ec267b,https://c1.staticflickr.com/9/8500/29593268302_9da84c549e_o.jpg,0.2806640625,0.0,0.8419921875,0.75,914,314,https://www.flickr.com/photos/vastateparksstaff/29593268302/,https://creativecommons.org/licenses/by/2.0/,Virginia State Parks,https://www.flickr.com/people/vastateparksstaff/\n48c6a1f5068c2003,https://c1.staticflickr.com/8/7448/26847601405_3479af77e7_o.jpg,0.25,0.0,1.0,1.0,991,497,https://www.flickr.com/photos/aroberts/26847601405,https://creativecommons.org/licenses/by/2.0/,Andy Roberts,https://www.flickr.com/people/aroberts/\n473980460c33868a,https://c1.staticflickr.com/8/7002/26221285173_dd588b8d17_o.jpg,0.0,0.25,0.498159057437,1.0,673,709,https://www.flickr.com/photos/bravenboer/26221285173,https://creativecommons.org/licenses/by/2.0/,Martin Bravenboer,https://www.flickr.com/people/bravenboer/\n1b8bbe97386a4b63,https://c1.staticflickr.com/6/5730/29382363483_8f7db83970_o.jpg,0.0,0.25,0.5625,1.0,975,539,https://www.flickr.com/photos/jsjgeology/29382363483/,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nad575359e5940050,https://c1.staticflickr.com/3/2881/32835623361_f1c558e98a_o.jpg,0.0,0.0,0.5,0.75,581,962,http://www.flickr.com/photos/martius/32835623361/,https://creativecommons.org/licenses/by/2.0/,M a n u e l,https://www.flickr.com/people/martius/\n593dd8ca5538d49d,https://c1.staticflickr.com/8/7497/26704373970_090d46eeec_o.jpg,0.25,0.25,0.75,1.0,820,620,https://www.flickr.com/photos/142602025@N03/26704373970,https://creativecommons.org/licenses/by/2.0/,Robert Voigt,https://www.flickr.com/people/142602025@N03/\nbc197152df01b4ba,https://c1.staticflickr.com/3/2753/32822852976_22903ed1bc_o.jpg,0.2806640625,0.0,0.8419921875,0.75,980,872,http://www.flickr.com/photos/philippeamiot/32822852976/,https://creativecommons.org/licenses/by/2.0/,Philippe AMIOT,https://www.flickr.com/people/philippeamiot/\n3835f34272b005a8,https://c1.staticflickr.com/1/244/30704336683_e0a0a15639_o.jpg,0.0,0.333049403748,0.75,1.0,484,108,https://www.flickr.com/photos/pyride/30704336683/,https://creativecommons.org/licenses/by/2.0/,Julie anne Johnson,https://www.flickr.com/people/pyride/\n5083efba7ecb43ee,https://c1.staticflickr.com/1/387/32873391022_854a1678f9_o.jpg,0.333049403748,0.25,1.0,1.0,641,32,http://www.flickr.com/photos/10390868@N07/32873391022,https://creativecommons.org/licenses/by/2.0/,bazzadarambler,https://www.flickr.com/people/bazzadarambler/\n85d58a955e97666f,https://c1.staticflickr.com/6/5807/31454165115_f7eb3cab88_o.jpg,0.25,0.0,0.75,0.75,625,678,https://www.flickr.com/photos/shankaronline/31454165115,https://creativecommons.org/licenses/by/2.0/,shankar s.,https://www.flickr.com/people/shankaronline/\n0c80b6ad59ab0c3f,https://c1.staticflickr.com/8/7317/27037593283_e068fd1bde_o.jpg,0.0,0.25,0.686528497409,1.0,611,852,https://www.flickr.com/photos/moritzbarcelona/27037593283,https://creativecommons.org/licenses/by/2.0/,Moritz Barcelona,https://www.flickr.com/people/moritzbarcelona/\n22857d3fd7a5ae23,https://c1.staticflickr.com/6/5652/30446571023_41d6e37f1f_o.jpg,0.0,0.0,0.662261380323,1.0,973,433,https://www.flickr.com/photos/ufv/30446571023,https://creativecommons.org/licenses/by/2.0/,University of the Fraser Valley,https://www.flickr.com/people/ufv/\na5351f835331276a,https://c1.staticflickr.com/3/2347/32285401514_e3e943f8b2_o.jpg,0.4375,0.25,1.0,1.0,11,983,https://www.flickr.com/photos/9750464@N02/32285401514/,https://creativecommons.org/licenses/by/2.0/,ianpreston,https://www.flickr.com/people/9750464@N02/\nd549e24c99bd103a,https://c1.staticflickr.com/9/8796/28444006476_7368731152_o.jpg,0.0,0.25,0.57765451664,1.0,821,860,https://www.flickr.com/photos/hisgett/28444006476/,https://creativecommons.org/licenses/by/2.0/,Tony Hisgett,https://www.flickr.com/people/hisgett/\n34075be444cdc745,https://c1.staticflickr.com/6/5630/30035718155_53da708848_o.jpg,0.25,0.25,0.75,1.0,962,22,https://www.flickr.com/photos/stevendepolo/30035718155,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\nf4d449876bf3db82,https://c1.staticflickr.com/9/8233/29115892520_943b05a394_o.jpg,0.0,0.0,0.651515151515,0.75,429,29,https://www.flickr.com/photos/usfwshq/29115892520,https://creativecommons.org/licenses/by/2.0/,U.S. Fish and Wildlife Service Headquarters,https://www.flickr.com/people/usfwshq/\ndbb1f355dea6b6c1,https://c1.staticflickr.com/1/335/31956346113_16c6d052eb_o.jpg,0.25,0.0,0.75,0.75,868,248,https://www.flickr.com/photos/76969036@N02/31956346113/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n690ac780eb6f7015,https://c1.staticflickr.com/6/5679/30807246541_b4c6c7107f_o.jpg,0.28125,0.0,0.84375,0.75,880,826,https://www.flickr.com/photos/39551170@N02/30807246541/,https://creativecommons.org/licenses/by/2.0/,Simon_sees,https://www.flickr.com/people/39551170@N02/\n9208188d2dec6fbf,https://c1.staticflickr.com/6/5473/30867175032_8408a571e0_o.jpg,0.280784844384,0.0,0.842354533153,1.0,820,897,http://www.flickr.com/photos/amslerpix/30867175032/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n96f7e340c4b799ca,https://c1.staticflickr.com/9/8057/29446964491_3b7f7a9ff0_o.jpg,0.25,0.0,0.75,0.75,731,908,https://www.flickr.com/photos/o_0/29446964491/,https://creativecommons.org/licenses/by/2.0/,Guilhem Vellut,https://www.flickr.com/people/o_0/\ne0487839254820d8,https://c1.staticflickr.com/9/8735/28739100781_d909151de0_o.jpg,0.4375,0.0,1.0,0.75,986,593,https://www.flickr.com/photos/110035327@N08/28739100781,https://creativecommons.org/licenses/by/2.0/,Stefano Akram,https://www.flickr.com/people/110035327@N08/\n212250ad86bf62dd,https://c1.staticflickr.com/4/3866/33002671521_f6d45cf01d_o.jpg,0.25,0.25,0.75,1.0,538,881,https://www.flickr.com/photos/denalinps/33002671521/,https://creativecommons.org/licenses/by/2.0/,Denali National Park and Preserve,https://www.flickr.com/people/denalinps/\n775b6c53206572d9,https://c1.staticflickr.com/8/7494/26665562940_e60c76b02b_o.jpg,0.25,0.5,1.0,1.0,688,315,https://www.flickr.com/photos/dalbera/26665562940,https://creativecommons.org/licenses/by/2.0/,Jean-Pierre Dalb\\303\\251ra,https://www.flickr.com/people/dalbera/\n3c7701d981005eaf,https://c1.staticflickr.com/8/7519/26669075453_e39d203da4_o.jpg,0.0,0.0,0.75,0.497426470588,888,507,https://www.flickr.com/photos/agenciabrasilia/26669075453,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Bras\\303\\255lia,https://www.flickr.com/people/agenciabrasilia/\n65c3ea03d8340670,https://c1.staticflickr.com/8/7294/27999882732_571cd3c324_o.jpg,0.0,0.464122137405,0.75,1.0,835,970,https://www.flickr.com/photos/estonian-foreign-ministry/27999882732,https://creativecommons.org/licenses/by/2.0/,Estonian Foreign Ministry,https://www.flickr.com/people/estonian-foreign-ministry/\nb13acdcc3b317140,https://c1.staticflickr.com/8/7773/26968211330_d782cd1f22_o.jpg,0.25,0.42234548336,1.0,1.0,742,556,https://www.flickr.com/photos/s1ingshot/26968211330,https://creativecommons.org/licenses/by/2.0/,s1ingshot,https://www.flickr.com/people/s1ingshot/\nd7f81fe9899e141b,https://c1.staticflickr.com/1/515/32626937906_237d8a4b0a_o.jpg,0.0,0.0,0.75,1.0,875,209,https://www.flickr.com/photos/76969036@N02/32626937906/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\ne0b8ad0f53a7cd88,https://c1.staticflickr.com/1/654/31978023896_1be599f21a_o.jpg,0.25,0.0,1.0,1.0,11,759,https://www.flickr.com/photos/16502322@N03/31978023896,https://creativecommons.org/licenses/by/2.0/,fishhawk,https://www.flickr.com/people/16502322@N03/\n97d35229353f62f4,https://c1.staticflickr.com/9/8837/26770558915_e875e27934_o.jpg,0.319375,0.25,0.958125,1.0,405,750,https://www.flickr.com/photos/wjarrettc/26770558915,https://creativecommons.org/licenses/by/2.0/,Jarrett Campbell,https://www.flickr.com/people/wjarrettc/\n570e0141e061525f,https://c1.staticflickr.com/9/8621/28622365852_f80e7d5bcd_o.jpg,0.249631811487,0.25,0.748895434462,1.0,459,828,https://www.flickr.com/photos/panr/28622365852,https://creativecommons.org/licenses/by/2.0/,Robert Cutts,https://www.flickr.com/people/panr/\n9b0e22966c366036,https://c1.staticflickr.com/8/7405/27516904754_fa5a3185e9_o.jpg,0.25,0.0,0.75,0.75,763,157,https://flickr.com/89562459@N03/27516904754,https://creativecommons.org/licenses/by/2.0/,Allagash Brewing,https://www.flickr.com/people/allagashbrewing/\n55dda78464ecf171,https://c1.staticflickr.com/8/7694/26801339376_fe524d94d9_o.jpg,0.578822733424,0.25,1.0,1.0,666,973,https://www.flickr.com/photos/postmanpetecoluk/26801339376,https://creativecommons.org/licenses/by/2.0/,postman.pete,https://www.flickr.com/people/postmanpetecoluk/\n96651d0a3b3c92c4,https://c1.staticflickr.com/9/8046/29148275091_0843827964_o.jpg,0.4375,0.25,1.0,1.0,780,491,https://www.flickr.com/photos/thoseguys119/29148275091,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n50c425d8721a4199,https://c1.staticflickr.com/3/2856/32977467506_297fe752c5_o.jpg,0.248348017621,0.0,0.745044052863,0.75,536,742,https://www.flickr.com/photos/glorycycles/32977467506,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n1056e7b2b773f4f7,https://c1.staticflickr.com/6/5558/30780432135_157a04c905_o.jpg,0.0,0.0,1.0,1.0,484,108,https://www.flickr.com/photos/valerialaura/30780432135/,https://creativecommons.org/licenses/by/2.0/,valerialaura,https://www.flickr.com/people/valerialaura/\n47091d51eb76366b,https://c1.staticflickr.com/1/729/32713209785_95003f5a8c_o.jpg,0.0,0.25,0.5625,1.0,89,503,https://www.flickr.com/photos/rusty_clark/32713209785/,https://creativecommons.org/licenses/by/2.0/,Rusty Clark ~ 100K Photos,https://www.flickr.com/people/rusty_clark/\n956d7533342ac3cc,https://c1.staticflickr.com/1/397/31989508073_a2da0061e9_o.jpg,0.5,0.0,1.0,0.75,431,710,https://www.flickr.com/photos/codnewsroom/31989508073,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\n96bcd4869e3d4fd7,https://c1.staticflickr.com/6/5528/29860716290_7c4f730e2b_o.jpg,0.438430311231,0.0,1.0,1.0,979,51,https://www.flickr.com/photos/oatsy40/29860716290/,https://creativecommons.org/licenses/by/2.0/,oatsy40,https://www.flickr.com/people/oatsy40/\nef6b6e1b378ccb9f,https://c1.staticflickr.com/1/599/31984162833_168b1e3913_o.jpg,0.0,0.25,0.497426470588,1.0,712,507,https://www.flickr.com/photos/preciosa-ornela/31984162833,https://creativecommons.org/licenses/by/2.0/,PRECIOSA ORNELA,https://www.flickr.com/people/preciosa-ornela/\n4417d207dc1c314e,https://c1.staticflickr.com/9/8880/27695837134_b1bc3b596d_o.jpg,0.0,0.0,0.665684830633,1.0,609,643,https://www.flickr.com/photos/fotosagenciabrasil/27695837134,https://creativecommons.org/licenses/by/2.0/,Ag\\303\\252ncia Brasil Fotografias,https://www.flickr.com/people/fotosagenciabrasil/\n555ae39a964ad7cc,https://c1.staticflickr.com/8/7341/27729351220_a9cbeca117_o.jpg,0.24882629108,0.0,1.0,1.0,309,378,https://www.flickr.com/photos/treegrow/27729351220/,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n62572e474b0df7ba,https://c1.staticflickr.com/6/5585/30609804841_e9b89dac21_o.jpg,0.4375,0.0,1.0,0.75,608,552,https://www.flickr.com/photos/glenbowman/30609804841,https://creativecommons.org/licenses/by/2.0/,Glen Bowman,https://www.flickr.com/people/glenbowman/\n2e289c874a05d5d5,https://c1.staticflickr.com/9/8080/29122401374_dc6d7a710f_o.jpg,0.0,0.250923190547,0.75,0.75276957164,407,697,https://www.flickr.com/photos/eltb/29122401374,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nfb26ba0a11ec571a,https://c1.staticflickr.com/6/5801/30388499545_fe78ba2dd0_o.jpg,0.0,0.25,0.5,1.0,982,449,https://www.flickr.com/photos/codnewsroom/30388499545,https://creativecommons.org/licenses/by/2.0/,COD Newsroom,https://www.flickr.com/people/codnewsroom/\n5948fbd35229358b,https://c1.staticflickr.com/9/8131/29584131574_1f1ef8b2c0_o.jpg,0.25,0.0,1.0,0.75,418,258,https://www.flickr.com/photos/inmobili-ariascamargo/29584131574,https://creativecommons.org/licenses/by/2.0/,Quelverd Arias Camargo,https://www.flickr.com/people/inmobili-ariascamargo/\n284579d93f8f455d,https://c1.staticflickr.com/6/5650/29800307090_63da86bdfd_o.jpg,0.0,0.0,0.75,0.75,906,576,https://www.flickr.com/photos/rodrigoparedes/29800307090,https://creativecommons.org/licenses/by/2.0/,Rodrigo Paredes,https://www.flickr.com/people/rodrigoparedes/\na45ba7ef76816ac3,https://c1.staticflickr.com/8/7175/26861099872_2d32dc9007_o.jpg,0.28125,0.25,0.84375,1.0,459,535,https://www.flickr.com/photos/16349984@N07/26861099872,https://creativecommons.org/licenses/by/2.0/,Keith Seabridge,https://www.flickr.com/people/16349984@N07/\n8c83cb573dfb858a,https://c1.staticflickr.com/6/5794/31076781201_25f411861a_o.jpg,0.267938931298,0.0,0.803816793893,0.75,138,58,https://flickr.com/143049688@N08/31076781201,https://creativecommons.org/licenses/by/2.0/,MR MAO PICS,https://www.flickr.com/people/143049688@N08/\nb28356d4697f5d3f,https://c1.staticflickr.com/8/7318/27053109552_1a812ee1ce_o.jpg,0.386029411765,0.25,1.0,1.0,309,723,https://www.flickr.com/photos/gails_pictures/27053109552,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\na752dbd50bcd2de1,https://c1.staticflickr.com/4/3811/31953578214_42f1771e80_o.jpg,0.25,0.0,1.0,1.0,977,126,https://www.flickr.com/photos/davidstanleytravel/31953578214,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n0ed5b6b75db86563,https://c1.staticflickr.com/6/5570/30613973841_dd1db7f854_o.jpg,0.0,0.0,0.56338028169,0.75,320,694,https://www.flickr.com/photos/treegrow/30613973841,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\ncf4b507eddee0828,https://c1.staticflickr.com/8/7009/26195323853_a58fc9d97d_o.jpg,0.5,0.25,1.0,1.0,769,802,https://www.flickr.com/photos/132091501@N05/26195323853/,https://creativecommons.org/licenses/by/2.0/,Saffar Abdalah,https://www.flickr.com/people/132091501@N05/\n87c012e12f39ff79,https://c1.staticflickr.com/6/5718/30924340496_9e7250ca75_o.jpg,0.25,0.281690140845,1.0,0.845070422535,407,786,https://www.flickr.com/photos/eltb/30924340496,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\nf00bd297dae41dfd,https://c1.staticflickr.com/9/8362/29293900803_fd14f9e319_o.jpg,0.0,0.0,0.5,0.75,629,751,https://www.flickr.com/photos/patrice_calatayu/29293900803,https://creativecommons.org/licenses/by/2.0/,Patrice CALATAYU,https://www.flickr.com/people/patrice_calatayu/\n7e5e38db024fae39,https://c1.staticflickr.com/1/291/31565963182_b2a0b2d526_o.jpg,0.25,0.0,0.75,0.75,556,697,https://www.flickr.com/photos/walterpro/31565963182/,https://creativecommons.org/licenses/by/2.0/,Walter,https://www.flickr.com/people/walterpro/\n7853d8c5bcddf639,https://c1.staticflickr.com/9/8462/28924770154_757c4bdc78_o.jpg,0.250553097345,0.25,0.751659292035,1.0,458,486,https://www.flickr.com/photos/romanboed/28924770154/,https://creativecommons.org/licenses/by/2.0/,Roman Boed,https://www.flickr.com/people/romanboed/\n337c8f7c7b20b222,https://c1.staticflickr.com/9/8584/28242113744_a2c406a6eb_o.jpg,0.0,0.281690140845,0.75,0.845070422535,407,795,https://www.flickr.com/photos/eltb/28242113744,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n3c9610941395dd1f,https://c1.staticflickr.com/9/8352/29654371456_9a938111dc_o.jpg,0.0,0.0,0.7484375,1.0,309,384,https://www.flickr.com/photos/treegrow/29654371456,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n3f6cc90a41038b6f,https://c1.staticflickr.com/6/5495/30675223163_5f9422b5e0_o.jpg,0.0,0.25,0.5,1.0,519,634,https://www.flickr.com/photos/box_repsol/30675223163,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n2ca42dd6ef2815cf,https://c1.staticflickr.com/8/7318/27500591446_90e0066d79_o.jpg,0.0,0.25,0.5,1.0,855,429,https://www.flickr.com/photos/presidentialoffice/27500591446,https://creativecommons.org/licenses/by/2.0/,\\347\\270\\275\\347\\265\\261\\345\\272\\234,https://www.flickr.com/people/presidentialoffice/\n3d3b1807318f0478,https://c1.staticflickr.com/6/5708/30526609924_b50bd868c5_o.jpg,0.4375,0.0,1.0,0.75,657,504,https://www.flickr.com/photos/nzcarfreak/30526609924/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\n210a7d8ca572c12a,https://c1.staticflickr.com/6/5334/29949222700_ea8fee8893_o.jpg,0.25,0.0,0.75,0.75,973,551,https://www.flickr.com/photos/tanj/29949222700,https://creativecommons.org/licenses/by/2.0/,tanjila ahmed,https://www.flickr.com/people/tanj/\n5f9d13820921fb77,https://c1.staticflickr.com/9/8679/28281391953_074c2d2090_o.jpg,0.25,0.0,1.0,0.75,100,846,https://www.flickr.com/photos/28169156@N03/28281391953,https://creativecommons.org/licenses/by/2.0/,Frans Berkelaar,https://www.flickr.com/people/28169156@N03/\n054741fb2bbf75da,https://c1.staticflickr.com/6/5486/30483643042_27b95c963b_o.jpg,0.0,0.25,0.5,1.0,868,288,https://www.flickr.com/photos/76969036@N02/30483643042,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\n80137521805682f5,https://c1.staticflickr.com/8/7415/27022420330_72211aa0ae_o.jpg,0.0,0.0,1.0,0.799676898223,518,874,https://www.flickr.com/photos/n28307/27022420330,https://creativecommons.org/licenses/by/2.0/,Glenn Beltz,https://www.flickr.com/people/n28307/\ne8f105fba60a0633,https://c1.staticflickr.com/9/8766/28439487580_6a331f0900_o.jpg,0.0,0.0,0.515344311377,0.75,139,519,https://www.flickr.com/photos/dkeats/28439487580,https://creativecommons.org/licenses/by/2.0/,Derek Keats,https://www.flickr.com/people/dkeats/\n595ddb2e9afb8936,https://c1.staticflickr.com/6/5761/31364357796_de619cfec8_o.jpg,0.499263622975,0.0,0.99852724595,0.75,699,214,https://www.flickr.com/photos/126654539@N08/31364357796,https://creativecommons.org/licenses/by/2.0/,Phil Dolby,https://www.flickr.com/people/126654539@N08/\nab5c4888a4f1094b,https://c1.staticflickr.com/1/431/30912771704_ab8ff5a95d_o.jpg,0.0,0.0,0.5,0.75,662,771,https://www.flickr.com/photos/greggjerdingen/30912771704,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\n4e5b38bde3e8e4e1,https://c1.staticflickr.com/3/2408/32668491350_bc9f625c20_o.jpg,0.0,0.0,1.0,1.0,976,366,https://www.flickr.com/photos/clairity/32668491350,https://creativecommons.org/licenses/by/2.0/,Sharon Mollerus,https://www.flickr.com/people/clairity/\n435a34365638275f,https://c1.staticflickr.com/8/7386/28138672215_5f75139463_o.jpg,0.0,0.25,0.5625,1.0,920,678,https://www.flickr.com/photos/nostri-imago/28138672215,https://creativecommons.org/licenses/by/2.0/,Cliff,https://www.flickr.com/people/nostri-imago/\nd46fded6be786e43,https://c1.staticflickr.com/9/8612/27634665354_681f5b6e2d_o.jpg,0.0,0.0,0.75,0.498159057437,864,634,https://www.flickr.com/photos/alaska_region/27634665354,https://creativecommons.org/licenses/by/2.0/,USDA Forest Service Alaska Region,https://www.flickr.com/people/alaska_region/\n66a35333c68a0849,https://c1.staticflickr.com/8/7330/27632217990_e145d65978_o.jpg,0.42654028436,0.0,1.0,0.75,975,363,https://www.flickr.com/photos/ncoker/27632217990/,https://creativecommons.org/licenses/by/2.0/,ned_coker,https://www.flickr.com/people/ncoker/\n801ad9fa49217249,https://c1.staticflickr.com/9/8615/28166353040_799710b63e_o.jpg,0.497426470588,0.0,0.994852941176,0.75,546,511,https://www.flickr.com/photos/trishamanasan/28166353040,https://creativecommons.org/licenses/by/2.0/,tc_manasan,https://www.flickr.com/people/trishamanasan/\nf0dc944b6a1609ae,https://c1.staticflickr.com/8/7190/27049521445_7271dbe08c_o.jpg,0.25,0.295673076923,1.0,0.887019230769,481,850,https://www.flickr.com/photos/79157069@N03/27049521445,https://creativecommons.org/licenses/by/2.0/,Matthew Paul  Argall,https://www.flickr.com/people/79157069@N03/\n6468da21ace1b901,https://c1.staticflickr.com/1/518/30908707833_2de16124be_o.jpg,0.280784844384,0.0,0.842354533153,1.0,981,784,https://flickr.com/149503105@N07/30908707833,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/\n7d520d4829cb5aab,https://c1.staticflickr.com/8/7718/27351821750_9685b86d03_o.jpg,0.5,0.0,1.0,0.75,821,436,https://www.flickr.com/photos/elsie/27351821750,https://creativecommons.org/licenses/by/2.0/,Les Chatfield,https://www.flickr.com/people/elsie/\n8c20f23d9f4d4e8c,https://c1.staticflickr.com/8/7645/28454913406_cdeea42249_o.jpg,0.0,0.0,1.0,1.0,480,661,https://www.flickr.com/photos/moto_club4ag/28454913406,https://creativecommons.org/licenses/by/2.0/,Moto &quot;Club4AG&quot; Miwa,https://www.flickr.com/people/moto_club4ag/\n155a239fc082b2e0,https://c1.staticflickr.com/8/7581/28379393045_5823328332_o.jpg,0.25,0.0,1.0,0.75,844,606,https://www.flickr.com/photos/blmurch/28379393045,https://creativecommons.org/licenses/by/2.0/,Beatrice Murch,https://www.flickr.com/people/blmurch/\na7920e219c49dd21,https://c1.staticflickr.com/9/8555/28425490445_f54fdaf6b1_o.jpg,0.0,0.0,0.665684830633,1.0,548,802,https://www.flickr.com/photos/robdammers/28425490445,https://creativecommons.org/licenses/by/2.0/,Rob Dammers,https://www.flickr.com/people/robdammers/\n838495724e23ac62,https://c1.staticflickr.com/8/7179/27497369654_383ceb9353_o.jpg,0.4375,0.25,1.0,1.0,974,608,https://www.flickr.com/photos/noaaphotolib/27497369654,https://creativecommons.org/licenses/by/2.0/,NOAA Photo Library,https://www.flickr.com/people/noaaphotolib/\n2fdfbffb2c298099,https://c1.staticflickr.com/8/7399/27232578162_6f8d9fc8f0_o.jpg,0.25,0.25,0.75,1.0,519,538,https://www.flickr.com/photos/box_repsol/27232578162,https://creativecommons.org/licenses/by/2.0/,Box Repsol,https://www.flickr.com/people/box_repsol/\n96824de66bf662e6,https://c1.staticflickr.com/8/7245/27387152334_b4d8a8cb51_o.jpg,0.400242326333,0.0,1.0,0.75,985,614,https://www.flickr.com/photos/billmorrow/27387152334,https://creativecommons.org/licenses/by/2.0/,Bill Morrow,https://www.flickr.com/people/billmorrow/\nb824fbce8f8c77ce,https://c1.staticflickr.com/8/7334/28067333826_47ef801ab0_o.jpg,0.0,0.25,0.5,1.0,539,730,https://www.flickr.com/photos/jdlasica/28067333826,https://creativecommons.org/licenses/by/2.0/,JD Lasica,https://www.flickr.com/people/jdlasica/\n85a7b55e9f714c93,https://c1.staticflickr.com/6/5681/30435245365_57e605a32d_o.jpg,0.25,0.25,0.75,1.0,819,687,https://flickr.com/59740516@N08/30435245365,https://creativecommons.org/licenses/by/2.0/,Gunnar M\\303\\241r Hauksson,https://www.flickr.com/people/gunnarmh/\nb3fb2c13905c6b0b,https://c1.staticflickr.com/9/8419/30124174620_6bfe750ba9_o.jpg,0.286277602524,0.0,0.858832807571,0.75,986,817,https://www.flickr.com/photos/cmichel67/30124174620,https://creativecommons.org/licenses/by/2.0/,Christopher Michel,https://www.flickr.com/people/cmichel67/\n562df2f149a10d80,https://c1.staticflickr.com/6/5335/30253208263_1cdbcfc5a0_o.jpg,0.0,0.4375,0.75,1.0,901,845,https://www.flickr.com/photos/davidwilson1949/30253208263/,https://creativecommons.org/licenses/by/2.0/,David Wilson,https://www.flickr.com/people/davidwilson1949/\nb39c0f81189d7125,https://c1.staticflickr.com/1/529/32009314935_5928837885_o.jpg,0.0,0.25,0.5625,1.0,979,782,http://www.flickr.com/photos/h3h/32009314935/,https://creativecommons.org/licenses/by/2.0/,Brad Fults,https://www.flickr.com/people/h3h/\ne44acefb4bdb07b8,https://c1.staticflickr.com/8/7488/28116720336_9c583e051a_o.jpg,0.249631811487,0.0,0.748895434462,0.75,653,771,https://www.flickr.com/photos/mtaphotos/28116720336,https://creativecommons.org/licenses/by/2.0/,Metropolitan Transportation Authority of the State of New York,https://www.flickr.com/people/mtaphotos/\na37ca39c603553f4,https://c1.staticflickr.com/9/8485/28811253743_0db58fd23e_o.jpg,0.25,0.0,0.75,0.75,699,810,https://www.flickr.com/photos/26700188@N05/28811253743,https://creativecommons.org/licenses/by/2.0/,besopha,https://www.flickr.com/people/26700188@N05/\n58320d9cf4b6092d,https://c1.staticflickr.com/8/7436/27367241993_ebedb6955c_o.jpg,0.0,0.0,0.511567164179,0.75,976,542,https://www.flickr.com/photos/12463666@N03/27367241993,https://creativecommons.org/licenses/by/2.0/,Bob  M ~,https://www.flickr.com/people/12463666@N03/\n3284433ea3e2a79e,https://c1.staticflickr.com/1/527/31838246061_25a9b10f7a_o.jpg,0.0,0.0,0.714503816794,1.0,854,729,https://www.flickr.com/photos/13476480@N07/31838246061,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\ne77349aa3908f37f,https://c1.staticflickr.com/8/7722/26477933564_70b76996f8_o.jpg,0.25,0.0,1.0,1.0,980,184,https://www.flickr.com/photos/ilri/26477933564,https://creativecommons.org/licenses/by/2.0/,ILRI,https://www.flickr.com/people/ilri/\na3619347c7c49176,https://c1.staticflickr.com/9/8303/29065194983_fb31725a55_o.jpg,0.25,0.25,0.75,1.0,971,306,https://www.flickr.com/photos/cristiano_betta/29065194983,https://creativecommons.org/licenses/by/2.0/,Cristiano Betta,https://www.flickr.com/people/cristiano_betta/\n4c23ce60b4f34cd6,https://c1.staticflickr.com/1/352/31351035214_3d7c16a6be_o.jpg,0.0,0.0,0.702797202797,0.75,920,535,https://flickr.com/46052415@N08/31351035214,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n685d7c32af8c7541,https://c1.staticflickr.com/1/391/32387568125_08fc6fb589_o.jpg,0.28125,0.25,0.84375,1.0,676,1000,https://www.flickr.com/photos/27665395@N05/32387568125,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nf065d67949b67574,https://c1.staticflickr.com/8/7340/27774921576_af0b55bd0f_o.jpg,0.0,0.0,0.665684830633,1.0,113,917,https://www.flickr.com/photos/jsjgeology/27774921576,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nac532b3cd64be7bb,https://c1.staticflickr.com/8/7213/26755420372_57a2583b83_o.jpg,0.0,0.0,0.75,1.0,830,652,https://www.flickr.com/photos/infrogmation/26755420372,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/\n5a7e5a9624cfcb3e,https://c1.staticflickr.com/9/8267/29632282993_397f78418c_o.jpg,0.0,0.0,1.0,1.0,426,643,https://www.flickr.com/photos/the_light_show/29632282993/,https://creativecommons.org/licenses/by/2.0/,chaps1,https://www.flickr.com/people/the_light_show/\naafcfbea3859a75e,https://c1.staticflickr.com/9/8770/28484805370_3f56729f4e_o.jpg,0.34375,0.0,1.0,0.75,459,862,https://www.flickr.com/photos/atoach/28484805370,https://creativecommons.org/licenses/by/2.0/,Tim Green,https://www.flickr.com/people/atoach/\nbbaadb6d719acb42,https://c1.staticflickr.com/6/5684/30778889451_22e125c63f_o.jpg,0.28125,0.0,0.84375,0.75,469,614,https://www.flickr.com/photos/gillyberlin/30778889451/in/album-72157674821053502/,https://creativecommons.org/licenses/by/2.0/,GillyBerlin,https://www.flickr.com/people/gillyberlin/\n8554665a898f8ec6,https://c1.staticflickr.com/3/2313/32903737856_c091f37ca6_o.jpg,0.0,0.0036036036036,1.0,1.0,512,570,https://www.flickr.com/photos/benoit59/32903737856,https://creativecommons.org/licenses/by/2.0/,Benoit Brouillette,https://www.flickr.com/people/benoit59/\n51640d336bf97a40,https://c1.staticflickr.com/9/8225/29059870865_7824f3e980_o.jpg,0.476244343891,0.0,1.0,0.75,673,442,https://www.flickr.com/photos/lasuperlili/29059870865/,https://creativecommons.org/licenses/by/2.0/,LetNoun,https://www.flickr.com/people/lasuperlili/\n4561d75e1eb2008d,https://c1.staticflickr.com/9/8774/28423951903_1a45a30432_o.jpg,0.28125,0.25,0.84375,1.0,709,92,https://flickr.com/127226743@N02/28423951903,https://creativecommons.org/licenses/by/2.0/,Dimitris Kamaras,https://www.flickr.com/people/127226743@N02/\n59477acb3d5d7a0d,https://c1.staticflickr.com/6/5523/30265074450_ef3a8a2e88_o.jpg,0.0,0.0,0.421177266576,0.75,985,451,https://www.flickr.com/photos/crysisrubel/30265074450/,https://creativecommons.org/licenses/by/2.0/,Crysis Rubel,https://www.flickr.com/people/crysisrubel/\n4edf885a00cd08b6,https://c1.staticflickr.com/1/338/31634262561_7a1fa632bd_o.jpg,0.0,0.273726851852,0.75,0.821180555556,895,450,https://www.flickr.com/photos/bryanalexander/31634262561,https://creativecommons.org/licenses/by/2.0/,Bryan Alexander,https://www.flickr.com/people/bryanalexander/\n9d35cab047945982,https://c1.staticflickr.com/1/288/31087113293_c99bc0a19d_o.jpg,0.29939516129,0.0,0.898185483871,0.75,972,262,https://flickr.com/17467193@N00/31087113293,https://creativecommons.org/licenses/by/2.0/,jesse1dog,https://www.flickr.com/people/jesseflickrdog/\n30a8ecf40a9446de,https://c1.staticflickr.com/9/8790/28550491332_029135e099_o.jpg,0.0,0.0,0.5625,0.75,986,569,https://www.flickr.com/photos/torsten-behrens/28550491332,https://creativecommons.org/licenses/by/2.0/,Torsten Behrens,https://www.flickr.com/people/torsten-behrens/\nb3c21426c8875562,https://c1.staticflickr.com/8/7623/26804576616_7a3ce918b6_o.jpg,0.498153618907,0.25,1.0,1.0,450,866,https://www.flickr.com/photos/paulmannix/26804576616/,https://creativecommons.org/licenses/by/2.0/,Paul Mannix,https://www.flickr.com/people/paulmannix/\n767c263d463a9b94,https://c1.staticflickr.com/1/703/31380590702_50bdd31066_o.jpg,0.0,0.0,0.733746130031,1.0,520,865,https://www.flickr.com/photos/polnostyuvse/31380590702/,https://creativecommons.org/licenses/by/2.0/,\\320\\262\\320\\260\\321\\200\\321\\210\\321\\211 + \\321\\205\\320\\273\\320\\276\\320\\277\\320\\270\\320\\271,https://www.flickr.com/people/polnostyuvse/\n663614da001313c7,https://c1.staticflickr.com/9/8317/27801930034_bc35d0f176_o.jpg,0.0,0.0,0.66814159292,1.0,934,870,https://www.flickr.com/photos/personalcreations/27801930034,https://creativecommons.org/licenses/by/2.0/,Personal Creations,https://www.flickr.com/people/personalcreations/\n68d5273237304f04,https://c1.staticflickr.com/9/8570/30157601692_1024d7c8f6_o.jpg,0.25,0.25,0.75,1.0,85,490,https://www.flickr.com/photos/jsjgeology/30157601692,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nd2ad6c48a51f8d92,https://c1.staticflickr.com/8/7348/26572767423_2baf79b10f_o.jpg,0.242767295597,0.0,0.728301886792,1.0,518,810,https://www.flickr.com/photos/sbl/26572767423,https://creativecommons.org/licenses/by/2.0/,jens kuu,https://www.flickr.com/people/sbl/\ne293fbc87aa225c3,https://c1.staticflickr.com/9/8587/28623937382_2d530646d5_o.jpg,0.25,0.0,0.75,0.75,405,856,https://flickr.com/60911558@N04/28623937382,https://creativecommons.org/licenses/by/2.0/,Ian Gratton,https://www.flickr.com/people/ian_a_gratton/\n86a895427c96ca68,https://c1.staticflickr.com/9/8604/28354828195_cf6a5c1a47_o.jpg,0.25,0.4375,1.0,1.0,438,730,https://www.flickr.com/photos/normalsanik/28354828195,https://creativecommons.org/licenses/by/2.0/,normalsanik,https://www.flickr.com/people/normalsanik/\nf548d86cd829fdb6,https://c1.staticflickr.com/9/8552/29273200371_033c4513da_o.jpg,0.0,0.25,0.5,1.0,561,804,https://flickr.com/21841998@N06/29273200371,https://creativecommons.org/licenses/by/2.0/,The People&#x27;s Tribune,https://www.flickr.com/people/21841998@N06/\n34f8525365d47f3a,https://c1.staticflickr.com/8/7469/26963601325_723a96ea5b_o.jpg,0.25,0.5,1.0,1.0,553,998,https://www.flickr.com/photos/68158920@N08/26963601325,https://creativecommons.org/licenses/by/2.0/,pdjohnson,https://www.flickr.com/people/68158920@N08/\n4e736252a0b8f3b8,https://c1.staticflickr.com/8/7532/28918099361_65c6c64a3e_o.jpg,0.0,0.0,0.5,0.75,752,802,https://www.flickr.com/photos/42220226@N07/28918099361,https://creativecommons.org/licenses/by/2.0/,Sicnag,https://www.flickr.com/people/42220226@N07/\n254ac39248b21522,https://c1.staticflickr.com/1/499/32338720481_65ed79aaa1_o.jpg,0.438671875,0.25,1.0,1.0,536,577,https://www.flickr.com/photos/glorycycles/32338720481,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n243135506de968ec,https://c1.staticflickr.com/8/7232/26732959301_b32ab85282_o.jpg,0.333333333333,0.0,1.0,1.0,891,814,https://www.flickr.com/photos/recserv/26732959301,https://creativecommons.org/licenses/by/2.0/,Recreational Services,https://www.flickr.com/people/recserv/\nbbeaae3521881745,https://c1.staticflickr.com/6/5676/29848886643_0141fe96ed_o.jpg,0.5,0.0,1.0,0.75,416,677,https://www.flickr.com/photos/gotovan/29848886643/,https://creativecommons.org/licenses/by/2.0/,GoToVan,https://www.flickr.com/people/gotovan/\n2a7cec863613ad30,https://c1.staticflickr.com/9/8404/28801973161_98ffdc04fb_o.jpg,0.0,0.25,0.501846381093,1.0,673,921,https://www.flickr.com/photos/139421366@N03/28801973161,https://creativecommons.org/licenses/by/2.0/,Chris Bee,https://www.flickr.com/people/139421366@N03/\n21155a5258a45a27,https://c1.staticflickr.com/6/5725/30209918326_8629735f0d_o.jpg,0.5,0.0,1.0,0.75,364,493,https://www.flickr.com/photos/happymillerman/30209918326,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\n5ba78ef4eb4b5fed,https://c1.staticflickr.com/1/630/31965465392_938326c642_o.jpg,0.264605462822,0.0,0.793816388467,0.75,437,796,https://www.flickr.com/photos/hugo90/31965465392,https://creativecommons.org/licenses/by/2.0/,JOHN LLOYD,https://www.flickr.com/people/hugo90/\n228eb33ee8e56c09,https://c1.staticflickr.com/1/459/32262984911_c86484c7a2_o.jpg,0.25,0.0,1.0,0.531155015198,755,60,https://www.flickr.com/photos/51764518@N02/32262984911,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n98787e46deedc940,https://c1.staticflickr.com/8/7567/27101317783_424d29751b_o.jpg,0.0,0.25,0.5,1.0,821,5,https://www.flickr.com/photos/big-ashb/27101317783/,https://creativecommons.org/licenses/by/2.0/,big-ashb,https://www.flickr.com/people/big-ashb/\n0ce9d90ff8fda05d,https://c1.staticflickr.com/6/5754/31101319172_97c21189d3_o.jpg,0.450540958269,0.25,1.0,1.0,820,456,https://www.flickr.com/photos/jus10h/31101319172,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n23fd1a86ae1e6bbc,https://c1.staticflickr.com/9/8395/29945265306_99a9e21269_o.jpg,0.28125,0.0,0.84375,0.75,735,727,https://www.flickr.com/photos/27665395@N05/29945265306,https://creativecommons.org/licenses/by/2.0/,Jason Lawrence,https://www.flickr.com/people/27665395@N05/\nf7c5f3674656f4f8,https://c1.staticflickr.com/8/7607/28776748586_661d1ffacf_o.jpg,0.292105263158,0.25,1.0,1.0,309,928,https://www.flickr.com/photos/gails_pictures/28776748586,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n26800a7c683139a5,https://c1.staticflickr.com/6/5624/30911992306_78e8b81a3a_o.jpg,0.0,0.25,0.5625,1.0,566,148,https://www.flickr.com/photos/railwayofaustralia/30911992306/,https://creativecommons.org/licenses/by/2.0/,Railways of Australia by Daryle Phillips,https://www.flickr.com/people/railwayofaustralia/\n30e85d1e2c85669f,https://c1.staticflickr.com/3/2483/32833836286_729d961ba7_o.jpg,0.0,0.0,1.0,1.0,926,754,https://www.flickr.com/photos/yto/32833836286,https://creativecommons.org/licenses/by/2.0/,Tatsuo Yamashita,https://www.flickr.com/people/yto/\n8a038f144892de74,https://c1.staticflickr.com/6/5739/30735760786_acc8569edd_o.jpg,0.498153618907,0.25,1.0,1.0,610,146,https://www.flickr.com/photos/wakataitea/30735760786/,https://creativecommons.org/licenses/by/2.0/,hans wakataitea,https://www.flickr.com/people/wakataitea/\nc1ba5f088cd57777,https://c1.staticflickr.com/2/1521/26653240642_df0bb615d5_o.jpg,0.278188180404,0.0,0.834564541213,0.75,438,856,https://www.flickr.com/photos/kansallisarkisto/26653240642,https://creativecommons.org/licenses/by/2.0/,Kansallisarkisto,https://www.flickr.com/people/kansallisarkisto/\n4e8ed9b40a06347b,https://c1.staticflickr.com/9/8404/30001929842_10ec3ac0c5_o.jpg,0.0,0.0,0.676077265973,1.0,461,39,https://www.flickr.com/photos/126654539@N08/30001929842,https://creativecommons.org/licenses/by/2.0/,Phil Dolby,https://www.flickr.com/people/126654539@N08/\n23a4a4aa1ce48ed7,https://c1.staticflickr.com/9/8771/29609018051_c11f73a97f_o.jpg,0.0,0.0,1.0,0.998194945848,499,412,https://www.flickr.com/photos/13476480@N07/29609018051/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\n12604190c39067c4,https://c1.staticflickr.com/9/8194/29489268131_b726c7cb7e_o.jpg,0.0,0.25,0.5625,1.0,971,286,https://www.flickr.com/photos/mountrainiernps/29489268131,https://creativecommons.org/licenses/by/2.0/,Mount Rainier National Park,https://www.flickr.com/people/mountrainiernps/\n109bbd75d9482b76,https://c1.staticflickr.com/6/5826/30708175501_8338cc7d03_o.jpg,0.223015320334,0.0,0.669045961003,0.75,556,529,https://www.flickr.com/photos/kansasscanner/30708175501,https://creativecommons.org/licenses/by/2.0/,Tyler Silvest,https://www.flickr.com/people/kansasscanner/\ndd9a51c03871e2df,https://c1.staticflickr.com/6/5240/29918577515_1bf2f338ab_o.jpg,0.28125,0.25,0.84375,1.0,583,489,https://www.flickr.com/photos/infrogmation/29918577515,https://creativecommons.org/licenses/by/2.0/,Infrogmation of New Orleans,https://www.flickr.com/people/infrogmation/\nfffcdfd68e315642,https://c1.staticflickr.com/6/5488/29542854934_542cdd043e_o.jpg,0.502573529412,0.0,1.0,0.75,887,617,https://www.flickr.com/photos/toomore/29542854934,https://creativecommons.org/licenses/by/2.0/,Toomore Chiang,https://www.flickr.com/people/toomore/\n7e2635e5357b97f4,https://c1.staticflickr.com/6/5348/25357678069_fe17656184_o.jpg,0.5,0.0,1.0,0.75,704,642,https://www.flickr.com/photos/stevendepolo/25357678069,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\ne9b4744a260b323e,https://c1.staticflickr.com/8/7281/26543860733_1b90f9cced_o.jpg,0.446030640669,0.25,0.892061281337,1.0,645,966,https://www.flickr.com/photos/bryanalexander/26543860733,https://creativecommons.org/licenses/by/2.0/,Bryan Alexander,https://www.flickr.com/people/bryanalexander/\nc6e76def54c2b6ab,https://c1.staticflickr.com/9/8803/28278820324_e90f1e1a81_o.jpg,0.0,0.305989583333,0.75,1.0,17,472,https://flickr.com/9494793@N06/28278820324,https://creativecommons.org/licenses/by/2.0/,shrikant rao,https://www.flickr.com/people/9494793@N06/\n40dab89f9645f8ae,https://c1.staticflickr.com/8/7349/27291988094_0afb90f35a_o.jpg,0.594621513944,0.25,1.0,1.0,305,617,https://www.flickr.com/photos/m-a-r-t-i-n/27291988094,https://creativecommons.org/licenses/by/2.0/,Martin Cooper,https://www.flickr.com/people/m-a-r-t-i-n/\na101a53c492140a1,https://c1.staticflickr.com/8/7437/26895430856_d411e97a44_o.jpg,0.5,0.0,1.0,0.75,769,495,https://www.flickr.com/photos/galwegians/26895430856/,https://creativecommons.org/licenses/by/2.0/,Galwegians Rugby,https://www.flickr.com/people/galwegians/\n1dbe97d0379ab9c5,https://c1.staticflickr.com/8/7298/27751596661_a039153e7c_o.jpg,0.203198494826,0.25,0.406396989652,1.0,780,78,https://www.flickr.com/photos/thoseguys119/27751596661,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\na73752530022b44d,https://c1.staticflickr.com/6/5630/30987530100_048f9e520a_o.jpg,0.251849112426,0.0,0.755547337278,0.75,896,577,https://www.flickr.com/photos/13476480@N07/30987530100/,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nc7547d2ee03ee69d,https://c1.staticflickr.com/9/8549/30266636766_a176d82ea9_o.jpg,0.4375,0.0,1.0,0.75,625,607,https://flickr.com/135302410@N02/30266636766,https://creativecommons.org/licenses/by/2.0/,Libraries Taskforce,https://www.flickr.com/people/135302410@N02/\nbb9aa62e89632c7d,https://c1.staticflickr.com/8/7464/29743738816_b0b83f324b_o.jpg,0.400242326333,0.25,1.0,1.0,133,866,https://www.flickr.com/photos/donmillertogo/29743738816/,https://creativecommons.org/licenses/by/2.0/,Don Miller,https://www.flickr.com/people/donmillertogo/\n7c01e0d1a303d2f3,https://c1.staticflickr.com/9/8420/29155784033_72a36cc6c0_o.jpg,0.578822733424,0.0,1.0,0.75,441,829,https://www.flickr.com/photos/subzonica/29155784033,https://creativecommons.org/licenses/by/2.0/,Hern\\303\\241n Garc\\303\\255a Crespo,https://www.flickr.com/people/subzonica/\n655b6788c1315279,https://c1.staticflickr.com/9/8883/29247953915_ddd4888552_o.jpg,0.0,0.0,0.75,1.0,937,933,https://www.flickr.com/photos/scotnelson/29247953915/,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\n5a211b16bae489d8,https://c1.staticflickr.com/6/5598/30704295670_aaec5b307d_o.jpg,0.0,0.0,0.97504456328,1.0,518,267,https://flickr.com/130921112@N07/30704295670,https://creativecommons.org/licenses/by/2.0/,Governor Tom Wolf,https://www.flickr.com/people/governortomwolf/\n34c0e98505f21171,https://c1.staticflickr.com/6/5614/30941289433_ebecf9c5c1_o.jpg,0.0,0.25,0.42174796748,1.0,958,14,https://www.flickr.com/photos/98302443@N00/30941289433,https://creativecommons.org/licenses/by/2.0/,Shalu Sharma,https://www.flickr.com/people/98302443@N00/\necbf91f2df3ef9eb,https://c1.staticflickr.com/8/7661/27961191812_b6e319662e_o.jpg,0.0,0.0,1.0,1.0,563,861,https://www.flickr.com/photos/83015819@N00/27961191812,https://creativecommons.org/licenses/by/2.0/,Jon Worth,https://www.flickr.com/people/83015819@N00/\ncda835d476e0c303,https://c1.staticflickr.com/1/614/32499451306_42d0de0df1_o.jpg,0.249631811487,0.0,0.748895434462,0.75,780,717,https://www.flickr.com/photos/thoseguys119/32499451306,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n45ad724c3815c7b8,https://c1.staticflickr.com/8/7372/26916105626_8298375324_o.jpg,0.0,0.25,0.5,1.0,848,524,https://www.flickr.com/photos/7armyjmtc/26916105626/,https://creativecommons.org/licenses/by/2.0/,7th Army  Training Command,https://www.flickr.com/people/7armyjmtc/\n3ef78722fb50dc4e,https://c1.staticflickr.com/1/281/32188072501_dd5d47127f_o.jpg,0.25,0.0,1.0,0.75,931,517,https://flickr.com/13102974@N00/32188072501,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/\n137dfc0abf39ed5e,https://c1.staticflickr.com/6/5772/30687856481_e7ed50f385_o.jpg,0.276595744681,0.25,1.0,1.0,309,465,https://www.flickr.com/photos/gails_pictures/30687856481,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\nad19cc3febf757e6,https://c1.staticflickr.com/9/8583/29924605133_05fb3cb7e1_o.jpg,0.0,0.502573529412,0.75,1.0,340,287,https://www.flickr.com/photos/yakobusan/29924605133/,https://creativecommons.org/licenses/by/2.0/,Jakob Montrasio,https://www.flickr.com/people/yakobusan/\n22a6de1e01888655,https://c1.staticflickr.com/8/7398/27280854834_6bebb3f100_o.jpg,0.443623639191,0.0,1.0,0.75,980,22,https://www.flickr.com/photos/wangjs/27280854834,https://creativecommons.org/licenses/by/2.0/,Jiashiang,https://www.flickr.com/people/wangjs/\n268dac5b873d3530,https://c1.staticflickr.com/6/5485/32171699355_1f16beeed3_o.jpg,0.25,0.400242326333,1.0,1.0,931,532,https://www.flickr.com/photos/sixteenmilesofstring/32171699355,https://creativecommons.org/licenses/by/2.0/,Timothy Vollmer,https://www.flickr.com/people/sixteenmilesofstring/\nb139fbe563887bcf,https://c1.staticflickr.com/8/7572/27197514215_faf0675220_o.jpg,0.133271202237,0.0,0.39981360671,1.0,821,418,https://www.flickr.com/photos/jsjgeology/27197514215,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\nd2a50ead60c0b157,https://c1.staticflickr.com/4/3851/32931502042_9553a0ef75_o.jpg,0.0,0.25,0.607317073171,1.0,323,962,https://www.flickr.com/photos/gails_pictures/32931502042,https://creativecommons.org/licenses/by/2.0/,gailhampshire,https://www.flickr.com/people/gails_pictures/\n261eeba61cd73331,https://c1.staticflickr.com/9/8482/28689100292_ecb46c0f95_o.jpg,0.0,0.333333333333,1.0,1.0,490,377,https://www.flickr.com/photos/pasa/28689100292/,https://creativecommons.org/licenses/by/2.0/,Paul Sableman,https://www.flickr.com/people/pasa/\n13105cb5634b9a49,https://c1.staticflickr.com/8/7056/27107312625_ef95e2a069_o.jpg,0.5,0.0,1.0,0.75,541,361,https://www.flickr.com/photos/133937251@N05/27107312625,https://creativecommons.org/licenses/by/2.0/,Ende Gel\\303\\244nde,https://www.flickr.com/people/133937251@N05/\nfcfcc61c4b07e16d,https://c1.staticflickr.com/9/8784/28976070496_b23e3a0b2c_o.jpg,0.503303964758,0.0,1.0,0.75,920,602,https://www.flickr.com/photos/investmentzen/28976070496,https://creativecommons.org/licenses/by/2.0/,Investment Zen,https://www.flickr.com/people/investmentzen/\ndb2991615682db75,https://c1.staticflickr.com/1/726/31538320631_4cfcf3b91d_o.jpg,0.0,0.25,0.5,1.0,25,647,https://www.flickr.com/photos/kamcmillan/31538320631/,https://creativecommons.org/licenses/by/2.0/,Ken McMillan,https://www.flickr.com/people/kamcmillan/\n86702bbd3c4d4f89,https://c1.staticflickr.com/9/8480/28350467743_6f5537fda0_o.jpg,0.493045387994,0.0,0.986090775988,0.75,826,706,https://www.flickr.com/photos/anandajoti/28350467743,https://creativecommons.org/licenses/by/2.0/,Photo Dharma,https://www.flickr.com/people/anandajoti/\neaa4a85d25ce39f5,https://c1.staticflickr.com/8/7585/27027131144_84a01f83f9_o.jpg,0.249631811487,0.0,0.748895434462,0.75,909,565,https://www.flickr.com/photos/jm-photography/27027131144/,https://creativecommons.org/licenses/by/2.0/,jeffrey montes,https://www.flickr.com/people/jm-photography/\nee0e6080dddf5703,https://c1.staticflickr.com/6/5207/29351498774_18234848d2_o.jpg,0.282874617737,0.0,1.0,1.0,975,846,https://www.flickr.com/photos/jsjgeology/29351498774,https://creativecommons.org/licenses/by/2.0/,James St. John,https://www.flickr.com/people/jsjgeology/\ne414052fda796eb9,https://c1.staticflickr.com/1/357/30746013933_bfb1931024_o.jpg,0.3,0.0,0.9,1.0,920,746,https://flickr.com/46052415@N08/30746013933,https://creativecommons.org/licenses/by/2.0/,Rick Obst,https://www.flickr.com/people/discoveroregon/\n57ca6160263d94d6,https://c1.staticflickr.com/6/5506/30928887792_fa06653274_o.jpg,0.0,0.0,0.75,0.75,579,466,https://flickr.com/52244076@N06/30928887792,https://creativecommons.org/licenses/by/2.0/,MikuMarmalade,https://www.flickr.com/people/miku-marmalade/\n9b4db99ec2377808,https://c1.staticflickr.com/8/7388/27158529342_e4e9cbd346_o.jpg,0.50015060241,0.0,0.833584337349,0.75,780,445,https://www.flickr.com/photos/thoseguys119/27158529342/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n4ed04153c045ea71,https://c1.staticflickr.com/6/5460/29507740443_4cfa7e96ea_o.jpg,0.0,0.0,0.5625,0.75,937,497,https://www.flickr.com/photos/scotnelson/29507740443,https://creativecommons.org/licenses/by/2.0/,Scot Nelson,https://www.flickr.com/people/scotnelson/\nf024d688f3924217,https://c1.staticflickr.com/1/263/32796974715_04e14ff09d_o.jpg,0.223849372385,0.0,0.671548117155,0.75,437,209,https://www.flickr.com/photos/autohistorian/32796974715,https://creativecommons.org/licenses/by/2.0/,Alden Jewell,https://www.flickr.com/people/autohistorian/\nae232d0f74605317,https://c1.staticflickr.com/1/300/32193750935_ac178c1503_o.jpg,0.28125,0.25,0.84375,1.0,437,190,https://www.flickr.com/photos/nzcarfreak/32193750935/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\n7c8463c279d68e6b,https://c1.staticflickr.com/1/713/31513626785_6f1178432e_o.jpg,0.25,0.0,1.0,0.75,442,268,https://flickr.com/62558987@N07/31513626785,https://creativecommons.org/licenses/by/2.0/,\"Kurman Communications, Inc.\",https://www.flickr.com/people/kurmanphotos/\n3995ad179c709c84,https://c1.staticflickr.com/9/8615/28451661715_6a2813bbcb_o.jpg,0.0,0.25,0.5,1.0,647,763,https://www.flickr.com/photos/tipsfortravellers/28451661715,https://creativecommons.org/licenses/by/2.0/,Gary Bembridge,https://www.flickr.com/people/tipsfortravellers/\naa6827ae0a593711,https://c1.staticflickr.com/8/7713/26254501373_c163f88b35_o.jpg,0.333333333333,0.0,1.0,1.0,719,144,https://www.flickr.com/photos/francisvallance/26254501373,https://creativecommons.org/licenses/by/2.0/,Francis Vallance (Heritage Warrior),https://www.flickr.com/people/francisvallance/\n3d9ad62bf4ab0b13,https://c1.staticflickr.com/8/7777/28291997911_8285fd7055_o.jpg,0.0,0.0,0.697735191638,0.75,683,643,https://www.flickr.com/photos/13476480@N07/28291997911,https://creativecommons.org/licenses/by/2.0/,manhhai,https://www.flickr.com/people/13476480@N07/\nbfcddc8708aced98,https://c1.staticflickr.com/9/8566/28881297121_de4fd43c71_o.jpg,0.0,0.0,0.5,0.75,354,449,https://www.flickr.com/photos/alanclark/28881297121,https://creativecommons.org/licenses/by/2.0/,Alan Clark,https://www.flickr.com/people/alanclark/\n46c7ceea2b75121c,https://c1.staticflickr.com/6/5571/30299364414_e8c7263c4d_o.jpg,0.0,0.0,0.5,0.75,470,302,https://www.flickr.com/photos/amslerpix/30299364414/,https://creativecommons.org/licenses/by/2.0/,amslerPIX,https://www.flickr.com/people/amslerpix/\n981709a956b1fd25,https://c1.staticflickr.com/9/8329/29087032425_beb74263fe_o.jpg,0.5,0.0,1.0,0.75,621,730,https://www.flickr.com/photos/statenskartverk/29087032425,https://creativecommons.org/licenses/by/2.0/,Kartverket,https://www.flickr.com/people/statenskartverk/\ne860dd4f427ab3a2,https://c1.staticflickr.com/9/8549/29870558446_a808cb710a_o.jpg,0.0,0.0,0.5625,0.75,820,620,https://flickr.com/89246112@N00/29870558446,https://creativecommons.org/licenses/by/2.0/,Bart,https://www.flickr.com/people/89246112@N00/\n5b892db51a31a5c0,https://c1.staticflickr.com/9/8639/27839994073_b07714484f_o.jpg,0.322931785196,0.0,0.968795355588,1.0,752,106,https://www.flickr.com/photos/mdpettitt/27839994073,https://creativecommons.org/licenses/by/2.0/,Martin Pettitt,https://www.flickr.com/people/mdpettitt/\n83c37b1bad359074,https://c1.staticflickr.com/8/7433/26932375335_381e5c1030_o.jpg,0.248713235294,0.0,0.746139705882,0.75,834,943,https://www.flickr.com/photos/usnavy/26932375335,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\n978fe748ed471e15,https://c1.staticflickr.com/1/545/31787250433_9f39ac7b89_o.jpg,0.4375,0.0,1.0,0.75,437,511,https://www.flickr.com/photos/nzcarfreak/31787250433/,https://creativecommons.org/licenses/by/2.0/,Riley,https://www.flickr.com/people/nzcarfreak/\nd0eaf6fd93c44abe,https://c1.staticflickr.com/9/8185/29487563706_a15c9244c1_o.jpg,0.28125,0.25,0.84375,1.0,109,68,https://www.flickr.com/photos/mypubliclands/29487563706,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n4ada4520102001a5,https://c1.staticflickr.com/1/494/31615767056_8ac77aa682_o.jpg,0.0,0.200323101777,1.0,1.0,563,551,https://flickr.com/10485077@N06/31615767056,https://creativecommons.org/licenses/by/2.0/,\"Eden, Janine and Jim\",https://www.flickr.com/people/edenpictures/\nb75d4a5e7aaa4cfa,https://c1.staticflickr.com/1/771/30940459194_f76847a7f3_o.jpg,0.0,0.25,0.5625,1.0,704,518,https://flickr.com/104342908@N08/30940459194,https://creativecommons.org/licenses/by/2.0/,Michael Mueller,https://www.flickr.com/people/104342908@N08/\n50111847ea478991,https://c1.staticflickr.com/9/8494/29675571856_5a9935f26f_o.jpg,0.438671875,0.25,1.0,1.0,27,138,https://www.flickr.com/photos/treegrow/29675571856,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n974a04e784e5e198,https://c1.staticflickr.com/8/7547/26799575725_d8664b7c2c_o.jpg,0.0,0.25,0.5625,1.0,780,18,https://www.flickr.com/photos/thoseguys119/26799575725/,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nbfa1720aad5a71e1,https://c1.staticflickr.com/8/7570/27750301885_c8ef3e1f21_o.jpg,0.0,0.25,0.5,1.0,978,292,https://www.flickr.com/photos/clearlyambiguous/27750301885,https://creativecommons.org/licenses/by/2.0/,Scott Robinson,https://www.flickr.com/people/clearlyambiguous/\n0fa6619e1d719771,https://c1.staticflickr.com/9/8370/29658924176_dafe2e70ea_o.jpg,0.4375,0.0,1.0,0.75,481,869,https://www.flickr.com/photos/jeepersmedia/29658924176,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\nd55218a482e5a546,https://c1.staticflickr.com/9/8794/28971021403_80e7afd968_o.jpg,0.25,0.0,0.75,0.75,826,318,https://www.flickr.com/photos/mypubliclands/28971021403,https://creativecommons.org/licenses/by/2.0/,Bureau  of Land Management,https://www.flickr.com/people/mypubliclands/\n4ca8d6fd58b58706,https://c1.staticflickr.com/8/7423/27794180135_dbbd2eb4be_o.jpg,0.0,0.25,0.5,1.0,404,417,https://www.flickr.com/photos/usnavy/27794180135,https://creativecommons.org/licenses/by/2.0/,Official U.S. Navy Page,https://www.flickr.com/people/usnavy/\ncf932781aae2ac43,https://c1.staticflickr.com/9/8539/29004626402_2c74c80dc8_o.jpg,0.25,0.0,1.0,0.75,563,436,https://www.flickr.com/photos/87249144@N08/29004626402/,https://creativecommons.org/licenses/by/2.0/,FolsomNatural,https://www.flickr.com/people/87249144@N08/\nbdd716c95ce26487,https://c1.staticflickr.com/8/7399/27387253424_741247df73_o.jpg,0.0,0.0,0.5625,0.75,738,617,https://www.flickr.com/photos/jeepersmedia/27387253424,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\n4f5e38e8cf60aedf,https://c1.staticflickr.com/8/7611/27754339715_4f5c8bd5f6_o.jpg,0.0,0.0,0.75,1.0,338,385,https://www.flickr.com/photos/nature80020/27754339715,https://creativecommons.org/licenses/by/2.0/,nature80020,https://www.flickr.com/people/nature80020/\n933417539c52a3ae,https://c1.staticflickr.com/6/5618/31324317931_25a81a14d4_o.jpg,0.28125,0.0,0.84375,0.75,965,586,https://www.flickr.com/photos/stevendepolo/31324317931,https://creativecommons.org/licenses/by/2.0/,Steven Depolo,https://www.flickr.com/people/stevendepolo/\n56f7ad089702ca1b,https://c1.staticflickr.com/6/5509/30650278201_f673e278b5_o.jpg,0.250553097345,0.0,0.751659292035,0.75,693,554,http://www.flickr.com/photos/erix/30650278201/,https://creativecommons.org/licenses/by/2.0/,Erich Ferdinand,https://www.flickr.com/people/erix/\n2e04fde62e10dbbb,https://c1.staticflickr.com/1/649/32020042313_a7b3a61213_o.jpg,0.0,0.0,1.0,1.0,869,607,https://www.flickr.com/photos/30478819@N08/32020042313,https://creativecommons.org/licenses/by/2.0/,Marco Verch,https://www.flickr.com/people/30478819@N08/\nbf0cbc34e1c31343,https://c1.staticflickr.com/6/5769/30228196633_deb94de512_o.jpg,0.0,0.25,0.5,1.0,473,629,https://www.flickr.com/photos/camppinewood/30228196633/,https://creativecommons.org/licenses/by/2.0/,Camp Pinewood,https://www.flickr.com/people/camppinewood/\n67c1cc213415e711,https://c1.staticflickr.com/1/706/31190410530_0bed92184e_o.jpg,0.4375,0.0,1.0,0.75,2,295,https://www.flickr.com/photos/dubster/31190410530/,https://creativecommons.org/licenses/by/2.0/,Dubi Kaufmann,https://www.flickr.com/people/dubster/\n7f34c2ad7f4821f2,https://c1.staticflickr.com/1/308/32349117701_5e47c9bc47_o.jpg,0.0,0.25,0.5,1.0,793,587,https://flickr.com/92793865@N07/32349117701,https://creativecommons.org/licenses/by/2.0/,Galeria del Ministerio de Defensa del Per\\303\\272,https://www.flickr.com/people/ministeriodedefensaperu/\nc84bcc8d6d795f24,https://c1.staticflickr.com/8/7050/27513501296_2bcb3747d6_o.jpg,0.267938931298,0.0,0.803816793893,0.75,973,568,https://www.flickr.com/photos/ruthanddave/27513501296,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\n899ef69fc6bcfa4a,https://c1.staticflickr.com/8/7691/27299804871_8a264cd1f1_o.jpg,0.335787923417,0.0,1.0,1.0,459,894,https://www.flickr.com/photos/londonmatt/27299804871,https://creativecommons.org/licenses/by/2.0/,Matt Brown,https://www.flickr.com/people/londonmatt/\nd5931a9914f7765f,https://c1.staticflickr.com/9/8138/29012387976_259617f44a_o.jpg,0.5,0.25,1.0,1.0,896,523,https://www.flickr.com/photos/soldiersmediacenter/29012387976,https://creativecommons.org/licenses/by/2.0/,The U.S. Army,https://www.flickr.com/people/soldiersmediacenter/\nff8746649ab3f934,https://c1.staticflickr.com/9/8688/30192840776_6f00e3af78_o.jpg,0.0,0.498153618907,0.75,1.0,407,795,https://www.flickr.com/photos/eltb/30192840776,https://creativecommons.org/licenses/by/2.0/,Catedrales  e Iglesias/Cathedrals and Churches,https://www.flickr.com/people/eltb/\n786fdbb6581b38f0,https://c1.staticflickr.com/9/8143/29815032402_00b3a80887_o.jpg,0.0,0.0,0.75,0.75,938,146,https://www.flickr.com/photos/jcbrandon/29815032402,https://creativecommons.org/licenses/by/2.0/,Farther Along,https://www.flickr.com/people/jcbrandon/\nc1a9b83c9c7c8ad5,https://c1.staticflickr.com/8/7401/27389457714_35fc8e943a_o.jpg,0.0,0.28125,0.75,0.84375,981,269,https://www.flickr.com/photos/usdagov/27389457714,https://creativecommons.org/licenses/by/2.0/,U.S. Department of Agriculture,https://www.flickr.com/people/usdagov/\n4fc0d5234680582e,https://c1.staticflickr.com/8/7398/27494067812_7c5205c244_o.jpg,0.28125,0.25,0.84375,1.0,780,23,https://www.flickr.com/photos/thoseguys119/27494067812,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\nf3abe16a33f0b8a6,https://c1.staticflickr.com/2/1662/26727102896_6aa53b55a7_o.jpg,0.25,0.0,0.75,0.75,874,783,https://www.flickr.com/photos/flynn_nrg/26727102896/,https://creativecommons.org/licenses/by/2.0/,Miguel Mendez,https://www.flickr.com/people/flynn_nrg/\n58fc5d9fcf6f23f7,https://c1.staticflickr.com/9/8827/29069940253_e3fab86c67_o.jpg,0.4375,0.25,1.0,1.0,481,411,https://www.flickr.com/photos/jeepersmedia/29069940253,https://creativecommons.org/licenses/by/2.0/,Mike Mozart,https://www.flickr.com/people/jeepersmedia/\ne1cb60b8cd997417,https://c1.staticflickr.com/1/681/32754033794_47c9e15c85_o.jpg,0.249631811487,0.25,0.748895434462,1.0,747,819,https://www.flickr.com/photos/mark6mauno/32754033794,https://creativecommons.org/licenses/by/2.0/,mark6mauno,https://www.flickr.com/people/mark6mauno/\n863ca84267d8e8b2,https://c1.staticflickr.com/6/5496/31293038651_5cae95952d_o.jpg,0.28125,0.25,0.84375,1.0,490,965,https://flickr.com/136987764@N03/31293038651,https://creativecommons.org/licenses/by/2.0/,ystsoi,https://www.flickr.com/people/136987764@N03/\n6ee2a3e9f33a690f,https://c1.staticflickr.com/1/385/32175562862_f0115e6a48_o.jpg,0.4375,0.0,1.0,0.75,980,669,https://www.flickr.com/photos/davidstanleytravel/32175562862,https://creativecommons.org/licenses/by/2.0/,David Stanley,https://www.flickr.com/people/davidstanleytravel/\n7b5654633ce5b30b,https://c1.staticflickr.com/8/7393/27498622033_48141d442a_o.jpg,0.0,0.0,0.75,0.5625,980,640,https://www.flickr.com/photos/ruthanddave/27498622033,https://creativecommons.org/licenses/by/2.0/,Ruth Hartnup,https://www.flickr.com/people/ruthanddave/\nec72d7b70a4e4bd0,https://c1.staticflickr.com/6/5496/30382727226_4d54d017e9_o.jpg,0.395867098865,0.0,1.0,0.75,539,759,https://www.flickr.com/photos/22711505@N05/30382727226,https://creativecommons.org/licenses/by/2.0/,Ron Cogswell,https://www.flickr.com/people/22711505@N05/\n6437205d8c82e0a6,https://c1.staticflickr.com/1/780/31268057140_14e88f0afa_o.jpg,0.0,0.25,0.5,1.0,819,446,https://www.flickr.com/photos/92592438@N04/31268057140/,https://creativecommons.org/licenses/by/2.0/,Simeon Berg,https://www.flickr.com/people/92592438@N04/\nee410ee55940d799,https://c1.staticflickr.com/8/7540/27597421481_86cdd88a49_o.jpg,0.0,0.0,0.666666666667,1.0,618,970,https://www.flickr.com/photos/ucdaviscoe/27597421481,https://creativecommons.org/licenses/by/2.0/,UC Davis College of Engineering,https://www.flickr.com/people/ucdaviscoe/\n58c1f41617158f95,https://c1.staticflickr.com/8/7606/27286002021_817049446c_o.jpg,0.28125,0.25,0.84375,1.0,699,748,https://www.flickr.com/photos/zongo/27286002021,https://creativecommons.org/licenses/by/2.0/,DAVID HOLT,https://www.flickr.com/people/zongo/\n528b7a8443c8ff42,https://c1.staticflickr.com/1/697/32161603130_2f50f52d65_o.jpg,0.25,0.0,0.75,0.75,422,666,https://www.flickr.com/photos/vallausa/32161603130/,https://creativecommons.org/licenses/by/2.0/,Sandra Vallaure,https://www.flickr.com/people/vallausa/\n911954f2e60f7f01,https://c1.staticflickr.com/1/580/31937560623_2dbe5d4c35_o.jpg,0.271313364055,0.0,0.813940092166,0.75,101,543,https://www.flickr.com/photos/wildreturn/31937560623/,https://creativecommons.org/licenses/by/2.0/,Andy Reago &amp; Chrissy McClarren,https://www.flickr.com/people/wildreturn/\n6fb72c99a573d872,https://c1.staticflickr.com/6/5682/32348736215_f6b7dc9205_o.jpg,0.0,0.28125,0.75,0.84375,108,759,https://www.flickr.com/photos/jimg944/32348736215,https://creativecommons.org/licenses/by/2.0/,Jim G,https://www.flickr.com/people/jimg944/\n6d48120c1bb80d32,https://c1.staticflickr.com/6/5608/30598440096_6bab176599_o.jpg,0.483695652174,0.25,0.967391304348,1.0,820,447,https://www.flickr.com/photos/jus10h/30598440096,https://creativecommons.org/licenses/by/2.0/,Justin Higuchi,https://www.flickr.com/people/jus10h/\n8f3505c8e6454794,https://c1.staticflickr.com/9/8704/28833795002_ef3629475f_o.jpg,0.4375,0.25,1.0,1.0,459,787,https://www.flickr.com/photos/hinkelstone/28833795002,https://creativecommons.org/licenses/by/2.0/,Karl-Ludwig Poggemann,https://www.flickr.com/people/hinkelstone/\n6e3b9ccb07d3b81d,https://c1.staticflickr.com/6/5794/31078383382_51632acefc_o.jpg,0.0,0.0,0.5625,0.75,976,788,https://www.flickr.com/photos/conner395/31078383382,https://creativecommons.org/licenses/by/2.0/,Dave Conner,https://www.flickr.com/people/conner395/\n40bb932b6acf8cc8,https://c1.staticflickr.com/9/8325/29275242831_f38dc55d37_o.jpg,0.0,0.0,0.666666666667,1.0,38,829,https://flickr.com/129665369@N02/29275242831,https://creativecommons.org/licenses/by/2.0/,Vahe Martirosyan,https://www.flickr.com/people/vahemart/\ndce89277addc4074,https://c1.staticflickr.com/8/7612/28010168326_182297ff49_o.jpg,0.25,0.25,0.75,1.0,896,619,https://www.flickr.com/photos/markyharky/28010168326,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\nd429a336d8aaf942,https://c1.staticflickr.com/6/5471/31433318845_7002317d39_o.jpg,0.210588633288,0.0,0.631765899865,0.75,818,224,https://www.flickr.com/photos/lwpkommunikacio/31433318845,https://creativecommons.org/licenses/by/2.0/,Lwp Kommunik\\303\\241ci\\303\\263,https://www.flickr.com/people/lwpkommunikacio/\nbf97721a1770eb55,https://c1.staticflickr.com/1/491/32238911612_b08a8dd04c_o.jpg,0.265577507599,0.25,0.796732522796,1.0,875,761,https://www.flickr.com/photos/grand_canyon_nps/32238911612,https://creativecommons.org/licenses/by/2.0/,Grand Canyon National Park,https://www.flickr.com/people/grand_canyon_nps/\n4717870ebe8c38c8,https://c1.staticflickr.com/9/8547/28090604464_159d489645_o.jpg,0.28125,0.0,0.84375,0.75,909,415,https://www.flickr.com/photos/mickaeltr/28090604464/,https://creativecommons.org/licenses/by/2.0/,Micka\\303\\253l T.,https://www.flickr.com/people/mickaeltr/\n7c973a7f04ef9ac9,https://c1.staticflickr.com/8/7504/27223435762_97e4858860_o.jpg,0.0,0.0,0.56338028169,0.75,407,340,https://www.flickr.com/photos/enneafive/27223435762,https://creativecommons.org/licenses/by/2.0/,Johan Neven,https://www.flickr.com/people/enneafive/\n2ef920eeebd4a9fa,https://c1.staticflickr.com/6/5767/30288729990_6736a90857_o.jpg,0.0,0.25,0.75,1.0,807,572,https://www.flickr.com/photos/glorycycles/30288729990,https://creativecommons.org/licenses/by/2.0/,Glory Cycles,https://www.flickr.com/people/glorycycles/\n404c7b706f17e3a7,https://c1.staticflickr.com/8/7530/30030881622_0e33ec4d45_o.jpg,0.0,0.25,0.75,1.0,740,597,https://flickr.com/37409525@N05/30030881622,https://creativecommons.org/licenses/by/2.0/,GretaMichelle Joachim,https://www.flickr.com/people/michellegj/\nf6e8a8fa627ab486,https://c1.staticflickr.com/8/7333/27326128272_8cec1e2472_o.jpg,0.0,0.0,1.0,1.0,829,116,https://www.flickr.com/photos/icanchangethisright/27326128272,https://creativecommons.org/licenses/by/2.0/,Bradley Gordon,https://www.flickr.com/people/icanchangethisright/\n037acb9fd8e29084,https://c1.staticflickr.com/1/694/32599556301_e4c538f40a_o.jpg,0.0,0.207395498392,1.0,1.0,612,955,https://www.flickr.com/photos/sotghwu/32599556301,https://creativecommons.org/licenses/by/2.0/,Grace Hwu,https://www.flickr.com/people/sotghwu/\nd52be689d2672767,https://c1.staticflickr.com/1/456/32423482375_a9a60c69fd_o.jpg,0.28125,0.0,0.84375,0.75,922,706,https://flickr.com/71445589@N02/32423482375,https://creativecommons.org/licenses/by/2.0/,\\303\\211tienne Pouvreau,https://www.flickr.com/people/etiennepouvreau/\n0398af20cdc80e17,https://c1.staticflickr.com/8/7410/26888198482_81a2849352_o.jpg,0.487313432836,0.25,1.0,1.0,971,998,https://www.flickr.com/photos/weyes/26888198482,https://creativecommons.org/licenses/by/2.0/,Alessandro Caproni,https://www.flickr.com/people/weyes/\n2f5510205da8776d,https://c1.staticflickr.com/8/7660/27501516476_63a6c77a3c_o.jpg,0.0,0.0,0.75,0.5625,980,640,https://www.flickr.com/photos/cogdog/27501516476/,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n55d4770499efeaa4,https://c1.staticflickr.com/9/8739/28816295785_cf045806d7_o.jpg,0.0,0.0,0.75,1.0,304,328,https://flickr.com/86548370@N00/28816295785,https://creativecommons.org/licenses/by/2.0/,Katja Schulz,https://www.flickr.com/people/treegrow/\n5e2795e93d116422,https://c1.staticflickr.com/1/436/31816887610_3aed2b1919_o.jpg,0.249631811487,0.0,0.748895434462,0.75,405,830,https://www.flickr.com/photos/markyharky/31816887610,https://creativecommons.org/licenses/by/2.0/,Mark Harkin,https://www.flickr.com/people/markyharky/\n241643e62f317913,https://c1.staticflickr.com/9/8199/29559949596_2810dc7e50_o.jpg,0.5,0.0,1.0,0.75,437,168,https://www.flickr.com/photos/greggjerdingen/29559949596,https://creativecommons.org/licenses/by/2.0/,Greg Gjerdingen,https://www.flickr.com/people/greggjerdingen/\nc4f8b575d5929648,https://c1.staticflickr.com/6/5144/30052023461_d2feaee121_o.jpg,0.5,0.25,1.0,1.0,355,856,https://flickr.com/8634814@N03/30052023461,https://creativecommons.org/licenses/by/2.0/,happymillerman,https://www.flickr.com/people/happymillerman/\nc654a0c6043a2be7,https://c1.staticflickr.com/6/5452/30337894602_bbe13a6fc3_o.jpg,0.5,0.25,1.0,1.0,868,222,https://www.flickr.com/photos/76969036@N02/30337894602/,https://creativecommons.org/licenses/by/2.0/,David Guo,https://www.flickr.com/people/76969036@N02/\nc994b784f45a6f02,https://c1.staticflickr.com/9/8462/29435829632_8899e78d0e_o.jpg,0.252730109204,0.0,1.0,1.0,512,355,https://www.flickr.com/photos/andreboeni/29435829632,https://creativecommons.org/licenses/by/2.0/,Andrew Bone,https://www.flickr.com/people/andreboeni/\n7a1aaf28fcb230f1,https://c1.staticflickr.com/8/7295/27570145304_d7c563da84_o.jpg,0.0,0.25,0.5625,1.0,611,476,https://www.flickr.com/photos/cogdog/27570145304,https://creativecommons.org/licenses/by/2.0/,Alan Levine,https://www.flickr.com/people/cogdog/\n8e6f46716c52ca61,https://c1.staticflickr.com/6/5489/31326184845_139b8d8f1d_o.jpg,0.5,0.0,1.0,0.75,948,774,https://www.flickr.com/photos/64933790@N00/31326184845,https://creativecommons.org/licenses/by/2.0/,Pato Novoa,https://www.flickr.com/people/64933790@N00/\ncc614d907404a74c,https://c1.staticflickr.com/8/7438/27046250110_ae09d0647e_o.jpg,0.0,0.0,0.666666666667,1.0,706,414,https://www.flickr.com/photos/126337928@N05/27046250110,https://creativecommons.org/licenses/by/2.0/,Jeremy Segrott,https://www.flickr.com/people/126337928@N05/\n65cf51069efdaf96,https://c1.staticflickr.com/1/739/30880078254_766c5118b8_o.jpg,0.145528683915,0.0,0.436586051744,0.75,848,866,http://www.flickr.com/photos/mohit_s/30880078254/,https://creativecommons.org/licenses/by/2.0/,Mohit S,https://www.flickr.com/people/mohit_s/\n33eb044cba036dfd,https://c1.staticflickr.com/1/504/32787851015_c1d716df82_o.jpg,0.0,0.25,0.468616262482,1.0,699,495,http://www.flickr.com/photos/31176607@N05/32787851015,https://creativecommons.org/licenses/by/2.0/,kuhnmi,https://www.flickr.com/people/31176607@N05/\n77dcba158e450113,https://c1.staticflickr.com/6/5755/30446314871_d1df04b764_o.jpg,0.283163265306,0.0,0.849489795918,0.75,760,871,https://www.flickr.com/photos/51764518@N02/30446314871,https://creativecommons.org/licenses/by/2.0/,Joe Haupt,https://www.flickr.com/people/51764518@N02/\n3f8bba587fc11cef,https://c1.staticflickr.com/6/5608/30746539130_4a3266eb4f_o.jpg,0.0,0.0,0.75,0.75,599,842,https://www.flickr.com/photos/grantwickes/30746539130/,https://creativecommons.org/licenses/by/2.0/,Grant Wickes,https://www.flickr.com/people/grantwickes/\n76e817284d83c182,https://c1.staticflickr.com/9/8691/28495844145_63e9c8c34d_o.jpg,0.25,0.25,1.0,1.0,575,700,https://flickr.com/7831824@N04/28495844145,https://creativecommons.org/licenses/by/2.0/,Bex Walton,https://www.flickr.com/people/bexwalton/\n7eda6af195a61a91,https://c1.staticflickr.com/8/7186/27305401282_c5546078ce_o.jpg,0.5,0.0,1.0,0.75,405,976,https://www.flickr.com/photos/alessandroambrosetti/27305401282,https://creativecommons.org/licenses/by/2.0/,Alessandro Ambrosetti,https://www.flickr.com/people/alessandroambrosetti/\nb8070817c83b5224,https://c1.staticflickr.com/1/592/32952561555_d8447bf9cb_o.jpg,0.292105263158,0.0,1.0,0.75,431,796,https://flickr.com/21207441@N08/32952561555,https://creativecommons.org/licenses/by/2.0/,Michelle Milla,https://www.flickr.com/people/michellemilla/\nf0062fb379eefa26,https://c1.staticflickr.com/1/781/31811137746_60f712a939_o.jpg,0.281690140845,0.0,0.845070422535,0.75,469,767,https://www.flickr.com/photos/andyhay/31811137746,https://creativecommons.org/licenses/by/2.0/,Andy Hay,https://www.flickr.com/people/andyhay/\n23b2145369efc45d,https://c1.staticflickr.com/1/715/31056358404_32d2eb2aaa_o.jpg,0.243449781659,0.25,0.730349344978,1.0,490,831,https://www.flickr.com/photos/royluck/31056358404,https://creativecommons.org/licenses/by/2.0/,Roy Luck,https://www.flickr.com/people/royluck/\n3b4185b505fbfad2,https://c1.staticflickr.com/1/603/30872960764_9220bb57d6_o.jpg,0.438430311231,0.0,1.0,1.0,818,478,https://flickr.com/149503105@N07/30872960764,https://creativecommons.org/licenses/by/2.0/,Ajith Kumar,https://www.flickr.com/people/ajithdauk/\n0596087dd0ebc76b,https://c1.staticflickr.com/6/5717/30449115936_bd3d06760f_o.jpg,0.49889380531,0.0,1.0,0.75,855,784,https://www.flickr.com/photos/scatto_felino/30449115936/,https://creativecommons.org/licenses/by/2.0/,Marco,https://www.flickr.com/people/scatto_felino/\n9c404556c905cd2c,https://c1.staticflickr.com/8/7562/26836060583_f154a64dc5_o.jpg,0.297202797203,0.0,1.0,0.75,304,64,https://www.flickr.com/photos/m-a-r-t-i-n/26836060583,https://creativecommons.org/licenses/by/2.0/,Martin Cooper,https://www.flickr.com/people/m-a-r-t-i-n/\n03e38a597881f7ad,https://c1.staticflickr.com/3/2826/33341223922_1e71444a5d_o.jpg,0.28125,0.0,0.84375,0.75,780,872,http://www.flickr.com/photos/62048854@N08/33341223922,https://creativecommons.org/licenses/by/2.0/,ThoseGuys119,https://www.flickr.com/people/thoseguys119/\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/.gitignore",
    "content": "# ignoring dataset subdirectory\ndataset/\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/README.md",
    "content": "\n# Development toolkit for participants of adversarial competition\n\nThis is a development toolkit for the\n[Competition on Adversarial Examples and Defenses](https://www.kaggle.com/nips-2017-adversarial-learning-competition)\nwhich will be held as a part of NIPS'17 conference.\n\nThis toolkit includes:\n\n* Dev dataset which participants can use for development and testing of their\n  attacks and defenses\n* Sample adversarial attacks\n* Sample adversarial defenses\n* Tool to run attacks against defenses and compute score.\n\n## Installation\n\n### Prerequisites\n\nFollowing software required to use this package:\n\n* Python 2.7 with installed [Numpy](http://www.numpy.org/)\n  and [Pillow](https://python-pillow.org/) packages.\n* [Docker](https://www.docker.com/)\n\nAdditionally, all provided examples are written with use of\nthe [TensorFlow](https://www.tensorflow.org/).\nThus you may find useful to install TensorFlow to experiment with the examples,\nhowever this is not strictly necessary.\n\n### Installation procedure\n\nTo be able to run the examples you need to download checkpoints for provided models\nas well as dataset.\n\nTo download the dataset and all checkpoints run following:\n\n```bash\n./download_data.sh\n```\n\nIf you only need to download the dataset then you can run:\n\n```bash\n# ${DATASET_IMAGES_DIR} is a directory to save images\npython ../dataset/download_images.py \\\n  --input_file=../dataset/dev_dataset.csv \\\n  --output_dir=${DATASET_IMAGES_DIR}\n```\n\n## Dataset\n\nThis toolkit includes DEV dataset with 1000 labelled images.\nDEV dataset could be used for development and testing of adversarial attacks\nand defenses.\n\nDetails about dataset are [here](../dataset/README.md).\n\n## Sample attacks and defenses\n\nToolkit includes examples of attacks and defenses in the following directories:\n\n* `sample_attacks/` - directory with examples of attacks:\n  * `sample_attacks/fgsm/` - Fast gradient sign attack.\n  * `sample_attacks/noop/` - No-op attack, which just copied images unchanged.\n  * `sample_attacks/random_noise/` - Attack which adds random noise to images.\n* `sample_targeted_attacks/` - directory with examples of targeted attacks:\n  * `sample_targeted_attacks/step_target_class/` - one step towards target\n    class attack. This is not particularly good targeted attack, but it\n    demonstrates how targeted attack could be written.\n  * `sample_targeted_attacks/iter_target_class/` - iterative target class\n    attack. This is a pretty good white-box attack,\n    but it does not do well in black box setting.\n* `sample_defenses/` - directory with examples of defenses:\n  * `sample_defenses/base_inception_model/` - baseline inception classifier,\n    which actually does not provide any defense against adversarial examples.\n  * `sample_defenses/adv_inception_v3/` - adversarially trained Inception v3\n    model from [Adversarial Machine Learning at\n    Scale](https://arxiv.org/abs/1611.01236) paper.\n  * `sample_defenses/ens_adv_inception_resnet_v2/` - Inception ResNet v2\n    model which is adversarially trained against an ensemble of different\n    kind of adversarial examples. Model is described in\n    [Ensemble Adversarial Training: Attacks and\n    Defenses](https://arxiv.org/abs/1705.07204) paper.\n\n### Structure of attacks and defenses\n\nEach attack and defense should be stored in a separate subdirectory,\nshould be self-contained and intended to be run inside Docker container.\n\nDirectory with each attack or defense should contain file `metadata.json`\nin JSON format with following fields:\n\n* `type` could be one of `\"attack\"`, `\"defense\"` or `\"targeted_attack\"`.\n* `container` is a URL of Docker container inside which attack or defense\n  should be run.\n* `container_gpu` is an optional field, URL of Docker container with\n  GPU support.\n* `entry_point` is a script which launches attack or defense.\n\nExample of `metadata.json`:\n\n```json\n{\n  \"type\": \"attack\",\n  \"container\": \"gcr.io/tensorflow/tensorflow:1.1.0\",\n  \"container_gpu\": \"gcr.io/tensorflow/tensorflow:1.1.0-gpu\",\n  \"entry_point\": \"run_attack.sh\"\n}\n```\n\n#### Non-targeted attack\n\nEntry point script for a non-targeted attack should accept three arguments:\ninput directory, output directory and maximum size of adversarial perturbation\n(in [infinity norm](https://en.wikipedia.org/wiki/Uniform_norm)). It will be\ninvoked in the following way:\n\n```bash\nattack_entry_point.sh INPUT_DIR OUTPUT_DIR MAX_SIZE_OF_PERTURBAION\n```\n\nInput directory will contain source images from dataset in PNG format and attack\nhas to write adversarial images into output directory.\nInput images are 299x299 pixels RGB images, output images should have the same\nsize and also written in PNG format.\nFilenames of adversarial images should be the same as filenames of\ncorresponding source images from the dataset.\n\nNon-targeted attack is expected to produce adversarial images which are likely\nwill be misclassified by image classifier (assuming that it can classify source\nimages well).\n\nDifference between each generated adversarial images and corresponding source\nimage has to be within specified maximum size of adversarial perturbation.\nIf it's not the case then competition runtime will automatically clip\nadversarial image to be within the limits.\n\n#### Targeted attack\n\nEntry point script for a targeted attack accepts the same set of arguments as\nfor non-targeted attack: input directory, output directory, maximum size of\nperturbation.\n\nThe only difference is that input directory will contain `target_class.csv` file\naddition to images. Each line of `target_class.csv` will contain\ncomma-separated pairs of image filename and target class.\n\nTargeted attack is expected to produce adversarial image which will\nbe likely classified as desired target class by image classifier.\n\nDifference between source images and generated adversarial images\nshould be within specified maximum size of perturbation,\nsimilarly to non-targeted attack.\n\n#### Defense\n\nEntry point script for a defense accepts two arguments: input directory and\noutput file. It will be invoked in a following way:\n\n```bash\ndefense_entry_point.sh INPUT_DIR OUTPUT_FILE\n```\n\nInput directory will contain bunch of adversarial images in PNG format.\nDefense has to classify all these images and write its predictions into\noutput file. Each line of the output file should contain comma separated image\nfilename and predicted label.\n\n## How to run attacks against defenses\n\nScript `run_attacks_and_defenses.py` runs all attacks against all defenses\nand computes scores of each attack and each defense.\n\nYou can run it in a following way:\n\n```bash\npython run_attacks_and_defenses.py \\\n  --attacks_dir=\"${DIRECTORY_WITH_ATTACKS}\" \\\n  --targeted_attacks_dir=\"${DIRECTORY_WITH_TARGETED_ATTACKS}\" \\\n  --defenses_dir=\"${DIRECTORY_WITH_DEFENSES}\" \\\n  --dataset_dir=\"${DIRECTORY_WITH_DATASET_IMAGES}\" \\\n  --intermediate_results_dir=\"${TEMP_DIRECTORY_FOR_INTERMEDIATE_RESULTS}\" \\\n  --dataset_metadata=dataset/dataset.csv \\\n  --output_dir=\"${OUTPUT_DIRECTORY}\" \\\n  --epsilon=\"${MAXIMUM_SIZE_OF_ADVERSARIAL_PERTURBATION}\"\n```\n\nIf you have GPU card and\n[nvidia-docker](https://github.com/NVIDIA/nvidia-docker) installed then you can\nadditionally pass `--gpu` argument to `run_attacks_and_defenses.py`\nso attacks and defenses will be able to take advantage of GPU to speedup\ncomputations.\n\nAlternatively instead of running `run_attacks_and_defenses.py` directly and\nproviding all command line arguments you can use helper script\n`run_attacks_and_defenses.sh` to run all attacks and defenses from this toolkit\nagainst each other and save results to temporary directory.\n\nNOTE: You should cleanup temporary directory created by\n`run_attacks_and_defenses.sh` after running it.\n\n`run_attacks_and_defenses.py` will write following files into output directory:\n\n* `accuracy_on_attacks.csv` with matrix which will contain number of correctly\n  classified images for each pair of non-targeted attack and defense.\n  Columns of the matrix are defenses, rows of the matrix are\n  non-targeted attacks.\n* `accuracy_on_targeted_attacks.csv` with matrix which will contain number of\n  correctly classified images for each pair of targeted attack and defense.\n  Columns of the matrix are defenses, rows of the matrix are targeted attacks.\n* `hit_target_class.csv` with matrix which will contain number of times images\n  were classified as target class by defense for each given targeted attack.\n  Columns of the matrix are defenses, rows of the matrix are targeted attacks.\n* `defense_ranking.csv` with ranking of all defenses (best - first,\n  worst - last, ties in arbitrary order), along with the score of each defense.\n  Score for each defense is computed as total number of correctly classified\n  adversarial images by defense classifier.\n* `attack_ranking.csv` with ranking of all non-targeted (best - first,\n  worst - last, ties in arbitrary order), along with the score of each attack.\n  Score for each attack is computed as total number of time attack was able to\n  cause incorrect classification\n* `targeted_attack_ranking.csv` with ranking of all targeted attacks\n  (best - first, worst - last, ties in arbitrary order), along with the score of\n  each targeted attack.\n  Score is computed as number of times the attack was able to force defense\n  classifier to recognize adversarial image as specified target class.\n\nAdditionally, if flag `--save_all_classification` is provided then\n`run_attacks_and_defenses.py` will save file `all_classification.csv`\nwhich contains classification predictions (along with true classes and\ntarget classes) for each adversarial image generated by each attack\nand classified by each defense. This might be useful for debugging.\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/download_data.sh",
    "content": "#!/bin/bash\n\ncd \"$( dirname \"${BASH_SOURCE[0]}\" )\"\n\n# Download checkpoints for sample attacks and defenses.\nsample_attacks/download_checkpoints.sh\nsample_targeted_attacks/download_checkpoints.sh\nsample_defenses/download_checkpoints.sh\n\n# Download dataset.\nmkdir -p dataset/images\ncp ../dataset/dev_dataset.csv dataset/\npython ../dataset/download_images.py \\\n  --input_file=dataset/dev_dataset.csv \\\n  --output_dir=dataset/images/\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/run_attacks_and_defenses.py",
    "content": "\"\"\"Tool which runs all attacks against all defenses and computes results.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport argparse\nimport csv\nimport json\nimport os\nimport subprocess\nimport numpy as np\nfrom PIL import Image\n\n\ndef parse_args():\n    \"\"\"Parses command line arguments.\"\"\"\n    parser = argparse.ArgumentParser(description=\"Tool to run attacks and defenses.\")\n    parser.add_argument(\"--attacks_dir\", required=True, help=\"Location of all attacks.\")\n    parser.add_argument(\n        \"--targeted_attacks_dir\",\n        required=True,\n        help=\"Location of all targeted attacks.\",\n    )\n    parser.add_argument(\n        \"--defenses_dir\", required=True, help=\"Location of all defenses.\"\n    )\n    parser.add_argument(\"--dataset_dir\", required=True, help=\"Location of the dataset.\")\n    parser.add_argument(\n        \"--dataset_metadata\", required=True, help=\"Location of the dataset metadata.\"\n    )\n    parser.add_argument(\n        \"--intermediate_results_dir\",\n        required=True,\n        help=\"Directory to store intermediate results.\",\n    )\n    parser.add_argument(\"--output_dir\", required=True, help=(\"Output directory.\"))\n    parser.add_argument(\n        \"--epsilon\",\n        required=False,\n        type=int,\n        default=16,\n        help=\"Maximum allowed size of adversarial perturbation\",\n    )\n    parser.add_argument(\"--gpu\", dest=\"use_gpu\", action=\"store_true\")\n    parser.add_argument(\"--nogpu\", dest=\"use_gpu\", action=\"store_false\")\n    parser.set_defaults(use_gpu=False)\n    parser.add_argument(\n        \"--save_all_classification\", dest=\"save_all_classification\", action=\"store_true\"\n    )\n    parser.add_argument(\n        \"--nosave_all_classification\",\n        dest=\"save_all_classification\",\n        action=\"store_false\",\n    )\n    parser.set_defaults(save_all_classification=False)\n    return parser.parse_args()\n\n\nclass Submission(object):\n    \"\"\"Base class for all submissions.\"\"\"\n\n    def __init__(self, directory, container, entry_point, use_gpu):\n        \"\"\"Initializes instance of Submission class.\n\n        Args:\n          directory: location of the submission.\n          container: URL of Docker container which should be used to run submission.\n          entry_point: entry point script, which invokes submission.\n          use_gpu: whether to use Docker with GPU or not.\n        \"\"\"\n        self.name = os.path.basename(directory)\n        self.directory = directory\n        self.container = container\n        self.entry_point = entry_point\n        self.use_gpu = use_gpu\n\n    def docker_binary(self):\n        \"\"\"Returns appropriate Docker binary to use.\"\"\"\n        return \"nvidia-docker\" if self.use_gpu else \"docker\"\n\n\nclass Attack(Submission):\n    \"\"\"Class which stores and runs attack.\"\"\"\n\n    def run(self, input_dir, output_dir, epsilon):\n        \"\"\"Runs attack inside Docker.\n\n        Args:\n          input_dir: directory with input (dataset).\n          output_dir: directory where output (adversarial images) should be written.\n          epsilon: maximum allowed size of adversarial perturbation,\n            should be in range [0, 255].\n        \"\"\"\n        print(\"Running attack \", self.name)\n        cmd = [\n            self.docker_binary(),\n            \"run\",\n            \"-v\",\n            \"{0}:/input_images\".format(input_dir),\n            \"-v\",\n            \"{0}:/output_images\".format(output_dir),\n            \"-v\",\n            \"{0}:/code\".format(self.directory),\n            \"-w\",\n            \"/code\",\n            self.container,\n            \"./\" + self.entry_point,\n            \"/input_images\",\n            \"/output_images\",\n            str(epsilon),\n        ]\n        print(\" \".join(cmd))\n        subprocess.call(cmd)\n\n\nclass Defense(Submission):\n    \"\"\"Class which stores and runs defense.\"\"\"\n\n    def run(self, input_dir, output_dir):\n        \"\"\"Runs defense inside Docker.\n\n        Args:\n          input_dir: directory with input (adversarial images).\n          output_dir: directory to write output (classification result).\n        \"\"\"\n        print(\"Running defense \", self.name)\n        cmd = [\n            self.docker_binary(),\n            \"run\",\n            \"-v\",\n            \"{0}:/input_images\".format(input_dir),\n            \"-v\",\n            \"{0}:/output_data\".format(output_dir),\n            \"-v\",\n            \"{0}:/code\".format(self.directory),\n            \"-w\",\n            \"/code\",\n            self.container,\n            \"./\" + self.entry_point,\n            \"/input_images\",\n            \"/output_data/result.csv\",\n        ]\n        print(\" \".join(cmd))\n        subprocess.call(cmd)\n\n\ndef read_submissions_from_directory(dirname, use_gpu):\n    \"\"\"Scans directory and read all submissions.\n\n    Args:\n      dirname: directory to scan.\n      use_gpu: whether submissions should use GPU. This argument is\n        used to pick proper Docker container for each submission and create\n        instance of Attack or Defense class.\n\n    Returns:\n      List with submissions (subclasses of Submission class).\n    \"\"\"\n    result = []\n    for sub_dir in os.listdir(dirname):\n        submission_path = os.path.join(dirname, sub_dir)\n        try:\n            if not os.path.isdir(submission_path):\n                continue\n            if not os.path.exists(os.path.join(submission_path, \"metadata.json\")):\n                continue\n            with open(os.path.join(submission_path, \"metadata.json\")) as f:\n                metadata = json.load(f)\n            if use_gpu and (\"container_gpu\" in metadata):\n                container = metadata[\"container_gpu\"]\n            else:\n                container = metadata[\"container\"]\n            entry_point = metadata[\"entry_point\"]\n            submission_type = metadata[\"type\"]\n            if submission_type == \"attack\" or submission_type == \"targeted_attack\":\n                submission = Attack(submission_path, container, entry_point, use_gpu)\n            elif submission_type == \"defense\":\n                submission = Defense(submission_path, container, entry_point, use_gpu)\n            else:\n                raise ValueError(\"Invalid type of submission: %s\" % submission_type)\n            result.append(submission)\n        except (IOError, KeyError, ValueError):\n            print(\"Failed to read submission from directory \", submission_path)\n    return result\n\n\nclass AttacksOutput(object):\n    \"\"\"Helper class to store data about images generated by attacks.\"\"\"\n\n    def __init__(\n        self,\n        dataset_dir,\n        attacks_output_dir,\n        targeted_attacks_output_dir,\n        all_adv_examples_dir,\n        epsilon,\n    ):\n        \"\"\"Initializes instance of AttacksOutput class.\n\n        Args:\n          dataset_dir: location of the dataset.\n          attacks_output_dir: where to write results of attacks.\n          targeted_attacks_output_dir: where to write results of targeted attacks.\n          all_adv_examples_dir: directory to copy all adversarial examples from\n            all attacks.\n          epsilon: maximum allowed size of adversarial perturbation.\n        \"\"\"\n        self.attacks_output_dir = attacks_output_dir\n        self.targeted_attacks_output_dir = targeted_attacks_output_dir\n        self.all_adv_examples_dir = all_adv_examples_dir\n        self._load_dataset_clipping(dataset_dir, epsilon)\n        self._output_image_idx = 0\n        self._output_to_attack_mapping = {}\n        self._attack_image_count = 0\n        self._targeted_attack_image_count = 0\n        self._attack_names = set()\n        self._targeted_attack_names = set()\n\n    def _load_dataset_clipping(self, dataset_dir, epsilon):\n        \"\"\"Helper method which loads dataset and determines clipping range.\n\n        Args:\n          dataset_dir: location of the dataset.\n          epsilon: maximum allowed size of adversarial perturbation.\n        \"\"\"\n        self.dataset_max_clip = {}\n        self.dataset_min_clip = {}\n        self._dataset_image_count = 0\n        for fname in os.listdir(dataset_dir):\n            if not fname.endswith(\".png\"):\n                continue\n            image_id = fname[:-4]\n            image = np.array(\n                Image.open(os.path.join(dataset_dir, fname)).convert(\"RGB\")\n            )\n            image = image.astype(\"int32\")\n            self._dataset_image_count += 1\n            self.dataset_max_clip[image_id] = np.clip(image + epsilon, 0, 255).astype(\n                \"uint8\"\n            )\n            self.dataset_min_clip[image_id] = np.clip(image - epsilon, 0, 255).astype(\n                \"uint8\"\n            )\n\n    def clip_and_copy_attack_outputs(self, attack_name, is_targeted):\n        \"\"\"Clips results of attack and copy it to directory with all images.\n\n        Args:\n          attack_name: name of the attack.\n          is_targeted: if True then attack is targeted, otherwise non-targeted.\n        \"\"\"\n        if is_targeted:\n            self._targeted_attack_names.add(attack_name)\n        else:\n            self._attack_names.add(attack_name)\n        attack_dir = os.path.join(\n            self.targeted_attacks_output_dir\n            if is_targeted\n            else self.attacks_output_dir,\n            attack_name,\n        )\n        for fname in os.listdir(attack_dir):\n            if not (fname.endswith(\".png\") or fname.endswith(\".jpg\")):\n                continue\n            image_id = fname[:-4]\n            if image_id not in self.dataset_max_clip:\n                continue\n            image_max_clip = self.dataset_max_clip[image_id]\n            image_min_clip = self.dataset_min_clip[image_id]\n            adversarial_image = np.array(\n                Image.open(os.path.join(attack_dir, fname)).convert(\"RGB\")\n            )\n            clipped_adv_image = np.clip(\n                adversarial_image, image_min_clip, image_max_clip\n            )\n            output_basename = \"{0:08d}\".format(self._output_image_idx)\n            self._output_image_idx += 1\n            self._output_to_attack_mapping[output_basename] = (\n                attack_name,\n                is_targeted,\n                image_id,\n            )\n            if is_targeted:\n                self._targeted_attack_image_count += 1\n            else:\n                self._attack_image_count += 1\n            Image.fromarray(clipped_adv_image).save(\n                os.path.join(self.all_adv_examples_dir, output_basename + \".png\")\n            )\n\n    @property\n    def attack_names(self):\n        \"\"\"Returns list of all non-targeted attacks.\"\"\"\n        return self._attack_names\n\n    @property\n    def targeted_attack_names(self):\n        \"\"\"Returns list of all targeted attacks.\"\"\"\n        return self._targeted_attack_names\n\n    @property\n    def attack_image_count(self):\n        \"\"\"Returns number of all images generated by non-targeted attacks.\"\"\"\n        return self._attack_image_count\n\n    @property\n    def dataset_image_count(self):\n        \"\"\"Returns number of all images in the dataset.\"\"\"\n        return self._dataset_image_count\n\n    @property\n    def targeted_attack_image_count(self):\n        \"\"\"Returns number of all images generated by targeted attacks.\"\"\"\n        return self._targeted_attack_image_count\n\n    def image_by_base_filename(self, filename):\n        \"\"\"Returns information about image based on it's filename.\"\"\"\n        return self._output_to_attack_mapping[filename]\n\n\nclass DatasetMetadata(object):\n    \"\"\"Helper class which loads and stores dataset metadata.\"\"\"\n\n    def __init__(self, filename):\n        \"\"\"Initializes instance of DatasetMetadata.\"\"\"\n        self._true_labels = {}\n        self._target_classes = {}\n        with open(filename) as f:\n            reader = csv.reader(f)\n            header_row = next(reader)\n            try:\n                row_idx_image_id = header_row.index(\"ImageId\")\n                row_idx_true_label = header_row.index(\"TrueLabel\")\n                row_idx_target_class = header_row.index(\"TargetClass\")\n            except ValueError:\n                raise IOError(\"Invalid format of dataset metadata.\")\n            for row in reader:\n                if len(row) < len(header_row):\n                    # skip partial or empty lines\n                    continue\n                try:\n                    image_id = row[row_idx_image_id]\n                    self._true_labels[image_id] = int(row[row_idx_true_label])\n                    self._target_classes[image_id] = int(row[row_idx_target_class])\n                except (IndexError, ValueError):\n                    raise IOError(\"Invalid format of dataset metadata\")\n\n    def get_true_label(self, image_id):\n        \"\"\"Returns true label for image with given ID.\"\"\"\n        return self._true_labels[image_id]\n\n    def get_target_class(self, image_id):\n        \"\"\"Returns target class for image with given ID.\"\"\"\n        return self._target_classes[image_id]\n\n    def save_target_classes(self, filename):\n        \"\"\"Saves target classed for all dataset images into given file.\"\"\"\n        with open(filename, \"w\") as f:\n            for k, v in self._target_classes.items():\n                f.write(\"{0}.png,{1}\\n\".format(k, v))\n\n\ndef load_defense_output(filename):\n    \"\"\"Loads output of defense from given file.\"\"\"\n    result = {}\n    with open(filename) as f:\n        for row in csv.reader(f):\n            try:\n                image_filename = row[0]\n                if image_filename.endswith(\".png\") or image_filename.endswith(\".jpg\"):\n                    image_filename = image_filename[: image_filename.rfind(\".\")]\n                label = int(row[1])\n            except (IndexError, ValueError):\n                continue\n            result[image_filename] = label\n    return result\n\n\ndef compute_and_save_scores_and_ranking(\n    attacks_output,\n    defenses_output,\n    dataset_meta,\n    output_dir,\n    save_all_classification=False,\n):\n    \"\"\"Computes scores and ranking and saves it.\n\n    Args:\n      attacks_output: output of attacks, instance of AttacksOutput class.\n      defenses_output: outputs of defenses. Dictionary of dictionaries, key in\n        outer dictionary is name of the defense, key of inner dictionary is\n        name of the image, value of inner dictionary is classification label.\n      dataset_meta: dataset metadata, instance of DatasetMetadata class.\n      output_dir: output directory where results will be saved.\n      save_all_classification: If True then classification results of all\n        defenses on all images produces by all attacks will be saved into\n        all_classification.csv file. Useful for debugging.\n\n    This function saves following files into output directory:\n      accuracy_on_attacks.csv: matrix with number of correctly classified images\n        for each pair of defense and attack.\n      accuracy_on_targeted_attacks.csv: matrix with number of correctly classified\n        images for each pair of defense and targeted attack.\n      hit_target_class.csv: matrix with number of times defense classified image\n        as specified target class for each pair of defense and targeted attack.\n      defense_ranking.csv: ranking and scores of all defenses.\n      attack_ranking.csv: ranking and scores of all attacks.\n      targeted_attack_ranking.csv: ranking and scores of all targeted attacks.\n      all_classification.csv: results of classification of all defenses on\n        all images produced by all attacks. Only saved if save_all_classification\n        argument is True.\n    \"\"\"\n\n    def write_ranking(filename, header, names, scores):\n        \"\"\"Helper method which saves submissions' scores and names.\"\"\"\n        order = np.argsort(scores)[::-1]\n        with open(filename, \"w\") as f:\n            writer = csv.writer(f)\n            writer.writerow(header)\n            for idx in order:\n                writer.writerow([names[idx], scores[idx]])\n\n    def write_score_matrix(filename, scores, row_names, column_names):\n        \"\"\"Helper method which saves score matrix.\"\"\"\n        result = np.pad(scores, ((1, 0), (1, 0)), \"constant\").astype(np.object)\n        result[0, 0] = \"\"\n        result[1:, 0] = row_names\n        result[0, 1:] = column_names\n        np.savetxt(filename, result, fmt=\"%s\", delimiter=\",\")\n\n    attack_names = list(attacks_output.attack_names)\n    attack_names_idx = {name: index for index, name in enumerate(attack_names)}\n    targeted_attack_names = list(attacks_output.targeted_attack_names)\n    targeted_attack_names_idx = {\n        name: index for index, name in enumerate(targeted_attack_names)\n    }\n    defense_names = list(defenses_output.keys())\n    defense_names_idx = {name: index for index, name in enumerate(defense_names)}\n\n    # In the matrices below: rows - attacks, columns - defenses.\n    accuracy_on_attacks = np.zeros(\n        (len(attack_names), len(defense_names)), dtype=np.int32\n    )\n    accuracy_on_targeted_attacks = np.zeros(\n        (len(targeted_attack_names), len(defense_names)), dtype=np.int32\n    )\n    hit_target_class = np.zeros(\n        (len(targeted_attack_names), len(defense_names)), dtype=np.int32\n    )\n\n    for defense_name, defense_result in defenses_output.items():\n        for image_filename, predicted_label in defense_result.items():\n            attack_name, is_targeted, image_id = attacks_output.image_by_base_filename(\n                image_filename\n            )\n            true_label = dataset_meta.get_true_label(image_id)\n            defense_idx = defense_names_idx[defense_name]\n            if is_targeted:\n                target_class = dataset_meta.get_target_class(image_id)\n                if true_label == predicted_label:\n                    attack_idx = targeted_attack_names_idx[attack_name]\n                    accuracy_on_targeted_attacks[attack_idx, defense_idx] += 1\n                if target_class == predicted_label:\n                    attack_idx = targeted_attack_names_idx[attack_name]\n                    hit_target_class[attack_idx, defense_idx] += 1\n            else:\n                if true_label == predicted_label:\n                    attack_idx = attack_names_idx[attack_name]\n                    accuracy_on_attacks[attack_idx, defense_idx] += 1\n\n    # Save matrices.\n    write_score_matrix(\n        os.path.join(output_dir, \"accuracy_on_attacks.csv\"),\n        accuracy_on_attacks,\n        attack_names,\n        defense_names,\n    )\n    write_score_matrix(\n        os.path.join(output_dir, \"accuracy_on_targeted_attacks.csv\"),\n        accuracy_on_targeted_attacks,\n        targeted_attack_names,\n        defense_names,\n    )\n    write_score_matrix(\n        os.path.join(output_dir, \"hit_target_class.csv\"),\n        hit_target_class,\n        targeted_attack_names,\n        defense_names,\n    )\n\n    # Compute and save scores and ranking of attacks and defenses,\n    # higher scores are better.\n    defense_scores = np.sum(accuracy_on_attacks, axis=0) + np.sum(\n        accuracy_on_targeted_attacks, axis=0\n    )\n    attack_scores = attacks_output.dataset_image_count * len(defenses_output) - np.sum(\n        accuracy_on_attacks, axis=1\n    )\n    targeted_attack_scores = np.sum(hit_target_class, axis=1)\n    write_ranking(\n        os.path.join(output_dir, \"defense_ranking.csv\"),\n        [\"DefenseName\", \"Score\"],\n        defense_names,\n        defense_scores,\n    )\n    write_ranking(\n        os.path.join(output_dir, \"attack_ranking.csv\"),\n        [\"AttackName\", \"Score\"],\n        attack_names,\n        attack_scores,\n    )\n    write_ranking(\n        os.path.join(output_dir, \"targeted_attack_ranking.csv\"),\n        [\"AttackName\", \"Score\"],\n        targeted_attack_names,\n        targeted_attack_scores,\n    )\n\n    if save_all_classification:\n        with open(os.path.join(output_dir, \"all_classification.csv\"), \"w\") as f:\n            writer = csv.writer(f)\n            writer.writerow(\n                [\n                    \"AttackName\",\n                    \"IsTargeted\",\n                    \"DefenseName\",\n                    \"ImageId\",\n                    \"PredictedLabel\",\n                    \"TrueLabel\",\n                    \"TargetClass\",\n                ]\n            )\n            for defense_name, defense_result in defenses_output.items():\n                for image_filename, predicted_label in defense_result.items():\n                    (\n                        attack_name,\n                        is_targeted,\n                        image_id,\n                    ) = attacks_output.image_by_base_filename(image_filename)\n                    true_label = dataset_meta.get_true_label(image_id)\n                    target_class = dataset_meta.get_target_class(image_id)\n                    writer.writerow(\n                        [\n                            attack_name,\n                            is_targeted,\n                            defense_name,\n                            image_id,\n                            predicted_label,\n                            true_label,\n                            target_class,\n                        ]\n                    )\n\n\ndef main():\n    \"\"\"Run all attacks against all defenses and compute results.\"\"\"\n    args = parse_args()\n    attacks_output_dir = os.path.join(args.intermediate_results_dir, \"attacks_output\")\n    targeted_attacks_output_dir = os.path.join(\n        args.intermediate_results_dir, \"targeted_attacks_output\"\n    )\n    defenses_output_dir = os.path.join(args.intermediate_results_dir, \"defenses_output\")\n    all_adv_examples_dir = os.path.join(\n        args.intermediate_results_dir, \"all_adv_examples\"\n    )\n\n    # Load dataset metadata.\n    dataset_meta = DatasetMetadata(args.dataset_metadata)\n\n    # Load attacks and defenses.\n    attacks = [\n        a\n        for a in read_submissions_from_directory(args.attacks_dir, args.use_gpu)\n        if isinstance(a, Attack)\n    ]\n    targeted_attacks = [\n        a\n        for a in read_submissions_from_directory(\n            args.targeted_attacks_dir, args.use_gpu\n        )\n        if isinstance(a, Attack)\n    ]\n    defenses = [\n        d\n        for d in read_submissions_from_directory(args.defenses_dir, args.use_gpu)\n        if isinstance(d, Defense)\n    ]\n    print(\"Found attacks: \", [a.name for a in attacks])\n    print(\"Found tageted attacks: \", [a.name for a in targeted_attacks])\n    print(\"Found defenses: \", [d.name for d in defenses])\n\n    # Prepare subdirectories for intermediate results.\n    os.mkdir(attacks_output_dir)\n    os.mkdir(targeted_attacks_output_dir)\n    os.mkdir(defenses_output_dir)\n    os.mkdir(all_adv_examples_dir)\n    for a in attacks:\n        os.mkdir(os.path.join(attacks_output_dir, a.name))\n    for a in targeted_attacks:\n        os.mkdir(os.path.join(targeted_attacks_output_dir, a.name))\n    for d in defenses:\n        os.mkdir(os.path.join(defenses_output_dir, d.name))\n\n    # Run all non-targeted attacks.\n    attacks_output = AttacksOutput(\n        args.dataset_dir,\n        attacks_output_dir,\n        targeted_attacks_output_dir,\n        all_adv_examples_dir,\n        args.epsilon,\n    )\n    for a in attacks:\n        a.run(args.dataset_dir, os.path.join(attacks_output_dir, a.name), args.epsilon)\n        attacks_output.clip_and_copy_attack_outputs(a.name, False)\n\n    # Run all targeted attacks.\n    dataset_meta.save_target_classes(os.path.join(args.dataset_dir, \"target_class.csv\"))\n    for a in targeted_attacks:\n        a.run(\n            args.dataset_dir,\n            os.path.join(targeted_attacks_output_dir, a.name),\n            args.epsilon,\n        )\n        attacks_output.clip_and_copy_attack_outputs(a.name, True)\n\n    # Run all defenses.\n    defenses_output = {}\n    for d in defenses:\n        d.run(all_adv_examples_dir, os.path.join(defenses_output_dir, d.name))\n        defenses_output[d.name] = load_defense_output(\n            os.path.join(defenses_output_dir, d.name, \"result.csv\")\n        )\n\n    # Compute and save scoring.\n    compute_and_save_scores_and_ranking(\n        attacks_output,\n        defenses_output,\n        dataset_meta,\n        args.output_dir,\n        args.save_all_classification,\n    )\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/run_attacks_and_defenses.sh",
    "content": "#!/bin/bash\n\n# exit on first error\nset -e\n\n# directory where this script is located\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\nATTACKS_DIR=\"${SCRIPT_DIR}/sample_attacks\"\nTARGETED_ATTACKS_DIR=\"${SCRIPT_DIR}/sample_targeted_attacks\"\nDEFENSES_DIR=\"${SCRIPT_DIR}/sample_defenses\"\nDATASET_DIR=\"${SCRIPT_DIR}/dataset/images\"\nDATASET_METADATA_FILE=\"${SCRIPT_DIR}/dataset/dev_dataset.csv\"\nMAX_EPSILON=16\n\n# Prepare working directory and copy all necessary files.\n# In particular copy attacks defenses and dataset, so originals won't\n# be overwritten.\nif [[ \"${OSTYPE}\" == \"darwin\"* ]]; then\n    WORKING_DIR=\"/private\"$(mktemp -d)\nelse\n    WORKING_DIR=$(mktemp -d)\nfi\necho \"Preparing working directory: ${WORKING_DIR}\"\nmkdir \"${WORKING_DIR}/attacks\"\nmkdir \"${WORKING_DIR}/targeted_attacks\"\nmkdir \"${WORKING_DIR}/defenses\"\nmkdir \"${WORKING_DIR}/dataset\"\nmkdir \"${WORKING_DIR}/intermediate_results\"\nmkdir \"${WORKING_DIR}/output_dir\"\ncp -R \"${ATTACKS_DIR}\"/* \"${WORKING_DIR}/attacks\"\ncp -R \"${TARGETED_ATTACKS_DIR}\"/* \"${WORKING_DIR}/targeted_attacks\"\ncp -R \"${DEFENSES_DIR}\"/* \"${WORKING_DIR}/defenses\"\ncp -R \"${DATASET_DIR}\"/* \"${WORKING_DIR}/dataset\"\ncp \"${DATASET_METADATA_FILE}\" \"${WORKING_DIR}/dataset.csv\"\n\necho \"Running attacks and defenses\"\npython \"${SCRIPT_DIR}/run_attacks_and_defenses.py\" \\\n  --attacks_dir=\"${WORKING_DIR}/attacks\" \\\n  --targeted_attacks_dir=\"${WORKING_DIR}/targeted_attacks\" \\\n  --defenses_dir=\"${WORKING_DIR}/defenses\" \\\n  --dataset_dir=\"${WORKING_DIR}/dataset\" \\\n  --intermediate_results_dir=\"${WORKING_DIR}/intermediate_results\" \\\n  --dataset_metadata=\"${WORKING_DIR}/dataset.csv\" \\\n  --output_dir=\"${WORKING_DIR}/output_dir\" \\\n  --epsilon=\"${MAX_EPSILON}\" \\\n  --save_all_classification\n\necho \"Output is saved in directory '${WORKING_DIR}/output_dir'\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/download_checkpoints.sh",
    "content": "#!/bin/bash\n#\n# Scripts which download checkpoints for provided models.\n#\n\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\n# Download inception v3 checkpoint for fgsm attack.\ncd \"${SCRIPT_DIR}/fgsm/\"\nwget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz\ntar -xvzf inception_v3_2016_08_28.tar.gz\nrm inception_v3_2016_08_28.tar.gz\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/fgsm/attack_fgsm.py",
    "content": "\"\"\"Implementation of sample attack.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.contrib.slim.nets import inception\nfrom PIL import Image\n\nfrom cleverhans.attacks import FastGradientMethod\n\nslim = tf.contrib.slim\n\n\ntf.flags.DEFINE_string(\"master\", \"\", \"The address of the TensorFlow master to use.\")\n\ntf.flags.DEFINE_string(\n    \"checkpoint_path\", \"\", \"Path to checkpoint for inception network.\"\n)\n\ntf.flags.DEFINE_string(\"input_dir\", \"\", \"Input directory with images.\")\n\ntf.flags.DEFINE_string(\"output_dir\", \"\", \"Output directory with images.\")\n\ntf.flags.DEFINE_float(\"max_epsilon\", 16.0, \"Maximum size of adversarial perturbation.\")\n\ntf.flags.DEFINE_integer(\"image_width\", 299, \"Width of each input images.\")\n\ntf.flags.DEFINE_integer(\"image_height\", 299, \"Height of each input images.\")\n\ntf.flags.DEFINE_integer(\"batch_size\", 16, \"How many images process at one time.\")\n\nFLAGS = tf.flags.FLAGS\n\n\ndef load_images(input_dir, batch_shape):\n    \"\"\"Read png images from input directory in batches.\n\n    Args:\n      input_dir: input directory\n      batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3]\n\n    Yields:\n      filenames: list file names without path of each image\n        Lenght of this list could be less than batch_size, in this case only\n        first few images of the result are elements of the minibatch.\n      images: array with all images from this batch\n    \"\"\"\n    images = np.zeros(batch_shape)\n    filenames = []\n    idx = 0\n    batch_size = batch_shape[0]\n    for filepath in tf.gfile.Glob(os.path.join(input_dir, \"*.png\")):\n        with tf.gfile.Open(filepath) as f:\n            image = np.array(Image.open(f).convert(\"RGB\")).astype(np.float) / 255.0\n        # Images for inception classifier are normalized to be in [-1, 1] interval.\n        images[idx, :, :, :] = image * 2.0 - 1.0\n        filenames.append(os.path.basename(filepath))\n        idx += 1\n        if idx == batch_size:\n            yield filenames, images\n            filenames = []\n            images = np.zeros(batch_shape)\n            idx = 0\n    if idx > 0:\n        yield filenames, images\n\n\ndef save_images(images, filenames, output_dir):\n    \"\"\"Saves images to the output directory.\n\n    Args:\n      images: array with minibatch of images\n      filenames: list of filenames without path\n        If number of file names in this list less than number of images in\n        the minibatch then only first len(filenames) images will be saved.\n      output_dir: directory where to save images\n    \"\"\"\n    for i, filename in enumerate(filenames):\n        # Images for inception classifier are normalized to be in [-1, 1] interval,\n        # so rescale them back to [0, 1].\n        with tf.gfile.Open(os.path.join(output_dir, filename), \"w\") as f:\n            img = (((images[i, :, :, :] + 1.0) * 0.5) * 255.0).astype(np.uint8)\n            Image.fromarray(img).save(f, format=\"PNG\")\n\n\nclass InceptionModel(object):\n    \"\"\"Model class for CleverHans library.\"\"\"\n\n    def __init__(self, nb_classes=None, num_classes=None):\n        if num_classes is not None:\n            if nb_classes is not None:\n                raise ValueError(\n                    \"Should not specify both nb_classes and its deprecated\"\n                    \" alias, num_classes\"\n                )\n            warnings.warn(\n                \"`num_classes` is deprecated. Switch to `nb_classes`.\"\n                \" `num_classes` may be removed on or after 2019-04-23.\"\n            )\n            nb_classes = num_classes\n        del num_classes\n        self.nb_classes = nb_classes\n        self.built = False\n\n    def __call__(self, x_input):\n        \"\"\"Constructs model and return probabilities for given input.\"\"\"\n        reuse = True if self.built else None\n        with slim.arg_scope(inception.inception_v3_arg_scope()):\n            _, end_points = inception.inception_v3(\n                x_input, num_classes=self.nb_classes, is_training=False, reuse=reuse\n            )\n        self.built = True\n        output = end_points[\"Predictions\"]\n        # Strip off the extra reshape op at the output\n        probs = output.op.inputs[0]\n        return probs\n\n\ndef main(_):\n    \"\"\"Run the sample attack\"\"\"\n    # Images for inception classifier are normalized to be in [-1, 1] interval,\n    # eps is a difference between pixels so it should be in [0, 2] interval.\n    # Renormalizing epsilon from [0, 255] to [0, 2].\n    eps = 2.0 * FLAGS.max_epsilon / 255.0\n    batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3]\n    nb_classes = 1001\n\n    tf.logging.set_verbosity(tf.logging.INFO)\n\n    with tf.Graph().as_default():\n        # Prepare graph\n        x_input = tf.placeholder(tf.float32, shape=batch_shape)\n\n        model = InceptionModel(nb_classes)\n\n        fgsm = FastGradientMethod(model)\n        x_adv = fgsm.generate(x_input, eps=eps, clip_min=-1.0, clip_max=1.0)\n\n        # Run computation\n        saver = tf.train.Saver(slim.get_model_variables())\n        session_creator = tf.train.ChiefSessionCreator(\n            scaffold=tf.train.Scaffold(saver=saver),\n            checkpoint_filename_with_path=FLAGS.checkpoint_path,\n            master=FLAGS.master,\n        )\n\n        with tf.train.MonitoredSession(session_creator=session_creator) as sess:\n            for filenames, images in load_images(FLAGS.input_dir, batch_shape):\n                adv_images = sess.run(x_adv, feed_dict={x_input: images})\n                save_images(adv_images, filenames, FLAGS.output_dir)\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/fgsm/metadata.json",
    "content": "{\n  \"type\": \"attack\",\n  \"container\": \"goodfellow/competition:cpu\",\n  \"container_gpu\": \"goodfellow/competition:gpu\",\n  \"entry_point\": \"run_attack.sh\"\n}\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/fgsm/run_attack.sh",
    "content": "#!/bin/bash\n#\n# run_attack.sh is a script which executes the attack\n#\n# Envoronment which runs attacks and defences calls it in a following way:\n#   run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON\n# where:\n#   INPUT_DIR - directory with input PNG images\n#   OUTPUT_DIR - directory where adversarial images should be written\n#   MAX_EPSILON - maximum allowed L_{\\infty} norm of adversarial perturbation\n#\n\nINPUT_DIR=$1\nOUTPUT_DIR=$2\nMAX_EPSILON=$3\n\npython attack_fgsm.py \\\n  --input_dir=\"${INPUT_DIR}\" \\\n  --output_dir=\"${OUTPUT_DIR}\" \\\n  --max_epsilon=\"${MAX_EPSILON}\" \\\n  --checkpoint_path=inception_v3.ckpt\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/noop/attack_noop.py",
    "content": "\"\"\"Implementation of sample attack.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport numpy as np\n\nfrom scipy.misc import imread\nfrom scipy.misc import imsave\n\nimport tensorflow as tf\n\n\ntf.flags.DEFINE_string(\"master\", \"\", \"The address of the TensorFlow master to use.\")\n\ntf.flags.DEFINE_string(\"input_dir\", \"\", \"Input directory with images.\")\n\ntf.flags.DEFINE_string(\"output_dir\", \"\", \"Output directory with images.\")\n\ntf.flags.DEFINE_float(\"max_epsilon\", 16.0, \"Maximum size of adversarial perturbation.\")\n\ntf.flags.DEFINE_integer(\"image_width\", 299, \"Width of each input images.\")\n\ntf.flags.DEFINE_integer(\"image_height\", 299, \"Height of each input images.\")\n\ntf.flags.DEFINE_integer(\"batch_size\", 16, \"How many images process at one time.\")\n\nFLAGS = tf.flags.FLAGS\n\n\ndef load_images(input_dir, batch_shape):\n    \"\"\"Read png images from input directory in batches.\n\n    Args:\n      input_dir: input directory\n      batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3]\n\n    Yields:\n      filenames: list file names without path of each image\n        Length of this list could be less than batch_size, in this case only\n        first few images of the result are elements of the minibatch.\n      images: array with all images from this batch\n    \"\"\"\n    images = np.zeros(batch_shape)\n    filenames = []\n    idx = 0\n    batch_size = batch_shape[0]\n    for filepath in tf.gfile.Glob(os.path.join(input_dir, \"*.png\")):\n        with tf.gfile.Open(filepath) as f:\n            images[idx, :, :, :] = imread(f, mode=\"RGB\").astype(np.float) / 255.0\n        filenames.append(os.path.basename(filepath))\n        idx += 1\n        if idx == batch_size:\n            yield filenames, images\n            filenames = []\n            images = np.zeros(batch_shape)\n            idx = 0\n    if idx > 0:\n        yield filenames, images\n\n\ndef save_images(images, filenames, output_dir):\n    \"\"\"Saves images to the output directory.\n\n    Args:\n      images: array with minibatch of images\n      filenames: list of filenames without path\n        If number of file names in this list less than number of images in\n        the minibatch then only first len(filenames) images will be saved.\n      output_dir: directory where to save images\n    \"\"\"\n    for i, filename in enumerate(filenames):\n        with tf.gfile.Open(os.path.join(output_dir, filename), \"w\") as f:\n            imsave(f, images[i, :, :, :], format=\"png\")\n\n\ndef main(_):\n    \"\"\"Run the sample attack\"\"\"\n    batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3]\n    for filenames, images in load_images(FLAGS.input_dir, batch_shape):\n        save_images(images, filenames, FLAGS.output_dir)\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/noop/metadata.json",
    "content": "{\n  \"type\": \"attack\",\n  \"container\": \"gcr.io/tensorflow/tensorflow:1.1.0\",\n  \"container_gpu\": \"gcr.io/tensorflow/tensorflow:1.1.0-gpu\",\n  \"entry_point\": \"run_attack.sh\"\n}\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/noop/run_attack.sh",
    "content": "#!/bin/bash\n#\n# run_attack.sh is a script which executes the attack\n#\n# Envoronment which runs attacks and defences calls it in a following way:\n#   run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON\n# where:\n#   INPUT_DIR - directory with input PNG images\n#   OUTPUT_DIR - directory where adversarial images should be written\n#   MAX_EPSILON - maximum allowed L_{\\infty} norm of adversarial perturbation\n#\n\nINPUT_DIR=$1\nOUTPUT_DIR=$2\n# Noop attack does not care aboout epsilon\n# MAX_EPSILON=$3\n\npython attack_noop.py \\\n  --input_dir=\"${INPUT_DIR}\" \\\n  --output_dir=\"${OUTPUT_DIR}\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/random_noise/attack_random_noise.py",
    "content": "\"\"\"Implementation of sample attack.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport numpy as np\n\nfrom scipy.misc import imread\nfrom scipy.misc import imsave\n\nimport tensorflow as tf\n\n\ntf.flags.DEFINE_string(\"master\", \"\", \"The address of the TensorFlow master to use.\")\n\ntf.flags.DEFINE_string(\"input_dir\", \"\", \"Input directory with images.\")\n\ntf.flags.DEFINE_string(\"output_dir\", \"\", \"Output directory with images.\")\n\ntf.flags.DEFINE_float(\"max_epsilon\", 16.0, \"Maximum size of adversarial perturbation.\")\n\ntf.flags.DEFINE_integer(\"image_width\", 299, \"Width of each input images.\")\n\ntf.flags.DEFINE_integer(\"image_height\", 299, \"Height of each input images.\")\n\ntf.flags.DEFINE_integer(\"batch_size\", 16, \"How many images process at one time.\")\n\nFLAGS = tf.flags.FLAGS\n\n\ndef load_images(input_dir, batch_shape):\n    \"\"\"Read png images from input directory in batches.\n\n    Args:\n      input_dir: input directory\n      batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3]\n\n    Yields:\n      filenames: list file names without path of each image\n        Lenght of this list could be less than batch_size, in this case only\n        first few images of the result are elements of the minibatch.\n      images: array with all images from this batch\n    \"\"\"\n    images = np.zeros(batch_shape)\n    filenames = []\n    idx = 0\n    batch_size = batch_shape[0]\n    for filepath in tf.gfile.Glob(os.path.join(input_dir, \"*.png\")):\n        with tf.gfile.Open(filepath) as f:\n            images[idx, :, :, :] = imread(f, mode=\"RGB\").astype(np.float) / 255.0\n        filenames.append(os.path.basename(filepath))\n        idx += 1\n        if idx == batch_size:\n            yield filenames, images\n            filenames = []\n            images = np.zeros(batch_shape)\n            idx = 0\n    if idx > 0:\n        yield filenames, images\n\n\ndef save_images(images, filenames, output_dir):\n    \"\"\"Saves images to the output directory.\n\n    Args:\n      images: array with minibatch of images\n      filenames: list of filenames without path\n        If number of file names in this list less than number of images in\n        the minibatch then only first len(filenames) images will be saved.\n      output_dir: directory where to save images\n    \"\"\"\n    for i, filename in enumerate(filenames):\n        with tf.gfile.Open(os.path.join(output_dir, filename), \"w\") as f:\n            imsave(f, images[i, :, :, :], format=\"png\")\n\n\ndef main(_):\n    \"\"\"Run the sample attack\"\"\"\n    eps = FLAGS.max_epsilon / 255.0\n    batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3]\n\n    with tf.Graph().as_default():\n        x_input = tf.placeholder(tf.float32, shape=batch_shape)\n        noisy_images = x_input + eps * tf.sign(tf.random_normal(batch_shape))\n        x_output = tf.clip_by_value(noisy_images, 0.0, 1.0)\n\n        with tf.Session(FLAGS.master) as sess:\n            for filenames, images in load_images(FLAGS.input_dir, batch_shape):\n                out_images = sess.run(x_output, feed_dict={x_input: images})\n                save_images(out_images, filenames, FLAGS.output_dir)\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/random_noise/metadata.json",
    "content": "{\n  \"type\": \"attack\",\n  \"container\": \"gcr.io/tensorflow/tensorflow:1.1.0\",\n  \"container_gpu\": \"gcr.io/tensorflow/tensorflow:1.1.0-gpu\",\n  \"entry_point\": \"run_attack.sh\"\n}\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/random_noise/run_attack.sh",
    "content": "#!/bin/bash\n#\n# run_attack.sh is a script which executes the attack\n#\n# Envoronment which runs attacks and defences calls it in a following way:\n#   run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON\n# where:\n#   INPUT_DIR - directory with input PNG images\n#   OUTPUT_DIR - directory where adversarial images should be written\n#   MAX_EPSILON - maximum allowed L_{\\infty} norm of adversarial perturbation\n#\n\nINPUT_DIR=$1\nOUTPUT_DIR=$2\nMAX_EPSILON=$3\n\npython attack_random_noise.py \\\n  --input_dir=\"${INPUT_DIR}\" \\\n  --output_dir=\"${OUTPUT_DIR}\" \\\n  --max_epsilon=\"${MAX_EPSILON}\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/adv_inception_v3/defense.py",
    "content": "\"\"\"Implementation of sample defense.\n\nThis defense loads inception v3 checkpoint and classifies all images\nusing loaded checkpoint.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\n\nimport numpy as np\nfrom scipy.misc import imread\n\nimport tensorflow as tf\nfrom tensorflow.contrib.slim.nets import inception\n\nslim = tf.contrib.slim\n\n\ntf.flags.DEFINE_string(\"master\", \"\", \"The address of the TensorFlow master to use.\")\n\ntf.flags.DEFINE_string(\n    \"checkpoint_path\", \"\", \"Path to checkpoint for inception network.\"\n)\n\ntf.flags.DEFINE_string(\"input_dir\", \"\", \"Input directory with images.\")\n\ntf.flags.DEFINE_string(\"output_file\", \"\", \"Output file to save labels.\")\n\ntf.flags.DEFINE_integer(\"image_width\", 299, \"Width of each input images.\")\n\ntf.flags.DEFINE_integer(\"image_height\", 299, \"Height of each input images.\")\n\ntf.flags.DEFINE_integer(\"batch_size\", 16, \"How many images process at one time.\")\n\nFLAGS = tf.flags.FLAGS\n\n\ndef load_images(input_dir, batch_shape):\n    \"\"\"Read png images from input directory in batches.\n\n    Args:\n      input_dir: input directory\n      batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3]\n\n    Yields:\n      filenames: list file names without path of each image\n        Lenght of this list could be less than batch_size, in this case only\n        first few images of the result are elements of the minibatch.\n      images: array with all images from this batch\n    \"\"\"\n    images = np.zeros(batch_shape)\n    filenames = []\n    idx = 0\n    batch_size = batch_shape[0]\n    for filepath in tf.gfile.Glob(os.path.join(input_dir, \"*.png\")):\n        with tf.gfile.Open(filepath) as f:\n            image = imread(f, mode=\"RGB\").astype(np.float) / 255.0\n        # Images for inception classifier are normalized to be in [-1, 1] interval.\n        images[idx, :, :, :] = image * 2.0 - 1.0\n        filenames.append(os.path.basename(filepath))\n        idx += 1\n        if idx == batch_size:\n            yield filenames, images\n            filenames = []\n            images = np.zeros(batch_shape)\n            idx = 0\n    if idx > 0:\n        yield filenames, images\n\n\ndef main(_):\n    \"\"\"Run the sample defense\"\"\"\n    batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3]\n    nb_classes = 1001\n\n    tf.logging.set_verbosity(tf.logging.INFO)\n\n    with tf.Graph().as_default():\n        # Prepare graph\n        x_input = tf.placeholder(tf.float32, shape=batch_shape)\n\n        with slim.arg_scope(inception.inception_v3_arg_scope()):\n            _, end_points = inception.inception_v3(\n                x_input, num_classes=nb_classes, is_training=False\n            )\n\n        predicted_labels = tf.argmax(end_points[\"Predictions\"], 1)\n\n        # Run computation\n        saver = tf.train.Saver(slim.get_model_variables())\n        session_creator = tf.train.ChiefSessionCreator(\n            scaffold=tf.train.Scaffold(saver=saver),\n            checkpoint_filename_with_path=FLAGS.checkpoint_path,\n            master=FLAGS.master,\n        )\n\n        with tf.train.MonitoredSession(session_creator=session_creator) as sess:\n            with tf.gfile.Open(FLAGS.output_file, \"w\") as out_file:\n                for filenames, images in load_images(FLAGS.input_dir, batch_shape):\n                    labels = sess.run(predicted_labels, feed_dict={x_input: images})\n                    for filename, label in zip(filenames, labels):\n                        out_file.write(\"{0},{1}\\n\".format(filename, label))\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/adv_inception_v3/metadata.json",
    "content": "{\n  \"type\": \"defense\",\n  \"container\": \"gcr.io/tensorflow/tensorflow:1.1.0\",\n  \"container_gpu\": \"gcr.io/tensorflow/tensorflow:1.1.0-gpu\",\n  \"entry_point\": \"run_defense.sh\"\n}\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/adv_inception_v3/run_defense.sh",
    "content": "#!/bin/bash\n#\n# run_defense.sh is a script which executes the defense\n#\n# Envoronment which runs attacks and defences calls it in a following way:\n#   run_defense.sh INPUT_DIR OUTPUT_FILE\n# where:\n#   INPUT_DIR - directory with input PNG images\n#   OUTPUT_FILE - file to store classification labels\n#\n\nINPUT_DIR=$1\nOUTPUT_FILE=$2\n\npython defense.py \\\n  --input_dir=\"${INPUT_DIR}\" \\\n  --output_file=\"${OUTPUT_FILE}\" \\\n  --checkpoint_path=adv_inception_v3.ckpt\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/base_inception_model/defense.py",
    "content": "\"\"\"Implementation of sample defense.\n\nThis defense loads inception v3 checkpoint and classifies all images\nusing loaded checkpoint.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\n\nimport numpy as np\nfrom scipy.misc import imread\n\nimport tensorflow as tf\nfrom tensorflow.contrib.slim.nets import inception\n\nslim = tf.contrib.slim\n\n\ntf.flags.DEFINE_string(\"master\", \"\", \"The address of the TensorFlow master to use.\")\n\ntf.flags.DEFINE_string(\n    \"checkpoint_path\", \"\", \"Path to checkpoint for inception network.\"\n)\n\ntf.flags.DEFINE_string(\"input_dir\", \"\", \"Input directory with images.\")\n\ntf.flags.DEFINE_string(\"output_file\", \"\", \"Output file to save labels.\")\n\ntf.flags.DEFINE_integer(\"image_width\", 299, \"Width of each input images.\")\n\ntf.flags.DEFINE_integer(\"image_height\", 299, \"Height of each input images.\")\n\ntf.flags.DEFINE_integer(\"batch_size\", 16, \"How many images process at one time.\")\n\nFLAGS = tf.flags.FLAGS\n\n\ndef load_images(input_dir, batch_shape):\n    \"\"\"Read png images from input directory in batches.\n\n    Args:\n      input_dir: input directory\n      batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3]\n\n    Yields:\n      filenames: list file names without path of each image\n        Lenght of this list could be less than batch_size, in this case only\n        first few images of the result are elements of the minibatch.\n      images: array with all images from this batch\n    \"\"\"\n    images = np.zeros(batch_shape)\n    filenames = []\n    idx = 0\n    batch_size = batch_shape[0]\n    for filepath in tf.gfile.Glob(os.path.join(input_dir, \"*.png\")):\n        with tf.gfile.Open(filepath) as f:\n            image = imread(f, mode=\"RGB\").astype(np.float) / 255.0\n        # Images for inception classifier are normalized to be in [-1, 1] interval.\n        images[idx, :, :, :] = image * 2.0 - 1.0\n        filenames.append(os.path.basename(filepath))\n        idx += 1\n        if idx == batch_size:\n            yield filenames, images\n            filenames = []\n            images = np.zeros(batch_shape)\n            idx = 0\n    if idx > 0:\n        yield filenames, images\n\n\ndef main(_):\n    batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3]\n    nb_classes = 1001\n\n    tf.logging.set_verbosity(tf.logging.INFO)\n\n    with tf.Graph().as_default():\n        # Prepare graph\n        x_input = tf.placeholder(tf.float32, shape=batch_shape)\n\n        with slim.arg_scope(inception.inception_v3_arg_scope()):\n            _, end_points = inception.inception_v3(\n                x_input, num_classes=nb_classes, is_training=False\n            )\n\n        predicted_labels = tf.argmax(end_points[\"Predictions\"], 1)\n\n        # Run computation\n        saver = tf.train.Saver(slim.get_model_variables())\n        session_creator = tf.train.ChiefSessionCreator(\n            scaffold=tf.train.Scaffold(saver=saver),\n            checkpoint_filename_with_path=FLAGS.checkpoint_path,\n            master=FLAGS.master,\n        )\n\n        with tf.train.MonitoredSession(session_creator=session_creator) as sess:\n            with tf.gfile.Open(FLAGS.output_file, \"w\") as out_file:\n                for filenames, images in load_images(FLAGS.input_dir, batch_shape):\n                    labels = sess.run(predicted_labels, feed_dict={x_input: images})\n                    for filename, label in zip(filenames, labels):\n                        out_file.write(\"{0},{1}\\n\".format(filename, label))\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/base_inception_model/metadata.json",
    "content": "{\n  \"type\": \"defense\",\n  \"container\": \"gcr.io/tensorflow/tensorflow:1.1.0\",\n  \"container_gpu\": \"gcr.io/tensorflow/tensorflow:1.1.0-gpu\",\n  \"entry_point\": \"run_defense.sh\"\n}\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/base_inception_model/run_defense.sh",
    "content": "#!/bin/bash\n#\n# run_defense.sh is a script which executes the defense\n#\n# Envoronment which runs attacks and defences calls it in a following way:\n#   run_defense.sh INPUT_DIR OUTPUT_FILE\n# where:\n#   INPUT_DIR - directory with input PNG images\n#   OUTPUT_FILE - file to store classification labels\n#\n\nINPUT_DIR=$1\nOUTPUT_FILE=$2\n\npython defense.py \\\n  --input_dir=\"${INPUT_DIR}\" \\\n  --output_file=\"${OUTPUT_FILE}\" \\\n  --checkpoint_path=inception_v3.ckpt\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/download_checkpoints.sh",
    "content": "#!/bin/bash\n#\n# Scripts which download checkpoints for provided models.\n#\n\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\n# Download inception v3 checkpoint into base_inception_model subdirectory\ncd \"${SCRIPT_DIR}/base_inception_model/\"\nwget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz\ntar -xvzf inception_v3_2016_08_28.tar.gz\nrm inception_v3_2016_08_28.tar.gz\n\n# Download adversarially trained inception v3 checkpoint\n# into adv_inception_v3 subdirectory\ncd \"${SCRIPT_DIR}/adv_inception_v3/\"\nwget http://download.tensorflow.org/models/adv_inception_v3_2017_08_18.tar.gz\ntar -xvzf adv_inception_v3_2017_08_18.tar.gz\nrm adv_inception_v3_2017_08_18.tar.gz\n\n# Download ensemble adversarially trained inception resnet v2 checkpoint\n# into ens_adv_inception_resnet_v2 subdirectory\ncd \"${SCRIPT_DIR}/ens_adv_inception_resnet_v2/\"\nwget http://download.tensorflow.org/models/ens_adv_inception_resnet_v2_2017_08_18.tar.gz\ntar -xvzf ens_adv_inception_resnet_v2_2017_08_18.tar.gz\nrm ens_adv_inception_resnet_v2_2017_08_18.tar.gz\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/ens_adv_inception_resnet_v2/defense.py",
    "content": "\"\"\"Implementation of sample defense.\n\nThis defense loads inception resnet v2 checkpoint and classifies all images\nusing loaded checkpoint.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\n\nimport numpy as np\nfrom scipy.misc import imread\n\nimport tensorflow as tf\n\nimport inception_resnet_v2\n\nslim = tf.contrib.slim\n\n\ntf.flags.DEFINE_string(\"master\", \"\", \"The address of the TensorFlow master to use.\")\n\ntf.flags.DEFINE_string(\n    \"checkpoint_path\", \"\", \"Path to checkpoint for inception network.\"\n)\n\ntf.flags.DEFINE_string(\"input_dir\", \"\", \"Input directory with images.\")\n\ntf.flags.DEFINE_string(\"output_file\", \"\", \"Output file to save labels.\")\n\ntf.flags.DEFINE_integer(\"image_width\", 299, \"Width of each input images.\")\n\ntf.flags.DEFINE_integer(\"image_height\", 299, \"Height of each input images.\")\n\ntf.flags.DEFINE_integer(\"batch_size\", 16, \"How many images process at one time.\")\n\nFLAGS = tf.flags.FLAGS\n\n\ndef load_images(input_dir, batch_shape):\n    \"\"\"Read png images from input directory in batches.\n\n    Args:\n      input_dir: input directory\n      batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3]\n\n    Yields:\n      filenames: list file names without path of each image\n        Lenght of this list could be less than batch_size, in this case only\n        first few images of the result are elements of the minibatch.\n      images: array with all images from this batch\n    \"\"\"\n    images = np.zeros(batch_shape)\n    filenames = []\n    idx = 0\n    batch_size = batch_shape[0]\n    for filepath in tf.gfile.Glob(os.path.join(input_dir, \"*.png\")):\n        with tf.gfile.Open(filepath) as f:\n            image = imread(f, mode=\"RGB\").astype(np.float) / 255.0\n        # Images for inception classifier are normalized to be in [-1, 1] interval.\n        images[idx, :, :, :] = image * 2.0 - 1.0\n        filenames.append(os.path.basename(filepath))\n        idx += 1\n        if idx == batch_size:\n            yield filenames, images\n            filenames = []\n            images = np.zeros(batch_shape)\n            idx = 0\n    if idx > 0:\n        yield filenames, images\n\n\ndef main(_):\n    \"\"\"Classify all images using the sample defense.\"\"\"\n    batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3]\n    nb_classes = 1001\n\n    tf.logging.set_verbosity(tf.logging.INFO)\n\n    with tf.Graph().as_default():\n        # Prepare graph\n        x_input = tf.placeholder(tf.float32, shape=batch_shape)\n\n        with slim.arg_scope(inception_resnet_v2.inception_resnet_v2_arg_scope()):\n            _, end_points = inception_resnet_v2.inception_resnet_v2(\n                x_input, num_classes=nb_classes, is_training=False\n            )\n\n        predicted_labels = tf.argmax(end_points[\"Predictions\"], 1)\n\n        # Run computation\n        saver = tf.train.Saver(slim.get_model_variables())\n        session_creator = tf.train.ChiefSessionCreator(\n            scaffold=tf.train.Scaffold(saver=saver),\n            checkpoint_filename_with_path=FLAGS.checkpoint_path,\n            master=FLAGS.master,\n        )\n\n        with tf.train.MonitoredSession(session_creator=session_creator) as sess:\n            with tf.gfile.Open(FLAGS.output_file, \"w\") as out_file:\n                for filenames, images in load_images(FLAGS.input_dir, batch_shape):\n                    labels = sess.run(predicted_labels, feed_dict={x_input: images})\n                    for filename, label in zip(filenames, labels):\n                        out_file.write(\"{0},{1}\\n\".format(filename, label))\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/ens_adv_inception_resnet_v2/inception_resnet_v2.py",
    "content": "# Copyright 2017 The TensorFlow Authors All Rights Reserved.\n#\n# 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#     http://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.\n# ==============================================================================\n\n\"\"\"Contains the definition of the Inception Resnet V2 architecture.\n\nAs described in http://arxiv.org/abs/1602.07261.\n\n  Inception-v4, Inception-ResNet and the Impact of Residual Connections\n    on Learning\n  Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport warnings\n\nimport tensorflow as tf\n\nslim = tf.contrib.slim\n\n\ndef block35(net, scale=1.0, activation_fn=tf.nn.relu, scope=None, reuse=None):\n    \"\"\"Builds the 35x35 resnet block.\"\"\"\n    with tf.variable_scope(scope, \"Block35\", [net], reuse=reuse):\n        with tf.variable_scope(\"Branch_0\"):\n            tower_conv = slim.conv2d(net, 32, 1, scope=\"Conv2d_1x1\")\n        with tf.variable_scope(\"Branch_1\"):\n            tower_conv1_0 = slim.conv2d(net, 32, 1, scope=\"Conv2d_0a_1x1\")\n            tower_conv1_1 = slim.conv2d(tower_conv1_0, 32, 3, scope=\"Conv2d_0b_3x3\")\n        with tf.variable_scope(\"Branch_2\"):\n            tower_conv2_0 = slim.conv2d(net, 32, 1, scope=\"Conv2d_0a_1x1\")\n            tower_conv2_1 = slim.conv2d(tower_conv2_0, 48, 3, scope=\"Conv2d_0b_3x3\")\n            tower_conv2_2 = slim.conv2d(tower_conv2_1, 64, 3, scope=\"Conv2d_0c_3x3\")\n        mixed = tf.concat(axis=3, values=[tower_conv, tower_conv1_1, tower_conv2_2])\n        up = slim.conv2d(\n            mixed,\n            net.get_shape()[3],\n            1,\n            normalizer_fn=None,\n            activation_fn=None,\n            scope=\"Conv2d_1x1\",\n        )\n        net += scale * up\n        if activation_fn:\n            net = activation_fn(net)\n    return net\n\n\ndef block17(net, scale=1.0, activation_fn=tf.nn.relu, scope=None, reuse=None):\n    \"\"\"Builds the 17x17 resnet block.\"\"\"\n    with tf.variable_scope(scope, \"Block17\", [net], reuse=reuse):\n        with tf.variable_scope(\"Branch_0\"):\n            tower_conv = slim.conv2d(net, 192, 1, scope=\"Conv2d_1x1\")\n        with tf.variable_scope(\"Branch_1\"):\n            tower_conv1_0 = slim.conv2d(net, 128, 1, scope=\"Conv2d_0a_1x1\")\n            tower_conv1_1 = slim.conv2d(\n                tower_conv1_0, 160, [1, 7], scope=\"Conv2d_0b_1x7\"\n            )\n            tower_conv1_2 = slim.conv2d(\n                tower_conv1_1, 192, [7, 1], scope=\"Conv2d_0c_7x1\"\n            )\n        mixed = tf.concat(axis=3, values=[tower_conv, tower_conv1_2])\n        up = slim.conv2d(\n            mixed,\n            net.get_shape()[3],\n            1,\n            normalizer_fn=None,\n            activation_fn=None,\n            scope=\"Conv2d_1x1\",\n        )\n        net += scale * up\n        if activation_fn:\n            net = activation_fn(net)\n    return net\n\n\ndef block8(net, scale=1.0, activation_fn=tf.nn.relu, scope=None, reuse=None):\n    \"\"\"Builds the 8x8 resnet block.\"\"\"\n    with tf.variable_scope(scope, \"Block8\", [net], reuse=reuse):\n        with tf.variable_scope(\"Branch_0\"):\n            tower_conv = slim.conv2d(net, 192, 1, scope=\"Conv2d_1x1\")\n        with tf.variable_scope(\"Branch_1\"):\n            tower_conv1_0 = slim.conv2d(net, 192, 1, scope=\"Conv2d_0a_1x1\")\n            tower_conv1_1 = slim.conv2d(\n                tower_conv1_0, 224, [1, 3], scope=\"Conv2d_0b_1x3\"\n            )\n            tower_conv1_2 = slim.conv2d(\n                tower_conv1_1, 256, [3, 1], scope=\"Conv2d_0c_3x1\"\n            )\n        mixed = tf.concat(axis=3, values=[tower_conv, tower_conv1_2])\n        up = slim.conv2d(\n            mixed,\n            net.get_shape()[3],\n            1,\n            normalizer_fn=None,\n            activation_fn=None,\n            scope=\"Conv2d_1x1\",\n        )\n        net += scale * up\n        if activation_fn:\n            net = activation_fn(net)\n    return net\n\n\ndef inception_resnet_v2_base(\n    inputs,\n    final_endpoint=\"Conv2d_7b_1x1\",\n    output_stride=16,\n    align_feature_maps=False,\n    scope=None,\n):\n    \"\"\"Inception model from  http://arxiv.org/abs/1602.07261.\n\n    Constructs an Inception Resnet v2 network from inputs to the given final\n    endpoint. This method can construct the network up to the final inception\n    block Conv2d_7b_1x1.\n\n    Args:\n      inputs: a tensor of size [batch_size, height, width, channels].\n      final_endpoint: specifies the endpoint to construct the network up to. It\n        can be one of ['Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3',\n        'MaxPool_3a_3x3', 'Conv2d_3b_1x1', 'Conv2d_4a_3x3', 'MaxPool_5a_3x3',\n        'Mixed_5b', 'Mixed_6a', 'PreAuxLogits', 'Mixed_7a', 'Conv2d_7b_1x1']\n      output_stride: A scalar that specifies the requested ratio of input to\n        output spatial resolution. Only supports 8 and 16.\n      align_feature_maps: When true, changes all the VALID paddings in the network\n        to SAME padding so that the feature maps are aligned.\n      scope: Optional variable_scope.\n\n    Returns:\n      tensor_out: output tensor corresponding to the final_endpoint.\n      end_points: a set of activations for external use, for example summaries or\n                  losses.\n\n    Raises:\n      ValueError: if final_endpoint is not set to one of the predefined values,\n        or if the output_stride is not 8 or 16, or if the output_stride is 8 and\n        we request an end point after 'PreAuxLogits'.\n    \"\"\"\n    if output_stride != 8 and output_stride != 16:\n        raise ValueError(\"output_stride must be 8 or 16.\")\n\n    padding = \"SAME\" if align_feature_maps else \"VALID\"\n\n    end_points = {}\n\n    def add_and_check_final(name, net):\n        \"\"\"\n        TODO: write this\n        \"\"\"\n        end_points[name] = net\n        return name == final_endpoint\n\n    with tf.variable_scope(scope, \"InceptionResnetV2\", [inputs]):\n        with slim.arg_scope(\n            [slim.conv2d, slim.max_pool2d, slim.avg_pool2d], stride=1, padding=\"SAME\"\n        ):\n            # 149 x 149 x 32\n            net = slim.conv2d(\n                inputs, 32, 3, stride=2, padding=padding, scope=\"Conv2d_1a_3x3\"\n            )\n            if add_and_check_final(\"Conv2d_1a_3x3\", net):\n                return net, end_points\n\n            # 147 x 147 x 32\n            net = slim.conv2d(net, 32, 3, padding=padding, scope=\"Conv2d_2a_3x3\")\n            if add_and_check_final(\"Conv2d_2a_3x3\", net):\n                return net, end_points\n            # 147 x 147 x 64\n            net = slim.conv2d(net, 64, 3, scope=\"Conv2d_2b_3x3\")\n            if add_and_check_final(\"Conv2d_2b_3x3\", net):\n                return net, end_points\n            # 73 x 73 x 64\n            net = slim.max_pool2d(\n                net, 3, stride=2, padding=padding, scope=\"MaxPool_3a_3x3\"\n            )\n            if add_and_check_final(\"MaxPool_3a_3x3\", net):\n                return net, end_points\n            # 73 x 73 x 80\n            net = slim.conv2d(net, 80, 1, padding=padding, scope=\"Conv2d_3b_1x1\")\n            if add_and_check_final(\"Conv2d_3b_1x1\", net):\n                return net, end_points\n            # 71 x 71 x 192\n            net = slim.conv2d(net, 192, 3, padding=padding, scope=\"Conv2d_4a_3x3\")\n            if add_and_check_final(\"Conv2d_4a_3x3\", net):\n                return net, end_points\n            # 35 x 35 x 192\n            net = slim.max_pool2d(\n                net, 3, stride=2, padding=padding, scope=\"MaxPool_5a_3x3\"\n            )\n            if add_and_check_final(\"MaxPool_5a_3x3\", net):\n                return net, end_points\n\n            # 35 x 35 x 320\n            with tf.variable_scope(\"Mixed_5b\"):\n                with tf.variable_scope(\"Branch_0\"):\n                    tower_conv = slim.conv2d(net, 96, 1, scope=\"Conv2d_1x1\")\n                with tf.variable_scope(\"Branch_1\"):\n                    tower_conv1_0 = slim.conv2d(net, 48, 1, scope=\"Conv2d_0a_1x1\")\n                    tower_conv1_1 = slim.conv2d(\n                        tower_conv1_0, 64, 5, scope=\"Conv2d_0b_5x5\"\n                    )\n                with tf.variable_scope(\"Branch_2\"):\n                    tower_conv2_0 = slim.conv2d(net, 64, 1, scope=\"Conv2d_0a_1x1\")\n                    tower_conv2_1 = slim.conv2d(\n                        tower_conv2_0, 96, 3, scope=\"Conv2d_0b_3x3\"\n                    )\n                    tower_conv2_2 = slim.conv2d(\n                        tower_conv2_1, 96, 3, scope=\"Conv2d_0c_3x3\"\n                    )\n                with tf.variable_scope(\"Branch_3\"):\n                    tower_pool = slim.avg_pool2d(\n                        net, 3, stride=1, padding=\"SAME\", scope=\"AvgPool_0a_3x3\"\n                    )\n                    tower_pool_1 = slim.conv2d(tower_pool, 64, 1, scope=\"Conv2d_0b_1x1\")\n                net = tf.concat(\n                    [tower_conv, tower_conv1_1, tower_conv2_2, tower_pool_1], 3\n                )\n\n            if add_and_check_final(\"Mixed_5b\", net):\n                return net, end_points\n            # TODO(alemi): Register intermediate endpoints\n            net = slim.repeat(net, 10, block35, scale=0.17)\n\n            # 17 x 17 x 1088 if output_stride == 8,\n            # 33 x 33 x 1088 if output_stride == 16\n            use_atrous = output_stride == 8\n\n            with tf.variable_scope(\"Mixed_6a\"):\n                with tf.variable_scope(\"Branch_0\"):\n                    tower_conv = slim.conv2d(\n                        net,\n                        384,\n                        3,\n                        stride=1 if use_atrous else 2,\n                        padding=padding,\n                        scope=\"Conv2d_1a_3x3\",\n                    )\n                with tf.variable_scope(\"Branch_1\"):\n                    tower_conv1_0 = slim.conv2d(net, 256, 1, scope=\"Conv2d_0a_1x1\")\n                    tower_conv1_1 = slim.conv2d(\n                        tower_conv1_0, 256, 3, scope=\"Conv2d_0b_3x3\"\n                    )\n                    tower_conv1_2 = slim.conv2d(\n                        tower_conv1_1,\n                        384,\n                        3,\n                        stride=1 if use_atrous else 2,\n                        padding=padding,\n                        scope=\"Conv2d_1a_3x3\",\n                    )\n                with tf.variable_scope(\"Branch_2\"):\n                    tower_pool = slim.max_pool2d(\n                        net,\n                        3,\n                        stride=1 if use_atrous else 2,\n                        padding=padding,\n                        scope=\"MaxPool_1a_3x3\",\n                    )\n                net = tf.concat([tower_conv, tower_conv1_2, tower_pool], 3)\n\n            if add_and_check_final(\"Mixed_6a\", net):\n                return net, end_points\n\n            # TODO(alemi): register intermediate endpoints\n            with slim.arg_scope([slim.conv2d], rate=2 if use_atrous else 1):\n                net = slim.repeat(net, 20, block17, scale=0.10)\n            if add_and_check_final(\"PreAuxLogits\", net):\n                return net, end_points\n\n            if output_stride == 8:\n                # TODO(gpapan): Properly support output_stride for the rest of the net.\n                raise ValueError(\n                    \"output_stride==8 is only supported up to the \"\n                    \"PreAuxlogits end_point for now.\"\n                )\n\n            # 8 x 8 x 2080\n            with tf.variable_scope(\"Mixed_7a\"):\n                with tf.variable_scope(\"Branch_0\"):\n                    tower_conv = slim.conv2d(net, 256, 1, scope=\"Conv2d_0a_1x1\")\n                    tower_conv_1 = slim.conv2d(\n                        tower_conv,\n                        384,\n                        3,\n                        stride=2,\n                        padding=padding,\n                        scope=\"Conv2d_1a_3x3\",\n                    )\n                with tf.variable_scope(\"Branch_1\"):\n                    tower_conv1 = slim.conv2d(net, 256, 1, scope=\"Conv2d_0a_1x1\")\n                    tower_conv1_1 = slim.conv2d(\n                        tower_conv1,\n                        288,\n                        3,\n                        stride=2,\n                        padding=padding,\n                        scope=\"Conv2d_1a_3x3\",\n                    )\n                with tf.variable_scope(\"Branch_2\"):\n                    tower_conv2 = slim.conv2d(net, 256, 1, scope=\"Conv2d_0a_1x1\")\n                    tower_conv2_1 = slim.conv2d(\n                        tower_conv2, 288, 3, scope=\"Conv2d_0b_3x3\"\n                    )\n                    tower_conv2_2 = slim.conv2d(\n                        tower_conv2_1,\n                        320,\n                        3,\n                        stride=2,\n                        padding=padding,\n                        scope=\"Conv2d_1a_3x3\",\n                    )\n                with tf.variable_scope(\"Branch_3\"):\n                    tower_pool = slim.max_pool2d(\n                        net, 3, stride=2, padding=padding, scope=\"MaxPool_1a_3x3\"\n                    )\n                net = tf.concat(\n                    [tower_conv_1, tower_conv1_1, tower_conv2_2, tower_pool], 3\n                )\n\n            if add_and_check_final(\"Mixed_7a\", net):\n                return net, end_points\n\n            # TODO(alemi): register intermediate endpoints\n            net = slim.repeat(net, 9, block8, scale=0.20)\n            net = block8(net, activation_fn=None)\n\n            # 8 x 8 x 1536\n            net = slim.conv2d(net, 1536, 1, scope=\"Conv2d_7b_1x1\")\n            if add_and_check_final(\"Conv2d_7b_1x1\", net):\n                return net, end_points\n\n        raise ValueError(\"final_endpoint (%s) not recognized\" % final_endpoint)\n\n\ndef inception_resnet_v2(\n    inputs,\n    nb_classes=1001,\n    is_training=True,\n    dropout_keep_prob=0.8,\n    reuse=None,\n    scope=\"InceptionResnetV2\",\n    create_aux_logits=True,\n    num_classes=None,\n):\n    \"\"\"Creates the Inception Resnet V2 model.\n\n    Args:\n      inputs: a 4-D tensor of size [batch_size, height, width, 3].\n      nb_classes: number of predicted classes.\n      is_training: whether is training or not.\n      dropout_keep_prob: float, the fraction to keep before final layer.\n      reuse: whether or not the network and its variables should be reused. To be\n        able to reuse 'scope' must be given.\n      scope: Optional variable_scope.\n      create_aux_logits: Whether to include the auxilliary logits.\n      num_classes: depricated alias for nb_classes\n\n    Returns:\n      logits: the logits outputs of the model.\n      end_points: the set of end_points from the inception model.\n    \"\"\"\n    if num_classes is not None:\n        warnings.warn(\n            \"`num_classes` is deprecated. Switch to `nb_classes`.\"\n            \" `num_classes` may be removed on or after 2019-04-23.\"\n        )\n        nb_classes = num_classes\n        del num_classes\n    end_points = {}\n\n    with tf.variable_scope(\n        scope, \"InceptionResnetV2\", [inputs, nb_classes], reuse=reuse\n    ) as var_scope:\n        with slim.arg_scope([slim.batch_norm, slim.dropout], is_training=is_training):\n\n            net, end_points = inception_resnet_v2_base(inputs, scope=var_scope)\n\n            if create_aux_logits:\n                with tf.variable_scope(\"AuxLogits\"):\n                    aux = end_points[\"PreAuxLogits\"]\n                    aux = slim.avg_pool2d(\n                        aux, 5, stride=3, padding=\"VALID\", scope=\"Conv2d_1a_3x3\"\n                    )\n                    aux = slim.conv2d(aux, 128, 1, scope=\"Conv2d_1b_1x1\")\n                    aux = slim.conv2d(\n                        aux,\n                        768,\n                        aux.get_shape()[1:3],\n                        padding=\"VALID\",\n                        scope=\"Conv2d_2a_5x5\",\n                    )\n                    aux = slim.flatten(aux)\n                    aux = slim.fully_connected(\n                        aux, nb_classes, activation_fn=None, scope=\"Logits\"\n                    )\n                    end_points[\"AuxLogits\"] = aux\n\n            with tf.variable_scope(\"Logits\"):\n                net = slim.avg_pool2d(\n                    net, net.get_shape()[1:3], padding=\"VALID\", scope=\"AvgPool_1a_8x8\"\n                )\n                net = slim.flatten(net)\n\n                net = slim.dropout(\n                    net, dropout_keep_prob, is_training=is_training, scope=\"Dropout\"\n                )\n\n                end_points[\"PreLogitsFlatten\"] = net\n                logits = slim.fully_connected(\n                    net, nb_classes, activation_fn=None, scope=\"Logits\"\n                )\n                end_points[\"Logits\"] = logits\n                end_points[\"Predictions\"] = tf.nn.softmax(logits, name=\"Predictions\")\n\n        return logits, end_points\n\n\ninception_resnet_v2.default_image_size = 299\n\n\ndef inception_resnet_v2_arg_scope(\n    weight_decay=0.00004, batch_norm_decay=0.9997, batch_norm_epsilon=0.001\n):\n    \"\"\"Returns the scope with the default parameters for inception_resnet_v2.\n\n    Args:\n      weight_decay: the weight decay for weights variables.\n      batch_norm_decay: decay for the moving average of batch_norm momentums.\n      batch_norm_epsilon: small float added to variance to avoid dividing by zero.\n\n    Returns:\n      a arg_scope with the parameters needed for inception_resnet_v2.\n    \"\"\"\n    # Set weight_decay for weights in conv2d and fully_connected layers.\n    with slim.arg_scope(\n        [slim.conv2d, slim.fully_connected],\n        weights_regularizer=slim.l2_regularizer(weight_decay),\n        biases_regularizer=slim.l2_regularizer(weight_decay),\n    ):\n\n        batch_norm_params = {\n            \"decay\": batch_norm_decay,\n            \"epsilon\": batch_norm_epsilon,\n        }\n        # Set activation_fn and parameters for batch_norm.\n        with slim.arg_scope(\n            [slim.conv2d],\n            activation_fn=tf.nn.relu,\n            normalizer_fn=slim.batch_norm,\n            normalizer_params=batch_norm_params,\n        ) as scope:\n            return scope\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/ens_adv_inception_resnet_v2/metadata.json",
    "content": "{\n  \"type\": \"defense\",\n  \"container\": \"gcr.io/tensorflow/tensorflow:1.1.0\",\n  \"container_gpu\": \"gcr.io/tensorflow/tensorflow:1.1.0-gpu\",\n  \"entry_point\": \"run_defense.sh\"\n}\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_defenses/ens_adv_inception_resnet_v2/run_defense.sh",
    "content": "#!/bin/bash\n#\n# run_defense.sh is a script which executes the defense\n#\n# Envoronment which runs attacks and defences calls it in a following way:\n#   run_defense.sh INPUT_DIR OUTPUT_FILE\n# where:\n#   INPUT_DIR - directory with input PNG images\n#   OUTPUT_FILE - file to store classification labels\n#\n\nINPUT_DIR=$1\nOUTPUT_FILE=$2\n\npython defense.py \\\n  --input_dir=\"${INPUT_DIR}\" \\\n  --output_file=\"${OUTPUT_FILE}\" \\\n  --checkpoint_path=ens_adv_inception_resnet_v2.ckpt\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/download_checkpoints.sh",
    "content": "#!/bin/bash\n#\n# Scripts which download checkpoints for provided models.\n#\n\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\n# Download inception v3 checkpoint for step_target_class attack.\ncd \"${SCRIPT_DIR}/step_target_class/\"\nwget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz\ntar -xvzf inception_v3_2016_08_28.tar.gz\n\n# Another copy of inception v3 checkpoint for iter_target_class attack\nmv inception_v3_2016_08_28.tar.gz \"${SCRIPT_DIR}/iter_target_class/\"\ncd \"${SCRIPT_DIR}/iter_target_class/\"\ntar -xvzf inception_v3_2016_08_28.tar.gz\nrm inception_v3_2016_08_28.tar.gz\n\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/iter_target_class/attack_iter_target_class.py",
    "content": "\"\"\"Implementation of sample attack.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport csv\nimport os\n\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.contrib.slim.nets import inception\nfrom scipy.misc import imread\nfrom scipy.misc import imsave\n\n\nslim = tf.contrib.slim\n\n\ntf.flags.DEFINE_string(\"master\", \"\", \"The address of the TensorFlow master to use.\")\n\ntf.flags.DEFINE_string(\n    \"checkpoint_path\", \"\", \"Path to checkpoint for inception network.\"\n)\n\ntf.flags.DEFINE_string(\"input_dir\", \"\", \"Input directory with images.\")\n\ntf.flags.DEFINE_string(\"output_dir\", \"\", \"Output directory with images.\")\n\ntf.flags.DEFINE_float(\"max_epsilon\", 16.0, \"Maximum size of adversarial perturbation.\")\n\ntf.flags.DEFINE_float(\"iter_alpha\", 1.0, \"Step size for one iteration.\")\n\ntf.flags.DEFINE_integer(\"num_iter\", 20, \"Number of iterations.\")\n\ntf.flags.DEFINE_integer(\"image_width\", 299, \"Width of each input images.\")\n\ntf.flags.DEFINE_integer(\"image_height\", 299, \"Height of each input images.\")\n\ntf.flags.DEFINE_integer(\"batch_size\", 16, \"How many images process at one time.\")\n\nFLAGS = tf.flags.FLAGS\n\n\ndef load_target_class(input_dir):\n    \"\"\"Loads target classes.\"\"\"\n    with tf.gfile.Open(os.path.join(input_dir, \"target_class.csv\")) as f:\n        return {row[0]: int(row[1]) for row in csv.reader(f) if len(row) >= 2}\n\n\ndef load_images(input_dir, batch_shape):\n    \"\"\"Read png images from input directory in batches.\n\n    Args:\n      input_dir: input directory\n      batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3]\n\n    Yields:\n      filenames: list file names without path of each image\n        Lenght of this list could be less than batch_size, in this case only\n        first few images of the result are elements of the minibatch.\n      images: array with all images from this batch\n    \"\"\"\n    images = np.zeros(batch_shape)\n    filenames = []\n    idx = 0\n    batch_size = batch_shape[0]\n    for filepath in tf.gfile.Glob(os.path.join(input_dir, \"*.png\")):\n        with tf.gfile.Open(filepath) as f:\n            image = imread(f, mode=\"RGB\").astype(np.float) / 255.0\n        # Images for inception classifier are normalized to be in [-1, 1] interval.\n        images[idx, :, :, :] = image * 2.0 - 1.0\n        filenames.append(os.path.basename(filepath))\n        idx += 1\n        if idx == batch_size:\n            yield filenames, images\n            filenames = []\n            images = np.zeros(batch_shape)\n            idx = 0\n    if idx > 0:\n        yield filenames, images\n\n\ndef save_images(images, filenames, output_dir):\n    \"\"\"Saves images to the output directory.\n\n    Args:\n      images: array with minibatch of images\n      filenames: list of filenames without path\n        If number of file names in this list less than number of images in\n        the minibatch then only first len(filenames) images will be saved.\n      output_dir: directory where to save images\n    \"\"\"\n    for i, filename in enumerate(filenames):\n        # Images for inception classifier are normalized to be in [-1, 1] interval,\n        # so rescale them back to [0, 1].\n        with tf.gfile.Open(os.path.join(output_dir, filename), \"w\") as f:\n            imsave(f, (images[i, :, :, :] + 1.0) * 0.5, format=\"png\")\n\n\ndef main(_):\n    \"\"\"Run the sample attack\"\"\"\n    # Images for inception classifier are normalized to be in [-1, 1] interval,\n    # eps is a difference between pixels so it should be in [0, 2] interval.\n    # Renormalizing epsilon from [0, 255] to [0, 2].\n    eps = 2.0 * FLAGS.max_epsilon / 255.0\n    alpha = 2.0 * FLAGS.iter_alpha / 255.0\n    num_iter = FLAGS.num_iter\n    batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3]\n    nb_classes = 1001\n\n    tf.logging.set_verbosity(tf.logging.INFO)\n\n    all_images_taget_class = load_target_class(FLAGS.input_dir)\n\n    with tf.Graph().as_default():\n        # Prepare graph\n        x_input = tf.placeholder(tf.float32, shape=batch_shape)\n        x_max = tf.clip_by_value(x_input + eps, -1.0, 1.0)\n        x_min = tf.clip_by_value(x_input - eps, -1.0, 1.0)\n\n        with slim.arg_scope(inception.inception_v3_arg_scope()):\n            inception.inception_v3(x_input, num_classes=nb_classes, is_training=False)\n\n        x_adv = x_input\n        target_class_input = tf.placeholder(tf.int32, shape=[FLAGS.batch_size])\n        one_hot_target_class = tf.one_hot(target_class_input, nb_classes)\n\n        for _ in range(num_iter):\n            with slim.arg_scope(inception.inception_v3_arg_scope()):\n                logits, end_points = inception.inception_v3(\n                    x_adv, num_classes=nb_classes, is_training=False, reuse=True\n                )\n            cross_entropy = tf.losses.softmax_cross_entropy(\n                one_hot_target_class, logits, label_smoothing=0.1, weights=1.0\n            )\n            cross_entropy += tf.losses.softmax_cross_entropy(\n                one_hot_target_class,\n                end_points[\"AuxLogits\"],\n                label_smoothing=0.1,\n                weights=0.4,\n            )\n            x_next = x_adv - alpha * tf.sign(tf.gradients(cross_entropy, x_adv)[0])\n            x_next = tf.clip_by_value(x_next, x_min, x_max)\n            x_adv = x_next\n\n        # Run computation\n        saver = tf.train.Saver(slim.get_model_variables())\n        session_creator = tf.train.ChiefSessionCreator(\n            scaffold=tf.train.Scaffold(saver=saver),\n            checkpoint_filename_with_path=FLAGS.checkpoint_path,\n            master=FLAGS.master,\n        )\n\n        with tf.train.MonitoredSession(session_creator=session_creator) as sess:\n            for filenames, images in load_images(FLAGS.input_dir, batch_shape):\n                target_class_for_batch = [\n                    all_images_taget_class[n] for n in filenames\n                ] + [0] * (FLAGS.batch_size - len(filenames))\n                adv_images = sess.run(\n                    x_adv,\n                    feed_dict={\n                        x_input: images,\n                        target_class_input: target_class_for_batch,\n                    },\n                )\n                save_images(adv_images, filenames, FLAGS.output_dir)\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/iter_target_class/metadata.json",
    "content": "{\n  \"type\": \"targeted_attack\",\n  \"container\": \"gcr.io/tensorflow/tensorflow:1.1.0\",\n  \"container_gpu\": \"gcr.io/tensorflow/tensorflow:1.1.0-gpu\",\n  \"entry_point\": \"run_attack.sh\"\n}\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/iter_target_class/run_attack.sh",
    "content": "#!/bin/bash\n#\n# run_attack.sh is a script which executes the attack\n#\n# Envoronment which runs attacks and defences calls it in a following way:\n#   run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON\n# where:\n#   INPUT_DIR - directory with input PNG images\n#   OUTPUT_DIR - directory where adversarial images should be written\n#   MAX_EPSILON - maximum allowed L_{\\infty} norm of adversarial perturbation\n#\n\nINPUT_DIR=$1\nOUTPUT_DIR=$2\nMAX_EPSILON=$3\n\n# For how many iterations run this attack\nNUM_ITERATIONS=20\n\npython attack_iter_target_class.py \\\n  --input_dir=\"${INPUT_DIR}\" \\\n  --output_dir=\"${OUTPUT_DIR}\" \\\n  --max_epsilon=\"${MAX_EPSILON}\" \\\n  --num_iter=\"${NUM_ITERATIONS}\" \\\n  --checkpoint_path=inception_v3.ckpt\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/step_target_class/attack_step_target_class.py",
    "content": "\"\"\"Implementation of sample attack.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport csv\nimport os\n\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.contrib.slim.nets import inception\nfrom scipy.misc import imread\nfrom scipy.misc import imsave\n\n\nslim = tf.contrib.slim\n\n\ntf.flags.DEFINE_string(\"master\", \"\", \"The address of the TensorFlow master to use.\")\n\ntf.flags.DEFINE_string(\n    \"checkpoint_path\", \"\", \"Path to checkpoint for inception network.\"\n)\n\ntf.flags.DEFINE_string(\"input_dir\", \"\", \"Input directory with images.\")\n\ntf.flags.DEFINE_string(\"output_dir\", \"\", \"Output directory with images.\")\n\ntf.flags.DEFINE_float(\"max_epsilon\", 16.0, \"Maximum size of adversarial perturbation.\")\n\ntf.flags.DEFINE_integer(\"image_width\", 299, \"Width of each input images.\")\n\ntf.flags.DEFINE_integer(\"image_height\", 299, \"Height of each input images.\")\n\ntf.flags.DEFINE_integer(\"batch_size\", 16, \"How many images process at one time.\")\n\nFLAGS = tf.flags.FLAGS\n\n\ndef load_target_class(input_dir):\n    \"\"\"Loads target classes.\"\"\"\n    with tf.gfile.Open(os.path.join(input_dir, \"target_class.csv\")) as f:\n        return {row[0]: int(row[1]) for row in csv.reader(f) if len(row) >= 2}\n\n\ndef load_images(input_dir, batch_shape):\n    \"\"\"Read png images from input directory in batches.\n\n    Args:\n      input_dir: input directory\n      batch_shape: shape of minibatch array, i.e. [batch_size, height, width, 3]\n\n    Yields:\n      filenames: list file names without path of each image\n        Lenght of this list could be less than batch_size, in this case only\n        first few images of the result are elements of the minibatch.\n      images: array with all images from this batch\n    \"\"\"\n    images = np.zeros(batch_shape)\n    filenames = []\n    idx = 0\n    batch_size = batch_shape[0]\n    for filepath in tf.gfile.Glob(os.path.join(input_dir, \"*.png\")):\n        with tf.gfile.Open(filepath) as f:\n            image = imread(f, mode=\"RGB\").astype(np.float) / 255.0\n        # Images for inception classifier are normalized to be in [-1, 1] interval.\n        images[idx, :, :, :] = image * 2.0 - 1.0\n        filenames.append(os.path.basename(filepath))\n        idx += 1\n        if idx == batch_size:\n            yield filenames, images\n            filenames = []\n            images = np.zeros(batch_shape)\n            idx = 0\n    if idx > 0:\n        yield filenames, images\n\n\ndef save_images(images, filenames, output_dir):\n    \"\"\"Saves images to the output directory.\n\n    Args:\n      images: array with minibatch of images\n      filenames: list of filenames without path\n        If number of file names in this list less than number of images in\n        the minibatch then only first len(filenames) images will be saved.\n      output_dir: directory where to save images\n    \"\"\"\n    for i, filename in enumerate(filenames):\n        # Images for inception classifier are normalized to be in [-1, 1] interval,\n        # so rescale them back to [0, 1].\n        with tf.gfile.Open(os.path.join(output_dir, filename), \"w\") as f:\n            imsave(f, (images[i, :, :, :] + 1.0) * 0.5, format=\"png\")\n\n\ndef main(_):\n    # Images for inception classifier are normalized to be in [-1, 1] interval,\n    # eps is a difference between pixels so it should be in [0, 2] interval.\n    # Renormalizing epsilon from [0, 255] to [0, 2].\n    eps = 2.0 * FLAGS.max_epsilon / 255.0\n    batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3]\n    nb_classes = 1001\n\n    tf.logging.set_verbosity(tf.logging.INFO)\n\n    all_images_taget_class = load_target_class(FLAGS.input_dir)\n\n    with tf.Graph().as_default():\n        # Prepare graph\n        x_input = tf.placeholder(tf.float32, shape=batch_shape)\n\n        with slim.arg_scope(inception.inception_v3_arg_scope()):\n            logits, end_points = inception.inception_v3(\n                x_input, num_classes=nb_classes, is_training=False\n            )\n\n        target_class_input = tf.placeholder(tf.int32, shape=[FLAGS.batch_size])\n        one_hot_target_class = tf.one_hot(target_class_input, nb_classes)\n        cross_entropy = tf.losses.softmax_cross_entropy(\n            one_hot_target_class, logits, label_smoothing=0.1, weights=1.0\n        )\n        cross_entropy += tf.losses.softmax_cross_entropy(\n            one_hot_target_class,\n            end_points[\"AuxLogits\"],\n            label_smoothing=0.1,\n            weights=0.4,\n        )\n        x_adv = x_input - eps * tf.sign(tf.gradients(cross_entropy, x_input)[0])\n        x_adv = tf.clip_by_value(x_adv, -1.0, 1.0)\n\n        # Run computation\n        saver = tf.train.Saver(slim.get_model_variables())\n        session_creator = tf.train.ChiefSessionCreator(\n            scaffold=tf.train.Scaffold(saver=saver),\n            checkpoint_filename_with_path=FLAGS.checkpoint_path,\n            master=FLAGS.master,\n        )\n\n        with tf.train.MonitoredSession(session_creator=session_creator) as sess:\n            for filenames, images in load_images(FLAGS.input_dir, batch_shape):\n                target_class_for_batch = [\n                    all_images_taget_class[n] for n in filenames\n                ] + [0] * (FLAGS.batch_size - len(filenames))\n                adv_images = sess.run(\n                    x_adv,\n                    feed_dict={\n                        x_input: images,\n                        target_class_input: target_class_for_batch,\n                    },\n                )\n                save_images(adv_images, filenames, FLAGS.output_dir)\n\n\nif __name__ == \"__main__\":\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/step_target_class/metadata.json",
    "content": "{\n  \"type\": \"targeted_attack\",\n  \"container\": \"gcr.io/tensorflow/tensorflow:1.1.0\",\n  \"container_gpu\": \"gcr.io/tensorflow/tensorflow:1.1.0-gpu\",\n  \"entry_point\": \"run_attack.sh\"\n}\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/sample_targeted_attacks/step_target_class/run_attack.sh",
    "content": "#!/bin/bash\n#\n# run_attack.sh is a script which executes the attack\n#\n# Envoronment which runs attacks and defences calls it in a following way:\n#   run_attack.sh INPUT_DIR OUTPUT_DIR MAX_EPSILON\n# where:\n#   INPUT_DIR - directory with input PNG images\n#   OUTPUT_DIR - directory where adversarial images should be written\n#   MAX_EPSILON - maximum allowed L_{\\infty} norm of adversarial perturbation\n#\n\nINPUT_DIR=$1\nOUTPUT_DIR=$2\nMAX_EPSILON=$3\n\npython attack_step_target_class.py \\\n  --input_dir=\"${INPUT_DIR}\" \\\n  --output_dir=\"${OUTPUT_DIR}\" \\\n  --max_epsilon=\"${MAX_EPSILON}\" \\\n  --checkpoint_path=inception_v3.ckpt\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/validation_tool/README.md",
    "content": "\n# Submission validation tool\n\nThis tool verifies that a submission file is valid or reports an error.\nIt extracts the submission, verifies presence and validity of metadata and runs\nthe submission on sample data.\n\nUsage is following:\n\n```bash\n# FILENAME - filename of the submission\n# TYPE - type of the submission, one of the following without quotes:\n#   \"attack\", \"targeted_attack\" or \"defense\"\n# You can omit --usegpu argument, then submission will be run on CPU\npython validate_submission.py \\\n  --submission_filename=FILENAME \\\n  --submission_type=TYPE \\\n  --usegpu\n```\n\nAfter run this tool will print whether submission is valid or not.\nIf submission is invalid then log messages will contain explanation why.\n\nNOTE: This tool might not work properly if the file is located on NFS or if\nthe directory containing submission file can't be mounted in Docker using `-v`\ncommand line argument. In such case copy file to different location and try\nagain.\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/validation_tool/submission_validator_lib.py",
    "content": "\"\"\"Helper library which performs validation of the submission.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom builtins import int  # long in python 2\n\nimport csv\nimport json\nimport logging\nimport os\nimport re\nimport subprocess\n\nimport numpy as np\nfrom six import iteritems\nfrom PIL import Image\n\n\nEXTRACT_COMMAND = {\n    \".zip\": [\"unzip\", \"${src}\", \"-d\", \"${dst}\"],\n    \".tar\": [\"tar\", \"xvf\", \"${src}\", \"-C\", \"${dst}\"],\n    \".tar.gz\": [\"tar\", \"xvzf\", \"${src}\", \"-C\", \"${dst}\"],\n}\n\nALLOWED_SUBMISSION_TYPES = [\"attack\", \"targeted_attack\", \"defense\"]\n\nREQUIRED_METADATA_JSON_FIELDS = [\"entry_point\", \"container\", \"container_gpu\", \"type\"]\n\nCMD_VARIABLE_RE = re.compile(\"^\\\\$\\\\{(\\\\w+)\\\\}$\")\n\nBATCH_SIZE = 100\nIMAGE_NAME_PATTERN = \"IMG{0:04}.png\"\n\nALLOWED_EPS = [4, 8, 12, 16]\n\nMAX_SUBMISSION_SIZE_ZIPPED = 8 * 1024 * 1024 * 1024  # 8 GiB\nMAX_SUBMISSION_SIZE_UNPACKED = 16 * 1024 * 1024 * 1024  # 16 GiB\nMAX_DOCKER_IMAGE_SIZE = 8 * 1024 * 1024 * 1024  # 8 GiB\n\n\ndef get_extract_command_template(filename):\n    \"\"\"Returns extraction command based on the filename extension.\"\"\"\n    for k, v in iteritems(EXTRACT_COMMAND):\n        if filename.endswith(k):\n            return v\n    return None\n\n\ndef shell_call(command, **kwargs):\n    \"\"\"Calls shell command with parameter substitution.\n\n    Args:\n      command: command to run as a list of tokens\n      **kwargs: dirctionary with substitutions\n\n    Returns:\n      whether command was successful, i.e. returned 0 status code\n\n    Example of usage:\n      shell_call(['cp', '${A}', '${B}'], A='src_file', B='dst_file')\n    will call shell command:\n      cp src_file dst_file\n    \"\"\"\n    command = list(command)\n    for i in range(len(command)):\n        m = CMD_VARIABLE_RE.match(command[i])\n        if m:\n            var_id = m.group(1)\n            if var_id in kwargs:\n                command[i] = kwargs[var_id]\n    return subprocess.call(command) == 0\n\n\ndef make_directory_writable(dirname):\n    \"\"\"Makes directory readable and writable by everybody.\n\n    Args:\n      dirname: name of the directory\n\n    Returns:\n      True if operation was successfull\n\n    If you run something inside Docker container and it writes files, then\n    these files will be written as root user with restricted permissions.\n    So to be able to read/modify these files outside of Docker you have to change\n    permissions to be world readable and writable.\n    \"\"\"\n    retval = shell_call(\n        [\n            \"docker\",\n            \"run\",\n            \"-v\",\n            \"{0}:/output_dir\".format(dirname),\n            \"busybox:1.27.2\",\n            \"chmod\",\n            \"-R\",\n            \"a+rwx\",\n            \"/output_dir\",\n        ]\n    )\n    if not retval:\n        logging.error(\"Failed to change permissions on directory: %s\", dirname)\n    return retval\n\n\ndef load_defense_output(filename):\n    \"\"\"Loads output of defense from given file.\"\"\"\n    result = {}\n    with open(filename) as f:\n        for row in csv.reader(f):\n            try:\n                image_filename = row[0]\n                if not image_filename.endswith(\".png\"):\n                    image_filename += \".png\"\n                label = int(row[1])\n            except (IndexError, ValueError):\n                continue\n            result[image_filename] = label\n    return result\n\n\nclass SubmissionValidator(object):\n    \"\"\"Class which performs validation of the submission.\"\"\"\n\n    def __init__(self, temp_dir, use_gpu):\n        \"\"\"Initializes instance of SubmissionValidator.\n\n        Args:\n          temp_dir: temporary working directory\n          use_gpu: whether to use GPU\n        \"\"\"\n        self._temp_dir = temp_dir\n        self._use_gpu = use_gpu\n        self._tmp_extracted_dir = os.path.join(self._temp_dir, \"tmp_extracted\")\n        self._extracted_submission_dir = os.path.join(self._temp_dir, \"extracted\")\n        self._sample_input_dir = os.path.join(self._temp_dir, \"input\")\n        self._sample_output_dir = os.path.join(self._temp_dir, \"output\")\n\n    def _prepare_temp_dir(self):\n        \"\"\"Cleans up and prepare temporary directory.\"\"\"\n        shell_call([\"rm\", \"-rf\", os.path.join(self._temp_dir, \"*\")])\n        # NOTE: we do not create self._extracted_submission_dir\n        # this is intentional because self._tmp_extracted_dir or it's subdir\n        # will be renames into self._extracted_submission_dir\n        os.mkdir(self._tmp_extracted_dir)\n        os.mkdir(self._sample_input_dir)\n        os.mkdir(self._sample_output_dir)\n        # make output dir world writable\n        shell_call([\"chmod\", \"a+rwX\", \"-R\", self._sample_output_dir])\n\n    def _extract_submission(self, filename):\n        \"\"\"Extracts submission and moves it into self._extracted_submission_dir.\"\"\"\n        # verify filesize\n        file_size = os.path.getsize(filename)\n        if file_size > MAX_SUBMISSION_SIZE_ZIPPED:\n            logging.error(\n                \"Submission archive size %d is exceeding limit %d\",\n                file_size,\n                MAX_SUBMISSION_SIZE_ZIPPED,\n            )\n            return False\n        # determime archive type\n        exctract_command_tmpl = get_extract_command_template(filename)\n        if not exctract_command_tmpl:\n            logging.error(\n                \"Input file has to be zip, tar or tar.gz archive; however \" \"found: %s\",\n                filename,\n            )\n            return False\n        # extract archive\n        submission_dir = os.path.dirname(filename)\n        submission_basename = os.path.basename(filename)\n        logging.info(\"Extracting archive %s\", filename)\n        retval = shell_call(\n            [\n                \"docker\",\n                \"run\",\n                \"--network=none\",\n                \"-v\",\n                \"{0}:/input_dir\".format(submission_dir),\n                \"-v\",\n                \"{0}:/output_dir\".format(self._tmp_extracted_dir),\n                \"busybox:1.27.2\",\n            ]\n            + exctract_command_tmpl,\n            src=os.path.join(\"/input_dir\", submission_basename),\n            dst=\"/output_dir\",\n        )\n        if not retval:\n            logging.error(\"Failed to extract submission from file %s\", filename)\n            return False\n        if not make_directory_writable(self._tmp_extracted_dir):\n            return False\n        # find submission root\n        root_dir = self._tmp_extracted_dir\n        root_dir_content = [d for d in os.listdir(root_dir) if d != \"__MACOSX\"]\n        if len(root_dir_content) == 1 and os.path.isdir(\n            os.path.join(root_dir, root_dir_content[0])\n        ):\n            logging.info(\n                'Looks like submission root is in subdirectory \"%s\" of ' \"the archive\",\n                root_dir_content[0],\n            )\n            root_dir = os.path.join(root_dir, root_dir_content[0])\n        # Move files to self._extracted_submission_dir.\n        # At this point self._extracted_submission_dir does not exist,\n        # so following command will simply rename root_dir into\n        # self._extracted_submission_dir\n        if not shell_call([\"mv\", root_dir, self._extracted_submission_dir]):\n            logging.error(\"Can\" \"t move submission files from root directory\")\n            return False\n        return True\n\n    def _verify_submission_size(self):\n        submission_size = 0\n        for dirname, _, filenames in os.walk(self._extracted_submission_dir):\n            for f in filenames:\n                submission_size += os.path.getsize(os.path.join(dirname, f))\n        logging.info(\"Unpacked submission size: %d\", submission_size)\n        if submission_size > MAX_SUBMISSION_SIZE_UNPACKED:\n            logging.error(\n                \"Submission size exceeding limit %d\", MAX_SUBMISSION_SIZE_UNPACKED\n            )\n        return submission_size <= MAX_SUBMISSION_SIZE_UNPACKED\n\n    def _load_and_verify_metadata(self, submission_type):\n        \"\"\"Loads and verifies metadata.\n\n        Args:\n          submission_type: type of the submission\n\n        Returns:\n          dictionaty with metadata or None if metadata not found or invalid\n        \"\"\"\n        metadata_filename = os.path.join(\n            self._extracted_submission_dir, \"metadata.json\"\n        )\n        if not os.path.isfile(metadata_filename):\n            logging.error(\"metadata.json not found\")\n            return None\n        try:\n            with open(metadata_filename, \"r\") as f:\n                metadata = json.load(f)\n        except IOError as e:\n            logging.error(\"Failed to load metadata: %s\", e)\n            return None\n        for field_name in REQUIRED_METADATA_JSON_FIELDS:\n            if field_name not in metadata:\n                logging.error(\"Field %s not found in metadata\", field_name)\n                return None\n        # Verify submission type\n        if submission_type != metadata[\"type\"]:\n            logging.error(\n                'Invalid submission type in metadata, expected \"%s\", ' 'actual \"%s\"',\n                submission_type,\n                metadata[\"type\"],\n            )\n            return None\n        # Check submission entry point\n        entry_point = metadata[\"entry_point\"]\n        if not os.path.isfile(\n            os.path.join(self._extracted_submission_dir, entry_point)\n        ):\n            logging.error(\"Entry point not found: %s\", entry_point)\n            return None\n        if not entry_point.endswith(\".sh\"):\n            logging.warning(\n                \"Entry point is not an .sh script. \"\n                \"This is not necessarily a problem, but if submission \"\n                \"won\"\n                \"t run double check entry point first: %s\",\n                entry_point,\n            )\n        # Metadata verified\n        return metadata\n\n    def _verify_docker_image_size(self, image_name):\n        \"\"\"Verifies size of Docker image.\n\n        Args:\n          image_name: name of the Docker image.\n\n        Returns:\n          True if image size is withing the limits, False otherwise.\n        \"\"\"\n        shell_call([\"docker\", \"pull\", image_name])\n        try:\n            image_size = subprocess.check_output(\n                [\"docker\", \"inspect\", \"--format={{.Size}}\", image_name]\n            ).strip()\n            image_size = int(image_size)\n        except (ValueError, subprocess.CalledProcessError) as e:\n            logging.error(\"Failed to determine docker image size: %s\", e)\n            return False\n        logging.info(\"Size of docker image %s is %d\", image_name, image_size)\n        if image_size > MAX_DOCKER_IMAGE_SIZE:\n            logging.error(\"Image size exceeds limit %d\", MAX_DOCKER_IMAGE_SIZE)\n        return image_size <= MAX_DOCKER_IMAGE_SIZE\n\n    def _prepare_sample_data(self, submission_type):\n        \"\"\"Prepares sample data for the submission.\n\n        Args:\n          submission_type: type of the submission.\n        \"\"\"\n        # write images\n        images = np.random.randint(\n            0, 256, size=[BATCH_SIZE, 299, 299, 3], dtype=np.uint8\n        )\n        for i in range(BATCH_SIZE):\n            Image.fromarray(images[i, :, :, :]).save(\n                os.path.join(self._sample_input_dir, IMAGE_NAME_PATTERN.format(i))\n            )\n        # write target class for targeted attacks\n        if submission_type == \"targeted_attack\":\n            target_classes = np.random.randint(1, 1001, size=[BATCH_SIZE])\n            target_class_filename = os.path.join(\n                self._sample_input_dir, \"target_class.csv\"\n            )\n            with open(target_class_filename, \"w\") as f:\n                for i in range(BATCH_SIZE):\n                    f.write(\n                        (IMAGE_NAME_PATTERN + \",{1}\\n\").format(i, target_classes[i])\n                    )\n\n    def _run_submission(self, metadata):\n        \"\"\"Runs submission inside Docker container.\n\n        Args:\n          metadata: dictionary with submission metadata\n\n        Returns:\n          True if status code of Docker command was success (i.e. zero),\n          False otherwise.\n        \"\"\"\n        if self._use_gpu:\n            docker_binary = \"nvidia-docker\"\n            container_name = metadata[\"container_gpu\"]\n        else:\n            docker_binary = \"docker\"\n            container_name = metadata[\"container\"]\n        if metadata[\"type\"] == \"defense\":\n            cmd = [\n                docker_binary,\n                \"run\",\n                \"--network=none\",\n                \"-m=24g\",\n                \"-v\",\n                \"{0}:/input_images:ro\".format(self._sample_input_dir),\n                \"-v\",\n                \"{0}:/output_data\".format(self._sample_output_dir),\n                \"-v\",\n                \"{0}:/code\".format(self._extracted_submission_dir),\n                \"-w\",\n                \"/code\",\n                container_name,\n                \"./\" + metadata[\"entry_point\"],\n                \"/input_images\",\n                \"/output_data/result.csv\",\n            ]\n        else:\n            epsilon = np.random.choice(ALLOWED_EPS)\n            cmd = [\n                docker_binary,\n                \"run\",\n                \"--network=none\",\n                \"-m=24g\",\n                \"-v\",\n                \"{0}:/input_images:ro\".format(self._sample_input_dir),\n                \"-v\",\n                \"{0}:/output_images\".format(self._sample_output_dir),\n                \"-v\",\n                \"{0}:/code\".format(self._extracted_submission_dir),\n                \"-w\",\n                \"/code\",\n                container_name,\n                \"./\" + metadata[\"entry_point\"],\n                \"/input_images\",\n                \"/output_images\",\n                str(epsilon),\n            ]\n        logging.info(\"Command to run submission: %s\", \" \".join(cmd))\n        return shell_call(cmd)\n\n    def _verify_output(self, submission_type):\n        \"\"\"Verifies correctness of the submission output.\n\n        Args:\n          submission_type: type of the submission\n\n        Returns:\n          True if output looks valid\n        \"\"\"\n        result = True\n        if submission_type == \"defense\":\n            try:\n                image_classification = load_defense_output(\n                    os.path.join(self._sample_output_dir, \"result.csv\")\n                )\n                expected_keys = [\n                    IMAGE_NAME_PATTERN.format(i) for i in range(BATCH_SIZE)\n                ]\n                if set(image_classification.keys()) != set(expected_keys):\n                    logging.error(\"Classification results are not saved for all images\")\n                    result = False\n            except IOError as e:\n                logging.error(\"Failed to read defense output file: %s\", e)\n                result = False\n        else:\n            for i in range(BATCH_SIZE):\n                image_filename = os.path.join(\n                    self._sample_output_dir, IMAGE_NAME_PATTERN.format(i)\n                )\n                try:\n                    img = np.array(Image.open(image_filename).convert(\"RGB\"))\n                    if list(img.shape) != [299, 299, 3]:\n                        logging.error(\n                            \"Invalid image size %s for image %s\",\n                            str(img.shape),\n                            image_filename,\n                        )\n                        result = False\n                except IOError as e:\n                    result = False\n        return result\n\n    def validate_submission(self, filename, submission_type):\n        \"\"\"Validates submission.\n\n        Args:\n          filename: submission filename\n          submission_type: type of the submission,\n            one of 'attack', 'targeted_attack' or 'defense'\n\n        Returns:\n          whether submission is valid\n        \"\"\"\n        if submission_type not in ALLOWED_SUBMISSION_TYPES:\n            logging.error(\"Invalid submission type: %s\", submission_type)\n            return False\n        self._prepare_temp_dir()\n        # Convert filename to be absolute path,\n        # relative path might cause problems when monting directory in Docker\n        filename = os.path.abspath(filename)\n        # extract submission\n        if not self._extract_submission(filename):\n            return False\n        # verify submission size\n        if not self._verify_submission_size():\n            return False\n        # Load metadata\n        metadata = self._load_and_verify_metadata(submission_type)\n        if not metadata:\n            return False\n        # verify docker container size\n        if not self._verify_docker_image_size(metadata[\"container_gpu\"]):\n            return False\n        # Try to run submission on sample data\n        self._prepare_sample_data(submission_type)\n        if not self._run_submission(metadata):\n            logging.error(\"Failure while running submission\")\n            return False\n        if not self._verify_output(submission_type):\n            logging.warning(\n                \"Some of the outputs of your submission are invalid or \"\n                \"missing. You submission still will be evaluation \"\n                \"but you might get lower score.\"\n            )\n        return True\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/dev_toolkit/validation_tool/validate_submission.py",
    "content": "r\"\"\"Tool to validate submission for adversarial competition.\n\nUsage:\n  python validate_submission.py \\\n    --submission_filename=FILENAME \\\n    --submission_type=TYPE \\\n    [--use_gpu]\n\nWhere:\n  FILENAME - filename of the submission\n  TYPE - type of the submission, one of the following without quotes:\n    \"attack\", \"targeted_attack\" or \"defense\"\n  --use_gpu - if argument specified then submission will be run on GPU using\n    nvidia-docker, otherwise will be run on CPU.\n\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport argparse\nimport logging\nimport random\nimport subprocess\nimport tempfile\nimport submission_validator_lib\n\n\ndef print_in_box(text):\n    \"\"\"\n    Prints `text` surrounded by a box made of *s\n    \"\"\"\n    print(\"\")\n    print(\"*\" * (len(text) + 6))\n    print(\"** \" + text + \" **\")\n    print(\"*\" * (len(text) + 6))\n    print(\"\")\n\n\ndef main(args):\n    \"\"\"\n    Validates the submission.\n    \"\"\"\n    print_in_box(\"Validating submission \" + args.submission_filename)\n    random.seed()\n    temp_dir = args.temp_dir\n    delete_temp_dir = False\n    if not temp_dir:\n        temp_dir = tempfile.mkdtemp()\n        logging.info(\"Created temporary directory: %s\", temp_dir)\n        delete_temp_dir = True\n    validator = submission_validator_lib.SubmissionValidator(temp_dir, args.use_gpu)\n    if validator.validate_submission(args.submission_filename, args.submission_type):\n        print_in_box(\"Submission is VALID!\")\n    else:\n        print_in_box(\"Submission is INVALID, see log messages for details\")\n    if delete_temp_dir:\n        logging.info(\"Deleting temporary directory: %s\", temp_dir)\n        subprocess.call([\"rm\", \"-rf\", temp_dir])\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(description=\"Submission validation script.\")\n    parser.add_argument(\n        \"--submission_filename\", required=True, help=\"Filename of the submission.\"\n    )\n    parser.add_argument(\n        \"--submission_type\",\n        required=True,\n        help=\"Type of the submission, \"\n        'one of \"attack\", \"targeted_attack\" or \"defense\"',\n    )\n    parser.add_argument(\n        \"--temp_dir\",\n        required=False,\n        default=\"\",\n        help=\"Temporary directory to extract and run submission. \"\n        \"If empty then temporary directory will be created \"\n        \"by the script and then deleted in the end.\",\n    )\n    parser.add_argument(\"--use_gpu\", dest=\"use_gpu\", action=\"store_true\")\n    parser.add_argument(\"--nouse_gpu\", dest=\"use_gpu\", action=\"store_false\")\n    parser.set_defaults(use_gpu=False)\n    loggint_format = (\n        \"%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s -- \" \"%(message)s\"\n    )\n    logging.basicConfig(\n        format=loggint_format, level=logging.INFO, datefmt=\"%Y-%m-%d %H:%M:%S\"\n    )\n    main(parser.parse_args())\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/README.md",
    "content": "\n# Evaluation infrastructure for adversarial competition\n\n## About\n\nThis directory contains code of the backend which was used to run evaluation of\n[NIPS17 Adversarial Competition](https://www.kaggle.com/nips-2017-adversarial-learning-competition).\n\nThis file describes how to run and use the code.\nFor more details about the competition refer to\n[our publication](https://arxiv.org/abs/1804.00097) and to\n[Kaggle competition page](https://www.kaggle.com/nips-2017-adversarial-learning-competition).\n\nNOTES AND DISCLAIMERS:\n\n* **This code is provided AS IS. At the time of publishing this code\n  was well tested and was working for evaluation of the competition.\n  We do not provide any future support of this code.**\n\n* This code is formatted according to\n  [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html)\n  which is different from PEP8 (biggest difference is number of spaces\n  in indentation). We do not plan to reformat the code according to PEP8.\n\n* You can defer questions about this code to\n  [Alexey Kurakin](https://github.com/AlexeyKurakin), however they will\n  be answered on best effort basis.\n\n## How to run\n\nDuring the evaluation all attacks are run on the image dataset to produce\nadversarial images, then all defenses are run on all adversarial images to\nproduce classification labels and finally scores are computed based\non classification labels, true classes and target classes of all images.\n\nCompetition is evaluated in a distributed way by running multiple **workers**\non [Google Cloud Compute Engine](https://cloud.google.com/compute/).\nAt any given moment each worker runs single **attack work piece** - evaluation\nof a single attack on a batch of clean images\nor **defense work piece** - evaluation of a single defense on a batch of\nadversarial images. All attack work pieces are independent from each\nother and could be run in parallel. After all attack work pieces are done,\ndefense work pieces are run in parallel.\n\nCoordination between workers is done via\n[Google Cloud Datastore](https://cloud.google.com/datastore/) where list of\nall work pieces is stored. Content of the datastore is populated by **master**\nwhich could be run either on local machine or on Google Cloud.\n\nSo evaluation of the competition consists of following steps:\n\n* Validate all submissions and copy valid submissions to Google Cloud.\n* **Master** populates all attack work pieces.\n* **Workers** are deployed to Google Cloud VMs.\n* **Workers** compute all attack work pieces.\n* **Master** populates all defense work pieces.\n* **Workers** compute all defense work pieces.\n* **Master** computes scores of all submissions.\n\nBelow this process is described in more details.\n\n### 1. Preparation\n\nBefore running the competition you need to prepare machine which will run master\nas well as Google Cloud VMs which will run workers.\n\n#### 1.1 Prepare Google Cloud Project\n\nSince most of the competition is run on Google Cloud you have to have\n[Google Cloud project](https://cloud.google.com/resource-manager/docs/creating-managing-projects).\nAlso you need to create\n[Google Cloud Storage bucket](https://cloud.google.com/storage/docs/creating-buckets)\nfor the competition data within your Google Cloud project.\n\nYou also will need to install Google Cloud SDK to use `gsutil` - a tool to copy\ndata to and from Google Cloud Storage.\n\n#### 1.2 Prepare dataset\n\nYou need to prepare dataset of labeled images which will be used in the\ncompetition.\nYou can either download DEV or FINAL dataset which was used in NIPS17\ncompetition or prepare your own dataset in a similar format.\nNIPS17 competition dataset could be found\n[here](https://github.com/tensorflow/cleverhans/tree/master/examples/nips17_adversarial_competition/dataset).\n\nTo download NIPS17 dataset make a local copy of\n[this](https://github.com/tensorflow/cleverhans/tree/master/examples/nips17_adversarial_competition/dataset)\ndirectory and then run following commands:\n\n```bash\n# ${DATASET_DIR} is a directory where dataset will be downloaded\n# ${DATASET_NAME} is a name of the dataset, \"dev\" or \"final\"\n\n# Prepare directory with downloaded dataset\nmkdir -p ${DATASET_DIR}/images\n\n# Copy dataset metadata there\ncp ${DATASET_NAME}_dataset.csv ${DATASET_DIR}\n\n# Download dataset images\npython download_images.py --input_file=${DATASET_NAME}_dataset.csv \\\n --output_dir=${DATASET_DIR}/${DATASET_NAME}/images\n```\n\nAfter you done `${DATASET_DIR}` will contain dataset metadata and all dataset\nimages in `images` subdirectory.\n\nThen copy the dataset into Google Cloud Storage:\n\n```bash\n# copy metadata\ngsutil cp ${DATASET_DIR}/${DATASET_NAME}_dataset.csv \\\n  gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/dataset/\n\n# copy images\ngsutil -m cp ${DATASET_DIR}/images/* \\\n  gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/dataset/${DATASET_NAME}/\n```\n\nKeep the content of the `${DATASET_DIR}`,\nyou will need to copy it to the worker VMs in one of the next steps.\n\n#### 1.3 Update config\n\nBefore proceeding with next steps you need to update variables in\nconfig file `scripts/config.sh`.\n\nUpdate `GOOGLE_CLOUD_PROJECT_ID` and `GOOGLE_CLOUD_STORAGE_BUCKET` with names\nof Google Cloud Project ID and Google Cloud Storage Bucket which you will use\nfor competition.\n\nAdditionally consider updating `VIRTUALENV_NAME` if default value does not work\nfor you.\n\nFew other variables will be updated in next steps.\n\n#### 1.4 Preparation of master machine\n\nMaster has to be run only a few times to populate work pieces for workers and\nto compute final scores. These tasks should take no more than few hours combined\n(exact time depends on how fast your computer, network connection and how many\nsubmissions are in the competition).\nThus master could be run on your own machine.\nBelow we call a computer where you runs master as **master machine**.\n\nGenerally speaking master machine can have any operating system,\nhowever we only tested master on Debian flavor of Linux.\nAlso if you operating system does not support running bash scripts\nyou may need to rewrite a few bash scripts in a way which is supported on\nyour machine.\n\nTo prepare master machine you need to do following:\n\n1. Install Python 2.7\n2. Install [Google Cloud SDK](https://cloud.google.com/sdk/docs/)\n2. Run `scripts/prepare_virtualenv.sh` to prepare python virtual environment\n   for the master\n3. Run `gcloud auth application-default login` or set\n   `GOOGLE_APPLICATION_CREDENTIALS` to proper value. This is needed for master\n   to be able to authenticate to Google Cloud services. See\n   [Application Default Credentials](https://developers.google.com/identity/protocols/application-default-credentials)\n   for more information.\n\n#### 1.5 Copy baselines to Google Cloud Storage\n\nEach baseline is a zip archive which name starts with `baseline_`.\nThis archive should be formatted in a same way as any other valid submission.\n\nYou can use sample attacks and defenses from\n[dev toolkit](https://github.com/tensorflow/cleverhans/tree/master/examples/nips17_adversarial_competition/dev_toolkit)\nas baselines. Just keep in mind that you have to download checkpoints for these\nexamples and package them into zip archives yourself.\n\nAfter you prepared set of baselines copy them into following locations\nin Google Cloud Storage:\n\n* `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/defense` - directory with\n  defense baselines\n* `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/targeted` - directory with\n  targeted attack baselines\n* `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/nontargeted` - directory with\n  non-targeted attack baselines\n\n#### 1.6 Preparation of a snapshot for workers VMs\n\nFirst of all you need to decide in which zone you will be creating all VMs\nfor the competition and update `GOOGLE_CLOUD_COMPUTE_ZONE` variable\nin `config.sh` with the name of the zone.\nOptionally you may want to update `GOOGLE_CLOUD_VM_USERNAME`\ndepending on which username you will use to log in into VMs.\nAfter updating `config.sh` you will be able to use script `scp_cloud_vm.sh` to\ncopy files to and from VM.\n\nYou need to prepare snapshot of one VM manually, then you can use\nhelper script to create many workers from this snapshot.\n\nTo prepare snapshot:\n\n1. Create a Cloud VM with attached GPU and Ubuntu 16.04 OS.\n\n   * Make sure to enable read/write access to Google Cloud Storage for this VM.\n\n   * If you're planning to pre-download all Docker images\n     you may want to increase disk size of this machine to 100GiB or more.\n\n2. Install some additional packages to VM:\n\n   ```bash\n   sudo apt-get update\n   sudo apt-get upgrade\n   # Install pip and virtualenv for Python 2\n   sudo apt-get install python-pip\n   sudo pip install --upgrade pip\n   sudo pip install virtualenv\n   # Install zip\n   sudo apt-get install zip unzip\n   ```\n\n3. Install [Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/)\n   into VM.\n   * Make sure to follow \"Manage Docker as a non-root user\" section in\n   [post installation steps](https://docs.docker.com/install/linux/linux-postinstall/)\n   so you can run `docker` command without `sudo`\n\n4. Install NVidia drivers and any other dependencies needed for NVidia Docker\n   into VM.\n\n   * You can get the latest version of the driver from\n     [NVidia web-site](http://www.nvidia.com/object/unix.html)\n     (look for the latest Linux x86_64 driver) and install it on your VM.\n     You can safely ignore warnings about X library path and\n     32-bit compatibility binary during the installation.\n\n   * Please refer to [NVidia Docker](https://github.com/NVIDIA/nvidia-docker)\n     documentation for details about any additional dependencies.\n\n5. Install [NVidia Docker](https://github.com/NVIDIA/nvidia-docker) into VM.\n\n6. Make sure that NVidia Docker working properly and can detect your graphic\n   card. To do this run\n   `docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi` inside the VM.\n   You should see output of NVIDIA-SMI tool which shows utilization of\n   your graphic card. If it fails or can not detect your graphic card\n   please resolve the problem before proceeding to next steps.\n\n7. Copy dataset into VM. This step is run from outside of the VM.\n\n   * At this point you should have dataset downloaded into `${DATASET_DIR}`\n     So run `scripts/copy_dataset_to_vm.sh` to copy dataset to VM:\n\n     ```bash\n     # To copy dev dataset:\n     scripts/copy_dataset_to_vm.sh ${DATASET_DIR} dev ${VM_NAME}\n     # To copy final dataset:\n     scripts/copy_dataset_to_vm.sh ${DATASET_DIR} final ${VM_NAME}\n     ```\n\n8. Copy evaluation infrastructure to VM. This step is done from outside\n   of the VM by running following script:\n\n   ```bash\n   scripts/copy_eval_infra_to_vm.sh ${VM_NAME}\n   ```\n\n   NOTE: at this point don't worry if some of the values in `config.sh` are not\n   updated. Script which starts workers will copy updated version of competition\n   infrastructure with updated `config.sh`.\n\n9. Run `eval_infra/scripts/prepare_virtualenv.sh` inside the VM to prepare\n   python virtual environment needed to run the worker.\n\n10. Shut down VM, make a snapshot of its disk (via Google Cloud web UI)\n    and set value of `GOOGLE_CLOUD_REF_VM_SNAPSHOT` in `config.sh`\n    to the name of the snapshot.\n\nThis snapshot will be used during actual evaluation of the competition to\ncreate VMs with workers.\n\n\n\n\n### 2. Running the competition\n\nEvaluation infrastructure can be used to run multiple rounds of the\ncompetition. Each round involves independent evaluation of all provided\nsubmission on given dataset.\n\nIntermediate data for each round are stored in separate\nsubdirectory `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}` in\nGoogle Cloud Storage and using namespace `${ROUND_NAME}`\nin Google Cloud Datastore. Thus intermediate data for each round have no\nintersection with each other and you can run next round without cleaning up\ndata of previous round as long as names of the rounds are different.\n\nBefore you start evaluation of one round you need to decide which dataset you\nwill use and what will be the name of the round. Then update variables\n`DATASET` and `ROUND_NAME` in `config.sh` on master machine (workers will\nbe updated later).\n\nAlso you may want to update `MASTER_RESULTS_DIR` and `NUM_DEFENSE_SHARDS`\nif default values does not work for you.\n\n#### 2.1 Validate and copy submissions and baselines\n\nFirst step of running the evaluation is to copy submissions and baselines to\nGoogle Cloud Storage directory for current evaluation round.\n\nTo copy baselines from `gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/` into\ndirectory which correspond to current round of the competition run following\ncommand:\n\n```bash\nscripts/copy_baselines.sh\n```\n\nTo validate submissions and copy them into appropriate location in Google Cloud\nStorage you can use program `validation_tool/validate_and_copy_submissions.py`.\nThis tool scans all zip, tar and tar.gz archives in given Google Cloud\nStorage location, detects which of them are valid submissions and copies them\nto submission directory of the current round.\n\nYou can run this tool in the VM created at\n\"Preparation of a snapshot for workers VMs\" step.\nTo do this, turn this VM on, ssh into it and run following commands:\n\n```bash\nsource ~/.virtualenv/${VIRTUALENV_NAME}/bin/activate\ncd eval_infra/validation_tool\n# ${SOURCE_DIR} is a directory in Google Cloud Storage which contains archives\n# with all submissions.\n# validate_and_copy_submissions.py will scan all subdirectories of the\n# ${SOURCE_DIR}, try to interpret all found zip, tar and tar.gz archives as\n# submissions, validate them and copy archives which are valid submissions\n# into target directory\npython -B validate_and_copy_submissions.py --use_gpu \\\n  --source_dir=${SOURCE_DIR} \\\n  --target_dir=gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions \\\n  --containers_file=${HOME}/containers.txt \\\n  --log_file=${HOME}/validation_log.txt\ndeactivate\n```\n\nAs a side effect this command will also download all Docker images from\nall submissions into the VM.\nSo you can re-create snapshot `${GOOGLE_CLOUD_REF_VM_SNAPSHOT}` of this VM\nright now and this snapshot will contain all Docker images of all submissions.\n\nUsing snapshot with all Docker images will help you to save time and\nnetwork traffic during actual evaluation of the submissions.\n\n\n#### 2.2 Prepare attack work pieces\n\nTo prepare attack work pieces and write them to Google Cloud Datastore\nrun following command:\n\n```bash\nrun_master.sh attack\n```\nThis operation may take several minutes so be patient.\n\nIf you interrupt preparation of the attack work pieces you probably will need\nto clean up datastore before retrying.\nTo cleanup datastore run `run_master.sh cleanup_datastore`\n\nNOTE: If you want to have a test run of your competition on a small subset\nof the dataset then you can add flag `--limited_dataset` into `run_master.sh`\nas additional argument to `master.py`. This flag will force to use only 30\nimages from the dataset with batch size 10.\n\n#### 2.3 Create worker VMs\n\nTo avoid confusion let's introduce some terminology:\n\n* **creating VM** - create virtual machine which will host worker.\n* **starting VM** - start virtual machine which will be used to\n  run worker. After worker VM is started we will say that\n  **worker VM is up and running**.\n* **starting worker** - start worker script which performs evaluation on a VM.\n  After script is started we will say that **worker is running**.\n\nAt this step we only create and start VMs, but not the worker script.\n\nAt this point you need to decide how many workers you need and what will be\ntheir indices. Indices could be any non-negative numbers, but for simplicity we\nrecommend to use 0, ... (N-1) as indices where N is total number of workers.\n\nDepending on chosen number of workers you may want\nto update `NUM_DEFENSE_SHARDS` in `config.sh`. We recommend to use\nmin(1, NUM_WORKERS/10) defense shards.\n\nAfter you decided how many workers you need and what are their indices,\ncreate worker VMs by running `scripts/create_workers.sh`:\n\n```bash\n# Create workers with indices ${INDICES}\n# ${INDICES} should be list of numbers separated by spaces\nscripts/create_workers.sh \"${INDICES}\"\n\n# Create workers with indices 0, 1, 2, ..., 9\nscripts/create_workers.sh \"$(seq 0 9)\"\n\n# Create workers with indices 1, 3 and 5\nscripts/create_workers.sh \"1 3 5\"\n```\n\nScript `create_workers.sh` only create VMs and does not start worker code\non these VMs. You need to wait until all VMs are up and running (if you can\nssh into VM then it's ready) and proceed to the next step to start worker code.\n\nNOTE: Keep in mind that `scripts/create_workers.sh` creates VMs\nin 'running' state and you will be billed for uptime of these machines.\nYou may want to shut them down when they are not in use to avoid paying for\nidle machines.\n\n#### 2.4 Starting and restarting workers\n\nBefore starting workers you need to make sure that all worker VMs are up and\nrunning. Also you need to make sure that worker script is not already running\non the VMs.\nIf VM was shut down, then simply start it from Google Cloud web UI and wait\nuntil Google Cloud will show that VM is up and running.\nIf VM is already running then reload it using Google Cloud web UI and\nwait a few minutes until reload is complete.\n\nAfter worker VMs are up and running you can start workers by using\nscript `scripts/start_workers.sh`:\n\n```bash\n# to start workers 0,1,2,3, ... 9\nscripts/start_workers.sh \"$(seq 0 9)\"\n# to start workers 1, 5 and 7:\nscripts/start_workers.sh \"1 5 7\"\n```\n\nSometimes worker get stuck or fail. In such case you may need to restart\nfailed workers. To do this restart corresponding VMs and then use\nthe same script `scripts/start_workers.sh` to start workers.\n\n#### 2.5 Checking status of the workers\n\nAny time you can run following command to monitor progress of competition\nevaluation:\n\n```bash\nrun_master.sh status\n```\n\nNote that this command may take several minutes to complete.\n\n`run_master.sh status` will show how many attack and defense work pieces\nare done and how many work pieces was finished by each worker. It also show\nlast time each worker completed a work piece.\n\nIf you notice that some workers haven't had any updates for a long time\nit may indicate that they crash or stuck or some other problem have happen.\nYou can log in to the VM with stuck worker and check `log.txt` to troubleshoot\nit, however in most cases these issues are transient and resolved by\nrestarting stuck worker.\n\n#### 2.6 Prepare defense work pieces\n\nAfter all attack work pieces are done (according to `run_master.sh status`)\nyou need to populate defense work pieces.\nTo populate defense work pieces run following command:\n\n```bash\nrun_master.sh defense\n```\n\nThis command may take many minutes to complete, so be patient.\n\nIf for some reason you ended up with corrupted state of the database you can\ncleanup defense work pieces by running `run_master.sh cleanup_defenses`.\n\n#### 2.7 Compute results\n\nAs soon as all attack work pieces and defense work pieces are evaluated you\ncan shut down VMs with all workers (to avoid paying for idle VMs).\nThen you can run following command to compute results:\n\n```bash\nrun_master.sh results\n```\n\nIt may take several minutes to compute all results. When done results will\nbe saved into `${MASTER_RESULTS_DIR}` directory (as specified in `config.sh`)\non master machine.\n\nResults include following files:\n\n* `accuracy_matrix.csv` - matrix with the number of correctly classified\n  adversarial images for each pair of defense and attack (both targeted\n  and non-targeted). Rows are defenses, columns are attacks.\n* `error_matrix.csv` - matrix with the number of misclassified adversarial\n  images for each pair of defense and attack (both targeted and non-targeted).\n  Rows are defenses, columns are attacks.\n* `hit_target_class_matrix.csv` - matrix with the number of times a defense\n  recognized adversarial images produced by an attack\n  (both targeted and non-targeted) as specific target class.\n  Rows are defenses, columns are attacks.\n* `attack_results.csv` and `sorted_attack_results.csv` - unsorted and sorted\n  results of non-targeted attacks. Sorted results are sorted by score\n  and contain less stats about each submission.\n* `targeted_attack_results.csv` and  `sorted_target_attack_results.csv` -\n  unsorted and sorted results of targeted attacks.\n* `defense_results.csv` and `sorted_defense_results.csv` - unsorted and sorted\n  results of defenses.\n* `attack_id_to_name.csv` - mapping from internal IDs of all targeted and\n  non-targeted attacks to their external IDs. Internal IDs are used only\n  by evaluation infrastructure, external IDs is what was provided as inputs.\n* `defense_id_to_name.csv` - mapping from internal IDs of all defenses\n  to their external IDs.\n* `count_adv_images.csv` - file with number of adversarial images produces by\n  each attack.\n* `classified_images_count.csv` - file with total number of images classified\n  by each defense.\n* `*.dump` - these are temporary files with intermediate results\n  saved by master. If master interrupted during computation of final results and\n  then restarted these files are used to resume execution of the master\n  without recomputing too much data.\n\nAdditionally master will save log `log.txt` into the same directory.\n\n\n## Known issues\n\n### Python 3 compatibility\n\nMost of the code is compatible with both Python 2 and Python 3\nHowever we haven't perform end-to-end testing of the entire competition\nevaluation with Python 3 thus we recommend to run code using Python 2.\n\n### Same attack work piece evaluated twice\n\nThis issue happens very rare with the current values of worker parameters,\nnevertheless its possible theoretically\nand below is an instruction on how to deal with it.\n\nIt's possible that the same attack work piece will be evaluated twice.\nIt can happen in following circumstances:\n\n* Worker A started evaluation of work piece W1, however got stuck downloading\n  Docker container.\n* Worker B saw that work piece W1 was claimed by A too long ago, concluded that\n  worker A crashed or got rebooted and started evaluation of work piece W1\n* Worker A finished evaluation of work piece W1, wrote list of produced\n  adversarial images to datastore, wrote archive with adversarial images to\n  Google Cloud Storage. Worker A tried to mark work piece as completed\n  but failed because it's already re-claimed by B. Nevertheless adversarial\n  images were already written to datastore and storage.\n* Worker B finished evaluation of work piece W1, overwrote list of produced\n  adversarial images in the datastore and overwrote archive with adversarial\n  images into storage. Then worker B marked work piece W1 as completed.\n\nThis behavior is by design and generally speaking does not cause any issues\nas long as in both cases result of evaluation of work piece W1 is the same.\n\nHowever if work piece W1 times out and does not output adversarial images\nfor all inputs, it's possible that two different evaluations of the work piece\nwill result in different number of produced images.\n\nIn such case it's possible that archive with adversarial images written to\nGoogle Cloud Storage will contain less images than listed in Google Cloud\nDatastore.\n\nIf this happen then defenses will classify less adversarial images than\nlisted in the datastore.\nThen during computation of the final scores by master\nthis inconsistency will lead to the fact that no defenses will be used to\ncompute attack scores, so all attacks will receive score 0.\n\nThe issue could be diagnosed by the fact that all attacks have score zero\nand following line appear in the log output of the master:\n\n```\nNumber of defenses to use to score attacks: 0\n```\n\nIf issue have happened and you discovered it during computation of results\nthen following could be done to fix it:\n\n* Manually find problematic piece of attack work and edit the content of the\n  datastore to fix the issue. Then you can delete all `*.dump` files are\n  redo computation of results by master. This is a clean way to fix the problem,\n  but it might be time consuming.\n* Change `total_num_adversarial` in `EvaluationMaster.compute_results` in\n  `master.py` to be equal to maximum value of `classified_images_count` dict\n  (or maximum value from `classified_images_count.csv` file). Then again\n  delete all `*.dump` files and restart master.\n  This is a quick and hacky way to fix the issue, but it still should work\n  in most cases.\n\nMoreover following steps could be done to decrease probability\nof the issue happening in the first place:\n\n* Pre-download all Docker images to each worker VM, so workers won't spend time\n  downloading Docker image before running new submission.\n  However if evaluation of competition takes multiple days and some of the\n  submissions refer to the \"latest\" version of some Docker image\n  (e.g. tensorflow/tensorflow:latest-gpu) instead of fixed version it's\n  possible that the latest version of Docker image will be updated during\n  evaluating of the competition and some workers will download it again.\n* Increase `MAX_PROCESSING_TIME` in `work_data.py`. This constant define\n  how long worker is allowed to process one piece of work before it considered\n  failed.\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/__init__.py",
    "content": "from eval_lib.classification_results import analyze_one_classification_result\nfrom eval_lib.classification_results import ClassificationBatches\nfrom eval_lib.cloud_client import CompetitionDatastoreClient\nfrom eval_lib.cloud_client import CompetitionStorageClient\nfrom eval_lib.dataset_helper import DatasetMetadata\nfrom eval_lib.dataset_helper import download_dataset\nfrom eval_lib.dataset_helper import enforce_epsilon_and_compute_hash\nfrom eval_lib.image_batches import AversarialBatches\nfrom eval_lib.image_batches import DatasetBatches\nfrom eval_lib.submissions import CompetitionSubmissions\nfrom eval_lib.work_data import AttackWorkPieces\nfrom eval_lib.work_data import DefenseWorkPieces\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/classification_results.py",
    "content": "\"\"\"Module with classes to compute, read and store classification results.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport csv\nfrom io import BytesIO\nfrom io import StringIO\nimport logging\nimport os\nimport pickle\nimport time\nfrom six import iteritems\nfrom six import iterkeys\nfrom six import itervalues\nfrom six import PY3\n\nKIND_CLASSIFICATION_BATCH = u\"ClassificationBatch\"\nCLASSIFICATION_BATCH_ID_PATTERN = u\"CBATCH{:06}\"\n\nCLASSIFICATION_BATCHES_SUBDIR = \"classification_batches\"\n\nTO_STR_MAX_BATCHES = 10\n\nMAX_ALLOWED_CLASSIFICATION_RESULT_SIZE = 10000\n\n\ndef read_classification_results(storage_client, file_path):\n    \"\"\"Reads classification results from the file in Cloud Storage.\n\n    This method reads file with classification results produced by running\n    defense on singe batch of adversarial images.\n\n    Args:\n      storage_client: instance of CompetitionStorageClient or None for local file\n      file_path: path of the file with results\n\n    Returns:\n      dictionary where keys are image names or IDs and values are classification\n        labels\n    \"\"\"\n    if storage_client:\n        # file on Cloud\n        success = False\n        retry_count = 0\n        while retry_count < 4:\n            try:\n                blob = storage_client.get_blob(file_path)\n                if not blob:\n                    return {}\n                if blob.size > MAX_ALLOWED_CLASSIFICATION_RESULT_SIZE:\n                    logging.warning(\n                        \"Skipping classification result because it\"\n                        \"s too \"\n                        \"big: %d bytes for %s\",\n                        blob.size,\n                        file_path,\n                    )\n                    return None\n                buf = BytesIO()\n                blob.download_to_file(buf)\n                buf.seek(0)\n                success = True\n                break\n            except Exception:\n                retry_count += 1\n                time.sleep(5)\n        if not success:\n            return None\n    else:\n        # local file\n        try:\n            with open(file_path, \"rb\") as f:\n                buf = BytesIO(f.read())\n        except IOError:\n            return None\n    result = {}\n    if PY3:\n        buf = StringIO(buf.read().decode(\"UTF-8\"))\n    for row in csv.reader(buf):\n        try:\n            image_filename = row[0]\n            if image_filename.endswith(\".png\") or image_filename.endswith(\".jpg\"):\n                image_filename = image_filename[: image_filename.rfind(\".\")]\n            label = int(row[1])\n        except (IndexError, ValueError):\n            continue\n        result[image_filename] = label\n    return result\n\n\ndef analyze_one_classification_result(\n    storage_client, file_path, adv_batch, dataset_batches, dataset_meta\n):\n    \"\"\"Reads and analyzes one classification result.\n\n    This method reads file with classification result and counts\n    how many images were classified correctly and incorrectly,\n    how many times target class was hit and total number of images.\n\n    Args:\n      storage_client: instance of CompetitionStorageClient\n      file_path: result file path\n      adv_batch: AversarialBatches.data[adv_batch_id]\n        adv_batch_id is stored in each ClassificationBatch entity\n      dataset_batches: instance of DatasetBatches\n      dataset_meta: instance of DatasetMetadata\n\n    Returns:\n      Tuple of (count_correctly_classified, count_errors, count_hit_target_class,\n      num_images)\n    \"\"\"\n    class_result = read_classification_results(storage_client, file_path)\n    if class_result is None:\n        return 0, 0, 0, 0\n    adv_images = adv_batch[\"images\"]\n    dataset_batch_images = dataset_batches.data[adv_batch[\"dataset_batch_id\"]][\"images\"]\n    count_correctly_classified = 0\n    count_errors = 0\n    count_hit_target_class = 0\n    num_images = 0\n    for adv_img_id, label in iteritems(class_result):\n        if adv_img_id not in adv_images:\n            continue\n        num_images += 1\n        clean_image_id = adv_images[adv_img_id][\"clean_image_id\"]\n        dataset_image_id = dataset_batch_images[clean_image_id][\"dataset_image_id\"]\n        if label == dataset_meta.get_true_label(dataset_image_id):\n            count_correctly_classified += 1\n        else:\n            count_errors += 1\n        if label == dataset_meta.get_target_class(dataset_image_id):\n            count_hit_target_class += 1\n    return (\n        count_correctly_classified,\n        count_errors,\n        count_hit_target_class,\n        num_images,\n    )\n\n\nclass ResultMatrix(object):\n    \"\"\"Sparse matrix where rows and columns are indexed using string.\n\n    This matrix is used to store resutls of the competition evaluation.\n    \"\"\"\n\n    def __init__(self, default_value=0):\n        \"\"\"Initializes empty matrix.\"\"\"\n        self._items = {}\n        self._dim0 = set()\n        self._dim1 = set()\n        self._default_value = default_value\n\n    @property\n    def dim0(self):\n        \"\"\"Returns set of rows.\"\"\"\n        return self._dim0\n\n    @property\n    def dim1(self):\n        \"\"\"Returns set of columns.\"\"\"\n        return self._dim1\n\n    def __getitem__(self, key):\n        \"\"\"Returns element of the matrix indexed by given key.\n\n        Args:\n          key: tuple of (row_idx, column_idx)\n\n        Returns:\n          Element of the matrix\n\n        Raises:\n          IndexError: if key is invalid.\n        \"\"\"\n        if not isinstance(key, tuple) or len(key) != 2:\n            raise IndexError(\"Invalid index: {0}\".format(key))\n        return self._items.get(key, self._default_value)\n\n    def __setitem__(self, key, value):\n        \"\"\"Sets element of the matrix at position indexed by key.\n\n        Args:\n          key: tuple of (row_idx, column_idx)\n          value: new value of the element of the matrix\n\n        Raises:\n          IndexError: if key is invalid.\n        \"\"\"\n        if not isinstance(key, tuple) or len(key) != 2:\n            raise IndexError(\"Invalid index: {0}\".format(key))\n        self._dim0.add(key[0])\n        self._dim1.add(key[1])\n        self._items[key] = value\n\n    def save_to_file(self, filename, remap_dim0=None, remap_dim1=None):\n        \"\"\"Saves matrix to the file.\n\n        Args:\n          filename: name of the file where to save matrix\n          remap_dim0: dictionary with mapping row indices to row names which should\n            be saved to file. If none then indices will be used as names.\n          remap_dim1: dictionary with mapping column indices to column names which\n            should be saved to file. If none then indices will be used as names.\n        \"\"\"\n        # rows - first index\n        # columns - second index\n        with open(filename, \"w\") as fobj:\n            columns = list(sorted(self._dim1))\n            for col in columns:\n                fobj.write(\",\")\n                fobj.write(str(remap_dim1[col] if remap_dim1 else col))\n            fobj.write(\"\\n\")\n            for row in sorted(self._dim0):\n                fobj.write(str(remap_dim0[row] if remap_dim0 else row))\n                for col in columns:\n                    fobj.write(\",\")\n                    fobj.write(str(self[row, col]))\n                fobj.write(\"\\n\")\n\n\nclass ClassificationBatches(object):\n    \"\"\"Class which generates and stores classification batches.\n\n    Each classification batch contains result of the classification of one\n    batch of adversarial images.\n    \"\"\"\n\n    def __init__(self, datastore_client, storage_client, round_name):\n        \"\"\"Initializes ClassificationBatches.\n\n        Args:\n          datastore_client: instance of CompetitionDatastoreClient\n          storage_client: instance of CompetitionStorageClient\n          round_name: name of the round\n        \"\"\"\n        self._datastore_client = datastore_client\n        self._storage_client = storage_client\n        self._round_name = round_name\n        # Data is dict of dicts {CLASSIFICATION_BATCH_ID: { ... }}\n        self._data = {}\n\n    def serialize(self, fobj):\n        \"\"\"Serializes data stored in this class.\"\"\"\n        pickle.dump(self._data, fobj)\n\n    def deserialize(self, fobj):\n        \"\"\"Deserializes data from file into this class.\"\"\"\n        self._data = pickle.load(fobj)\n\n    @property\n    def data(self):\n        \"\"\"Returns dictionary with data.\"\"\"\n        return self._data\n\n    def __getitem__(self, key):\n        \"\"\"Returns one classification batch by given key.\"\"\"\n        return self._data[key]\n\n    def init_from_adversarial_batches_write_to_datastore(\n        self, submissions, adv_batches\n    ):\n        \"\"\"Populates data from adversarial batches and writes to datastore.\n\n        Args:\n          submissions: instance of CompetitionSubmissions\n          adv_batches: instance of AversarialBatches\n        \"\"\"\n        # prepare classification batches\n        idx = 0\n        for s_id in iterkeys(submissions.defenses):\n            for adv_id in iterkeys(adv_batches.data):\n                class_batch_id = CLASSIFICATION_BATCH_ID_PATTERN.format(idx)\n                idx += 1\n                self.data[class_batch_id] = {\n                    \"adversarial_batch_id\": adv_id,\n                    \"submission_id\": s_id,\n                    \"result_path\": os.path.join(\n                        self._round_name,\n                        CLASSIFICATION_BATCHES_SUBDIR,\n                        s_id + \"_\" + adv_id + \".csv\",\n                    ),\n                }\n        # save them to datastore\n        client = self._datastore_client\n        with client.no_transact_batch() as batch:\n            for key, value in iteritems(self.data):\n                entity = client.entity(client.key(KIND_CLASSIFICATION_BATCH, key))\n                entity.update(value)\n                batch.put(entity)\n\n    def init_from_datastore(self):\n        \"\"\"Initializes data by reading it from the datastore.\"\"\"\n        self._data = {}\n        client = self._datastore_client\n        for entity in client.query_fetch(kind=KIND_CLASSIFICATION_BATCH):\n            class_batch_id = entity.key.flat_path[-1]\n            self.data[class_batch_id] = dict(entity)\n\n    def read_batch_from_datastore(self, class_batch_id):\n        \"\"\"Reads and returns single batch from the datastore.\"\"\"\n        client = self._datastore_client\n        key = client.key(KIND_CLASSIFICATION_BATCH, class_batch_id)\n        result = client.get(key)\n        if result is not None:\n            return dict(result)\n        else:\n            raise KeyError(\"Key {0} not found in the datastore\".format(key.flat_path))\n\n    def compute_classification_results(\n        self, adv_batches, dataset_batches, dataset_meta, defense_work=None\n    ):\n        \"\"\"Computes classification results.\n\n        Args:\n          adv_batches: instance of AversarialBatches\n          dataset_batches: instance of DatasetBatches\n          dataset_meta: instance of DatasetMetadata\n          defense_work: instance of DefenseWorkPieces\n\n        Returns:\n          accuracy_matrix, error_matrix, hit_target_class_matrix,\n          processed_images_count\n        \"\"\"\n        class_batch_to_work = {}\n        if defense_work:\n            for v in itervalues(defense_work.work):\n                class_batch_to_work[v[\"output_classification_batch_id\"]] = v\n\n        # accuracy_matrix[defense_id, attack_id] = num correctly classified\n        accuracy_matrix = ResultMatrix()\n        # error_matrix[defense_id, attack_id] = num misclassfied\n        error_matrix = ResultMatrix()\n        # hit_target_class_matrix[defense_id, attack_id] = num hit target class\n        hit_target_class_matrix = ResultMatrix()\n        # processed_images_count[defense_id] = num processed images by defense\n        processed_images_count = {}\n\n        total_count = len(self.data)\n        processed_count = 0\n        logging.info(\"Processing %d files with classification results\", len(self.data))\n        for k, v in iteritems(self.data):\n            if processed_count % 100 == 0:\n                logging.info(\n                    \"Processed %d out of %d classification results\",\n                    processed_count,\n                    total_count,\n                )\n            processed_count += 1\n            defense_id = v[\"submission_id\"]\n            adv_batch = adv_batches.data[v[\"adversarial_batch_id\"]]\n            attack_id = adv_batch[\"submission_id\"]\n\n            work_item = class_batch_to_work.get(k)\n            required_work_stats = [\n                \"stat_correct\",\n                \"stat_error\",\n                \"stat_target_class\",\n                \"stat_num_images\",\n            ]\n            if work_item and work_item[\"error\"]:\n                # ignore batches with error\n                continue\n            if work_item and all(\n                work_item.get(i) is not None for i in required_work_stats\n            ):\n                count_correctly_classified = work_item[\"stat_correct\"]\n                count_errors = work_item[\"stat_error\"]\n                count_hit_target_class = work_item[\"stat_target_class\"]\n                num_images = work_item[\"stat_num_images\"]\n            else:\n                logging.warning(\"Recomputing accuracy for classification batch %s\", k)\n                (\n                    count_correctly_classified,\n                    count_errors,\n                    count_hit_target_class,\n                    num_images,\n                ) = analyze_one_classification_result(\n                    self._storage_client,\n                    v[\"result_path\"],\n                    adv_batch,\n                    dataset_batches,\n                    dataset_meta,\n                )\n\n            # update accuracy and hit target class\n            accuracy_matrix[defense_id, attack_id] += count_correctly_classified\n            error_matrix[defense_id, attack_id] += count_errors\n            hit_target_class_matrix[defense_id, attack_id] += count_hit_target_class\n            # update number of processed images\n            processed_images_count[defense_id] = (\n                processed_images_count.get(defense_id, 0) + num_images\n            )\n        return (\n            accuracy_matrix,\n            error_matrix,\n            hit_target_class_matrix,\n            processed_images_count,\n        )\n\n    def __str__(self):\n        \"\"\"Returns human readable string representation, useful for debugging.\"\"\"\n        buf = StringIO()\n        for idx, (class_batch_id, class_val) in enumerate(iteritems(self.data)):\n            if idx >= TO_STR_MAX_BATCHES:\n                buf.write(u\"  ...\\n\")\n                break\n            buf.write(u'  ClassBatch \"{0}\"\\n'.format(class_batch_id))\n            buf.write(u\"    {0}\\n\".format(str(class_val)))\n        return buf.getvalue()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/cloud_client.py",
    "content": "\"\"\"Helper classes and wrappers to access Google Cloud.\n\nGoogle Cloud API is encapsulated with these wrappers, so it's easier to\ntest the code with help of fake (declared in testing/fake_cloud_client.py).\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport logging\nimport math\nimport random\nimport time\nimport traceback as tb\n\nfrom google.cloud import datastore\nfrom google.cloud import storage\nfrom google.cloud.exceptions import TooManyRequests\n\n# To resolve InsecurePlatformWarning\ntry:\n    import urllib3.contrib.pyopenssl\n\n    urllib3.contrib.pyopenssl.inject_into_urllib3()\n    print(\"Pyopenssl fix for urllib3 succesfully injected.\")\nexcept ImportError:\n    print(\"Failed to inject pyopenssl fix for urllib3.\")\n\n# Cloud Datastore has 500 mutations per batch limit.\nMAX_MUTATIONS_IN_BATCH = 500\n\n\nclass CompetitionStorageClient(object):\n    \"\"\"Client wrapper to access Google Cloud Storage.\"\"\"\n\n    def __init__(self, project_id, bucket_name):\n        \"\"\"Initialize client with project id and name of the storage bucket.\"\"\"\n        self.project_id = project_id\n        self.bucket_name = bucket_name\n        self.client = storage.Client(project=project_id)\n        self.bucket = self.client.get_bucket(bucket_name)\n\n    def list_blobs(self, prefix=\"\"):\n        \"\"\"Lists names of all blobs by their prefix.\"\"\"\n        return [b.name for b in self.bucket.list_blobs(prefix=prefix)]\n\n    def get_blob(self, blob_name):\n        \"\"\"Gets google.cloud.storage.blob.Blob object by blob name.\"\"\"\n        return self.bucket.get_blob(blob_name)\n\n    def new_blob(self, blob_name):\n        \"\"\"Creates new storage blob with provided name.\"\"\"\n        return storage.Blob(blob_name, self.bucket)\n\n\nclass NoTransactionBatch(object):\n    \"\"\"No transaction batch to write large number of entities.\n\n    Usage:\n      client = ...  # instance of CompetitionDatastoreClient\n      with NoTransactionBatch(client) as batch:\n        batch.put(entity1)\n        ...\n        batch.put(entityN)\n        batch.delete(del_entity1)\n        ...\n        batch.delete(del_entityM)\n\n    It could be also used via CompetitionDatastoreClient.no_transact_batch:\n      client = ...  # instance of CompetitionDatastoreClient\n      with client.no_transact_batch() as batch:\n        batch.put(entity1)\n        ...\n        batch.put(entityN)\n        batch.delete(del_entity1)\n        ...\n        batch.delete(del_entityM)\n\n    Most methods of this class are provided to simulate\n    google.cloud.datastore.batch.Batch interface, so they could be used\n    interchangeably.\n    Practically speaking, this class works by maintaining a buffer of\n    pending mutations and committing them as soon as the length of the buffer\n    reaches MAX_MUTATIONS_IN_BATCH.\n    \"\"\"\n\n    def __init__(self, client):\n        \"\"\"Init NoTransactionBatch with provided CompetitionDatastoreClient.\"\"\"\n        self._client = client\n        self._cur_batch = None\n        self._num_mutations = 0\n\n    def begin(self):\n        \"\"\"Begins a batch.\"\"\"\n        if self._cur_batch:\n            raise ValueError(\"Previous batch is not committed.\")\n        self._cur_batch = self._client.batch()\n        self._cur_batch.begin()\n        self._num_mutations = 0\n\n    def commit(self):\n        \"\"\"Commits all pending mutations.\"\"\"\n        self._cur_batch.commit()\n        self._cur_batch = None\n        self._num_mutations = 0\n\n    def rollback(self):\n        \"\"\"Rolls back pending mutations.\n\n        Keep in mind that NoTransactionBatch splits all mutations into smaller\n        batches and commit them as soon as mutation buffer reaches maximum length.\n        That's why rollback method will only roll back pending mutations from the\n        buffer, but won't be able to rollback already committed mutations.\n        \"\"\"\n        try:\n            if self._cur_batch:\n                self._cur_batch.rollback()\n        except ValueError:\n            # ignore \"Batch must be in progress to rollback\" error\n            pass\n        self._cur_batch = None\n        self._num_mutations = 0\n\n    def put(self, entity):\n        \"\"\"Adds mutation of the entity to the mutation buffer.\n\n        If mutation buffer reaches its capacity then this method commit all pending\n        mutations from the buffer and emties it.\n\n        Args:\n          entity: entity which should be put into the datastore\n        \"\"\"\n        self._cur_batch.put(entity)\n        self._num_mutations += 1\n        if self._num_mutations >= MAX_MUTATIONS_IN_BATCH:\n            self.commit()\n            self.begin()\n\n    def delete(self, key):\n        \"\"\"Adds deletion of the entity with given key to the mutation buffer.\n\n        If mutation buffer reaches its capacity then this method commit all pending\n        mutations from the buffer and emties it.\n\n        Args:\n          key: key of the entity which should be deleted\n        \"\"\"\n        self._cur_batch.delete(key)\n        self._num_mutations += 1\n        if self._num_mutations >= MAX_MUTATIONS_IN_BATCH:\n            self.commit()\n            self.begin()\n\n    def __enter__(self):\n        self.begin()\n        return self\n\n    def __exit__(self, exc_type, exc_value, traceback):\n        if exc_type is None:\n            self.commit()\n        else:\n            err = tb.format_exception(exc_type, exc_value, traceback)\n            logging.error(\"Exception occurred during write:\\n%s\", err)\n            self.rollback()\n\n\ndef iterate_with_exp_backoff(\n    base_iter,\n    max_num_tries=6,\n    max_backoff=300.0,\n    start_backoff=4.0,\n    backoff_multiplier=2.0,\n    frac_random_backoff=0.25,\n):\n    \"\"\"Iterate with exponential backoff on failures.\n\n    Useful to wrap results of datastore Query.fetch to avoid 429 error.\n\n    Args:\n      base_iter: basic iterator of generator object\n      max_num_tries: maximum number of tries for each request\n      max_backoff: maximum backoff, in seconds\n      start_backoff: initial value of backoff\n      backoff_multiplier: backoff multiplier\n      frac_random_backoff: fraction of the value of random part of the backoff\n\n    Yields:\n      values of yielded by base iterator\n    \"\"\"\n    try_number = 0\n    if hasattr(base_iter, \"__iter__\"):\n        base_iter = iter(base_iter)\n    while True:\n        try:\n            yield next(base_iter)\n            try_number = 0\n        except StopIteration:\n            break\n        except TooManyRequests as e:\n            logging.warning(\"TooManyRequests error: %s\", tb.format_exc())\n            if try_number >= max_num_tries:\n                logging.error(\"Number of tries exceeded, too many requests: %s\", e)\n                raise\n            # compute sleep time for truncated exponential backoff\n            sleep_time = start_backoff * math.pow(backoff_multiplier, try_number)\n            sleep_time *= 1.0 + frac_random_backoff * random.random()\n            sleep_time = min(sleep_time, max_backoff)\n            logging.warning(\n                \"Too many requests error, \" \"retrying with exponential backoff %.3f\",\n                sleep_time,\n            )\n            time.sleep(sleep_time)\n            try_number += 1\n\n\nclass CompetitionDatastoreClient(object):\n    \"\"\"Client wrapper to access Google Cloud Datastore.\"\"\"\n\n    def __init__(self, project_id, namespace=None):\n        \"\"\"Init this method with given project id and optional namespace.\"\"\"\n        self._client = datastore.Client(project=project_id, namespace=namespace)\n\n    def key(self, *args, **kwargs):\n        \"\"\"Creates datastore key.\"\"\"\n        return self._client.key(*args, **kwargs)\n\n    def entity(self, key):\n        \"\"\"Creates datastore entity.\"\"\"\n        return datastore.Entity(key)\n\n    def no_transact_batch(self):\n        \"\"\"Starts batch of mutation which is committed without transaction.\"\"\"\n        return NoTransactionBatch(self._client)\n\n    def batch(self):\n        \"\"\"Starts batch of mutations.\"\"\"\n        return self._client.batch()\n\n    def transaction(self):\n        \"\"\"Starts transaction.\"\"\"\n        return self._client.transaction()\n\n    def get(self, key, transaction=None):\n        \"\"\"Retrieves an entity given its key.\"\"\"\n        return self._client.get(key, transaction=transaction)\n\n    def query_fetch(self, **kwargs):\n        \"\"\"Queries datastore (using exponential backoff).\"\"\"\n        return iterate_with_exp_backoff(self._client.query(**kwargs).fetch())\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/dataset_helper.py",
    "content": "\"\"\"Various helpers for the dataset.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport csv\nimport hashlib\nimport logging\nimport os\nimport shutil\nimport subprocess\n\nimport numpy as np\nfrom PIL import Image\n\nfrom six import iteritems\n\n\nclass DatasetMetadata(object):\n    \"\"\"Helper class which loads and stores dataset metadata.\n\n    Dataset metadata stored by this class contains true labels and target classes\n    for all images in the dataset.\n    \"\"\"\n\n    def __init__(self, fobj):\n        \"\"\"Initializes instance of DatasetMetadata.\n\n        Args:\n          fobj: file object\n        \"\"\"\n        self._true_labels = {}\n        self._target_classes = {}\n        reader = csv.reader(fobj)\n        header_row = next(reader)\n        try:\n            row_idx_image_id = header_row.index(\"ImageId\")\n            row_idx_true_label = header_row.index(\"TrueLabel\")\n            row_idx_target_class = header_row.index(\"TargetClass\")\n        except ValueError:\n            raise IOError(\"Invalid format of the dataset metadata.\")\n        for row in reader:\n            if len(row) < len(header_row):\n                # skip partial or empty lines\n                continue\n            try:\n                image_id = row[row_idx_image_id]\n                self._true_labels[image_id] = int(row[row_idx_true_label])\n                self._target_classes[image_id] = int(row[row_idx_target_class])\n            except (IndexError, ValueError):\n                raise IOError(\"Invalid format of dataset metadata\")\n\n    def get_true_label(self, image_id):\n        \"\"\"Returns true label for image with given ID.\"\"\"\n        return self._true_labels[image_id]\n\n    def get_target_class(self, image_id):\n        \"\"\"Returns target class for image with given ID.\"\"\"\n        return self._target_classes[image_id]\n\n    def save_target_classes_for_batch(self, filename, image_batches, batch_id):\n        \"\"\"Saves file with target class for given dataset batch.\n\n        Args:\n          filename: output filename\n          image_batches: instance of ImageBatchesBase with dataset batches\n          batch_id: dataset batch ID\n        \"\"\"\n        images = image_batches.data[batch_id][\"images\"]\n        with open(filename, \"w\") as f:\n            for image_id, image_val in iteritems(images):\n                target_class = self.get_target_class(image_val[\"dataset_image_id\"])\n                f.write(\"{0}.png,{1}\\n\".format(image_id, target_class))\n\n\ndef enforce_epsilon_and_compute_hash(dataset_batch_dir, adv_dir, output_dir, epsilon):\n    \"\"\"Enforces size of perturbation on images, and compute hashes for all images.\n\n    Args:\n      dataset_batch_dir: directory with the images of specific dataset batch\n      adv_dir: directory with generated adversarial images\n      output_dir: directory where to copy result\n      epsilon: size of perturbation\n\n    Returns:\n      dictionary with mapping form image ID to hash.\n    \"\"\"\n    dataset_images = [f for f in os.listdir(dataset_batch_dir) if f.endswith(\".png\")]\n    image_hashes = {}\n    resize_warning = False\n    for img_name in dataset_images:\n        if not os.path.exists(os.path.join(adv_dir, img_name)):\n            logging.warning(\"Image %s not found in the output\", img_name)\n            continue\n        image = np.array(\n            Image.open(os.path.join(dataset_batch_dir, img_name)).convert(\"RGB\")\n        )\n        image = image.astype(\"int32\")\n        image_max_clip = np.clip(image + epsilon, 0, 255).astype(\"uint8\")\n        image_min_clip = np.clip(image - epsilon, 0, 255).astype(\"uint8\")\n        # load and resize adversarial image if needed\n        adv_image = Image.open(os.path.join(adv_dir, img_name)).convert(\"RGB\")\n        # Image.size is reversed compared to np.array.shape\n        if adv_image.size[::-1] != image.shape[:2]:\n            resize_warning = True\n            adv_image = adv_image.resize(\n                (image.shape[1], image.shape[0]), Image.BICUBIC\n            )\n        adv_image = np.array(adv_image)\n        clipped_adv_image = np.clip(adv_image, image_min_clip, image_max_clip)\n        Image.fromarray(clipped_adv_image).save(os.path.join(output_dir, img_name))\n        # compute hash\n        image_hashes[img_name[:-4]] = hashlib.sha1(\n            clipped_adv_image.view(np.uint8)\n        ).hexdigest()\n    if resize_warning:\n        logging.warning(\"One or more adversarial images had incorrect size\")\n    return image_hashes\n\n\ndef download_dataset(\n    storage_client, image_batches, target_dir, local_dataset_copy=None\n):\n    \"\"\"Downloads dataset, organize it by batches and rename images.\n\n    Args:\n      storage_client: instance of the CompetitionStorageClient\n      image_batches: subclass of ImageBatchesBase with data about images\n      target_dir: target directory, should exist and be empty\n      local_dataset_copy: directory with local dataset copy, if local copy is\n        available then images will be takes from there instead of Cloud Storage\n\n    Data in the target directory will be organized into subdirectories by batches,\n    thus path to each image will be \"target_dir/BATCH_ID/IMAGE_ID.png\"\n    where BATCH_ID - ID of the batch (key of image_batches.data),\n    IMAGE_ID - ID of the image (key of image_batches.data[batch_id]['images'])\n    \"\"\"\n    for batch_id, batch_value in iteritems(image_batches.data):\n        batch_dir = os.path.join(target_dir, batch_id)\n        os.mkdir(batch_dir)\n        for image_id, image_val in iteritems(batch_value[\"images\"]):\n            dst_filename = os.path.join(batch_dir, image_id + \".png\")\n            # try to use local copy first\n            if local_dataset_copy:\n                local_filename = os.path.join(\n                    local_dataset_copy, os.path.basename(image_val[\"image_path\"])\n                )\n                if os.path.exists(local_filename):\n                    shutil.copyfile(local_filename, dst_filename)\n                    continue\n            # download image from cloud\n            cloud_path = (\n                \"gs://\" + storage_client.bucket_name + \"/\" + image_val[\"image_path\"]\n            )\n            if not os.path.exists(dst_filename):\n                subprocess.call([\"gsutil\", \"cp\", cloud_path, dst_filename])\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/image_batches.py",
    "content": "\"\"\"Module with classes to read and store image batches.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport copy\nfrom io import BytesIO\nfrom io import StringIO\nimport itertools\nimport logging\nimport os\nimport zipfile\n\nfrom six import iteritems\nfrom six import iterkeys\nfrom six import itervalues\n\n\n# Cloud Datastore constants\nKIND_DATASET_BATCH = u\"DatasetBatch\"\nKIND_DATASET_IMAGE = u\"DatasetImage\"\nKIND_ADVERSARIAL_BATCH = u\"AdversarialBatch\"\nKIND_ADVERSARIAL_IMAGE = u\"AdversarialImage\"\n\n# Cloud Datastore ID patterns\nDATASET_BATCH_ID_PATTERN = u\"BATCH{:03}\"\nDATASET_IMAGE_ID_PATTERN = u\"IMG{:06}\"\nADVERSARIAL_BATCH_ID_PATTERN = u\"ADVBATCH{:03}\"\nADVERSARIAL_IMAGE_ID_PATTERN = u\"ADV{:06}\"\n\n# Default list of possible adversarial peturbations\nDEFAULT_EPSILON = [4, 8, 12, 16]\n\n# Constants for __str__\nTO_STR_MAX_BATCHES = 5\nTO_STR_MAX_IMAGES_PER_BATCH = 10\n\n\nclass ImageBatchesBase(object):\n    \"\"\"Base class to store image batches.\n\n    Subclasses of this class are used to store batches of images from the dataset\n    or batches of adversarial images.\n    \"\"\"\n\n    def __init__(self, datastore_client, entity_kind_batches, entity_kind_images):\n        \"\"\"Initialize ImageBatchesBase.\n\n        Args:\n          datastore_client: instance of the CompetitionDatastoreClient\n          entity_kind_batches: Cloud Datastore entity kind which is used to store\n            batches of images.\n          entity_kind_images: Cloud Datastore entity kind which is used to store\n            individual images.\n        \"\"\"\n        self._datastore_client = datastore_client\n        self._entity_kind_batches = entity_kind_batches\n        self._entity_kind_images = entity_kind_images\n        # data is a dictionary with following structure:\n        #  self._data[batch_id] = {\n        #    'batch_k1': batch_v1,\n        #    ...\n        #    'batch_kN': batch_vN,\n        #    'images': {\n        #      image_id: { 'img_k1': img_v1, ... }\n        #    }\n        #  }\n        self._data = {}\n\n    def _write_single_batch_images_internal(self, batch_id, client_batch):\n        \"\"\"Helper method to write images from single batch into datastore.\"\"\"\n        client = self._datastore_client\n        batch_key = client.key(self._entity_kind_batches, batch_id)\n        for img_id, img in iteritems(self._data[batch_id][\"images\"]):\n            img_entity = client.entity(\n                client.key(self._entity_kind_images, img_id, parent=batch_key)\n            )\n            for k, v in iteritems(img):\n                img_entity[k] = v\n            client_batch.put(img_entity)\n\n    def write_to_datastore(self):\n        \"\"\"Writes all image batches to the datastore.\"\"\"\n        client = self._datastore_client\n        with client.no_transact_batch() as client_batch:\n            for batch_id, batch_data in iteritems(self._data):\n                batch_key = client.key(self._entity_kind_batches, batch_id)\n                batch_entity = client.entity(batch_key)\n                for k, v in iteritems(batch_data):\n                    if k != \"images\":\n                        batch_entity[k] = v\n                client_batch.put(batch_entity)\n                self._write_single_batch_images_internal(batch_id, client_batch)\n\n    def write_single_batch_images_to_datastore(self, batch_id):\n        \"\"\"Writes only images from one batch to the datastore.\"\"\"\n        client = self._datastore_client\n        with client.no_transact_batch() as client_batch:\n            self._write_single_batch_images_internal(batch_id, client_batch)\n\n    def init_from_datastore(self):\n        \"\"\"Initializes batches by reading from the datastore.\"\"\"\n        self._data = {}\n        for entity in self._datastore_client.query_fetch(\n            kind=self._entity_kind_batches\n        ):\n            batch_id = entity.key.flat_path[-1]\n            self._data[batch_id] = dict(entity)\n            self._data[batch_id][\"images\"] = {}\n        for entity in self._datastore_client.query_fetch(kind=self._entity_kind_images):\n            batch_id = entity.key.flat_path[-3]\n            image_id = entity.key.flat_path[-1]\n            self._data[batch_id][\"images\"][image_id] = dict(entity)\n\n    @property\n    def data(self):\n        \"\"\"Dictionary with data.\"\"\"\n        return self._data\n\n    def __getitem__(self, key):\n        \"\"\"Returns specific batch by its key.\"\"\"\n        return self._data[key]\n\n    def add_batch(self, batch_id, batch_properties=None):\n        \"\"\"Adds batch with give ID and list of properties.\"\"\"\n        if batch_properties is None:\n            batch_properties = {}\n        if not isinstance(batch_properties, dict):\n            raise ValueError(\n                \"batch_properties has to be dict, however it was: \"\n                + str(type(batch_properties))\n            )\n        self._data[batch_id] = batch_properties.copy()\n        self._data[batch_id][\"images\"] = {}\n\n    def add_image(self, batch_id, image_id, image_properties=None):\n        \"\"\"Adds image to given batch.\"\"\"\n        if batch_id not in self._data:\n            raise KeyError('Batch with ID \"{0}\" does not exist'.format(batch_id))\n        if image_properties is None:\n            image_properties = {}\n        if not isinstance(image_properties, dict):\n            raise ValueError(\n                \"image_properties has to be dict, however it was: \"\n                + str(type(image_properties))\n            )\n        self._data[batch_id][\"images\"][image_id] = image_properties.copy()\n\n    def count_num_images(self):\n        \"\"\"Counts total number of images in all batches.\"\"\"\n        return sum([len(v[\"images\"]) for v in itervalues(self.data)])\n\n    def __str__(self):\n        \"\"\"Returns human readable representation, which is useful for debugging.\"\"\"\n        buf = StringIO()\n        for batch_idx, (batch_id, batch_val) in enumerate(iteritems(self.data)):\n            if batch_idx >= TO_STR_MAX_BATCHES:\n                buf.write(u\"...\\n\")\n                break\n            buf.write(u'BATCH \"{0}\"\\n'.format(batch_id))\n            for k, v in iteritems(batch_val):\n                if k != \"images\":\n                    buf.write(u\"  {0}: {1}\\n\".format(k, v))\n            for img_idx, img_id in enumerate(iterkeys(batch_val[\"images\"])):\n                if img_idx >= TO_STR_MAX_IMAGES_PER_BATCH:\n                    buf.write(u\"  ...\")\n                    break\n                buf.write(\n                    u'  IMAGE \"{0}\" -- {1}\\n'.format(\n                        img_id, batch_val[\"images\"][img_id]\n                    )\n                )\n            buf.write(u\"\\n\")\n        return buf.getvalue()\n\n\nclass DatasetBatches(ImageBatchesBase):\n    \"\"\"Class which stores batches of images from the dataset.\"\"\"\n\n    def __init__(self, datastore_client, storage_client, dataset_name):\n        \"\"\"Initializes DatasetBatches.\n\n        Args:\n          datastore_client: instance of CompetitionDatastoreClient\n          storage_client: instance of CompetitionStorageClient\n          dataset_name: name of the dataset ('dev' or 'final')\n        \"\"\"\n        super(DatasetBatches, self).__init__(\n            datastore_client=datastore_client,\n            entity_kind_batches=KIND_DATASET_BATCH,\n            entity_kind_images=KIND_DATASET_IMAGE,\n        )\n        self._storage_client = storage_client\n        self._dataset_name = dataset_name\n\n    def _read_image_list(self, skip_image_ids=None):\n        \"\"\"Reads list of dataset images from the datastore.\"\"\"\n        if skip_image_ids is None:\n            skip_image_ids = []\n        images = self._storage_client.list_blobs(\n            prefix=os.path.join(\"dataset\", self._dataset_name) + \"/\"\n        )\n        zip_files = [i for i in images if i.endswith(\".zip\")]\n        if len(zip_files) == 1:\n            # we have a zip archive with images\n            zip_name = zip_files[0]\n            logging.info(\"Reading list of images from zip file %s\", zip_name)\n            blob = self._storage_client.get_blob(zip_name)\n            buf = BytesIO()\n            logging.info(\"Downloading zip\")\n            blob.download_to_file(buf)\n            buf.seek(0)\n            logging.info(\"Reading content of the zip\")\n            with zipfile.ZipFile(buf) as f:\n                images = [\n                    os.path.join(zip_name, os.path.basename(n))\n                    for n in f.namelist()\n                    if n.endswith(\".png\")\n                ]\n            buf.close()\n            logging.info(\"Found %d images\", len(images))\n        else:\n            # we have just a directory with images, filter non-PNG files\n            logging.info(\"Reading list of images from png files in storage\")\n            images = [i for i in images if i.endswith(\".png\")]\n            logging.info(\"Found %d images\", len(images))\n        # filter images which should be skipped\n        images = [i for i in images if os.path.basename(i)[:-4] not in skip_image_ids]\n        # assign IDs to images\n        images = [\n            (DATASET_IMAGE_ID_PATTERN.format(idx), i)\n            for idx, i in enumerate(sorted(images))\n        ]\n        return images\n\n    def init_from_storage_write_to_datastore(\n        self,\n        batch_size=100,\n        allowed_epsilon=None,\n        skip_image_ids=None,\n        max_num_images=None,\n    ):\n        \"\"\"Initializes dataset batches from the list of images in the datastore.\n\n        Args:\n          batch_size: batch size\n          allowed_epsilon: list of allowed epsilon or None to use default\n          skip_image_ids: list of image ids to skip\n          max_num_images: maximum number of images to read\n        \"\"\"\n        if allowed_epsilon is None:\n            allowed_epsilon = copy.copy(DEFAULT_EPSILON)\n        # init dataset batches from data in storage\n        self._dataset_batches = {}\n        # read all blob names from storage\n        images = self._read_image_list(skip_image_ids)\n        if max_num_images:\n            images = images[:max_num_images]\n        for batch_idx, batch_start in enumerate(range(0, len(images), batch_size)):\n            batch = images[batch_start : batch_start + batch_size]\n            batch_id = DATASET_BATCH_ID_PATTERN.format(batch_idx)\n            batch_epsilon = allowed_epsilon[batch_idx % len(allowed_epsilon)]\n            self.add_batch(batch_id, {\"epsilon\": batch_epsilon})\n            for image_id, image_path in batch:\n                self.add_image(\n                    batch_id,\n                    image_id,\n                    {\n                        \"dataset_image_id\": os.path.basename(image_path)[:-4],\n                        \"image_path\": image_path,\n                    },\n                )\n        # write data to datastore\n        self.write_to_datastore()\n\n\nclass AversarialBatches(ImageBatchesBase):\n    \"\"\"Class which stores batches of adversarial images generated by attacks.\"\"\"\n\n    def __init__(self, datastore_client):\n        \"\"\"Initializes AversarialBatches.\n\n        Args:\n          datastore_client: instance of CompetitionDatastoreClient\n        \"\"\"\n        super(AversarialBatches, self).__init__(\n            datastore_client=datastore_client,\n            entity_kind_batches=KIND_ADVERSARIAL_BATCH,\n            entity_kind_images=KIND_ADVERSARIAL_IMAGE,\n        )\n\n    def init_from_dataset_and_submissions_write_to_datastore(\n        self, dataset_batches, attack_submission_ids\n    ):\n        \"\"\"Init list of adversarial batches from dataset batches and submissions.\n\n        Args:\n          dataset_batches: instances of DatasetBatches\n          attack_submission_ids: iterable with IDs of all (targeted and nontargeted)\n            attack submissions, could be obtains as\n            CompetitionSubmissions.get_all_attack_ids()\n        \"\"\"\n        batches_x_attacks = itertools.product(\n            dataset_batches.data.keys(), attack_submission_ids\n        )\n        for idx, (dataset_batch_id, attack_id) in enumerate(batches_x_attacks):\n            adv_batch_id = ADVERSARIAL_BATCH_ID_PATTERN.format(idx)\n            self.add_batch(\n                adv_batch_id,\n                {\"dataset_batch_id\": dataset_batch_id, \"submission_id\": attack_id},\n            )\n        self.write_to_datastore()\n\n    def count_generated_adv_examples(self):\n        \"\"\"Returns total number of all generated adversarial examples.\"\"\"\n        result = {}\n        for v in itervalues(self.data):\n            s_id = v[\"submission_id\"]\n            result[s_id] = result.get(s_id, 0) + len(v[\"images\"])\n        return result\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/submissions.py",
    "content": "\"\"\"Classes and functions to manage submissions.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nfrom collections import namedtuple\nfrom io import StringIO\nimport os\nfrom six import iteritems\n\n# Cloud Storage directories\nATTACK_SUBDIR = \"submissions/nontargeted\"\nTARGETED_ATTACK_SUBDIR = \"submissions/targeted\"\nDEFENSE_SUBDIR = \"submissions/defense\"\n\n# Cloud Datastore entity keys\nATTACKS_ENTITY_KEY = [u\"SubmissionType\", u\"Attacks\"]\nTARGET_ATTACKS_ENTITY_KEY = [u\"SubmissionType\", u\"TargetedAttacks\"]\nDEFENSES_ENTITY_KEY = [u\"SubmissionType\", u\"Defenses\"]\nKIND_SUBMISSION = u\"Submission\"\n\n# Cloud Datastore ID patterns\nATTACK_ID_PATTERN = u\"SUBA{:03}\"\nTARGETED_ATTACK_ID_PATTERN = u\"SUBT{:03}\"\nDEFENSE_ID_PATTERN = u\"SUBD{:03}\"\n\n# Constants for __str__\nTO_STR_MAX_SUBMISSIONS = 5\n\nALLOWED_EXTENSIONS = [\".zip\", \".tar\", \".tar.gz\"]\n\n\ndef participant_from_submission_path(submission_path):\n    \"\"\"Parses type of participant based on submission filename.\n\n    Args:\n      submission_path: path to the submission in Google Cloud Storage\n\n    Returns:\n      dict with one element. Element key correspond to type of participant\n      (team, baseline), element value is ID of the participant.\n\n    Raises:\n      ValueError: is participant can't be determined based on submission path.\n    \"\"\"\n    basename = os.path.basename(submission_path)\n    file_ext = None\n    for e in ALLOWED_EXTENSIONS:\n        if basename.endswith(e):\n            file_ext = e\n            break\n    if not file_ext:\n        raise ValueError(\"Invalid submission path: \" + submission_path)\n    basename = basename[: -len(file_ext)]\n    if basename.isdigit():\n        return {\"team_id\": int(basename)}\n    if basename.startswith(\"baseline_\"):\n        return {\"baseline_id\": basename[len(\"baseline_\") :]}\n    raise ValueError(\"Invalid submission path: \" + submission_path)\n\n\nSubmissionDescriptor = namedtuple(\"SubmissionDescriptor\", [\"path\", \"participant_id\"])\n\n\nclass CompetitionSubmissions(object):\n    \"\"\"Class which holds information about all submissions.\n\n    All submissions are stored in 3 dictionaries, one for targeted attacks,\n    one for non-targeted attacks and one for defenses.\n    All submissions are identified using internal competition ID,\n    which looks like 'SUB????'. Additionally each submission has external\n    identified which could be name of baseline or Kaggle ID.\n    External ID only used when list of submissions is formed and when\n    scorebored is built. Internal submission IDs are used for all actual\n    evaluation. Thus all identifiers are internal IDs unless otherwise noted.\n    \"\"\"\n\n    def __init__(self, datastore_client, storage_client, round_name):\n        \"\"\"Initializes CompetitionSubmissions.\n\n        Args:\n          datastore_client: instance of CompetitionDatastoreClient\n          storage_client: instance of CompetitionStorageClient\n          round_name: name of the round\n        \"\"\"\n        self._datastore_client = datastore_client\n        self._storage_client = storage_client\n        self._round_name = round_name\n        # each of the variables is a dictionary,\n        # where key - submission ID\n        # value - SubmissionDescriptor namedtuple\n        self._attacks = None\n        self._targeted_attacks = None\n        self._defenses = None\n\n    def _load_submissions_from_datastore_dir(self, dir_suffix, id_pattern):\n        \"\"\"Loads list of submissions from the directory.\n\n        Args:\n          dir_suffix: suffix of the directory where submissions are stored,\n            one of the folowing constants: ATTACK_SUBDIR, TARGETED_ATTACK_SUBDIR\n            or DEFENSE_SUBDIR.\n          id_pattern: pattern which is used to generate (internal) IDs\n            for submissins. One of the following constants: ATTACK_ID_PATTERN,\n            TARGETED_ATTACK_ID_PATTERN or DEFENSE_ID_PATTERN.\n\n        Returns:\n          dictionary with all found submissions\n        \"\"\"\n        submissions = self._storage_client.list_blobs(\n            prefix=os.path.join(self._round_name, dir_suffix)\n        )\n        return {\n            id_pattern.format(idx): SubmissionDescriptor(\n                path=s, participant_id=participant_from_submission_path(s)\n            )\n            for idx, s in enumerate(submissions)\n        }\n\n    def init_from_storage_write_to_datastore(self):\n        \"\"\"Init list of sumibssions from Storage and saves them to Datastore.\n\n        Should be called only once (typically by master) during evaluation of\n        the competition.\n        \"\"\"\n        # Load submissions\n        self._attacks = self._load_submissions_from_datastore_dir(\n            ATTACK_SUBDIR, ATTACK_ID_PATTERN\n        )\n        self._targeted_attacks = self._load_submissions_from_datastore_dir(\n            TARGETED_ATTACK_SUBDIR, TARGETED_ATTACK_ID_PATTERN\n        )\n        self._defenses = self._load_submissions_from_datastore_dir(\n            DEFENSE_SUBDIR, DEFENSE_ID_PATTERN\n        )\n        self._write_to_datastore()\n\n    def _write_to_datastore(self):\n        \"\"\"Writes all submissions to datastore.\"\"\"\n        # Populate datastore\n        roots_and_submissions = zip(\n            [ATTACKS_ENTITY_KEY, TARGET_ATTACKS_ENTITY_KEY, DEFENSES_ENTITY_KEY],\n            [self._attacks, self._targeted_attacks, self._defenses],\n        )\n        client = self._datastore_client\n        with client.no_transact_batch() as batch:\n            for root_key, submissions in roots_and_submissions:\n                batch.put(client.entity(client.key(*root_key)))\n                for k, v in iteritems(submissions):\n                    entity = client.entity(\n                        client.key(*(root_key + [KIND_SUBMISSION, k]))\n                    )\n                    entity[\"submission_path\"] = v.path\n                    entity.update(participant_from_submission_path(v.path))\n                    batch.put(entity)\n\n    def init_from_datastore(self):\n        \"\"\"Init list of submission from Datastore.\n\n        Should be called by each worker during initialization.\n        \"\"\"\n        self._attacks = {}\n        self._targeted_attacks = {}\n        self._defenses = {}\n        for entity in self._datastore_client.query_fetch(kind=KIND_SUBMISSION):\n            submission_id = entity.key.flat_path[-1]\n            submission_path = entity[\"submission_path\"]\n            participant_id = {\n                k: entity[k] for k in [\"team_id\", \"baseline_id\"] if k in entity\n            }\n            submission_descr = SubmissionDescriptor(\n                path=submission_path, participant_id=participant_id\n            )\n            if list(entity.key.flat_path[0:2]) == ATTACKS_ENTITY_KEY:\n                self._attacks[submission_id] = submission_descr\n            elif list(entity.key.flat_path[0:2]) == TARGET_ATTACKS_ENTITY_KEY:\n                self._targeted_attacks[submission_id] = submission_descr\n            elif list(entity.key.flat_path[0:2]) == DEFENSES_ENTITY_KEY:\n                self._defenses[submission_id] = submission_descr\n\n    @property\n    def attacks(self):\n        \"\"\"Dictionary with all non-targeted attacks.\"\"\"\n        return self._attacks\n\n    @property\n    def targeted_attacks(self):\n        \"\"\"Dictionary with all targeted attacks.\"\"\"\n        return self._targeted_attacks\n\n    @property\n    def defenses(self):\n        \"\"\"Dictionary with all defenses.\"\"\"\n        return self._defenses\n\n    def get_all_attack_ids(self):\n        \"\"\"Returns IDs of all attacks (targeted and non-targeted).\"\"\"\n        return list(self.attacks.keys()) + list(self.targeted_attacks.keys())\n\n    def find_by_id(self, submission_id):\n        \"\"\"Finds submission by ID.\n\n        Args:\n          submission_id: ID of the submission\n\n        Returns:\n          SubmissionDescriptor with information about submission or None if\n          submission is not found.\n        \"\"\"\n        return self._attacks.get(\n            submission_id,\n            self._defenses.get(\n                submission_id, self._targeted_attacks.get(submission_id, None)\n            ),\n        )\n\n    def get_external_id(self, submission_id):\n        \"\"\"Returns human readable submission external ID.\n\n        Args:\n          submission_id: internal submission ID.\n\n        Returns:\n          human readable ID.\n        \"\"\"\n        submission = self.find_by_id(submission_id)\n        if not submission:\n            return None\n        if \"team_id\" in submission.participant_id:\n            return submission.participant_id[\"team_id\"]\n        elif \"baseline_id\" in submission.participant_id:\n            return \"baseline_\" + submission.participant_id[\"baseline_id\"]\n        else:\n            return \"\"\n\n    def __str__(self):\n        \"\"\"Returns human readable representation, useful for debugging purposes.\"\"\"\n        buf = StringIO()\n        title_values = zip(\n            [u\"Attacks\", u\"Targeted Attacks\", u\"Defenses\"],\n            [self._attacks, self._targeted_attacks, self._defenses],\n        )\n        for idx, (title, values) in enumerate(title_values):\n            if idx >= TO_STR_MAX_SUBMISSIONS:\n                buf.write(\"...\\n\")\n                break\n            buf.write(title)\n            buf.write(u\":\\n\")\n            for k, v in iteritems(values):\n                buf.write(\n                    u\"{0} -- {1}   {2}\\n\".format(k, v.path, str(v.participant_id))\n                )\n            buf.write(u\"\\n\")\n        return buf.getvalue()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/__init__.py",
    "content": ""
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/classification_results_test.py",
    "content": "\"\"\"Tests for eval_lib.classification_results.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport unittest\n\nfrom six import assertCountEqual\n\nfrom eval_lib import classification_results\nfrom eval_lib import image_batches\nfrom eval_lib import submissions\nfrom eval_lib import work_data\nfrom eval_lib.tests import fake_cloud_client\n\n\nROUND_NAME = \"round-name\"\n\n\nclass FakeDatasetMeta(object):\n    \"\"\"Fake for DatasetMetadata which alwasy returns constants.\"\"\"\n\n    def get_true_label(self, _):\n        return 1\n\n    def get_target_class(self, _):\n        return 2\n\n\nclass ClassificationResultsTest(unittest.TestCase):\n    def setUp(self):\n        self.storage_client = fake_cloud_client.FakeStorageClient()\n        self.datastore_client = fake_cloud_client.FakeDatastoreClient()\n        self.submissions = submissions.CompetitionSubmissions(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            round_name=ROUND_NAME,\n        )\n        # we only need list of submissin ids in CompetitionSubmissions for this test\n        self.submissions._defenses = {\n            \"SUBD000\": {},\n            \"SUBD001\": {},\n        }\n        self.adv_batches = image_batches.AversarialBatches(\n            datastore_client=self.datastore_client\n        )\n        self.adv_batches._data = {\n            \"ADVBATCH000\": {\n                \"dataset_batch_id\": \"BATCH000\",\n                \"images\": {},\n                \"submission_id\": \"SUBA000\",\n            },\n            \"ADVBATCH001\": {\n                \"dataset_batch_id\": \"BATCH000\",\n                \"images\": {},\n                \"submission_id\": \"SUBA001\",\n            },\n            \"ADVBATCH002\": {\n                \"dataset_batch_id\": \"BATCH000\",\n                \"images\": {},\n                \"submission_id\": \"SUBT000\",\n            },\n        }\n\n    def verify_classification_batches(self, class_batches):\n        assertCountEqual(\n            self,\n            [\n                {\n                    \"adversarial_batch_id\": \"ADVBATCH000\",\n                    \"submission_id\": \"SUBD000\",\n                    \"result_path\": (\n                        ROUND_NAME + \"/classification_batches/SUBD000_ADVBATCH000.csv\"\n                    ),\n                },\n                {\n                    \"adversarial_batch_id\": \"ADVBATCH000\",\n                    \"submission_id\": \"SUBD001\",\n                    \"result_path\": (\n                        ROUND_NAME + \"/classification_batches/SUBD001_ADVBATCH000.csv\"\n                    ),\n                },\n                {\n                    \"adversarial_batch_id\": \"ADVBATCH001\",\n                    \"submission_id\": \"SUBD000\",\n                    \"result_path\": (\n                        ROUND_NAME + \"/classification_batches/SUBD000_ADVBATCH001.csv\"\n                    ),\n                },\n                {\n                    \"adversarial_batch_id\": \"ADVBATCH001\",\n                    \"submission_id\": \"SUBD001\",\n                    \"result_path\": (\n                        ROUND_NAME + \"/classification_batches/SUBD001_ADVBATCH001.csv\"\n                    ),\n                },\n                {\n                    \"adversarial_batch_id\": \"ADVBATCH002\",\n                    \"submission_id\": \"SUBD000\",\n                    \"result_path\": (\n                        ROUND_NAME + \"/classification_batches/SUBD000_ADVBATCH002.csv\"\n                    ),\n                },\n                {\n                    \"adversarial_batch_id\": \"ADVBATCH002\",\n                    \"submission_id\": \"SUBD001\",\n                    \"result_path\": (\n                        ROUND_NAME + \"/classification_batches/SUBD001_ADVBATCH002.csv\"\n                    ),\n                },\n            ],\n            class_batches.data.values(),\n        )\n\n    def test_init_from_adv_batches_and_submissions(self):\n        class_batches = classification_results.ClassificationBatches(\n            self.datastore_client, self.storage_client, ROUND_NAME\n        )\n        class_batches.init_from_adversarial_batches_write_to_datastore(\n            self.submissions, self.adv_batches\n        )\n        self.verify_classification_batches(class_batches)\n        class_batches = classification_results.ClassificationBatches(\n            self.datastore_client, self.storage_client, ROUND_NAME\n        )\n        class_batches.init_from_datastore()\n        self.verify_classification_batches(class_batches)\n\n    def test_read_batch_from_datastore(self):\n        class_batches = classification_results.ClassificationBatches(\n            self.datastore_client, self.storage_client, ROUND_NAME\n        )\n        class_batches.init_from_adversarial_batches_write_to_datastore(\n            self.submissions, self.adv_batches\n        )\n        class_batches = classification_results.ClassificationBatches(\n            self.datastore_client, self.storage_client, ROUND_NAME\n        )\n        # read first batch from datastore and verify that only one batch was read\n        batch = class_batches.read_batch_from_datastore(\"CBATCH000000\")\n        self.assertEqual(0, len(class_batches.data))\n        assertCountEqual(\n            self, [\"result_path\", \"adversarial_batch_id\", \"submission_id\"], batch.keys()\n        )\n\n    def test_compute_classification_results_from_defense_work(self):\n        # Test computation of the results for the following case:\n        # - one dataset batch BATCH000 with 5 images\n        # - two defenses: SUBD000, SUBD001\n        # - three attacks with corresponding adversarial batches:\n        #      SUBA000 - ADVBATCH000\n        #      SUBA001 - ADVBATCH001\n        #      SUBT000 - ADVBATCH002\n        #\n        # Results are following (correct/incorrect/hit tc/total adv img):\n        #            |      SUBD000     |      SUBD001     |\n        #  ----------+------------------+------------------+\n        #   SUBA000  | defense error    |  3 / 1 / 0 / 4   |\n        #            |   WORK000        |   WORK001        |\n        #  ----------+------------------+------------------+\n        #   SUBA001  | 2 / 2 / 1 / 5    |  4 / 1 / 0 / 5   |\n        #            |   WORK002        |   WORK003        |\n        #  ----------+------------------+------------------+\n        #   SUBT000  | 1 / 4 / 4 / 5    |  3 / 2 / 1 / 5   |\n        #            |   WORK004        |   WORK005        |\n\n        class_batches = classification_results.ClassificationBatches(\n            self.datastore_client, self.storage_client, ROUND_NAME\n        )\n        result_path_prefix = ROUND_NAME + \"/classification_batches/\"\n        class_batches._data = {\n            \"CBATCH000000\": {\n                \"adversarial_batch_id\": \"ADVBATCH000\",\n                \"submission_id\": \"SUBD000\",\n                \"result_path\": result_path_prefix + \"SUBD000_ADVBATCH000.csv\",\n            },\n            \"CBATCH000001\": {\n                \"adversarial_batch_id\": \"ADVBATCH000\",\n                \"submission_id\": \"SUBD001\",\n                \"result_path\": result_path_prefix + \"SUBD001_ADVBATCH000.csv\",\n            },\n            \"CBATCH000002\": {\n                \"adversarial_batch_id\": \"ADVBATCH001\",\n                \"submission_id\": \"SUBD000\",\n                \"result_path\": result_path_prefix + \"SUBD000_ADVBATCH001.csv\",\n            },\n            \"CBATCH000003\": {\n                \"adversarial_batch_id\": \"ADVBATCH001\",\n                \"submission_id\": \"SUBD001\",\n                \"result_path\": result_path_prefix + \"SUBD001_ADVBATCH001.csv\",\n            },\n            \"CBATCH000004\": {\n                \"adversarial_batch_id\": \"ADVBATCH002\",\n                \"submission_id\": \"SUBD000\",\n                \"result_path\": result_path_prefix + \"SUBD000_ADVBATCH002.csv\",\n            },\n            \"CBATCH000005\": {\n                \"adversarial_batch_id\": \"ADVBATCH002\",\n                \"submission_id\": \"SUBD001\",\n                \"result_path\": result_path_prefix + \"SUBD001_ADVBATCH002.csv\",\n            },\n        }\n        defense_work = work_data.DefenseWorkPieces(self.datastore_client)\n        defense_work._work = {\n            \"WORK000\": {\n                \"output_classification_batch_id\": \"CBATCH000000\",\n                \"error\": \"error\",\n            },\n            \"WORK001\": {\n                \"output_classification_batch_id\": \"CBATCH000001\",\n                \"stat_correct\": 3,\n                \"stat_error\": 1,\n                \"stat_target_class\": 0,\n                \"stat_num_images\": 4,\n                \"error\": None,\n            },\n            \"WORK002\": {\n                \"output_classification_batch_id\": \"CBATCH000002\",\n                \"stat_correct\": 2,\n                \"stat_error\": 2,\n                \"stat_target_class\": 1,\n                \"stat_num_images\": 5,\n                \"error\": None,\n            },\n            \"WORK003\": {\n                \"output_classification_batch_id\": \"CBATCH000003\",\n                \"stat_correct\": 4,\n                \"stat_error\": 1,\n                \"stat_target_class\": 0,\n                \"stat_num_images\": 5,\n                \"error\": None,\n            },\n            \"WORK004\": {\n                \"output_classification_batch_id\": \"CBATCH000004\",\n                \"stat_correct\": 1,\n                \"stat_error\": 4,\n                \"stat_target_class\": 4,\n                \"stat_num_images\": 5,\n                \"error\": None,\n            },\n            \"WORK005\": {\n                \"output_classification_batch_id\": \"CBATCH000005\",\n                \"stat_correct\": 3,\n                \"stat_error\": 2,\n                \"stat_target_class\": 1,\n                \"stat_num_images\": 5,\n                \"error\": None,\n            },\n        }\n        # Compute and verify results\n        (\n            accuracy_matrix,\n            error_matrix,\n            hit_target_class_matrix,\n            processed_images_count,\n        ) = class_batches.compute_classification_results(\n            self.adv_batches,\n            dataset_batches=None,\n            dataset_meta=None,\n            defense_work=defense_work,\n        )\n        self.assertDictEqual(\n            {\n                (\"SUBD001\", \"SUBA000\"): 3,\n                (\"SUBD000\", \"SUBA001\"): 2,\n                (\"SUBD001\", \"SUBA001\"): 4,\n                (\"SUBD000\", \"SUBT000\"): 1,\n                (\"SUBD001\", \"SUBT000\"): 3,\n            },\n            accuracy_matrix._items,\n        )\n        self.assertDictEqual(\n            {\n                (\"SUBD001\", \"SUBA000\"): 1,\n                (\"SUBD000\", \"SUBA001\"): 2,\n                (\"SUBD001\", \"SUBA001\"): 1,\n                (\"SUBD000\", \"SUBT000\"): 4,\n                (\"SUBD001\", \"SUBT000\"): 2,\n            },\n            error_matrix._items,\n        )\n        self.assertDictEqual(\n            {\n                (\"SUBD001\", \"SUBA000\"): 0,\n                (\"SUBD000\", \"SUBA001\"): 1,\n                (\"SUBD001\", \"SUBA001\"): 0,\n                (\"SUBD000\", \"SUBT000\"): 4,\n                (\"SUBD001\", \"SUBT000\"): 1,\n            },\n            hit_target_class_matrix._items,\n        )\n        self.assertDictEqual({\"SUBD000\": 10, \"SUBD001\": 14}, processed_images_count)\n\n    def test_read_classification_results(self):\n        self.storage_client = fake_cloud_client.FakeStorageClient(\n            {\"filename\": \"img1.png,123\\nimg2.jpg,456\"}\n        )\n        results = classification_results.read_classification_results(\n            self.storage_client, \"filename\"\n        )\n        self.assertDictEqual({\"img1\": 123, \"img2\": 456}, results)\n\n    def test_analyze_one_classification_result(self):\n        self.storage_client = fake_cloud_client.FakeStorageClient(\n            {\"filename\": \"a1.png,1\\na2.png,4\\na3.png,1\\na4.png,1\\na5.png,2\\na6.png,9\"}\n        )\n        adv_batch = {\n            \"dataset_batch_id\": \"BATCH000\",\n            \"images\": {\n                \"a\" + str(i): {\"clean_image_id\": \"c\" + str(i)} for i in range(1, 6)\n            },\n        }\n        dataset_batches = image_batches.DatasetBatches(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            dataset_name=\"final\",\n        )\n        dataset_batches._data = {\n            \"BATCH000\": {\n                \"images\": {\n                    \"c\" + str(i): {\"dataset_image_id\": str(i)} for i in range(1, 6)\n                }\n            },\n        }\n        (\n            count_correctly_classified,\n            count_errors,\n            count_hit_target_class,\n            num_images,\n        ) = classification_results.analyze_one_classification_result(\n            self.storage_client,\n            \"filename\",\n            adv_batch,\n            dataset_batches,\n            FakeDatasetMeta(),\n        )\n        self.assertEqual(3, count_correctly_classified)\n        self.assertEqual(2, count_errors)\n        self.assertEqual(1, count_hit_target_class)\n        self.assertEqual(5, num_images)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/fake_cloud_client.py",
    "content": "\"\"\"Library with fake Google Cloud client, used for testing of eval_lib.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport copy\nfrom io import StringIO\nimport six\n\n\nclass FakeBlob(object):\n    \"\"\"Fake for google.cloud.storage.blob.Blob to be used in tests.\"\"\"\n\n    def __init__(self, content):\n        \"\"\"Initializes FakeBlob with given content.\"\"\"\n        if six.PY3 and isinstance(content, str):\n            self._content = content.encode()\n        else:\n            self._content = content\n        self.size = len(content)\n\n    def download_to_file(self, fobj):\n        \"\"\"Writes content of this blob into given file object.\"\"\"\n        fobj.write(self._content)\n\n\nclass FakeStorageClient(object):\n    \"\"\"Fake for CompetitionStorageClient to be used in tests.\"\"\"\n\n    def __init__(self, blobs=None):\n        \"\"\"Inits FakeStorageClient with given blobs.\n\n        Args:\n          blobs: either list of blob names or dict with mapping from blob names to\n            their content\n\n        Raises:\n          TypeError: if blobs argument has invalid type\n        \"\"\"\n        if blobs is not None:\n            if isinstance(blobs, dict):\n                self._blobs = copy.deepcopy(blobs)\n            elif isinstance(blobs, list):\n                self._blobs = {k: \"\" for k in blobs}\n            else:\n                raise TypeError(\"Invalid type of blobs argument\")\n        else:\n            self._blobs = {}\n\n    def list_blobs(self, prefix=\"\"):\n        \"\"\"Lists names of all blobs by their prefix.\"\"\"\n        return [b for b in self._blobs.keys() if b.startswith(prefix)]\n\n    def get_blob(self, blob_name):\n        \"\"\"Gets google.cloud.storage.blob.Blob object by blob name.\"\"\"\n        if blob_name in self._blobs:\n            return FakeBlob(self._blobs[blob_name])\n        else:\n            return None\n\n    def new_blob(self, blob_name):\n        \"\"\"Creates new storage blob with provided name.\"\"\"\n        del blob_name\n        raise NotImplementedError(\"new_blob is not implemented in fake client.\")\n\n\nclass FakeDatastoreKey(object):\n    \"\"\"Fake datastore key.\n\n    Fake datastore key is represented as a list with flat path.\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        if \"parent\" not in kwargs:\n            self._flat_path = args\n        else:\n            parent = kwargs[\"parent\"]\n            if not isinstance(parent, FakeDatastoreKey):\n                raise ValueError(\"Invalid type of parent: \" + str(type(parent)))\n            self._flat_path = parent.flat_path + args\n\n    @property\n    def flat_path(self):\n        return self._flat_path\n\n    def __hash__(self):\n        return hash(self._flat_path)\n\n    def __eq__(self, other):\n        return isinstance(other, FakeDatastoreKey) and (\n            self.flat_path == other.flat_path\n        )\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n\n    def __str__(self):\n        return self.__repr__()\n\n    def __repr__(self):\n        return \"<FakeDatastoreKey {0}>\".format(self._flat_path)\n\n\nclass FakeDatastoreEntity(dict):\n    \"\"\"Fake Datstore Entity.\n\n    Fake datastore entity is just a dict, which additionally has key property.\n    \"\"\"\n\n    def __init__(self, key):\n        super(FakeDatastoreEntity, self).__init__()\n        if not isinstance(key, FakeDatastoreKey):\n            raise TypeError(\"Wrong type of key: \" + str(type(key)))\n        self._key = key\n\n    @property\n    def key(self):\n        return self._key\n\n    def __eq__(self, other):\n        if not isinstance(other, FakeDatastoreEntity):\n            return False\n        return other.key == self.key and (set(self.items()) == set(other.items()))\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n\n    def __str__(self):\n        return self.__repr__()\n\n    def __repr__(self):\n        return \"<FakeDatastoreEntity: Key={0} Properties={1}>\".format(\n            self.key, super(FakeDatastoreEntity, self).__repr__()\n        )\n\n\ndef make_entity(key):\n    \"\"\"Helper method to make FakeDatastoreEntity.\n\n    This method allows to path either tuple or FakeDatastoreKey as a key.\n\n    Args:\n      key: entity key, either tuple or FakeDatastoreKey\n\n    Returns:\n      Instance of FakeDatastoreEntity\n    \"\"\"\n    if isinstance(key, tuple):\n        key = FakeDatastoreKey(*key)\n    return FakeDatastoreEntity(key)\n\n\nclass FakeDatastoreClientBatch(object):\n    \"\"\"Fake for NoTransactionBatch.\"\"\"\n\n    def __init__(self, fake_datastore_client):\n        \"\"\"Init FakeDatastoreClientBatch.\"\"\"\n        self._fake_datastore_client = fake_datastore_client\n        self._mutations = []\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, exc_type, exc_value, traceback):\n        if exc_type is None:\n            for m in self._mutations:\n                self._fake_datastore_client.put(m)\n\n    def put(self, entity):\n        \"\"\"Adds entity mutation to the batch.\"\"\"\n        assert isinstance(entity, FakeDatastoreEntity)\n        self._mutations.append(copy.deepcopy(entity))\n\n\nclass FakeDatastoreClientTransaction(object):\n    \"\"\"Fake for datastore transaction.\n\n    See https://cloud.google.com/datastore/docs/concepts/transactions\n    for details of how transactions work in Cloud Datastore.\n    \"\"\"\n\n    def __init__(self, fake_datastore_client):\n        \"\"\"Init FakeDatastoreClientTransaction.\"\"\"\n        self._client = fake_datastore_client\n        # snapshot of the data in the fake datastore\n        self._data_snapshot = copy.deepcopy(fake_datastore_client.entities)\n        # transaction stated: 'init', 'started', 'committed', 'rolledback'\n        self._state = \"init\"\n        # list of mutations in this transactions in sequential order\n        # each mutation is instance of FakeDatastoreEntity\n        self._mutations = []\n        # set of keys read in this transaction\n        self._read_keys = set()\n\n    def _check_transaction_started(self):\n        \"\"\"Helper method to check that transaction has been started.\"\"\"\n        if self._state != \"started\":\n            raise ValueError(\n                (\"Invalid state of transaction, \" \"expected started, was %s\")\n                % self._state\n            )\n\n    def _check_update_state(self, old_state, new_state):\n        \"\"\"Checks old state and updates it to new state.\"\"\"\n        if self._state != old_state:\n            raise ValueError(\n                \"Invalid state of transaction, expected %s, was %s\"\n                % (old_state, self._state)\n            )\n        self._state = new_state\n\n    def begin(self):\n        \"\"\"Begins transaction.\"\"\"\n        self._check_update_state(\"init\", \"started\")\n\n    def commit(self):\n        \"\"\"Commits transaction.\"\"\"\n        self._check_transaction_started()\n        # before committing transaction verity that all entities which\n        # were read or updated in the transaction were not modified outside\n        # of transaction\n        touched_keys = self._read_keys | set([e.key for e in self._mutations])\n        for k in touched_keys:\n            old_value = self._data_snapshot.get(k)\n            cur_value = self._client.entities.get(k)\n            if old_value != cur_value:\n                self.rollback()\n                raise Exception(\n                    \"Transaction can not be committed due to \"\n                    \"conflicted updates in datastore.\"\n                )\n        # commit all changes\n        self._state = \"committed\"\n        for m in self._mutations:\n            self._client.put(m)\n\n    def rollback(self):\n        \"\"\"Rolls back current transaction.\"\"\"\n        self._check_update_state(\"started\", \"rolledback\")\n        self._mutations = []\n\n    def put(self, entity):\n        \"\"\"Puts entity to datastore.\"\"\"\n        assert isinstance(entity, FakeDatastoreEntity)\n        self._check_transaction_started()\n        self._mutations.append(copy.deepcopy(entity))\n\n    def get(self, key):\n        \"\"\"Gets entity from the datastore.\"\"\"\n        assert isinstance(key, FakeDatastoreKey)\n        self._check_transaction_started()\n        self._read_keys.add(key)\n        return copy.deepcopy(self._data_snapshot.get(key))\n\n    def __enter__(self):\n        self.begin()\n        return self\n\n    def __exit__(self, exc_type, exc_value, traceback):\n        if exc_type is None:\n            self.commit()\n        else:\n            self.rollback()\n\n\n_QUERY_FILTER_OPERATOR = {\n    \"<\": lambda x, y: x < y,\n    \"<=\": lambda x, y: x <= y,\n    \"=\": lambda x, y: x == y,\n    \">\": lambda x, y: x > y,\n    \">=\": lambda x, y: x >= y,\n}\n\n\nclass FakeDatastoreClient(object):\n    \"\"\"Fake for CompetitionDatastoreClient.\"\"\"\n\n    def __init__(self, entities=None):\n        \"\"\"Init FakeDatastoreClient with specified entities.\"\"\"\n        self._transaction_hook = None\n        if isinstance(entities, list):\n            self._entities = {e.key: e for e in entities}\n        elif isinstance(entities, dict):\n            self._entities = entities\n        elif entities is None:\n            self._entities = {}\n        else:\n            raise ValueError(\"Invalid type of entities: \" + str(type(entities)))\n        assert all([isinstance(k, FakeDatastoreKey) for k in self._entities.keys()])\n\n    @property\n    def entities(self):\n        \"\"\"List of stored entities.\"\"\"\n        return self._entities\n\n    def key(self, *args, **kwargs):\n        \"\"\"Creates datastore key.\"\"\"\n        return FakeDatastoreKey(*args, **kwargs)\n\n    def entity(self, key):\n        \"\"\"Creates datastore entity.\"\"\"\n        assert isinstance(key, FakeDatastoreKey)\n        return FakeDatastoreEntity(key)\n\n    def no_transact_batch(self):\n        \"\"\"Starts batch of mutation which is committed without transaction.\"\"\"\n        return FakeDatastoreClientBatch(self)\n\n    def transaction(self):\n        \"\"\"Starts datastore transaction.\"\"\"\n        result = FakeDatastoreClientTransaction(self)\n        if self._transaction_hook:\n            self._transaction_hook(self)\n            self._transaction_hook = None\n        return result\n\n    def get(self, key, transaction=None):\n        \"\"\"Gets an entity with given key.\"\"\"\n        assert isinstance(key, FakeDatastoreKey)\n        if transaction:\n            return transaction.get(key)\n        return copy.deepcopy(self._entities.get(key))\n\n    def put(self, entity):\n        \"\"\"Updates entity in the datastore.\"\"\"\n        assert isinstance(entity, FakeDatastoreEntity)\n        entity = copy.deepcopy(entity)\n        if entity.key in self.entities:\n            self.entities[entity.key].update(entity)\n        else:\n            self.entities[entity.key] = entity\n\n    def batch(self):\n        \"\"\"Starts batch of mutations.\"\"\"\n        raise NotImplementedError(\"FakeDatastoreClient.batch not implemented\")\n\n    def query_fetch(self, **kwargs):\n        \"\"\"Queries datastore.\"\"\"\n        kind = kwargs.get(\"kind\", None)\n        ancestor = kwargs.get(\"ancestor\", None)\n        filters = kwargs.get(\"filters\", [])\n        if ancestor and not isinstance(ancestor, FakeDatastoreKey):\n            raise ValueError(\"Invalid ancestor type: \" + str(type(ancestor)))\n        if (\"projection\" in kwargs) or (\"order\" in kwargs) or (\"distinct_on\" in kwargs):\n            raise ValueError(\"Unsupported clause in arguments: \" + str(kwargs))\n        for f in filters:\n            if not isinstance(f, tuple) or len(f) != 3:\n                raise ValueError(\"Invalid filter: \" + str(filters))\n            if f[1] not in _QUERY_FILTER_OPERATOR.keys():\n                raise ValueError(\"Unsupported operator in filters: \" + str(filters))\n        for e in self._entities.values():\n            key_tuple = e.key.flat_path\n            if (kind is not None) and (key_tuple[-2] != kind):\n                continue\n            if (ancestor is not None) and (key_tuple[:-2] != ancestor.flat_path):\n                continue\n            all_filters_true = True\n            for f in filters:\n                if f[0] not in e:\n                    all_filters_true = False\n                    break\n                if not _QUERY_FILTER_OPERATOR[f[1]](e[f[0]], f[2]):\n                    all_filters_true = False\n                    break\n            if not all_filters_true:\n                continue\n            yield e\n\n    def set_transaction_hook(self, hook):\n        \"\"\"Sets transaction hook.\n\n        This hook will be executed right after next transaction created.\n        It helps to model a situation when data are modified outside of transaction.\n        To be used in tests to test how your code handles edits concurrent with\n        transaction.\n\n        Args:\n          hook: transaction hook, should be a function which takes exactly\n                one argument - instance of this class.\n\n        Raises:\n          ValueError: if transaction hook was already set\n        \"\"\"\n        if self._transaction_hook is not None:\n            raise ValueError(\"Attempt to set transaction hook twice\")\n        self._transaction_hook = hook\n\n    def __str__(self):\n        \"\"\"Returns string representation of all stored entities.\"\"\"\n        buf = StringIO()\n        for entity in self.entities.values():\n            buf.write(u\"Entity {0}:\\n\".format(entity.key.flat_path))\n            buf.write(u\"    {0}\\n\".format(dict(entity)))\n        return buf.getvalue()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/fake_cloud_client_test.py",
    "content": "\"\"\"Tests for eval_lib.testing.fake_cloud_client.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport copy\nfrom io import BytesIO\nimport unittest\nfrom eval_lib.tests import fake_cloud_client\nfrom six import assertCountEqual\nfrom six import b as six_b\n\n\nclass FakeStorageClientTest(unittest.TestCase):\n    def test_list_blobs(self):\n        all_blobs = [\n            \"some_blob\",\n            \"dataset/dev_dataset.csv\",\n            \"dataset/dev/img1.png\",\n            \"dataset/dev/img2.png\",\n        ]\n        client = fake_cloud_client.FakeStorageClient(all_blobs)\n        assertCountEqual(self, all_blobs, client.list_blobs())\n        assertCountEqual(\n            self,\n            [\"dataset/dev_dataset.csv\", \"dataset/dev/img1.png\", \"dataset/dev/img2.png\"],\n            client.list_blobs(\"dataset/dev\"),\n        )\n        assertCountEqual(\n            self,\n            [\"dataset/dev/img1.png\", \"dataset/dev/img2.png\"],\n            client.list_blobs(\"dataset/dev/\"),\n        )\n\n    def test_get_blob(self):\n        client = fake_cloud_client.FakeStorageClient(\n            {\"some_blob\": \"some_content\", \"blob2\": \"another_content\"}\n        )\n        self.assertIsNone(client.get_blob(\"blob3\"))\n        buf = BytesIO()\n        client.get_blob(\"some_blob\").download_to_file(buf)\n        self.assertEqual(six_b(\"some_content\"), buf.getvalue())\n\n\nclass FakeDatastoreKeyTest(unittest.TestCase):\n    def test_flat_path(self):\n        key1 = fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\")\n        self.assertTupleEqual((\"abc\", \"1\"), key1.flat_path)\n        key2 = fake_cloud_client.FakeDatastoreKey(\"def\", \"xyz\", parent=key1)\n        self.assertTupleEqual((\"abc\", \"1\", \"def\", \"xyz\"), key2.flat_path)\n\n    def test_equality(self):\n        key1a = fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\")\n        key1b = fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\")\n        key2a = fake_cloud_client.FakeDatastoreKey(\"def\", \"xyz\", parent=key1a)\n        key2b = fake_cloud_client.FakeDatastoreKey(\"def\", \"xyz\", parent=key1a)\n        # key equal to self\n        self.assertTrue(key1a == key1a)\n        self.assertFalse(key1a != key1a)\n        # key equal to the same key\n        self.assertTrue(key1a == key1b)\n        self.assertFalse(key1a != key1b)\n        self.assertTrue(key2a == key2b)\n        self.assertFalse(key2a != key2b)\n        # key different from other key\n        self.assertFalse(key1a == key2a)\n        self.assertTrue(key1a != key2a)\n        # key not equal to tuple\n        self.assertTrue(key1a != key1a.flat_path)\n        self.assertFalse(key1a == key1a.flat_path)\n\n\nclass FakeDatastoreEntityTest(unittest.TestCase):\n    def test_key(self):\n        entity = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        self.assertEqual(entity.key, fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\"))\n\n    def test_equality_keys(self):\n        entity1a = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity1b = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity2 = fake_cloud_client.make_entity((\"abc\", \"2\"))\n        self.assertFalse(entity1a == entity2)\n        self.assertTrue(entity1a != entity2)\n        self.assertTrue(entity1a == entity1b)\n        self.assertFalse(entity1b != entity1b)\n\n    def test_equality_dict(self):\n        entity1 = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity1[\"k1\"] = \"v1\"\n        entity2 = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity2[\"k1\"] = \"v2\"\n        entity3 = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity1[\"k1\"] = \"v1\"\n        entity1[\"k2\"] = \"v2\"\n        # compare to self\n        self.assertTrue(entity1 == entity1)\n        self.assertFalse(entity1 != entity1)\n        self.assertTrue(entity2 == entity2)\n        self.assertFalse(entity2 != entity2)\n        self.assertTrue(entity3 == entity3)\n        self.assertFalse(entity3 != entity3)\n        # compare to others\n        self.assertFalse(entity1 == entity2)\n        self.assertTrue(entity1 != entity2)\n        self.assertFalse(entity1 == entity3)\n        self.assertTrue(entity1 != entity3)\n        self.assertFalse(entity2 == entity3)\n        self.assertTrue(entity2 != entity3)\n\n    def test_copy(self):\n        entity1 = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity1[\"k1\"] = [\"v1\"]\n        self.assertEqual(entity1.key, fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\"))\n        self.assertEqual(dict(entity1), {\"k1\": [\"v1\"]})\n        entity2 = copy.copy(entity1)\n        entity2[\"k1\"].append(\"v2\")\n        entity2[\"k3\"] = \"v3\"\n        self.assertIsInstance(entity2, fake_cloud_client.FakeDatastoreEntity)\n        self.assertEqual(entity1.key, fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\"))\n        self.assertEqual(dict(entity1), {\"k1\": [\"v1\", \"v2\"]})\n        self.assertEqual(entity2.key, fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\"))\n        self.assertEqual(dict(entity2), {\"k1\": [\"v1\", \"v2\"], \"k3\": \"v3\"})\n\n    def test_deep_copy(self):\n        entity1 = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity1[\"k1\"] = [\"v1\"]\n        self.assertEqual(entity1.key, fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\"))\n        self.assertEqual(dict(entity1), {\"k1\": [\"v1\"]})\n        entity2 = copy.deepcopy(entity1)\n        entity2[\"k1\"].append(\"v2\")\n        entity2[\"k3\"] = \"v3\"\n        self.assertIsInstance(entity2, fake_cloud_client.FakeDatastoreEntity)\n        self.assertEqual(entity1.key, fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\"))\n        self.assertEqual(dict(entity1), {\"k1\": [\"v1\"]})\n        self.assertEqual(entity2.key, fake_cloud_client.FakeDatastoreKey(\"abc\", \"1\"))\n        self.assertEqual(dict(entity2), {\"k1\": [\"v1\", \"v2\"], \"k3\": \"v3\"})\n\n\nclass FakeDatastoreClientTest(unittest.TestCase):\n    def setUp(self):\n        self._client = fake_cloud_client.FakeDatastoreClient()\n        self._key1 = self._client.key(\"abc\", \"def\")\n        self._key2 = self._client.key(\"qwe\", \"rty\", parent=self._key1)\n        self._entity1 = self._client.entity(self._key1)\n        self._entity1[\"k1\"] = \"v1\"\n        self._entity2 = self._client.entity(self._key2)\n        self._entity2[\"k2\"] = \"v2\"\n        self._entity2[\"k3\"] = \"v3\"\n\n    def test_make_key(self):\n        self.assertTupleEqual((\"abc\", \"def\"), self._key1.flat_path)\n        self.assertTupleEqual((\"abc\", \"def\", \"qwe\", \"rty\"), self._key2.flat_path)\n\n    def test_make_entity(self):\n        self.assertTupleEqual((\"abc\", \"def\"), self._entity1.key.flat_path)\n\n    def test_put_entity(self):\n        self.assertDictEqual({}, self._client.entities)\n        self._client.put(self._entity1)\n        self.assertDictEqual({self._key1: self._entity1}, self._client.entities)\n        self._client.put(self._entity2)\n        self.assertDictEqual(\n            {self._key1: self._entity1, self._key2: self._entity2},\n            self._client.entities,\n        )\n\n    def test_get_entity(self):\n        self._client.put(self._entity1)\n        self._client.put(self._entity2)\n        self.assertEqual(self._entity1, self._client.get(self._key1))\n        self.assertEqual(self._entity2, self._client.get(self._key2))\n\n    def test_write_batch(self):\n        with self._client.no_transact_batch() as batch:\n            batch.put(self._entity1)\n            batch.put(self._entity2)\n        assertCountEqual(self, [self._key1, self._key2], self._client.entities.keys())\n        self.assertEqual(self._key1, self._client.entities[self._key1].key)\n        self.assertDictEqual({\"k1\": \"v1\"}, dict(self._client.entities[self._key1]))\n        self.assertEqual(self._key2, self._client.entities[self._key2].key)\n        self.assertDictEqual(\n            {\"k2\": \"v2\", \"k3\": \"v3\"}, dict(self._client.entities[self._key2])\n        )\n\n    def test_overwrite_values(self):\n        client = fake_cloud_client.FakeDatastoreClient()\n        key1 = client.key(\"abc\", \"def\")\n        entity1 = client.entity(key1)\n        entity1[\"k1\"] = \"v1\"\n        entity2 = client.entity(key1)\n        entity2[\"k1\"] = \"v2\"\n        entity2[\"k2\"] = \"v3\"\n        with client.no_transact_batch() as batch:\n            batch.put(entity1)\n        assertCountEqual(self, [key1], client.entities.keys())\n        self.assertEqual(key1, client.entities[key1].key)\n        self.assertDictEqual({\"k1\": \"v1\"}, dict(client.entities[key1]))\n        with client.no_transact_batch() as batch:\n            batch.put(entity2)\n        assertCountEqual(self, [key1], client.entities.keys())\n        self.assertEqual(key1, client.entities[key1].key)\n        self.assertDictEqual({\"k1\": \"v2\", \"k2\": \"v3\"}, dict(client.entities[key1]))\n\n    def test_query_fetch_all(self):\n        entity1 = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity1[\"k1\"] = \"v1\"\n        entity2 = fake_cloud_client.make_entity((\"abc\", \"1\", \"def\", \"2\"))\n        entity2[\"k2\"] = \"v2\"\n        client = fake_cloud_client.FakeDatastoreClient([entity1, entity2])\n        assertCountEqual(self, [entity1, entity2], client.query_fetch())\n\n    def test_query_fetch_kind_filter(self):\n        entity1 = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity1[\"k1\"] = \"v1\"\n        entity2 = fake_cloud_client.make_entity((\"abc\", \"1\", \"def\", \"2\"))\n        entity2[\"k2\"] = \"v2\"\n        client = fake_cloud_client.FakeDatastoreClient([entity1, entity2])\n        assertCountEqual(self, [entity1], client.query_fetch(kind=\"abc\"))\n        assertCountEqual(self, [entity2], client.query_fetch(kind=\"def\"))\n\n    def test_query_fetch_ancestor_filter(self):\n        entity1 = fake_cloud_client.make_entity((\"abc\", \"1\", \"def\", \"2\"))\n        entity1[\"k1\"] = \"v1\"\n        entity2 = fake_cloud_client.make_entity((\"xyz\", \"3\", \"qwe\", \"4\"))\n        entity2[\"k2\"] = \"v2\"\n        client = fake_cloud_client.FakeDatastoreClient([entity1, entity2])\n        assertCountEqual(\n            self, [entity1], client.query_fetch(ancestor=client.key(\"abc\", \"1\"))\n        )\n        assertCountEqual(\n            self, [entity2], client.query_fetch(ancestor=client.key(\"xyz\", \"3\"))\n        )\n\n    def test_query_fetch_ancestor_and_kind_filter(self):\n        entity1 = fake_cloud_client.make_entity((\"abc\", \"1\", \"def\", \"2\"))\n        entity1[\"k1\"] = \"v1\"\n        entity2 = fake_cloud_client.make_entity((\"abc\", \"1\", \"xyz\", \"3\"))\n        entity2[\"k2\"] = \"v2\"\n        entity3 = fake_cloud_client.make_entity((\"def\", \"4\"))\n        entity3[\"k2\"] = \"v2\"\n        client = fake_cloud_client.FakeDatastoreClient([entity1, entity2, entity3])\n        assertCountEqual(\n            self,\n            [entity1],\n            client.query_fetch(kind=\"def\", ancestor=client.key(\"abc\", \"1\")),\n        )\n\n    def test_query_fetch_data_filter(self):\n        entity1 = fake_cloud_client.make_entity((\"abc\", \"1\"))\n        entity1[\"k1\"] = \"v1\"\n        entity2 = fake_cloud_client.make_entity((\"abc\", \"2\"))\n        entity2[\"k1\"] = \"v2\"\n        entity2[\"k2\"] = \"v2\"\n        entity3 = fake_cloud_client.make_entity((\"abc\", \"3\"))\n        entity3[\"k2\"] = \"v3\"\n        client = fake_cloud_client.FakeDatastoreClient([entity1, entity2, entity3])\n        assertCountEqual(\n            self, [entity1], client.query_fetch(filters=[(\"k1\", \"=\", \"v1\")])\n        )\n        assertCountEqual(\n            self, [entity2], client.query_fetch(filters=[(\"k1\", \">\", \"v1\")])\n        )\n        assertCountEqual(\n            self, [entity1, entity2], client.query_fetch(filters=[(\"k1\", \">=\", \"v1\")])\n        )\n        assertCountEqual(\n            self, [entity2], client.query_fetch(filters=[(\"k2\", \"<\", \"v3\")])\n        )\n        assertCountEqual(\n            self, [entity2, entity3], client.query_fetch(filters=[(\"k2\", \"<=\", \"v3\")])\n        )\n        assertCountEqual(\n            self,\n            [entity2],\n            client.query_fetch(filters=[(\"k1\", \">=\", \"v1\"), (\"k2\", \"<=\", \"v3\")]),\n        )\n\n\nclass FakeDatastoreClientTransactionTest(unittest.TestCase):\n    def setUp(self):\n        self._client = fake_cloud_client.FakeDatastoreClient()\n        self._key1 = self._client.key(\"abc\", \"def\")\n        self._key2 = self._client.key(\"qwe\", \"rty\", parent=self._key1)\n        self._key3 = self._client.key(\"123\", \"456\")\n        self._entity1 = self._client.entity(self._key1)\n        self._entity1[\"k1\"] = \"v1\"\n        self._entity2 = self._client.entity(self._key2)\n        self._entity2[\"k2\"] = \"v2\"\n        self._entity2[\"k3\"] = \"v3\"\n        self._entity3 = self._client.entity(self._key3)\n        self._entity3[\"k4\"] = \"v4\"\n        self._entity3[\"k5\"] = \"v5\"\n        self._entity3[\"k6\"] = \"v6\"\n        self._client.put(self._entity1)\n        self._client.put(self._entity2)\n        self._client.put(self._entity3)\n        # verify datastore content\n        assertCountEqual(\n            self, [self._key1, self._key2, self._key3], self._client.entities.keys()\n        )\n        self.assertDictEqual({\"k1\": \"v1\"}, dict(self._client.entities[self._key1]))\n        self.assertDictEqual(\n            {\"k2\": \"v2\", \"k3\": \"v3\"}, dict(self._client.entities[self._key2])\n        )\n        self.assertDictEqual(\n            {\"k4\": \"v4\", \"k5\": \"v5\", \"k6\": \"v6\"},\n            dict(self._client.entities[self._key3]),\n        )\n\n    def test_transaction_write_only_no_concurrent(self):\n        key4 = self._client.key(\"zxc\", \"vbn\")\n        entity4 = self._client.entity(key4)\n        entity4[\"k7\"] = \"v7\"\n        entity3_upd = self._client.entity(self._key3)\n        entity3_upd[\"k4\"] = \"upd_v4\"\n        with self._client.transaction() as transaction:\n            # first write in transaction\n            transaction.put(entity4)\n            # second write in transaction\n            transaction.put(entity3_upd)\n        # verify datastore content\n        assertCountEqual(\n            self,\n            [self._key1, self._key2, self._key3, key4],\n            self._client.entities.keys(),\n        )\n        self.assertDictEqual({\"k1\": \"v1\"}, dict(self._client.entities[self._key1]))\n        self.assertDictEqual(\n            {\"k2\": \"v2\", \"k3\": \"v3\"}, dict(self._client.entities[self._key2])\n        )\n        self.assertDictEqual(\n            {\"k4\": \"upd_v4\", \"k5\": \"v5\", \"k6\": \"v6\"},\n            dict(self._client.entities[self._key3]),\n        )\n        self.assertDictEqual({\"k7\": \"v7\"}, dict(self._client.entities[key4]))\n\n    def test_transaction_read_write_no_concurrent(self):\n        key4 = self._client.key(\"zxc\", \"vbn\")\n        entity4 = self._client.entity(key4)\n        entity4[\"k7\"] = \"v7\"\n        entity3_upd = self._client.entity(self._key3)\n        entity3_upd[\"k4\"] = \"upd_v4\"\n        with self._client.transaction() as transaction:\n            # reading in transaction always returns data snapshot before transaction\n            read_entity = self._client.get(self._key3, transaction=transaction)\n            self.assertDictEqual(\n                {\"k4\": \"v4\", \"k5\": \"v5\", \"k6\": \"v6\"}, dict(read_entity)\n            )\n            # first write in transaction\n            transaction.put(entity3_upd)\n            # second write in transaction\n            transaction.put(entity4)\n            # reading in transaction always returns data snapshot before transaction\n            read_entity = self._client.get(self._key3, transaction=transaction)\n            self.assertDictEqual(\n                {\"k4\": \"v4\", \"k5\": \"v5\", \"k6\": \"v6\"}, dict(read_entity)\n            )\n        # verify datastore content\n        assertCountEqual(\n            self,\n            [self._key1, self._key2, self._key3, key4],\n            self._client.entities.keys(),\n        )\n        self.assertDictEqual({\"k1\": \"v1\"}, dict(self._client.entities[self._key1]))\n        self.assertDictEqual(\n            {\"k2\": \"v2\", \"k3\": \"v3\"}, dict(self._client.entities[self._key2])\n        )\n        self.assertDictEqual(\n            {\"k4\": \"upd_v4\", \"k5\": \"v5\", \"k6\": \"v6\"},\n            dict(self._client.entities[self._key3]),\n        )\n        self.assertDictEqual({\"k7\": \"v7\"}, dict(self._client.entities[key4]))\n\n    def test_transaction_read_write_concurrent_not_intersecting(self):\n        key4 = self._client.key(\"zxc\", \"vbn\")\n        entity4 = self._client.entity(key4)\n        entity4[\"k7\"] = \"v7\"\n        entity3_upd = self._client.entity(self._key3)\n        entity3_upd[\"k4\"] = \"upd_v4\"\n        entity1_upd = self._client.entity(self._key1)\n        entity1_upd[\"k1\"] = \"upd_v1\"\n        with self._client.transaction() as transaction:\n            # reading in transaction always returns data snapshot before transaction\n            read_entity = self._client.get(self._key3, transaction=transaction)\n            self.assertDictEqual(\n                {\"k4\": \"v4\", \"k5\": \"v5\", \"k6\": \"v6\"}, dict(read_entity)\n            )\n            # first write in transaction\n            transaction.put(entity3_upd)\n            # modify some data which are not references in the transaction\n            self._client.put(entity1_upd)\n            # second write in transaction\n            transaction.put(entity4)\n            # reading in transaction always returns data snapshot before transaction\n            read_entity = self._client.get(self._key3, transaction=transaction)\n            self.assertDictEqual(\n                {\"k4\": \"v4\", \"k5\": \"v5\", \"k6\": \"v6\"}, dict(read_entity)\n            )\n        # verify datastore content\n        assertCountEqual(\n            self,\n            [self._key1, self._key2, self._key3, key4],\n            self._client.entities.keys(),\n        )\n        self.assertDictEqual({\"k1\": \"upd_v1\"}, dict(self._client.entities[self._key1]))\n        self.assertDictEqual(\n            {\"k2\": \"v2\", \"k3\": \"v3\"}, dict(self._client.entities[self._key2])\n        )\n        self.assertDictEqual(\n            {\"k4\": \"upd_v4\", \"k5\": \"v5\", \"k6\": \"v6\"},\n            dict(self._client.entities[self._key3]),\n        )\n        self.assertDictEqual({\"k7\": \"v7\"}, dict(self._client.entities[key4]))\n\n    def test_transaction_write_concurrent(self):\n        key4 = self._client.key(\"zxc\", \"vbn\")\n        entity4 = self._client.entity(key4)\n        entity4[\"k7\"] = \"v7\"\n        entity3_upd = self._client.entity(self._key3)\n        entity3_upd[\"k4\"] = \"upd_v4\"\n        entity3_upd_no_transact = self._client.entity(self._key3)\n        entity3_upd_no_transact[\"k4\"] = \"another_v4\"\n        reached_end_of_transaction = False\n        with self.assertRaises(Exception):\n            with self._client.transaction() as transaction:\n                # first write in transaction\n                transaction.put(entity3_upd)\n                # modify some data which are not references in the transaction\n                self._client.put(entity3_upd_no_transact)\n                # second write in transaction\n                transaction.put(entity4)\n                reached_end_of_transaction = True\n        self.assertTrue(reached_end_of_transaction)\n        # verify datastore content\n        assertCountEqual(\n            self, [self._key1, self._key2, self._key3], self._client.entities.keys()\n        )\n        self.assertDictEqual({\"k1\": \"v1\"}, dict(self._client.entities[self._key1]))\n        self.assertDictEqual(\n            {\"k2\": \"v2\", \"k3\": \"v3\"}, dict(self._client.entities[self._key2])\n        )\n        self.assertDictEqual(\n            {\"k4\": \"another_v4\", \"k5\": \"v5\", \"k6\": \"v6\"},\n            dict(self._client.entities[self._key3]),\n        )\n\n    def test_transaction_read_concurrent(self):\n        key4 = self._client.key(\"zxc\", \"vbn\")\n        entity4 = self._client.entity(key4)\n        entity4[\"k7\"] = \"v7\"\n        entity3_upd_no_transact = self._client.entity(self._key3)\n        entity3_upd_no_transact[\"k4\"] = \"another_v4\"\n        reached_end_of_transaction = False\n        with self.assertRaises(Exception):\n            with self._client.transaction() as transaction:\n                # write in transaction\n                transaction.put(entity4)\n                # read in transaction\n                read_entity = self._client.get(self._key3, transaction=transaction)\n                self.assertDictEqual(\n                    {\"k4\": \"v4\", \"k5\": \"v5\", \"k6\": \"v6\"}, dict(read_entity)\n                )\n                # modify some data which are not references in the transaction\n                self._client.put(entity3_upd_no_transact)\n                reached_end_of_transaction = True\n        self.assertTrue(reached_end_of_transaction)\n        # verify datastore content\n        assertCountEqual(\n            self, [self._key1, self._key2, self._key3], self._client.entities.keys()\n        )\n        self.assertDictEqual({\"k1\": \"v1\"}, dict(self._client.entities[self._key1]))\n        self.assertDictEqual(\n            {\"k2\": \"v2\", \"k3\": \"v3\"}, dict(self._client.entities[self._key2])\n        )\n        self.assertDictEqual(\n            {\"k4\": \"another_v4\", \"k5\": \"v5\", \"k6\": \"v6\"},\n            dict(self._client.entities[self._key3]),\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/image_batches_test.py",
    "content": "\"\"\"Tests for eval_lib.image_batches.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport itertools\nimport unittest\n\nfrom six import assertCountEqual\n\nfrom eval_lib import image_batches\nfrom eval_lib import submissions\nfrom eval_lib.tests import fake_cloud_client\n\n\nROUND_NAME = \"round-name\"\n\n\nclass ImageBatchesBaseTest(unittest.TestCase):\n    def setUp(self):\n        self.datastore_client = fake_cloud_client.FakeDatastoreClient()\n        self.image_batches = image_batches.ImageBatchesBase(\n            datastore_client=self.datastore_client,\n            entity_kind_batches=\"Batch\",\n            entity_kind_images=\"Image\",\n        )\n\n    def test_add_batch(self):\n        self.assertEqual(0, len(self.image_batches.data))\n        self.image_batches.add_batch(\n            \"batch1\", batch_properties={\"k1\": \"v1\", \"k2\": \"v2\"}\n        )\n        self.assertEqual(1, len(self.image_batches.data))\n        self.assertDictEqual(\n            {\"k1\": \"v1\", \"k2\": \"v2\", \"images\": {}}, self.image_batches[\"batch1\"]\n        )\n        self.image_batches.add_batch(\"batch2\", batch_properties={\"k3\": \"v3\"})\n        self.assertEqual(2, len(self.image_batches.data))\n        self.assertDictEqual({\"k3\": \"v3\", \"images\": {}}, self.image_batches[\"batch2\"])\n\n    def test_add_image(self):\n        self.assertEqual(0, len(self.image_batches.data))\n        self.image_batches.add_batch(\n            \"batch1\", batch_properties={\"k1\": \"v1\", \"k2\": \"v2\"}\n        )\n        self.image_batches.add_image(\"batch1\", \"img1\", image_properties={\"k4\": \"v4\"})\n        self.assertEqual(1, len(self.image_batches.data))\n        self.assertDictEqual(\n            {\"k1\": \"v1\", \"k2\": \"v2\", \"images\": {\"img1\": {\"k4\": \"v4\"}}},\n            self.image_batches[\"batch1\"],\n        )\n        self.image_batches.add_image(\"batch1\", \"img2\", image_properties={\"k5\": \"v5\"})\n        self.assertEqual(1, len(self.image_batches.data))\n        self.assertDictEqual(\n            {\n                \"k1\": \"v1\",\n                \"k2\": \"v2\",\n                \"images\": {\"img1\": {\"k4\": \"v4\"}, \"img2\": {\"k5\": \"v5\"}},\n            },\n            self.image_batches[\"batch1\"],\n        )\n\n    def test_write_to_datastore(self):\n        # add 2 batches and 3 images, write everything to datastore\n        self.image_batches.add_batch(\n            \"batch1\", batch_properties={\"k1\": \"v1\", \"k2\": \"v2\"}\n        )\n        self.image_batches.add_batch(\"batch2\", batch_properties={\"k3\": \"v3\"})\n        self.image_batches.add_image(\"batch1\", \"img1\", image_properties={\"k4\": \"v4\"})\n        self.image_batches.add_image(\"batch1\", \"img2\", image_properties={\"k5\": \"v5\"})\n        self.image_batches.add_image(\"batch2\", \"img3\", image_properties={\"k6\": \"v6\"})\n        self.image_batches.write_to_datastore()\n        # verify batches\n        batch_entity1 = self.datastore_client.entity(\n            fake_cloud_client.FakeDatastoreKey(\"Batch\", \"batch1\")\n        )\n        batch_entity1.update({\"k1\": \"v1\", \"k2\": \"v2\"})\n        batch_entity2 = self.datastore_client.entity(\n            fake_cloud_client.FakeDatastoreKey(\"Batch\", \"batch2\")\n        )\n        batch_entity2.update({\"k3\": \"v3\"})\n        assertCountEqual(\n            self,\n            [batch_entity1, batch_entity2],\n            self.datastore_client.query_fetch(kind=\"Batch\"),\n        )\n        # verify images\n        img_entity1 = self.datastore_client.entity(\n            fake_cloud_client.FakeDatastoreKey(\"Batch\", \"batch2\", \"Image\", \"img1\")\n        )\n        img_entity1.update({\"k4\": \"v4\"})\n        img_entity2 = self.datastore_client.entity(\n            fake_cloud_client.FakeDatastoreKey(\"Batch\", \"batch2\", \"Image\", \"img2\")\n        )\n        img_entity2.update({\"k5\": \"v5\"})\n        img_entity3 = self.datastore_client.entity(\n            fake_cloud_client.FakeDatastoreKey(\"Batch\", \"batch2\", \"Image\", \"img3\")\n        )\n        img_entity3.update({\"k6\": \"v6\"})\n\n    def test_write_single_batch_images_to_datastore(self):\n        # add 2 batches and 3 images, write only one batch to datastore\n        self.image_batches.add_batch(\n            \"batch1\", batch_properties={\"k1\": \"v1\", \"k2\": \"v2\"}\n        )\n        self.image_batches.add_batch(\"batch2\", batch_properties={\"k3\": \"v3\"})\n        self.image_batches.add_image(\"batch1\", \"img1\", image_properties={\"k4\": \"v4\"})\n        self.image_batches.add_image(\"batch1\", \"img2\", image_properties={\"k5\": \"v5\"})\n        self.image_batches.add_image(\"batch2\", \"img3\", image_properties={\"k6\": \"v6\"})\n        self.image_batches.write_single_batch_images_to_datastore(\"batch2\")\n        # verify batches\n        # write_single_batch_images_to_datastore writes only images, so no batches\n        assertCountEqual(self, [], self.datastore_client.query_fetch(kind=\"Batch\"))\n        # verify images\n        img_entity3 = self.datastore_client.entity(\n            fake_cloud_client.FakeDatastoreKey(\"Batch\", \"batch2\", \"Image\", \"img3\")\n        )\n        img_entity3.update({\"k6\": \"v6\"})\n        assertCountEqual(\n            self, [img_entity3], self.datastore_client.query_fetch(kind=\"Image\")\n        )\n\n\nclass DatasetBatchesTest(unittest.TestCase):\n    def setUp(self):\n        storage_blobs = [\n            \"dataset/dev/img1.png\",\n            \"dataset/dev/img2.png\",\n            \"dataset/dev/img3.png\",\n            \"dataset/dev/img4.png\",\n            \"dataset/dev/img5.png\",\n            \"dataset/dev_dataset.csv\",\n        ]\n        self.storage_client = fake_cloud_client.FakeStorageClient(storage_blobs)\n        self.datastore_client = fake_cloud_client.FakeDatastoreClient()\n        self.dataset_batches = image_batches.DatasetBatches(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            dataset_name=\"dev\",\n        )\n\n    def verify_dataset_batches(self):\n        self.assertEqual(2, len(self.dataset_batches.data))\n        all_images = {}\n        for batch in self.dataset_batches.data.values():\n            self.assertIn(batch[\"epsilon\"], [4, 8, 12, 16])\n            self.assertGreaterEqual(3, len(batch[\"images\"]))\n            self.assertTrue(\n                set(all_images.keys()).isdisjoint(batch[\"images\"].keys()),\n                msg=(\n                    \"all_images and batch['images'] contains common keys %s\"\n                    % set(all_images.keys()).intersection(batch[\"images\"].keys())\n                ),\n            )\n            all_images.update(batch[\"images\"])\n        assertCountEqual(\n            self,\n            [\n                {\"dataset_image_id\": \"img1\", \"image_path\": \"dataset/dev/img1.png\"},\n                {\"dataset_image_id\": \"img2\", \"image_path\": \"dataset/dev/img2.png\"},\n                {\"dataset_image_id\": \"img3\", \"image_path\": \"dataset/dev/img3.png\"},\n                {\"dataset_image_id\": \"img4\", \"image_path\": \"dataset/dev/img4.png\"},\n                {\"dataset_image_id\": \"img5\", \"image_path\": \"dataset/dev/img5.png\"},\n            ],\n            all_images.values(),\n        )\n\n    def verify_datastore_entities(self):\n        # Verify 'DatasetBatch' entities\n        expected_batch_entities = []\n        for batch_id, batch in self.dataset_batches.data.items():\n            entity = self.datastore_client.entity(\n                fake_cloud_client.FakeDatastoreKey(\"DatasetBatch\", batch_id)\n            )\n            entity[\"epsilon\"] = batch[\"epsilon\"]\n            expected_batch_entities.append(entity)\n        assertCountEqual(\n            self,\n            expected_batch_entities,\n            self.datastore_client.query_fetch(kind=\"DatasetBatch\"),\n        )\n        # Verify 'DatasetImage' entities\n        expected_image_entities = []\n        for batch_id, batch in self.dataset_batches.data.items():\n            for image_id, image in batch[\"images\"].items():\n                entity = self.datastore_client.entity(\n                    fake_cloud_client.FakeDatastoreKey(\n                        \"DatasetBatch\", batch_id, \"DatasetImage\", image_id\n                    )\n                )\n                entity.update(image)\n                expected_image_entities.append(entity)\n        assertCountEqual(\n            self,\n            expected_image_entities,\n            self.datastore_client.query_fetch(kind=\"DatasetImage\"),\n        )\n\n    def test_init_from_storage(self):\n        self.dataset_batches.init_from_storage_write_to_datastore(batch_size=3)\n        self.verify_dataset_batches()\n        self.verify_datastore_entities()\n\n    def test_init_from_datastore(self):\n        self.dataset_batches.init_from_storage_write_to_datastore(batch_size=3)\n        self.dataset_batches = image_batches.DatasetBatches(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            dataset_name=\"dev\",\n        )\n        self.dataset_batches.init_from_datastore()\n        self.verify_dataset_batches()\n\n    def test_count_num_images(self):\n        self.dataset_batches.init_from_storage_write_to_datastore(batch_size=3)\n        self.assertEqual(5, self.dataset_batches.count_num_images())\n\n\nclass AdversarialBatchesTest(unittest.TestCase):\n    def setUp(self):\n        # prepare dataset batches and submissions\n        storage_blobs = [\n            \"dataset/dev/img1.png\",\n            \"dataset/dev/img2.png\",\n            \"dataset/dev/img3.png\",\n            \"dataset/dev/img4.png\",\n            \"dataset/dev/img5.png\",\n            \"dataset/dev_dataset.csv\",\n            ROUND_NAME + \"/submissions/nontargeted/1.zip\",\n            ROUND_NAME + \"/submissions/nontargeted/baseline_nt.zip\",\n            ROUND_NAME + \"/submissions/targeted/1.zip\",\n            ROUND_NAME + \"/submissions/targeted/2.zip\",\n            ROUND_NAME + \"/submissions/defense/3.zip\",\n            ROUND_NAME + \"/submissions/defense/baseline_adv_train.zip\",\n        ]\n        self.storage_client = fake_cloud_client.FakeStorageClient(storage_blobs)\n        self.datastore_client = fake_cloud_client.FakeDatastoreClient()\n        self.dataset_batches = image_batches.DatasetBatches(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            dataset_name=\"dev\",\n        )\n        self.dataset_batches.init_from_storage_write_to_datastore(batch_size=3)\n        self.submissions = submissions.CompetitionSubmissions(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            round_name=ROUND_NAME,\n        )\n        self.submissions.init_from_storage_write_to_datastore()\n\n    def verify_adversarial_batches_without_images(self, adv_batches):\n        attack_ids = list(self.submissions.attacks.keys()) + list(\n            self.submissions.targeted_attacks.keys()\n        )\n        dataset_batch_ids = self.dataset_batches.data.keys()\n        expected_batches = [\n            {\"dataset_batch_id\": b_id, \"submission_id\": a_id, \"images\": {}}\n            for (b_id, a_id) in itertools.product(dataset_batch_ids, attack_ids)\n        ]\n        assertCountEqual(self, expected_batches, adv_batches.data.values())\n\n    def test_init_from_dataset_and_submissions(self):\n        adv_batches = image_batches.AversarialBatches(\n            datastore_client=self.datastore_client\n        )\n        adv_batches.init_from_dataset_and_submissions_write_to_datastore(\n            dataset_batches=self.dataset_batches,\n            attack_submission_ids=self.submissions.get_all_attack_ids(),\n        )\n        self.verify_adversarial_batches_without_images(adv_batches)\n\n    def test_init_from_datastore(self):\n        # populate datastore\n        adv_batches = image_batches.AversarialBatches(\n            datastore_client=self.datastore_client\n        )\n        adv_batches.init_from_dataset_and_submissions_write_to_datastore(\n            dataset_batches=self.dataset_batches,\n            attack_submission_ids=self.submissions.get_all_attack_ids(),\n        )\n        # init AversarialBatches from datastore\n        adv_batches = image_batches.AversarialBatches(\n            datastore_client=self.datastore_client\n        )\n        adv_batches.init_from_datastore()\n        self.verify_adversarial_batches_without_images(adv_batches)\n\n    def test_count_generated_adv_examples(self):\n        adv_batches = image_batches.AversarialBatches(\n            datastore_client=self.datastore_client\n        )\n        adv_batches.init_from_dataset_and_submissions_write_to_datastore(\n            dataset_batches=self.dataset_batches,\n            attack_submission_ids=self.submissions.get_all_attack_ids(),\n        )\n        self.assertDictEqual(\n            {\"SUBA000\": 0, \"SUBA001\": 0, \"SUBT000\": 0, \"SUBT001\": 0},\n            adv_batches.count_generated_adv_examples(),\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/submissions_test.py",
    "content": "\"\"\"Tests for eval_lib.submissions.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport unittest\n\nfrom six import assertCountEqual\n\nfrom eval_lib import submissions\nfrom eval_lib.tests import fake_cloud_client\n\n\nROUND_NAME = \"round-name\"\n\n\nclass ParticipantFromSubmissionPathTest(unittest.TestCase):\n    def test_team_id(self):\n        self.assertDictEqual(\n            {\"team_id\": 42}, submissions.participant_from_submission_path(\"path/42.zip\")\n        )\n\n    def test_baseline_id(self):\n        self.assertDictEqual(\n            {\"baseline_id\": \"a_1\"},\n            submissions.participant_from_submission_path(\"path/baseline_a_1.zip\"),\n        )\n\n    def test_tar_extension(self):\n        self.assertDictEqual(\n            {\"team_id\": 42}, submissions.participant_from_submission_path(\"path/42.tar\")\n        )\n\n    def test_tar_gz_extension(self):\n        self.assertDictEqual(\n            {\"team_id\": 42},\n            submissions.participant_from_submission_path(\"path/42.tar.gz\"),\n        )\n\n\nclass SubmissionsTest(unittest.TestCase):\n    def setUp(self):\n        storage_blobs = [\n            ROUND_NAME + \"/submissions/nontargeted/1.zip\",\n            ROUND_NAME + \"/submissions/nontargeted/baseline_nt.zip\",\n            ROUND_NAME + \"/submissions/targeted/1.zip\",\n            ROUND_NAME + \"/submissions/targeted/2.zip\",\n            ROUND_NAME + \"/submissions/defense/3.zip\",\n            ROUND_NAME + \"/submissions/defense/baseline_adv_train.zip\",\n        ]\n        self.storage_client = fake_cloud_client.FakeStorageClient(storage_blobs)\n        self.datastore_client = fake_cloud_client.FakeDatastoreClient()\n        self.submissions = submissions.CompetitionSubmissions(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            round_name=ROUND_NAME,\n        )\n\n    def verify_submissions(self):\n        assertCountEqual(\n            self,\n            [\n                submissions.SubmissionDescriptor(\n                    path=(ROUND_NAME + \"/submissions/nontargeted/1.zip\"),\n                    participant_id={\"team_id\": 1},\n                ),\n                submissions.SubmissionDescriptor(\n                    path=(ROUND_NAME + \"/submissions/nontargeted/baseline_nt.zip\"),\n                    participant_id={\"baseline_id\": \"nt\"},\n                ),\n            ],\n            self.submissions.attacks.values(),\n        )\n        assertCountEqual(\n            self,\n            [\n                submissions.SubmissionDescriptor(\n                    path=(ROUND_NAME + \"/submissions/targeted/1.zip\"),\n                    participant_id={\"team_id\": 1},\n                ),\n                submissions.SubmissionDescriptor(\n                    path=(ROUND_NAME + \"/submissions/targeted/2.zip\"),\n                    participant_id={\"team_id\": 2},\n                ),\n            ],\n            self.submissions.targeted_attacks.values(),\n        )\n        assertCountEqual(\n            self,\n            [\n                submissions.SubmissionDescriptor(\n                    path=(ROUND_NAME + \"/submissions/defense/3.zip\"),\n                    participant_id={\"team_id\": 3},\n                ),\n                submissions.SubmissionDescriptor(\n                    path=(ROUND_NAME + \"/submissions/defense/baseline_adv_train.zip\"),\n                    participant_id={\"baseline_id\": \"adv_train\"},\n                ),\n            ],\n            self.submissions.defenses.values(),\n        )\n        self.assertEqual(\n            len(self.submissions.attacks)\n            + len(self.submissions.targeted_attacks)\n            + len(self.submissions.defenses),\n            len(\n                set(self.submissions.attacks.keys())\n                | set(self.submissions.targeted_attacks.keys())\n                | set(self.submissions.defenses.keys())\n            ),\n        )\n\n    def verify_datastore_entities(self):\n        # Verify 'SubmissionType' entities\n        assertCountEqual(\n            self,\n            [\n                self.datastore_client.entity(\n                    fake_cloud_client.FakeDatastoreKey(\"SubmissionType\", \"Attacks\")\n                ),\n                self.datastore_client.entity(\n                    fake_cloud_client.FakeDatastoreKey(\n                        \"SubmissionType\", \"TargetedAttacks\"\n                    )\n                ),\n                self.datastore_client.entity(\n                    fake_cloud_client.FakeDatastoreKey(\"SubmissionType\", \"Defenses\")\n                ),\n            ],\n            self.datastore_client.query_fetch(kind=\"SubmissionType\"),\n        )\n        # Verify 'Submission' entities\n        expected_submission_entities = []\n        for key_prefix, submission_entries in [\n            ((\"SubmissionType\", \"Attacks\"), self.submissions.attacks),\n            ((\"SubmissionType\", \"TargetedAttacks\"), self.submissions.targeted_attacks),\n            ((\"SubmissionType\", \"Defenses\"), self.submissions.defenses),\n        ]:\n            for k, v in submission_entries.items():\n                entity = self.datastore_client.entity(\n                    fake_cloud_client.FakeDatastoreKey(\n                        *(key_prefix + (\"Submission\", k))\n                    )\n                )\n                entity[\"submission_path\"] = v.path\n                entity.update(v.participant_id)\n                expected_submission_entities.append(entity)\n        assertCountEqual(\n            self,\n            expected_submission_entities,\n            self.datastore_client.query_fetch(kind=\"Submission\"),\n        )\n\n    def test_init_from_storage(self):\n        self.submissions.init_from_storage_write_to_datastore()\n        self.verify_submissions()\n        self.verify_datastore_entities()\n\n    def test_init_from_datastore(self):\n        # first we need to populate datastore\n        self.submissions.init_from_storage_write_to_datastore()\n        # now reset submission class and load data from datastore\n        self.submissions = submissions.CompetitionSubmissions(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            round_name=ROUND_NAME,\n        )\n        self.assertFalse(self.submissions.attacks)\n        self.assertFalse(self.submissions.targeted_attacks)\n        self.assertFalse(self.submissions.defenses)\n        self.submissions.init_from_datastore()\n        self.verify_submissions()\n\n    def test_get_all_attacks_ids(self):\n        self.submissions.init_from_storage_write_to_datastore()\n        # total will be two targeted and two not-targeted attacks,\n        # their IDs are generated sequentially\n        assertCountEqual(\n            self,\n            [\"SUBA000\", \"SUBA001\", \"SUBT000\", \"SUBT001\"],\n            self.submissions.get_all_attack_ids(),\n        )\n\n    def test_find_by_id(self):\n        self.submissions.init_from_storage_write_to_datastore()\n        self.assertEqual(\n            self.submissions.attacks[\"SUBA000\"], self.submissions.find_by_id(\"SUBA000\")\n        )\n        self.assertEqual(\n            self.submissions.targeted_attacks[\"SUBT001\"],\n            self.submissions.find_by_id(\"SUBT001\"),\n        )\n        self.assertEqual(\n            self.submissions.defenses[\"SUBD001\"], self.submissions.find_by_id(\"SUBD001\")\n        )\n\n    def test_get_external_id(self):\n        self.submissions.init_from_storage_write_to_datastore()\n        assertCountEqual(\n            self,\n            [3, \"baseline_adv_train\"],\n            [\n                self.submissions.get_external_id(\"SUBD000\"),\n                self.submissions.get_external_id(\"SUBD001\"),\n            ],\n        )\n        assertCountEqual(\n            self,\n            [1, \"baseline_nt\"],\n            [\n                self.submissions.get_external_id(\"SUBA000\"),\n                self.submissions.get_external_id(\"SUBA001\"),\n            ],\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/tests/work_data_test.py",
    "content": "\"\"\"Tests for eval_lib.work_data.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport copy\nimport unittest\n\nfrom six import assertCountEqual\nfrom six import itervalues\n\nfrom eval_lib import work_data\nfrom eval_lib.tests import fake_cloud_client\n\n\nTEST_WORK_TYPE_ENTITY_ID = \"AllWork\"\n\n\nclass WorkPiecesBaseTest(unittest.TestCase):\n    def setUp(self):\n        self.datastore_client = fake_cloud_client.FakeDatastoreClient()\n        self.work1 = {\n            \"submission_id\": \"s1\",\n            \"output_adversarial_batch_id\": \"o1\",\n            \"claimed_worker_id\": \"worker9999\",\n            \"claimed_worker_start_time\": -1,\n            \"is_completed\": True,\n        }\n        self.work2 = {\n            \"submission_id\": \"s2\",\n            \"output_adversarial_batch_id\": \"o2\",\n            \"claimed_worker_id\": None,\n            \"claimed_worker_start_time\": None,\n            \"is_completed\": False,\n        }\n\n    def reset_work_pieces(self):\n        self.work_pieces = work_data.WorkPiecesBase(\n            self.datastore_client, TEST_WORK_TYPE_ENTITY_ID\n        )\n\n    def test_is_unclaimed(self):\n        # completed work considered claimed\n        self.assertFalse(work_data.is_unclaimed(self.work1))\n        # not completed, not claimed work\n        self.assertTrue(work_data.is_unclaimed(self.work2))\n        # claimed but not completed work\n        self.work2[\"claimed_worker_id\"] = \"some_worker\"\n        self.work2[\"claimed_worker_start_time\"] = work_data.get_integer_time()\n        self.assertFalse(work_data.is_unclaimed(self.work2))\n        # work claimed too long ago considered unclaimed now\n        self.work2[\"claimed_worker_start_time\"] = (\n            work_data.get_integer_time() - work_data.MAX_PROCESSING_TIME - 1\n        )\n        self.assertTrue(work_data.is_unclaimed(self.work2))\n\n    def test_write_to_datastore(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w1\"] = self.work1\n        self.work_pieces.work[\"w2\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        # verify content of the datastore\n        parent_key = fake_cloud_client.FakeDatastoreKey(\n            work_data.KIND_WORK_TYPE, TEST_WORK_TYPE_ENTITY_ID\n        )\n        assertCountEqual(\n            self,\n            [fake_cloud_client.make_entity(parent_key)],\n            self.datastore_client.query_fetch(kind=work_data.KIND_WORK_TYPE),\n        )\n        entity1 = fake_cloud_client.make_entity(\n            fake_cloud_client.FakeDatastoreKey(\n                work_data.KIND_WORK, \"w1\", parent=parent_key\n            )\n        )\n        entity1.update(self.work1)\n        entity2 = fake_cloud_client.make_entity(\n            fake_cloud_client.FakeDatastoreKey(\n                work_data.KIND_WORK, \"w2\", parent=parent_key\n            )\n        )\n        entity2.update(self.work2)\n        assertCountEqual(\n            self,\n            [entity1, entity2],\n            self.datastore_client.query_fetch(kind=work_data.KIND_WORK),\n        )\n\n    def test_read_from_datastore(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        self.reset_work_pieces()\n        self.work_pieces.read_all_from_datastore()\n        # verify data\n        self.assertDictEqual(\n            {\"w10\": self.work1, \"w20\": self.work2}, self.work_pieces.work\n        )\n\n    def test_is_all_work_completed(self):\n        self.reset_work_pieces()\n        # empty set of work is considered completed\n        self.assertTrue(self.work_pieces.is_all_work_competed())\n        # one completed piece of work - all work completed\n        self.work_pieces.work[\"w11\"] = copy.deepcopy(self.work1)\n        self.assertTrue(self.work_pieces.is_all_work_competed())\n        # two completed pieces of work - all work completed\n        self.work_pieces.work[\"w12\"] = copy.deepcopy(self.work1)\n        self.assertTrue(self.work_pieces.is_all_work_competed())\n        # two completed and one incomplete pieces of work - work not completed\n        self.work_pieces.work[\"w2\"] = copy.deepcopy(self.work2)\n        self.assertFalse(self.work_pieces.is_all_work_competed())\n\n    def test_read_undone_from_datastore(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        self.reset_work_pieces()\n        # return value is None because sharding is not used\n        self.assertIsNone(self.work_pieces.read_undone_from_datastore())\n        # Only work with ID 'w20' is undone\n        self.assertDictEqual({\"w20\": self.work2}, self.work_pieces.work)\n\n    def test_read_undone_from_datastore_same_shards(self):\n        self.reset_work_pieces()\n        self.work1[\"shard_id\"] = 1\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work2[\"shard_id\"] = 2\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        self.reset_work_pieces()\n        # return value is ID of the shard with undone work\n        self.assertEqual(\n            2, self.work_pieces.read_undone_from_datastore(shard_id=2, num_shards=3)\n        )\n        # Only work with ID 'w20' is undone\n        self.assertDictEqual({\"w20\": self.work2}, self.work_pieces.work)\n\n    def test_read_undone_from_datastore_different_shards(self):\n        self.reset_work_pieces()\n        self.work1[\"shard_id\"] = 1\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work2[\"shard_id\"] = 2\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        self.reset_work_pieces()\n        # return value is ID of the shard with undone work\n        self.assertEqual(\n            2, self.work_pieces.read_undone_from_datastore(shard_id=1, num_shards=3)\n        )\n        # Only work with ID 'w20' is undone\n        self.assertDictEqual({\"w20\": self.work2}, self.work_pieces.work)\n\n    def test_try_pick_piece_of_work_simple(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        work_id = self.work_pieces.try_pick_piece_of_work(\"worker0\")\n        self.assertEqual(\"w20\", work_id)\n        self.reset_work_pieces()\n        self.work_pieces.read_all_from_datastore()\n        self.assertEqual(\"worker0\", self.work_pieces.work[\"w20\"][\"claimed_worker_id\"])\n\n    def test_try_pick_piece_of_work_all_completed(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.work[\"w20\"][\"is_completed\"] = True\n        self.work_pieces.write_all_to_datastore()\n        work_id = self.work_pieces.try_pick_piece_of_work(\"worker0\")\n        self.assertIsNone(work_id)\n\n    def test_try_pick_piece_of_work_already_claimed(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work2[\"claimed_worker_id\"] = \"other_worker\"\n        self.work2[\"claimed_worker_start_time\"] = work_data.get_integer_time()\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        work_id = self.work_pieces.try_pick_piece_of_work(\"worker0\")\n        # if work is claimed by another worker then it won't be picked\n        self.assertIsNone(work_id)\n\n    def test_try_pick_piece_of_work_claimed_long_ago(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work2[\"claimed_worker_id\"] = \"other_worker\"\n        self.work2[\"claimed_worker_start_time\"] = (\n            work_data.get_integer_time() - work_data.MAX_PROCESSING_TIME * 2\n        )\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        work_id = self.work_pieces.try_pick_piece_of_work(\"worker0\")\n        # if work is claimed by another worker, but it happened some time ago\n        # then work will be claimed\n        self.assertEqual(\"w20\", work_id)\n\n    def test_try_pick_piece_of_work_concurrent_update(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        # any concurrent change in the entity will cause transaction to fail\n\n        def transaction_hook(client):\n            key = client.key(\"WorkType\", TEST_WORK_TYPE_ENTITY_ID, \"Work\", \"w20\")\n            client.entities[key][\"output_adversarial_batch_id\"] = \"o3\"\n\n        self.datastore_client.set_transaction_hook(transaction_hook)\n        work_id = self.work_pieces.try_pick_piece_of_work(\"worker0\")\n        self.assertIsNone(work_id)\n\n    def test_try_pick_piece_of_work_concurrent_update_of_other(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work_pieces.write_all_to_datastore()\n        # concurrent change in entity which is not touched by the transaction\n        # won't prevent transaction from completing\n\n        def transaction_hook(client):\n            key = client.key(\"WorkType\", TEST_WORK_TYPE_ENTITY_ID, \"Work\", \"w10\")\n            client.entities[key][\"output_adversarial_batch_id\"] = \"o3\"\n\n        self.datastore_client.set_transaction_hook(transaction_hook)\n        work_id = self.work_pieces.try_pick_piece_of_work(\"worker0\")\n        self.assertEqual(\"w20\", work_id)\n\n    def test_update_work_as_completed(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work2[\"claimed_worker_id\"] = \"this_worker\"\n        self.work2[\"claimed_worker_start_time\"] = work_data.get_integer_time()\n        self.work_pieces.write_all_to_datastore()\n        self.assertTrue(self.work_pieces.update_work_as_completed(\"this_worker\", \"w20\"))\n        self.reset_work_pieces()\n        self.work_pieces.read_all_from_datastore()\n        self.assertTrue(self.work_pieces.work[\"w20\"][\"is_completed\"])\n        self.assertNotIn(\"error\", self.work_pieces.work[\"w20\"])\n\n    def test_update_work_as_completed_other_values(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work2[\"claimed_worker_id\"] = \"this_worker\"\n        self.work2[\"claimed_worker_start_time\"] = work_data.get_integer_time()\n        self.work_pieces.write_all_to_datastore()\n        self.assertTrue(\n            self.work_pieces.update_work_as_completed(\n                \"this_worker\", \"w20\", other_values={\"a\": 123, \"b\": 456}\n            )\n        )\n        self.reset_work_pieces()\n        self.work_pieces.read_all_from_datastore()\n        self.assertTrue(self.work_pieces.work[\"w20\"][\"is_completed\"])\n        self.assertNotIn(\"error\", self.work_pieces.work[\"w20\"])\n        self.assertEqual(123, self.work_pieces.work[\"w20\"][\"a\"])\n        self.assertEqual(456, self.work_pieces.work[\"w20\"][\"b\"])\n\n    def test_update_work_as_completed_with_error(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work2[\"claimed_worker_id\"] = \"this_worker\"\n        self.work2[\"claimed_worker_start_time\"] = work_data.get_integer_time()\n        self.work_pieces.write_all_to_datastore()\n        self.assertTrue(\n            self.work_pieces.update_work_as_completed(\"this_worker\", \"w20\", error=\"err\")\n        )\n        self.reset_work_pieces()\n        self.work_pieces.read_all_from_datastore()\n        self.assertTrue(self.work_pieces.work[\"w20\"][\"is_completed\"])\n        self.assertEqual(\"err\", self.work_pieces.work[\"w20\"][\"error\"])\n\n    def test_update_work_as_completed_wrong_claimed_worker(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w10\"] = self.work1\n        self.work_pieces.work[\"w20\"] = self.work2\n        self.work2[\"claimed_worker_id\"] = \"other_worker\"\n        self.work2[\"claimed_worker_start_time\"] = work_data.get_integer_time()\n        self.work_pieces.write_all_to_datastore()\n        self.assertFalse(\n            self.work_pieces.update_work_as_completed(\"this_worker\", \"w20\")\n        )\n        self.reset_work_pieces()\n        self.work_pieces.read_all_from_datastore()\n        self.assertFalse(self.work_pieces.work[\"w20\"][\"is_completed\"])\n\n    def test_compute_work_stats(self):\n        self.reset_work_pieces()\n        self.work_pieces.work[\"w11\"] = {\n            \"submission_id\": \"s1\",\n            \"output_adversarial_batch_id\": \"o1\",\n            \"claimed_worker_id\": \"worker1\",\n            \"claimed_worker_start_time\": -1,\n            \"is_completed\": True,\n            \"elapsed_time\": 1,\n        }\n        self.work_pieces.work[\"w12\"] = {\n            \"submission_id\": \"s1\",\n            \"output_adversarial_batch_id\": \"o2\",\n            \"claimed_worker_id\": \"worker2\",\n            \"claimed_worker_start_time\": -1,\n            \"is_completed\": False,\n        }\n        self.work_pieces.work[\"w21\"] = {\n            \"submission_id\": \"s2\",\n            \"output_adversarial_batch_id\": \"o1\",\n            \"claimed_worker_id\": \"worker1\",\n            \"claimed_worker_start_time\": -1,\n            \"is_completed\": True,\n            \"elapsed_time\": 5,\n        }\n        self.work_pieces.work[\"w22\"] = {\n            \"submission_id\": \"s2\",\n            \"output_adversarial_batch_id\": \"o2\",\n            \"claimed_worker_id\": \"worker2\",\n            \"claimed_worker_start_time\": -1,\n            \"is_completed\": True,\n            \"elapsed_time\": 10,\n            \"error\": \"err\",\n        }\n        self.work_pieces.work[\"w23\"] = {\n            \"submission_id\": \"s2\",\n            \"output_adversarial_batch_id\": \"o1\",\n            \"claimed_worker_id\": \"worker1\",\n            \"claimed_worker_start_time\": -1,\n            \"is_completed\": True,\n            \"elapsed_time\": 7,\n        }\n        stats = self.work_pieces.compute_work_statistics()\n        for v in itervalues(stats):\n            v[\"eval_times\"] = sorted(v[\"eval_times\"])\n        self.assertDictEqual(\n            {\n                \"s1\": {\n                    \"completed\": 1,\n                    \"num_errors\": 0,\n                    \"error_messages\": set(),\n                    \"eval_times\": [1.0],\n                    \"min_eval_time\": 1.0,\n                    \"max_eval_time\": 1.0,\n                    \"mean_eval_time\": 1.0,\n                    \"median_eval_time\": 1.0,\n                },\n                \"s2\": {\n                    \"completed\": 3,\n                    \"num_errors\": 1,\n                    \"error_messages\": set([\"err\"]),\n                    \"eval_times\": [5.0, 7.0],\n                    \"min_eval_time\": 5.0,\n                    \"max_eval_time\": 7.0,\n                    \"mean_eval_time\": 6.0,\n                    \"median_eval_time\": 6.0,\n                },\n            },\n            stats,\n        )\n\n\nclass AttackWorkPiecesTest(unittest.TestCase):\n    def setUp(self):\n        self.datastore_client = fake_cloud_client.FakeDatastoreClient()\n\n    def test_init_from_adversarial_batches(self):\n        adv_batches = {\n            \"ADVBATCH000\": {\"submission_id\": \"s1\"},\n            \"ADVBATCH001\": {\"submission_id\": \"s2\"},\n            \"ADVBATCH002\": {\"submission_id\": \"s3\"},\n        }\n        expected_values = [\n            {\n                \"claimed_worker_id\": None,\n                \"claimed_worker_start_time\": None,\n                \"is_completed\": False,\n                \"error\": None,\n                \"elapsed_time\": None,\n                \"submission_id\": \"s1\",\n                \"shard_id\": None,\n                \"output_adversarial_batch_id\": \"ADVBATCH000\",\n            },\n            {\n                \"claimed_worker_id\": None,\n                \"claimed_worker_start_time\": None,\n                \"is_completed\": False,\n                \"error\": None,\n                \"elapsed_time\": None,\n                \"submission_id\": \"s2\",\n                \"shard_id\": None,\n                \"output_adversarial_batch_id\": \"ADVBATCH001\",\n            },\n            {\n                \"claimed_worker_id\": None,\n                \"claimed_worker_start_time\": None,\n                \"is_completed\": False,\n                \"error\": None,\n                \"elapsed_time\": None,\n                \"submission_id\": \"s3\",\n                \"shard_id\": None,\n                \"output_adversarial_batch_id\": \"ADVBATCH002\",\n            },\n        ]\n        attack_work = work_data.AttackWorkPieces(self.datastore_client)\n        attack_work.init_from_adversarial_batches(adv_batches)\n        assertCountEqual(self, expected_values, attack_work.work.values())\n        attack_work.write_all_to_datastore()\n        attack_work = work_data.AttackWorkPieces(self.datastore_client)\n        attack_work.read_all_from_datastore()\n        assertCountEqual(self, expected_values, attack_work.work.values())\n\n\nclass DefenseWorkPiecesTest(unittest.TestCase):\n    def setUp(self):\n        self.datastore_client = fake_cloud_client.FakeDatastoreClient()\n\n    def test_init_from_classification_batches(self):\n        class_batches = {\n            \"CBATCH000000\": {\"submission_id\": \"s1\"},\n            \"CBATCH000001\": {\"submission_id\": \"s2\"},\n            \"CBATCH000002\": {\"submission_id\": \"s3\"},\n        }\n        expected_values = [\n            {\n                \"claimed_worker_id\": None,\n                \"claimed_worker_start_time\": None,\n                \"is_completed\": False,\n                \"error\": None,\n                \"elapsed_time\": None,\n                \"submission_id\": \"s1\",\n                \"shard_id\": None,\n                \"output_classification_batch_id\": \"CBATCH000000\",\n            },\n            {\n                \"claimed_worker_id\": None,\n                \"claimed_worker_start_time\": None,\n                \"is_completed\": False,\n                \"error\": None,\n                \"elapsed_time\": None,\n                \"submission_id\": \"s2\",\n                \"shard_id\": None,\n                \"output_classification_batch_id\": \"CBATCH000001\",\n            },\n            {\n                \"claimed_worker_id\": None,\n                \"claimed_worker_start_time\": None,\n                \"is_completed\": False,\n                \"error\": None,\n                \"elapsed_time\": None,\n                \"submission_id\": \"s3\",\n                \"shard_id\": None,\n                \"output_classification_batch_id\": \"CBATCH000002\",\n            },\n        ]\n        defense_work = work_data.DefenseWorkPieces(self.datastore_client)\n        defense_work.init_from_class_batches(class_batches)\n        assertCountEqual(self, expected_values, defense_work.work.values())\n        defense_work.write_all_to_datastore()\n        defense_work = work_data.DefenseWorkPieces(self.datastore_client)\n        defense_work.read_all_from_datastore()\n        assertCountEqual(self, expected_values, defense_work.work.values())\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/eval_lib/work_data.py",
    "content": "\"\"\"Module with classes to read and store data about work entities.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom builtins import int  # long in python 2\n\nfrom io import StringIO\nimport pickle\nimport random\nimport time\n\nimport numpy as np\n\nfrom six import iteritems\nfrom six import itervalues\nfrom six import text_type\n\n\n# Cloud Datastore constants\nKIND_WORK_TYPE = u\"WorkType\"\nKIND_WORK = u\"Work\"\nID_ATTACKS_WORK_ENTITY = u\"AllAttacks\"\nID_DEFENSES_WORK_ENTITY = u\"AllDefenses\"\n\nATTACK_WORK_ID_PATTERN = u\"WORKA{:03}\"\nDEFENSE_WORK_ID_PATTERN = u\"WORKD{:05}\"\n\n# Constants for __str__\nTO_STR_MAX_WORK = 20\n\n# How long worker is allowed to process one piece of work,\n# before considered failed\nMAX_PROCESSING_TIME = 600\n\n# Number of work records to read at once\nMAX_WORK_RECORDS_READ = 1000\n\n\ndef get_integer_time():\n    \"\"\"Returns current time in long integer format.\"\"\"\n    return int(time.time())\n\n\ndef is_unclaimed(work):\n    \"\"\"Returns True if work piece is unclaimed.\"\"\"\n    if work[\"is_completed\"]:\n        return False\n    cutoff_time = time.time() - MAX_PROCESSING_TIME\n    if (\n        work[\"claimed_worker_id\"]\n        and work[\"claimed_worker_start_time\"] is not None\n        and work[\"claimed_worker_start_time\"] >= cutoff_time\n    ):\n        return False\n    return True\n\n\nclass WorkPiecesBase(object):\n    \"\"\"Base class to store one piece of work.\n\n    In adversarial competition, all work consists of the following:\n    - evaluation of all attacks on all images from dataset which results in\n      generation of adversarial images;\n    - evaluation of all defenses on all adversarial images which results in\n      storing classification labels.\n\n    One piece of work is either evaluation of one attack on a subset of images or\n    evaluation of one defense on a subset of adversarial images.\n    This way all work is split into work pieces which could be computed\n    independently in parallel by different workers.\n\n    Each work piece is identified by unique ID and has one of the following\n    statuses:\n    - Unclaimed. This means that no worker has started working on the work piece.\n    - Claimed by worker NN. This means that worker NN is working on this work\n      piece. After workpiece being claimed for too long (more than\n      MAX_PROCESSING_TIME seconds) it automatically considered unclaimed. This\n      is needed in case worker failed while processing the work piece.\n    - Completed. This means that computation of work piece is done.\n\n    Additionally each work piece may be assigned to a shard. In such case\n    workers are also grouped into shards. Each time worker looking for a work\n    piece it first tries to find undone work from the shard worker is assigned to.\n    Only after all work from this shard is done, worker will try to claim\n    work pieces from other shards.\n\n    The purpose of sharding is to reduce load on Google Cloud Datastore.\n    \"\"\"\n\n    def __init__(self, datastore_client, work_type_entity_id):\n        \"\"\"Initializes WorkPiecesBase class.\n\n        Args:\n          datastore_client: instance of CompetitionDatastoreClient.\n          work_type_entity_id: ID of the WorkType parent entity\n        \"\"\"\n        self._datastore_client = datastore_client\n        self._work_type_entity_id = work_type_entity_id\n        # Dictionary: work_id -> dict with properties of the piece of work\n        #\n        # Common properties are following:\n        # - claimed_worker_id - worker id which claimed the work\n        # - claimed_worker_start_time - when work was claimed\n        # - is_completed - whether work is completed or not\n        # - error - if not None then work was completed with error\n        # - elapsed_time - time took to complete the work\n        # - shard_id - ID of the shard which run the work\n        # - submission_id - ID of the submission which should be executed\n        #\n        # Additionally piece of work will have property specific to work type:\n        # output_adversarial_batch_id for attack and output_classification_batch_id\n        # for defense. Also upon completion of the work, worker may write\n        # additional statistics field to the work.\n        self._work = {}\n\n    def serialize(self, fobj):\n        \"\"\"Serialize work pieces into file object.\"\"\"\n        pickle.dump(self._work, fobj)\n\n    def deserialize(self, fobj):\n        \"\"\"Deserialize work pieces from file object.\"\"\"\n        self._work = pickle.load(fobj)\n\n    @property\n    def work(self):\n        \"\"\"Dictionary with all work pieces.\"\"\"\n        return self._work\n\n    def replace_work(self, value):\n        \"\"\"Replaces work with provided value.\n\n        Generally this method should be called only by master, that's why it\n        separated from the property self.work.\n\n        Args:\n          value: dictionary with new work pieces\n        \"\"\"\n        assert isinstance(value, dict)\n        self._work = value\n\n    def __len__(self):\n        return len(self._work)\n\n    def is_all_work_competed(self):\n        \"\"\"Returns whether all work pieces are completed or not.\"\"\"\n        return all([w[\"is_completed\"] for w in itervalues(self.work)])\n\n    def write_all_to_datastore(self):\n        \"\"\"Writes all work pieces into datastore.\n\n        Each work piece is identified by ID. This method writes/updates only those\n        work pieces which IDs are stored in this class. For examples, if this class\n        has only work pieces with IDs  '1' ... '100' and datastore already contains\n        work pieces with IDs '50' ... '200' then this method will create new\n        work pieces with IDs '1' ... '49', update work pieces with IDs\n        '50' ... '100' and keep unchanged work pieces with IDs '101' ... '200'.\n        \"\"\"\n        client = self._datastore_client\n        with client.no_transact_batch() as batch:\n            parent_key = client.key(KIND_WORK_TYPE, self._work_type_entity_id)\n            batch.put(client.entity(parent_key))\n            for work_id, work_val in iteritems(self._work):\n                entity = client.entity(\n                    client.key(KIND_WORK, work_id, parent=parent_key)\n                )\n                entity.update(work_val)\n                batch.put(entity)\n\n    def read_all_from_datastore(self):\n        \"\"\"Reads all work pieces from the datastore.\"\"\"\n        self._work = {}\n        client = self._datastore_client\n        parent_key = client.key(KIND_WORK_TYPE, self._work_type_entity_id)\n        for entity in client.query_fetch(kind=KIND_WORK, ancestor=parent_key):\n            work_id = entity.key.flat_path[-1]\n            self.work[work_id] = dict(entity)\n\n    def _read_undone_shard_from_datastore(self, shard_id=None):\n        \"\"\"Reads undone worke pieces which are assigned to shard with given id.\"\"\"\n        self._work = {}\n        client = self._datastore_client\n        parent_key = client.key(KIND_WORK_TYPE, self._work_type_entity_id)\n        filters = [(\"is_completed\", \"=\", False)]\n        if shard_id is not None:\n            filters.append((\"shard_id\", \"=\", shard_id))\n        for entity in client.query_fetch(\n            kind=KIND_WORK, ancestor=parent_key, filters=filters\n        ):\n            work_id = entity.key.flat_path[-1]\n            self.work[work_id] = dict(entity)\n            if len(self._work) >= MAX_WORK_RECORDS_READ:\n                break\n\n    def read_undone_from_datastore(self, shard_id=None, num_shards=None):\n        \"\"\"Reads undone work from the datastore.\n\n        If shard_id and num_shards are specified then this method will attempt\n        to read undone work for shard with id shard_id. If no undone work was found\n        then it will try to read shard (shard_id+1) and so on until either found\n        shard with undone work or all shards are read.\n\n        Args:\n          shard_id: Id of the start shard\n          num_shards: total number of shards\n\n        Returns:\n          id of the shard with undone work which was read. None means that work\n          from all datastore was read.\n        \"\"\"\n        if shard_id is not None:\n            shards_list = [(i + shard_id) % num_shards for i in range(num_shards)]\n        else:\n            shards_list = []\n        shards_list.append(None)\n        for shard in shards_list:\n            self._read_undone_shard_from_datastore(shard)\n            if self._work:\n                return shard\n        return None\n\n    def try_pick_piece_of_work(self, worker_id, submission_id=None):\n        \"\"\"Tries pick next unclaimed piece of work to do.\n\n        Attempt to claim work piece is done using Cloud Datastore transaction, so\n        only one worker can claim any work piece at a time.\n\n        Args:\n          worker_id: ID of current worker\n          submission_id: if not None then this method will try to pick\n            piece of work for this submission\n\n        Returns:\n          ID of the claimed work piece\n        \"\"\"\n        client = self._datastore_client\n        unclaimed_work_ids = None\n        if submission_id:\n            unclaimed_work_ids = [\n                k\n                for k, v in iteritems(self.work)\n                if is_unclaimed(v) and (v[\"submission_id\"] == submission_id)\n            ]\n        if not unclaimed_work_ids:\n            unclaimed_work_ids = [k for k, v in iteritems(self.work) if is_unclaimed(v)]\n        if unclaimed_work_ids:\n            next_work_id = random.choice(unclaimed_work_ids)\n        else:\n            return None\n        try:\n            with client.transaction() as transaction:\n                work_key = client.key(\n                    KIND_WORK_TYPE, self._work_type_entity_id, KIND_WORK, next_work_id\n                )\n                work_entity = client.get(work_key, transaction=transaction)\n                if not is_unclaimed(work_entity):\n                    return None\n                work_entity[\"claimed_worker_id\"] = worker_id\n                work_entity[\"claimed_worker_start_time\"] = get_integer_time()\n                transaction.put(work_entity)\n        except Exception:\n            return None\n        return next_work_id\n\n    def update_work_as_completed(\n        self, worker_id, work_id, other_values=None, error=None\n    ):\n        \"\"\"Updates work piece in datastore as completed.\n\n        Args:\n          worker_id: ID of the worker which did the work\n          work_id: ID of the work which was done\n          other_values: dictionary with additonal values which should be saved\n            with the work piece\n          error: if not None then error occurred during computation of the work\n            piece. In such case work will be marked as completed with error.\n\n        Returns:\n          whether work was successfully updated\n        \"\"\"\n        client = self._datastore_client\n        try:\n            with client.transaction() as transaction:\n                work_key = client.key(\n                    KIND_WORK_TYPE, self._work_type_entity_id, KIND_WORK, work_id\n                )\n                work_entity = client.get(work_key, transaction=transaction)\n                if work_entity[\"claimed_worker_id\"] != worker_id:\n                    return False\n                work_entity[\"is_completed\"] = True\n                if other_values:\n                    work_entity.update(other_values)\n                if error:\n                    work_entity[\"error\"] = text_type(error)\n                transaction.put(work_entity)\n        except Exception:\n            return False\n        return True\n\n    def compute_work_statistics(self):\n        \"\"\"Computes statistics from all work pieces stored in this class.\"\"\"\n        result = {}\n        for v in itervalues(self.work):\n            submission_id = v[\"submission_id\"]\n            if submission_id not in result:\n                result[submission_id] = {\n                    \"completed\": 0,\n                    \"num_errors\": 0,\n                    \"error_messages\": set(),\n                    \"eval_times\": [],\n                    \"min_eval_time\": None,\n                    \"max_eval_time\": None,\n                    \"mean_eval_time\": None,\n                    \"median_eval_time\": None,\n                }\n            if not v[\"is_completed\"]:\n                continue\n            result[submission_id][\"completed\"] += 1\n            if \"error\" in v and v[\"error\"]:\n                result[submission_id][\"num_errors\"] += 1\n                result[submission_id][\"error_messages\"].add(v[\"error\"])\n            else:\n                result[submission_id][\"eval_times\"].append(float(v[\"elapsed_time\"]))\n        for v in itervalues(result):\n            if v[\"eval_times\"]:\n                v[\"min_eval_time\"] = np.min(v[\"eval_times\"])\n                v[\"max_eval_time\"] = np.max(v[\"eval_times\"])\n                v[\"mean_eval_time\"] = np.mean(v[\"eval_times\"])\n                v[\"median_eval_time\"] = np.median(v[\"eval_times\"])\n        return result\n\n    def __str__(self):\n        buf = StringIO()\n        buf.write(u'WorkType \"{0}\"\\n'.format(self._work_type_entity_id))\n        for idx, (work_id, work_val) in enumerate(iteritems(self.work)):\n            if idx >= TO_STR_MAX_WORK:\n                buf.write(u\"  ...\\n\")\n                break\n            buf.write(u'  Work \"{0}\"\\n'.format(work_id))\n            buf.write(u\"    {0}\\n\".format(str(work_val)))\n        return buf.getvalue()\n\n\nclass AttackWorkPieces(WorkPiecesBase):\n    \"\"\"Subclass which represents work pieces for adversarial attacks.\"\"\"\n\n    def __init__(self, datastore_client):\n        \"\"\"Initializes AttackWorkPieces.\"\"\"\n        super(AttackWorkPieces, self).__init__(\n            datastore_client=datastore_client,\n            work_type_entity_id=ID_ATTACKS_WORK_ENTITY,\n        )\n\n    def init_from_adversarial_batches(self, adv_batches):\n        \"\"\"Initializes work pieces from adversarial batches.\n\n        Args:\n          adv_batches: dict with adversarial batches,\n            could be obtained as AversarialBatches.data\n        \"\"\"\n        for idx, (adv_batch_id, adv_batch_val) in enumerate(iteritems(adv_batches)):\n            work_id = ATTACK_WORK_ID_PATTERN.format(idx)\n            self.work[work_id] = {\n                \"claimed_worker_id\": None,\n                \"claimed_worker_start_time\": None,\n                \"is_completed\": False,\n                \"error\": None,\n                \"elapsed_time\": None,\n                \"submission_id\": adv_batch_val[\"submission_id\"],\n                \"shard_id\": None,\n                \"output_adversarial_batch_id\": adv_batch_id,\n            }\n\n\nclass DefenseWorkPieces(WorkPiecesBase):\n    \"\"\"Subclass which represents work pieces for adversarial defenses.\"\"\"\n\n    def __init__(self, datastore_client):\n        \"\"\"Initializes DefenseWorkPieces.\"\"\"\n        super(DefenseWorkPieces, self).__init__(\n            datastore_client=datastore_client,\n            work_type_entity_id=ID_DEFENSES_WORK_ENTITY,\n        )\n\n    def init_from_class_batches(self, class_batches, num_shards=None):\n        \"\"\"Initializes work pieces from classification batches.\n\n        Args:\n          class_batches: dict with classification batches, could be obtained\n            as ClassificationBatches.data\n          num_shards: number of shards to split data into,\n            if None then no sharding is done.\n        \"\"\"\n        shards_for_submissions = {}\n        shard_idx = 0\n        for idx, (batch_id, batch_val) in enumerate(iteritems(class_batches)):\n            work_id = DEFENSE_WORK_ID_PATTERN.format(idx)\n            submission_id = batch_val[\"submission_id\"]\n            shard_id = None\n            if num_shards:\n                shard_id = shards_for_submissions.get(submission_id)\n                if shard_id is None:\n                    shard_id = shard_idx % num_shards\n                    shards_for_submissions[submission_id] = shard_id\n                    shard_idx += 1\n            # Note: defense also might have following fields populated by worker:\n            # stat_correct, stat_error, stat_target_class, stat_num_images\n            self.work[work_id] = {\n                \"claimed_worker_id\": None,\n                \"claimed_worker_start_time\": None,\n                \"is_completed\": False,\n                \"error\": None,\n                \"elapsed_time\": None,\n                \"submission_id\": submission_id,\n                \"shard_id\": shard_id,\n                \"output_classification_batch_id\": batch_id,\n            }\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/master.py",
    "content": "\"\"\"Master which prepares work for all workers.\n\nEvaluation of competition is split into work pieces. One work piece is a\neither evaluation of an attack on a batch of images or evaluation of a\ndefense on a batch of adversarial images.\nWork pieces are run by workers. Master prepares work pieces for workers and\nwrites them to the datastore.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport argparse\nimport collections\nfrom collections import defaultdict\nimport csv\nfrom io import BytesIO\nimport logging\nimport os\nimport pickle\nimport random\nimport time\n\nfrom six import iteritems\nfrom six import iterkeys\nfrom six import itervalues\nfrom six.moves import input as input_str\n\nimport eval_lib\n\n\n# List of allowed sizes of adversarial perturbation\nALLOWED_EPS = [4, 8, 12, 16]\n\n# Batch size\nDEFAULT_BATCH_SIZE = 100\n\n\ndef print_header(text):\n    \"\"\"Prints header with given text and frame composed of '#' characters.\"\"\"\n    print()\n    print(\"#\" * (len(text) + 4))\n    print(\"# \" + text + \" #\")\n    print(\"#\" * (len(text) + 4))\n    print()\n\n\ndef save_dict_to_file(filename, dictionary):\n    \"\"\"Saves dictionary as CSV file.\"\"\"\n    with open(filename, \"w\") as f:\n        writer = csv.writer(f)\n        for k, v in iteritems(dictionary):\n            writer.writerow([str(k), str(v)])\n\n\nclass EvaluationMaster(object):\n    \"\"\"Class which encapsulates logit of the master.\"\"\"\n\n    def __init__(\n        self,\n        storage_client,\n        datastore_client,\n        round_name,\n        dataset_name,\n        blacklisted_submissions=\"\",\n        results_dir=\"\",\n        num_defense_shards=None,\n        verbose=False,\n        batch_size=DEFAULT_BATCH_SIZE,\n        max_dataset_num_images=None,\n    ):\n        \"\"\"Initializes EvaluationMaster.\n\n        Args:\n          storage_client: instance of eval_lib.CompetitionStorageClient\n          datastore_client: instance of eval_lib.CompetitionDatastoreClient\n          round_name: name of the current round\n          dataset_name: name of the dataset, 'dev' or 'final'\n          blacklisted_submissions: optional list of blacklisted submissions which\n            should not be evaluated\n          results_dir: local directory where results and logs should be written\n          num_defense_shards: optional number of defense shards\n          verbose: whether output should be verbose on not. If True, then methods\n            of this class will print some additional information which is useful\n            for debugging.\n          batch_size: batch size to use\n          max_dataset_num_images: maximum number of images from the dataset to use\n            or None if entire dataset should be used.\n        \"\"\"\n        self.storage_client = storage_client\n        self.datastore_client = datastore_client\n        self.round_name = round_name\n        self.dataset_name = dataset_name\n        self.results_dir = results_dir\n        if num_defense_shards:\n            self.num_defense_shards = int(num_defense_shards)\n        else:\n            self.num_defense_shards = None\n        self.verbose = verbose\n        self.blacklisted_submissions = [\n            s.strip() for s in blacklisted_submissions.split(\",\")\n        ]\n        self.batch_size = batch_size\n        self.max_dataset_num_images = max_dataset_num_images\n        # init client classes\n        self.submissions = eval_lib.CompetitionSubmissions(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            round_name=self.round_name,\n        )\n        self.dataset_batches = eval_lib.DatasetBatches(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            dataset_name=self.dataset_name,\n        )\n        self.adv_batches = eval_lib.AversarialBatches(\n            datastore_client=self.datastore_client\n        )\n        self.class_batches = eval_lib.ClassificationBatches(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            round_name=self.round_name,\n        )\n        self.attack_work = eval_lib.AttackWorkPieces(\n            datastore_client=self.datastore_client\n        )\n        self.defense_work = eval_lib.DefenseWorkPieces(\n            datastore_client=self.datastore_client\n        )\n\n    def ask_when_work_is_populated(self, work):\n        \"\"\"When work is already populated asks whether we should continue.\n\n        This method prints warning message that work is populated and asks\n        whether user wants to continue or not.\n\n        Args:\n          work: instance of WorkPiecesBase\n\n        Returns:\n          True if we should continue and populate datastore, False if we should stop\n        \"\"\"\n        work.read_all_from_datastore()\n        if work.work:\n            print(\n                \"Work is already written to datastore.\\n\"\n                \"If you continue these data will be overwritten and \"\n                \"possible corrupted.\"\n            )\n            inp = input_str(\n                \"Do you want to continue? \" '(type \"yes\" without quotes to confirm): '\n            )\n            return inp == \"yes\"\n        else:\n            return True\n\n    def prepare_attacks(self):\n        \"\"\"Prepares all data needed for evaluation of attacks.\"\"\"\n        print_header(\"PREPARING ATTACKS DATA\")\n        # verify that attacks data not written yet\n        if not self.ask_when_work_is_populated(self.attack_work):\n            return\n        self.attack_work = eval_lib.AttackWorkPieces(\n            datastore_client=self.datastore_client\n        )\n        # prepare submissions\n        print_header(\"Initializing submissions\")\n        self.submissions.init_from_storage_write_to_datastore()\n        if self.verbose:\n            print(self.submissions)\n        # prepare dataset batches\n        print_header(\"Initializing dataset batches\")\n        self.dataset_batches.init_from_storage_write_to_datastore(\n            batch_size=self.batch_size,\n            allowed_epsilon=ALLOWED_EPS,\n            skip_image_ids=[],\n            max_num_images=self.max_dataset_num_images,\n        )\n        if self.verbose:\n            print(self.dataset_batches)\n        # prepare adversarial batches\n        print_header(\"Initializing adversarial batches\")\n        self.adv_batches.init_from_dataset_and_submissions_write_to_datastore(\n            dataset_batches=self.dataset_batches,\n            attack_submission_ids=self.submissions.get_all_attack_ids(),\n        )\n        if self.verbose:\n            print(self.adv_batches)\n        # prepare work pieces\n        print_header(\"Preparing attack work pieces\")\n        self.attack_work.init_from_adversarial_batches(self.adv_batches.data)\n        self.attack_work.write_all_to_datastore()\n        if self.verbose:\n            print(self.attack_work)\n\n    def prepare_defenses(self):\n        \"\"\"Prepares all data needed for evaluation of defenses.\"\"\"\n        print_header(\"PREPARING DEFENSE DATA\")\n        # verify that defense data not written yet\n        if not self.ask_when_work_is_populated(self.defense_work):\n            return\n        self.defense_work = eval_lib.DefenseWorkPieces(\n            datastore_client=self.datastore_client\n        )\n        # load results of attacks\n        self.submissions.init_from_datastore()\n        self.dataset_batches.init_from_datastore()\n        self.adv_batches.init_from_datastore()\n        self.attack_work.read_all_from_datastore()\n        # populate classification results\n        print_header(\"Initializing classification batches\")\n        self.class_batches.init_from_adversarial_batches_write_to_datastore(\n            self.submissions, self.adv_batches\n        )\n        if self.verbose:\n            print(self.class_batches)\n        # populate work pieces\n        print_header(\"Preparing defense work pieces\")\n        self.defense_work.init_from_class_batches(\n            self.class_batches.data, num_shards=self.num_defense_shards\n        )\n        self.defense_work.write_all_to_datastore()\n        if self.verbose:\n            print(self.defense_work)\n\n    def _save_work_results(self, run_stats, scores, num_processed_images, filename):\n        \"\"\"Saves statistics about each submission.\n\n        Saved statistics include score; number of completed and failed batches;\n        min, max, average and median time needed to run one batch.\n\n        Args:\n          run_stats: dictionary with runtime statistics for submissions,\n            can be generated by WorkPiecesBase.compute_work_statistics\n          scores: dictionary mapping submission ids to scores\n          num_processed_images: dictionary with number of successfully processed\n            images by each submission, one of the outputs of\n            ClassificationBatches.compute_classification_results\n          filename: output filename\n        \"\"\"\n        with open(filename, \"w\") as f:\n            writer = csv.writer(f)\n            writer.writerow(\n                [\n                    \"SubmissionID\",\n                    \"ExternalSubmissionId\",\n                    \"Score\",\n                    \"CompletedBatches\",\n                    \"BatchesWithError\",\n                    \"ProcessedImages\",\n                    \"MinEvalTime\",\n                    \"MaxEvalTime\",\n                    \"MedianEvalTime\",\n                    \"MeanEvalTime\",\n                    \"ErrorMsg\",\n                ]\n            )\n            for submission_id in sorted(iterkeys(run_stats)):\n                stat = run_stats.get(\n                    submission_id, collections.defaultdict(lambda: float(\"NaN\"))\n                )\n                external_id = self.submissions.get_external_id(submission_id)\n                error_msg = \"\"\n                while not error_msg and stat[\"error_messages\"]:\n                    error_msg = stat[\"error_messages\"].pop()\n                    if error_msg.startswith(\"Cant copy adversarial batch locally\"):\n                        error_msg = \"\"\n                writer.writerow(\n                    [\n                        submission_id,\n                        external_id,\n                        scores.get(submission_id, None),\n                        stat[\"completed\"],\n                        stat[\"num_errors\"],\n                        num_processed_images.get(submission_id, None),\n                        stat[\"min_eval_time\"],\n                        stat[\"max_eval_time\"],\n                        stat[\"median_eval_time\"],\n                        stat[\"mean_eval_time\"],\n                        error_msg,\n                    ]\n                )\n\n    def _save_sorted_results(self, run_stats, scores, image_count, filename):\n        \"\"\"Saves sorted (by score) results of the evaluation.\n\n        Args:\n          run_stats: dictionary with runtime statistics for submissions,\n            can be generated by WorkPiecesBase.compute_work_statistics\n          scores: dictionary mapping submission ids to scores\n          image_count: dictionary with number of images processed by submission\n          filename: output filename\n        \"\"\"\n        with open(filename, \"w\") as f:\n            writer = csv.writer(f)\n            writer.writerow(\n                [\"SubmissionID\", \"ExternalTeamId\", \"Score\", \"MedianTime\", \"ImageCount\"]\n            )\n\n            def get_second(x):\n                \"\"\"Returns second entry of a list/tuple\"\"\"\n                return x[1]\n\n            for s_id, score in sorted(iteritems(scores), key=get_second, reverse=True):\n                external_id = self.submissions.get_external_id(s_id)\n                stat = run_stats.get(\n                    s_id, collections.defaultdict(lambda: float(\"NaN\"))\n                )\n                writer.writerow(\n                    [\n                        s_id,\n                        external_id,\n                        score,\n                        stat[\"median_eval_time\"],\n                        image_count[s_id],\n                    ]\n                )\n\n    def _read_dataset_metadata(self):\n        \"\"\"Reads dataset metadata.\n\n        Returns:\n          instance of DatasetMetadata\n        \"\"\"\n        blob = self.storage_client.get_blob(\n            \"dataset/\" + self.dataset_name + \"_dataset.csv\"\n        )\n        buf = BytesIO()\n        blob.download_to_file(buf)\n        buf.seek(0)\n        return eval_lib.DatasetMetadata(buf)\n\n    def compute_results(self):\n        \"\"\"Computes results (scores, stats, etc...) of competition evaluation.\n\n        Results are saved into output directory (self.results_dir).\n        Also this method saves all intermediate data into output directory as well,\n        so it can resume computation if it was interrupted for some reason.\n        This is useful because computatin of resuls could take many minutes.\n        \"\"\"\n        # read all data\n        logging.info(\"Reading data from datastore\")\n        dataset_meta = self._read_dataset_metadata()\n        self.submissions.init_from_datastore()\n        self.dataset_batches.init_from_datastore()\n        self.adv_batches.init_from_datastore()\n        self.attack_work.read_all_from_datastore()\n\n        if os.path.exists(os.path.join(self.results_dir, \"defense_work.dump\")):\n            with open(os.path.join(self.results_dir, \"defense_work.dump\")) as f:\n                self.defense_work.deserialize(f)\n        else:\n            self.defense_work.read_all_from_datastore()\n            with open(os.path.join(self.results_dir, \"defense_work.dump\"), \"w\") as f:\n                self.defense_work.serialize(f)\n\n        if os.path.exists(os.path.join(self.results_dir, \"class_batches.dump\")):\n            with open(os.path.join(self.results_dir, \"class_batches.dump\")) as f:\n                self.class_batches.deserialize(f)\n        else:\n            self.class_batches.init_from_datastore()\n            with open(os.path.join(self.results_dir, \"class_batches.dump\"), \"w\") as f:\n                self.class_batches.serialize(f)\n\n        # process data\n        logging.info(\"Processing classification results\")\n        count_adv_images = self.adv_batches.count_generated_adv_examples()\n        intermediate_files = [\n            \"acc_matrix.dump\",\n            \"error_matrix.dump\",\n            \"hit_tc_matrix.dump\",\n            \"classified_images_count.dump\",\n        ]\n        if all(\n            [\n                os.path.exists(os.path.join(self.results_dir, fname))\n                for fname in intermediate_files\n            ]\n        ):\n            with open(os.path.join(self.results_dir, \"acc_matrix.dump\")) as f:\n                acc_matrix = pickle.load(f)\n            with open(os.path.join(self.results_dir, \"error_matrix.dump\")) as f:\n                error_matrix = pickle.load(f)\n            with open(os.path.join(self.results_dir, \"hit_tc_matrix.dump\")) as f:\n                hit_tc_matrix = pickle.load(f)\n            with open(\n                os.path.join(self.results_dir, \"classified_images_count.dump\")\n            ) as f:\n                classified_images_count = pickle.load(f)\n        else:\n            (\n                acc_matrix,\n                error_matrix,\n                hit_tc_matrix,\n                classified_images_count,\n            ) = self.class_batches.compute_classification_results(\n                self.adv_batches, self.dataset_batches, dataset_meta, self.defense_work\n            )\n            with open(os.path.join(self.results_dir, \"acc_matrix.dump\"), \"w\") as f:\n                pickle.dump(acc_matrix, f)\n            with open(os.path.join(self.results_dir, \"error_matrix.dump\"), \"w\") as f:\n                pickle.dump(error_matrix, f)\n            with open(os.path.join(self.results_dir, \"hit_tc_matrix.dump\"), \"w\") as f:\n                pickle.dump(hit_tc_matrix, f)\n            with open(\n                os.path.join(self.results_dir, \"classified_images_count.dump\"), \"w\"\n            ) as f:\n                pickle.dump(classified_images_count, f)\n\n        # compute attacks and defenses which will be used for scoring\n        logging.info(\"Computing attacks and defenses which are used for scoring\")\n        expected_num_adv_images = self.dataset_batches.count_num_images()\n        attacks_to_use = [\n            k\n            for k, v in iteritems(count_adv_images)\n            if (\n                (v == expected_num_adv_images)\n                and (k not in self.blacklisted_submissions)\n            )\n        ]\n\n        total_num_adversarial = sum(itervalues(count_adv_images))\n        defenses_to_use = [\n            k\n            for k, v in iteritems(classified_images_count)\n            if (\n                (v == total_num_adversarial) and (k not in self.blacklisted_submissions)\n            )\n        ]\n\n        logging.info(\n            \"Expected number of adversarial images: %d\", expected_num_adv_images\n        )\n        logging.info(\n            \"Number of attacks to use to score defenses: %d\", len(attacks_to_use)\n        )\n        logging.info(\n            \"Expected number of classification predictions: %d\", total_num_adversarial\n        )\n        logging.info(\n            \"Number of defenses to use to score attacks: %d\", len(defenses_to_use)\n        )\n\n        save_dict_to_file(\n            os.path.join(self.results_dir, \"count_adv_images.csv\"), count_adv_images\n        )\n        save_dict_to_file(\n            os.path.join(self.results_dir, \"classified_images_count.csv\"),\n            classified_images_count,\n        )\n\n        # compute scores\n        logging.info(\"Computing scores\")\n        attack_scores = defaultdict(lambda: 0)\n        targeted_attack_scores = defaultdict(lambda: 0)\n        defense_scores = defaultdict(lambda: 0)\n        for defense_id in acc_matrix.dim0:\n            for attack_id in acc_matrix.dim1:\n                if attack_id in attacks_to_use:\n                    defense_scores[defense_id] += acc_matrix[defense_id, attack_id]\n                if defense_id in defenses_to_use:\n                    if attack_id in self.submissions.targeted_attacks:\n                        targeted_attack_scores[attack_id] += hit_tc_matrix[\n                            defense_id, attack_id\n                        ]\n                    else:\n                        attack_scores[attack_id] += error_matrix[defense_id, attack_id]\n        # negate results of blacklisted submissions\n        for s_id in self.blacklisted_submissions:\n            if s_id in defense_scores:\n                defense_scores[s_id] = -defense_scores[s_id]\n            if s_id in attack_scores:\n                attack_scores[s_id] = -attack_scores[s_id]\n            if s_id in targeted_attack_scores:\n                targeted_attack_scores[s_id] = -targeted_attack_scores[s_id]\n        # save results\n        logging.info(\"Saving results\")\n        all_attack_stats = self.attack_work.compute_work_statistics()\n        nontargeted_attack_stats = {\n            k: v\n            for k, v in iteritems(all_attack_stats)\n            if k in self.submissions.attacks\n        }\n        targeted_attack_stats = {\n            k: v\n            for k, v in iteritems(all_attack_stats)\n            if k in self.submissions.targeted_attacks\n        }\n        defense_stats = self.defense_work.compute_work_statistics()\n        self._save_work_results(\n            nontargeted_attack_stats,\n            attack_scores,\n            count_adv_images,\n            os.path.join(self.results_dir, \"attack_results.csv\"),\n        )\n        self._save_work_results(\n            targeted_attack_stats,\n            targeted_attack_scores,\n            count_adv_images,\n            os.path.join(self.results_dir, \"targeted_attack_results.csv\"),\n        )\n        self._save_work_results(\n            defense_stats,\n            defense_scores,\n            classified_images_count,\n            os.path.join(self.results_dir, \"defense_results.csv\"),\n        )\n\n        self._save_sorted_results(\n            nontargeted_attack_stats,\n            attack_scores,\n            count_adv_images,\n            os.path.join(self.results_dir, \"sorted_attack_results.csv\"),\n        )\n        self._save_sorted_results(\n            targeted_attack_stats,\n            targeted_attack_scores,\n            count_adv_images,\n            os.path.join(self.results_dir, \"sorted_target_attack_results.csv\"),\n        )\n        self._save_sorted_results(\n            defense_stats,\n            defense_scores,\n            classified_images_count,\n            os.path.join(self.results_dir, \"sorted_defense_results.csv\"),\n        )\n\n        defense_id_to_name = {\n            k: self.submissions.get_external_id(k)\n            for k in iterkeys(self.submissions.defenses)\n        }\n        attack_id_to_name = {\n            k: self.submissions.get_external_id(k)\n            for k in self.submissions.get_all_attack_ids()\n        }\n        acc_matrix.save_to_file(\n            os.path.join(self.results_dir, \"accuracy_matrix.csv\"),\n            remap_dim0=defense_id_to_name,\n            remap_dim1=attack_id_to_name,\n        )\n        error_matrix.save_to_file(\n            os.path.join(self.results_dir, \"error_matrix.csv\"),\n            remap_dim0=defense_id_to_name,\n            remap_dim1=attack_id_to_name,\n        )\n        hit_tc_matrix.save_to_file(\n            os.path.join(self.results_dir, \"hit_target_class_matrix.csv\"),\n            remap_dim0=defense_id_to_name,\n            remap_dim1=attack_id_to_name,\n        )\n\n        save_dict_to_file(\n            os.path.join(self.results_dir, \"defense_id_to_name.csv\"), defense_id_to_name\n        )\n        save_dict_to_file(\n            os.path.join(self.results_dir, \"attack_id_to_name.csv\"), attack_id_to_name\n        )\n\n    def _show_status_for_work(self, work):\n        \"\"\"Shows status for given work pieces.\n\n        Args:\n          work: instance of either AttackWorkPieces or DefenseWorkPieces\n        \"\"\"\n        work_count = len(work.work)\n        work_completed = {}\n        work_completed_count = 0\n        for v in itervalues(work.work):\n            if v[\"is_completed\"]:\n                work_completed_count += 1\n                worker_id = v[\"claimed_worker_id\"]\n                if worker_id not in work_completed:\n                    work_completed[worker_id] = {\n                        \"completed_count\": 0,\n                        \"last_update\": 0.0,\n                    }\n                work_completed[worker_id][\"completed_count\"] += 1\n                work_completed[worker_id][\"last_update\"] = max(\n                    work_completed[worker_id][\"last_update\"],\n                    v[\"claimed_worker_start_time\"],\n                )\n        print(\"Completed {0}/{1} work\".format(work_completed_count, work_count))\n        for k in sorted(iterkeys(work_completed)):\n            last_update_time = time.strftime(\n                \"%Y-%m-%d %H:%M:%S\", time.localtime(work_completed[k][\"last_update\"])\n            )\n            print(\n                \"Worker {0}: completed {1}   last claimed work at {2}\".format(\n                    k, work_completed[k][\"completed_count\"], last_update_time\n                )\n            )\n\n    def _export_work_errors(self, work, output_file):\n        \"\"\"Saves errors for given work pieces into file.\n\n        Args:\n          work: instance of either AttackWorkPieces or DefenseWorkPieces\n          output_file: name of the output file\n        \"\"\"\n        errors = set()\n        for v in itervalues(work.work):\n            if v[\"is_completed\"] and v[\"error\"] is not None:\n                errors.add(v[\"error\"])\n        with open(output_file, \"w\") as f:\n            for e in sorted(errors):\n                f.write(e)\n                f.write(\"\\n\")\n\n    def show_status(self):\n        \"\"\"Shows current status of competition evaluation.\n\n        Also this method saves error messages generated by attacks and defenses\n        into attack_errors.txt and defense_errors.txt.\n        \"\"\"\n        print_header(\"Attack work statistics\")\n        self.attack_work.read_all_from_datastore()\n        self._show_status_for_work(self.attack_work)\n        self._export_work_errors(\n            self.attack_work, os.path.join(self.results_dir, \"attack_errors.txt\")\n        )\n        print_header(\"Defense work statistics\")\n        self.defense_work.read_all_from_datastore()\n        self._show_status_for_work(self.defense_work)\n        self._export_work_errors(\n            self.defense_work, os.path.join(self.results_dir, \"defense_errors.txt\")\n        )\n\n    def cleanup_failed_attacks(self):\n        \"\"\"Cleans up data of failed attacks.\"\"\"\n        print_header(\"Cleaning up failed attacks\")\n        attacks_to_replace = {}\n        self.attack_work.read_all_from_datastore()\n        failed_submissions = set()\n        error_msg = set()\n        for k, v in iteritems(self.attack_work.work):\n            if v[\"error\"] is not None:\n                attacks_to_replace[k] = dict(v)\n                failed_submissions.add(v[\"submission_id\"])\n                error_msg.add(v[\"error\"])\n                attacks_to_replace[k].update(\n                    {\n                        \"claimed_worker_id\": None,\n                        \"claimed_worker_start_time\": None,\n                        \"is_completed\": False,\n                        \"error\": None,\n                        \"elapsed_time\": None,\n                    }\n                )\n        self.attack_work.replace_work(attacks_to_replace)\n        print(\"Affected submissions:\")\n        print(\" \".join(sorted(failed_submissions)))\n        print(\"Error messages:\")\n        print(\" \".join(sorted(error_msg)))\n        print(\"\")\n        inp = input_str('Are you sure? (type \"yes\" without quotes to confirm): ')\n        if inp != \"yes\":\n            return\n        self.attack_work.write_all_to_datastore()\n        print(\"Work cleaned up\")\n\n    def cleanup_attacks_with_zero_images(self):\n        \"\"\"Cleans up data about attacks which generated zero images.\"\"\"\n        print_header(\"Cleaning up attacks which generated 0 images.\")\n        # find out attack work to cleanup\n        self.adv_batches.init_from_datastore()\n        self.attack_work.read_all_from_datastore()\n        new_attack_work = {}\n        affected_adversarial_batches = set()\n        for work_id, work in iteritems(self.attack_work.work):\n            adv_batch_id = work[\"output_adversarial_batch_id\"]\n            img_count_adv_batch = len(self.adv_batches.data[adv_batch_id][\"images\"])\n            if (img_count_adv_batch < 100) and (work[\"elapsed_time\"] < 500):\n                affected_adversarial_batches.add(adv_batch_id)\n                new_attack_work[work_id] = dict(work)\n                new_attack_work[work_id].update(\n                    {\n                        \"claimed_worker_id\": None,\n                        \"claimed_worker_start_time\": None,\n                        \"is_completed\": False,\n                        \"error\": None,\n                        \"elapsed_time\": None,\n                    }\n                )\n        self.attack_work.replace_work(new_attack_work)\n        print_header(\"Changes in attack works:\")\n        print(self.attack_work)\n        # build list of classification batches\n        self.class_batches.init_from_datastore()\n        affected_class_batches = set()\n        for k, v in iteritems(self.class_batches.data):\n            if v[\"adversarial_batch_id\"] in affected_adversarial_batches:\n                affected_class_batches.add(k)\n        # cleanup defense work on affected batches\n        self.defense_work.read_all_from_datastore()\n        new_defense_work = {}\n        for k, v in iteritems(self.defense_work.work):\n            if v[\"output_classification_batch_id\"] in affected_class_batches:\n                new_defense_work[k] = dict(v)\n                new_defense_work[k].update(\n                    {\n                        \"claimed_worker_id\": None,\n                        \"claimed_worker_start_time\": None,\n                        \"is_completed\": False,\n                        \"error\": None,\n                        \"elapsed_time\": None,\n                        \"stat_correct\": None,\n                        \"stat_error\": None,\n                        \"stat_target_class\": None,\n                        \"stat_num_images\": None,\n                    }\n                )\n        self.defense_work.replace_work(new_defense_work)\n        print_header(\"Changes in defense works:\")\n        print(self.defense_work)\n        print(\"\")\n        print(\"Total number of affected attack work: \", len(self.attack_work))\n        print(\"Total number of affected defense work: \", len(self.defense_work))\n        inp = input_str('Are you sure? (type \"yes\" without quotes to confirm): ')\n        if inp != \"yes\":\n            return\n        print(\"Writing attacks work\")\n        self.attack_work.write_all_to_datastore()\n        print(\"Writing defenses work\")\n        self.defense_work.write_all_to_datastore()\n        print(\"Done!\")\n\n    def _cleanup_keys_with_confirmation(self, keys_to_delete):\n        \"\"\"Asks confirmation and then deletes entries with keys.\n\n        Args:\n          keys_to_delete: list of datastore keys for which entries should be deleted\n        \"\"\"\n        print(\"Round name: \", self.round_name)\n        print(\"Number of entities to be deleted: \", len(keys_to_delete))\n        if not keys_to_delete:\n            return\n        if self.verbose:\n            print(\"Entities to delete:\")\n            idx = 0\n            prev_key_prefix = None\n            dots_printed_after_same_prefix = False\n            for k in keys_to_delete:\n                if idx >= 20:\n                    print(\"   ...\")\n                    print(\"   ...\")\n                    break\n                key_prefix = (\n                    k.flat_path[0:1]\n                    if k.flat_path[0] in [u\"SubmissionType\", u\"WorkType\"]\n                    else k.flat_path[0]\n                )\n                if prev_key_prefix == key_prefix:\n                    if not dots_printed_after_same_prefix:\n                        print(\"   ...\")\n                    dots_printed_after_same_prefix = True\n                else:\n                    print(\"  \", k)\n                    dots_printed_after_same_prefix = False\n                    idx += 1\n                prev_key_prefix = key_prefix\n        print()\n        inp = input_str('Are you sure? (type \"yes\" without quotes to confirm): ')\n        if inp != \"yes\":\n            return\n        with self.datastore_client.no_transact_batch() as batch:\n            for k in keys_to_delete:\n                batch.delete(k)\n        print(\"Data deleted\")\n\n    def cleanup_defenses(self):\n        \"\"\"Cleans up all data about defense work in current round.\"\"\"\n        print_header(\"CLEANING UP DEFENSES DATA\")\n        work_ancestor_key = self.datastore_client.key(\"WorkType\", \"AllDefenses\")\n        keys_to_delete = [\n            e.key\n            for e in self.datastore_client.query_fetch(kind=u\"ClassificationBatch\")\n        ] + [\n            e.key\n            for e in self.datastore_client.query_fetch(\n                kind=u\"Work\", ancestor=work_ancestor_key\n            )\n        ]\n        self._cleanup_keys_with_confirmation(keys_to_delete)\n\n    def cleanup_datastore(self):\n        \"\"\"Cleans up datastore and deletes all information about current round.\"\"\"\n        print_header(\"CLEANING UP ENTIRE DATASTORE\")\n        kinds_to_delete = [\n            u\"Submission\",\n            u\"SubmissionType\",\n            u\"DatasetImage\",\n            u\"DatasetBatch\",\n            u\"AdversarialImage\",\n            u\"AdversarialBatch\",\n            u\"Work\",\n            u\"WorkType\",\n            u\"ClassificationBatch\",\n        ]\n        keys_to_delete = [\n            e.key\n            for k in kinds_to_delete\n            for e in self.datastore_client.query_fetch(kind=k)\n        ]\n        self._cleanup_keys_with_confirmation(keys_to_delete)\n\n\nUSAGE = \"\"\"Use one of the following commands to run master:\n  run_master.sh attack\n  run_master.sh defense\n  run_master.sh cleanup_defenses\n  run_master.sh results\n  run_master.sh status\n  run_master.sh cleanup_datastore\n\"\"\"\n\n\ndef main(args):\n    \"\"\"Main function which runs master.\"\"\"\n    if args.blacklisted_submissions:\n        logging.warning(\"BLACKLISTED SUBMISSIONS: %s\", args.blacklisted_submissions)\n    if args.limited_dataset:\n        logging.info(\"Using limited dataset: 3 batches * 10 images\")\n        max_dataset_num_images = 30\n        batch_size = 10\n    else:\n        logging.info(\"Using full dataset. Batch size: %d\", DEFAULT_BATCH_SIZE)\n        max_dataset_num_images = None\n        batch_size = DEFAULT_BATCH_SIZE\n    random.seed()\n    print(\"\\nRound: {0}\\n\".format(args.round_name))\n    eval_master = EvaluationMaster(\n        storage_client=eval_lib.CompetitionStorageClient(\n            args.project_id, args.storage_bucket\n        ),\n        datastore_client=eval_lib.CompetitionDatastoreClient(\n            args.project_id, args.round_name\n        ),\n        round_name=args.round_name,\n        dataset_name=args.dataset_name,\n        blacklisted_submissions=args.blacklisted_submissions,\n        results_dir=args.results_dir,\n        num_defense_shards=args.num_defense_shards,\n        verbose=args.verbose,\n        batch_size=batch_size,\n        max_dataset_num_images=max_dataset_num_images,\n    )\n    if args.command == \"attack\":\n        eval_master.prepare_attacks()\n    elif args.command == \"defense\":\n        eval_master.prepare_defenses()\n    elif args.command == \"cleanup_defenses\":\n        eval_master.cleanup_defenses()\n    elif args.command == \"results\":\n        eval_master.compute_results()\n    elif args.command == \"status\":\n        eval_master.show_status()\n    elif args.command == \"cleanup_datastore\":\n        eval_master.cleanup_datastore()\n    elif args.command == \"cleanup_failed_attacks\":\n        eval_master.cleanup_failed_attacks()\n    elif args.command == \"cleanup_attacks_with_zero_images\":\n        eval_master.cleanup_attacks_with_zero_images()\n    else:\n        print(\"Invalid command: \", args.command)\n        print(\"\")\n        print(USAGE)\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(\n        description=\"Master which coordinates all workers.\"\n    )\n    parser.add_argument(\n        \"command\",\n        help=\"Command to run. Possible commands include \"\n        '\"attack\", \"defense\", \"scores\", \"status\".',\n    )\n    parser.add_argument(\n        \"--project_id\", required=True, help=\"Your Google Cloud project ID.\"\n    )\n    parser.add_argument(\n        \"--storage_bucket\",\n        required=True,\n        help=\"Cloud Storage bucket to store competition data.\",\n    )\n    parser.add_argument(\n        \"--round_name\",\n        default=\"testing-round\",\n        required=False,\n        help=\"Name of the round.\",\n    )\n    parser.add_argument(\n        \"--dataset_name\",\n        default=\"dev\",\n        required=False,\n        help=\"Which dataset to use, either dev or final.\",\n    )\n    parser.add_argument(\n        \"--blacklisted_submissions\",\n        default=\"\",\n        required=False,\n        help=\"Comma separated list of blacklisted submission \" \"IDs.\",\n    )\n    parser.add_argument(\n        \"--results_dir\", required=True, help=\"Directory where to save results.\"\n    )\n    parser.add_argument(\n        \"--num_defense_shards\",\n        default=10,\n        required=False,\n        help=\"Number of defense shards\",\n    )\n    parser.add_argument(\n        \"--limited_dataset\", dest=\"limited_dataset\", action=\"store_true\"\n    )\n    parser.add_argument(\n        \"--nolimited_dataset\", dest=\"limited_dataset\", action=\"store_false\"\n    )\n    parser.set_defaults(limited_dataset=False)\n    parser.add_argument(\"--verbose\", dest=\"verbose\", action=\"store_true\")\n    parser.add_argument(\"--noverbose\", dest=\"verbose\", action=\"store_false\")\n    parser.set_defaults(verbose=False)\n    parser.add_argument(\n        \"--log_file\", default=\"\", required=False, help=\"Location of the logfile.\"\n    )\n    master_args = parser.parse_args()\n    logging_args = {\n        \"format\": \"%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s -- %(message)s\",\n        \"level\": logging.INFO,\n        \"datefmt\": \"%Y-%m-%d %H:%M:%S\",\n    }\n    if master_args.log_file:\n        logging_args[\"filename\"] = master_args.log_file\n        logging_args[\"filemode\"] = \"w\"\n    logging.basicConfig(**logging_args)\n    main(master_args)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/run_worker_locally.sh",
    "content": "#!/bin/bash\n#\n# This script starts worker. Generally there is no need to manually runn this\n# script, it should be invoked during deployment of the worker to VM.\n#\n# However if you need to run this script manually, usage is following:\n#\n#   run_worker_locally.sh WORKER_ID\n#\n# where WORKER_ID is numerical identifier of the worker. Typically workers are\n# identified by numbers from 0 to NUMBER_OF_WORKERS-1\n#\n\n# Get worker ID from argumetns to run_worker_locally.sh\nWORKER_ID=$1\nif [ -z ${WORKER_ID} ]; then\n  echo \"Worker ID is missing.\"\n  exit 1\nfi\n\n# cd to script directory\ncd \"$( dirname \"${BASH_SOURCE[0]}\" )\"\n\n# Read variables from config.sh\nsource ../scripts/config.sh\ncheck_dataset_and_round_set\n\n# Run worekr\nsource ~/.virtualenv/${VIRTUALENV_NAME}/bin/activate\npython -B worker.py \\\n  --worker_id=${WORKER_ID} \\\n  --project_id=\"${GOOGLE_CLOUD_PROJECT_ID}\" \\\n  --storage_bucket=\"${GOOGLE_CLOUD_STORAGE_BUCKET}\" \\\n  --round_name=\"${ROUND_NAME}\" \\\n  --dataset_name=\"${DATASET}\" \\\n  --num_defense_shards=\"${NUM_DEFENSE_SHARDS}\" &> ~/log.txt\ndeactivate\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/start_worker_in_tmux.sh",
    "content": "#!/bin/bash\n#\n# Helper script which creates a tmux session, starts workers and opens log file\n# inside this session.\n# Should be only run automatically by start_workers.sh script\n#\n\nWORKER_ID=$1\n\nif [ -z ${WORKER_ID} ]; then\n  echo \"Worker ID has to be provided\"\n  exit 1\nfi\n\ncd ~/\n\ntmux new-session -s run -d\ntmux rename-window -t run:0 \"run\"\ntmux new-window -t run:1 -n \"view\"\nsleep 2\ntmux send-keys -t run:0 \"eval_infra/code/run_worker_locally.sh ${WORKER_ID}\" C-m\nsleep 2\ntmux send-keys -t run:1 \"tail -f log.txt\" C-m\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/code/worker.py",
    "content": "\"\"\"Worker which runs all computations on Cloud VMs.\n\nEvaluation of competition is split into work pieces. One work piece is a\neither evaluation of an attack on a batch of images or evaluation of a\ndefense on a batch of adversarial images.\nAll pieces of attack work are independent from each other and could be run\nin parallel. Same for pieces of defense work - they are independent from each\nother and could be run in parallel. But defense work could be run only after\nall attack work is completed.\n\nWorker first runs all attack pieces, by querying next piece of undone work\nand running it. After all attack pieces are done, worker runs all defense pieces\nin a similar way.\n\nBefore workers could be started, datastore has to be populated by master\nwith description of work to be done. See master.py for details.\n\nNOTE: Worker is designed to run on linux machine with NVidia docker\ninstalled. Worker generally needs administrative privilege to run properly.\nAlso worker relies on very specific directory structure created in home\ndirectory. That's why it's highly recommended to run worker only in VM.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom builtins import int  # long in python 2\n\nimport argparse\nimport json\nimport logging\nimport os\nimport random\nimport shutil\nimport subprocess\nimport time\nimport uuid\n\nfrom six import iteritems\n\nimport eval_lib\n\nfrom cleverhans.utils import shell_call\n\n\n# Sleep time while waiting for next available piece of work\nSLEEP_TIME = 30\nSLEEP_TIME_SHORT = 10\n\n# Time limit to run one pice of work\nSUBMISSION_TIME_LIMIT = 500\n\n# Set of local temporary directories and files\nLOCAL_EVAL_ROOT_DIR = os.path.expanduser(\"~/competition_eval\")\nLOCAL_DATASET_DIR = os.path.expanduser(\"~/competition_eval/dataset_images\")\nLOCAL_SUBMISSIONS_DIR = os.path.expanduser(\"~/competition_eval/submissions\")\nLOCAL_INPUT_DIR = os.path.expanduser(\"~/competition_eval/input\")\nLOCAL_OUTPUT_DIR = os.path.expanduser(\"~/competition_eval/output\")\nLOCAL_PROCESSED_OUTPUT_DIR = os.path.expanduser(\"~/competition_eval/processed_output\")\nLOCAL_ZIPPED_OUTPUT_DIR = os.path.expanduser(\"~/competition_eval/zipped_output\")\nLOCAL_DATASET_METADATA_FILE = os.path.expanduser(\"~/competition_eval/dataset_meta.csv\")\nLOCAL_DATASET_COPY = os.path.expanduser(\"~/competition_data/dataset\")\n\n# Types of submissions\nTYPE_TARGETED = \"targeted\"\nTYPE_NONTARGETED = \"nontargeted\"\nTYPE_DEFENSE = \"defense\"\n\n# Extraction commands for various types of archive\nEXTRACT_COMMAND = {\n    \".zip\": [\"unzip\", \"${src}\", \"-d\", \"${dst}\"],\n    \".tar\": [\"tar\", \"xvf\", \"${src}\", \"-C\", \"${dst}\"],\n    \".tar.gz\": [\"tar\", \"xvzf\", \"${src}\", \"-C\", \"${dst}\"],\n}\n\n# Docker binary to use\nDOCKER_BINARY = \"docker\"\nDOCKER_NVIDIA_RUNTIME = \"--runtime=nvidia\"\n\n# Names of relevant fields in submission metadata file\nMETADATA_CONTAINER = \"container_gpu\"\nMETADATA_ENTRY_POINT = \"entry_point\"\nMETADATA_TYPE = \"type\"\n\n# Mapping from submission type in metadata to submission type used in worker\nMETADATA_JSON_TYPE_TO_TYPE = {\n    \"attack\": TYPE_NONTARGETED,\n    \"targeted_attack\": TYPE_TARGETED,\n    \"defense\": TYPE_DEFENSE,\n}\n\n\ndef make_directory_writable(dirname):\n    \"\"\"Makes directory readable and writable by everybody.\n\n    If you run something inside Docker container and it writes files, then\n    these files will be written as root user with restricted permissions.\n    So to be able to read/modify these files outside of Docker you have to change\n    permissions to be world readable and writable.\n\n    Args:\n      dirname: name of the directory\n\n    Returns:\n      True if operation was successfull\n    \"\"\"\n    shell_call(\n        [\n            \"docker\",\n            \"run\",\n            \"-v\",\n            \"{0}:/output_dir\".format(dirname),\n            \"busybox:1.27.2\",\n            \"chmod\",\n            \"-R\",\n            \"a+rwx\",\n            \"/output_dir\",\n        ]\n    )\n\n\ndef sudo_remove_dirtree(dir_name):\n    \"\"\"Removes directory tree as a superuser.\n\n    Args:\n      dir_name: name of the directory to remove.\n\n    This function is necessary to cleanup directories created from inside a\n    Docker, since they usually written as a root, thus have to be removed as a\n    root.\n    \"\"\"\n    try:\n        subprocess.check_output([\"sudo\", \"rm\", \"-rf\", dir_name])\n    except subprocess.CalledProcessError as e:\n        raise WorkerError(\"Can\" \"t remove directory {0}\".format(dir_name), e)\n\n\nclass WorkerError(Exception):\n    \"\"\"Error which happen during evaluation of submission.\n\n    To simplify error handling, worker only raises this type of exception.\n    Exceptions of different types raised by other modules encapsulated\n    into WorkerError by the worker.\n    \"\"\"\n\n    def __init__(self, message, exc=None):\n        \"\"\"Initializes WorkerError.\n\n        Args:\n          message: error message\n          exc: optional underlying exception.\n        \"\"\"\n        super(WorkerError, self).__init__()\n        self.msg = message\n        self.exc = exc\n\n    def __str__(self):\n        \"\"\"Returns human readable string representation of the exception.\"\"\"\n        if self.exc:\n            return \"{0}\\nUnderlying exception:\\n{1}\".format(self.msg, self.exc)\n        else:\n            return self.msg\n\n\ndef get_id_of_running_docker(container_name):\n    \"\"\"Returns ID of running docker container.\"\"\"\n    return shell_call(\n        [DOCKER_BINARY, \"ps\", \"-q\", \"--filter=name={}\".format(container_name)]\n    ).strip()\n\n\ndef is_docker_still_running(container_name):\n    \"\"\"Returns whether given Docker container is still running.\"\"\"\n    return bool(get_id_of_running_docker(container_name))\n\n\ndef kill_docker_container(container_name):\n    \"\"\"Kills given docker container.\"\"\"\n    docker_id = get_id_of_running_docker(container_name)\n    shell_call([DOCKER_BINARY, \"stop\", docker_id])\n\n\nclass ExecutableSubmission(object):\n    \"\"\"Base class which is used to run submissions.\"\"\"\n\n    def __init__(self, submission_id, submissions, storage_bucket):\n        \"\"\"Initializes ExecutableSubmission.\n\n        Args:\n          submission_id: ID of the submissions\n          submissions: instance of CompetitionSubmissions with all submissions\n          storage_bucket: storage bucket where all submissions are stored\n\n        Raises:\n          WorkerError: if submission was not found\n        \"\"\"\n        self.submission_id = submission_id\n        self.storage_bucket = storage_bucket\n        self.type = None\n        self.submission = None\n        if submission_id in submissions.attacks:\n            self.type = TYPE_NONTARGETED\n            self.submission = submissions.attacks[submission_id]\n        elif submission_id in submissions.targeted_attacks:\n            self.type = TYPE_TARGETED\n            self.submission = submissions.targeted_attacks[submission_id]\n        elif submission_id in submissions.defenses:\n            self.type = TYPE_DEFENSE\n            self.submission = submissions.defenses[submission_id]\n        else:\n            raise WorkerError(\n                'Submission with ID \"{0}\" not found'.format(submission_id)\n            )\n        self.submission_dir = None\n        self.extracted_submission_dir = None\n\n    def download(self):\n        \"\"\"Method which downloads submission to local directory.\"\"\"\n        # Structure of the download directory:\n        # submission_dir=LOCAL_SUBMISSIONS_DIR/submission_id\n        # submission_dir/s.ext   <-- archived submission\n        # submission_dir/extracted      <-- extracted submission\n\n        # Check whether submission is already there\n        if self.extracted_submission_dir:\n            return\n        self.submission_dir = os.path.join(LOCAL_SUBMISSIONS_DIR, self.submission_id)\n        if os.path.isdir(self.submission_dir) and os.path.isdir(\n            os.path.join(self.submission_dir, \"extracted\")\n        ):\n            # submission already there, just re-read metadata\n            self.extracted_submission_dir = os.path.join(\n                self.submission_dir, \"extracted\"\n            )\n            with open(\n                os.path.join(self.extracted_submission_dir, \"metadata.json\"), \"r\"\n            ) as f:\n                meta_json = json.load(f)\n            self.container_name = str(meta_json[METADATA_CONTAINER])\n            self.entry_point = str(meta_json[METADATA_ENTRY_POINT])\n            return\n        # figure out submission location in the Cloud and determine extractor\n        submission_cloud_path = os.path.join(\n            \"gs://\", self.storage_bucket, self.submission.path\n        )\n        extract_command_tmpl = None\n        extension = None\n        for k, v in iteritems(EXTRACT_COMMAND):\n            if submission_cloud_path.endswith(k):\n                extension = k\n                extract_command_tmpl = v\n                break\n        if not extract_command_tmpl:\n            raise WorkerError(\"Unsupported submission extension\")\n        # download archive\n        try:\n            os.makedirs(self.submission_dir)\n            tmp_extract_dir = os.path.join(self.submission_dir, \"tmp\")\n            os.makedirs(tmp_extract_dir)\n            download_path = os.path.join(self.submission_dir, \"s\" + extension)\n            try:\n                logging.info(\n                    \"Downloading submission from %s to %s\",\n                    submission_cloud_path,\n                    download_path,\n                )\n                shell_call([\"gsutil\", \"cp\", submission_cloud_path, download_path])\n            except subprocess.CalledProcessError as e:\n                raise WorkerError(\"Can\" \"t copy submission locally\", e)\n            # extract archive\n            try:\n                shell_call(extract_command_tmpl, src=download_path, dst=tmp_extract_dir)\n            except subprocess.CalledProcessError as e:\n                # proceed even if extraction returned non zero error code,\n                # sometimes it's just warning\n                logging.warning(\n                    \"Submission extraction returned non-zero error code. \"\n                    \"It may be just a warning, continuing execution. \"\n                    \"Error: %s\",\n                    e,\n                )\n            try:\n                make_directory_writable(tmp_extract_dir)\n            except subprocess.CalledProcessError as e:\n                raise WorkerError(\"Can\" \"t make submission directory writable\", e)\n            # determine root of the submission\n            tmp_root_dir = tmp_extract_dir\n            root_dir_content = [d for d in os.listdir(tmp_root_dir) if d != \"__MACOSX\"]\n            if len(root_dir_content) == 1 and os.path.isdir(\n                os.path.join(tmp_root_dir, root_dir_content[0])\n            ):\n                tmp_root_dir = os.path.join(tmp_root_dir, root_dir_content[0])\n            # move files to extract subdirectory\n            self.extracted_submission_dir = os.path.join(\n                self.submission_dir, \"extracted\"\n            )\n            try:\n                shell_call(\n                    [\"mv\", os.path.join(tmp_root_dir), self.extracted_submission_dir]\n                )\n            except subprocess.CalledProcessError as e:\n                raise WorkerError(\"Can\" \"t move submission files\", e)\n            # read metadata file\n            try:\n                with open(\n                    os.path.join(self.extracted_submission_dir, \"metadata.json\"), \"r\"\n                ) as f:\n                    meta_json = json.load(f)\n            except IOError as e:\n                raise WorkerError(\n                    \"Can\"\n                    't read metadata.json for submission \"{0}\"'.format(\n                        self.submission_id\n                    ),\n                    e,\n                )\n            try:\n                self.container_name = str(meta_json[METADATA_CONTAINER])\n                self.entry_point = str(meta_json[METADATA_ENTRY_POINT])\n                type_from_meta = METADATA_JSON_TYPE_TO_TYPE[meta_json[METADATA_TYPE]]\n            except KeyError as e:\n                raise WorkerError(\"Invalid metadata.json file\", e)\n            if type_from_meta != self.type:\n                raise WorkerError(\n                    \"Inconsistent submission type in metadata: \"\n                    + type_from_meta\n                    + \" vs \"\n                    + self.type\n                )\n        except WorkerError as e:\n            self.extracted_submission_dir = None\n            sudo_remove_dirtree(self.submission_dir)\n            raise\n\n    def temp_copy_extracted_submission(self):\n        \"\"\"Creates a temporary copy of extracted submission.\n\n        When executed, submission is allowed to modify it's own directory. So\n        to ensure that submission does not pass any data between runs, new\n        copy of the submission is made before each run. After a run temporary copy\n        of submission is deleted.\n\n        Returns:\n          directory where temporary copy is located\n        \"\"\"\n        tmp_copy_dir = os.path.join(self.submission_dir, \"tmp_copy\")\n        shell_call(\n            [\"cp\", \"-R\", os.path.join(self.extracted_submission_dir), tmp_copy_dir]\n        )\n        return tmp_copy_dir\n\n    def run_without_time_limit(self, cmd):\n        \"\"\"Runs docker command without time limit.\n\n        Args:\n          cmd: list with the command line arguments which are passed to docker\n            binary\n\n        Returns:\n          how long it took to run submission in seconds\n\n        Raises:\n          WorkerError: if error occurred during execution of the submission\n        \"\"\"\n        cmd = [DOCKER_BINARY, \"run\", DOCKER_NVIDIA_RUNTIME] + cmd\n        logging.info(\"Docker command: %s\", \" \".join(cmd))\n        start_time = time.time()\n        retval = subprocess.call(cmd)\n        elapsed_time_sec = int(time.time() - start_time)\n        logging.info(\"Elapsed time of attack: %d\", elapsed_time_sec)\n        logging.info(\"Docker retval: %d\", retval)\n        if retval != 0:\n            logging.warning(\"Docker returned non-zero retval: %d\", retval)\n            raise WorkerError(\"Docker returned non-zero retval \" + str(retval))\n        return elapsed_time_sec\n\n    def run_with_time_limit(self, cmd, time_limit=SUBMISSION_TIME_LIMIT):\n        \"\"\"Runs docker command and enforces time limit.\n\n        Args:\n          cmd: list with the command line arguments which are passed to docker\n            binary after run\n          time_limit: time limit, in seconds. Negative value means no limit.\n\n        Returns:\n          how long it took to run submission in seconds\n\n        Raises:\n          WorkerError: if error occurred during execution of the submission\n        \"\"\"\n        if time_limit < 0:\n            return self.run_without_time_limit(cmd)\n        container_name = str(uuid.uuid4())\n        cmd = [\n            DOCKER_BINARY,\n            \"run\",\n            DOCKER_NVIDIA_RUNTIME,\n            \"--detach\",\n            \"--name\",\n            container_name,\n        ] + cmd\n        logging.info(\"Docker command: %s\", \" \".join(cmd))\n        logging.info(\"Time limit %d seconds\", time_limit)\n        retval = subprocess.call(cmd)\n        start_time = time.time()\n        elapsed_time_sec = 0\n        while is_docker_still_running(container_name):\n            elapsed_time_sec = int(time.time() - start_time)\n            if elapsed_time_sec < time_limit:\n                time.sleep(1)\n            else:\n                kill_docker_container(container_name)\n                logging.warning(\"Submission was killed because run out of time\")\n        logging.info(\"Elapsed time of submission: %d\", elapsed_time_sec)\n        logging.info(\"Docker retval: %d\", retval)\n        if retval != 0:\n            logging.warning(\"Docker returned non-zero retval: %d\", retval)\n            raise WorkerError(\"Docker returned non-zero retval \" + str(retval))\n        return elapsed_time_sec\n\n\nclass AttackSubmission(ExecutableSubmission):\n    \"\"\"Class to run attack submissions.\"\"\"\n\n    def __init__(self, submission_id, submissions, storage_bucket):\n        \"\"\"Initializes AttackSubmission.\n\n        Args:\n          submission_id: ID of the submission\n          submissions: instance of CompetitionSubmissions with all submissions\n          storage_bucket: storage bucket where all submissions are stored\n\n        Raises:\n          WorkerError: if submission has incorrect type\n        \"\"\"\n        super(AttackSubmission, self).__init__(\n            submission_id, submissions, storage_bucket\n        )\n        if (self.type != TYPE_TARGETED) and (self.type != TYPE_NONTARGETED):\n            raise WorkerError(\n                'Incorrect attack type for submission \"{0}\"'.format(submission_id)\n            )\n\n    def run(self, input_dir, output_dir, epsilon):\n        \"\"\"Runs attack inside Docker.\n\n        Args:\n          input_dir: directory with input (dataset).\n          output_dir: directory where output (adversarial images) should be written.\n          epsilon: maximum allowed size of adversarial perturbation,\n            should be in range [0, 255].\n\n        Returns:\n          how long it took to run submission in seconds\n        \"\"\"\n        logging.info(\"Running attack %s\", self.submission_id)\n        tmp_run_dir = self.temp_copy_extracted_submission()\n        cmd = [\n            \"--network=none\",\n            \"-m=24g\",\n            \"--cpus=3.75\",\n            \"-v\",\n            \"{0}:/input_images:ro\".format(input_dir),\n            \"-v\",\n            \"{0}:/output_images\".format(output_dir),\n            \"-v\",\n            \"{0}:/code\".format(tmp_run_dir),\n            \"-w\",\n            \"/code\",\n            self.container_name,\n            \"./\" + self.entry_point,\n            \"/input_images\",\n            \"/output_images\",\n            str(epsilon),\n        ]\n        elapsed_time_sec = self.run_with_time_limit(cmd)\n        sudo_remove_dirtree(tmp_run_dir)\n        return elapsed_time_sec\n\n\nclass DefenseSubmission(ExecutableSubmission):\n    \"\"\"Helper class to run one defense submission.\"\"\"\n\n    def __init__(self, submission_id, submissions, storage_bucket):\n        \"\"\"Initializes DefenseSubmission.\n\n        Args:\n          submission_id: ID of the submission\n          submissions: instance of CompetitionSubmissions with all submissions\n          storage_bucket: storage bucket where all submissions are stored\n\n        Raises:\n          WorkerError: if submission has incorrect type\n        \"\"\"\n        super(DefenseSubmission, self).__init__(\n            submission_id, submissions, storage_bucket\n        )\n        if self.type != TYPE_DEFENSE:\n            raise WorkerError(\n                'Incorrect defense type for submission \"{0}\"'.format(submission_id)\n            )\n\n    def run(self, input_dir, output_file_path):\n        \"\"\"Runs defense inside Docker.\n\n        Args:\n          input_dir: directory with input (adversarial images).\n          output_file_path: path of the output file.\n\n        Returns:\n          how long it took to run submission in seconds\n        \"\"\"\n        logging.info(\"Running defense %s\", self.submission_id)\n        tmp_run_dir = self.temp_copy_extracted_submission()\n        output_dir = os.path.dirname(output_file_path)\n        output_filename = os.path.basename(output_file_path)\n        cmd = [\n            \"--network=none\",\n            \"-m=24g\",\n            \"--cpus=3.75\",\n            \"-v\",\n            \"{0}:/input_images:ro\".format(input_dir),\n            \"-v\",\n            \"{0}:/output_data\".format(output_dir),\n            \"-v\",\n            \"{0}:/code\".format(tmp_run_dir),\n            \"-w\",\n            \"/code\",\n            self.container_name,\n            \"./\" + self.entry_point,\n            \"/input_images\",\n            \"/output_data/\" + output_filename,\n        ]\n        elapsed_time_sec = self.run_with_time_limit(cmd)\n        sudo_remove_dirtree(tmp_run_dir)\n        return elapsed_time_sec\n\n\nclass EvaluationWorker(object):\n    \"\"\"Class which encapsulate logit of the worker.\n\n    Main entry point of this class is EvaluationWorker.run_work method which\n    performs cleanup of temporary directories, then runs\n    EvaluationWorker.run_attacks and EvaluationWorker.run_defenses\n    \"\"\"\n\n    def __init__(\n        self,\n        worker_id,\n        storage_client,\n        datastore_client,\n        storage_bucket,\n        round_name,\n        dataset_name,\n        blacklisted_submissions=\"\",\n        num_defense_shards=None,\n    ):\n        \"\"\"Initializes EvaluationWorker.\n\n        Args:\n          worker_id: ID of the worker\n          storage_client: instance of eval_lib.CompetitionStorageClient\n          datastore_client: instance of eval_lib.CompetitionDatastoreClient\n          storage_bucket: name of the Google Cloud Storage bucket where all\n            competition data is stored\n          round_name: name of the competition round\n          dataset_name: name of the dataset to use, typically 'dev' of 'final'\n          blacklisted_submissions: optional list of blacklisted submissions which\n            are excluded from evaluation\n          num_defense_shards: optional number of shards to use for evaluation of\n            defenses\n        \"\"\"\n        self.worker_id = int(worker_id)\n        self.storage_client = storage_client\n        self.datastore_client = datastore_client\n        self.storage_bucket = storage_bucket\n        self.round_name = round_name\n        self.dataset_name = dataset_name\n        self.blacklisted_submissions = [\n            s.strip() for s in blacklisted_submissions.split(\",\")\n        ]\n        if num_defense_shards:\n            self.num_defense_shards = int(num_defense_shards)\n        else:\n            self.num_defense_shards = None\n        logging.info(\"Number of defense shards: %s\", str(self.num_defense_shards))\n        # init client classes\n        self.submissions = eval_lib.CompetitionSubmissions(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            round_name=self.round_name,\n        )\n        self.dataset_batches = eval_lib.DatasetBatches(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            dataset_name=self.dataset_name,\n        )\n        self.adv_batches = eval_lib.AversarialBatches(\n            datastore_client=self.datastore_client\n        )\n        self.attack_work = eval_lib.AttackWorkPieces(\n            datastore_client=self.datastore_client\n        )\n        self.defense_work = eval_lib.DefenseWorkPieces(\n            datastore_client=self.datastore_client\n        )\n        self.class_batches = eval_lib.ClassificationBatches(\n            datastore_client=self.datastore_client,\n            storage_client=self.storage_client,\n            round_name=self.round_name,\n        )\n        # whether data was initialized\n        self.attacks_data_initialized = False\n        self.defenses_data_initialized = False\n        # dataset metadata\n        self.dataset_meta = None\n\n    def read_dataset_metadata(self):\n        \"\"\"Read `dataset_meta` field from bucket\"\"\"\n        if self.dataset_meta:\n            return\n        shell_call(\n            [\n                \"gsutil\",\n                \"cp\",\n                \"gs://\"\n                + self.storage_client.bucket_name\n                + \"/\"\n                + \"dataset/\"\n                + self.dataset_name\n                + \"_dataset.csv\",\n                LOCAL_DATASET_METADATA_FILE,\n            ]\n        )\n        with open(LOCAL_DATASET_METADATA_FILE, \"r\") as f:\n            self.dataset_meta = eval_lib.DatasetMetadata(f)\n\n    def fetch_attacks_data(self):\n        \"\"\"Initializes data necessary to execute attacks.\n\n        This method could be called multiple times, only first call does\n        initialization, subsequent calls are noop.\n        \"\"\"\n        if self.attacks_data_initialized:\n            return\n        # init data from datastore\n        self.submissions.init_from_datastore()\n        self.dataset_batches.init_from_datastore()\n        self.adv_batches.init_from_datastore()\n        # copy dataset locally\n        if not os.path.exists(LOCAL_DATASET_DIR):\n            os.makedirs(LOCAL_DATASET_DIR)\n        eval_lib.download_dataset(\n            self.storage_client,\n            self.dataset_batches,\n            LOCAL_DATASET_DIR,\n            os.path.join(LOCAL_DATASET_COPY, self.dataset_name, \"images\"),\n        )\n        # download dataset metadata\n        self.read_dataset_metadata()\n        # mark as initialized\n        self.attacks_data_initialized = True\n\n    def run_attack_work(self, work_id):\n        \"\"\"Runs one attack work.\n\n        Args:\n          work_id: ID of the piece of work to run\n\n        Returns:\n          elapsed_time_sec, submission_id - elapsed time and id of the submission\n\n        Raises:\n          WorkerError: if error occurred during execution.\n        \"\"\"\n        adv_batch_id = self.attack_work.work[work_id][\"output_adversarial_batch_id\"]\n        adv_batch = self.adv_batches[adv_batch_id]\n        dataset_batch_id = adv_batch[\"dataset_batch_id\"]\n        submission_id = adv_batch[\"submission_id\"]\n        epsilon = self.dataset_batches[dataset_batch_id][\"epsilon\"]\n        logging.info(\n            \"Attack work piece: \"\n            'dataset_batch_id=\"%s\" submission_id=\"%s\" '\n            \"epsilon=%d\",\n            dataset_batch_id,\n            submission_id,\n            epsilon,\n        )\n        if submission_id in self.blacklisted_submissions:\n            raise WorkerError(\"Blacklisted submission\")\n        # get attack\n        attack = AttackSubmission(submission_id, self.submissions, self.storage_bucket)\n        attack.download()\n        # prepare input\n        input_dir = os.path.join(LOCAL_DATASET_DIR, dataset_batch_id)\n        if attack.type == TYPE_TARGETED:\n            # prepare file with target classes\n            target_class_filename = os.path.join(input_dir, \"target_class.csv\")\n            self.dataset_meta.save_target_classes_for_batch(\n                target_class_filename, self.dataset_batches, dataset_batch_id\n            )\n        # prepare output directory\n        if os.path.exists(LOCAL_OUTPUT_DIR):\n            sudo_remove_dirtree(LOCAL_OUTPUT_DIR)\n        os.mkdir(LOCAL_OUTPUT_DIR)\n        if os.path.exists(LOCAL_PROCESSED_OUTPUT_DIR):\n            shutil.rmtree(LOCAL_PROCESSED_OUTPUT_DIR)\n        os.mkdir(LOCAL_PROCESSED_OUTPUT_DIR)\n        if os.path.exists(LOCAL_ZIPPED_OUTPUT_DIR):\n            shutil.rmtree(LOCAL_ZIPPED_OUTPUT_DIR)\n        os.mkdir(LOCAL_ZIPPED_OUTPUT_DIR)\n        # run attack\n        elapsed_time_sec = attack.run(input_dir, LOCAL_OUTPUT_DIR, epsilon)\n        if attack.type == TYPE_TARGETED:\n            # remove target class file\n            os.remove(target_class_filename)\n        # enforce epsilon and compute hashes\n        image_hashes = eval_lib.enforce_epsilon_and_compute_hash(\n            input_dir, LOCAL_OUTPUT_DIR, LOCAL_PROCESSED_OUTPUT_DIR, epsilon\n        )\n        if not image_hashes:\n            logging.warning(\"No images saved by the attack.\")\n            return elapsed_time_sec, submission_id\n        # write images back to datastore\n        # rename images and add information to adversarial batch\n        for clean_image_id, hash_val in iteritems(image_hashes):\n            # we will use concatenation of batch_id and image_id\n            # as adversarial image id and as a filename of adversarial images\n            adv_img_id = adv_batch_id + \"_\" + clean_image_id\n            # rename the image\n            os.rename(\n                os.path.join(LOCAL_PROCESSED_OUTPUT_DIR, clean_image_id + \".png\"),\n                os.path.join(LOCAL_PROCESSED_OUTPUT_DIR, adv_img_id + \".png\"),\n            )\n            # populate values which will be written to datastore\n            image_path = \"{0}/adversarial_images/{1}/{1}.zip/{2}.png\".format(\n                self.round_name, adv_batch_id, adv_img_id\n            )\n            # u'' + foo is a a python 2/3 compatible way of casting foo to unicode\n            adv_batch[\"images\"][adv_img_id] = {\n                \"clean_image_id\": u\"\" + str(clean_image_id),\n                \"image_path\": u\"\" + str(image_path),\n                \"image_hash\": u\"\" + str(hash_val),\n            }\n        # archive all images and copy to storage\n        zipped_images_filename = os.path.join(\n            LOCAL_ZIPPED_OUTPUT_DIR, adv_batch_id + \".zip\"\n        )\n        try:\n            logging.debug(\n                \"Compressing adversarial images to %s\", zipped_images_filename\n            )\n            shell_call(\n                [\"zip\", \"-j\", \"-r\", zipped_images_filename, LOCAL_PROCESSED_OUTPUT_DIR]\n            )\n        except subprocess.CalledProcessError as e:\n            raise WorkerError(\"Can\" \"t make archive from adversarial iamges\", e)\n        # upload archive to storage\n        dst_filename = \"{0}/adversarial_images/{1}/{1}.zip\".format(\n            self.round_name, adv_batch_id\n        )\n        logging.debug(\"Copying archive with adversarial images to %s\", dst_filename)\n        self.storage_client.new_blob(dst_filename).upload_from_filename(\n            zipped_images_filename\n        )\n        # writing adv batch to datastore\n        logging.debug(\"Writing adversarial batch to datastore\")\n        self.adv_batches.write_single_batch_images_to_datastore(adv_batch_id)\n        return elapsed_time_sec, submission_id\n\n    def run_attacks(self):\n        \"\"\"Method which evaluates all attack work.\n\n        In a loop this method queries not completed attack work, picks one\n        attack work and runs it.\n        \"\"\"\n        logging.info(\"******** Start evaluation of attacks ********\")\n        prev_submission_id = None\n        while True:\n            # wait until work is available\n            self.attack_work.read_all_from_datastore()\n            if not self.attack_work.work:\n                logging.info(\"Work is not populated, waiting...\")\n                time.sleep(SLEEP_TIME)\n                continue\n            if self.attack_work.is_all_work_competed():\n                logging.info(\"All attack work completed.\")\n                break\n            # download all attacks data and dataset\n            self.fetch_attacks_data()\n            # pick piece of work\n            work_id = self.attack_work.try_pick_piece_of_work(\n                self.worker_id, submission_id=prev_submission_id\n            )\n            if not work_id:\n                logging.info(\"Failed to pick work, waiting...\")\n                time.sleep(SLEEP_TIME_SHORT)\n                continue\n            logging.info(\"Selected work_id: %s\", work_id)\n            # execute work\n            try:\n                elapsed_time_sec, prev_submission_id = self.run_attack_work(work_id)\n                logging.info(\"Work %s is done\", work_id)\n                # indicate that work is completed\n                is_work_update = self.attack_work.update_work_as_completed(\n                    self.worker_id,\n                    work_id,\n                    other_values={\"elapsed_time\": elapsed_time_sec},\n                )\n            except WorkerError as e:\n                logging.info(\"Failed to run work:\\n%s\", str(e))\n                is_work_update = self.attack_work.update_work_as_completed(\n                    self.worker_id, work_id, error=str(e)\n                )\n            if not is_work_update:\n                logging.warning(\n                    \"Can\" 't update work \"%s\" as completed by worker %d',\n                    work_id,\n                    self.worker_id,\n                )\n        logging.info(\"******** Finished evaluation of attacks ********\")\n\n    def fetch_defense_data(self):\n        \"\"\"Lazy initialization of data necessary to execute defenses.\"\"\"\n        if self.defenses_data_initialized:\n            return\n        logging.info(\"Fetching defense data from datastore\")\n        # init data from datastore\n        self.submissions.init_from_datastore()\n        self.dataset_batches.init_from_datastore()\n        self.adv_batches.init_from_datastore()\n        # read dataset metadata\n        self.read_dataset_metadata()\n        # mark as initialized\n        self.defenses_data_initialized = True\n\n    def run_defense_work(self, work_id):\n        \"\"\"Runs one defense work.\n\n        Args:\n          work_id: ID of the piece of work to run\n\n        Returns:\n          elapsed_time_sec, submission_id - elapsed time and id of the submission\n\n        Raises:\n          WorkerError: if error occurred during execution.\n        \"\"\"\n        class_batch_id = self.defense_work.work[work_id][\n            \"output_classification_batch_id\"\n        ]\n        class_batch = self.class_batches.read_batch_from_datastore(class_batch_id)\n        adversarial_batch_id = class_batch[\"adversarial_batch_id\"]\n        submission_id = class_batch[\"submission_id\"]\n        cloud_result_path = class_batch[\"result_path\"]\n        logging.info(\n            \"Defense work piece: \" 'adversarial_batch_id=\"%s\" submission_id=\"%s\"',\n            adversarial_batch_id,\n            submission_id,\n        )\n        if submission_id in self.blacklisted_submissions:\n            raise WorkerError(\"Blacklisted submission\")\n        # get defense\n        defense = DefenseSubmission(\n            submission_id, self.submissions, self.storage_bucket\n        )\n        defense.download()\n        # prepare input - copy adversarial batch locally\n        input_dir = os.path.join(LOCAL_INPUT_DIR, adversarial_batch_id)\n        if os.path.exists(input_dir):\n            sudo_remove_dirtree(input_dir)\n        os.makedirs(input_dir)\n        try:\n            shell_call(\n                [\n                    \"gsutil\",\n                    \"-m\",\n                    \"cp\",\n                    # typical location of adv batch:\n                    # testing-round/adversarial_images/ADVBATCH000/\n                    os.path.join(\n                        \"gs://\",\n                        self.storage_bucket,\n                        self.round_name,\n                        \"adversarial_images\",\n                        adversarial_batch_id,\n                        \"*\",\n                    ),\n                    input_dir,\n                ]\n            )\n            adv_images_files = os.listdir(input_dir)\n            if (len(adv_images_files) == 1) and adv_images_files[0].endswith(\".zip\"):\n                logging.info(\n                    \"Adversarial batch is in zip archive %s\", adv_images_files[0]\n                )\n                shell_call(\n                    [\n                        \"unzip\",\n                        os.path.join(input_dir, adv_images_files[0]),\n                        \"-d\",\n                        input_dir,\n                    ]\n                )\n                os.remove(os.path.join(input_dir, adv_images_files[0]))\n                adv_images_files = os.listdir(input_dir)\n            logging.info(\"%d adversarial images copied\", len(adv_images_files))\n        except (subprocess.CalledProcessError, IOError) as e:\n            raise WorkerError(\"Can\" \"t copy adversarial batch locally\", e)\n        # prepare output directory\n        if os.path.exists(LOCAL_OUTPUT_DIR):\n            sudo_remove_dirtree(LOCAL_OUTPUT_DIR)\n        os.mkdir(LOCAL_OUTPUT_DIR)\n        output_filname = os.path.join(LOCAL_OUTPUT_DIR, \"result.csv\")\n        # run defense\n        elapsed_time_sec = defense.run(input_dir, output_filname)\n        # evaluate defense result\n        batch_result = eval_lib.analyze_one_classification_result(\n            storage_client=None,\n            file_path=output_filname,\n            adv_batch=self.adv_batches.data[adversarial_batch_id],\n            dataset_batches=self.dataset_batches,\n            dataset_meta=self.dataset_meta,\n        )\n        # copy result of the defense into storage\n        try:\n            shell_call(\n                [\n                    \"gsutil\",\n                    \"cp\",\n                    output_filname,\n                    os.path.join(\"gs://\", self.storage_bucket, cloud_result_path),\n                ]\n            )\n        except subprocess.CalledProcessError as e:\n            raise WorkerError(\"Can\" \"t result to Cloud Storage\", e)\n        return elapsed_time_sec, submission_id, batch_result\n\n    def run_defenses(self):\n        \"\"\"Method which evaluates all defense work.\n\n        In a loop this method queries not completed defense work,\n        picks one defense work and runs it.\n        \"\"\"\n        logging.info(\"******** Start evaluation of defenses ********\")\n        prev_submission_id = None\n        need_reload_work = True\n        while True:\n            # wait until work is available\n            if need_reload_work:\n                if self.num_defense_shards:\n                    shard_with_work = self.defense_work.read_undone_from_datastore(\n                        shard_id=(self.worker_id % self.num_defense_shards),\n                        num_shards=self.num_defense_shards,\n                    )\n                else:\n                    shard_with_work = self.defense_work.read_undone_from_datastore()\n                logging.info(\n                    \"Loaded %d records of undone work from shard %s\",\n                    len(self.defense_work),\n                    str(shard_with_work),\n                )\n            if not self.defense_work.work:\n                logging.info(\"Work is not populated, waiting...\")\n                time.sleep(SLEEP_TIME)\n                continue\n            if self.defense_work.is_all_work_competed():\n                logging.info(\"All defense work completed.\")\n                break\n            # download all defense data and dataset\n            self.fetch_defense_data()\n            need_reload_work = False\n            # pick piece of work\n            work_id = self.defense_work.try_pick_piece_of_work(\n                self.worker_id, submission_id=prev_submission_id\n            )\n            if not work_id:\n                need_reload_work = True\n                logging.info(\"Failed to pick work, waiting...\")\n                time.sleep(SLEEP_TIME_SHORT)\n                continue\n            logging.info(\"Selected work_id: %s\", work_id)\n            # execute work\n            try:\n                (\n                    elapsed_time_sec,\n                    prev_submission_id,\n                    batch_result,\n                ) = self.run_defense_work(work_id)\n                logging.info(\"Work %s is done\", work_id)\n                # indicate that work is completed\n                is_work_update = self.defense_work.update_work_as_completed(\n                    self.worker_id,\n                    work_id,\n                    other_values={\n                        \"elapsed_time\": elapsed_time_sec,\n                        \"stat_correct\": batch_result[0],\n                        \"stat_error\": batch_result[1],\n                        \"stat_target_class\": batch_result[2],\n                        \"stat_num_images\": batch_result[3],\n                    },\n                )\n            except WorkerError as e:\n                logging.info(\"Failed to run work:\\n%s\", str(e))\n                if str(e).startswith(\"Docker returned non-zero retval\"):\n                    logging.info(\"Running nvidia-docker to ensure that GPU works\")\n                    shell_call(\n                        [\"nvidia-docker\", \"run\", \"--rm\", \"nvidia/cuda\", \"nvidia-smi\"]\n                    )\n                is_work_update = self.defense_work.update_work_as_completed(\n                    self.worker_id, work_id, error=str(e)\n                )\n            if not is_work_update:\n                logging.warning(\n                    \"Can\" 't update work \"%s\" as completed by worker %d',\n                    work_id,\n                    self.worker_id,\n                )\n                need_reload_work = True\n        logging.info(\"******** Finished evaluation of defenses ********\")\n\n    def run_work(self):\n        \"\"\"Run attacks and defenses\"\"\"\n        if os.path.exists(LOCAL_EVAL_ROOT_DIR):\n            sudo_remove_dirtree(LOCAL_EVAL_ROOT_DIR)\n        self.run_attacks()\n        self.run_defenses()\n\n\ndef main(args):\n    \"\"\"Main function which runs worker.\"\"\"\n    title = \"## Starting evaluation of round {0} ##\".format(args.round_name)\n    logging.info(\n        \"\\n\"\n        + \"#\" * len(title)\n        + \"\\n\"\n        + \"#\" * len(title)\n        + \"\\n\"\n        + \"##\"\n        + \" \" * (len(title) - 2)\n        + \"##\"\n        + \"\\n\"\n        + title\n        + \"\\n\"\n        + \"#\" * len(title)\n        + \"\\n\"\n        + \"#\" * len(title)\n        + \"\\n\"\n        + \"##\"\n        + \" \" * (len(title) - 2)\n        + \"##\"\n        + \"\\n\"\n    )\n    if args.blacklisted_submissions:\n        logging.warning(\"BLACKLISTED SUBMISSIONS: %s\", args.blacklisted_submissions)\n    random.seed()\n    logging.info(\"Running nvidia-docker to ensure that GPU works\")\n    shell_call(\n        [\"docker\", \"run\", \"--runtime=nvidia\", \"--rm\", \"nvidia/cuda\", \"nvidia-smi\"]\n    )\n    eval_worker = EvaluationWorker(\n        worker_id=args.worker_id,\n        storage_client=eval_lib.CompetitionStorageClient(\n            args.project_id, args.storage_bucket\n        ),\n        datastore_client=eval_lib.CompetitionDatastoreClient(\n            args.project_id, args.round_name\n        ),\n        storage_bucket=args.storage_bucket,\n        round_name=args.round_name,\n        dataset_name=args.dataset_name,\n        blacklisted_submissions=args.blacklisted_submissions,\n        num_defense_shards=args.num_defense_shards,\n    )\n    eval_worker.run_work()\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(description=\"Worker which executes work.\")\n    parser.add_argument(\n        \"--worker_id\", required=True, type=int, help=\"Numerical ID of the worker.\"\n    )\n    parser.add_argument(\n        \"--project_id\", required=True, help=\"Your Google Cloud project ID.\"\n    )\n    parser.add_argument(\n        \"--storage_bucket\",\n        required=True,\n        help=\"Cloud Storage bucket to store competition data.\",\n    )\n    parser.add_argument(\n        \"--round_name\",\n        default=\"testing-round\",\n        required=False,\n        help=\"Name of the round.\",\n    )\n    parser.add_argument(\n        \"--dataset_name\",\n        default=\"dev\",\n        required=False,\n        help=\"Which dataset to use, either dev or final.\",\n    )\n    parser.add_argument(\n        \"--blacklisted_submissions\",\n        default=\"\",\n        required=False,\n        help=\"Comma separated list of blacklisted submission \" \"IDs.\",\n    )\n    parser.add_argument(\n        \"--num_defense_shards\",\n        default=10,\n        required=False,\n        help=\"Number of defense shards\",\n    )\n    parser.add_argument(\n        \"--log_file\", default=\"\", required=False, help=\"Location of the logfile.\"\n    )\n    worker_args = parser.parse_args()\n    logging_args = {\n        \"format\": \"%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s -- %(message)s\",\n        \"level\": logging.INFO,\n        \"datefmt\": \"%Y-%m-%d %H:%M:%S\",\n    }\n    if worker_args.log_file:\n        logging_args[\"filename\"] = worker_args.log_file\n        logging_args[\"filemode\"] = \"a\"\n    logging.basicConfig(**logging_args)\n    main(worker_args)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/run_master.sh",
    "content": "#!/bin/bash\n#\n# Script runs master.\n#\n# Usage:\n#   run_master.sh COMMAND\n#\n\n# Get master command from arguments to run_master.sh\nCOMMAND=$1\nif [ -z ${COMMAND} ]; then\n  COMMAND=status\nfi\n\n# cd to script subdirectory\ncd \"$( dirname \"${BASH_SOURCE[0]}\" )\"\n\n# Read variables from config.sh\nsource scripts/config.sh\ncheck_dataset_and_round_set\n\n# Create results directory if it does not exist\nmkdir -p ${MASTER_RESULTS_DIR}\n\n# Execute master in proper virtualenv\ncd code\nsource ~/.virtualenv/${VIRTUALENV_NAME}/bin/activate\n# NOTE: if you want to use only 30 images from the dataset with 10 images per\n# batch then add --limited_dataset flag to following command\npython -B master.py \\\n  ${COMMAND} \\\n  --project_id=\"${GOOGLE_CLOUD_PROJECT_ID}\" \\\n  --storage_bucket=\"${GOOGLE_CLOUD_STORAGE_BUCKET}\" \\\n  --round_name=\"${ROUND_NAME}\" \\\n  --dataset_name=\"${DATASET}\" \\\n  --results_dir=\"${MASTER_RESULTS_DIR}\" \\\n  --num_defense_shards=\"${NUM_DEFENSE_SHARDS}\" \\\n  --log_file=\"${MASTER_RESULTS_DIR}/log.txt\" \\\n  --verbose\ndeactivate\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/config.sh",
    "content": "#!/bin/bash\n#\n# Constants and variables related to evaluation of the competition.\n# Please update them appropriately before running evaluation\n#\n\n################################################################################\n# Variables\n################################################################################\n\n# Google Cloud Project ID\nGOOGLE_CLOUD_PROJECT_ID=\"\"\n\n# Google Cloud Storage bucket where all data related to competition are stored\nGOOGLE_CLOUD_STORAGE_BUCKET=\"\"\n\n# Name of the zone where VMs are created\nGOOGLE_CLOUD_COMPUTE_ZONE=\"\"\n\n# Google Cloud VM username\nGOOGLE_CLOUD_VM_USERNAME=\"${USER}\"\n\n# Name of the VM snapshot which is used as reference images for all workers\nGOOGLE_CLOUD_REF_VM_SNAPSHOT=\"\"\n\n# Name of the current round\nROUND_NAME=\"\"\n\n# Dataset to use\nDATASET=\"\"\n\n# Number of shards to compute defense results\n# As a rule of thumb use NUM_DEFENSE_SHARDS equal to NUM_WORKERS/10\n# Increase number of shards if you see that workers have periodic\n# transient errors while accessing datastore.\nNUM_DEFENSE_SHARDS=1\n\n# Local directory where master will save results of the competition\nMASTER_RESULTS_DIR=\"${HOME}/adversarial_competition/results/${ROUND_NAME}\"\n\n# Name of the python virtualenv which is used to run the master\nVIRTUALENV_NAME=\"nips_competition_env\"\n\n################################################################################\n# Check that necessary variables are set\n# GOOGLE_CLOUD_PROJECT_ID and GOOGLE_CLOUD_STORAGE_BUCKET are checked every time\n# config is imported.\n# Few other variables are checked only when needed by provided helper functions.\n################################################################################\n\nif [[ -z ${GOOGLE_CLOUD_PROJECT_ID} ]]; then\n  echo \"GOOGLE_CLOUD_PROJECT_ID variable must be set in config.sh\"\n  exit 1\nfi\n\nif [[ -z ${GOOGLE_CLOUD_STORAGE_BUCKET} ]]; then\n  echo \"GOOGLE_CLOUD_STORAGE_BUCKET variable must be set in config.sh\"\n  exit 1\nfi\n\nfunction check_cloud_compute_zone_set() {\n  if [[ -z ${GOOGLE_CLOUD_COMPUTE_ZONE} ]]; then\n    echo \"GOOGLE_CLOUD_COMPUTE_ZONE variable must be set in config.sh\"\n    exit 1\n  fi\n}\n\nfunction check_cloud_ref_vm_snapshot_set() {\n  if [[ -z ${GOOGLE_CLOUD_REF_VM_SNAPSHOT} ]]; then\n    echo \"GOOGLE_CLOUD_REF_VM_SNAPSHOT variable must be set in config.sh\"\n    exit 1\n  fi\n}\n\nfunction check_dataset_and_round_set() {\n  if [[ -z ${DATASET} ]]; then\n    echo \"DATASET variable must be set in config.sh\"\n    exit 1\n  fi\n\n  if [[ -z ${ROUND_NAME} ]]; then\n    echo \"DATASET variable must be set in config.sh\"\n    exit 1\n  fi\n}\n\n################################################################################\n# Helper functions\n################################################################################\n\nfunction run_ssh_command() {\n  check_cloud_compute_zone_set\n\n  local machine_name=$1\n  local command=$2\n\n  gcloud compute --project \"${GOOGLE_CLOUD_PROJECT_ID}\" \\\n    ssh --zone \"${GOOGLE_CLOUD_COMPUTE_ZONE}\" \"${machine_name}\" \\\n    --command=\"${command}\"\n}\n\nfunction scp_cloud_vm() {\n  check_cloud_compute_zone_set\n\n  local src=$1\n  local dst=$2\n\n  gcloud compute scp \\\n    --project \"${GOOGLE_CLOUD_PROJECT_ID}\" \\\n    --zone \"${GOOGLE_CLOUD_COMPUTE_ZONE}\" \\\n    ${src} ${dst}\n}\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/copy_baselines.sh",
    "content": "#!/bin/bash\n#\n# Copies baselines to directory which correspond to current round\n#\n\n# Import config.sh\nsource \"$( dirname \"${BASH_SOURCE[0]}\" )/config.sh\"\ncheck_dataset_and_round_set\n\n# Copy baselines\ngsutil cp gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/defense/* \\\n    gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions/defense/\ngsutil cp gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/targeted/* \\\n    gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions/targeted/\ngsutil cp gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/baselines/nontargeted/* \\\n    gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions/nontargeted/\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/copy_dataset_to_vm.sh",
    "content": "#!/bin/bash\n#\n# Script which copies dataset to VM\n# Usage:\n#   copy_dataset_to_vm.sh DATASET_LOCAL_DIR DATASET_NAME VM_NAME\n# Where:\n#   DATASET_LOCAL_DIR - local directory where dataset is located,\n#       directory with dataset should contain file \"${DATASET_NAME}_dataset.csv\"\n#       and subdirectory \"images\" with all dataset images\n#   DATASET_NAME - name of the dataset, \"dev\" or \"final\"\n#   VM_NAME - name of virtual machine where data should be copied into\n#\n\n# fail on first error\nset -e\n\n# Read variables from config.sh\nSCRIPT_DIR=\"$( dirname \"${BASH_SOURCE[0]}\" )\"\nsource \"${SCRIPT_DIR}/config.sh\"\n\n# Check arguments\nDATASET_DIR=$1\nDATASET_NAME=$2\nVM_NAME=$3\n\nif [[ -z ${DATASET_DIR} ]] || [[ -z ${DATASET_NAME} ]] || [[ -z ${VM_NAME} ]]; then\n  echo \"Invalid usage, please run:\"\n  echo \"  copy_dataset_to_vm.sh DATASET_LOCAL_DIR DATASET_NAME VM_NAME\"\n  exit 1\nfi\n\n# Archive dataset\nTMP_DIR=$(mktemp -d)\ncd ${DATASET_DIR}\nzip -r ${TMP_DIR}/dataset.zip ./\n\n# Copy archive with dataset to VM\nscp_cloud_vm ${TMP_DIR}/dataset.zip \"${GOOGLE_CLOUD_VM_USERNAME}@${VM_NAME}:~/\"\n\n# Unpack dataset\nrun_ssh_command ${VM_NAME} \"rm -rf competition_data/dataset/${DATASET_NAME}\"\nrun_ssh_command ${VM_NAME} \"mkdir -p competition_data/dataset/${DATASET_NAME}\"\nrun_ssh_command ${VM_NAME} \"unzip dataset.zip -d competition_data/dataset/${DATASET_NAME}\"\n\n# Cleanup\nrun_ssh_command ${VM_NAME} \"rm dataset.zip\"\nrm -r ${TMP_DIR}\n\necho \"DONE!\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/copy_eval_infra_to_vm.sh",
    "content": "#!/bin/bash\n#\n# Helper script which copies evaluation infrastructure to VM\n# Usage:\n#   copy_eval_infra_to_vm.sh VM_NAME\n#\n\n# fail on first error\nset -e\n\nSCRIPT_DIR=\"$( dirname \"${BASH_SOURCE[0]}\" )\"\n\n# Read variables from config.sh\nsource \"${SCRIPT_DIR}/config.sh\"\n\n# Check arguments\nVM_NAME=$1\nif [[ -z ${VM_NAME} ]]; then\n  echo \"Invalid usage, please provide name of VM:\"\n  echo \"  copy_eval_infra_to_vm.sh VM_NAME\"\n  exit 1\nfi\n\n# Archive evaluation infrastucture\nTMP_DIR=$(mktemp -d)\ncd ${SCRIPT_DIR}/..\nzip -r ${TMP_DIR}/eval_infra.zip ./\n\n# Copy archive to VM\nscp_cloud_vm ${TMP_DIR}/eval_infra.zip \"${GOOGLE_CLOUD_VM_USERNAME}@${VM_NAME}:~/\"\n\n# Unpack eval_infra\nrun_ssh_command ${VM_NAME} \"rm -rf eval_infra\"\nrun_ssh_command ${VM_NAME} \"unzip eval_infra.zip -d eval_infra\"\n\n# Cleanup\nrun_ssh_command ${VM_NAME} \"rm eval_infra.zip\"\nrm -r ${TMP_DIR}\n\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/create_workers.sh",
    "content": "#!/bin/bash\n#\n# Script which creates virtual machines for all workers.\n# Note that all virtual machines are creates in running state, thus you\n# will be billed for them. Also this script does not start evaluation,\n# you need to use start_workers.sh to actually start evaluation\n# of the competition.\n#\n# Usage:\n#   create_workers.sh INDICES\n# Where INDICES is a string with space separated indices of workers to create\n#\n# Example:\n#   create_workers.sh \"1 3 4\"  # create workers with indices 1, 3 and 4\n#   create_workers.sh \"$(seq 1 5)\"  # create workers with indices 1, 2, 3, 4, 5\n#\n\nSCRIPT_DIR=\"$( dirname \"${BASH_SOURCE[0]}\" )\"\ncd ${SCRIPT_DIR}\nsource config.sh\n\n# Check that variables are set\ncheck_cloud_compute_zone_set\ncheck_cloud_ref_vm_snapshot_set\n\n# Check argument\nINDICES=$1\nif [[ -z ${INDICES} ]] || [[ \"$#\" -ne 1 ]]; then\n  echo \"Invalid usage, please provide list of indices as single argument:\"\n  echo \"  create_workers.sh \\\"INDICES\\\"\"\n  exit 1\nfi\n\n# Parameters of VM, feel free to change if you need different specs\nDISK_SIZE=200  # disk size in Gb\nMACHINE_TYPE=\"n1-highmem-4\"  # type of machine, determines CPU and amount of RAM\nGPU_TYPE=\"nvidia-tesla-k80\"  # type of GPU\n\n# Create all workers\nfor idx in ${INDICES}\ndo\n  MACHINE_NAME=`printf \"worker-%03g\" ${idx}`\n  echo \"Creating worker ${MACHINE_NAME}\"\n\n  gcloud compute --project \"${GOOGLE_CLOUD_PROJECT_ID}\" \\\n    disks create \"${MACHINE_NAME}\" --size \"${DISK_SIZE}\" \\\n    --zone \"${GOOGLE_CLOUD_COMPUTE_ZONE}\" \\\n    --source-snapshot \"${GOOGLE_CLOUD_REF_VM_SNAPSHOT}\" --type \"pd-standard\"\n\n  gcloud beta compute --project \"${GOOGLE_CLOUD_PROJECT_ID}\" \\\n    instances create \"${MACHINE_NAME}\" \\\n    --zone \"${GOOGLE_CLOUD_COMPUTE_ZONE}\" \\\n    --machine-type \"${MACHINE_TYPE}\" --subnet \"default\" \\\n    --maintenance-policy \"TERMINATE\" \\\n    --scopes \"https://www.googleapis.com/auth/datastore\",\"https://www.googleapis.com/auth/servicecontrol\",\"https://www.googleapis.com/auth/service.management.readonly\",\"https://www.googleapis.com/auth/logging.write\",\"https://www.googleapis.com/auth/monitoring.write\",\"https://www.googleapis.com/auth/trace.append\",\"https://www.googleapis.com/auth/devstorage.read_write\" \\\n    --accelerator type=${GPU_TYPE},count=1 \\\n    --min-cpu-platform \"Automatic\" \\\n    --disk \"name=${MACHINE_NAME},device-name=${MACHINE_NAME},mode=rw,boot=yes,auto-delete=yes\"\ndone\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/prepare_virtualenv.sh",
    "content": "#!/bin/bash\n#\n# Script prepares python virtualenv with all necessary libraries\n#\n\n# Fail on first error\nset -e\n\n# cd to script subdirectory\ncd \"$( dirname \"${BASH_SOURCE[0]}\" )\"\n\n# Read variables from config.sh\nsource config.sh\n\n################################################################################\n# Create virtual env\n################################################################################\n\ncd ~/\nrm -rf ~/.virtualenv/${VIRTUALENV_NAME}\nvirtualenv --system-site-packages ~/.virtualenv/${VIRTUALENV_NAME}\n\n################################################################################\n# Install packages into virtualenv\n################################################################################\n\nsource ~/.virtualenv/${VIRTUALENV_NAME}/bin/activate\npip install --upgrade google-api-python-client\npip install google-cloud\npip install pandas\npip install Pillow\npip install urllib3[secure]\ndeactivate\n\necho \"ALL DONE!\"\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/scp_cloud_vm.sh",
    "content": "#!/bin/bash\n#\n# Helper script which copies files to and from VM\n# Usage:\n#   scp_cloud_vm.sh SRC DST\n#\n\n# Import config.sh\nsource \"$( dirname \"${BASH_SOURCE[0]}\" )/config.sh\"\n\n# Copy files using function from config.sh\nscp_cloud_vm $1 $2\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/scripts/start_workers.sh",
    "content": "#!/bin/bash\n#\n# Script which starts evaluation of the competition on all given workers.\n# Before running this script VMs with workers should be on, but worker binary\n# should not be running on the VMs. If unsure, reload all VMs (via Google Cloud\n# web UI) before running this script.\n#\n# Usage:\n#   start_workers.sh INDICES\n# Where INDICES is a string with space separated indices of workers to start\n#\n# Example:\n#   start_workers.sh \"1 3 4\"  # start workers with indices 1, 3 and 4\n#   start_workers.sh \"$(seq 1 5)\"  # start workers with indices 1, 2, 3, 4, 5\n#\n\nSCRIPT_DIR=\"$( dirname \"${BASH_SOURCE[0]}\" )\"\ncd ${SCRIPT_DIR}\nsource config.sh\ncheck_cloud_compute_zone_set\ncheck_dataset_and_round_set\n\n# Check argument\nINDICES=$1\nif [[ -z ${INDICES} ]] || [[ \"$#\" -ne 1 ]]; then\n  echo \"Invalid usage, please provide list of indices as single argument:\"\n  echo \"  create_workers.sh \\\"INDICES\\\"\"\n  exit 1\nfi\n\n# Start workers\nfor idx in ${INDICES}\ndo\n  MACHINE_NAME=`printf \"worker-%03g\" ${idx}`\n  echo \"Starting worker ${MACHINE_NAME}\"\n\n  # Copy current code of evaluation infrastructure to the worker\n  ./copy_eval_infra_to_vm.sh ${MACHINE_NAME}\n\n  # Start worker\n  run_ssh_command ${MACHINE_NAME} \\\n    \"eval_infra/code/start_worker_in_tmux.sh ${idx}\"\n\n  # Sleep few seconds, so workers will be started with some delay.\n  # This helps to reduce contention on Google Cloud Datastore.\n  sleep 5\ndone\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/validation_tool/validate_and_copy_submissions.py",
    "content": "r\"\"\"Tool to validate all submission and copy them to proper location.\n\nUsage:\n  python validate_and_copy_submissions.py \\\n    --source_dir=SOURCE \\\n    --target_dir=TARGET \\\n    [--containers_file=CONTAINER_FILE] \\\n    [--log_file=LOG_FILE] \\\n    [--nouse_gpu] \\\n    [--nocopy]\n\nWhere:\n  SOURCE - Google Cloud Storage directory with all submissions to verify.\n    Submissions in the source directory could be structured any way, this tool\n    will go though all subdirectories and look for zip, tar and tar.gz archives.\n  TARGET - Target directory in Google Cloud Storage, typically it should be\n    gs://${GOOGLE_CLOUD_STORAGE_BUCKET}/${ROUND_NAME}/submissions\n  CONTAINER_FILE - optional name of the file where to save list of all Docker\n    containers used by all submissions.\n  LOG_FILE - optional filename of the logfile.\n  --nouse_gpu - if argument is provided then submission will be run on CPU,\n    otherwise will be run on GPU.\n  --nocopy - if argument is provided then submissions will be validated,\n    but no copy will be performed.\n\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport argparse\nimport csv\nimport logging\nimport os\nimport random\nimport shutil\nimport subprocess\nimport tempfile\nfrom six import iteritems\nimport validate_submission_lib\n\n\nALLOWED_EXTENSIONS = [\".zip\", \".tar\", \".tar.gz\"]\n\nTYPE_ATTACK = \"attack\"\nTYPE_TARGETED_ATTACK = \"targeted_attack\"\nTYPE_DEFENSE = \"defense\"\n\nTYPE_TO_DIR = {\n    \"attack\": \"nontargeted\",\n    \"targeted_attack\": \"targeted\",\n    \"defense\": \"defense\",\n}\n\n\nclass ValidationStats(object):\n    \"\"\"Class which stores statistics about validation of the submissions.\"\"\"\n\n    def __init__(self):\n        # dictionary mapping submission_type to tuple (num_success, num_fail)\n        self.stats = {}\n\n    def _update_stat(self, submission_type, increase_success, increase_fail):\n        \"\"\"Common method to update submission statistics.\"\"\"\n        stat = self.stats.get(submission_type, (0, 0))\n        stat = (stat[0] + increase_success, stat[1] + increase_fail)\n        self.stats[submission_type] = stat\n\n    def add_success(self, submission_type):\n        \"\"\"Add one successfull submission of given type.\"\"\"\n        self._update_stat(submission_type, 1, 0)\n\n    def add_failure(self, submission_type=\"unknown\"):\n        \"\"\"Add one failed submission of given type.\"\"\"\n        self._update_stat(submission_type, 0, 1)\n\n    def log_stats(self):\n        \"\"\"Print statistics into log.\"\"\"\n        logging.info(\"Validation statistics: \")\n        for k, v in iteritems(self.stats):\n            logging.info(\n                \"%s - %d valid out of %d total submissions\", k, v[0], v[0] + v[1]\n            )\n\n\nclass SubmissionValidator(object):\n    \"\"\"Helper class which performs validation of all submissions.\"\"\"\n\n    def __init__(\n        self, source_dir, target_dir, temp_dir, do_copy, use_gpu, containers_file=None\n    ):\n        \"\"\"Initializes SubmissionValidator.\n\n        Args:\n          source_dir: source Google Cloud Storage directory with all submissions\n          target_dir: target Google Cloud Storage directory where to copy\n            submissions\n          temp_dir: local temporary directory\n          do_copy: if True then validate and copy submissions, if False then only\n            validate\n          use_gpu: if True then use GPU for validation, otherwise use CPU\n          containers_file: optional name of the local text file where list of\n            Docker containes of all submissions will be saved.\n        \"\"\"\n        self.source_dir = source_dir\n        self.target_dir = target_dir\n        self.do_copy = do_copy\n        self.containers_file = containers_file\n        self.list_of_containers = set()\n        self.local_id_to_path_mapping_file = os.path.join(\n            temp_dir, \"id_to_path_mapping.csv\"\n        )\n        self.validate_dir = os.path.join(temp_dir, \"validate\")\n        self.base_validator = validate_submission_lib.SubmissionValidator(\n            self.validate_dir, use_gpu\n        )\n        self.stats = ValidationStats()\n        self.download_dir = os.path.join(temp_dir, \"download\")\n        self.cur_submission_idx = 0\n        self.id_to_path_mapping = {}\n\n    def copy_submission_locally(self, cloud_path):\n        \"\"\"Copies submission from Google Cloud Storage to local directory.\n\n        Args:\n          cloud_path: path of the submission in Google Cloud Storage\n\n        Returns:\n          name of the local file where submission is copied to\n        \"\"\"\n        local_path = os.path.join(self.download_dir, os.path.basename(cloud_path))\n        cmd = [\"gsutil\", \"cp\", cloud_path, local_path]\n        if subprocess.call(cmd) != 0:\n            logging.error(\"Can't copy submission locally\")\n            return None\n        return local_path\n\n    def copy_submission_to_destination(self, src_filename, dst_subdir, submission_id):\n        \"\"\"Copies submission to target directory.\n\n        Args:\n          src_filename: source filename of the submission\n          dst_subdir: subdirectory of the target directory where submission should\n            be copied to\n          submission_id: ID of the submission, will be used as a new\n            submission filename (before extension)\n        \"\"\"\n\n        extension = [e for e in ALLOWED_EXTENSIONS if src_filename.endswith(e)]\n        if len(extension) != 1:\n            logging.error(\"Invalid submission extension: %s\", src_filename)\n            return\n        dst_filename = os.path.join(\n            self.target_dir, dst_subdir, submission_id + extension[0]\n        )\n        cmd = [\"gsutil\", \"cp\", src_filename, dst_filename]\n        if subprocess.call(cmd) != 0:\n            logging.error(\"Can't copy submission to destination\")\n        else:\n            logging.info(\"Submission copied to: %s\", dst_filename)\n\n    def validate_and_copy_one_submission(self, submission_path):\n        \"\"\"Validates one submission and copies it to target directory.\n\n        Args:\n          submission_path: path in Google Cloud Storage of the submission file\n        \"\"\"\n        if os.path.exists(self.download_dir):\n            shutil.rmtree(self.download_dir)\n        os.makedirs(self.download_dir)\n        if os.path.exists(self.validate_dir):\n            shutil.rmtree(self.validate_dir)\n        os.makedirs(self.validate_dir)\n        logging.info(\n            \"\\n\" + (\"#\" * 80) + \"\\n# Processing submission: %s\\n\" + \"#\" * 80,\n            submission_path,\n        )\n        local_path = self.copy_submission_locally(submission_path)\n        metadata = self.base_validator.validate_submission(local_path)\n        if not metadata:\n            logging.error('Submission \"%s\" is INVALID', submission_path)\n            self.stats.add_failure()\n            return\n        submission_type = metadata[\"type\"]\n        container_name = metadata[\"container_gpu\"]\n        logging.info('Submission \"%s\" is VALID', submission_path)\n        self.list_of_containers.add(container_name)\n        self.stats.add_success(submission_type)\n        if self.do_copy:\n            submission_id = \"{0:04}\".format(self.cur_submission_idx)\n            self.cur_submission_idx += 1\n            self.copy_submission_to_destination(\n                submission_path, TYPE_TO_DIR[submission_type], submission_id\n            )\n            self.id_to_path_mapping[submission_id] = submission_path\n\n    def save_id_to_path_mapping(self):\n        \"\"\"Saves mapping from submission IDs to original filenames.\n\n        This mapping is saved as CSV file into target directory.\n        \"\"\"\n        if not self.id_to_path_mapping:\n            return\n        with open(self.local_id_to_path_mapping_file, \"w\") as f:\n            writer = csv.writer(f)\n            writer.writerow([\"id\", \"path\"])\n            for k, v in sorted(iteritems(self.id_to_path_mapping)):\n                writer.writerow([k, v])\n        cmd = [\n            \"gsutil\",\n            \"cp\",\n            self.local_id_to_path_mapping_file,\n            os.path.join(self.target_dir, \"id_to_path_mapping.csv\"),\n        ]\n        if subprocess.call(cmd) != 0:\n            logging.error(\"Can't copy id_to_path_mapping.csv to target directory\")\n\n    def run(self):\n        \"\"\"Runs validation of all submissions.\"\"\"\n        cmd = [\"gsutil\", \"ls\", os.path.join(self.source_dir, \"**\")]\n        try:\n            files_list = subprocess.check_output(cmd).split(\"\\n\")\n        except subprocess.CalledProcessError:\n            logging.error(\"Can\" \"t read source directory\")\n        all_submissions = [\n            s\n            for s in files_list\n            if s.endswith(\".zip\") or s.endswith(\".tar\") or s.endswith(\".tar.gz\")\n        ]\n        for submission_path in all_submissions:\n            self.validate_and_copy_one_submission(submission_path)\n        self.stats.log_stats()\n        self.save_id_to_path_mapping()\n        if self.containers_file:\n            with open(self.containers_file, \"w\") as f:\n                f.write(\"\\n\".join(sorted(self.list_of_containers)))\n\n\ndef main(args):\n    \"\"\"Validate all submissions and copy them into place\"\"\"\n    random.seed()\n    temp_dir = tempfile.mkdtemp()\n    logging.info(\"Created temporary directory: %s\", temp_dir)\n    validator = SubmissionValidator(\n        source_dir=args.source_dir,\n        target_dir=args.target_dir,\n        temp_dir=temp_dir,\n        do_copy=args.copy,\n        use_gpu=args.use_gpu,\n        containers_file=args.containers_file,\n    )\n    validator.run()\n    logging.info(\"Deleting temporary directory: %s\", temp_dir)\n    subprocess.call([\"rm\", \"-rf\", temp_dir])\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(description=\"Submission validation script.\")\n    parser.add_argument(\"--source_dir\", required=True, help=\"Source directory.\")\n    parser.add_argument(\"--target_dir\", required=True, help=\"Target directory.\")\n    parser.add_argument(\n        \"--log_file\", default=\"\", required=False, help=\"Location of the logfile.\"\n    )\n    parser.add_argument(\n        \"--containers_file\",\n        default=\"\",\n        required=False,\n        help=\"Local file with list of containers.\",\n    )\n    parser.add_argument(\"--copy\", dest=\"copy\", action=\"store_true\")\n    parser.add_argument(\"--nocopy\", dest=\"copy\", action=\"store_false\")\n    parser.set_defaults(copy=True)\n    parser.add_argument(\"--use_gpu\", dest=\"use_gpu\", action=\"store_true\")\n    parser.add_argument(\"--nouse_gpu\", dest=\"use_gpu\", action=\"store_false\")\n    parser.set_defaults(use_gpu=True)\n    command_line_args = parser.parse_args()\n    logging_args = {\n        \"format\": (\n            \"%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s\" \" -- %(message)s\"\n        ),\n        \"level\": logging.INFO,\n        \"datefmt\": \"%Y-%m-%d %H:%M:%S\",\n    }\n    if command_line_args.log_file:\n        logging_args[\"filename\"] = command_line_args.log_file\n        logging_args[\"filemode\"] = \"w\"\n    logging.basicConfig(**logging_args)\n    main(command_line_args)\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/nips17_adversarial_competition/eval_infra/validation_tool/validate_submission_lib.py",
    "content": "\"\"\"Helper library which performs validation of the submission.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom builtins import int\n\nimport csv\nimport json\nimport logging\nimport os\nimport re\nimport subprocess\nimport sys\n\nimport numpy as np\nfrom PIL import Image\n\nfrom six import iteritems\n\n\nEXTRACT_COMMAND = {\n    \".zip\": [\"unzip\", \"${src}\", \"-d\", \"${dst}\"],\n    \".tar\": [\"tar\", \"xvf\", \"${src}\", \"-C\", \"${dst}\"],\n    \".tar.gz\": [\"tar\", \"xvzf\", \"${src}\", \"-C\", \"${dst}\"],\n}\n\nALLOWED_SUBMISSION_TYPES = [\"attack\", \"targeted_attack\", \"defense\"]\n\nREQUIRED_METADATA_JSON_FIELDS = [\"entry_point\", \"container\", \"container_gpu\", \"type\"]\n\nCMD_VARIABLE_RE = re.compile(\"^\\\\$\\\\{(\\\\w+)\\\\}$\")\n\nBATCH_SIZE = 8\nIMAGE_NAME_PATTERN = \"IMG{0:04}.png\"\n\nALLOWED_EPS = [4, 8, 12, 16]\n\nMAX_SUBMISSION_SIZE_ZIPPED = 8 * 1024 * 1024 * 1024  # 8 GiB\nMAX_SUBMISSION_SIZE_UNPACKED = 16 * 1024 * 1024 * 1024  # 16 GiB\nMAX_DOCKER_IMAGE_SIZE = 8 * 1024 * 1024 * 1024  # 8 GiB\n\n\ndef get_extract_command_template(filename):\n    \"\"\"Returns extraction command based on the filename extension.\"\"\"\n    for k, v in iteritems(EXTRACT_COMMAND):\n        if filename.endswith(k):\n            return v\n    return None\n\n\ndef shell_call(command, **kwargs):\n    \"\"\"Calls shell command with parameter substitution.\n\n    Args:\n      command: command to run as a list of tokens\n      **kwargs: dirctionary with substitutions\n\n    Returns:\n      whether command was successful, i.e. returned 0 status code\n\n    Example of usage:\n      shell_call(['cp', '${A}', '${B}'], A='src_file', B='dst_file')\n    will call shell command:\n      cp src_file dst_file\n    \"\"\"\n    command = list(command)\n    for i in range(len(command)):\n        m = CMD_VARIABLE_RE.match(command[i])\n        if m:\n            var_id = m.group(1)\n            if var_id in kwargs:\n                command[i] = kwargs[var_id]\n    return subprocess.call(command) == 0\n\n\ndef make_directory_writable(dirname):\n    \"\"\"Makes directory readable and writable by everybody.\n\n    Args:\n      dirname: name of the directory\n\n    Returns:\n      True if operation was successfull\n\n    If you run something inside Docker container and it writes files, then\n    these files will be written as root user with restricted permissions.\n    So to be able to read/modify these files outside of Docker you have to change\n    permissions to be world readable and writable.\n    \"\"\"\n    retval = shell_call(\n        [\n            \"docker\",\n            \"run\",\n            \"-v\",\n            \"{0}:/output_dir\".format(dirname),\n            \"busybox:1.27.2\",\n            \"chmod\",\n            \"-R\",\n            \"a+rwx\",\n            \"/output_dir\",\n        ]\n    )\n    if not retval:\n        logging.error(\"Failed to change permissions on directory: %s\", dirname)\n    return retval\n\n\ndef load_defense_output(filename):\n    \"\"\"Loads output of defense from given file.\"\"\"\n    result = {}\n    with open(filename) as f:\n        for row in csv.reader(f):\n            try:\n                image_filename = row[0]\n                if not image_filename.endswith(\".png\"):\n                    image_filename += \".png\"\n                label = int(row[1])\n            except (IndexError, ValueError):\n                continue\n            result[image_filename] = label\n    return result\n\n\nclass SubmissionValidator(object):\n    \"\"\"Class which performs validation of the submission.\"\"\"\n\n    def __init__(self, temp_dir, use_gpu):\n        \"\"\"Initializes instance of SubmissionValidator.\n\n        Args:\n          temp_dir: temporary working directory\n          use_gpu: whether to use GPU\n        \"\"\"\n        self._temp_dir = temp_dir\n        self._use_gpu = use_gpu\n        self._tmp_extracted_dir = os.path.join(self._temp_dir, \"tmp_extracted\")\n        self._extracted_submission_dir = os.path.join(self._temp_dir, \"extracted\")\n        self._sample_input_dir = os.path.join(self._temp_dir, \"input\")\n        self._sample_output_dir = os.path.join(self._temp_dir, \"output\")\n\n    def _prepare_temp_dir(self):\n        \"\"\"Cleans up and prepare temporary directory.\"\"\"\n        if not shell_call([\"sudo\", \"rm\", \"-rf\", os.path.join(self._temp_dir, \"*\")]):\n            logging.error(\"Failed to cleanup temporary directory.\")\n            sys.exit(1)\n        # NOTE: we do not create self._extracted_submission_dir\n        # this is intentional because self._tmp_extracted_dir or it's subdir\n        # will be renames into self._extracted_submission_dir\n        os.mkdir(self._tmp_extracted_dir)\n        os.mkdir(self._sample_input_dir)\n        os.mkdir(self._sample_output_dir)\n        # make output dir world writable\n        shell_call([\"chmod\", \"a+rwX\", \"-R\", self._sample_output_dir])\n\n    def _extract_submission(self, filename):\n        \"\"\"Extracts submission and moves it into self._extracted_submission_dir.\"\"\"\n        # verify filesize\n        file_size = os.path.getsize(filename)\n        if file_size > MAX_SUBMISSION_SIZE_ZIPPED:\n            logging.error(\n                \"Submission archive size %d is exceeding limit %d\",\n                file_size,\n                MAX_SUBMISSION_SIZE_ZIPPED,\n            )\n            return False\n        # determime archive type\n        exctract_command_tmpl = get_extract_command_template(filename)\n        if not exctract_command_tmpl:\n            logging.error(\n                \"Input file has to be zip, tar or tar.gz archive; however \" \"found: %s\",\n                filename,\n            )\n            return False\n        # extract archive\n        submission_dir = os.path.dirname(filename)\n        submission_basename = os.path.basename(filename)\n        logging.info(\"Extracting archive %s\", filename)\n        retval = shell_call(\n            [\n                \"docker\",\n                \"run\",\n                \"--network=none\",\n                \"-v\",\n                \"{0}:/input_dir\".format(submission_dir),\n                \"-v\",\n                \"{0}:/output_dir\".format(self._tmp_extracted_dir),\n                \"busybox:1.27.2\",\n            ]\n            + exctract_command_tmpl,\n            src=os.path.join(\"/input_dir\", submission_basename),\n            dst=\"/output_dir\",\n        )\n        if not retval:\n            logging.error(\"Failed to extract submission from file %s\", filename)\n            return False\n        if not make_directory_writable(self._tmp_extracted_dir):\n            return False\n        # find submission root\n        root_dir = self._tmp_extracted_dir\n        root_dir_content = [d for d in os.listdir(root_dir) if d != \"__MACOSX\"]\n        if len(root_dir_content) == 1 and os.path.isdir(\n            os.path.join(root_dir, root_dir_content[0])\n        ):\n            logging.info(\n                'Looks like submission root is in subdirectory \"%s\" of ' \"the archive\",\n                root_dir_content[0],\n            )\n            root_dir = os.path.join(root_dir, root_dir_content[0])\n        # Move files to self._extracted_submission_dir.\n        # At this point self._extracted_submission_dir does not exist,\n        # so following command will simply rename root_dir into\n        # self._extracted_submission_dir\n        if not shell_call([\"mv\", root_dir, self._extracted_submission_dir]):\n            logging.error(\"Can\" \"t move submission files from root directory\")\n            return False\n        return True\n\n    def _verify_submission_size(self):\n        submission_size = 0\n        for dirname, _, filenames in os.walk(self._extracted_submission_dir):\n            for f in filenames:\n                submission_size += os.path.getsize(os.path.join(dirname, f))\n        logging.info(\"Unpacked submission size: %d\", submission_size)\n        if submission_size > MAX_SUBMISSION_SIZE_UNPACKED:\n            logging.error(\n                \"Submission size exceeding limit %d\", MAX_SUBMISSION_SIZE_UNPACKED\n            )\n        return submission_size <= MAX_SUBMISSION_SIZE_UNPACKED\n\n    def _load_and_verify_metadata(self):\n        \"\"\"Loads and verifies metadata.\n\n        Returns:\n          dictionaty with metadata or None if metadata not found or invalid\n        \"\"\"\n        metadata_filename = os.path.join(\n            self._extracted_submission_dir, \"metadata.json\"\n        )\n        if not os.path.isfile(metadata_filename):\n            logging.error(\"metadata.json not found\")\n            return None\n        try:\n            with open(metadata_filename, \"r\") as f:\n                metadata = json.load(f)\n        except IOError as e:\n            logging.error(\"Failed to load metadata: %s\", e)\n            return None\n        for field_name in REQUIRED_METADATA_JSON_FIELDS:\n            if field_name not in metadata:\n                logging.error(\"Field %s not found in metadata\", field_name)\n                return None\n        # Verify submission type\n        if metadata[\"type\"] not in ALLOWED_SUBMISSION_TYPES:\n            logging.error(\"Invalid submission type in metadata: %s\", metadata[\"type\"])\n            return None\n        # Check submission entry point\n        entry_point = metadata[\"entry_point\"]\n        if not os.path.isfile(\n            os.path.join(self._extracted_submission_dir, entry_point)\n        ):\n            logging.error(\"Entry point not found: %s\", entry_point)\n            return None\n        if not entry_point.endswith(\".sh\"):\n            logging.warning(\n                \"Entry point is not an .sh script. \"\n                \"This is not necessarily a problem, but if submission \"\n                \"won\"\n                \"t run double check entry point first: %s\",\n                entry_point,\n            )\n        # Metadata verified\n        return metadata\n\n    def _verify_docker_image_size(self, image_name):\n        \"\"\"Verifies size of Docker image.\n\n        Args:\n          image_name: name of the Docker image.\n\n        Returns:\n          True if image size is within the limits, False otherwise.\n        \"\"\"\n        shell_call([\"docker\", \"pull\", image_name])\n        try:\n            image_size = subprocess.check_output(\n                [\"docker\", \"inspect\", \"--format={{.Size}}\", image_name]\n            ).strip()\n            image_size = int(image_size)\n        except (ValueError, subprocess.CalledProcessError) as e:\n            logging.error(\"Failed to determine docker image size: %s\", e)\n            return False\n        logging.info(\"Size of docker image %s is %d\", image_name, image_size)\n        if image_size > MAX_DOCKER_IMAGE_SIZE:\n            logging.error(\"Image size exceeds limit %d\", MAX_DOCKER_IMAGE_SIZE)\n        return image_size <= MAX_DOCKER_IMAGE_SIZE\n\n    def _prepare_sample_data(self, submission_type):\n        \"\"\"Prepares sample data for the submission.\n\n        Args:\n          submission_type: type of the submission.\n        \"\"\"\n        # write images\n        images = np.random.randint(\n            0, 256, size=[BATCH_SIZE, 299, 299, 3], dtype=np.uint8\n        )\n        for i in range(BATCH_SIZE):\n            Image.fromarray(images[i, :, :, :]).save(\n                os.path.join(self._sample_input_dir, IMAGE_NAME_PATTERN.format(i))\n            )\n        # write target class for targeted attacks\n        if submission_type == \"targeted_attack\":\n            target_classes = np.random.randint(1, 1001, size=[BATCH_SIZE])\n            target_class_filename = os.path.join(\n                self._sample_input_dir, \"target_class.csv\"\n            )\n            with open(target_class_filename, \"w\") as f:\n                for i in range(BATCH_SIZE):\n                    f.write(\n                        (IMAGE_NAME_PATTERN + \",{1}\\n\").format(i, target_classes[i])\n                    )\n\n    def _run_submission(self, metadata):\n        \"\"\"Runs submission inside Docker container.\n\n        Args:\n          metadata: dictionary with submission metadata\n\n        Returns:\n          True if status code of Docker command was success (i.e. zero),\n          False otherwise.\n        \"\"\"\n        container_name = (\n            metadata[\"container_gpu\"] if self._use_gpu else metadata[\"container\"]\n        )\n        if metadata[\"type\"] == \"defense\":\n            cmd = [\n                \"--network=none\",\n                \"-m=24g\",\n                \"-v\",\n                \"{0}:/input_images:ro\".format(self._sample_input_dir),\n                \"-v\",\n                \"{0}:/output_data\".format(self._sample_output_dir),\n                \"-v\",\n                \"{0}:/code\".format(self._extracted_submission_dir),\n                \"-w\",\n                \"/code\",\n                container_name,\n                \"./\" + metadata[\"entry_point\"],\n                \"/input_images\",\n                \"/output_data/result.csv\",\n            ]\n        else:\n            epsilon = np.random.choice(ALLOWED_EPS)\n            cmd = [\n                \"--network=none\",\n                \"-m=24g\",\n                \"-v\",\n                \"{0}:/input_images:ro\".format(self._sample_input_dir),\n                \"-v\",\n                \"{0}:/output_images\".format(self._sample_output_dir),\n                \"-v\",\n                \"{0}:/code\".format(self._extracted_submission_dir),\n                \"-w\",\n                \"/code\",\n                container_name,\n                \"./\" + metadata[\"entry_point\"],\n                \"/input_images\",\n                \"/output_images\",\n                str(epsilon),\n            ]\n        if self._use_gpu:\n            cmd = [\"docker\", \"run\", \"--runtime=nvidia\"] + cmd\n        else:\n            cmd = [\"docker\", \"run\"] + cmd\n        logging.info(\"Command to run submission: %s\", \" \".join(cmd))\n        result = shell_call(cmd)\n        make_directory_writable(self._extracted_submission_dir)\n        make_directory_writable(self._sample_output_dir)\n        return result\n\n    def _verify_output(self, submission_type):\n        \"\"\"Verifies correctness of the submission output.\n\n        Args:\n          submission_type: type of the submission\n\n        Returns:\n          True if output looks valid\n        \"\"\"\n        result = True\n        if submission_type == \"defense\":\n            try:\n                image_classification = load_defense_output(\n                    os.path.join(self._sample_output_dir, \"result.csv\")\n                )\n                expected_keys = [\n                    IMAGE_NAME_PATTERN.format(i) for i in range(BATCH_SIZE)\n                ]\n                if set(image_classification.keys()) != set(expected_keys):\n                    logging.error(\"Classification results are not saved for all images\")\n                    result = False\n            except IOError as e:\n                logging.error(\"Failed to read defense output file: %s\", e)\n                result = False\n        else:\n            for i in range(BATCH_SIZE):\n                image_filename = os.path.join(\n                    self._sample_output_dir, IMAGE_NAME_PATTERN.format(i)\n                )\n                try:\n                    img = np.array(Image.open(image_filename).convert(\"RGB\"))\n                    if list(img.shape) != [299, 299, 3]:\n                        logging.error(\n                            \"Invalid image size %s for image %s\",\n                            str(img.shape),\n                            image_filename,\n                        )\n                        result = False\n                except IOError as e:\n                    result = False\n        return result\n\n    def validate_submission(self, filename):\n        \"\"\"Validates submission.\n\n        Args:\n          filename: submission filename\n\n        Returns:\n          submission metadata or None if submission is invalid\n        \"\"\"\n        self._prepare_temp_dir()\n        # Convert filename to be absolute path, relative path might cause problems\n        # with mounting directory in Docker\n        filename = os.path.abspath(filename)\n        # extract submission\n        if not self._extract_submission(filename):\n            return None\n        # verify submission size\n        if not self._verify_submission_size():\n            return None\n        # Load metadata\n        metadata = self._load_and_verify_metadata()\n        if not metadata:\n            return None\n        submission_type = metadata[\"type\"]\n        # verify docker container size\n        if not self._verify_docker_image_size(metadata[\"container_gpu\"]):\n            return None\n        # Try to run submission on sample data\n        self._prepare_sample_data(submission_type)\n        if not self._run_submission(metadata):\n            logging.error(\"Failure while running submission\")\n            return None\n        if not self._verify_output(submission_type):\n            logging.warning(\n                \"Some of the outputs of your submission are invalid or \"\n                \"missing. You submission still will be evaluation \"\n                \"but you might get lower score.\"\n            )\n        return metadata\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/robust_vision_benchmark/README.md",
    "content": "## CleverHans Example Submission to the Robust Vision Benchmark\n\nUsing the wrappers in this repository, submitting a CleverHans attack to the [Robust Vision Benchmark](https://robust.vision/benchmark) requires just [a few lines of code](cleverhans_attack_example/main.py). The full example can be found in the `cleverhans_attack_example` folder.\n\n### Testing an attack\n\nJust install the latest version of the [robust-vision-benchmark python package](https://github.com/bethgelab/robust-vision-benchmark) using\n\n```bash\npip install --upgrade robust-vision-benchmark\n```\n\nand run\n\n```bash\nrvb-test-attack cleverhans_attack_example/\n```\n\nto test the attack. Once the test succeeds, you can **[submit your attack](https://github.com/bethgelab/robust-vision-benchmark)**.\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/robust_vision_benchmark/cleverhans_attack_example/Dockerfile",
    "content": "FROM python:3.6\n\n# set workdir to the home directory\nWORKDIR /root\n\n# install required packages\nRUN pip3 install --no-cache-dir foolbox\nRUN pip3 install --no-cache-dir robust_vision_benchmark\nRUN pip3 install --no-cache-dir -e git+http://github.com/tensorflow/cleverhans.git#egg=cleverhans\nRUN pip3 install tensorflow\n\n# add your model script\nCOPY main.py main.py\nCOPY utils.py utils.py\n\nCMD [\"python3\", \"./main.py\"]\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/robust_vision_benchmark/cleverhans_attack_example/main.py",
    "content": "#!/usr/bin/env python3\n\nimport numpy as np\nfrom cleverhans.attacks import FastGradientMethod\nfrom robust_vision_benchmark import attack_server\nfrom utils import cleverhans_attack_wrapper\n\n\ndef attack(model, session, a):\n    fgsm = FastGradientMethod(model, sess=session)\n    image = a.original_image[np.newaxis]\n    return fgsm.generate_np(image)\n\n\nattack_server(cleverhans_attack_wrapper(attack))\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/robust_vision_benchmark/cleverhans_attack_example/requirements.txt",
    "content": "numpy\ntensorflow\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/robust_vision_benchmark/cleverhans_attack_example/utils.py",
    "content": "import cleverhans.model\nimport tensorflow as tf\nimport numpy as np\n\n\ndef cleverhans_attack_wrapper(cleverhans_attack_fn, reset=True):\n    def attack(a):\n        session = tf.Session()\n        with session.as_default():\n            model = RVBCleverhansModel(a)\n            adversarial_image = cleverhans_attack_fn(model, session, a)\n            adversarial_image = np.squeeze(adversarial_image, axis=0)\n            if reset:\n                # optionally, reset to ignore other adversarials\n                # found during the search\n                a._reset()\n            # run predictions to make sure the returned adversarial\n            # is taken into account\n            min_, max_ = a.bounds()\n            adversarial_image = np.clip(adversarial_image, min_, max_)\n            a.predictions(adversarial_image)\n\n    return attack\n\n\ndef py_func_grad(func, inp, Tout, stateful=True, name=None, grad=None):\n    \"\"\"Custom py_func with gradient support\"\"\"\n    # Need to generate a unique name to avoid duplicates:\n    rnd_name = \"PyFuncGrad\" + str(np.random.randint(0, 1e8))\n\n    tf.RegisterGradient(rnd_name)(grad)\n    g = tf.get_default_graph()\n    with g.gradient_override_map({\"PyFunc\": rnd_name, \"PyFuncStateless\": rnd_name}):\n        return tf.py_func(func, inp, Tout, stateful=stateful, name=name)\n\n\nclass RVBCleverhansModel(cleverhans.model.Model):\n    \"\"\"This is a cleverhans model that wraps a robust vision benchmark model.\"\"\"\n\n    def __init__(self, adversarial, **kwargs):\n        del kwargs\n        cleverhans.model.Model.__init__(\n            self, \"model\", self.adversarial.nb_classes(), locals()\n        )\n        self.adversarial = adversarial\n\n    def fprop(self, x):\n        return {self.O_LOGITS: self._logits_op(x)}\n\n    def _logits_op(self, x, name=None):\n        with tf.name_scope(name, \"logits\", [x]) as name:\n\n            nb_classes = self.adversarial.nb_classes()\n\n            def _backward_py(gradient_y, x):\n                x = np.squeeze(x, axis=0)\n                gradient_y = np.squeeze(gradient_y, axis=0)\n                gradient_x = self.adversarial.backward(gradient_y, x)\n                gradient_x = gradient_x.astype(np.float32)\n                return gradient_x[np.newaxis]\n\n            def _backward_tf(op, grad):\n                images = op.inputs[0]\n                gradient_x = tf.py_func(_backward_py, [grad, images], tf.float32)\n                gradient_x.set_shape(images.shape)\n                return gradient_x\n\n            def _forward_py(x):\n                predictions = self.adversarial.batch_predictions(x, strict=False)[0]\n                predictions = predictions.astype(np.float32)\n                return predictions\n\n            op = py_func_grad(\n                _forward_py, [x], [tf.float32], name=name, grad=_backward_tf\n            )\n\n            logits = op[0]\n            logits.set_shape((x.shape[0], nb_classes))\n\n        return logits\n"
  },
  {
    "path": "cleverhans_v3.1.0/examples/test_imagenet_attacks.py",
    "content": "\"\"\"Test attack success against ImageNet models for a few images.\n\nMany of the tests require using flags to specify a pre-trained ImageNet model,\nas well as image data. The easiest way to provide these is using the data from\ncleverhans/examples/nips17_adversarial_competition, and then the default flag\nvalues will just work.\n\nSetup: see SETUP_INSTRUCTIONS\n\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport csv\nimport os\nimport unittest\n\nimport numpy as np\nfrom six.moves import xrange\nimport tensorflow as tf\nfrom tensorflow.contrib import slim\n\n# The following line is affected by a pylint bug when using python3 and tf 1.12\nfrom tensorflow.contrib.slim.nets import inception  # pylint: disable=no-name-in-module\nfrom PIL import Image\nfrom cleverhans.attacks import SPSA\nfrom cleverhans.devtools.checks import CleverHansTest\nfrom cleverhans.model import Model\nfrom cleverhans.utils import CLEVERHANS_ROOT\n\nSETUP_INSTRUCTIONS = \"\"\"\n$ ./examples/nips17_adversarial_competition/dev_toolkit/download_data.sh\n\"\"\"\n\nDEFAULT_INCEPTION_PATH = os.path.join(\n    CLEVERHANS_ROOT,\n    (\n        \"examples/nips17_adversarial_competition/dev_toolkit/sample_attacks/fgsm/\"\n        \"inception_v3.ckpt\"\n    ),\n)\n\ntf.flags.DEFINE_string(\"master\", \"\", \"The address of the TensorFlow master to use.\")\n\ntf.flags.DEFINE_string(\n    \"checkpoint_path\",\n    DEFAULT_INCEPTION_PATH,\n    \"Path to checkpoint for inception network.\",\n)\n\ntf.flags.DEFINE_string(\n    \"input_image_dir\",\n    os.path.join(\n        CLEVERHANS_ROOT, \"examples/nips17_adversarial_competition/dataset/images\"\n    ),\n    \"Path to image directory.\",\n)\n\ntf.flags.DEFINE_string(\n    \"metadata_file_path\",\n    os.path.join(\n        CLEVERHANS_ROOT,\n        \"examples/nips17_adversarial_competition/dataset/dev_dataset.csv\",\n    ),\n    \"Path to metadata file.\",\n)\n\nFLAGS = tf.flags.FLAGS\n\n\ndef load_images(input_dir, metadata_file_path, batch_shape):\n    \"\"\"Retrieve numpy arrays of images and labels, read from a directory.\"\"\"\n    num_images = batch_shape[0]\n    with open(metadata_file_path) as input_file:\n        reader = csv.reader(input_file)\n        header_row = next(reader)\n        rows = list(reader)\n\n    row_idx_image_id = header_row.index(\"ImageId\")\n    row_idx_true_label = header_row.index(\"TrueLabel\")\n    images = np.zeros(batch_shape)\n    labels = np.zeros(num_images, dtype=np.int32)\n    for idx in xrange(num_images):\n        row = rows[idx]\n        filepath = os.path.join(input_dir, row[row_idx_image_id] + \".png\")\n\n        with tf.gfile.Open(filepath, \"rb\") as f:\n            image = np.array(Image.open(f).convert(\"RGB\")).astype(np.float) / 255.0\n        images[idx, :, :, :] = image\n        labels[idx] = int(row[row_idx_true_label])\n    return images, labels\n\n\nclass InceptionModel(Model):\n    \"\"\"Model class for CleverHans library.\"\"\"\n\n    def __init__(self, nb_classes):\n        super(InceptionModel, self).__init__(\n            nb_classes=nb_classes, needs_dummy_fprop=True\n        )\n        self.built = False\n\n    def __call__(self, x_input, return_logits=False):\n        \"\"\"Constructs model and return probabilities for given input.\"\"\"\n        reuse = True if self.built else None\n        with slim.arg_scope(inception.inception_v3_arg_scope()):\n            # Inception preprocessing uses [-1, 1]-scaled input.\n            x_input = x_input * 2.0 - 1.0\n            _, end_points = inception.inception_v3(\n                x_input, num_classes=self.nb_classes, is_training=False, reuse=reuse\n            )\n        self.built = True\n        self.logits = end_points[\"Logits\"]\n        # Strip off the extra reshape op at the output\n        self.probs = end_points[\"Predictions\"].op.inputs[0]\n        if return_logits:\n            return self.logits\n        else:\n            return self.probs\n\n    def get_logits(self, x_input):\n        return self(x_input, return_logits=True)\n\n    def get_probs(self, x_input):\n        return self(x_input)\n\n\ndef _top_1_accuracy(logits, labels):\n    return tf.reduce_mean(tf.cast(tf.nn.in_top_k(logits, labels, 1), tf.float32))\n\n\nclass TestInception(CleverHansTest):\n    def test_clean_accuracy(self):\n        \"\"\"Check model is accurate on unperturbed images.\"\"\"\n        input_dir = FLAGS.input_image_dir\n        metadata_file_path = FLAGS.metadata_file_path\n        num_images = 16\n        batch_shape = (num_images, 299, 299, 3)\n        images, labels = load_images(input_dir, metadata_file_path, batch_shape)\n        nb_classes = 1001\n\n        tf.logging.set_verbosity(tf.logging.INFO)\n        with tf.Graph().as_default():\n            # Prepare graph\n            x_input = tf.placeholder(tf.float32, shape=batch_shape)\n            y_label = tf.placeholder(tf.int32, shape=(num_images,))\n            model = InceptionModel(nb_classes)\n            logits = model.get_logits(x_input)\n            acc = _top_1_accuracy(logits, y_label)\n\n            # Run computation\n            saver = tf.train.Saver(slim.get_model_variables())\n\n            session_creator = tf.train.ChiefSessionCreator(\n                scaffold=tf.train.Scaffold(saver=saver),\n                checkpoint_filename_with_path=FLAGS.checkpoint_path,\n                master=FLAGS.master,\n            )\n\n            with tf.train.MonitoredSession(session_creator=session_creator) as sess:\n                acc_val = sess.run(acc, feed_dict={x_input: images, y_label: labels})\n                tf.logging.info(\"Accuracy: %s\", acc_val)\n                assert acc_val > 0.8\n\n\nclass TestSPSA(CleverHansTest):\n    def test_attack_bounds(self):\n        \"\"\"Check SPSA respects perturbation limits.\"\"\"\n        epsilon = 4.0 / 255\n        input_dir = FLAGS.input_image_dir\n        metadata_file_path = FLAGS.metadata_file_path\n        num_images = 8\n        batch_shape = (num_images, 299, 299, 3)\n        images, labels = load_images(input_dir, metadata_file_path, batch_shape)\n        nb_classes = 1001\n\n        tf.logging.set_verbosity(tf.logging.INFO)\n        with tf.Graph().as_default():\n            # Prepare graph\n            x_input = tf.placeholder(tf.float32, shape=(1,) + batch_shape[1:])\n            y_label = tf.placeholder(tf.int32, shape=(1,))\n            model = InceptionModel(nb_classes)\n\n            attack = SPSA(model)\n            x_adv = attack.generate(\n                x_input,\n                y=y_label,\n                epsilon=epsilon,\n                num_steps=10,\n                early_stop_loss_threshold=-1.0,\n                spsa_samples=32,\n                spsa_iters=1,\n                is_debug=True,\n            )\n\n            # Run computation\n            saver = tf.train.Saver(slim.get_model_variables())\n            session_creator = tf.train.ChiefSessionCreator(\n                scaffold=tf.train.Scaffold(saver=saver),\n                checkpoint_filename_with_path=FLAGS.checkpoint_path,\n                master=FLAGS.master,\n            )\n\n            with tf.train.MonitoredSession(session_creator=session_creator) as sess:\n                for i in xrange(num_images):\n                    x_expanded = np.expand_dims(images[i], axis=0)\n                    y_expanded = np.expand_dims(labels[i], axis=0)\n\n                    adv_image = sess.run(\n                        x_adv, feed_dict={x_input: x_expanded, y_label: y_expanded}\n                    )\n                    diff = adv_image - images[i]\n                    assert np.max(np.abs(diff)) < epsilon + 1e-4\n                    assert np.max(adv_image < 1.0 + 1e-4)\n                    assert np.min(adv_image > -1e-4)\n\n    def test_attack_success(self):\n        \"\"\"Check SPSA creates misclassified images.\"\"\"\n        epsilon = 4.0 / 255\n        input_dir = FLAGS.input_image_dir\n        metadata_file_path = FLAGS.metadata_file_path\n        num_images = 8\n        batch_shape = (num_images, 299, 299, 3)\n        images, labels = load_images(input_dir, metadata_file_path, batch_shape)\n        nb_classes = 1001\n\n        tf.logging.set_verbosity(tf.logging.INFO)\n        with tf.Graph().as_default():\n            # Prepare graph\n            x_input = tf.placeholder(tf.float32, shape=(1,) + batch_shape[1:])\n            y_label = tf.placeholder(tf.int32, shape=(1,))\n            model = InceptionModel(nb_classes)\n\n            attack = SPSA(model)\n            x_adv = attack.generate(\n                x_input,\n                y=y_label,\n                epsilon=epsilon,\n                num_steps=30,\n                early_stop_loss_threshold=-1.0,\n                spsa_samples=32,\n                spsa_iters=16,\n                is_debug=True,\n            )\n\n            logits = model.get_logits(x_adv)\n            acc = _top_1_accuracy(logits, y_label)\n\n            # Run computation\n            saver = tf.train.Saver(slim.get_model_variables())\n            session_creator = tf.train.ChiefSessionCreator(\n                scaffold=tf.train.Scaffold(saver=saver),\n                checkpoint_filename_with_path=FLAGS.checkpoint_path,\n                master=FLAGS.master,\n            )\n\n            num_correct = 0.0\n            with tf.train.MonitoredSession(session_creator=session_creator) as sess:\n                for i in xrange(num_images):\n                    feed_dict_i = {\n                        x_input: np.expand_dims(images[i], axis=0),\n                        y_label: np.expand_dims(labels[i], axis=0),\n                    }\n                    acc_val = sess.run(acc, feed_dict=feed_dict_i)\n                    tf.logging.info(\"Accuracy: %s\", acc_val)\n                    num_correct += acc_val\n                assert (num_correct / num_images) < 0.1\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/scripts/compute_accuracy.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\ncompute_accuracy.py\nUsage:\n  compute_accuracy.py model.joblib\n\n  where model.joblib is a file created by cleverhans.serial.save containing\n  a picklable cleverhans.model.Model instance.\n\nThis script will run the model on a variety of types of data and print out\nthe accuracy for each data type.\n  clean : Clean data\n  semantic : Semantic adversarial examples\n  pgd: PGD adversarial examples\n\nThis script works by running a single attack on each example.\nThis is useful for quick evaluation during development, but for final\npublication it would be better to use attack bundling.\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\nimport time\n\nimport tensorflow as tf\n\nfrom cleverhans.attacks import ProjectedGradientDescent, Semantic\nfrom cleverhans.compat import flags\nfrom cleverhans.evaluation import accuracy\nfrom cleverhans.serial import load\nfrom cleverhans.utils import set_log_level\nfrom cleverhans.utils_tf import infer_devices\nfrom cleverhans.utils_tf import silence\n\nsilence()\ndevices = infer_devices()\nnum_devices = len(devices)\nBATCH_SIZE = 128\nTRAIN_START = 0\nTRAIN_END = 60000\nTEST_START = 0\nTEST_END = 10000\nWHICH_SET = \"test\"\nNB_ITER = 40\nBASE_EPS_ITER = None  # Differs by dataset\n\n\nFLAGS = flags.FLAGS\n\n\ndef print_accuracies(\n    filepath,\n    train_start=TRAIN_START,\n    train_end=TRAIN_END,\n    test_start=TEST_START,\n    test_end=TEST_END,\n    batch_size=BATCH_SIZE,\n    which_set=WHICH_SET,\n    base_eps_iter=BASE_EPS_ITER,\n    nb_iter=NB_ITER,\n):\n    \"\"\"\n    Load a saved model and print out its accuracy on different data distributions\n\n    This function works by running a single attack on each example.\n    This provides a reasonable estimate of the true failure rate quickly, so\n    long as the model does not suffer from gradient masking.\n    However, this estimate is mostly intended for development work and not\n    for publication. A more accurate estimate may be obtained by running\n    an attack bundler instead.\n\n    :param filepath: path to model to evaluate\n    :param train_start: index of first training set example to use\n    :param train_end: index of last training set example to use\n    :param test_start: index of first test set example to use\n    :param test_end: index of last test set example to use\n    :param batch_size: size of evaluation batches\n    :param which_set: 'train' or 'test'\n    :param base_eps_iter: step size if the data were in [0,1]\n      (Step size will be rescaled proportional to the actual data range)\n    :param nb_iter: Number of iterations of PGD to run per class\n    \"\"\"\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(20181014)\n    set_log_level(logging.INFO)\n    sess = tf.Session()\n\n    with sess.as_default():\n        model = load(filepath)\n    assert len(model.get_params()) > 0\n    factory = model.dataset_factory\n    factory.kwargs[\"train_start\"] = train_start\n    factory.kwargs[\"train_end\"] = train_end\n    factory.kwargs[\"test_start\"] = test_start\n    factory.kwargs[\"test_end\"] = test_end\n    dataset = factory()\n\n    x_data, y_data = dataset.get_set(which_set)\n\n    impl(sess, model, dataset, factory, x_data, y_data, base_eps_iter, nb_iter)\n\n\ndef impl(\n    sess,\n    model,\n    dataset,\n    factory,\n    x_data,\n    y_data,\n    base_eps_iter=BASE_EPS_ITER,\n    nb_iter=NB_ITER,\n    batch_size=BATCH_SIZE,\n):\n    \"\"\"\n    The actual implementation of the evaluation.\n    :param sess: tf.Session\n    :param model: cleverhans.model.Model\n    :param dataset: cleverhans.dataset.Dataset\n    :param factory: the dataset factory corresponding to `dataset`\n    :param x_data: numpy array of input examples\n    :param y_data: numpy array of class labels\n    :param base_eps_iter: step size for PGD if data were in [0, 1]\n    :param nb_iter: number of PGD iterations\n    :returns: dict mapping string adversarial example names to accuracies\n    \"\"\"\n\n    center = dataset.kwargs[\"center\"]\n    max_val = dataset.kwargs[\"max_val\"]\n    value_range = max_val * (1.0 + center)\n    min_value = 0.0 - center * max_val\n\n    if \"CIFAR\" in str(factory.cls):\n        base_eps = 8.0 / 255.0\n        if base_eps_iter is None:\n            base_eps_iter = 2.0 / 255.0\n    elif \"MNIST\" in str(factory.cls):\n        base_eps = 0.3\n        if base_eps_iter is None:\n            base_eps_iter = 0.1\n    else:\n        raise NotImplementedError(str(factory.cls))\n\n    pgd_params = {\n        \"eps\": base_eps * value_range,\n        \"eps_iter\": base_eps_iter * value_range,\n        \"nb_iter\": nb_iter,\n        \"clip_min\": min_value,\n        \"clip_max\": max_val,\n    }\n\n    semantic = Semantic(model, center, max_val, sess)\n    pgd = ProjectedGradientDescent(model, sess=sess)\n\n    jobs = [\n        (\"clean\", None, None, None),\n        (\"Semantic\", semantic, None, None),\n        (\"pgd\", pgd, pgd_params, None),\n    ]\n\n    out = {}\n\n    for job in jobs:\n        name, attack, attack_params, job_batch_size = job\n        if job_batch_size is None:\n            job_batch_size = batch_size\n        t1 = time.time()\n        acc = accuracy(\n            sess,\n            model,\n            x_data,\n            y_data,\n            batch_size=job_batch_size,\n            devices=devices,\n            attack=attack,\n            attack_params=attack_params,\n        )\n        t2 = time.time()\n        out[name] = acc\n        print(\"Accuracy on \" + name + \" examples: \", acc)\n        print(\"Evaluation took\", t2 - t1, \"seconds\")\n\n    return out\n\n\ndef main(argv=None):\n    \"\"\"\n    Print accuracies\n    \"\"\"\n    try:\n        _name_of_script, filepath = argv\n    except ValueError:\n        raise ValueError(argv)\n    print_accuracies(\n        filepath=filepath,\n        test_start=FLAGS.test_start,\n        test_end=FLAGS.test_end,\n        which_set=FLAGS.which_set,\n        nb_iter=FLAGS.nb_iter,\n        base_eps_iter=FLAGS.base_eps_iter,\n        batch_size=FLAGS.batch_size,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\n        \"train_start\",\n        TRAIN_START,\n        \"Starting point (inclusive)\" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"train_end\",\n        TRAIN_END,\n        \"Ending point (non-inclusive) \" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_start\",\n        TEST_START,\n        \"Starting point (inclusive) \" \"of range of test examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_end\",\n        TEST_END,\n        \"End point (non-inclusive) of \" \"range of test examples to use\",\n    )\n    flags.DEFINE_integer(\"nb_iter\", NB_ITER, \"Number of iterations of PGD\")\n    flags.DEFINE_string(\"which_set\", WHICH_SET, '\"train\" or \"test\"')\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Batch size for most jobs\")\n    flags.DEFINE_float(\n        \"base_eps_iter\", BASE_EPS_ITER, \"epsilon per iteration, if data were in [0, 1]\"\n    )\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/scripts/make_confidence_report.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nmake_confidence_report.py\nUsage:\n  python make_confidence_report.py model.joblib\n\n  where model.joblib is a file created by cleverhans.serial.save containing\n  a picklable cleverhans.model.Model instance.\n\nThis script will run the model on a variety of types of data and save an\ninstance of cleverhans.confidence_report.ConfidenceReport to\nmodel_report.joblib.\nThe report can be later loaded by another script using cleverhans.serial.load.\nThis script puts the following entries in the report:\n  clean : Clean data\n  semantic : Semantic adversarial examples\n  mc: MaxConfidence adversarial examples\n\nThis script works by running a single MaxConfidence attack on each example.\n( https://openreview.net/forum?id=H1g0piA9tQ )\nThis provides a reasonable estimate of the true failure rate quickly, so\nlong as the model does not suffer from gradient masking.\nHowever, this estimate is mostly intended for development work and not\nfor publication. A more accurate estimate may be obtained by running\nmake_confidence_report_bundled.py instead.\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport tensorflow as tf\n\nfrom cleverhans.utils_tf import silence\n\nsilence()\n# silence call must precede this imports. pylint doesn't like that\n# pylint: disable=C0413\nfrom cleverhans.compat import flags\nfrom cleverhans.confidence_report import make_confidence_report\nfrom cleverhans.confidence_report import BATCH_SIZE\nfrom cleverhans.confidence_report import MC_BATCH_SIZE\nfrom cleverhans.confidence_report import TRAIN_START\nfrom cleverhans.confidence_report import TRAIN_END\nfrom cleverhans.confidence_report import TEST_START\nfrom cleverhans.confidence_report import TEST_END\nfrom cleverhans.confidence_report import WHICH_SET\nfrom cleverhans.confidence_report import NB_ITER\nfrom cleverhans.confidence_report import BASE_EPS_ITER\nfrom cleverhans.confidence_report import REPORT_PATH\nfrom cleverhans.confidence_report import SAVE_ADVX\n\n\nFLAGS = flags.FLAGS\n\n\ndef main(argv=None):\n    \"\"\"\n    Make a confidence report and save it to disk.\n    \"\"\"\n    try:\n        _name_of_script, filepath = argv\n    except ValueError:\n        raise ValueError(argv)\n    make_confidence_report(\n        filepath=filepath,\n        test_start=FLAGS.test_start,\n        test_end=FLAGS.test_end,\n        which_set=FLAGS.which_set,\n        report_path=FLAGS.report_path,\n        mc_batch_size=FLAGS.mc_batch_size,\n        nb_iter=FLAGS.nb_iter,\n        base_eps_iter=FLAGS.base_eps_iter,\n        batch_size=FLAGS.batch_size,\n        save_advx=FLAGS.save_advx,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\n        \"train_start\",\n        TRAIN_START,\n        \"Starting point (inclusive)\" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"train_end\",\n        TRAIN_END,\n        \"Ending point (non-inclusive) \" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_start\",\n        TEST_START,\n        \"Starting point (inclusive) \" \"of range of test examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_end\",\n        TEST_END,\n        \"End point (non-inclusive) of \" \"range of test examples to use\",\n    )\n    flags.DEFINE_integer(\"nb_iter\", NB_ITER, \"Number of iterations of PGD\")\n    flags.DEFINE_string(\"which_set\", WHICH_SET, '\"train\" or \"test\"')\n    flags.DEFINE_string(\"report_path\", REPORT_PATH, \"Path to save to\")\n    flags.DEFINE_integer(\"mc_batch_size\", MC_BATCH_SIZE, \"Batch size for MaxConfidence\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Batch size for most jobs\")\n    flags.DEFINE_float(\n        \"base_eps_iter\", BASE_EPS_ITER, \"epsilon per iteration, if data were in [0, 1]\"\n    )\n    flags.DEFINE_integer(\n        \"save_advx\",\n        SAVE_ADVX,\n        \"If True, saves the adversarial examples to the \" \"filesystem.\",\n    )\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/scripts/make_confidence_report_bundle_examples.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nmake_confidence_report_bundle_examples.py\nUsage:\n  make_confidence_report_bundle_examples.py model.joblib a.npy\n  make_confidence_report_bundle_examples.py model.joblib a.npy b.npy c.npy\n\n  where model.joblib is a file created by cleverhans.serial.save containing\n  a picklable cleverhans.model.Model instance and each examples_i.npy is\n  a saved numpy array containing adversarial examples for a whole dataset.\n  Usually example_i.npy is the output of make_confidence_report.py or\n  make_confidence_report_bundled.py.\n\nThis script uses max-confidence attack bundling\n( https://openreview.net/forum?id=H1g0piA9tQ )\nto combine adversarial example datasets that were created earlier.\nIt will save a ConfidenceReport to to model_bundled_examples_report.joblib.\nThe report can be later loaded by another\nscript using cleverhans.serial.load.\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport warnings\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.utils_tf import silence\n\n# We need to disable pylint's complaints about import order because `silence`\n# works only if it is called before the other imports.\n# pylint: disable=C0413\nsilence()\nfrom cleverhans.attack_bundling import bundle_examples_with_goal, MaxConfidence\nfrom cleverhans import serial\nfrom cleverhans.compat import flags\nfrom cleverhans.confidence_report import BATCH_SIZE\nfrom cleverhans.confidence_report import TRAIN_START, TRAIN_END\nfrom cleverhans.confidence_report import TEST_START, TEST_END\nfrom cleverhans.confidence_report import WHICH_SET\n\n\nFLAGS = flags.FLAGS\n\n\ndef main(argv=None):\n    \"\"\"\n    Make a confidence report and save it to disk.\n    \"\"\"\n    assert len(argv) >= 3\n    _name_of_script = argv[0]\n    model_filepath = argv[1]\n    adv_x_filepaths = argv[2:]\n\n    sess = tf.Session()\n    with sess.as_default():\n        model = serial.load(model_filepath)\n\n    factory = model.dataset_factory\n    factory.kwargs[\"train_start\"] = FLAGS.train_start\n    factory.kwargs[\"train_end\"] = FLAGS.train_end\n    factory.kwargs[\"test_start\"] = FLAGS.test_start\n    factory.kwargs[\"test_end\"] = FLAGS.test_end\n    dataset = factory()\n\n    adv_x_list = [np.load(filepath) for filepath in adv_x_filepaths]\n    x, y = dataset.get_set(FLAGS.which_set)\n    for adv_x in adv_x_list:\n        assert adv_x.shape == x.shape, (adv_x.shape, x.shape)\n        # Make sure these were made for the right dataset with right scaling\n        # arguments, etc.\n        assert adv_x.min() >= 0.0 - dataset.kwargs[\"center\"] * dataset.max_val\n        assert adv_x.max() <= dataset.max_val\n        data_range = dataset.max_val * (1.0 + dataset.kwargs[\"center\"])\n\n        if adv_x.max() - adv_x.min() <= 0.8 * data_range:\n            warnings.warn(\n                \"Something is weird. Your adversarial examples use \"\n                \"less than 80% of the data range.\"\n                \"This might mean you generated them for a model with \"\n                \"inputs in [0, 1] and are now using them for a model \"\n                \"with inputs in [0, 255] or something like that. \"\n                \"Or it could be OK if you're evaluating on a very small \"\n                \"batch.\"\n            )\n\n    report_path = FLAGS.report_path\n    if report_path is None:\n        suffix = \"_bundled_examples_report.joblib\"\n        assert model_filepath.endswith(\".joblib\")\n        report_path = model_filepath[: -len(\".joblib\")] + suffix\n\n    goal = MaxConfidence()\n    bundle_examples_with_goal(\n        sess, model, adv_x_list, y, goal, report_path, batch_size=FLAGS.batch_size\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_string(\"report_path\", None, \"Report path\")\n    flags.DEFINE_integer(\n        \"train_start\",\n        TRAIN_START,\n        \"Starting point (inclusive)\" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"train_end\",\n        TRAIN_END,\n        \"Ending point (non-inclusive) \" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_start\",\n        TEST_START,\n        \"Starting point \" \"(inclusive) of range of test examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_end\",\n        TEST_END,\n        \"End point (non-inclusive) of \" \"range of test examples to use\",\n    )\n    flags.DEFINE_string(\"which_set\", WHICH_SET, '\"train\" or \"test\"')\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"batch size\")\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/scripts/make_confidence_report_bundled.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nmake_confidence_report_bundled.py\nUsage:\n  python make_confidence_report_bundled.py model.joblib\n\n  where model.joblib is a file created by cleverhans.serial.save containing\n  a picklable cleverhans.model.Model instance.\n\nThis script will run the model on clean data and bundled adversarial examples\n( https://openreview.net/forum?id=H1g0piA9tQ ) for a max norm threat model\non the dataset the model was trained on.\nIt will save a ConfidenceReport to to model_bundled_report.joblib.\nThe report can be later loaded by another\nscript using cleverhans.serial.load.\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport tensorflow as tf\n\nfrom cleverhans.utils_tf import silence\n\n# The silence() call must precede other imports in order to silence them.\n# pylint does not like it but that's how it has to be.\n# pylint: disable=C0413\nsilence()\nfrom cleverhans.compat import flags\nfrom cleverhans.confidence_report import make_confidence_report_bundled\nfrom cleverhans.confidence_report import BATCH_SIZE\nfrom cleverhans.confidence_report import TRAIN_START, TRAIN_END\nfrom cleverhans.confidence_report import TEST_START, TEST_END\nfrom cleverhans.confidence_report import WHICH_SET\nfrom cleverhans.confidence_report import RECIPE\nfrom cleverhans.confidence_report import REPORT_PATH\n\n\nFLAGS = flags.FLAGS\n\n\ndef main(argv=None):\n    \"\"\"\n    Make a confidence report and save it to disk.\n    \"\"\"\n    try:\n        _name_of_script, filepath = argv\n    except ValueError:\n        raise ValueError(argv)\n    print(filepath)\n    make_confidence_report_bundled(\n        filepath=filepath,\n        test_start=FLAGS.test_start,\n        test_end=FLAGS.test_end,\n        which_set=FLAGS.which_set,\n        recipe=FLAGS.recipe,\n        report_path=FLAGS.report_path,\n        batch_size=FLAGS.batch_size,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\n        \"train_start\",\n        TRAIN_START,\n        \"Starting point (inclusive)\" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"train_end\",\n        TRAIN_END,\n        \"Ending point (non-inclusive) \" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_start\",\n        TEST_START,\n        \"Starting point (inclusive) \" \"of range of test examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_end\",\n        TEST_END,\n        \"End point (non-inclusive) of \" \"range of test examples to use\",\n    )\n    flags.DEFINE_string(\n        \"recipe\", RECIPE, \"Name of function from attack_bundling\" \" to run\"\n    )\n    flags.DEFINE_string(\"which_set\", WHICH_SET, '\"train\" or \"test\"')\n    flags.DEFINE_string(\"report_path\", REPORT_PATH, \"Report path\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Batch size\")\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/scripts/make_confidence_report_spsa.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nmake_confidence_report.py\nUsage:\n  python make_confidence_report_spsa.py model.joblib\n\n  where model.joblib is a file created by cleverhans.serial.save containing\n  a picklable cleverhans.model.Model instance.\n\nThis script will run the model on a variety of types of data and save a\nConfidenceReport to model_report.joblib.\nThe report can be later loaded by another script using cleverhans.serial.load.\nThis script puts the following entries in the report:\n  clean : Clean data\n  mc: MaxConfidence SPSA adversarial examples\n\nThis script works by running a single MaxConfidence attack on each example.\n( https://openreview.net/forum?id=H1g0piA9tQ )\nThe MaxConfidence attack uses the SPSA optimizer.\nThis is not intended to be a generic strong attack; rather it is intended\nto be a test for gradient masking.\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport logging\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.utils_tf import silence\n\nsilence()\n# The call to silence() must precede the other imports or they will log.\n# pylint does not like this.\n# pylint: disable=C0413\nfrom cleverhans.attacks import SPSA\nfrom cleverhans.attack_bundling import spsa_max_confidence_recipe\nfrom cleverhans.serial import load\nfrom cleverhans.utils import set_log_level\nfrom cleverhans.compat import flags\nfrom cleverhans.confidence_report import BATCH_SIZE\nfrom cleverhans.confidence_report import TRAIN_START\nfrom cleverhans.confidence_report import TRAIN_END\nfrom cleverhans.confidence_report import TEST_START\nfrom cleverhans.confidence_report import TEST_END\nfrom cleverhans.confidence_report import WHICH_SET\nfrom cleverhans.confidence_report import REPORT_PATH\n\nNB_ITER_SPSA = 80\nSPSA_SAMPLES = SPSA.DEFAULT_SPSA_SAMPLES\n\n\nFLAGS = flags.FLAGS\n\n\ndef make_confidence_report_spsa(\n    filepath,\n    train_start=TRAIN_START,\n    train_end=TRAIN_END,\n    test_start=TEST_START,\n    test_end=TEST_END,\n    batch_size=BATCH_SIZE,\n    which_set=WHICH_SET,\n    report_path=REPORT_PATH,\n    nb_iter=NB_ITER_SPSA,\n    spsa_samples=SPSA_SAMPLES,\n    spsa_iters=SPSA.DEFAULT_SPSA_ITERS,\n):\n    \"\"\"\n    Load a saved model, gather its predictions, and save a confidence report.\n\n\n    This function works by running a single MaxConfidence attack on each example,\n    using SPSA as the underyling optimizer.\n    This is not intended to be a strong generic attack.\n    It is intended to be a test to uncover gradient masking.\n\n    :param filepath: path to model to evaluate\n    :param train_start: index of first training set example to use\n    :param train_end: index of last training set example to use\n    :param test_start: index of first test set example to use\n    :param test_end: index of last test set example to use\n    :param batch_size: size of evaluation batches\n    :param which_set: 'train' or 'test'\n    :param nb_iter: Number of iterations of PGD to run per class\n    :param spsa_samples: Number of samples for SPSA\n    \"\"\"\n\n    # Set TF random seed to improve reproducibility\n    tf.set_random_seed(1234)\n\n    # Set logging level to see debug information\n    set_log_level(logging.INFO)\n\n    # Create TF session\n    sess = tf.Session()\n\n    if report_path is None:\n        assert filepath.endswith(\".joblib\")\n        report_path = filepath[: -len(\".joblib\")] + \"_spsa_report.joblib\"\n\n    with sess.as_default():\n        model = load(filepath)\n    assert len(model.get_params()) > 0\n    factory = model.dataset_factory\n    factory.kwargs[\"train_start\"] = train_start\n    factory.kwargs[\"train_end\"] = train_end\n    factory.kwargs[\"test_start\"] = test_start\n    factory.kwargs[\"test_end\"] = test_end\n    dataset = factory()\n\n    center = dataset.kwargs[\"center\"]\n    center = np.float32(center)\n    max_val = dataset.kwargs[\"max_val\"]\n    max_val = np.float32(max_val)\n    value_range = max_val * (1.0 + center)\n    min_value = np.float32(0.0 - center * max_val)\n\n    if \"CIFAR\" in str(factory.cls):\n        base_eps = 8.0 / 255.0\n    elif \"MNIST\" in str(factory.cls):\n        base_eps = 0.3\n    else:\n        raise NotImplementedError(str(factory.cls))\n\n    eps = np.float32(base_eps * value_range)\n    clip_min = min_value\n    clip_max = max_val\n\n    x_data, y_data = dataset.get_set(which_set)\n\n    nb_classes = dataset.NB_CLASSES\n\n    spsa_max_confidence_recipe(\n        sess,\n        model,\n        x_data,\n        y_data,\n        nb_classes,\n        eps,\n        clip_min,\n        clip_max,\n        nb_iter,\n        report_path,\n        spsa_samples=spsa_samples,\n        spsa_iters=spsa_iters,\n        eval_batch_size=batch_size,\n    )\n\n\ndef main(argv=None):\n    \"\"\"\n    Make a confidence report and save it to disk.\n    \"\"\"\n    try:\n        _name_of_script, filepath = argv\n    except ValueError:\n        raise ValueError(argv)\n    make_confidence_report_spsa(\n        filepath=filepath,\n        test_start=FLAGS.test_start,\n        test_end=FLAGS.test_end,\n        which_set=FLAGS.which_set,\n        report_path=FLAGS.report_path,\n        nb_iter=FLAGS.nb_iter,\n        batch_size=FLAGS.batch_size,\n        spsa_samples=FLAGS.spsa_samples,\n        spsa_iters=FLAGS.spsa_iters,\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"spsa_samples\", SPSA_SAMPLES, \"Number samples for SPSA\")\n    flags.DEFINE_integer(\n        \"spsa_iters\", SPSA.DEFAULT_SPSA_ITERS, \"Passed to SPSA.generate\"\n    )\n    flags.DEFINE_integer(\n        \"train_start\",\n        TRAIN_START,\n        \"Starting point (inclusive)\" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"train_end\",\n        TRAIN_END,\n        \"Ending point (non-inclusive) \" \"of range of train examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_start\",\n        TEST_START,\n        \"Starting point (inclusive) of range\" \" of test examples to use\",\n    )\n    flags.DEFINE_integer(\n        \"test_end\",\n        TEST_END,\n        \"End point (non-inclusive) of range\" \" of test examples to use\",\n    )\n    flags.DEFINE_integer(\"nb_iter\", NB_ITER_SPSA, \"Number of iterations of SPSA\")\n    flags.DEFINE_string(\"which_set\", WHICH_SET, '\"train\" or \"test\"')\n    flags.DEFINE_string(\"report_path\", REPORT_PATH, \"Path to save to\")\n    flags.DEFINE_integer(\"batch_size\", BATCH_SIZE, \"Batch size for most jobs\")\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/scripts/plot_success_fail_curve.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nPlots a success-fail curve ( https://openreview.net/forum?id=H1g0piA9tQ )\nUsage:\nplot_success_fail_curve.py model.joblib\nplot_success_fail_curve.py model1.joblib model2.joblib\n\nThis script is mostly intended to rapidly visualize success-fail curves\nduring model development and testing.\nTo make nicely labeled plots formatted to fit the page / column of a\npublication, you should probably write your own script that calls some\nof the same plotting commands.\n\"\"\"\nfrom matplotlib import pyplot\nimport tensorflow as tf\nfrom cleverhans.utils_tf import silence\n\nsilence()\n# silence call must precede this imports. pylint doesn't like that\n# pylint: disable=C0413\nfrom cleverhans.compat import flags\nfrom cleverhans.plot.success_fail import DEFAULT_FAIL_NAMES\nfrom cleverhans.plot.success_fail import plot_report_from_path\n\nFLAGS = flags.FLAGS\n\n\ndef main(argv=None):\n    \"\"\"Takes the path to a directory with reports and renders success fail plots.\"\"\"\n    report_paths = argv[1:]\n\n    fail_names = FLAGS.fail_names.split(\",\")\n\n    for report_path in report_paths:\n        plot_report_from_path(report_path, label=report_path, fail_names=fail_names)\n    pyplot.legend()\n\n    pyplot.xlim(-0.01, 1.0)\n    pyplot.ylim(0.0, 1.0)\n\n    pyplot.show()\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_string(\n        \"fail_names\",\n        \",\".join(DEFAULT_FAIL_NAMES),\n        \"Names of adversarial datasets for failure rate\",\n    )\n    tf.app.run()\n"
  },
  {
    "path": "cleverhans_v3.1.0/scripts/print_report.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nprint_report.py\nUsage:\n  print_report.py model_report.joblib\nPrints out some basic statistics stored in a pickled ConfidenceReport\n\"\"\"\nimport sys\nimport warnings\n\nfrom cleverhans.confidence_report import ConfidenceReport\nfrom cleverhans.serial import load\n\n\nif len(sys.argv) == 2:\n    # pylint doesn't realize that sys.argv will change at runtime\n    # pylint:disable=unbalanced-tuple-unpacking\n    _, path = sys.argv\nelse:\n    raise ValueError(\"Wrong number of arguments\")\nthe_report = load(path)\n\n\ndef current(report):\n    \"\"\"\n    The current implementation of report printing.\n    :param report: ConfidenceReport\n    \"\"\"\n    if hasattr(report, \"completed\"):\n        if report.completed:\n            print(\"Report completed\")\n        else:\n            print(\"REPORT NOT COMPLETED\")\n    else:\n        warnings.warn(\n            \"This report does not indicate whether it is completed. Support for reports without a `completed`\"\n            \"field may be dropped on or after 2019-05-11.\"\n        )\n    for key in report:\n        covered = report[key].confidence > 0.5\n        wrong = 1.0 - report[key].correctness\n        failure_rate = (covered * wrong).mean()\n        print(key, \"failure rate at t=.5\", failure_rate)\n        print(key, \"accuracy at t=0\", report[key].correctness.mean())\n\n\ndef deprecated(report):\n    \"\"\"\n    The deprecated implementation of report printing.\n    :param report: dict\n    \"\"\"\n    warnings.warn(\n        \"Printing dict-based reports is deprecated. This function \"\n        \"is included only to support a private development branch \"\n        \"and may be removed without warning.\"\n    )\n\n    for key in report:\n        confidence_name = \"confidence\"\n        correctness_name = \"correctness\"\n        if confidence_name not in report[key]:\n            confidence_name = \"all_probs\"\n            correctness_name = \"correctness_mask\"\n            warnings.warn(\n                \"'all_probs' is used only to temporarily support \"\n                \"the private development branch. This name can be \"\n                \"removed at any time without warning.\"\n            )\n        covered = report[key][confidence_name] > 0.5\n        wrong = 1.0 - report[key][correctness_name]\n        failure_rate = (covered * wrong).mean()\n        print(key, \"failure rate at t=.5\", failure_rate)\n        print(key, \"accuracy at t=0\", report[key][correctness_name].mean())\n\n\nif isinstance(the_report, ConfidenceReport):\n    current(the_report)\nelse:\n    deprecated(the_report)\n"
  },
  {
    "path": "cleverhans_v3.1.0/scripts/show_images.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nLoads an ndarray containing a batch of images and displays it.\nUsage:\nshow_images.py file.npy\n\"\"\"\nimport sys\nimport numpy as np\nfrom cleverhans.plot.image import show, make_grid\n\n# pylint has a bug here, thinks sys.argv is empty\n_, path = sys.argv  # pylint: disable=E0632\n\nimage_batch = np.load(path)\n\ngrid = make_grid(image_batch)\n\nshow(grid)\n"
  },
  {
    "path": "cleverhans_v3.1.0/setup.py",
    "content": "from setuptools import find_packages\nfrom setuptools import setup\n\nsetup(\n    name=\"cleverhans\",\n    version=\"3.0.1\",\n    url=\"https://github.com/tensorflow/cleverhans\",\n    license=\"MIT\",\n    install_requires=[\n        \"nose\",\n        \"pycodestyle\",\n        \"scipy\",\n        \"matplotlib\",\n        \"mnist ~= 0.2\",\n        \"numpy\",\n        \"tensorflow-probability\",\n        \"joblib\",\n    ],\n    # Explicit dependence on TensorFlow is not supported.\n    # See https://github.com/tensorflow/tensorflow/issues/7166\n    extras_require={\n        \"tf\": [\"tensorflow>=1.0.0\"],\n        \"tf_gpu\": [\"tensorflow-gpu>=1.0.0\"],\n        \"pytorch\": [\"torch>=1.1.0\", \"torchvision==0.3.0\"],\n    },\n    packages=find_packages(),\n)\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_attack_bundling.py",
    "content": "\"\"\"\nTests for cleverhans.attack_bundling\n\"\"\"\nimport numpy as np\nfrom cleverhans.attack_bundling import AttackConfig\nfrom cleverhans.attack_bundling import Misclassify\nfrom cleverhans.attack_bundling import unfinished_attack_configs\n\n\ndef test_unfinished_attack_configs():\n    \"\"\"\n    Test that tracking of which attack configs are unfinished is correct\n    \"\"\"\n\n    new_work_goal = {}\n    work_before = {}\n    run_counts = {}\n\n    expected_unfinished = []\n    expected_finished = []\n\n    easy_finished = AttackConfig(None, None)\n    new_work_goal[easy_finished] = 1\n    work_before[easy_finished] = np.array([0, 0])\n    run_counts[easy_finished] = np.array([1, 1])\n    expected_finished.append(easy_finished)\n\n    easy_unfinished = AttackConfig(None, None)\n    new_work_goal[easy_unfinished] = 1\n    work_before[easy_unfinished] = np.array([0, 0])\n    run_counts[easy_unfinished] = np.array([0, 0])\n    expected_unfinished.append(easy_unfinished)\n\n    only_partly_finished = AttackConfig(None, None)\n    new_work_goal[only_partly_finished] = 1\n    work_before[only_partly_finished] = np.array([0, 0])\n    run_counts[only_partly_finished] = np.array([1, 0])\n    expected_unfinished.append(only_partly_finished)\n\n    work_not_new = AttackConfig(None, None)\n    new_work_goal[work_not_new] = 1\n    work_before[work_not_new] = np.array([1, 1])\n    run_counts[work_not_new] = np.array([1, 1])\n    expected_unfinished.append(work_not_new)\n\n    actual_unfinished = unfinished_attack_configs(\n        new_work_goal, work_before, run_counts\n    )\n\n    assert all(e in actual_unfinished for e in expected_unfinished)\n    assert all(e not in actual_unfinished for e in expected_finished)\n\n\ndef test_misclassify_request_examples():\n    \"\"\"\n    Test Misclassify.request_examples\n    \"\"\"\n    cfg = AttackConfig(None, None)\n    goal = Misclassify(new_work_goal={cfg: 1})\n    correctness = np.array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1], dtype=np.bool)\n    run_counts = np.array([1, 1, 1, 0, 0, 0, 1, 1, 1, 0], dtype=np.int64)\n    criteria = {\"correctness\": correctness}\n    batch_size = 3\n    idxs = goal.request_examples(cfg, criteria, {cfg: run_counts}, batch_size)\n    assert idxs.shape == (batch_size,)\n    idxs = list(idxs)\n    for already_misclassified in [0, 2, 4, 6, 8]:\n        assert already_misclassified not in idxs\n    for already_run in [1, 7]:\n        assert already_run not in idxs\n    for needed in [3, 5, 9]:\n        assert needed in idxs\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_attacks.py",
    "content": "# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport functools\nimport unittest\n\nimport numpy as np\nfrom nose.plugins.skip import SkipTest\nimport tensorflow as tf\n\n# pylint bug on next line\nimport tensorflow.contrib.slim as slim  # pylint: disable=no-name-in-module\n\nfrom cleverhans.devtools.checks import CleverHansTest\nfrom cleverhans import attacks\nfrom cleverhans.attacks import Attack, SPSA\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.attacks import BasicIterativeMethod\nfrom cleverhans.attacks import MomentumIterativeMethod\nfrom cleverhans.attacks import VirtualAdversarialMethod\nfrom cleverhans.attacks import SaliencyMapMethod\nfrom cleverhans.attacks import CarliniWagnerL2\nfrom cleverhans.attacks import ElasticNetMethod\nfrom cleverhans.attacks import DeepFool\nfrom cleverhans.attacks import MadryEtAl\nfrom cleverhans.attacks import ProjectedGradientDescent\nfrom cleverhans.attacks import FastFeatureAdversaries\nfrom cleverhans.attacks import LBFGS\nfrom cleverhans.attacks import SpatialTransformationMethod\nfrom cleverhans.attacks import HopSkipJumpAttack\nfrom cleverhans.attacks import SparseL1Descent\nfrom cleverhans.initializers import HeReLuNormalInitializer\nfrom cleverhans.model import Model\n\n\nclass SimpleModel(Model):\n    \"\"\"\n    A very simple neural network\n    \"\"\"\n\n    def __init__(self, scope=\"simple\", nb_classes=2, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            w1 = tf.constant([[1.5, 0.3], [-2, 0.3]], dtype=tf.as_dtype(x.dtype))\n            w2 = tf.constant([[-2.4, 1.2], [0.5, -2.3]], dtype=tf.as_dtype(x.dtype))\n        h1 = tf.nn.sigmoid(tf.matmul(x, w1))\n        res = tf.matmul(h1, w2)\n        return {self.O_LOGITS: res, self.O_PROBS: tf.nn.softmax(res)}\n\n\nclass TrivialModel(Model):\n    \"\"\"\n    A linear model with two weights\n    \"\"\"\n\n    def __init__(self, scope=\"trivial\", nb_classes=2, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            w1 = tf.constant([[1, -1]], dtype=tf.float32)\n        res = tf.matmul(x, w1)\n        return {self.O_LOGITS: res, self.O_PROBS: tf.nn.softmax(res)}\n\n\nclass DummyModel(Model):\n    \"\"\"\n    A simple model based on slim\n    \"\"\"\n\n    def __init__(self, scope=\"dummy_model\", nb_classes=10, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            net = slim.flatten(x)\n            net = slim.fully_connected(net, 60)\n            logits = slim.fully_connected(net, 10, activation_fn=None)\n            return {self.O_LOGITS: logits, self.O_PROBS: tf.nn.softmax(logits)}\n\n\nclass TestAttackClassInitArguments(CleverHansTest):\n    def test_model(self):\n        sess = tf.Session()\n\n        # Exception is thrown when model does not have __call__ attribute\n        with self.assertRaises(Exception) as context:\n            model = tf.placeholder(tf.float32, shape=(None, 10))\n            Attack(model, sess=sess)\n        self.assertTrue(context.exception)\n\n    def test_sess(self):\n        # Test that it is permitted to provide no session.\n        # The session still needs to be created prior to running the attack.\n        # TODO: does anyone know why we need to make an unused session and put it in a with statement?\n        with tf.Session():\n            Attack(Model(\"model\", 10, {}), sess=None)\n\n    def test_sess_generate_np(self):\n        model = Model(\"model\", 10, {})\n\n        class DummyAttack(Attack):\n            def generate(self, x, **kwargs):\n                return x\n\n        # Test that generate_np is NOT permitted without a session.\n        # The session still needs to be created prior to running the attack.\n        # TODO: does anyone know why we need to make an unused session and put it in a with statement?\n        with tf.Session():\n            attack = DummyAttack(model, sess=None)\n            with self.assertRaises(Exception) as context:\n                attack.generate_np(0.0)\n            self.assertTrue(context.exception)\n\n\nclass TestParseParams(CleverHansTest):\n    def test_parse(self):\n        sess = tf.Session()\n\n        test_attack = Attack(Model(\"model\", 10, {}), sess=sess)\n        self.assertTrue(test_attack.parse_params({}))\n\n\nclass TestVirtualAdversarialMethod(CleverHansTest):\n    def setUp(self):\n        super(TestVirtualAdversarialMethod, self).setUp()\n\n        self.sess = tf.Session()\n        self.sess.as_default()\n        self.model = DummyModel(\"virtual_adv_dummy_model\")\n        self.attack = VirtualAdversarialMethod(self.model, sess=self.sess)\n\n        # initialize model\n        with tf.name_scope(\"virtual_adv_dummy_model\"):\n            self.model.get_probs(tf.placeholder(tf.float32, shape=(None, 1000)))\n        self.sess.run(tf.global_variables_initializer())\n\n    def test_parse_params(self):\n        self.attack.parse_params()\n        # test default values\n        self.assertEqual(self.attack.eps, 2.0)\n        self.assertEqual(self.attack.num_iterations, 1)\n        self.assertEqual(self.attack.xi, 1e-6)\n        self.assertEqual(self.attack.clip_min, None)\n        self.assertEqual(self.attack.clip_max, None)\n\n    def test_generate_np(self):\n        x_val = np.random.rand(100, 1000)\n        perturbation = self.attack.generate_np(x_val) - x_val\n        perturbation_norm = np.sqrt(np.sum(perturbation ** 2, axis=1))\n        # test perturbation norm\n        self.assertClose(perturbation_norm, self.attack.eps)\n\n\nclass CommonAttackProperties(CleverHansTest):\n    \"\"\"\n    Abstract base class shared by the tests for many attacks that want\n    to check the same properties.\n    \"\"\"\n\n    def setUp(self):\n        # Inheritance doesn't really work with tests.\n        # nosetests always wants to run this class because it is a\n        # CleverHansTest subclass, but this class is meant to just\n        # be abstract.\n        # Before this class was the tests for FastGradientMethod but\n        # people kept inheriting from it for other attacks so it was\n        # impossible to write tests specifically for FastGradientMethod.\n        # pylint: disable=unidiomatic-typecheck\n        if type(self) is CommonAttackProperties:\n            raise SkipTest()\n\n        super(CommonAttackProperties, self).setUp()\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n\n    def generate_adversarial_examples_np(self, ord, eps, **kwargs):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val, eps=eps, ord=ord, clip_min=-5, clip_max=5, **kwargs\n        )\n        if ord == np.inf:\n            delta = np.max(np.abs(x_adv - x_val), axis=1)\n        elif ord == 1:\n            delta = np.sum(np.abs(x_adv - x_val), axis=1)\n        elif ord == 2:\n            delta = np.sum(np.square(x_adv - x_val), axis=1) ** 0.5\n\n        return x_val, x_adv, delta\n\n    def help_generate_np_gives_adversarial_example(self, ord, eps=0.5, **kwargs):\n        x_val, x_adv, delta = self.generate_adversarial_examples_np(ord, eps, **kwargs)\n        self.assertLess(np.max(np.abs(delta - eps)), 1e-3)\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertLess(np.max(np.mean(orig_labs == new_labs)), 0.5)\n\n    def test_invalid_input(self):\n        x_val = -np.ones((2, 2), dtype=\"float32\")\n        with self.assertRaises(tf.errors.InvalidArgumentError) as context:\n            self.attack.generate_np(x_val, eps=1.0, clip_min=0.0, clip_max=1.0)\n        self.assertTrue(context.exception)\n\n    def test_generate_np_gives_adversarial_example_linfinity(self):\n        self.help_generate_np_gives_adversarial_example(np.infty)\n\n    def test_generate_np_gives_adversarial_example_l1(self):\n        self.help_generate_np_gives_adversarial_example(1)\n\n    def test_generate_np_gives_adversarial_example_l2(self):\n        self.help_generate_np_gives_adversarial_example(2)\n\n    def test_generate_respects_dtype(self):\n        self.attack = FastGradientMethod(self.model, sess=self.sess, dtypestr=\"float64\")\n        x = tf.placeholder(dtype=tf.float64, shape=(100, 2))\n        x_adv = self.attack.generate(x)\n        self.assertEqual(x_adv.dtype, tf.float64)\n\n    def test_targeted_generate_np_gives_adversarial_example(self):\n        random_labs = np.random.random_integers(0, 1, 100)\n        random_labs_one_hot = np.zeros((100, 2))\n        random_labs_one_hot[np.arange(100), random_labs] = 1\n\n        try:\n            _, x_adv, delta = self.generate_adversarial_examples_np(\n                eps=0.5, ord=np.inf, y_target=random_labs_one_hot\n            )\n        except NotImplementedError:\n            raise SkipTest()\n\n        self.assertLessEqual(np.max(delta), 0.5001)\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertTrue(np.mean(random_labs == new_labs) > 0.7)\n\n    def test_generate_np_can_be_called_with_different_eps(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        for eps in [0.1, 0.2, 0.3, 0.4]:\n            x_adv = self.attack.generate_np(\n                x_val, eps=eps, ord=np.inf, clip_min=-5.0, clip_max=5.0\n            )\n\n            delta = np.max(np.abs(x_adv - x_val), axis=1)\n            self.assertLessEqual(np.max(delta), eps + 1e-4)\n\n    def test_generate_can_be_called_with_different_eps(self):\n        # It is crtical that this test uses generate and not generate_np.\n        # All the other tests use generate_np. Even though generate_np calls\n        # generate, it does so in a very standardized way, e.g. with eps\n        # always converted to a tensorflow placeholder, so the other tests\n        # based on generate_np do not exercise the generate API very well.\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n        x = tf.placeholder(tf.float32, x_val.shape)\n\n        for eps in [0.1, 0.2, 0.3, 0.4]:\n            x_adv = self.attack.generate(\n                x, eps=eps, ord=np.inf, clip_min=-5.0, clip_max=5.0\n            )\n            x_adv = self.sess.run(x_adv, feed_dict={x: x_val})\n\n            delta = np.max(np.abs(x_adv - x_val), axis=1)\n            self.assertLessEqual(np.max(delta), eps + 1e-4)\n\n    def test_generate_np_clip_works_as_expected(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val, eps=0.5, ord=np.inf, clip_min=-0.2, clip_max=0.1, sanity_checks=False\n        )\n\n        self.assertClose(np.min(x_adv), -0.2)\n        self.assertClose(np.max(x_adv), 0.1)\n\n\nclass TestFastGradientMethod(CommonAttackProperties):\n    def setUp(self):\n        super(TestFastGradientMethod, self).setUp()\n\n        self.attack = FastGradientMethod(self.model, sess=self.sess)\n\n\nclass TestOptimizeLinear(CleverHansTest):\n    \"\"\"\n    Tests for the `optimize_linear` function\n    \"\"\"\n\n    def setUp(self):\n        super(TestOptimizeLinear, self).setUp()\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n\n    def test_optimize_linear_linf(self):\n\n        grad = tf.placeholder(tf.float32, shape=[1, 2])\n\n        # Build the graph for the attack\n        eta = attacks.optimize_linear(grad, eps=1.0, ord=np.inf)\n        objective = tf.reduce_sum(grad * eta)\n\n        grad_val = np.array([[1.0, -2.0]])\n        eta, objective = self.sess.run([eta, objective], feed_dict={grad: grad_val})\n\n        # Make sure the objective is optimal.\n        # This is the solution obtained by doing the algebra by hand.\n        self.assertClose(objective, np.abs(grad_val).sum())\n        # Make sure the constraint is respected.\n        # Also, for a linear function, the constraint will always be tight.\n        self.assertClose(np.abs(eta), 1.0)\n\n    def test_optimize_linear_l2(self):\n\n        grad = tf.placeholder(tf.float32, shape=[1, 2])\n\n        # Build the graph for the attack\n        eta = attacks.optimize_linear(grad, eps=1.0, ord=2)\n        objective = tf.reduce_sum(grad * eta)\n\n        grad_val = np.array([[np.sqrt(0.5), -np.sqrt(0.5)]])\n        eta, objective = self.sess.run([eta, objective], feed_dict={grad: grad_val})\n\n        # Make sure the objective is optimal.\n        # This is the solution obtained by doing the algebra by hand.\n        self.assertClose(objective, 1.0)\n        # Make sure the constraint is respected.\n        # Also, for a linear function, the constraint will always be tight.\n        self.assertClose(np.sqrt(np.square(eta).sum()), 1.0)\n\n    def test_optimize_linear_l1(self):\n\n        # This test makes sure that `optimize_linear` actually finds the optimal\n        # perturbation for ord=1.\n        # A common misconcpetion is that FGM for ord=1 consists of dividing\n        # the gradient by its L1 norm.\n        # If you do that for the problem in this unit test, you'll get an\n        # objective function value of ~1.667. The optimal result is 2.\n\n        # We need just one example in the batch and two features to show the\n        # common misconception is suboptimal.\n        grad = tf.placeholder(tf.float32, shape=[1, 2])\n\n        # Build the graph for the attack\n        eta = attacks.optimize_linear(grad, eps=1.0, ord=1)\n        objective = tf.reduce_sum(grad * eta)\n\n        # Make sure the largest entry of the gradient for the test case is\n        # negative, to catch\n        # the potential bug where we forget to handle the sign of the gradient\n        eta, objective = self.sess.run(\n            [eta, objective], feed_dict={grad: np.array([[1.0, -2.0]])}\n        )\n\n        # Make sure the objective is optimal.\n        # This is the solution obtained by doing the algebra by hand.\n        self.assertClose(objective, 2.0)\n        # Make sure the constraint is respected.\n        # Also, for a linear function, the constraint will always be tight.\n        self.assertClose(np.abs(eta).sum(), 1.0)\n\n    def test_optimize_linear_l1_ties(self):\n\n        # This test makes sure that `optimize_linear` handles ties in gradient\n        # magnitude correctly when ord=1.\n\n        # We need just one example in the batch and two features to construct\n        # a tie.\n        grad = tf.placeholder(tf.float32, shape=[1, 2])\n\n        # Build the graph for the attack\n        eta = attacks.optimize_linear(grad, eps=1.0, ord=1)\n        objective = tf.reduce_sum(grad * eta)\n\n        # Run a test case with a tie for largest absolute value.\n        # Make one feature negative to make sure we're checking for ties in\n        # absolute value, not raw value.\n        eta, objective = self.sess.run(\n            [eta, objective], feed_dict={grad: np.array([[2.0, -2.0]])}\n        )\n\n        # Make sure the objective is optimal.\n        # This is the solution obtained by doing the algebra by hand.\n        self.assertClose(objective, 2.0)\n        # Make sure the constraint is respected.\n        # Also, for a linear function, the constraint will always be tight.\n        self.assertClose(np.abs(eta).sum(), 1.0)\n\n\nclass TestSPSA(CleverHansTest):\n    def setUp(self):\n        super(TestSPSA, self).setUp()\n\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n        self.attack = SPSA(self.model, sess=self.sess)\n\n    def test_attack_strength(self):\n        n_samples = 10\n        x_val = np.random.rand(n_samples, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # The SPSA attack currently uses non-one-hot labels\n        # TODO: change this to use standard cleverhans label conventions\n        feed_labs = np.random.randint(0, 2, n_samples)\n\n        x_input = tf.placeholder(tf.float32, shape=(1, 2))\n        y_label = tf.placeholder(tf.int32, shape=(1,))\n\n        x_adv_op = self.attack.generate(\n            x_input,\n            y=y_label,\n            epsilon=0.5,\n            num_steps=100,\n            batch_size=64,\n            spsa_iters=1,\n            clip_min=0.0,\n            clip_max=1.0,\n        )\n\n        all_x_adv = []\n        for i in range(n_samples):\n            x_adv_np = self.sess.run(\n                x_adv_op,\n                feed_dict={\n                    x_input: np.expand_dims(x_val[i], axis=0),\n                    y_label: np.expand_dims(feed_labs[i], axis=0),\n                },\n            )\n            all_x_adv.append(x_adv_np[0])\n\n        x_adv = np.vstack(all_x_adv)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertTrue(np.mean(feed_labs == new_labs) < 0.1)\n\n    def test_attack_strength_np(self):\n        # Same test as test_attack_strength, but uses generate_np interface\n        n_samples = 10\n        x_val = np.random.rand(n_samples, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        feed_labs = np.random.randint(0, 2, n_samples, dtype=\"int32\")\n\n        all_x_adv = []\n        for i in range(n_samples):\n            x_adv_np = self.attack.generate_np(\n                np.expand_dims(x_val[i], axis=0),\n                y=np.expand_dims(feed_labs[i], axis=0),\n                eps=0.5,\n                nb_iter=100,\n                spsa_samples=64,\n                spsa_iters=1,\n                clip_min=0.0,\n                clip_max=1.0,\n            )\n            all_x_adv.append(x_adv_np[0])\n\n        x_adv = np.vstack(all_x_adv)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertLess(np.mean(feed_labs == new_labs), 0.1)\n\n    def test_attack_strength_np_batched(self):\n        # Same test as test_attack_strength_np, but batched\n        n_samples = 10\n        x_val = np.random.rand(n_samples, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        feed_labs = np.random.randint(0, 2, n_samples, dtype=\"int32\")\n        x_adv = self.attack.generate_np(\n            x_val,\n            y=feed_labs,\n            eps=0.5,\n            nb_iter=100,\n            spsa_samples=64,\n            spsa_iters=1,\n            clip_min=0.0,\n            clip_max=1.0,\n        )\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertLess(np.mean(feed_labs == new_labs), 0.1)\n\n    def test_label_argument_int64(self):\n        x_val = np.random.rand(1, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # Try calling alternating with int32 and int64 and ensure it works\n        for dtype in [np.int32, np.int64, np.int32, np.int64]:\n            self.attack.generate_np(\n                x_val,\n                y=np.zeros(1, dtype=dtype),\n                eps=0.5,\n                nb_iter=5,\n                spsa_samples=64,\n                spsa_iters=1,\n                clip_min=0.0,\n                clip_max=1.0,\n            )\n\n\nclass TestProjectedGradientDescent(CommonAttackProperties):\n    def setUp(self):\n        super(TestProjectedGradientDescent, self).setUp()\n\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n        self.attack = ProjectedGradientDescent(self.model, sess=self.sess)\n\n    def test_generate_np_gives_adversarial_example_linfinity(self):\n        self.help_generate_np_gives_adversarial_example(\n            ord=np.infty, eps=0.5, nb_iter=20\n        )\n\n    def test_generate_np_gives_adversarial_example_l1(self):\n        try:\n            self.help_generate_np_gives_adversarial_example(ord=1, eps=0.5, nb_iter=20)\n        except NotImplementedError:\n            raise SkipTest()\n\n    def test_generate_np_gives_adversarial_example_l2(self):\n        self.help_generate_np_gives_adversarial_example(ord=2, eps=0.5, nb_iter=20)\n\n    def test_do_not_reach_lp_boundary(self):\n        \"\"\"\n        Make sure that iterative attack don't reach boundary of Lp\n        neighbourhood if nb_iter * eps_iter is relatively small compared to\n        epsilon.\n        \"\"\"\n        for ord in [1, 2, np.infty]:\n            try:\n                _, _, delta = self.generate_adversarial_examples_np(\n                    ord=ord, eps=0.5, nb_iter=10, eps_iter=0.01\n                )\n            except NotImplementedError:\n                # Don't raise SkipTest because it will skip the rest of the for loop\n                continue\n            self.assertTrue(np.max(0.5 - delta) > 0.25)\n\n    def test_attack_strength_linf(self):\n        \"\"\"\n        If clipping is not done at each iteration (not passing clip_min and\n        clip_max to fgm), this attack fails by\n        np.mean(orig_labels == new_labels) == .39.\n        \"\"\"\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # sanity checks turned off because this test initializes outside\n        # the valid range.\n        x_adv = self.attack.generate_np(\n            x_val,\n            eps=1.0,\n            ord=np.inf,\n            clip_min=0.5,\n            clip_max=0.7,\n            nb_iter=5,\n            sanity_checks=False,\n        )\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertLess(np.mean(orig_labs == new_labs), 0.1)\n\n    def test_attack_strength_l2(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # sanity checks turned off because this test initializes outside\n        # the valid range.\n        x_adv = self.attack.generate_np(\n            x_val,\n            eps=1,\n            ord=2,\n            clip_min=0.5,\n            clip_max=0.7,\n            nb_iter=5,\n            sanity_checks=False,\n        )\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertLess(np.mean(orig_labs == new_labs), 0.1)\n\n    def test_grad_clip_l2(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # sanity checks turned off because this test initializes outside\n        # the valid range.\n        x_adv = self.attack.generate_np(\n            x_val,\n            eps=1,\n            ord=2,\n            clip_min=0.5,\n            clip_max=0.7,\n            clip_grad=True,\n            nb_iter=10,\n            sanity_checks=False,\n        )\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertLess(np.mean(orig_labs == new_labs), 0.1)\n\n    def test_clip_eta_linf(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val, ord=np.inf, eps=1.0, eps_iter=0.1, nb_iter=5\n        )\n\n        delta = np.max(np.abs(x_adv - x_val), axis=1)\n        self.assertLessEqual(np.max(delta), 1.0)\n\n    def test_clip_eta_l2(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(x_val, ord=2, eps=1.0, eps_iter=0.1, nb_iter=5)\n\n        delta = np.sqrt(np.sum(np.square(x_adv - x_val), axis=1))\n        # this projection is less numerically stable so give it some slack\n        self.assertLessEqual(np.max(delta), 1.0 + 1e-6)\n\n    def test_generate_np_gives_clipped_adversarial_examples(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        for ord in [1, 2, np.infty]:\n            try:\n                x_adv = self.attack.generate_np(\n                    x_val,\n                    ord=ord,\n                    eps=1.0,\n                    eps_iter=0.1,\n                    nb_iter=5,\n                    clip_min=-0.2,\n                    clip_max=0.3,\n                    sanity_checks=False,\n                )\n\n                self.assertLess(-0.201, np.min(x_adv))\n                self.assertLess(np.max(x_adv), 0.301)\n            except NotImplementedError:\n                # Don't raise SkipTest because it will skip the rest of the for loop\n                continue\n\n    def test_generate_np_does_not_cache_graph_computation_for_nb_iter(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # Call it once\n        x_adv = self.attack.generate_np(\n            x_val, eps=1.0, ord=np.inf, clip_min=-5.0, clip_max=5.0, nb_iter=10\n        )\n\n        # original labels\n        np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        # new labels\n        np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        # Call it again\n        ok = [False]\n        old_grads = tf.gradients\n        try:\n\n            def fn(*x, **y):\n                ok[0] = True\n                return old_grads(*x, **y)\n\n            tf.gradients = fn\n\n            x_adv = self.attack.generate_np(\n                x_val, eps=1.0, ord=np.inf, clip_min=-5.0, clip_max=5.0, nb_iter=11\n            )\n        finally:\n            tf.gradients = old_grads\n\n        # original labels\n        np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        # new labels\n        np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(ok[0])\n\n    def test_multiple_initial_random_step(self):\n        \"\"\"\n        This test generates multiple adversarial examples until an adversarial\n        example is generated with a different label compared to the original\n        label. This is the procedure suggested in Madry et al. (2017).\n\n        This test will fail if an initial random step is not taken (error>0.5).\n        \"\"\"\n        x_val = np.array(np.random.rand(100, 2), dtype=np.float32)\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs_multi = orig_labs.copy()\n\n        # Generate multiple adversarial examples\n        for _ in range(10):\n            x_adv = self.attack.generate_np(\n                x_val,\n                eps=0.5,\n                eps_iter=0.05,\n                clip_min=0.5,\n                clip_max=0.7,\n                nb_iter=2,\n                sanity_checks=False,\n            )\n            new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n            # Examples for which we have not found adversarial examples\n            I = orig_labs == new_labs_multi\n            new_labs_multi[I] = new_labs[I]\n\n        self.assertLess(np.mean(orig_labs == new_labs_multi), 0.5)\n\n\nclass TestSparseL1Descent(CleverHansTest):\n    def setUp(self):\n        super(TestSparseL1Descent, self).setUp()\n\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n        self.attack = SparseL1Descent(self.model, sess=self.sess)\n\n    def generate_adversarial_examples_np(self, eps, **kwargs):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val, eps=eps, clip_min=-5, clip_max=5, **kwargs\n        )\n        delta = np.sum(np.abs(x_adv - x_val), axis=1)\n\n        return x_val, x_adv, delta\n\n    def help_generate_np_gives_adversarial_example(self, eps=2.0, **kwargs):\n        x_val, x_adv, delta = self.generate_adversarial_examples_np(eps, **kwargs)\n        self.assertLess(np.max(np.abs(delta - eps)), 1e-3)\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertLess(np.max(np.mean(orig_labs == new_labs)), 0.5)\n\n    def test_invalid_input(self):\n        x_val = -np.ones((2, 2), dtype=\"float32\")\n        with self.assertRaises(tf.errors.InvalidArgumentError) as context:\n            self.attack.generate_np(x_val, eps=10.0, clip_min=0.0, clip_max=1.0)\n        self.assertTrue(context.exception)\n\n    def test_generate_np_gives_adversarial_example(self):\n        self.help_generate_np_gives_adversarial_example()\n\n    def test_targeted_generate_np_gives_adversarial_example(self):\n        random_labs = np.random.random_integers(0, 1, 100)\n        random_labs_one_hot = np.zeros((100, 2))\n        random_labs_one_hot[np.arange(100), random_labs] = 1\n\n        _, x_adv, delta = self.generate_adversarial_examples_np(\n            eps=10, y_target=random_labs_one_hot\n        )\n\n        self.assertLessEqual(np.max(delta), 10.001)\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertTrue(np.mean(random_labs == new_labs) > 0.7)\n\n    def test_generate_np_can_be_called_with_different_eps(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        for eps in [10, 20, 30, 40]:\n            x_adv = self.attack.generate_np(x_val, eps=eps, clip_min=-5.0, clip_max=5.0)\n\n            delta = np.max(np.abs(x_adv - x_val), axis=1)\n            self.assertLessEqual(np.max(delta), eps + 1e-4)\n\n    def test_generate_can_be_called_with_different_eps(self):\n        # It is crtical that this test uses generate and not generate_np.\n        # All the other tests use generate_np. Even though generate_np calls\n        # generate, it does so in a very standardized way, e.g. with eps\n        # always converted to a tensorflow placeholder, so the other tests\n        # based on generate_np do not exercise the generate API very well.\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n        x = tf.placeholder(tf.float32, x_val.shape)\n\n        for eps in [10, 20, 30, 40]:\n            x_adv = self.attack.generate(x, eps=eps, clip_min=-5.0, clip_max=5.0)\n            x_adv = self.sess.run(x_adv, feed_dict={x: x_val})\n\n            delta = np.max(np.abs(x_adv - x_val), axis=1)\n            self.assertLessEqual(np.max(delta), eps + 1e-4)\n\n    def test_generate_np_clip_works_as_expected(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val,\n            eps=10,\n            nb_iter=20,\n            rand_init=True,\n            clip_min=-0.2,\n            clip_max=0.1,\n            sanity_checks=False,\n        )\n\n        self.assertClose(np.min(x_adv), -0.2)\n        self.assertClose(np.max(x_adv), 0.1)\n\n    def test_do_not_reach_lp_boundary(self):\n        \"\"\"\n        Make sure that iterative attack don't reach boundary of Lp\n        neighbourhood if nb_iter * eps_iter is relatively small compared to\n        epsilon.\n        \"\"\"\n\n        _, _, delta = self.generate_adversarial_examples_np(\n            eps=0.5, nb_iter=10, eps_iter=0.01\n        )\n\n        self.assertTrue(np.max(0.5 - delta) > 0.25)\n\n    def test_generate_np_gives_clipped_adversarial_examples(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val,\n            eps=1.0,\n            eps_iter=0.1,\n            nb_iter=5,\n            clip_min=-0.2,\n            clip_max=0.3,\n            sanity_checks=False,\n        )\n\n        self.assertLess(-0.201, np.min(x_adv))\n        self.assertLess(np.max(x_adv), 0.301)\n\n    def test_generate_np_does_not_cache_graph_computation_for_nb_iter(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # Call it once\n        x_adv = self.attack.generate_np(\n            x_val, eps=1.0, clip_min=-5.0, clip_max=5.0, nb_iter=10\n        )\n\n        # original labels\n        np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        # new labels\n        np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        # Call it again\n        ok = [False]\n        old_grads = tf.gradients\n        try:\n\n            def fn(*x, **y):\n                ok[0] = True\n                return old_grads(*x, **y)\n\n            tf.gradients = fn\n\n            x_adv = self.attack.generate_np(\n                x_val, eps=1.0, clip_min=-5.0, clip_max=5.0, nb_iter=11\n            )\n        finally:\n            tf.gradients = old_grads\n\n        # original labels\n        np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        # new labels\n        np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(ok[0])\n\n    def test_clip_eta(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(x_val, eps=1.0, eps_iter=0.1, nb_iter=5)\n\n        delta = np.sum(np.abs(x_adv - x_val), axis=1)\n        # this projection is less numerically stable so give it some slack\n        self.assertLessEqual(np.max(delta), 1.0 + 1e-6)\n\n    def test_attack_strength(self):\n        \"\"\"\n        Without clipped gradients, we achieve\n        np.mean(orig_labels == new_labels) == 0.31.\n        \"\"\"\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # sanity checks turned off because this test initializes outside\n        # the valid range.\n        x_adv = self.attack.generate_np(\n            x_val,\n            eps=10.0,\n            rand_init=True,\n            clip_min=0.5,\n            clip_max=0.7,\n            nb_iter=10,\n            sanity_checks=False,\n        )\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertLess(np.mean(orig_labs == new_labs), 0.5)\n        self.assertGreater(np.mean(orig_labs == new_labs), 0.2)\n\n    def test_grad_clip(self):\n        \"\"\"\n        With clipped gradients, we achieve\n        np.mean(orig_labels == new_labels) == 0.0\n        \"\"\"\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # sanity checks turned off because this test initializes outside\n        # the valid range.\n        x_adv = self.attack.generate_np(\n            x_val,\n            eps=10.0,\n            rand_init=True,\n            clip_min=0.5,\n            clip_max=0.7,\n            clip_grad=True,\n            nb_iter=10,\n            sanity_checks=False,\n        )\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertLess(np.mean(orig_labs == new_labs), 0.1)\n\n    def test_sparsity(self):\n\n        # use a model with larger input dimensionality for this test.\n        self.model = DummyModel(\"sparse_l1_descent_dummy_model\")\n        self.attack = SparseL1Descent(self.model, sess=self.sess)\n\n        # initialize model\n        with tf.name_scope(\"sparse_l1_descent_dummy_model\"):\n            self.model.get_probs(tf.placeholder(tf.float32, shape=(None, 1000)))\n        self.sess.run(tf.global_variables_initializer())\n\n        x_val = np.random.rand(100, 1000)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        for q in [1, 9, 25.8, 50, 75.4, 90.2, 99, 99.9]:\n            x_adv = self.attack.generate_np(\n                x_val, eps=5.0, grad_sparsity=q, nb_iter=1, sanity_checks=False\n            )\n\n            numzero = np.sum(x_adv - x_val == 0, axis=-1)\n            self.assertAlmostEqual(q * 1000.0 / 100.0, np.mean(numzero), delta=1)\n\n    def test_grad_sparsity_checks(self):\n        # test that the attacks allows `grad_sparsity` to be specified as a scalar\n        # in (0, 100) or as a vector.\n\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # scalar values out of range\n        with self.assertRaises(ValueError) as context:\n            self.attack.generate(x_val, sanity_checks=False, grad_sparsity=0)\n        self.assertTrue(context.exception)\n\n        with self.assertRaises(ValueError) as context:\n            self.attack.generate(x_val, sanity_checks=False, grad_sparsity=100)\n        self.assertTrue(context.exception)\n\n        # sparsity as 2D array should fail\n        with self.assertRaises(ValueError) as context:\n            gs = tf.random.uniform(shape=(100, 2), minval=90, maxval=99)\n            self.attack.generate(x_val, sanity_checks=False, grad_sparsity=gs)\n        self.assertTrue(context.exception)\n\n        # sparsity as 1D array should succeed\n        gs = tf.random.uniform(shape=(100,), minval=90, maxval=99)\n        x_adv = self.attack.generate(x_val, sanity_checks=False, grad_sparsity=gs)\n        self.assertTrue(np.array_equal(x_adv.get_shape().as_list(), [100, 2]))\n\n        # sparsity vector of wrong size should fail\n        with self.assertRaises(ValueError) as context:\n            gs = tf.random.uniform(shape=(101,), minval=90, maxval=99)\n            x_adv = self.attack.generate(x_val, sanity_checks=False, grad_sparsity=gs)\n        self.assertTrue(context.exception)\n\n\nclass TestCarliniWagnerL2(CleverHansTest):\n    def setUp(self):\n        super(TestCarliniWagnerL2, self).setUp()\n\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n        self.attack = CarliniWagnerL2(self.model, sess=self.sess)\n\n    def test_generate_np_untargeted_gives_adversarial_example(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val,\n            max_iterations=100,\n            binary_search_steps=3,\n            initial_const=1,\n            clip_min=-5,\n            clip_max=5,\n            batch_size=10,\n        )\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(orig_labs == new_labs) < 0.1)\n\n    def test_generate_np_targeted_gives_adversarial_example(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        feed_labs = np.zeros((100, 2))\n        feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1\n        x_adv = self.attack.generate_np(\n            x_val,\n            max_iterations=100,\n            binary_search_steps=3,\n            initial_const=1,\n            clip_min=-5,\n            clip_max=5,\n            batch_size=100,\n            y_target=feed_labs,\n        )\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(np.argmax(feed_labs, axis=1) == new_labs) > 0.9)\n\n    def test_generate_gives_adversarial_example(self):\n\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        feed_labs = np.zeros((100, 2))\n        feed_labs[np.arange(100), orig_labs] = 1\n        x = tf.placeholder(tf.float32, x_val.shape)\n        y = tf.placeholder(tf.float32, feed_labs.shape)\n\n        x_adv_p = self.attack.generate(\n            x,\n            max_iterations=100,\n            binary_search_steps=3,\n            initial_const=1,\n            clip_min=-5,\n            clip_max=5,\n            batch_size=100,\n            y=y,\n        )\n        self.assertEqual(x_val.shape, x_adv_p.shape)\n        x_adv = self.sess.run(x_adv_p, {x: x_val, y: feed_labs})\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(orig_labs == new_labs) < 0.1)\n\n    def test_generate_np_gives_clipped_adversarial_examples(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val,\n            max_iterations=10,\n            binary_search_steps=1,\n            learning_rate=1e-3,\n            initial_const=1,\n            clip_min=-0.2,\n            clip_max=0.3,\n            batch_size=100,\n        )\n\n        self.assertTrue(-0.201 < np.min(x_adv))\n        self.assertTrue(np.max(x_adv) < 0.301)\n\n    def test_generate_np_high_confidence_targeted_examples(self):\n\n        trivial_model = TrivialModel()\n\n        for CONFIDENCE in [0, 2.3]:\n            x_val = np.random.rand(10, 1) - 0.5\n            x_val = np.array(x_val, dtype=np.float32)\n\n            feed_labs = np.zeros((10, 2))\n            feed_labs[np.arange(10), np.random.randint(0, 2, 10)] = 1\n            attack = CarliniWagnerL2(trivial_model, sess=self.sess)\n            x_adv = attack.generate_np(\n                x_val,\n                max_iterations=100,\n                binary_search_steps=2,\n                learning_rate=1e-2,\n                initial_const=1,\n                clip_min=-10,\n                clip_max=10,\n                confidence=CONFIDENCE,\n                y_target=feed_labs,\n                batch_size=10,\n            )\n\n            new_labs = self.sess.run(trivial_model.get_logits(x_adv))\n\n            good_labs = new_labs[np.arange(10), np.argmax(feed_labs, axis=1)]\n            bad_labs = new_labs[np.arange(10), 1 - np.argmax(feed_labs, axis=1)]\n\n            self.assertClose(CONFIDENCE, np.min(good_labs - bad_labs), atol=1e-1)\n            self.assertTrue(\n                np.mean(np.argmax(new_labs, axis=1) == np.argmax(feed_labs, axis=1))\n                > 0.9\n            )\n\n    def test_generate_np_high_confidence_untargeted_examples(self):\n\n        trivial_model = TrivialModel()\n\n        for CONFIDENCE in [0, 2.3]:\n            x_val = np.random.rand(10, 1) - 0.5\n            x_val = np.array(x_val, dtype=np.float32)\n\n            orig_labs = np.argmax(\n                self.sess.run(trivial_model.get_logits(x_val)), axis=1\n            )\n            attack = CarliniWagnerL2(trivial_model, sess=self.sess)\n            x_adv = attack.generate_np(\n                x_val,\n                max_iterations=100,\n                binary_search_steps=2,\n                learning_rate=1e-2,\n                initial_const=1,\n                clip_min=-10,\n                clip_max=10,\n                confidence=CONFIDENCE,\n                batch_size=10,\n            )\n\n            new_labs = self.sess.run(trivial_model.get_logits(x_adv))\n\n            good_labs = new_labs[np.arange(10), 1 - orig_labs]\n            bad_labs = new_labs[np.arange(10), orig_labs]\n\n            self.assertTrue(np.mean(np.argmax(new_labs, axis=1) == orig_labs) == 0)\n            self.assertTrue(\n                np.isclose(0, np.min(good_labs - (bad_labs + CONFIDENCE)), atol=1e-1)\n            )\n\n\nclass TestElasticNetMethod(CleverHansTest):\n    def setUp(self):\n        super(TestElasticNetMethod, self).setUp()\n\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n        self.attack = ElasticNetMethod(self.model, sess=self.sess)\n\n    def test_generate_np_untargeted_gives_adversarial_example(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val,\n            max_iterations=100,\n            binary_search_steps=3,\n            initial_const=1,\n            clip_min=-5,\n            clip_max=5,\n            batch_size=10,\n        )\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(orig_labs == new_labs) < 0.1)\n\n    def test_generate_np_targeted_gives_adversarial_example(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        feed_labs = np.zeros((100, 2))\n        feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1\n        x_adv = self.attack.generate_np(\n            x_val,\n            max_iterations=100,\n            binary_search_steps=3,\n            initial_const=1,\n            clip_min=-5,\n            clip_max=5,\n            batch_size=100,\n            y_target=feed_labs,\n        )\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(np.argmax(feed_labs, axis=1) == new_labs) > 0.9)\n\n    def test_generate_gives_adversarial_example(self):\n\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        feed_labs = np.zeros((100, 2))\n        feed_labs[np.arange(100), orig_labs] = 1\n        x = tf.placeholder(tf.float32, x_val.shape)\n        y = tf.placeholder(tf.float32, feed_labs.shape)\n\n        x_adv_p = self.attack.generate(\n            x,\n            max_iterations=100,\n            binary_search_steps=3,\n            initial_const=1,\n            clip_min=-5,\n            clip_max=5,\n            batch_size=100,\n            y=y,\n        )\n        self.assertEqual(x_val.shape, x_adv_p.shape)\n        x_adv = self.sess.run(x_adv_p, {x: x_val, y: feed_labs})\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(orig_labs == new_labs) < 0.1)\n\n    def test_generate_np_gives_clipped_adversarial_examples(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val,\n            max_iterations=10,\n            binary_search_steps=1,\n            learning_rate=1e-3,\n            initial_const=1,\n            clip_min=-0.2,\n            clip_max=0.3,\n            batch_size=100,\n        )\n\n        self.assertTrue(-0.201 < np.min(x_adv))\n        self.assertTrue(np.max(x_adv) < 0.301)\n\n    def test_generate_np_high_confidence_targeted_examples(self):\n\n        trivial_model = TrivialModel()\n\n        for CONFIDENCE in [0, 2.3]:\n            x_val = np.random.rand(10, 1) - 0.5\n            x_val = np.array(x_val, dtype=np.float32)\n\n            feed_labs = np.zeros((10, 2))\n            feed_labs[np.arange(10), np.random.randint(0, 2, 10)] = 1\n            attack = CarliniWagnerL2(trivial_model, sess=self.sess)\n            x_adv = attack.generate_np(\n                x_val,\n                max_iterations=100,\n                binary_search_steps=2,\n                learning_rate=1e-2,\n                initial_const=1,\n                clip_min=-10,\n                clip_max=10,\n                confidence=CONFIDENCE,\n                y_target=feed_labs,\n                batch_size=10,\n            )\n\n            new_labs = self.sess.run(trivial_model.get_logits(x_adv))\n\n            good_labs = new_labs[np.arange(10), np.argmax(feed_labs, axis=1)]\n            bad_labs = new_labs[np.arange(10), 1 - np.argmax(feed_labs, axis=1)]\n\n            self.assertTrue(\n                np.isclose(0, np.min(good_labs - (bad_labs + CONFIDENCE)), atol=1e-1)\n            )\n            self.assertTrue(\n                np.mean(np.argmax(new_labs, axis=1) == np.argmax(feed_labs, axis=1))\n                > 0.9\n            )\n\n    def test_generate_np_high_confidence_untargeted_examples(self):\n\n        trivial_model = TrivialModel()\n\n        for CONFIDENCE in [0, 2.3]:\n            x_val = np.random.rand(10, 1) - 0.5\n            x_val = np.array(x_val, dtype=np.float32)\n\n            orig_labs = np.argmax(\n                self.sess.run(trivial_model.get_logits(x_val)), axis=1\n            )\n            attack = CarliniWagnerL2(trivial_model, sess=self.sess)\n            x_adv = attack.generate_np(\n                x_val,\n                max_iterations=100,\n                binary_search_steps=2,\n                learning_rate=1e-2,\n                initial_const=1,\n                clip_min=-10,\n                clip_max=10,\n                confidence=CONFIDENCE,\n                batch_size=10,\n            )\n\n            new_labs = self.sess.run(trivial_model.get_logits(x_adv))\n\n            good_labs = new_labs[np.arange(10), 1 - orig_labs]\n            bad_labs = new_labs[np.arange(10), orig_labs]\n\n            self.assertTrue(np.mean(np.argmax(new_labs, axis=1) == orig_labs) == 0)\n            self.assertTrue(\n                np.isclose(0, np.min(good_labs - (bad_labs + CONFIDENCE)), atol=1e-1)\n            )\n\n\nclass TestSaliencyMapMethod(CleverHansTest):\n    def setUp(self):\n        super(TestSaliencyMapMethod, self).setUp()\n\n        self.sess = tf.Session()\n        self.sess.as_default()\n        self.model = DummyModel()\n        self.attack = SaliencyMapMethod(self.model, sess=self.sess)\n\n        # initialize model\n        with tf.name_scope(\"dummy_model\"):\n            self.model.get_logits(tf.placeholder(tf.float32, shape=(None, 1000)))\n        self.sess.run(tf.global_variables_initializer())\n\n        self.attack = SaliencyMapMethod(self.model, sess=self.sess)\n\n    def test_generate_np_targeted_gives_adversarial_example(self):\n        x_val = np.random.rand(10, 1000)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        feed_labs = np.zeros((10, 10))\n        feed_labs[np.arange(10), np.random.randint(0, 9, 10)] = 1\n        x_adv = self.attack.generate_np(\n            x_val, clip_min=-5.0, clip_max=5.0, y_target=feed_labs\n        )\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        worked = np.mean(np.argmax(feed_labs, axis=1) == new_labs)\n        self.assertTrue(worked > 0.9)\n\n\nclass TestDeepFool(CleverHansTest):\n    def setUp(self):\n        super(TestDeepFool, self).setUp()\n\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n        self.attack = DeepFool(self.model, sess=self.sess)\n\n    def test_generate_np_gives_adversarial_example(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val, overshoot=0.02, max_iter=50, nb_candidate=2, clip_min=-5, clip_max=5\n        )\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(orig_labs == new_labs) < 0.1)\n\n    def test_generate_gives_adversarial_example(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        x = tf.placeholder(tf.float32, x_val.shape)\n\n        x_adv_p = self.attack.generate(\n            x, overshoot=0.02, max_iter=50, nb_candidate=2, clip_min=-5, clip_max=5\n        )\n        self.assertEqual(x_val.shape, x_adv_p.shape)\n        x_adv = self.sess.run(x_adv_p, {x: x_val})\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(orig_labs == new_labs) < 0.1)\n\n    def test_generate_np_gives_clipped_adversarial_examples(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        x_adv = self.attack.generate_np(\n            x_val,\n            overshoot=0.02,\n            max_iter=50,\n            nb_candidate=2,\n            clip_min=-0.2,\n            clip_max=0.3,\n        )\n\n        self.assertTrue(-0.201 < np.min(x_adv))\n        self.assertTrue(np.max(x_adv) < 0.301)\n\n\nclass TestMomentumIterativeMethod(TestProjectedGradientDescent):\n    def setUp(self):\n        super(TestMomentumIterativeMethod, self).setUp()\n\n        self.attack = MomentumIterativeMethod(self.model, sess=self.sess)\n\n    def test_generate_np_can_be_called_with_different_decay_factor(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        for decay_factor in [0.0, 0.5, 1.0]:\n            x_adv = self.attack.generate_np(\n                x_val,\n                eps=0.5,\n                ord=np.inf,\n                decay_factor=decay_factor,\n                clip_min=-5.0,\n                clip_max=5.0,\n            )\n\n            delta = np.max(np.abs(x_adv - x_val), axis=1)\n            self.assertClose(delta, 0.5)\n\n    def test_multiple_initial_random_step(self):\n        # There is no initial random step, so nothing to test here\n        pass\n\n\nclass TestMadryEtAl(CleverHansTest):\n    def setUp(self):\n        super(TestMadryEtAl, self).setUp()\n        self.model = DummyModel(\"madryetal_dummy_model\")\n        self.sess = tf.Session()\n\n    def test_attack_can_be_constructed(self):\n        # The test passes if this does not raise an exception\n        self.attack = MadryEtAl(self.model, sess=self.sess)\n\n\nclass TestBasicIterativeMethod(CleverHansTest):\n    def setUp(self):\n        super(TestBasicIterativeMethod, self).setUp()\n        self.model = DummyModel(\"bim_dummy_model\")\n        self.sess = tf.Session()\n\n    def test_attack_can_be_constructed(self):\n        # The test passes if this raises no exceptions\n        self.attack = BasicIterativeMethod(self.model, sess=self.sess)\n\n\nclass TestFastFeatureAdversaries(CleverHansTest):\n    def setUp(self):\n        super(TestFastFeatureAdversaries, self).setUp()\n\n        def make_imagenet_cnn(input_shape=(None, 224, 224, 3)):\n            \"\"\"\n            Similar CNN to AlexNet.\n            \"\"\"\n\n            class ModelImageNetCNN(Model):\n                def __init__(self, scope, nb_classes=1000, **kwargs):\n                    del kwargs\n                    Model.__init__(self, scope, nb_classes, locals())\n\n                def fprop(self, x, **kwargs):\n                    del kwargs\n                    my_conv = functools.partial(\n                        tf.layers.conv2d,\n                        kernel_size=3,\n                        strides=2,\n                        padding=\"valid\",\n                        activation=tf.nn.relu,\n                        kernel_initializer=HeReLuNormalInitializer,\n                    )\n                    my_dense = functools.partial(\n                        tf.layers.dense, kernel_initializer=HeReLuNormalInitializer\n                    )\n                    with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n                        for depth in [96, 256, 384, 384, 256]:\n                            x = my_conv(x, depth)\n                        y = tf.layers.flatten(x)\n                        y = my_dense(y, 4096, tf.nn.relu)\n                        y = fc7 = my_dense(y, 4096, tf.nn.relu)\n                        y = my_dense(y, 1000)\n                        return {\n                            \"fc7\": fc7,\n                            self.O_LOGITS: y,\n                            self.O_PROBS: tf.nn.softmax(logits=y),\n                        }\n\n            return ModelImageNetCNN(\"imagenet\")\n\n        self.input_shape = [10, 224, 224, 3]\n        self.sess = tf.Session()\n        self.model = make_imagenet_cnn(self.input_shape)\n        self.attack = FastFeatureAdversaries(self.model, sess=self.sess)\n\n    def test_attack_strength(self):\n        \"\"\"\n        This test generates a random source and guide and feeds them in a\n        randomly initialized CNN. Checks if an adversarial example can get\n        at least 50% closer to the guide compared to the original distance of\n        the source and the guide.\n        \"\"\"\n        tf.set_random_seed(1234)\n        input_shape = self.input_shape\n        x_src = tf.abs(tf.random_uniform(input_shape, 0.0, 1.0))\n        x_guide = tf.abs(tf.random_uniform(input_shape, 0.0, 1.0))\n\n        layer = \"fc7\"\n        attack_params = {\n            \"eps\": 5.0 / 256,\n            \"clip_min\": 0.0,\n            \"clip_max\": 1.0,\n            \"nb_iter\": 10,\n            \"eps_iter\": 0.005,\n            \"layer\": layer,\n        }\n        x_adv = self.attack.generate(x_src, x_guide, **attack_params)\n        h_adv = self.model.fprop(x_adv)[layer]\n        h_src = self.model.fprop(x_src)[layer]\n        h_guide = self.model.fprop(x_guide)[layer]\n\n        init = tf.global_variables_initializer()\n        self.sess.run(init)\n\n        ha, hs, hg, _xa, _xs, _xg = self.sess.run(\n            [h_adv, h_src, h_guide, x_adv, x_src, x_guide]\n        )\n        d_as = np.sqrt(((hs - ha) * (hs - ha)).sum())\n        d_ag = np.sqrt(((hg - ha) * (hg - ha)).sum())\n        d_sg = np.sqrt(((hg - hs) * (hg - hs)).sum())\n        print(\n            \"L2 distance between source and adversarial example `%s`: %.4f\"\n            % (layer, d_as)\n        )\n        print(\n            \"L2 distance between guide and adversarial example `%s`: %.4f\"\n            % (layer, d_ag)\n        )\n        print(\"L2 distance between source and guide `%s`: %.4f\" % (layer, d_sg))\n        print(\"d_ag/d_sg*100 `%s`: %.4f\" % (layer, d_ag * 100 / d_sg))\n        self.assertTrue(d_ag * 100 / d_sg < 50.0)\n\n\nclass TestLBFGS(CleverHansTest):\n    def setUp(self):\n        super(TestLBFGS, self).setUp()\n\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n        self.attack = LBFGS(self.model, sess=self.sess)\n\n    def test_generate_np_targeted_gives_adversarial_example(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        feed_labs = np.zeros((100, 2))\n        feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1\n        x_adv = self.attack.generate_np(\n            x_val,\n            max_iterations=100,\n            binary_search_steps=3,\n            initial_const=1,\n            clip_min=-5,\n            clip_max=5,\n            batch_size=100,\n            y_target=feed_labs,\n        )\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(np.argmax(feed_labs, axis=1) == new_labs) > 0.9)\n\n    def test_generate_targeted_gives_adversarial_example(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        feed_labs = np.zeros((100, 2))\n        feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1\n        x = tf.placeholder(tf.float32, x_val.shape)\n        y = tf.placeholder(tf.float32, feed_labs.shape)\n\n        x_adv_p = self.attack.generate(\n            x,\n            max_iterations=100,\n            binary_search_steps=3,\n            initial_const=1,\n            clip_min=-5,\n            clip_max=5,\n            batch_size=100,\n            y_target=y,\n        )\n        self.assertEqual(x_val.shape, x_adv_p.shape)\n        x_adv = self.sess.run(x_adv_p, {x: x_val, y: feed_labs})\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(np.argmax(feed_labs, axis=1) == new_labs) > 0.9)\n\n    def test_generate_np_gives_clipped_adversarial_examples(self):\n        x_val = np.random.rand(100, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        feed_labs = np.zeros((100, 2))\n        feed_labs[np.arange(100), np.random.randint(0, 1, 100)] = 1\n        x_adv = self.attack.generate_np(\n            x_val,\n            max_iterations=10,\n            binary_search_steps=1,\n            initial_const=1,\n            clip_min=-0.2,\n            clip_max=0.3,\n            batch_size=100,\n            y_target=feed_labs,\n        )\n\n        self.assertTrue(-0.201 < np.min(x_adv))\n        self.assertTrue(np.max(x_adv) < 0.301)\n\n\nclass SimpleSpatialBrightPixelModel(Model):\n    \"\"\"\n    If there is a bright pixel in the image returns the first class.\n    Otherwise returns the second class. Spatial attack should push the\n    bright pixels off of the image.\n    \"\"\"\n\n    def __init__(self, scope=\"simple_spatial\", nb_classes=2, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n\n        flat_x = slim.flatten(x)\n        first_logit = tf.reduce_max(flat_x, axis=1)\n        second_logit = tf.ones_like(first_logit) * 0.5\n        res = tf.stack([second_logit, first_logit], axis=1)\n        return {self.O_LOGITS: res, self.O_PROBS: tf.nn.softmax(res)}\n\n\n@unittest.skipIf(\n    [int(v) for v in tf.__version__.split(\".\")[:2]] < [1, 6],\n    \"SpatialAttack requires tf 1.6 or higher\",\n)\nclass TestSpatialTransformationMethod(CleverHansTest):\n    \"\"\"Tests for SpatialTransformationMethod\"\"\"\n\n    def setUp(self):\n        \"\"\"\n        Allocate session, model, and attack + initialize tf Variables\n        \"\"\"\n        super(TestSpatialTransformationMethod, self).setUp()\n\n        self.sess = tf.Session()\n        self.model = SimpleSpatialBrightPixelModel()\n        self.attack = SpatialTransformationMethod(self.model, sess=self.sess)\n\n        # initialize model\n        with tf.name_scope(\"dummy_model_spatial\"):\n            self.model.get_logits(tf.placeholder(tf.float32, shape=(None, 2, 2, 1)))\n        self.sess.run(tf.global_variables_initializer())\n\n    def test_no_transformation(self):\n        \"\"\"Test that setting transformation params to 0. is a no-op\"\"\"\n        x_val = np.random.rand(100, 2, 2, 1)\n        x_val = np.array(x_val, dtype=np.float32)\n        x = tf.placeholder(tf.float32, shape=(None, 2, 2, 1))\n\n        x_adv_p = self.attack.generate(\n            x,\n            batch_size=100,\n            dx_min=0.0,\n            dx_max=0.0,\n            n_dxs=1,\n            dy_min=0.0,\n            dy_max=0.0,\n            n_dys=1,\n            angle_min=0,\n            angle_max=0,\n            n_angles=1,\n        )\n        x_adv = self.sess.run(x_adv_p, {x: x_val})\n        self.assertClose(x_adv, x_val)\n\n    def test_push_pixels_off_image(self):\n        \"\"\"Test that the attack pushes some pixels off the image\"\"\"\n        x_val = np.random.rand(100, 2, 2, 1)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # The correct answer is that they are bright\n        # So the attack must push the pixels off the edge\n        y = np.zeros([100, 2])\n        y[:, 0] = 1.0\n\n        x = tf.placeholder(tf.float32, shape=(None, 2, 2, 1))\n        x_adv_p = self.attack.generate(\n            x,\n            y=y,\n            batch_size=100,\n            dx_min=-0.5,\n            dx_max=0.5,\n            n_dxs=3,\n            dy_min=-0.5,\n            dy_max=0.5,\n            n_dys=3,\n            angle_min=0,\n            angle_max=0,\n            n_angles=1,\n        )\n        x_adv = self.sess.run(x_adv_p, {x: x_val})\n\n        old_labs = np.argmax(y, axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        print(np.mean(old_labs == new_labs))\n        self.assertTrue(np.mean(old_labs == new_labs) < 0.3)\n\n    def test_keep_pixels_on_image(self):\n        \"\"\"Test that the attack does not push some pixels off the image\"\"\"\n        x_val = np.random.rand(100, 2, 2, 1)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        # The correct answer is that they are NOT bright\n        # So the attack must NOT push the pixels off the edge\n        y = np.zeros([100, 2])\n        y[:, 0] = 1.0\n\n        x = tf.placeholder(tf.float32, shape=(None, 2, 2, 1))\n        x_adv_p = self.attack.generate(\n            x,\n            y=y,\n            batch_size=100,\n            dx_min=-0.5,\n            dx_max=0.5,\n            n_dxs=3,\n            dy_min=-0.5,\n            dy_max=0.5,\n            n_dys=3,\n            angle_min=0,\n            angle_max=0,\n            n_angles=1,\n        )\n        x_adv = self.sess.run(x_adv_p, {x: x_val})\n\n        old_labs = np.argmax(y, axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        print(np.mean(old_labs == new_labs))\n        self.assertTrue(np.mean(old_labs == new_labs) < 0.3)\n\n\nclass TestHopSkipJumpAttack(CleverHansTest):\n    \"\"\"Tests for Test HopSkipJumpAttack\"\"\"\n\n    def setUp(self):\n        super(TestHopSkipJumpAttack, self).setUp()\n\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n        self.attack = HopSkipJumpAttack(self.model, sess=self.sess)\n\n    def test_generate_np_untargeted_l2(self):\n        x_val = np.random.rand(50, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n        bapp_params = {\n            \"constraint\": \"l2\",\n            \"stepsize_search\": \"geometric_progression\",\n            \"num_iterations\": 10,\n            \"verbose\": True,\n        }\n        x_adv = self.attack.generate_np(x_val, **bapp_params)\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(orig_labs == new_labs) < 0.1)\n\n    def test_generate_untargeted_linf(self):\n\n        x_val = np.random.rand(50, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n\n        # Requires input to have batchsize 1.\n        x = tf.placeholder(tf.float32, [1, 2])\n\n        bapp_params = {\n            \"constraint\": \"linf\",\n            \"stepsize_search\": \"grid_search\",\n            \"num_iterations\": 10,\n            \"verbose\": True,\n        }\n        x_adv_p = self.attack.generate(x, **bapp_params)\n\n        self.assertEqual(x_adv_p.shape, [1, 2])\n        x_adv = []\n        for single_x_val in x_val:\n            single_x_adv = self.sess.run(x_adv_p, {x: np.expand_dims(single_x_val, 0)})\n            x_adv.append(single_x_adv)\n\n        x_adv = np.concatenate(x_adv, axis=0)\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(orig_labs == new_labs) < 0.1)\n\n    def test_generate_np_targeted_linf(self):\n        x_val = np.random.rand(200, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        x_val_pos = x_val[orig_labs == 1]\n        x_val_neg = x_val[orig_labs == 0]\n\n        x_val_under_attack = np.concatenate((x_val_pos[:25], x_val_neg[:25]), axis=0)\n        y_target = np.eye(2)[np.concatenate((np.zeros(25), np.ones(25))).astype(int)]\n        image_target = np.concatenate((x_val_neg[25:50], x_val_pos[25:50]), axis=0)\n\n        bapp_params = {\n            \"constraint\": \"linf\",\n            \"stepsize_search\": \"geometric_progression\",\n            \"num_iterations\": 10,\n            \"verbose\": True,\n            \"y_target\": y_target,\n            \"image_target\": image_target,\n        }\n        x_adv = self.attack.generate_np(x_val_under_attack, **bapp_params)\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n\n        self.assertTrue(np.mean(np.argmax(y_target, axis=1) == new_labs) > 0.9)\n\n    def test_generate_targeted_l2(self):\n\n        # Create data in numpy arrays.\n        x_val = np.random.rand(200, 2)\n        x_val = np.array(x_val, dtype=np.float32)\n        orig_labs = np.argmax(self.sess.run(self.model.get_logits(x_val)), axis=1)\n        x_val_pos = x_val[orig_labs == 1]\n        x_val_neg = x_val[orig_labs == 0]\n        x_val_under_attack = np.concatenate((x_val_pos[:25], x_val_neg[:25]), axis=0)\n        y_target = np.eye(2)[np.concatenate((np.zeros(25), np.ones(25))).astype(int)]\n        image_target = np.concatenate((x_val_neg[25:50], x_val_pos[25:50]), axis=0)\n\n        # Create placeholders.\n        # Require input has batchsize 1.\n        x = tf.placeholder(tf.float32, [1, 2])\n        y_target_ph = tf.placeholder(tf.float32, [1, 2])\n        image_target_ph = tf.placeholder(tf.float32, [1, 2])\n\n        # Create graph.\n        bapp_params = {\n            \"constraint\": \"l2\",\n            \"stepsize_search\": \"grid_search\",\n            \"num_iterations\": 10,\n            \"verbose\": True,\n            \"y_target\": y_target_ph,\n            \"image_target\": image_target_ph,\n        }\n        x_adv_p = self.attack.generate(x, **bapp_params)\n        self.assertEqual(x_adv_p.shape, [1, 2])\n\n        # Generate adversarial examples.\n        x_adv = []\n        for i, single_x_val in enumerate(x_val_under_attack):\n            print(image_target.shape, y_target.shape)\n            single_x_adv = self.sess.run(\n                x_adv_p,\n                {\n                    x: np.expand_dims(single_x_val, 0),\n                    y_target_ph: np.expand_dims(y_target[i], 0),\n                    image_target_ph: np.expand_dims(image_target[i], 0),\n                },\n            )\n            x_adv.append(single_x_adv)\n        x_adv = np.concatenate(x_adv, axis=0)\n\n        new_labs = np.argmax(self.sess.run(self.model.get_logits(x_adv)), axis=1)\n        self.assertTrue(np.mean(np.argmax(y_target, axis=1) == new_labs) > 0.9)\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_attacks_tf.py",
    "content": "\"\"\"Tests of cleverhans.attacks_tf\n\n\"\"\"\n# pylint: disable=missing-docstring\nfrom functools import partial\nimport unittest\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.devtools.checks import CleverHansTest\nfrom cleverhans.attacks_tf import (\n    fgm,\n    pgd_attack,\n    UnrolledAdam,\n    UnrolledGradientDescent,\n    parallel_apply_transformations,\n)\nfrom cleverhans.devtools.mocks import random_feed_dict\nfrom cleverhans.model import Model\n\n\nclass SimpleModel(Model):\n    \"\"\"\n    A very simple neural network\n    \"\"\"\n\n    def __init__(self, scope=\"simple\", nb_classes=2, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            w1 = tf.constant([[1.5, 0.3], [-2, 0.3]], dtype=tf.as_dtype(x.dtype))\n            w2 = tf.constant([[-2.4, 1.2], [0.5, -2.3]], dtype=tf.as_dtype(x.dtype))\n        h1 = tf.nn.sigmoid(tf.matmul(x, w1))\n        res = tf.matmul(h1, w2)\n        return {self.O_LOGITS: res, self.O_PROBS: tf.nn.softmax(res)}\n\n\nclass TestAttackTF(CleverHansTest):\n    def setUp(self):\n        super(TestAttackTF, self).setUp()\n        self.sess = tf.Session()\n        self.model = SimpleModel()\n\n    def test_fgm_gradient_max(self):\n        input_dim = 2\n        nb_classes = 3\n        batch_size = 4\n        rng = np.random.RandomState([2017, 8, 23])\n        x = tf.placeholder(tf.float32, [batch_size, input_dim])\n        weights = tf.placeholder(tf.float32, [input_dim, nb_classes])\n        logits = tf.matmul(x, weights)\n        probs = tf.nn.softmax(logits)\n        adv_x = fgm(x, probs)\n        random_example = rng.randint(batch_size)\n        random_feature = rng.randint(input_dim)\n        output = tf.slice(adv_x, [random_example, random_feature], [1, 1])\n        (dx,) = tf.gradients(output, x)\n        # The following line catches GitHub issue #243\n        self.assertIsNotNone(dx)\n        dx = self.sess.run(dx, feed_dict=random_feed_dict(rng, [x, weights]))\n        ground_truth = np.zeros((batch_size, input_dim))\n        ground_truth[random_example, random_feature] = 1.0\n        self.assertClose(dx, ground_truth)\n\n    def helper_pgd_attack(\n        self,\n        unrolled_optimizer,\n        targeted,\n        nb_iters=20,\n        epsilon=0.5,\n        clip_min=-5.0,\n        clip_max=5.0,\n        assert_threshold=0.5,\n    ):\n        def loss_fn(input_image, label, targeted):\n            res = self.model.fprop(input_image)\n            logits = res[self.model.O_LOGITS]\n            multiplier = 1.0 if targeted else -1.0\n            return multiplier * tf.nn.sparse_softmax_cross_entropy_with_logits(\n                labels=label, logits=logits\n            )\n\n        x_val_ph = tf.placeholder(tf.float32, shape=[100, 2])\n        x_val = np.random.randn(100, 2).astype(np.float32)\n        init_model_output = self.model.fprop(x_val_ph)\n        init_model_logits = init_model_output[self.model.O_LOGITS]\n        if targeted:\n            labels = np.random.random_integers(0, 1, size=(100,))\n        else:\n\n            labels = tf.stop_gradient(tf.argmax(init_model_logits, axis=1))\n\n        def _project_perturbation(\n            perturbation, epsilon, input_image, clip_min, clip_max\n        ):\n            clipped_perturbation = tf.clip_by_value(perturbation, -epsilon, epsilon)\n            new_image = tf.clip_by_value(\n                input_image + clipped_perturbation, clip_min, clip_max\n            )\n            return new_image - input_image\n\n        x_adv = pgd_attack(\n            loss_fn=partial(loss_fn, targeted=targeted),\n            input_image=x_val_ph,\n            label=labels,\n            epsilon=epsilon,\n            num_steps=nb_iters,\n            optimizer=unrolled_optimizer,\n            project_perturbation=_project_perturbation,\n            clip_min=clip_min,\n            clip_max=clip_max,\n        )\n\n        final_model_output = self.model.fprop(x_adv)\n        final_model_logits = final_model_output[self.model.O_LOGITS]\n\n        if not targeted:\n            logits1, logits2 = self.sess.run(\n                [init_model_logits, final_model_logits], feed_dict={x_val_ph: x_val}\n            )\n            preds1 = np.argmax(logits1, axis=1)\n            preds2 = np.argmax(logits2, axis=1)\n\n            self.assertTrue(\n                np.mean(preds1 == preds2) < assert_threshold, np.mean(preds1 == preds2)\n            )\n\n        else:\n            logits_adv = self.sess.run(final_model_logits, feed_dict={x_val_ph: x_val})\n            preds_adv = np.argmax(logits_adv, axis=1)\n\n            self.assertTrue(np.mean(labels == preds_adv) > assert_threshold)\n\n    def test_pgd_untargeted_attack_with_adam_optimizer(self):\n        unrolled_optimizer = UnrolledAdam(lr=0.1)\n        self.helper_pgd_attack(\n            unrolled_optimizer=unrolled_optimizer,\n            targeted=False,\n            epsilon=0.5,\n            nb_iters=20,\n            clip_min=-10.0,\n            clip_max=10.0,\n            assert_threshold=0.7,\n        )\n\n    def test_stronger_pgd_untargeted_attack_with_adam_optimizer(self):\n        unrolled_optimizer = UnrolledAdam(lr=0.1)\n        self.helper_pgd_attack(\n            unrolled_optimizer=unrolled_optimizer,\n            targeted=False,\n            epsilon=5.0,\n            nb_iters=100,\n            clip_min=-10.0,\n            clip_max=10.0,\n            assert_threshold=0.1,\n        )\n\n    def test_pgd_targeted_attack_with_adam_optimizer(self):\n        unrolled_optimizer = UnrolledAdam(lr=0.1)\n        self.helper_pgd_attack(\n            unrolled_optimizer=unrolled_optimizer,\n            targeted=True,\n            epsilon=0.5,\n            nb_iters=20,\n            clip_min=-10.0,\n            clip_max=10.0,\n            assert_threshold=0.7,\n        )\n\n    def test_stronger_pgd_targeted_attack_with_adam_optimizer(self):\n        unrolled_optimizer = UnrolledAdam(lr=0.1)\n        self.helper_pgd_attack(\n            unrolled_optimizer=unrolled_optimizer,\n            targeted=True,\n            epsilon=5.0,\n            nb_iters=100,\n            clip_min=-10.0,\n            clip_max=10.0,\n            assert_threshold=0.9,\n        )\n\n    def test_pgd_untargeted_attack_with_sgd_optimizer(self):\n        unrolled_optimizer = UnrolledGradientDescent(lr=1000.0)\n        self.helper_pgd_attack(\n            unrolled_optimizer=unrolled_optimizer,\n            targeted=False,\n            epsilon=0.5,\n            nb_iters=20,\n            clip_min=-10.0,\n            clip_max=10.0,\n            assert_threshold=0.6,\n        )\n\n    def test_stronger_pgd_untargeted_attack_with_sgd_optimizer(self):\n        unrolled_optimizer = UnrolledGradientDescent(lr=1000.0)\n        self.helper_pgd_attack(\n            unrolled_optimizer=unrolled_optimizer,\n            targeted=False,\n            epsilon=5.0,\n            nb_iters=100,\n            clip_min=-10.0,\n            clip_max=10.0,\n            assert_threshold=0.1,\n        )\n\n    def test_pgd_targeted_attack_with_sgd_optimizer(self):\n        unrolled_optimizer = UnrolledGradientDescent(lr=1000.0)\n        self.helper_pgd_attack(\n            unrolled_optimizer=unrolled_optimizer,\n            targeted=True,\n            epsilon=0.5,\n            nb_iters=20,\n            clip_min=-10.0,\n            clip_max=10.0,\n            assert_threshold=0.6,\n        )\n\n    def test_stronger_pgd_targeted_attack_with_sgd_optimizer(self):\n        unrolled_optimizer = UnrolledGradientDescent(lr=1000.0)\n        self.helper_pgd_attack(\n            unrolled_optimizer=unrolled_optimizer,\n            targeted=True,\n            epsilon=5.0,\n            nb_iters=100,\n            clip_min=-10.0,\n            clip_max=10.0,\n            assert_threshold=0.9,\n        )\n\n    @unittest.skip(\"This test requires human inspection of the images\")\n    def test_parallel_apply(self):\n        def _save_image_to_png(image_np, filename):\n            from PIL import Image\n            import os\n\n            dirname = os.path.dirname(filename)\n            if not os.path.exists(dirname):\n                os.makedirs(dirname)\n\n            if image_np.shape[-1] == 3:\n                img = Image.fromarray(np.uint8(image_np * 255.0), \"RGB\")\n            else:\n                img = Image.fromarray(np.uint8(image_np[:, :, 0] * 255.0), \"L\")\n            img.save(filename)\n\n        x = tf.ones([3, 200, 200, 3])\n\n        transforms = [\n            [0.2, 0, 20],\n            [0, 0, 0],\n            # [-0.2, 0, 20],\n            # [-0.4, 0, 20],\n        ]\n        transformed_ims = parallel_apply_transformations(\n            x, transforms, black_border_size=30\n        )\n\n        worst_sample_idx = tf.convert_to_tensor([0, 1, 1])\n        batch_size = tf.shape(x)[0]\n        keys = tf.stack(\n            [tf.range(batch_size, dtype=tf.int32), tf.cast(worst_sample_idx, tf.int32)],\n            axis=1,\n        )\n\n        transformed_ims_bshwc = tf.einsum(\"sbhwc->bshwc\", transformed_ims)\n        after_lookup = tf.gather_nd(transformed_ims_bshwc, keys)  # BHWC\n\n        with tf.Session() as sess:\n            img_batch_np = sess.run(after_lookup)[:, :, :, :]\n\n        for i, img in enumerate(img_batch_np):\n            filename = \"/tmp/test_image%s.png\" % (i)\n            _save_image_to_png(img, filename)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_confidence_report.py",
    "content": "\"\"\"\nTests for cleverhans.confidence_report\n\"\"\"\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks import Noise\nfrom cleverhans.attack_bundling import AttackConfig\nfrom cleverhans.attack_bundling import bundle_attacks\nfrom cleverhans.attack_bundling import Misclassify\nfrom cleverhans.confidence_report import ConfidenceReport\nfrom cleverhans.confidence_report import ConfidenceReportEntry\nfrom cleverhans.confidence_report import make_confidence_report_bundled\nfrom cleverhans.devtools.mocks import SimpleDataset\nfrom cleverhans.picklable_model import MLP, Linear\nfrom cleverhans import serial\n\n\ndef test_confidence_report():\n    \"\"\"\n    Test that we can make a confidence report, put an entry in it, and get\n    that entry back out\n    \"\"\"\n    report = ConfidenceReport()\n    entry = ConfidenceReportEntry(\n        correctness=np.array([True, False]), confidence=np.array([0.9, 0.1])\n    )\n    report[\"clean\"] = entry\n    assert report[\"clean\"] is entry\n\n\ndef test_make_confidence_report_bundled():\n    \"\"\"\n    A very simple test that just makes sure make_confidence_report_bundled can run without crashing\n    \"\"\"\n\n    sess = tf.Session()\n    try:\n        nb_classes = 3\n        nb_features = 2\n        batch_size = 5\n        nb_test_examples = batch_size * 2\n        layer = Linear(num_hid=nb_classes)\n        model = MLP(layers=[layer], input_shape=(None, nb_features))\n        dataset = SimpleDataset(test_end=nb_test_examples, nb_classes=nb_classes)\n        model.dataset_factory = dataset.get_factory()\n        filepath = \".test_model.joblib\"\n        with sess.as_default():\n            sess.run(tf.global_variables_initializer())\n            serial.save(filepath, model)\n\n        def recipe(\n            sess,\n            model,\n            x,\n            y,\n            nb_classes,\n            eps,\n            clip_min,\n            clip_max,\n            eps_iter,\n            nb_iter,\n            report_path,\n            eps_iter_small,\n            batch_size,\n        ):\n            \"\"\"\n            Mock recipe that just runs the Noise attack so the test runs fast\n            \"\"\"\n            attack_configs = [AttackConfig(Noise(model, sess), {\"eps\": eps})]\n            new_work_goal = {config: 1 for config in attack_configs}\n            goals = [Misclassify(new_work_goal=new_work_goal)]\n            bundle_attacks(\n                sess,\n                model,\n                x,\n                y,\n                attack_configs,\n                goals,\n                report_path,\n                attack_batch_size=batch_size,\n                eval_batch_size=batch_size,\n            )\n\n        make_confidence_report_bundled(\n            filepath,\n            test_end=nb_test_examples,\n            recipe=recipe,\n            base_eps=0.1,\n            base_eps_iter=0.01,\n            batch_size=batch_size,\n        )\n    finally:\n        sess.close()\n\n\ndef test_save_load_confidence_report():\n    \"\"\"\n    Test that a confidence report can be loaded and saved.\n    \"\"\"\n    report = ConfidenceReport()\n    num_examples = 2\n    clean_correctness = np.zeros((num_examples,), dtype=np.bool)\n    clean_confidence = np.zeros((num_examples,), dtype=np.float32)\n    adv_correctness = clean_correctness.copy()\n    adv_confidence = clean_confidence.copy()\n    report[\"clean\"] = ConfidenceReportEntry(clean_correctness, clean_confidence)\n    report[\"adv\"] = ConfidenceReportEntry(adv_correctness, adv_confidence)\n    report.completed = True\n    filepath = \".test_confidence_report.joblib\"\n    serial.save(filepath, report)\n    report = serial.load(filepath)\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_dataset.py",
    "content": "\"\"\"Tests for cleverhans.dataset\"\"\"\nfrom cleverhans.dataset import Dataset\nfrom cleverhans.devtools.checks import CleverHansTest\n\n\nclass LightweightDataset(Dataset):\n    \"\"\"\n    A dataset that does not actually load any data so it is cheap to run\n    in tests.\n    \"\"\"\n\n\nclass TestDataset(CleverHansTest):\n    \"\"\"\n    Tests for the Dataset class\n    \"\"\"\n\n    def test_factory(self):\n        \"\"\"test_factory: Test that dataset->factory->dataset preserves type\"\"\"\n        d1 = LightweightDataset()\n        factory = d1.get_factory()\n        d2 = factory()\n        self.assertTrue(type(d1) is type(d2))\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_defenses.py",
    "content": "# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport unittest\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.attacks import FastGradientMethod\nfrom cleverhans.loss import CrossEntropy, MixUp, FeaturePairing\nfrom cleverhans.devtools.checks import CleverHansTest\nfrom cleverhans.model import Model\n\n\nclass SimpleModel(Model):\n    \"\"\"\n    A very simple neural network\n    \"\"\"\n\n    def __init__(self, scope=\"simple\", nb_classes=2, **kwargs):\n        del kwargs\n        Model.__init__(self, scope, nb_classes, locals())\n\n    def fprop(self, x, **kwargs):\n        del kwargs\n        with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE):\n            w1 = tf.constant([[1.5, 0.3], [-2, 0.3]], dtype=tf.as_dtype(x.dtype))\n            w2 = tf.constant([[-2.4, 1.2], [0.5, -2.3]], dtype=tf.as_dtype(x.dtype))\n        h1 = tf.nn.sigmoid(tf.matmul(x, w1))\n        res = tf.matmul(h1, w2)\n        return {\n            self.O_FEATURES: [h1, res],\n            self.O_LOGITS: res,\n            self.O_PROBS: tf.nn.softmax(res),\n        }\n\n\nclass TestDefenses(CleverHansTest):\n    def setUp(self):\n        super(TestDefenses, self).setUp()\n        self.model = SimpleModel()\n        self.vx = np.array(((1, -1), (-1, 1)), \"f\")\n        self.vy = np.array(((1, 0), (0, 1)), \"f\")\n        self.x = tf.placeholder(tf.float32, [None, 2], \"x\")\n        self.y = tf.placeholder(tf.float32, [None, 2], \"y\")\n\n    def test_xe(self):\n        loss = CrossEntropy(self.model, smoothing=0.0)\n        l = loss.fprop(self.x, self.y)\n        with tf.Session() as sess:\n            vl1 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy})\n            vl2 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy})\n        self.assertClose(vl1, sum([2.210599660, 1.53666997]) / 2.0, atol=1e-6)\n        self.assertClose(vl2, sum([2.210599660, 1.53666997]) / 2.0, atol=1e-6)\n\n    def test_xe_smoothing(self):\n        loss = CrossEntropy(self.model, smoothing=0.1)\n        l = loss.fprop(self.x, self.y)\n        with tf.Session() as sess:\n            vl1 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy})\n            vl2 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy})\n        self.assertClose(vl1, sum([2.10587597, 1.47194624]) / 2.0, atol=1e-6)\n        self.assertClose(vl2, sum([2.10587597, 1.47194624]) / 2.0, atol=1e-6)\n\n    def test_mixup(self):\n        def eval_loss(l, count=1000):\n            with tf.Session() as sess:\n                vl = np.zeros(2, \"f\")\n                for _ in range(count):\n                    vl += sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy})\n            return vl / count\n\n        loss = MixUp(self.model, beta=1.0)\n        vl = eval_loss(loss.fprop(self.x, self.y))\n        self.assertClose(vl, [1.23, 1.23], atol=5e-2)\n\n        loss = MixUp(self.model, beta=0.5)\n        vl = eval_loss(loss.fprop(self.x, self.y))\n        self.assertClose(vl, [1.40, 1.40], atol=5e-2)\n\n    def test_feature_pairing(self):\n        sess = tf.Session()\n        fgsm = FastGradientMethod(self.model, sess=sess)\n\n        def attack(x):\n            return fgsm.generate(x)\n\n        loss = FeaturePairing(self.model, weight=0.1, attack=attack)\n        l = loss.fprop(self.x, self.y)\n        vl1 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy})\n        vl2 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy})\n        self.assertClose(vl1, sum([4.296023369, 2.963884830]) / 2.0, atol=1e-6)\n        self.assertClose(vl2, sum([4.296023369, 2.963884830]) / 2.0, atol=1e-6)\n\n        loss = FeaturePairing(self.model, weight=10.0, attack=attack)\n        l = loss.fprop(self.x, self.y)\n        vl1 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy})\n        vl2 = sess.run(l, feed_dict={self.x: self.vx, self.y: self.vy})\n        self.assertClose(vl1, sum([4.333082676, 3.00094414]) / 2.0, atol=1e-6)\n        self.assertClose(vl2, sum([4.333082676, 3.00094414]) / 2.0, atol=1e-6)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_evaluation.py",
    "content": "\"\"\"Tests for cleverhans.evaluation\"\"\"\nfrom cleverhans.devtools.checks import CleverHansTest\nfrom cleverhans.evaluation import _CorrectFactory\nfrom cleverhans.model import Model\n\n\nclass TestEvaluation(CleverHansTest):\n    \"\"\"Tests for cleverhans.evaluation\"\"\"\n\n    def test_cache(self):\n        \"\"\"test_cache: Test that _CorrectFactory can be cached\"\"\"\n        model = Model()\n        factory_1 = _CorrectFactory(model)\n        factory_2 = _CorrectFactory(model)\n        cache = {}\n        cache[factory_1] = True\n        self.assertTrue(factory_2 in cache)\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_mnist_blackbox.py",
    "content": "# pylint: disable=missing-docstring\nimport unittest\nimport numpy as np\n\n# pylint bug on next line\nfrom tensorflow.python.client import device_lib  # pylint: disable=no-name-in-module\nfrom cleverhans.devtools.checks import CleverHansTest\n\nHAS_GPU = \"GPU\" in {x.device_type for x in device_lib.list_local_devices()}\n\n\nclass TestMNISTBlackboxF(CleverHansTest):\n    def test_mnist_blackbox(self):\n        import tensorflow as tf\n        from cleverhans_tutorials import mnist_blackbox\n\n        # Run the MNIST tutorial on a dataset of reduced size, reduced number\n        # of data augmentations, increased substitute holdout for faster runtime.\n        mnist_blackbox_args = {\n            \"train_start\": 0,\n            \"train_end\": 5000,\n            \"test_start\": 0,\n            \"test_end\": 2000,\n            \"data_aug\": 1,\n            \"holdout\": 1000,\n            \"nb_epochs\": 2,\n            \"nb_epochs_s\": 6,\n        }\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report = mnist_blackbox.mnist_blackbox(**mnist_blackbox_args)\n\n        # Check accuracy values contained in the AccuracyReport object\n        self.assertTrue(report[\"bbox\"] > 0.7, report[\"bbox\"])\n        self.assertTrue(report[\"sub\"] > 0.7, report[\"sub\"])\n        self.assertTrue(\n            report[\"bbox_on_sub_adv_ex\"] < 0.3, report[\"bbox_on_sub_adv_ex\"]\n        )\n\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report_2 = mnist_blackbox.mnist_blackbox(**mnist_blackbox_args)\n\n        atol_fac = 1e-2 if HAS_GPU else 1e-6\n        self.assertClose(report[\"bbox\"], report_2[\"bbox\"], atol=atol_fac * 1)\n        self.assertClose(report[\"sub\"], report_2[\"sub\"], atol=atol_fac * 1)\n        self.assertClose(\n            report[\"bbox_on_sub_adv_ex\"],\n            report_2[\"bbox_on_sub_adv_ex\"],\n            atol=atol_fac * 1,\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_cw.py",
    "content": "# pylint: disable=missing-docstring\nimport unittest\nimport numpy as np\nfrom cleverhans.devtools.checks import CleverHansTest\n\n\nclass TestMNISTTutorialCW(CleverHansTest):\n    def test_mnist_tutorial_cw(self):\n        import tensorflow as tf\n        from cleverhans_tutorials import mnist_tutorial_cw\n\n        # Run the MNIST tutorial on a dataset of reduced size\n        # and disable visualization.\n        cw_tutorial_args = {\n            \"train_start\": 0,\n            \"train_end\": 10000,\n            \"test_start\": 0,\n            \"test_end\": 1666,\n            \"viz_enabled\": False,\n        }\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report = mnist_tutorial_cw.mnist_tutorial_cw(**cw_tutorial_args)\n\n        # Check accuracy values contained in the AccuracyReport object\n        self.assertGreater(report.clean_train_clean_eval, 0.85)\n        self.assertEqual(report.clean_train_adv_eval, 0.00)\n\n        # There is no adversarial training in the CW tutorial\n        self.assertEqual(report.adv_train_clean_eval, 0.0)\n        self.assertEqual(report.adv_train_adv_eval, 0.0)\n\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report_2 = mnist_tutorial_cw.mnist_tutorial_cw(**cw_tutorial_args)\n\n        atol_fac = 1e-6\n        self.assertClose(\n            report.train_clean_train_clean_eval,\n            report_2.train_clean_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_clean_train_adv_eval,\n            report_2.train_clean_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_clean_eval,\n            report_2.train_adv_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_adv_eval,\n            report_2.train_adv_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_jsma.py",
    "content": "# pylint: disable=missing-docstring\nimport unittest\nimport numpy as np\nfrom cleverhans.devtools.checks import CleverHansTest\n\n\nclass TestMNISTTutorialJSMA(CleverHansTest):\n    def test_mnist_tutorial_jsma(self):\n\n        import tensorflow as tf\n        from cleverhans_tutorials import mnist_tutorial_jsma\n\n        # Run the MNIST tutorial on a dataset of reduced size\n        # and disable visualization.\n        jsma_tutorial_args = {\n            \"train_start\": 0,\n            \"train_end\": 1000,\n            \"test_start\": 0,\n            \"test_end\": 1666,\n            \"viz_enabled\": False,\n            \"source_samples\": 1,\n            \"nb_epochs\": 2,\n        }\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report = mnist_tutorial_jsma.mnist_tutorial_jsma(**jsma_tutorial_args)\n\n        # Check accuracy values contained in the AccuracyReport object\n        # We already have JSMA tests in test_attacks.py, so just sanity\n        # check the values here.\n        self.assertTrue(report.clean_train_clean_eval > 0.65)\n        self.assertTrue(report.clean_train_adv_eval < 0.25)\n\n        # There is no adversarial training in the JSMA tutorial\n        self.assertTrue(report.adv_train_clean_eval == 0.0)\n        self.assertTrue(report.adv_train_adv_eval == 0.0)\n\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report_2 = mnist_tutorial_jsma.mnist_tutorial_jsma(**jsma_tutorial_args)\n\n        atol_fac = 1e-6\n        self.assertClose(\n            report.train_clean_train_clean_eval,\n            report_2.train_clean_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_clean_train_adv_eval,\n            report_2.train_clean_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_clean_eval,\n            report_2.train_adv_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_adv_eval,\n            report_2.train_adv_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_keras.py",
    "content": "# pylint: disable=missing-docstring\nimport unittest\nimport numpy as np\n\n# pylint bug on next line\nfrom tensorflow.python.client import device_lib  # pylint: disable=no-name-in-module\nfrom cleverhans.devtools.checks import CleverHansTest\n\nHAS_GPU = \"GPU\" in {x.device_type for x in device_lib.list_local_devices()}\n\n\nclass TestMNISTTutorialKeras(CleverHansTest):\n    def test_mnist_tutorial_keras(self):\n\n        import tensorflow as tf\n        from cleverhans_tutorials import mnist_tutorial_keras\n\n        # Run the MNIST tutorial on a dataset of reduced size\n        test_dataset_indices = {\n            \"train_start\": 0,\n            \"train_end\": 5000,\n            \"test_start\": 0,\n            \"test_end\": 333,\n            \"nb_epochs\": 2,\n            \"testing\": True,\n        }\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report = mnist_tutorial_keras.mnist_tutorial(**test_dataset_indices)\n\n        # Check accuracy values contained in the AccuracyReport object\n        self.assertTrue(report.train_clean_train_clean_eval > 0.90)\n        self.assertTrue(report.train_clean_train_adv_eval < 0.05)\n        self.assertTrue(report.train_adv_train_clean_eval > 0.90)\n        self.assertTrue(report.train_adv_train_adv_eval > 0.30)\n\n        atol_fac = 5e-2 if HAS_GPU else 1e-6\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report_2 = mnist_tutorial_keras.mnist_tutorial(**test_dataset_indices)\n\n        self.assertClose(\n            report.train_clean_train_clean_eval,\n            report_2.train_clean_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_clean_train_adv_eval,\n            report_2.train_clean_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_clean_eval,\n            report_2.train_adv_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_adv_eval,\n            report_2.train_adv_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_keras_tf.py",
    "content": "# pylint: disable=missing-docstring\nimport unittest\nimport numpy as np\n\n# pylint bug on next line\nfrom tensorflow.python.client import device_lib  # pylint: disable=no-name-in-module\nfrom cleverhans.devtools.checks import CleverHansTest\n\nHAS_GPU = \"GPU\" in {x.device_type for x in device_lib.list_local_devices()}\n\n\nclass TestMNISTTutorialKerasTF(CleverHansTest):\n    def test_mnist_tutorial_keras_tf(self):\n\n        import tensorflow as tf\n        from cleverhans_tutorials import mnist_tutorial_keras_tf\n\n        # Run the MNIST tutorial on a dataset of reduced size\n        test_dataset_indices = {\n            \"train_start\": 0,\n            \"train_end\": 5000,\n            \"test_start\": 0,\n            \"test_end\": 333,\n            \"nb_epochs\": 3,\n            \"train_dir\": \"/tmp\",\n            \"filename\": \"mnist.ckpt\",\n            \"load_model\": False,\n            \"testing\": True,\n        }\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report = mnist_tutorial_keras_tf.mnist_tutorial(**test_dataset_indices)\n\n        # Check accuracy values contained in the AccuracyReport object\n        self.assertTrue(report.train_clean_train_clean_eval > 0.90)\n        self.assertTrue(report.train_clean_train_adv_eval < 0.05)\n        self.assertTrue(report.train_adv_train_clean_eval > 0.90)\n        self.assertTrue(report.train_adv_train_adv_eval > 0.30)\n\n        atol_fac = 2e-2 if HAS_GPU else 1e-6\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report_2 = mnist_tutorial_keras_tf.mnist_tutorial(**test_dataset_indices)\n\n        self.assertClose(\n            report.train_clean_train_clean_eval,\n            report_2.train_clean_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_clean_train_adv_eval,\n            report_2.train_clean_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_clean_eval,\n            report_2.train_adv_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_adv_eval,\n            report_2.train_adv_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_mnist_tutorial_tf.py",
    "content": "# pylint: disable=missing-docstring\nimport unittest\nimport numpy as np\n\n# pylint bug on next line\nfrom tensorflow.python.client import device_lib  # pylint: disable=no-name-in-module\nfrom cleverhans.devtools.checks import CleverHansTest\n\nHAS_GPU = \"GPU\" in {x.device_type for x in device_lib.list_local_devices()}\n\n\nclass TestMNISTTutorialTF(CleverHansTest):\n    def test_mnist_tutorial_tf(self):\n\n        import tensorflow as tf\n        from cleverhans_tutorials import mnist_tutorial_tf\n\n        # Run the MNIST tutorial on a dataset of reduced size\n        test_dataset_indices = {\n            \"train_start\": 0,\n            \"train_end\": 5000,\n            \"test_start\": 0,\n            \"test_end\": 333,\n            \"nb_epochs\": 2,\n            \"testing\": True,\n        }\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report = mnist_tutorial_tf.mnist_tutorial(\n                num_threads=1, **test_dataset_indices\n            )\n\n        # Check accuracy values contained in the AccuracyReport object\n        self.assertGreater(report.train_clean_train_clean_eval, 0.97)\n        self.assertLess(report.train_clean_train_adv_eval, 0.05)\n        self.assertGreater(report.train_adv_train_clean_eval, 0.93)\n        self.assertGreater(report.train_adv_train_adv_eval, 0.4)\n\n        # Check that the tutorial is deterministic (seeded properly)\n        atol_fac = 2e-2 if HAS_GPU else 1e-6\n        g = tf.Graph()\n        with g.as_default():\n            np.random.seed(42)\n            report_2 = mnist_tutorial_tf.mnist_tutorial(\n                num_threads=1, **test_dataset_indices\n            )\n        self.assertClose(\n            report.train_clean_train_clean_eval,\n            report_2.train_clean_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_clean_train_adv_eval,\n            report_2.train_clean_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_clean_eval,\n            report_2.train_adv_train_clean_eval,\n            atol=atol_fac * 1,\n        )\n        self.assertClose(\n            report.train_adv_train_adv_eval,\n            report_2.train_adv_train_adv_eval,\n            atol=atol_fac * 1,\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_model.py",
    "content": "\"\"\"\nTests for cleverhans.model\n\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport unittest\n\nfrom cleverhans.model import Model, CallableModelWrapper\n\n\nclass TestModelClass(unittest.TestCase):\n    \"\"\"\n    Tests for cleverhans.model.Model\n    \"\"\"\n\n    # pylint: disable=missing-docstring\n\n    def test_get_logits(self):\n        # Define empty model\n        model = Model(\"model\", 10, {})\n        x = []\n\n        # Exception is thrown when `get_logits` not implemented\n        with self.assertRaises(Exception) as context:\n            model.get_logits(x)\n        self.assertTrue(context.exception)\n\n    def test_get_probs(self):\n        # Define empty model\n        model = Model(\"model\", 10, {})\n        x = []\n\n        # Exception is thrown when `get_probs` not implemented\n        with self.assertRaises(Exception) as context:\n            model.get_probs(x)\n        self.assertTrue(context.exception)\n\n    def test_fprop(self):\n        # Define empty model\n        model = Model(\"model\", 10, {})\n        x = []\n\n        # Exception is thrown when `fprop` not implemented\n        with self.assertRaises(Exception) as context:\n            model.fprop(x)\n        self.assertTrue(context.exception)\n\n\nclass TestCallableModelWrapperInitArguments(unittest.TestCase):\n    \"\"\"\n    Tests for CallableModelWrapper's init argument\n    \"\"\"\n\n    def test_output_layer(self):\n        \"\"\"\n        Test that the CallableModelWrapper can be constructed without causing Exceptions\n        \"\"\"\n\n        def model(**kwargs):\n            \"\"\"Mock model\"\"\"\n            del kwargs\n            return True\n\n        # The following two calls should not raise Exceptions\n        CallableModelWrapper(model, \"probs\")\n        CallableModelWrapper(model, \"logits\")\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_picklable_model.py",
    "content": "\"\"\"Tests for cleverhans.picklable_model\"\"\"\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.devtools.checks import CleverHansTest\nfrom cleverhans.picklable_model import Dropout\nfrom cleverhans.picklable_model import MLP\nfrom cleverhans.picklable_model import PerImageStandardize\n\n\nclass TestPerImageStandardize(CleverHansTest):\n    \"\"\"\n    Tests for the PerImageStandardize class.\n    \"\"\"\n\n    def setUp(self):\n        \"\"\"\n        Set up session and build model graph\n        \"\"\"\n        super(TestPerImageStandardize, self).setUp()\n\n        self.input_shape = (128, 32, 32, 3)\n        self.sess = tf.Session()\n        self.model = MLP(\n            input_shape=self.input_shape, layers=[PerImageStandardize(name=\"output\")]\n        )\n\n        self.x = tf.placeholder(shape=self.input_shape, dtype=tf.float32)\n        self.y = self.model.get_layer(self.x, \"output\")\n\n        self.y_true = tf.map_fn(tf.image.per_image_standardization, self.x)\n\n    def run_and_check_output(self, x):\n        \"\"\"\n        Make sure y and y_true evaluate to the same value\n        \"\"\"\n        y, y_true = self.sess.run([self.y, self.y_true], feed_dict={self.x: x})\n        self.assertClose(y, y_true)\n\n    def test_random_inputs(self):\n        \"\"\"\n        Test on random inputs\n        \"\"\"\n        x = np.random.rand(*self.input_shape)\n        self.run_and_check_output(x)\n\n    def test_ones_inputs(self):\n        \"\"\"\n        Test with input set to all ones.\n        \"\"\"\n        x = np.ones(self.input_shape)\n        self.run_and_check_output(x)\n\n\nclass TestDropout(CleverHansTest):\n    \"\"\"\n    Tests for the Dropout class\n    \"\"\"\n\n    def test_no_drop(self):\n        \"\"\"test_no_drop: Make sure dropout does nothing by default\n        (so it does not cause stochasticity at test time)\"\"\"\n\n        model = MLP(input_shape=[1, 1], layers=[Dropout(name=\"output\")])\n        x = tf.constant([[1]], dtype=tf.float32)\n        y = model.get_layer(x, \"output\")\n        sess = tf.Session()\n        # Do multiple runs because dropout is stochastic\n        for _ in range(10):\n            y_value = sess.run(y)\n            self.assertClose(y_value, 1.0)\n\n    def test_drop(self):\n        \"\"\"test_drop: Make sure dropout is activated successfully\"\"\"\n\n        # We would like to configure the test to deterministically drop,\n        # so that the test does not need to use multiple runs.\n        # However, tf.nn.dropout divides by include_prob, so zero or\n        # infinitesimal include_prob causes NaNs.\n        # 1e-8 does not cause NaNs and shouldn't be a significant source\n        # of test flakiness relative to dependency downloads failing, etc.\n        model = MLP(\n            input_shape=[1, 1], layers=[Dropout(name=\"output\", include_prob=1e-8)]\n        )\n        x = tf.constant([[1]], dtype=tf.float32)\n        y = model.get_layer(x, \"output\", dropout=True)\n        sess = tf.Session()\n        y_value = sess.run(y)\n        # Subject to very rare random failure because include_prob is not exact 0\n        self.assertClose(y_value, 0.0)\n\n    def test_override(self):\n        \"\"\"test_override: Make sure dropout_dict changes dropout probabilities\n        successfully.\"\"\"\n\n        # We would like to configure the test to deterministically drop,\n        # so that the test does not need to use multiple runs.\n        # However, tf.nn.dropout divides by include_prob, so zero or\n        # infinitesimal include_prob causes NaNs.\n        # For this test, random failure to drop will not cause the test to fail.\n        # The stochastic version should not even run if everything is working\n        # right.\n        model = MLP(\n            input_shape=[1, 1], layers=[Dropout(name=\"output\", include_prob=1e-8)]\n        )\n        x = tf.constant([[1]], dtype=tf.float32)\n        dropout_dict = {\"output\": 1.0}\n        y = model.get_layer(x, \"output\", dropout=True, dropout_dict=dropout_dict)\n        sess = tf.Session()\n        y_value = sess.run(y)\n        self.assertClose(y_value, 1.0)\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_projected_gradient_descent.py",
    "content": "\"\"\"Tests for the ProjectGradientDescent attack\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nfrom nose.tools import assert_raises\nimport tensorflow as tf\n\nfrom cleverhans.attacks import ProjectedGradientDescent\nfrom cleverhans.model import Model\n\n\ndef test_no_logits():\n    \"\"\"test_no_logits: Check that a model without logits causes an error\"\"\"\n    batch_size = 2\n    nb_classes = 3\n\n    class NoLogitsModel(Model):\n        \"\"\"\n        A model that neither defines logits nor makes it possible to find logits\n        by inspecting the inputs to a softmax op.\n        \"\"\"\n\n        def fprop(self, x, **kwargs):\n            return {\"probs\": tf.ones((batch_size, nb_classes)) / nb_classes}\n\n    model = NoLogitsModel()\n    sess = tf.Session()\n    attack = ProjectedGradientDescent(model, sess=sess)\n    x = tf.ones((batch_size, 3))\n    assert_raises(NotImplementedError, attack.generate, x)\n\n\ndef test_rejects_callable():\n    \"\"\"test_rejects_callable: Check that callables are not accepted as models\"\"\"\n\n    def model(x):\n        \"\"\"Mock model\"\"\"\n        return x\n\n    sess = tf.Session()\n    assert_raises(TypeError, ProjectedGradientDescent, model, sess)\n\n\nif __name__ == \"__main__\":\n    test_rejects_callable()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_serial.py",
    "content": "\"\"\"Tests for cleverhans.serial\"\"\"\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans.devtools.checks import CleverHansTest\nfrom cleverhans.serial import PicklableVariable\nfrom cleverhans.serial import load\nfrom cleverhans.serial import save\n\n\nclass TestSerial(CleverHansTest):\n    \"\"\"\n    Tests for cleverhans.serial\n    \"\"\"\n\n    def test_save_and_load_var(self):\n        \"\"\"test_save_and_load_var: Test that we can save and load a\n        PicklableVariable with joblib\n        \"\"\"\n        sess = tf.Session()\n        with sess.as_default():\n            x = np.ones(1)\n            xv = PicklableVariable(x)\n            xv.var.initializer.run()\n            save(\"/tmp/var.joblib\", xv)\n            sess.run(tf.assign(xv.var, np.ones(1) * 2))\n            new_xv = load(\"/tmp/var.joblib\")\n            self.assertClose(sess.run(xv.var), np.ones(1) * 2)\n            self.assertClose(sess.run(new_xv.var), np.ones(1))\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_utils.py",
    "content": "# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport unittest\nimport numpy as np\n\nfrom cleverhans import utils\nfrom cleverhans.utils_keras import cnn_model\nfrom cleverhans.utils_keras import KerasModelWrapper\n\n\nclass TestUtils(unittest.TestCase):\n    def test_to_categorical_with_nb_classes_arg(self):\n        vec = np.asarray([0])\n        cat = np.asarray([[1, 0, 0]])\n        self.assertTrue(np.all(utils.to_categorical(vec, 3) == cat))\n\n    def test_random_targets_vector(self):\n        # Test utils.random_targets with a vector of labels as the input\n        gt_labels = np.asarray([0, 1, 2, 3])\n        rt = utils.random_targets(gt_labels, 5)\n\n        # Make sure random_targets returns a one-hot encoded labels\n        self.assertTrue(len(rt.shape) == 2)\n        rt_labels = np.argmax(rt, axis=1)\n\n        # Make sure all labels are different from the correct labels\n        self.assertTrue(np.all(rt_labels != gt_labels))\n\n    def test_random_targets_one_hot(self):\n        # Test utils.random_targets with one-hot encoded labels as the input\n        gt = np.asarray(\n            [[0, 0, 1, 0, 0], [1, 0, 0, 0, 0], [0, 0, 0, 1, 0], [1, 0, 0, 0, 0]]\n        )\n        gt_labels = np.argmax(gt, axis=1)\n        rt = utils.random_targets(gt, 5)\n\n        # Make sure random_targets returns a one-hot encoded labels\n        self.assertTrue(len(rt.shape) == 2)\n        rt_labels = np.argmax(rt, axis=1)\n\n        # Make sure all labels are different from the correct labels\n        self.assertTrue(np.all(rt_labels != gt_labels))\n\n    def test_random_targets_one_hot_single_label(self):\n        # Test utils.random_targets with a single one-hot encoded label\n        gt = np.asarray([0, 0, 1, 0, 0])\n        gt = gt.reshape((1, 5))\n        gt_labels = np.argmax(gt, axis=1)\n        rt = utils.random_targets(gt, 5)\n\n        # Make sure random_targets returns a one-hot encoded labels\n        self.assertTrue(len(rt.shape) == 2)\n        rt_labels = np.argmax(rt, axis=1)\n\n        # Make sure all labels are different from the correct labels\n        self.assertTrue(np.all(rt_labels != gt_labels))\n\n    def test_other_classes_neg_class_ind(self):\n        with self.assertRaises(Exception) as context:\n            utils.other_classes(10, -1)\n        self.assertTrue(context.exception)\n\n    def test_other_classes_invalid_class_ind(self):\n        with self.assertRaises(Exception) as context:\n            utils.other_classes(5, 8)\n        self.assertTrue(context.exception)\n\n    def test_other_classes_return_val(self):\n        res = utils.other_classes(5, 2)\n        res_expected = [0, 1, 3, 4]\n        self.assertTrue(res == res_expected)\n\n    def test_get_logits_over_interval(self):\n        import tensorflow as tf\n\n        model = cnn_model()\n        wrap = KerasModelWrapper(model)\n        fgsm_params = {\"eps\": 0.5}\n        img = np.ones(shape=(28, 28, 1))\n        num_points = 21\n        with tf.Session() as sess:\n            tf.global_variables_initializer().run()\n            logits = utils.get_logits_over_interval(\n                sess,\n                wrap,\n                img,\n                fgsm_params,\n                min_epsilon=-10,\n                max_epsilon=10,\n                num_points=num_points,\n            )\n            self.assertEqual(logits.shape[0], num_points)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_utils_keras.py",
    "content": "# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport unittest\nimport numpy as np\n\n# Weird imports / assignment because the normal import syntax doesn't work for tf.keras in tf 1.8\nfrom tensorflow import keras\n\n# pylint:disable=wrong-import-position\nSequential = keras.models.Sequential\nDense = keras.layers.Dense\nActivation = keras.layers.Activation\n\nfrom cleverhans.utils_keras import KerasModelWrapper\n\n\nclass TestKerasModelWrapper(unittest.TestCase):\n    def setUp(self):\n        import tensorflow as tf\n\n        def dummy_model():\n            input_shape = (100,)\n            return Sequential(\n                [\n                    Dense(20, name=\"l1\", input_shape=input_shape),\n                    Dense(10, name=\"l2\"),\n                    Activation(\"softmax\", name=\"softmax\"),\n                ]\n            )\n\n        self.sess = tf.Session()\n        self.sess.as_default()\n        self.model = dummy_model()\n\n    def test_softmax_layer_name_is_softmax(self):\n        model = KerasModelWrapper(self.model)\n        softmax_name = model._get_softmax_name()\n        self.assertEqual(softmax_name, \"softmax\")\n\n    def test_logit_layer_name_is_logits(self):\n        model = KerasModelWrapper(self.model)\n        logits_name = model._get_logits_name()\n        self.assertEqual(logits_name, \"l2\")\n\n    def test_get_logits(self):\n        import tensorflow as tf\n\n        model = KerasModelWrapper(self.model)\n        x = tf.placeholder(tf.float32, shape=(None, 100))\n        preds = model.get_probs(x)\n        logits = model.get_logits(x)\n\n        x_val = np.random.rand(2, 100)\n        tf.global_variables_initializer().run(session=self.sess)\n        p_val, logits = self.sess.run([preds, logits], feed_dict={x: x_val})\n        p_gt = np.exp(logits) / np.sum(np.exp(logits), axis=1, keepdims=True)\n        self.assertTrue(np.allclose(p_val, p_gt, atol=1e-6))\n\n    def test_get_probs(self):\n        import tensorflow as tf\n\n        model = KerasModelWrapper(self.model)\n        x = tf.placeholder(tf.float32, shape=(None, 100))\n        preds = model.get_probs(x)\n\n        x_val = np.random.rand(2, 100)\n        tf.global_variables_initializer().run(session=self.sess)\n        p_val = self.sess.run(preds, feed_dict={x: x_val})\n        self.assertTrue(np.allclose(np.sum(p_val, axis=1), 1, atol=1e-6))\n        self.assertTrue(np.all(p_val >= 0))\n        self.assertTrue(np.all(p_val <= 1))\n\n    def test_get_layer_names(self):\n        model = KerasModelWrapper(self.model)\n        layer_names = model.get_layer_names()\n        self.assertEqual(layer_names, [\"l1\", \"l2\", \"softmax\"])\n\n    def test_fprop(self):\n        import tensorflow as tf\n\n        model = KerasModelWrapper(self.model)\n        x = tf.placeholder(tf.float32, shape=(None, 100))\n        out_dict = model.fprop(x)\n\n        self.assertEqual(set(out_dict.keys()), set([\"l1\", \"l2\", \"softmax\"]))\n        # Test the dimension of the hidden represetation\n        self.assertEqual(int(out_dict[\"l1\"].shape[1]), 20)\n        self.assertEqual(int(out_dict[\"l2\"].shape[1]), 10)\n\n        # Test the caching\n        x2 = tf.placeholder(tf.float32, shape=(None, 100))\n        out_dict2 = model.fprop(x2)\n        self.assertEqual(set(out_dict2.keys()), set([\"l1\", \"l2\", \"softmax\"]))\n        self.assertEqual(int(out_dict2[\"l1\"].shape[1]), 20)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "cleverhans_v3.1.0/tests_tf/test_utils_tf.py",
    "content": "\"\"\"Tests for cleverhans.utils_tf\"\"\"\n# pylint: disable=missing-docstring\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nfrom __future__ import unicode_literals\n\nimport numpy as np\nimport tensorflow as tf\n\nfrom cleverhans import utils_tf\nfrom cleverhans.devtools.checks import CleverHansTest\n\n\ndef numpy_kl_with_logits(p_logits, q_logits):\n    def numpy_softmax(logits):\n        logits -= np.max(logits, axis=1, keepdims=True)\n        exp_logits = np.exp(logits)\n        return exp_logits / np.sum(exp_logits, axis=1, keepdims=True)\n\n    p = numpy_softmax(p_logits)\n    log_p = p_logits - np.log(np.sum(np.exp(p_logits), axis=1, keepdims=True))\n    log_q = q_logits - np.log(np.sum(np.exp(q_logits), axis=1, keepdims=True))\n    return (p * (log_p - log_q)).sum(axis=1).mean()\n\n\nclass TestUtilsTF(CleverHansTest):\n    \"\"\"Test class for utils_tf\"\"\"\n\n    def setUp(self):\n        super(TestUtilsTF, self).setUp()\n        self.sess = tf.Session()\n\n    def test_clip_by_value_numpy_dtype(self):\n        # Test that it's possible to use clip_by_value while mixing numpy and tf\n        clip_min = np.zeros((1,))\n        clip_max = tf.ones((1,))\n        x = tf.ones((1,))\n        # The point of this test is just to make sure the casting logic doesn't raise an exception\n        utils_tf.clip_by_value(x, clip_min, clip_max)\n\n    def test_l2_batch_normalize(self):\n        x = tf.random_normal((100, 1000))\n        x_norm = self.sess.run(utils_tf.l2_batch_normalize(x))\n        self.assertClose(np.sum(x_norm ** 2, axis=1), 1, atol=1e-6)\n\n    def test_kl_with_logits(self):\n        p_logits = tf.placeholder(tf.float32, shape=(100, 20))\n        q_logits = tf.placeholder(tf.float32, shape=(100, 20))\n        p_logits_np = np.random.normal(0, 10, size=(100, 20))\n        q_logits_np = np.random.normal(0, 10, size=(100, 20))\n        kl_div_tf = self.sess.run(\n            utils_tf.kl_with_logits(p_logits, q_logits),\n            feed_dict={p_logits: p_logits_np, q_logits: q_logits_np},\n        )\n        kl_div_ref = numpy_kl_with_logits(p_logits_np, q_logits_np)\n        self.assertClose(kl_div_ref, kl_div_tf)\n\n    def test_clip_eta_norm_0(self):\n        \"\"\"test_clip_eta_norm_0: Test that `clip_eta` still works when the\n        norm of `eta` is zero. This used to cause a divide by zero for ord\n        1 and ord 2.\"\"\"\n        eta = tf.zeros((5, 3))\n        self.assertTrue(eta.dtype == tf.float32, eta.dtype)\n        eps = 0.25\n        for ord_arg in [np.inf, 1, 2]:\n            try:\n                clipped = utils_tf.clip_eta(eta, ord_arg, eps)\n            except NotImplementedError:\n                # Don't raise SkipTest, it skips the rest of the for loop\n                continue\n            clipped = self.sess.run(clipped)\n            self.assertTrue(not np.any(np.isinf(clipped)))\n            self.assertTrue(not np.any(np.isnan(clipped)), (ord_arg, clipped))\n\n    def test_clip_eta_goldilocks(self):\n        \"\"\"test_clip_eta_goldilocks: Test that the clipping handles perturbations\n        that are too small, just right, and too big correctly\"\"\"\n        eta = tf.constant([[2.0], [3.0], [4.0]])\n        self.assertTrue(eta.dtype == tf.float32, eta.dtype)\n        eps = 3.0\n        for ord_arg in [np.inf, 1, 2]:\n            for sign in [-1.0, 1.0]:\n                try:\n                    clipped = utils_tf.clip_eta(eta * sign, ord_arg, eps)\n                except NotImplementedError:\n                    # Don't raise SkipTest, it skips the rest of the for loop\n                    continue\n                clipped_value = self.sess.run(clipped)\n                gold = sign * np.array([[2.0], [3.0], [3.0]])\n                self.assertClose(clipped_value, gold)\n                (grad,) = tf.gradients(clipped, eta)\n                grad_value = self.sess.run(grad)\n                # Note: the second 1. is debatable (the left-sided derivative\n                # and the right-sided derivative do not match, so formally\n                # the derivative is not defined). This test makes sure that\n                # we at least handle this oddity consistently across all the\n                # argument values we test\n                gold = sign * np.array([[1.0], [1.0], [0.0]])\n                self.assertClose(grad_value, gold)\n\n    def test_zero_out_clipped_grads(self):\n        \"\"\"\n        test_zero_out_clipped_grads: Test that gradient gets zeroed out at positions\n        where no progress can be made due to clipping.\n        \"\"\"\n\n        clip_min = -1\n        clip_max = 1\n        eta = tf.constant([[0.0], [-1.0], [1], [0.5], [-1], [1], [-0.9], [0.9]])\n        grad = tf.constant([[1.0], [-1.0], [1.0], [1.0], [1.0], [-1.0], [-1.0], [1.0]])\n\n        grad2 = self.sess.run(\n            utils_tf.zero_out_clipped_grads(grad, eta, clip_min, clip_max)\n        )\n\n        expected = np.asarray(\n            [[1.0], [0.0], [0.0], [1.0], [1.0], [-1.0], [-1.0], [1.0]]\n        )\n        self.assertClose(grad2, expected)\n\n    def test_random_lp_vector_linf(self):\n        \"\"\"\n        test_random_lp_sample_linf: Test that `random_lp_vector` returns\n        random samples in the l-inf ball.\n        \"\"\"\n\n        eps = 0.5\n        d = 10\n\n        r = self.sess.run(utils_tf.random_lp_vector((1000, d), np.infty, eps))\n\n        # test that some values are close to the boundaries\n        self.assertLessEqual(np.max(r), eps)\n        self.assertGreaterEqual(np.max(r), 0.95 * eps)\n        self.assertGreaterEqual(np.min(r), -eps)\n        self.assertLessEqual(np.min(r), -0.95 * eps)\n\n        # test that the mean value of each feature is close to zero\n        means = np.mean(r, axis=0)\n        self.assertClose(means, np.zeros(d), atol=0.05)\n\n    def test_random_lp_srandom_lp_vector_l1_l2(self):\n        \"\"\"\n        test_random_lp_vector_l1_l2: Test that `random_lp_vector` returns\n        random samples in an l1 or l2 ball.\n        \"\"\"\n\n        eps = 0.5\n        d = 10\n\n        for ord in [1, 2]:\n            r = self.sess.run(utils_tf.random_lp_vector((1000, d), ord, eps))\n\n            norms = np.linalg.norm(r, axis=-1, ord=ord)\n\n            # test that some values are close to the boundaries\n            self.assertLessEqual(np.max(norms), eps)\n            self.assertGreaterEqual(np.max(norms), 0.95 * eps)\n\n            # The expected norm is eps * Exp[U[0,1]^(1/d)] where U is a standard\n            # uniform random variable and d is the dimension. The second term is\n            # equal to the expected value of a Beta(d, 1) variable which is d/(d+1).\n            expected_mean_norm = eps * (d / (d + 1.0))\n            self.assertClose(np.mean(norms), expected_mean_norm, atol=0.02)\n"
  },
  {
    "path": "defenses/README.md",
    "content": "# Defenses\n\nThis folder contains implementations of defenses (as standalone scripts) in one\nof the three frameworks (JAX, PyTorch, TF2) or if it is framework independent \nthen this code should go to the generic folder. Each defense should be \nimplemented as a script that helps reproduce results reported in the paper \nintroducing the defense. The goal is for these scripts to be authoritative ways\nto reproduce the defense. \n"
  },
  {
    "path": "defenses/generic/README.md",
    "content": "# Generic Defenses (framework independent)\n\nThis folder contains implementations of defenses (as standalone scripts) that \nare implemented in a framework independent way (for example, it uses the numpy \nlibrary only or can handle support for all major deep learning libraries).\n"
  },
  {
    "path": "defenses/generic/__init__.py",
    "content": ""
  },
  {
    "path": "defenses/jax/README.md",
    "content": "# Defenses implemented with JAX\n"
  },
  {
    "path": "defenses/tf2/README.md",
    "content": "# Defenses implemented with TensorFlow 2\n"
  },
  {
    "path": "defenses/torch/README.md",
    "content": "# Defenses implemented with PyTorch\n"
  },
  {
    "path": "defenses/torch/audio/input_tranformation/resampling.py",
    "content": "import torchaudio\nimport librosa\n\n# There exist a limitation of this defense that it may lead to the problem of aliasing, and we can use the narrowband sample rate\n# rather than downsampling followed by upsampling.\n# resampling reference https://core.ac.uk/download/pdf/228298313.pdf\n# resampling input transformation defense for audio\n\nT = torchaudio.transforms\n\n# Read audio file\naudio_data = librosa.load(files, sr=16000)[0][-19456:]\n\naudio_data = torch.tensor(audio_data).float().to(device)\n\n# Discarding samples from a waveform during downsampling could remove a significant portion of the adversarial perturbation, thereby prevents an adversarial attack.\n\n# resample the audio files to 8kHz from 16kHz\nsample = T.Resample(16000, 8000, resampling_method=\"sinc_interpolation\")\n\naudio_resample_1 = sample(audio_data)\n\n# resample the audio back to 16kHz\nsample = T.Resample(8000, 16000, resampling_method=\"sinc_interpolation\")\n\n# Give audio_resample_2 as input to the asr model\naudio_resample_2 = sample(audio_resample_1)\n"
  },
  {
    "path": "docs/.nojekyll",
    "content": ""
  },
  {
    "path": "docs/README.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>&lt;no title&gt; &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <p># Generate documentation</p>\n<p>To generate the documentation do:\n<cite>make github</cite></p>\n<p>The documentation files will be copied to the <cite>cleverhans/docs</cite> directory.</p>\n<p>### Preparation</p>\n<p>Please do:\n<cite>pip install sphinx</cite></p>\n<p>Add a <cite>.nojekyll</cite> file in the <cite>cleverhans/docs</cite> directory. When GitHub sees\na <cite>.nojekyll</cite> file, it serves the root <cite>index.html</cite> file. The <cite>.nojekyll</cite> file\nindicates that we are not using Jekyll as our static site generator in this\nrepository.</p>\n<p>### Enable GitHub Pages for the GitHub repository</p>\n<ol class=\"arabic simple\">\n<li><p>Go to the repository on the GitHub website and make sure you are logged in.</p></li>\n<li><p>Add a /docs directory to the master branch. Otherwise you do not get the\nmaster branch /docs folder for the Source option in the drop-down list.</p></li>\n<li><p>Click the Settings tab. You first go to the Options section.</p></li>\n<li><p>Scroll down to the GitHub Pages section and choose the drop-down list under\nSource. Note: Your choices will differ based on whether you’re in a User repo\nor an Org repository.</p></li>\n<li><p>To keep source and output HTML separate, choose master branch /docs folder\nfor Source.</p></li>\n</ol>\n<p>### Build Sphinx locally and publish on GitHub Pages</p>\n<p>We keep the source docsource and output docs separate, but still are able to\npublish on GitHub Pages and preview builds locally.</p>\n<p>We have the following option in the Makefile:</p>\n<dl class=\"simple\">\n<dt><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a><a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a></dt><dd><dl class=\"simple\">\n<dt>github:</dt><dd><p>&#64;make html\n&#64;cp -a _build/html/. ../docs</p>\n</dd>\n</dl>\n</dd>\n</dl>\n<p><a href=\"#id5\"><span class=\"problematic\" id=\"id6\">``</span></a><a href=\"#id7\"><span class=\"problematic\" id=\"id8\">`</span></a></p>\n<p>Thus, we can run <cite>make github</cite> from the <cite>docsource</cite> directory to generate a\nlocal preview and move the docs where GitHub wants to serve them from.</p>\n<p>### Hacks</p>\n<p>If you cannot build the docs for attacks, uncomment\n<cite>import tensorflow_addons as tfa</cite> in <cite>cleverhans/attacks/spsa.py</cite>.</p>\n<p>Otherwise:</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">`angular2html</span>\n<span class=\"pre\">WARNING:</span> <span class=\"pre\">autodoc:</span> <span class=\"pre\">failed</span> <span class=\"pre\">to</span> <span class=\"pre\">import</span> <span class=\"pre\">module</span> <span class=\"pre\">'attacks'</span> <span class=\"pre\">from</span> <span class=\"pre\">module</span> <span class=\"pre\">'cleverhans';</span> <span class=\"pre\">the</span> <span class=\"pre\">following</span> <span class=\"pre\">exception</span> <span class=\"pre\">was</span> <span class=\"pre\">raised:</span>\n<span class=\"pre\">cannot</span> <span class=\"pre\">import</span> <span class=\"pre\">name</span> <span class=\"pre\">'keras_tensor'</span>\n<span class=\"pre\">`</span></code></p>\n<p>It is convenient to create a virtual environment to install all the specific\nlibraries (e.g. virutalen cleverhans).</p>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/abc.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>abc &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for abc</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"c1\"># Copyright 2007 Google, Inc. All Rights Reserved.</span>\n<span class=\"c1\"># Licensed to PSF under a Contributor Agreement.</span>\n\n<span class=\"sd\">&quot;&quot;&quot;Abstract Base Classes (ABCs) according to PEP 3119.&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">_weakrefset</span> <span class=\"kn\">import</span> <span class=\"n\">WeakSet</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">abstractmethod</span><span class=\"p\">(</span><span class=\"n\">funcobj</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;A decorator indicating abstract methods.</span>\n\n<span class=\"sd\">    Requires that the metaclass is ABCMeta or derived from it.  A</span>\n<span class=\"sd\">    class that has a metaclass derived from ABCMeta cannot be</span>\n<span class=\"sd\">    instantiated unless all of its abstract methods are overridden.</span>\n<span class=\"sd\">    The abstract methods can be called using any of the normal</span>\n<span class=\"sd\">    &#39;super&#39; call mechanisms.</span>\n\n<span class=\"sd\">    Usage:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            @abstractmethod</span>\n<span class=\"sd\">            def my_abstract_method(self, ...):</span>\n<span class=\"sd\">                ...</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">funcobj</span><span class=\"o\">.</span><span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"k\">return</span> <span class=\"n\">funcobj</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">abstractclassmethod</span><span class=\"p\">(</span><span class=\"nb\">classmethod</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A decorator indicating abstract classmethods.</span>\n\n<span class=\"sd\">    Similar to abstractmethod.</span>\n\n<span class=\"sd\">    Usage:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            @abstractclassmethod</span>\n<span class=\"sd\">            def my_abstract_classmethod(cls, ...):</span>\n<span class=\"sd\">                ...</span>\n\n<span class=\"sd\">    &#39;abstractclassmethod&#39; is deprecated. Use &#39;classmethod&#39; with</span>\n<span class=\"sd\">    &#39;abstractmethod&#39; instead.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">callable</span><span class=\"p\">):</span>\n        <span class=\"n\">callable</span><span class=\"o\">.</span><span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">callable</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">abstractstaticmethod</span><span class=\"p\">(</span><span class=\"nb\">staticmethod</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A decorator indicating abstract staticmethods.</span>\n\n<span class=\"sd\">    Similar to abstractmethod.</span>\n\n<span class=\"sd\">    Usage:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            @abstractstaticmethod</span>\n<span class=\"sd\">            def my_abstract_staticmethod(...):</span>\n<span class=\"sd\">                ...</span>\n\n<span class=\"sd\">    &#39;abstractstaticmethod&#39; is deprecated. Use &#39;staticmethod&#39; with</span>\n<span class=\"sd\">    &#39;abstractmethod&#39; instead.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">callable</span><span class=\"p\">):</span>\n        <span class=\"n\">callable</span><span class=\"o\">.</span><span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">callable</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">abstractproperty</span><span class=\"p\">(</span><span class=\"nb\">property</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A decorator indicating abstract properties.</span>\n\n<span class=\"sd\">    Requires that the metaclass is ABCMeta or derived from it.  A</span>\n<span class=\"sd\">    class that has a metaclass derived from ABCMeta cannot be</span>\n<span class=\"sd\">    instantiated unless all of its abstract properties are overridden.</span>\n<span class=\"sd\">    The abstract properties can be called using any of the normal</span>\n<span class=\"sd\">    &#39;super&#39; call mechanisms.</span>\n\n<span class=\"sd\">    Usage:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            @abstractproperty</span>\n<span class=\"sd\">            def my_abstract_property(self):</span>\n<span class=\"sd\">                ...</span>\n\n<span class=\"sd\">    This defines a read-only property; you can also define a read-write</span>\n<span class=\"sd\">    abstract property using the &#39;long&#39; form of property declaration:</span>\n\n<span class=\"sd\">        class C(metaclass=ABCMeta):</span>\n<span class=\"sd\">            def getx(self): ...</span>\n<span class=\"sd\">            def setx(self, value): ...</span>\n<span class=\"sd\">            x = abstractproperty(getx, setx)</span>\n\n<span class=\"sd\">    &#39;abstractproperty&#39; is deprecated. Use &#39;property&#39; with &#39;abstractmethod&#39;</span>\n<span class=\"sd\">    instead.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">__isabstractmethod__</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n\n<div class=\"viewcode-block\" id=\"ABCMeta\"><a class=\"viewcode-back\" href=\"../source/attacks.html#cleverhans.attacks.ABCMeta\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">ABCMeta</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">):</span>\n\n    <span class=\"sd\">&quot;&quot;&quot;Metaclass for defining Abstract Base Classes (ABCs).</span>\n\n<span class=\"sd\">    Use this metaclass to create an ABC.  An ABC can be subclassed</span>\n<span class=\"sd\">    directly, and then acts as a mix-in class.  You can also register</span>\n<span class=\"sd\">    unrelated concrete classes (even built-in classes) and unrelated</span>\n<span class=\"sd\">    ABCs as &#39;virtual subclasses&#39; -- these and their descendants will</span>\n<span class=\"sd\">    be considered subclasses of the registering ABC by the built-in</span>\n<span class=\"sd\">    issubclass() function, but the registering ABC won&#39;t show up in</span>\n<span class=\"sd\">    their MRO (Method Resolution Order) nor will method</span>\n<span class=\"sd\">    implementations defined by the registering ABC be callable (not</span>\n<span class=\"sd\">    even via super()).</span>\n\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># A global counter that is incremented each time a class is</span>\n    <span class=\"c1\"># registered as a virtual subclass of anything.  It forces the</span>\n    <span class=\"c1\"># negative cache to be cleared before its next use.</span>\n    <span class=\"c1\"># Note: this counter is private. Use `abc.get_cache_token()` for</span>\n    <span class=\"c1\">#       external code.</span>\n    <span class=\"n\">_abc_invalidation_counter</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__new__</span><span class=\"p\">(</span><span class=\"n\">mcls</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">bases</span><span class=\"p\">,</span> <span class=\"n\">namespace</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"bp\">cls</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__new__</span><span class=\"p\">(</span><span class=\"n\">mcls</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">bases</span><span class=\"p\">,</span> <span class=\"n\">namespace</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"c1\"># Compute set of abstract method names</span>\n        <span class=\"n\">abstracts</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">name</span>\n                     <span class=\"k\">for</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">namespace</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()</span>\n                     <span class=\"k\">if</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"s2\">&quot;__isabstractmethod__&quot;</span><span class=\"p\">,</span> <span class=\"kc\">False</span><span class=\"p\">)}</span>\n        <span class=\"k\">for</span> <span class=\"n\">base</span> <span class=\"ow\">in</span> <span class=\"n\">bases</span><span class=\"p\">:</span>\n            <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">base</span><span class=\"p\">,</span> <span class=\"s2\">&quot;__abstractmethods__&quot;</span><span class=\"p\">,</span> <span class=\"nb\">set</span><span class=\"p\">()):</span>\n                <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n                <span class=\"k\">if</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"s2\">&quot;__isabstractmethod__&quot;</span><span class=\"p\">,</span> <span class=\"kc\">False</span><span class=\"p\">):</span>\n                    <span class=\"n\">abstracts</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">)</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">__abstractmethods__</span> <span class=\"o\">=</span> <span class=\"nb\">frozenset</span><span class=\"p\">(</span><span class=\"n\">abstracts</span><span class=\"p\">)</span>\n        <span class=\"c1\"># Set up inheritance registry</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_registry</span> <span class=\"o\">=</span> <span class=\"n\">WeakSet</span><span class=\"p\">()</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span> <span class=\"o\">=</span> <span class=\"n\">WeakSet</span><span class=\"p\">()</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span> <span class=\"o\">=</span> <span class=\"n\">WeakSet</span><span class=\"p\">()</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache_version</span> <span class=\"o\">=</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span>\n        <span class=\"k\">return</span> <span class=\"bp\">cls</span>\n\n<div class=\"viewcode-block\" id=\"ABCMeta.register\"><a class=\"viewcode-back\" href=\"../source/attacks.html#cleverhans.attacks.ABCMeta.register\">[docs]</a>    <span class=\"k\">def</span> <span class=\"nf\">register</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">subclass</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Register a virtual subclass of an ABC.</span>\n\n<span class=\"sd\">        Returns the subclass, to allow usage as a class decorator.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"nb\">type</span><span class=\"p\">):</span>\n            <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Can only register classes&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"nb\">issubclass</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"bp\">cls</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"n\">subclass</span>  <span class=\"c1\"># Already a subclass</span>\n        <span class=\"c1\"># Subtle: test for cycles *after* testing for &quot;already a subclass&quot;;</span>\n        <span class=\"c1\"># this means we allow X.register(X) and interpret it as a no-op.</span>\n        <span class=\"k\">if</span> <span class=\"nb\">issubclass</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">subclass</span><span class=\"p\">):</span>\n            <span class=\"c1\"># This would create a cycle, which is bad for the algorithm below</span>\n            <span class=\"k\">raise</span> <span class=\"ne\">RuntimeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Refusing to create an inheritance cycle&quot;</span><span class=\"p\">)</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_registry</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n        <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span> <span class=\"o\">+=</span> <span class=\"mi\">1</span>  <span class=\"c1\"># Invalidate negative cache</span>\n        <span class=\"k\">return</span> <span class=\"n\">subclass</span></div>\n\n    <span class=\"k\">def</span> <span class=\"nf\">_dump_registry</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">file</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Debug helper to print the ABC registry.&quot;&quot;&quot;</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Class: </span><span class=\"si\">%s</span><span class=\"s2\">.</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"vm\">__module__</span><span class=\"p\">,</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"vm\">__qualname__</span><span class=\"p\">),</span> <span class=\"n\">file</span><span class=\"o\">=</span><span class=\"n\">file</span><span class=\"p\">)</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Inv.counter: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span><span class=\"p\">,</span> <span class=\"n\">file</span><span class=\"o\">=</span><span class=\"n\">file</span><span class=\"p\">)</span>\n        <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"nb\">sorted</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"vm\">__dict__</span><span class=\"p\">):</span>\n            <span class=\"k\">if</span> <span class=\"n\">name</span><span class=\"o\">.</span><span class=\"n\">startswith</span><span class=\"p\">(</span><span class=\"s2\">&quot;_abc_&quot;</span><span class=\"p\">):</span>\n                <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">)</span>\n                <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">WeakSet</span><span class=\"p\">):</span>\n                    <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n                <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">: </span><span class=\"si\">%r</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">),</span> <span class=\"n\">file</span><span class=\"o\">=</span><span class=\"n\">file</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__instancecheck__</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">instance</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Override for isinstance(instance, cls).&quot;&quot;&quot;</span>\n        <span class=\"c1\"># Inline the cache checking</span>\n        <span class=\"n\">subclass</span> <span class=\"o\">=</span> <span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"vm\">__class__</span>\n        <span class=\"k\">if</span> <span class=\"n\">subclass</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"n\">subtype</span> <span class=\"o\">=</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">instance</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">subtype</span> <span class=\"ow\">is</span> <span class=\"n\">subclass</span><span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache_version</span> <span class=\"o\">==</span>\n                <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span> <span class=\"ow\">and</span>\n                <span class=\"n\">subclass</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span><span class=\"p\">):</span>\n                <span class=\"k\">return</span> <span class=\"kc\">False</span>\n            <span class=\"c1\"># Fall back to the subclass check.</span>\n            <span class=\"k\">return</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"fm\">__subclasscheck__</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">any</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"fm\">__subclasscheck__</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">c</span> <span class=\"ow\">in</span> <span class=\"p\">{</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"n\">subtype</span><span class=\"p\">})</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__subclasscheck__</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">subclass</span><span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Override for issubclass(subclass, cls).&quot;&quot;&quot;</span>\n        <span class=\"c1\"># Check cache</span>\n        <span class=\"k\">if</span> <span class=\"n\">subclass</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"c1\"># Check negative cache; may have to invalidate</span>\n        <span class=\"k\">if</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache_version</span> <span class=\"o\">&lt;</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span><span class=\"p\">:</span>\n            <span class=\"c1\"># Invalidate the negative cache</span>\n            <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span> <span class=\"o\">=</span> <span class=\"n\">WeakSet</span><span class=\"p\">()</span>\n            <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache_version</span> <span class=\"o\">=</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span>\n        <span class=\"k\">elif</span> <span class=\"n\">subclass</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">False</span>\n        <span class=\"c1\"># Check the subclass hook</span>\n        <span class=\"n\">ok</span> <span class=\"o\">=</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">__subclasshook__</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">ok</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"bp\">NotImplemented</span><span class=\"p\">:</span>\n            <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">ok</span><span class=\"p\">,</span> <span class=\"nb\">bool</span><span class=\"p\">)</span>\n            <span class=\"k\">if</span> <span class=\"n\">ok</span><span class=\"p\">:</span>\n                <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n            <span class=\"k\">else</span><span class=\"p\">:</span>\n                <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"n\">ok</span>\n        <span class=\"c1\"># Check if it&#39;s a direct subclass</span>\n        <span class=\"k\">if</span> <span class=\"bp\">cls</span> <span class=\"ow\">in</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"s1\">&#39;__mro__&#39;</span><span class=\"p\">,</span> <span class=\"p\">()):</span>\n            <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"c1\"># Check if it&#39;s a subclass of a registered class (recursive)</span>\n        <span class=\"k\">for</span> <span class=\"n\">rcls</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_registry</span><span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"nb\">issubclass</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"n\">rcls</span><span class=\"p\">):</span>\n                <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n                <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"c1\"># Check if it&#39;s a subclass of a subclass (recursive)</span>\n        <span class=\"k\">for</span> <span class=\"n\">scls</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">__subclasses__</span><span class=\"p\">():</span>\n            <span class=\"k\">if</span> <span class=\"nb\">issubclass</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">,</span> <span class=\"n\">scls</span><span class=\"p\">):</span>\n                <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n                <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"c1\"># No dice; update negative cache</span>\n        <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_abc_negative_cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">subclass</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"kc\">False</span></div>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ABC</span><span class=\"p\">(</span><span class=\"n\">metaclass</span><span class=\"o\">=</span><span class=\"n\">ABCMeta</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Helper class that provides a standard way to create an ABC using</span>\n<span class=\"sd\">    inheritance.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">pass</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">get_cache_token</span><span class=\"p\">():</span>\n    <span class=\"sd\">&quot;&quot;&quot;Returns the current ABC cache token.</span>\n\n<span class=\"sd\">    The token is an opaque object (supporting equality testing) identifying the</span>\n<span class=\"sd\">    current version of the ABC cache for virtual subclasses. The token changes</span>\n<span class=\"sd\">    with every call to ``register()`` on any ABC.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">ABCMeta</span><span class=\"o\">.</span><span class=\"n\">_abc_invalidation_counter</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n  <li><a href=\"index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/attack.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.attack &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.attack</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The Attack interface.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">abc</span> <span class=\"kn\">import</span> <span class=\"n\">ABCMeta</span>\n<span class=\"kn\">import</span> <span class=\"nn\">collections</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.attack&quot;</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"Attack\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">Attack</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Abstract base class for all attack classes.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">__metaclass__</span> <span class=\"o\">=</span> <span class=\"n\">ABCMeta</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param model: An instance of the cleverhans.model.Model class.</span>\n<span class=\"sd\">    :param sess: The (possibly optional) tf.Session to run graphs in.</span>\n<span class=\"sd\">    :param dtypestr: Floating point precision to use (change to float64</span>\n<span class=\"sd\">                     to avoid numerical instabilities).</span>\n<span class=\"sd\">    :param back: (deprecated and will be removed on or after 2019-03-26).</span>\n<span class=\"sd\">                 The backend to use. Currently &#39;tf&#39; is the only option.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;back&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;back&#39;</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;tf&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Argument back to attack constructors is not needed&quot;</span>\n                      <span class=\"s2\">&quot; anymore and will be removed on or after 2019-03-26.&quot;</span>\n                      <span class=\"s2\">&quot; All attacks are implemented using TensorFlow.&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Backend argument must be &#39;tf&#39; and is now deprecated&quot;</span>\n                         <span class=\"s2\">&quot;It will be removed on or after 2019-03-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"n\">dtypestr</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"n\">dtypestr</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Session</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;sess is not an instance of tf.Session&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">attacks_tf</span>\n    <span class=\"n\">attacks_tf</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span>\n    <span class=\"n\">attacks_tf</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span>\n\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;The model argument should be an instance of&quot;</span>\n                      <span class=\"s2\">&quot; the cleverhans.model.Model class.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Prepare attributes</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">model</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">sess</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dtypestr</span> <span class=\"o\">=</span> <span class=\"n\">dtypestr</span>\n\n    <span class=\"c1\"># We are going to keep track of old graphs and cache them.</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n\n    <span class=\"c1\"># When calling generate_np, arguments in the following set should be</span>\n    <span class=\"c1\"># fed into the graph, as they are not structural items that require</span>\n    <span class=\"c1\"># generating a new graph.</span>\n    <span class=\"c1\"># This dict should map names of arguments to the types they should</span>\n    <span class=\"c1\"># have.</span>\n    <span class=\"c1\"># (Usually, the target class will be a feedable keyword argument.)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># When calling generate_np, arguments in the following set should NOT</span>\n    <span class=\"c1\"># be fed into the graph, as they ARE structural items that require</span>\n    <span class=\"c1\"># generating a new graph.</span>\n    <span class=\"c1\"># This list should contain the names of the structural arguments.</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n<div class=\"viewcode-block\" id=\"Attack.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate the attack&#39;s symbolic graph for adversarial examples. This</span>\n<span class=\"sd\">    method should be overriden in any child class that implements an</span>\n<span class=\"sd\">    attack that is expressable symbolically. Otherwise, it will wrap the</span>\n<span class=\"sd\">    numerical implementation as a symbolic operator.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param **kwargs: optional parameters used by child classes.</span>\n<span class=\"sd\">      Each child class defines additional parameters as needed.</span>\n<span class=\"sd\">      Child classes that use the following concepts should use the following</span>\n<span class=\"sd\">      names:</span>\n<span class=\"sd\">        clip_min: minimum feature value</span>\n<span class=\"sd\">        clip_max: maximum feature value</span>\n<span class=\"sd\">        eps: size of norm constraint on adversarial perturbation</span>\n<span class=\"sd\">        ord: order of norm constraint</span>\n<span class=\"sd\">        nb_iter: number of iterations</span>\n<span class=\"sd\">        eps_iter: size of norm constraint on iteration</span>\n<span class=\"sd\">        y_target: if specified, the attack is targeted.</span>\n<span class=\"sd\">        y: Do not specify if y_target is specified.</span>\n<span class=\"sd\">           If specified, the attack is untargeted, aims to make the output</span>\n<span class=\"sd\">           class not be y.</span>\n<span class=\"sd\">           If neither y_target nor y is specified, y is inferred by having</span>\n<span class=\"sd\">           the model classify the input.</span>\n<span class=\"sd\">      For other concepts, it&#39;s generally a good idea to read other classes</span>\n<span class=\"sd\">      and check for name consistency.</span>\n<span class=\"sd\">    :return: A symbolic representation of the adversarial examples.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">error</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Sub-classes must implement generate.&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"n\">error</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Include an unused return so pylint understands the method signature</span>\n    <span class=\"k\">return</span> <span class=\"n\">x</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.construct_graph\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.construct_graph\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">construct_graph</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">fixed</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">hash_key</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Construct the graph required to run the attack through generate_np.</span>\n\n<span class=\"sd\">    :param fixed: Structural elements that require defining a new graph.</span>\n<span class=\"sd\">    :param feedable: Arguments that can be fed to the same graph when</span>\n<span class=\"sd\">                     they take different values.</span>\n<span class=\"sd\">    :param x_val: symbolic adversarial example</span>\n<span class=\"sd\">    :param hash_key: the key used to store this graph in our cache</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># try our very best to create a TF placeholder for each of the</span>\n    <span class=\"c1\"># feedable keyword arguments, and check the types are one of</span>\n    <span class=\"c1\"># the allowed types</span>\n    <span class=\"n\">class_name</span> <span class=\"o\">=</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"vm\">__class__</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s2\">&quot;.&quot;</span><span class=\"p\">)[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">][:</span><span class=\"o\">-</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n    <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Constructing new graph for attack &quot;</span> <span class=\"o\">+</span> <span class=\"n\">class_name</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># remove the None arguments, they are just left blank</span>\n    <span class=\"k\">for</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">feedable</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()):</span>\n      <span class=\"k\">if</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">del</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># process all of the rest and create placeholders for them</span>\n    <span class=\"n\">new_kwargs</span> <span class=\"o\">=</span> <span class=\"nb\">dict</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">fixed</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">())</span>\n    <span class=\"k\">for</span> <span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">feedable</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">():</span>\n      <span class=\"n\">given_type</span> <span class=\"o\">=</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">dtype</span>\n      <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ndarray</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">ndim</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"c1\"># This is pretty clearly not a batch of data</span>\n          <span class=\"n\">new_kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">given_type</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"c1\"># Assume that this is a batch of data, make the first axis variable</span>\n          <span class=\"c1\"># in size</span>\n          <span class=\"n\">new_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n          <span class=\"n\">new_kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">given_type</span><span class=\"p\">,</span> <span class=\"n\">new_shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">)</span>\n      <span class=\"k\">elif</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">known_number_types</span><span class=\"p\">):</span>\n        <span class=\"n\">new_kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">given_type</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">)</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Could not identify type of argument &quot;</span> <span class=\"o\">+</span>\n                         <span class=\"n\">name</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;: &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># x is a special placeholder we always want to have</span>\n    <span class=\"n\">x_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">:]</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"n\">x_shape</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># now we generate the graph that we want</span>\n    <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">generate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">new_kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span><span class=\"p\">[</span><span class=\"n\">hash_key</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">new_kwargs</span><span class=\"p\">,</span> <span class=\"n\">x_adv</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">10</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Calling generate_np() with multiple different &quot;</span>\n                    <span class=\"s2\">&quot;structural parameters is inefficient and should&quot;</span>\n                    <span class=\"s2\">&quot; be avoided. Calling generate() is preferred.&quot;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.generate_np\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.generate_np\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate_np</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate adversarial examples and return them as a NumPy array.</span>\n<span class=\"sd\">    Sub-classes *should not* implement this method unless they must</span>\n<span class=\"sd\">    perform special handling of arguments.</span>\n\n<span class=\"sd\">    :param x_val: A NumPy array with the original inputs.</span>\n<span class=\"sd\">    :param **kwargs: optional parameters used by child classes.</span>\n<span class=\"sd\">    :return: A NumPy array holding the adversarial examples.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Cannot use `generate_np` when no `sess` was&quot;</span>\n                       <span class=\"s2\">&quot; provided&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"n\">packed</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">construct_variables</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">fixed</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">hash_key</span> <span class=\"o\">=</span> <span class=\"n\">packed</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">hash_key</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">construct_graph</span><span class=\"p\">(</span><span class=\"n\">fixed</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">hash_key</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># remove the None arguments, they are just left blank</span>\n      <span class=\"k\">for</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">feedable</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()):</span>\n        <span class=\"k\">if</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n          <span class=\"k\">del</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span>\n\n    <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">new_kwargs</span><span class=\"p\">,</span> <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">graphs</span><span class=\"p\">[</span><span class=\"n\">hash_key</span><span class=\"p\">]</span>\n\n    <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">x_val</span><span class=\"p\">}</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">feedable</span><span class=\"p\">:</span>\n      <span class=\"n\">feed_dict</span><span class=\"p\">[</span><span class=\"n\">new_kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]]</span> <span class=\"o\">=</span> <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span>\n\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">x_adv</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.construct_variables\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.construct_variables\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">construct_variables</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Construct the inputs to the attack graph to be used by generate_np.</span>\n\n<span class=\"sd\">    :param kwargs: Keyword arguments to generate_np.</span>\n<span class=\"sd\">    :return:</span>\n<span class=\"sd\">      Structural arguments</span>\n<span class=\"sd\">      Feedable arguments</span>\n<span class=\"sd\">      Output of `arg_type` describing feedable arguments</span>\n<span class=\"sd\">      A unique key</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span><span class=\"p\">,</span> <span class=\"nb\">dict</span><span class=\"p\">):</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Using a dict for `feedable_kwargs is deprecated.&quot;</span>\n                    <span class=\"s2\">&quot;Switch to using a tuple.&quot;</span>\n                    <span class=\"s2\">&quot;It is not longer necessary to specify the types &quot;</span>\n                    <span class=\"s2\">&quot;of the arguments---we build a different graph &quot;</span>\n                    <span class=\"s2\">&quot;for each received type.&quot;</span>\n                    <span class=\"s2\">&quot;Using a dict may become an error on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-18.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">feedable_names</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"nb\">sorted</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">()))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">feedable_names</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span>\n      <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">feedable_names</span><span class=\"p\">,</span> <span class=\"nb\">tuple</span><span class=\"p\">):</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Attack.feedable_kwargs should be a tuple, but &quot;</span>\n                        <span class=\"s2\">&quot;for subclass &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; it is &quot;</span>\n                        <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; of type &quot;</span>\n                        <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># the set of arguments that are structural properties of the attack</span>\n    <span class=\"c1\"># if these arguments are different, we must construct a new graph</span>\n    <span class=\"n\">fixed</span> <span class=\"o\">=</span> <span class=\"nb\">dict</span><span class=\"p\">(</span>\n        <span class=\"p\">(</span><span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># the set of arguments that are passed as placeholders to the graph</span>\n    <span class=\"c1\"># on each call, and can change without constructing a new graph</span>\n    <span class=\"n\">feedable</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">k</span><span class=\"p\">:</span> <span class=\"n\">v</span> <span class=\"k\">for</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"n\">feedable_names</span><span class=\"p\">}</span>\n    <span class=\"k\">for</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"n\">feedable</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">],</span> <span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">)):</span>\n        <span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">feedable</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">])</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">key</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">key</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">fixed</span> <span class=\"ow\">and</span> <span class=\"n\">key</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">feedable</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;: Undeclared argument: &quot;</span> <span class=\"o\">+</span> <span class=\"n\">key</span><span class=\"p\">)</span>\n\n    <span class=\"n\">feed_arg_type</span> <span class=\"o\">=</span> <span class=\"n\">arg_type</span><span class=\"p\">(</span><span class=\"n\">feedable_names</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">all</span><span class=\"p\">(</span><span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"n\">collections</span><span class=\"o\">.</span><span class=\"n\">Hashable</span><span class=\"p\">)</span>\n               <span class=\"k\">for</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">fixed</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()):</span>\n      <span class=\"c1\"># we have received a fixed value that isn&#39;t hashable</span>\n      <span class=\"c1\"># this means we can&#39;t cache this graph for later use,</span>\n      <span class=\"c1\"># and it will have to be discarded later</span>\n      <span class=\"n\">hash_key</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># create a unique key for this set of fixed paramaters</span>\n      <span class=\"n\">hash_key</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"nb\">sorted</span><span class=\"p\">(</span><span class=\"n\">fixed</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()))</span> <span class=\"o\">+</span> <span class=\"nb\">tuple</span><span class=\"p\">([</span><span class=\"n\">feed_arg_type</span><span class=\"p\">])</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">fixed</span><span class=\"p\">,</span> <span class=\"n\">feedable</span><span class=\"p\">,</span> <span class=\"n\">feed_arg_type</span><span class=\"p\">,</span> <span class=\"n\">hash_key</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.get_or_guess_labels\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.get_or_guess_labels\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Get the label to use in generating an adversarial example for x.</span>\n<span class=\"sd\">    The kwargs are fed directly from the kwargs of the attack.</span>\n<span class=\"sd\">    If &#39;y&#39; is in kwargs, then assume it&#39;s an untargeted attack and</span>\n<span class=\"sd\">    use that as the label.</span>\n<span class=\"sd\">    If &#39;y_target&#39; is in kwargs and is not none, then assume it&#39;s a</span>\n<span class=\"sd\">    targeted attack and use that as the label.</span>\n<span class=\"sd\">    Otherwise, use the model&#39;s prediction as the label and perform an</span>\n<span class=\"sd\">    untargeted attack.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Can not set both &#39;y&#39; and &#39;y_target&#39;.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">elif</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">]</span>\n    <span class=\"k\">elif</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n      <span class=\"n\">original_predictions</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n      <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">original_predictions</span><span class=\"p\">)</span>\n      <span class=\"k\">del</span> <span class=\"n\">preds</span>\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ndarray</span><span class=\"p\">):</span>\n      <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">labels</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">labels</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span></div>\n\n<div class=\"viewcode-block\" id=\"Attack.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Attack.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    :param params: a dictionary of attack-specific parameters</span>\n<span class=\"sd\">    :return: True when parsing was successful</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">params</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`params` is unused and will be removed &quot;</span>\n                    <span class=\"s2\">&quot; on or after 2019-04-26.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">arg_type</span><span class=\"p\">(</span><span class=\"n\">arg_names</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Returns a hashable summary of the types of arg_names within kwargs.</span>\n<span class=\"sd\">  :param arg_names: tuple containing names of relevant arguments</span>\n<span class=\"sd\">  :param kwargs: dict mapping string argument names to values.</span>\n<span class=\"sd\">    These must be values for which we can create a tf placeholder.</span>\n<span class=\"sd\">    Currently supported: numpy darray or something that can ducktype it</span>\n<span class=\"sd\">  returns:</span>\n<span class=\"sd\">    API contract is to return a hashable object describing all</span>\n<span class=\"sd\">    structural consequences of argument values that can otherwise</span>\n<span class=\"sd\">    be fed into a graph of fixed structure.</span>\n<span class=\"sd\">    Currently this is implemented as a tuple of tuples that track:</span>\n<span class=\"sd\">      - whether each argument was passed</span>\n<span class=\"sd\">      - whether each argument was passed and not None</span>\n<span class=\"sd\">      - the dtype of each argument</span>\n<span class=\"sd\">    Callers shouldn&#39;t rely on the exact structure of this object,</span>\n<span class=\"sd\">    just its hashability and one-to-one mapping between graph structures.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">arg_names</span><span class=\"p\">,</span> <span class=\"nb\">tuple</span><span class=\"p\">)</span>\n  <span class=\"n\">passed</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">arg_names</span><span class=\"p\">)</span>\n  <span class=\"n\">passed_and_not_none</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n  <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">arg_names</span><span class=\"p\">:</span>\n    <span class=\"k\">if</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">passed_and_not_none</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">passed_and_not_none</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n  <span class=\"n\">passed_and_not_none</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"n\">passed_and_not_none</span><span class=\"p\">)</span>\n  <span class=\"n\">dtypes</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n  <span class=\"k\">for</span> <span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">arg_names</span><span class=\"p\">:</span>\n    <span class=\"k\">if</span> <span class=\"n\">name</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">dtypes</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n      <span class=\"k\">continue</span>\n    <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"n\">name</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">dtypes</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n      <span class=\"k\">continue</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dtype&#39;</span><span class=\"p\">),</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n    <span class=\"n\">dtype</span> <span class=\"o\">=</span> <span class=\"n\">value</span><span class=\"o\">.</span><span class=\"n\">dtype</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">):</span>\n      <span class=\"n\">dtype</span> <span class=\"o\">=</span> <span class=\"n\">dtype</span><span class=\"o\">.</span><span class=\"n\">as_np_dtype</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">dtypes</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n  <span class=\"n\">dtypes</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"n\">dtypes</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"n\">passed</span><span class=\"p\">,</span> <span class=\"n\">passed_and_not_none</span><span class=\"p\">,</span> <span class=\"n\">dtypes</span><span class=\"p\">)</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/basic_iterative_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.basic_iterative_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.basic_iterative_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The BasicIterativeMethod attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.projected_gradient_descent</span> <span class=\"kn\">import</span> <span class=\"n\">ProjectedGradientDescent</span>\n\n\n<div class=\"viewcode-block\" id=\"BasicIterativeMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.BasicIterativeMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">BasicIterativeMethod</span><span class=\"p\">(</span><span class=\"n\">ProjectedGradientDescent</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The BasicIterativeMethod attack.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">BasicIterativeMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                                               <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                               <span class=\"n\">default_rand_init</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                                               <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/carlini_wagner_l2.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.carlini_wagner_l2 &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.carlini_wagner_l2</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The CarliniWagnerL2 attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n\n<span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.carlini_wagner_l2&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"CarliniWagnerL2\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.CarliniWagnerL2\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">CarliniWagnerL2</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This attack was originally proposed by Carlini and Wagner. It is an</span>\n<span class=\"sd\">  iterative attack that finds adversarial examples on many defenses that</span>\n<span class=\"sd\">  are robust to other attacks.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1608.04644</span>\n\n<span class=\"sd\">  At a high level, this attack is an iterative attack using Adam and</span>\n<span class=\"sd\">  a specially-chosen loss function to find adversarial examples with</span>\n<span class=\"sd\">  lower distortion than other attacks. This comes at the cost of speed,</span>\n<span class=\"sd\">  as this attack is often much slower than others.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">CarliniWagnerL2</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;batch_size&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;confidence&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;targeted&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;learning_rate&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;binary_search_steps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;max_iterations&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;abort_early&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;initial_const&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"CarliniWagnerL2.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.CarliniWagnerL2.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param x: A tensor with the inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">attack</span> <span class=\"o\">=</span> <span class=\"n\">CWL2</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">confidence</span><span class=\"p\">,</span>\n                  <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">,</span>\n                  <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span><span class=\"p\">,</span>\n                  <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">abort_early</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                  <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">,</span>\n                  <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cw_wrap</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">attack</span><span class=\"o\">.</span><span class=\"n\">attack</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">cw_wrap</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"CarliniWagnerL2.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.CarliniWagnerL2.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n                   <span class=\"n\">confidence</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"mf\">5e-3</span><span class=\"p\">,</span>\n                   <span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"mi\">1000</span><span class=\"p\">,</span>\n                   <span class=\"n\">abort_early</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"mf\">1e-2</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels for an untargeted</span>\n<span class=\"sd\">              attack. If None (and y_target is None) then use the</span>\n<span class=\"sd\">              original labels the classifier assigns.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the target labels for a</span>\n<span class=\"sd\">              targeted attack.</span>\n<span class=\"sd\">    :param confidence: Confidence of adversarial examples: higher produces</span>\n<span class=\"sd\">                       examples with larger l2 distortion, but more</span>\n<span class=\"sd\">                       strongly classified as adversarial.</span>\n<span class=\"sd\">    :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">    :param learning_rate: The learning rate for the attack algorithm.</span>\n<span class=\"sd\">                          Smaller values produce better results but are</span>\n<span class=\"sd\">                          slower to converge.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the purturbation</span>\n<span class=\"sd\">                                and confidence of the classification.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations. Setting this</span>\n<span class=\"sd\">                           to a larger value will produce lower distortion</span>\n<span class=\"sd\">                           results. Using only a few iterations requires</span>\n<span class=\"sd\">                           a larger learning rate, and will produce larger</span>\n<span class=\"sd\">                           distortion results.</span>\n<span class=\"sd\">    :param abort_early: If true, allows early aborts if gradient descent</span>\n<span class=\"sd\">                        is unable to make progress (i.e., gets stuck in</span>\n<span class=\"sd\">                        a local minimum).</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the perturbation</span>\n<span class=\"sd\">                          and confidence of classification.</span>\n<span class=\"sd\">                          If binary_search_steps is large, the initial</span>\n<span class=\"sd\">                          constant is not important. A smaller value of</span>\n<span class=\"sd\">                          this constant gives lower distortion results.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ignore the y and y_target argument</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">confidence</span> <span class=\"o\">=</span> <span class=\"n\">confidence</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span> <span class=\"o\">=</span> <span class=\"n\">learning_rate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">abort_early</span> <span class=\"o\">=</span> <span class=\"n\">abort_early</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">ZERO</span><span class=\"p\">():</span>\n  <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CWL2</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">confidence</span><span class=\"p\">,</span> <span class=\"n\">targeted</span><span class=\"p\">,</span>\n               <span class=\"n\">learning_rate</span><span class=\"p\">,</span> <span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"n\">max_iterations</span><span class=\"p\">,</span>\n               <span class=\"n\">abort_early</span><span class=\"p\">,</span> <span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">,</span>\n               <span class=\"n\">shape</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param sess: a TF session.</span>\n<span class=\"sd\">    :param model: a cleverhans.model.Model object.</span>\n<span class=\"sd\">    :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">    :param confidence: Confidence of adversarial examples: higher produces</span>\n<span class=\"sd\">                       examples with larger l2 distortion, but more</span>\n<span class=\"sd\">                       strongly classified as adversarial.</span>\n<span class=\"sd\">    :param targeted: boolean controlling the behavior of the adversarial</span>\n<span class=\"sd\">                     examples produced. If set to False, they will be</span>\n<span class=\"sd\">                     misclassified in any wrong class. If set to True,</span>\n<span class=\"sd\">                     they will be misclassified in a chosen target class.</span>\n<span class=\"sd\">    :param learning_rate: The learning rate for the attack algorithm.</span>\n<span class=\"sd\">                          Smaller values produce better results but are</span>\n<span class=\"sd\">                          slower to converge.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the purturbation</span>\n<span class=\"sd\">                                and confidence of the classification.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations. Setting this</span>\n<span class=\"sd\">                           to a larger value will produce lower distortion</span>\n<span class=\"sd\">                           results. Using only a few iterations requires</span>\n<span class=\"sd\">                           a larger learning rate, and will produce larger</span>\n<span class=\"sd\">                           distortion results.</span>\n<span class=\"sd\">    :param abort_early: If true, allows early aborts if gradient descent</span>\n<span class=\"sd\">                        is unable to make progress (i.e., gets stuck in</span>\n<span class=\"sd\">                        a local minimum).</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the pururbation</span>\n<span class=\"sd\">                          and confidence of classification.</span>\n<span class=\"sd\">                          If binary_search_steps is large, the initial</span>\n<span class=\"sd\">                          constant is not important. A smaller value of</span>\n<span class=\"sd\">                          this constant gives lower distortion results.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value.</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value.</span>\n<span class=\"sd\">    :param num_labels: the number of classes in the model&#39;s output.</span>\n<span class=\"sd\">    :param shape: the shape of the model&#39;s input tensor.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">sess</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span> <span class=\"o\">=</span> <span class=\"n\">targeted</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">LEARNING_RATE</span> <span class=\"o\">=</span> <span class=\"n\">learning_rate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ABORT_EARLY</span> <span class=\"o\">=</span> <span class=\"n\">abort_early</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span> <span class=\"o\">=</span> <span class=\"n\">confidence</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">model</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">10</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">([</span><span class=\"n\">batch_size</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># the variable we&#39;re going to optimize over</span>\n    <span class=\"n\">modifier</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np_dtype</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># these are variables to be more efficient in sending data to tf</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;timg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">)),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;tlab&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># and here&#39;s what we use to assign them</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_timg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_tlab&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">batch_size</span><span class=\"p\">],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># the resulting instance, tanh&#39;d to keep bounded from clip_min</span>\n    <span class=\"c1\"># to clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">tanh</span><span class=\"p\">(</span><span class=\"n\">modifier</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"o\">-</span> <span class=\"n\">clip_min</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">clip_min</span>\n\n    <span class=\"c1\"># prediction BEFORE-SOFTMAX of the model</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># distance to the input data</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">other</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">tanh</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">/</span> \\\n        <span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"o\">-</span> <span class=\"n\">clip_min</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">other</span><span class=\"p\">),</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n\n    <span class=\"c1\"># compute the probability of the label class versus the maximum other</span>\n    <span class=\"n\">real</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">other</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">((</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">*</span> <span class=\"mi\">10000</span><span class=\"p\">,</span>\n                       <span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n      <span class=\"c1\"># if targeted, optimize for making the other class most likely</span>\n      <span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">other</span> <span class=\"o\">-</span> <span class=\"n\">real</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># if untargeted, optimize for making this class least likely.</span>\n      <span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">real</span> <span class=\"o\">-</span> <span class=\"n\">other</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># sum up the losses</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">*</span> <span class=\"n\">loss1</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2</span>\n\n    <span class=\"c1\"># Setup the adam optimizer and keep track of variables we&#39;re creating</span>\n    <span class=\"n\">start_vars</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">())</span>\n    <span class=\"n\">optimizer</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">AdamOptimizer</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">LEARNING_RATE</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">train</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">modifier</span><span class=\"p\">])</span>\n    <span class=\"n\">end_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">()</span>\n    <span class=\"n\">new_vars</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">x</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">end_vars</span> <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">start_vars</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># these are the variables to initialize when we run</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span><span class=\"p\">))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span><span class=\"p\">))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span><span class=\"p\">))</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">init</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">variables_initializer</span><span class=\"p\">(</span><span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">modifier</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">new_vars</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Perform the L_2 attack on the given instance for the given targets.</span>\n\n<span class=\"sd\">    If self.targeted is true, then the targets represents the target labels</span>\n<span class=\"sd\">    If self.targeted is false, then targets are the original class labels</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">),</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span>\n          <span class=\"p\">(</span><span class=\"s2\">&quot;Running CWL2 attack on instance </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)))</span>\n      <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_batch</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">:</span><span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">],</span>\n                            <span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">:</span><span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">]))</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack_batch</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"n\">labs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Run the attack on a batch of instance and labels.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">compare</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">)):</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">-=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">+=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">==</span> <span class=\"n\">y</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">!=</span> <span class=\"n\">y</span>\n\n    <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n\n    <span class=\"n\">oimgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># re-scale instances to be within range [0, 1]</span>\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">imgs</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">)</span>\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"c1\"># now convert to [-1, 1]</span>\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">imgs</span> <span class=\"o\">*</span> <span class=\"mi\">2</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mi\">1</span>\n    <span class=\"c1\"># convert to tanh-space</span>\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">arctanh</span><span class=\"p\">(</span><span class=\"n\">imgs</span> <span class=\"o\">*</span> <span class=\"o\">.</span><span class=\"mi\">999999</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># set the lower and upper bounds accordingly</span>\n    <span class=\"n\">lower_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n    <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span>\n    <span class=\"n\">upper_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"mf\">1e10</span>\n\n    <span class=\"c1\"># placeholders for the best l2, score, and instance attack found so far</span>\n    <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestscore</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestattack</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">outer_step</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span><span class=\"p\">):</span>\n      <span class=\"c1\"># completely reset adam&#39;s internal state.</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">init</span><span class=\"p\">)</span>\n      <span class=\"n\">batch</span> <span class=\"o\">=</span> <span class=\"n\">imgs</span><span class=\"p\">[:</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n      <span class=\"n\">batchlab</span> <span class=\"o\">=</span> <span class=\"n\">labs</span><span class=\"p\">[:</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n\n      <span class=\"n\">bestl2</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n      <span class=\"n\">bestscore</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Binary search step </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n                    <span class=\"n\">outer_step</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># The last iteration (if we run many steps) repeat the search once.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"ow\">and</span> <span class=\"n\">outer_step</span> <span class=\"o\">==</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">upper_bound</span>\n\n      <span class=\"c1\"># set the variables so that we don&#39;t have to send them over again</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"p\">,</span> <span class=\"p\">{</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span><span class=\"p\">:</span> <span class=\"n\">batchlab</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span><span class=\"p\">:</span> <span class=\"n\">CONST</span>\n          <span class=\"p\">})</span>\n\n      <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"mf\">1e6</span>\n      <span class=\"k\">for</span> <span class=\"n\">iteration</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">):</span>\n        <span class=\"c1\"># perform the attack</span>\n        <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">l</span><span class=\"p\">,</span> <span class=\"n\">l2s</span><span class=\"p\">,</span> <span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">nimg</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span><span class=\"p\">,</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span>\n        <span class=\"p\">])</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">//</span> <span class=\"mi\">10</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">((</span><span class=\"s2\">&quot;    Iteration </span><span class=\"si\">{}</span><span class=\"s2\"> of </span><span class=\"si\">{}</span><span class=\"s2\">: loss=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> &quot;</span> <span class=\"o\">+</span>\n                         <span class=\"s2\">&quot;l2=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> f=</span><span class=\"si\">{:.3g}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n                             <span class=\"n\">iteration</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">,</span> <span class=\"n\">l</span><span class=\"p\">,</span>\n                             <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">l2s</span><span class=\"p\">),</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">scores</span><span class=\"p\">)))</span>\n\n        <span class=\"c1\"># check if we should abort search if we&#39;re getting nowhere.</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ABORT_EARLY</span> <span class=\"ow\">and</span> \\\n           <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">//</span> <span class=\"mi\">10</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"k\">if</span> <span class=\"n\">l</span> <span class=\"o\">&gt;</span> <span class=\"n\">prev</span> <span class=\"o\">*</span> <span class=\"o\">.</span><span class=\"mi\">9999</span><span class=\"p\">:</span>\n            <span class=\"n\">msg</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;    Failed to make progress; stop early&quot;</span>\n            <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"n\">msg</span><span class=\"p\">)</span>\n            <span class=\"k\">break</span>\n          <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"n\">l</span>\n\n        <span class=\"c1\"># adjust the best result found so far</span>\n        <span class=\"k\">for</span> <span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">l2</span><span class=\"p\">,</span> <span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">ii</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">l2s</span><span class=\"p\">,</span> <span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">nimg</span><span class=\"p\">)):</span>\n          <span class=\"n\">lab</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">batchlab</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">l2</span> <span class=\"o\">&lt;</span> <span class=\"n\">bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">lab</span><span class=\"p\">):</span>\n            <span class=\"n\">bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">l2</span>\n            <span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">)</span>\n          <span class=\"k\">if</span> <span class=\"n\">l2</span> <span class=\"o\">&lt;</span> <span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">lab</span><span class=\"p\">):</span>\n            <span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">l2</span>\n            <span class=\"n\">o_bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">)</span>\n            <span class=\"n\">o_bestattack</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">ii</span>\n\n      <span class=\"c1\"># adjust the constant as needed</span>\n      <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">batchlab</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]))</span> <span class=\"ow\">and</span> \\\n           <span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">:</span>\n          <span class=\"c1\"># success, divide const by two</span>\n          <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"c1\"># failure, either multiply by 10 if no solution found yet</span>\n          <span class=\"c1\">#          or do binary search with the known upper bound</span>\n          <span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">max</span><span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n          <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">*=</span> <span class=\"mi\">10</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Successfully generated adversarial examples &quot;</span> <span class=\"o\">+</span>\n                    <span class=\"s2\">&quot;on </span><span class=\"si\">{}</span><span class=\"s2\"> of </span><span class=\"si\">{}</span><span class=\"s2\"> instances.&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n                        <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">),</span> <span class=\"n\">batch_size</span><span class=\"p\">))</span>\n      <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">)</span>\n      <span class=\"n\">mean</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">o_bestl2</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">]))</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;   Mean successful distortion: </span><span class=\"si\">{:.4g}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">mean</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># return the best solution found</span>\n    <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">o_bestattack</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/deep_fool.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.deep_fool &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.deep_fool</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The DeepFool attack</span>\n\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">copy</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">,</span> <span class=\"n\">CallableModelWrapper</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.deep_fool&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"DeepFool\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.DeepFool\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">DeepFool</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  DeepFool is an untargeted &amp; iterative attack which is based on an</span>\n<span class=\"sd\">  iterative linearization of the classifier. The implementation here</span>\n<span class=\"sd\">  is w.r.t. the L2 norm.</span>\n<span class=\"sd\">  Paper link: &quot;https://arxiv.org/pdf/1511.04599.pdf&quot;</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a DeepFool instance.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">DeepFool</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;overshoot&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;max_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;nb_candidate&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"DeepFool.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.DeepFool.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils_tf</span> <span class=\"kn\">import</span> <span class=\"n\">jacobian_graph</span>\n\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Define graph wrt to this input placeholder</span>\n    <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span> <span class=\"o\">&lt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;nb_candidate should not be greater than nb_classes&#39;</span>\n    <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">top_k</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">],</span>\n        <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span><span class=\"p\">])</span>\n    <span class=\"c1\"># grads will be the shape [batch_size, nb_candidate, image_size]</span>\n    <span class=\"n\">grads</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">(</span><span class=\"n\">jacobian_graph</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Define graph</span>\n    <span class=\"k\">def</span> <span class=\"nf\">deepfool_wrap</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;deepfool function for py_func&quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">deepfool_batch</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span>\n                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">overshoot</span><span class=\"p\">,</span>\n                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iter</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">deepfool_wrap</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"DeepFool.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.DeepFool.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_candidate</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span>\n                   <span class=\"n\">overshoot</span><span class=\"o\">=</span><span class=\"mf\">0.02</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iter</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mf\">0.</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param nb_candidate: The number of classes to test against, i.e.,</span>\n<span class=\"sd\">                         deepfool only consider nb_candidate classes when</span>\n<span class=\"sd\">                         attacking(thus accelerate speed). The nb_candidate</span>\n<span class=\"sd\">                         classes are chosen according to the prediction</span>\n<span class=\"sd\">                         confidence during implementation.</span>\n<span class=\"sd\">    :param overshoot: A termination criterion to prevent vanishing updates</span>\n<span class=\"sd\">    :param max_iter: Maximum number of iteration for deepfool</span>\n<span class=\"sd\">    :param clip_min: Minimum component value for clipping</span>\n<span class=\"sd\">    :param clip_max: Maximum component value for clipping</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_candidate</span> <span class=\"o\">=</span> <span class=\"n\">nb_candidate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">overshoot</span> <span class=\"o\">=</span> <span class=\"n\">overshoot</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iter</span> <span class=\"o\">=</span> <span class=\"n\">max_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">deepfool_batch</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                   <span class=\"n\">x</span><span class=\"p\">,</span>\n                   <span class=\"n\">pred</span><span class=\"p\">,</span>\n                   <span class=\"n\">logits</span><span class=\"p\">,</span>\n                   <span class=\"n\">grads</span><span class=\"p\">,</span>\n                   <span class=\"n\">X</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_candidate</span><span class=\"p\">,</span>\n                   <span class=\"n\">overshoot</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iter</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_classes</span><span class=\"p\">,</span>\n                   <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Applies DeepFool to a batch of inputs</span>\n<span class=\"sd\">  :param sess: TF session</span>\n<span class=\"sd\">  :param x: The input placeholder</span>\n<span class=\"sd\">  :param pred: The model&#39;s sorted symbolic output of logits, only the top</span>\n<span class=\"sd\">               nb_candidate classes are contained</span>\n<span class=\"sd\">  :param logits: The model&#39;s unnormalized output tensor (the input to</span>\n<span class=\"sd\">                 the softmax layer)</span>\n<span class=\"sd\">  :param grads: Symbolic gradients of the top nb_candidate classes, procuded</span>\n<span class=\"sd\">                from gradient_graph</span>\n<span class=\"sd\">  :param X: Numpy array with sample inputs</span>\n<span class=\"sd\">  :param nb_candidate: The number of classes to test against, i.e.,</span>\n<span class=\"sd\">                       deepfool only consider nb_candidate classes when</span>\n<span class=\"sd\">                       attacking(thus accelerate speed). The nb_candidate</span>\n<span class=\"sd\">                       classes are chosen according to the prediction</span>\n<span class=\"sd\">                       confidence during implementation.</span>\n<span class=\"sd\">  :param overshoot: A termination criterion to prevent vanishing updates</span>\n<span class=\"sd\">  :param max_iter: Maximum number of iteration for DeepFool</span>\n<span class=\"sd\">  :param clip_min: Minimum value for components of the example returned</span>\n<span class=\"sd\">  :param clip_max: Maximum value for components of the example returned</span>\n<span class=\"sd\">  :param nb_classes: Number of model output classes</span>\n<span class=\"sd\">  :return: Adversarial examples</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">X_adv</span> <span class=\"o\">=</span> <span class=\"n\">deepfool_attack</span><span class=\"p\">(</span>\n      <span class=\"n\">sess</span><span class=\"p\">,</span>\n      <span class=\"n\">x</span><span class=\"p\">,</span>\n      <span class=\"n\">pred</span><span class=\"p\">,</span>\n      <span class=\"n\">logits</span><span class=\"p\">,</span>\n      <span class=\"n\">grads</span><span class=\"p\">,</span>\n      <span class=\"n\">X</span><span class=\"p\">,</span>\n      <span class=\"n\">nb_candidate</span><span class=\"p\">,</span>\n      <span class=\"n\">overshoot</span><span class=\"p\">,</span>\n      <span class=\"n\">max_iter</span><span class=\"p\">,</span>\n      <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n      <span class=\"n\">clip_max</span><span class=\"p\">,</span>\n      <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"n\">X_adv</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">deepfool_attack</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                    <span class=\"n\">x</span><span class=\"p\">,</span>\n                    <span class=\"n\">predictions</span><span class=\"p\">,</span>\n                    <span class=\"n\">logits</span><span class=\"p\">,</span>\n                    <span class=\"n\">grads</span><span class=\"p\">,</span>\n                    <span class=\"n\">sample</span><span class=\"p\">,</span>\n                    <span class=\"n\">nb_candidate</span><span class=\"p\">,</span>\n                    <span class=\"n\">overshoot</span><span class=\"p\">,</span>\n                    <span class=\"n\">max_iter</span><span class=\"p\">,</span>\n                    <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                    <span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                    <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of DeepFool.</span>\n<span class=\"sd\">  Paper link: see https://arxiv.org/pdf/1511.04599.pdf</span>\n<span class=\"sd\">  :param sess: TF session</span>\n<span class=\"sd\">  :param x: The input placeholder</span>\n<span class=\"sd\">  :param predictions: The model&#39;s sorted symbolic output of logits, only the</span>\n<span class=\"sd\">                     top nb_candidate classes are contained</span>\n<span class=\"sd\">  :param logits: The model&#39;s unnormalized output tensor (the input to</span>\n<span class=\"sd\">                 the softmax layer)</span>\n<span class=\"sd\">  :param grads: Symbolic gradients of the top nb_candidate classes, procuded</span>\n<span class=\"sd\">               from gradient_graph</span>\n<span class=\"sd\">  :param sample: Numpy array with sample input</span>\n<span class=\"sd\">  :param nb_candidate: The number of classes to test against, i.e.,</span>\n<span class=\"sd\">                       deepfool only consider nb_candidate classes when</span>\n<span class=\"sd\">                       attacking(thus accelerate speed). The nb_candidate</span>\n<span class=\"sd\">                       classes are chosen according to the prediction</span>\n<span class=\"sd\">                       confidence during implementation.</span>\n<span class=\"sd\">  :param overshoot: A termination criterion to prevent vanishing updates</span>\n<span class=\"sd\">  :param max_iter: Maximum number of iteration for DeepFool</span>\n<span class=\"sd\">  :param clip_min: Minimum value for components of the example returned</span>\n<span class=\"sd\">  :param clip_max: Maximum value for components of the example returned</span>\n<span class=\"sd\">  :return: Adversarial examples</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">copy</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"p\">)</span>\n  <span class=\"c1\"># Initialize the loop variables</span>\n  <span class=\"n\">iteration</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n  <span class=\"n\">current</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">model_argmax</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">current</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">==</span> <span class=\"p\">():</span>\n    <span class=\"n\">current</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"n\">current</span><span class=\"p\">])</span>\n  <span class=\"n\">w</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">squeeze</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]))</span>  <span class=\"c1\"># same shape as original image</span>\n  <span class=\"n\">r_tot</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n  <span class=\"n\">original</span> <span class=\"o\">=</span> <span class=\"n\">current</span>  <span class=\"c1\"># use original label as the reference</span>\n\n  <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span>\n      <span class=\"s2\">&quot;Starting DeepFool attack up to </span><span class=\"si\">%s</span><span class=\"s2\"> iterations&quot;</span><span class=\"p\">,</span> <span class=\"n\">max_iter</span><span class=\"p\">)</span>\n  <span class=\"c1\"># Repeat this main loop until we have achieved misclassification</span>\n  <span class=\"k\">while</span> <span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">any</span><span class=\"p\">(</span><span class=\"n\">current</span> <span class=\"o\">==</span> <span class=\"n\">original</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"n\">iteration</span> <span class=\"o\">&lt;</span> <span class=\"n\">max_iter</span><span class=\"p\">):</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"mi\">5</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"ow\">and</span> <span class=\"n\">iteration</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Attack result at iteration </span><span class=\"si\">%s</span><span class=\"s2\"> is </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"n\">iteration</span><span class=\"p\">,</span> <span class=\"n\">current</span><span class=\"p\">)</span>\n    <span class=\"n\">gradients</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">adv_x</span><span class=\"p\">})</span>\n    <span class=\"n\">predictions_val</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">adv_x</span><span class=\"p\">})</span>\n    <span class=\"k\">for</span> <span class=\"n\">idx</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]):</span>\n      <span class=\"n\">pert</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span>\n      <span class=\"k\">if</span> <span class=\"n\">current</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"n\">original</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]:</span>\n        <span class=\"k\">continue</span>\n      <span class=\"k\">for</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_candidate</span><span class=\"p\">):</span>\n        <span class=\"n\">w_k</span> <span class=\"o\">=</span> <span class=\"n\">gradients</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"n\">gradients</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span>\n        <span class=\"n\">f_k</span> <span class=\"o\">=</span> <span class=\"n\">predictions_val</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"n\">predictions_val</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]</span>\n        <span class=\"c1\"># adding value 0.00001 to prevent f_k = 0</span>\n        <span class=\"n\">pert_k</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"nb\">abs</span><span class=\"p\">(</span><span class=\"n\">f_k</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mf\">0.00001</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linalg</span><span class=\"o\">.</span><span class=\"n\">norm</span><span class=\"p\">(</span><span class=\"n\">w_k</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">())</span>\n        <span class=\"k\">if</span> <span class=\"n\">pert_k</span> <span class=\"o\">&lt;</span> <span class=\"n\">pert</span><span class=\"p\">:</span>\n          <span class=\"n\">pert</span> <span class=\"o\">=</span> <span class=\"n\">pert_k</span>\n          <span class=\"n\">w</span> <span class=\"o\">=</span> <span class=\"n\">w_k</span>\n      <span class=\"n\">r_i</span> <span class=\"o\">=</span> <span class=\"n\">pert</span> <span class=\"o\">*</span> <span class=\"n\">w</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linalg</span><span class=\"o\">.</span><span class=\"n\">norm</span><span class=\"p\">(</span><span class=\"n\">w</span><span class=\"p\">)</span>\n      <span class=\"n\">r_tot</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">r_tot</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">r_i</span>\n\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">r_tot</span> <span class=\"o\">+</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"n\">current</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">model_argmax</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">current</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">==</span> <span class=\"p\">():</span>\n      <span class=\"n\">current</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span><span class=\"n\">current</span><span class=\"p\">])</span>\n    <span class=\"c1\"># Update loop variables</span>\n    <span class=\"n\">iteration</span> <span class=\"o\">=</span> <span class=\"n\">iteration</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n\n  <span class=\"c1\"># need more revision, including info like how many succeed</span>\n  <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Attack result at iteration </span><span class=\"si\">%s</span><span class=\"s2\"> is </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"n\">iteration</span><span class=\"p\">,</span> <span class=\"n\">current</span><span class=\"p\">)</span>\n  <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> out of </span><span class=\"si\">%s</span><span class=\"s2\"> become adversarial examples at iteration </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n               <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">current</span> <span class=\"o\">!=</span> <span class=\"n\">original</span><span class=\"p\">),</span>\n               <span class=\"n\">sample</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span>\n               <span class=\"n\">iteration</span><span class=\"p\">)</span>\n  <span class=\"c1\"># need to clip this image into the given range</span>\n  <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">((</span><span class=\"mi\">1</span> <span class=\"o\">+</span> <span class=\"n\">overshoot</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">r_tot</span> <span class=\"o\">+</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">adv_x</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/elastic_net_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.elastic_net_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.elastic_net_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The ElasticNetMethod attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n\n<span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.elastic_net_method&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">ZERO</span><span class=\"p\">():</span>\n  <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">asarray</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"ElasticNetMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ElasticNetMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">ElasticNetMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This attack features L1-oriented adversarial examples and includes</span>\n<span class=\"sd\">  the C&amp;W L2 attack as a special case (when beta is set to 0).</span>\n<span class=\"sd\">  Adversarial examples attain similar performance to those</span>\n<span class=\"sd\">  generated by the C&amp;W L2 attack in the white-box case,</span>\n<span class=\"sd\">  and more importantly, have improved transferability properties</span>\n<span class=\"sd\">  and complement adversarial training.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1709.04114</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">ElasticNetMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;beta&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;decision_rule&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;batch_size&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;confidence&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;targeted&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;learning_rate&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;binary_search_steps&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;max_iterations&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;abort_early&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;initial_const&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_max&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"ElasticNetMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ElasticNetMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param x: (required) A tensor with the inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">attack</span> <span class=\"o\">=</span> <span class=\"n\">EAD</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta</span><span class=\"p\">,</span>\n                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decision_rule</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">confidence</span><span class=\"p\">,</span>\n                 <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">,</span>\n                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span><span class=\"p\">,</span>\n                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">abort_early</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">,</span>\n                 <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">ead_wrap</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">attack</span><span class=\"o\">.</span><span class=\"n\">attack</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">ead_wrap</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"ElasticNetMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ElasticNetMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">beta</span><span class=\"o\">=</span><span class=\"mf\">1e-2</span><span class=\"p\">,</span>\n                   <span class=\"n\">decision_rule</span><span class=\"o\">=</span><span class=\"s1\">&#39;EN&#39;</span><span class=\"p\">,</span>\n                   <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n                   <span class=\"n\">confidence</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"mf\">1e-2</span><span class=\"p\">,</span>\n                   <span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"mi\">9</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"mi\">1000</span><span class=\"p\">,</span>\n                   <span class=\"n\">abort_early</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"mf\">1e-3</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels for an untargeted</span>\n<span class=\"sd\">              attack. If None (and y_target is None) then use the</span>\n<span class=\"sd\">              original labels the classifier assigns.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the target labels for a</span>\n<span class=\"sd\">              targeted attack.</span>\n<span class=\"sd\">    :param beta: Trades off L2 distortion with L1 distortion: higher</span>\n<span class=\"sd\">                 produces examples with lower L1 distortion, at the</span>\n<span class=\"sd\">                 cost of higher L2 (and typically Linf) distortion</span>\n<span class=\"sd\">    :param decision_rule: EN or L1. Select final adversarial example from</span>\n<span class=\"sd\">                          all successful examples based on the least</span>\n<span class=\"sd\">                          elastic-net or L1 distortion criterion.</span>\n<span class=\"sd\">    :param confidence: Confidence of adversarial examples: higher produces</span>\n<span class=\"sd\">                       examples with larger l2 distortion, but more</span>\n<span class=\"sd\">                       strongly classified as adversarial.</span>\n<span class=\"sd\">    :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">    :param learning_rate: The learning rate for the attack algorithm.</span>\n<span class=\"sd\">                          Smaller values produce better results but are</span>\n<span class=\"sd\">                          slower to converge.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the perturbation</span>\n<span class=\"sd\">                                and confidence of the classification. Set</span>\n<span class=\"sd\">                                &#39;initial_const&#39; to a large value and fix</span>\n<span class=\"sd\">                                this param to 1 for speed.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations. Setting this</span>\n<span class=\"sd\">                           to a larger value will produce lower distortion</span>\n<span class=\"sd\">                           results. Using only a few iterations requires</span>\n<span class=\"sd\">                           a larger learning rate, and will produce larger</span>\n<span class=\"sd\">                           distortion results.</span>\n<span class=\"sd\">    :param abort_early: If true, allows early abort when the total</span>\n<span class=\"sd\">                        loss starts to increase (greatly speeds up attack,</span>\n<span class=\"sd\">                        but hurts performance, particularly on ImageNet)</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the perturbation</span>\n<span class=\"sd\">                          and confidence of classification.</span>\n<span class=\"sd\">                          If binary_search_steps is large, the initial</span>\n<span class=\"sd\">                          constant is not important. A smaller value of</span>\n<span class=\"sd\">                          this constant gives lower distortion results.</span>\n<span class=\"sd\">                          For computational efficiency, fix</span>\n<span class=\"sd\">                          binary_search_steps to 1 and set this param</span>\n<span class=\"sd\">                          to a large value.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ignore the y and y_target argument</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta</span> <span class=\"o\">=</span> <span class=\"n\">beta</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decision_rule</span> <span class=\"o\">=</span> <span class=\"n\">decision_rule</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">confidence</span> <span class=\"o\">=</span> <span class=\"n\">confidence</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span> <span class=\"o\">=</span> <span class=\"n\">learning_rate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">abort_early</span> <span class=\"o\">=</span> <span class=\"n\">abort_early</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span></div></div>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">EAD</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">beta</span><span class=\"p\">,</span> <span class=\"n\">decision_rule</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">,</span>\n               <span class=\"n\">confidence</span><span class=\"p\">,</span> <span class=\"n\">targeted</span><span class=\"p\">,</span> <span class=\"n\">learning_rate</span><span class=\"p\">,</span> <span class=\"n\">binary_search_steps</span><span class=\"p\">,</span>\n               <span class=\"n\">max_iterations</span><span class=\"p\">,</span> <span class=\"n\">abort_early</span><span class=\"p\">,</span> <span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n               <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    EAD Attack</span>\n\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param sess: a TF session.</span>\n<span class=\"sd\">    :param model: a cleverhans.model.Model object.</span>\n<span class=\"sd\">    :param beta: Trades off L2 distortion with L1 distortion: higher</span>\n<span class=\"sd\">                 produces examples with lower L1 distortion, at the</span>\n<span class=\"sd\">                 cost of higher L2 (and typically Linf) distortion</span>\n<span class=\"sd\">    :param decision_rule: EN or L1. Select final adversarial example from</span>\n<span class=\"sd\">                          all successful examples based on the least</span>\n<span class=\"sd\">                          elastic-net or L1 distortion criterion.</span>\n<span class=\"sd\">    :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">    :param confidence: Confidence of adversarial examples: higher produces</span>\n<span class=\"sd\">                       examples with larger l2 distortion, but more</span>\n<span class=\"sd\">                       strongly classified as adversarial.</span>\n<span class=\"sd\">    :param targeted: boolean controlling the behavior of the adversarial</span>\n<span class=\"sd\">                     examples produced. If set to False, they will be</span>\n<span class=\"sd\">                     misclassified in any wrong class. If set to True,</span>\n<span class=\"sd\">                     they will be misclassified in a chosen target class.</span>\n<span class=\"sd\">    :param learning_rate: The learning rate for the attack algorithm.</span>\n<span class=\"sd\">                          Smaller values produce better results but are</span>\n<span class=\"sd\">                          slower to converge.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the perturbation</span>\n<span class=\"sd\">                                and confidence of the classification. Set</span>\n<span class=\"sd\">                                &#39;initial_const&#39; to a large value and fix</span>\n<span class=\"sd\">                                this param to 1 for speed.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations. Setting this</span>\n<span class=\"sd\">                           to a larger value will produce lower distortion</span>\n<span class=\"sd\">                           results. Using only a few iterations requires</span>\n<span class=\"sd\">                           a larger learning rate, and will produce larger</span>\n<span class=\"sd\">                           distortion results.</span>\n<span class=\"sd\">    :param abort_early: If true, allows early abort when the total</span>\n<span class=\"sd\">                        loss starts to increase (greatly speeds up attack,</span>\n<span class=\"sd\">                        but hurts performance, particularly on ImageNet)</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the perturbation</span>\n<span class=\"sd\">                          and confidence of classification.</span>\n<span class=\"sd\">                          If binary_search_steps is large, the initial</span>\n<span class=\"sd\">                          constant is not important. A smaller value of</span>\n<span class=\"sd\">                          this constant gives lower distortion results.</span>\n<span class=\"sd\">                          For computational efficiency, fix</span>\n<span class=\"sd\">                          binary_search_steps to 1 and set this param</span>\n<span class=\"sd\">                          to a large value.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value.</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value.</span>\n<span class=\"sd\">    :param num_labels: the number of classes in the model&#39;s output.</span>\n<span class=\"sd\">    :param shape: the shape of the model&#39;s input tensor.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">sess</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span> <span class=\"o\">=</span> <span class=\"n\">targeted</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">LEARNING_RATE</span> <span class=\"o\">=</span> <span class=\"n\">learning_rate</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ABORT_EARLY</span> <span class=\"o\">=</span> <span class=\"n\">abort_early</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span> <span class=\"o\">=</span> <span class=\"n\">confidence</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">model</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decision_rule</span> <span class=\"o\">=</span> <span class=\"n\">decision_rule</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta</span> <span class=\"o\">=</span> <span class=\"n\">beta</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">10</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">([</span><span class=\"n\">batch_size</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># these are variables to be more efficient in sending data to tf</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;timg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;newimg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;slack&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">)),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;tlab&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># and here&#39;s what we use to assign them</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_timg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_newimg&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_slack&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">num_labels</span><span class=\"p\">),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_tlab&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">batch_size</span><span class=\"p\">],</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;assign_const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">trainable</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step_t</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Fast Iterative Shrinkage Thresholding</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">zt</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">divide</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step_t</span><span class=\"p\">,</span>\n                        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step_t</span> <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">))</span>\n    <span class=\"n\">cond1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">subtract</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                               <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">cond2</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">subtract</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span>\n                                                     <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">)),</span>\n                                  <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">cond3</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">subtract</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">negative</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">)),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">upper</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">subtract</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">),</span>\n                       <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">))</span>\n    <span class=\"n\">lower</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">),</span>\n                       <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">))</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"n\">cond1</span><span class=\"p\">,</span> <span class=\"n\">upper</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">+=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"n\">cond2</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">+=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"n\">cond3</span><span class=\"p\">,</span> <span class=\"n\">lower</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span> <span class=\"o\">+=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">zt</span><span class=\"p\">,</span>\n                                     <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># --------------------------------</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter_y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># prediction BEFORE-SOFTMAX of the model</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_y</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># distance to the input data</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                             <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                               <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                             <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"p\">),</span>\n                               <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">elasticdist</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span> <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span><span class=\"p\">,</span>\n                                                 <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">elasticdist_y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist_y</span> <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist_y</span><span class=\"p\">,</span>\n                                                     <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decision_rule</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;EN&#39;</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">elasticdist</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit_p</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Elastic&#39;</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit_p</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;L1&#39;</span>\n\n    <span class=\"c1\"># compute the probability of the label class versus the maximum other</span>\n    <span class=\"n\">real</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">real_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">other</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">((</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span> <span class=\"o\">-</span>\n                       <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">*</span> <span class=\"mi\">10000</span><span class=\"p\">),</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">other_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">((</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_y</span> <span class=\"o\">-</span>\n                         <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span> <span class=\"o\">*</span> <span class=\"mi\">10000</span><span class=\"p\">),</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n      <span class=\"c1\"># if targeted, optimize for making the other class most likely</span>\n      <span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">other</span> <span class=\"o\">-</span> <span class=\"n\">real</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n      <span class=\"n\">loss1_y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">other_y</span> <span class=\"o\">-</span> <span class=\"n\">real_y</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># if untargeted, optimize for making this class least likely.</span>\n      <span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">real</span> <span class=\"o\">-</span> <span class=\"n\">other</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n      <span class=\"n\">loss1_y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">ZERO</span><span class=\"p\">(),</span> <span class=\"n\">real_y</span> <span class=\"o\">-</span> <span class=\"n\">other_y</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># sum up the losses</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss21</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss21_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist_y</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist_y</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">*</span> <span class=\"n\">loss1</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1_y</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">*</span> <span class=\"n\">loss1_y</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_opt</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1_y</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2_y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss1</span><span class=\"o\">+</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss2</span><span class=\"o\">+</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">beta_t</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss21</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">polynomial_decay</span><span class=\"p\">(</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">LEARNING_RATE</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">,</span>\n        <span class=\"mi\">0</span><span class=\"p\">,</span>\n        <span class=\"n\">power</span><span class=\"o\">=</span><span class=\"mf\">0.5</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Setup the optimizer and keep track of variables we&#39;re creating</span>\n    <span class=\"n\">start_vars</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">())</span>\n    <span class=\"n\">optimizer</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">GradientDescentOptimizer</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">train</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_opt</span><span class=\"p\">,</span>\n                                    <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">],</span>\n                                    <span class=\"n\">global_step</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span><span class=\"p\">)</span>\n    <span class=\"n\">end_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">()</span>\n    <span class=\"n\">new_vars</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">x</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">end_vars</span> <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">start_vars</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># these are the variables to initialize when we run</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">timg</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span><span class=\"p\">))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tlab</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span><span class=\"p\">))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"o\">.</span><span class=\"n\">assign</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span><span class=\"p\">))</span>\n\n    <span class=\"n\">var_list</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">global_step</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">slack</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">]</span><span class=\"o\">+</span><span class=\"n\">new_vars</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">init</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">variables_initializer</span><span class=\"p\">(</span><span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"n\">var_list</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Perform the EAD attack on the given instance for the given targets.</span>\n\n<span class=\"sd\">    If self.targeted is true, then the targets represents the target labels</span>\n<span class=\"sd\">    If self.targeted is false, then targets are the original class labels</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n    <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">//</span> <span class=\"n\">batch_size</span><span class=\"p\">):</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span>\n          <span class=\"p\">(</span><span class=\"s2\">&quot;Running EAD attack on instance </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n           <span class=\"n\">i</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)))</span>\n      <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_batch</span><span class=\"p\">(</span>\n              <span class=\"n\">imgs</span><span class=\"p\">[</span><span class=\"n\">i</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">:(</span><span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">],</span>\n              <span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">i</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">:(</span><span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">]))</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span> <span class=\"o\">!=</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">last_elements</span> <span class=\"o\">=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span><span class=\"p\">)</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span>\n          <span class=\"p\">(</span><span class=\"s2\">&quot;Running EAD attack on instance </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n           <span class=\"n\">last_elements</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)))</span>\n      <span class=\"n\">temp_imgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">imgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:])</span>\n      <span class=\"n\">temp_targets</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">targets</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">:])</span>\n      <span class=\"n\">temp_imgs</span><span class=\"p\">[:(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span><span class=\"p\">)]</span> <span class=\"o\">=</span> <span class=\"n\">imgs</span><span class=\"p\">[</span><span class=\"n\">last_elements</span><span class=\"p\">:]</span>\n      <span class=\"n\">temp_targets</span><span class=\"p\">[:(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span><span class=\"p\">)]</span> <span class=\"o\">=</span> <span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">last_elements</span><span class=\"p\">:]</span>\n      <span class=\"n\">temp_data</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_batch</span><span class=\"p\">(</span><span class=\"n\">temp_imgs</span><span class=\"p\">,</span> <span class=\"n\">temp_targets</span><span class=\"p\">)</span>\n      <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">extend</span><span class=\"p\">(</span><span class=\"n\">temp_data</span><span class=\"p\">[:(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"n\">batch_size</span><span class=\"p\">)],</span>\n               <span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">last_elements</span><span class=\"p\">:])</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack_batch</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"n\">labs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Run the attack on a batch of instance and labels.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">compare</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">)):</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">-=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">+=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">CONFIDENCE</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">TARGETED</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">==</span> <span class=\"n\">y</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">x</span> <span class=\"o\">!=</span> <span class=\"n\">y</span>\n\n    <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n\n    <span class=\"n\">imgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># set the lower and upper bounds accordingly</span>\n    <span class=\"n\">lower_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n    <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span>\n    <span class=\"n\">upper_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"mf\">1e10</span>\n\n    <span class=\"c1\"># placeholders for the best en, score, and instance attack found so far</span>\n    <span class=\"n\">o_bestdst</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestscore</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestattack</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">imgs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">outer_step</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span><span class=\"p\">):</span>\n      <span class=\"c1\"># completely reset the optimizer&#39;s internal state.</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">init</span><span class=\"p\">)</span>\n      <span class=\"n\">batch</span> <span class=\"o\">=</span> <span class=\"n\">imgs</span><span class=\"p\">[:</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n      <span class=\"n\">batchlab</span> <span class=\"o\">=</span> <span class=\"n\">labs</span><span class=\"p\">[:</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n\n      <span class=\"n\">bestdst</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n      <span class=\"n\">bestscore</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Binary search step </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n                    <span class=\"n\">outer_step</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># The last iteration (if we run many steps) repeat the search once.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"ow\">and</span> <span class=\"n\">outer_step</span> <span class=\"o\">==</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">BINARY_SEARCH_STEPS</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">upper_bound</span>\n\n      <span class=\"c1\"># set the variables so that we don&#39;t have to send them over again</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"p\">,</span> <span class=\"p\">{</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_timg</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_tlab</span><span class=\"p\">:</span> <span class=\"n\">batchlab</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_const</span><span class=\"p\">:</span> <span class=\"n\">CONST</span>\n          <span class=\"p\">})</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_newimg</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">})</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter_y</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assign_slack</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">})</span>\n      <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"mf\">1e6</span>\n      <span class=\"k\">for</span> <span class=\"n\">iteration</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">):</span>\n        <span class=\"c1\"># perform the attack</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"p\">])</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">setter_y</span><span class=\"p\">])</span>\n        <span class=\"n\">l</span><span class=\"p\">,</span> <span class=\"n\">l2s</span><span class=\"p\">,</span> <span class=\"n\">l1s</span><span class=\"p\">,</span> <span class=\"n\">crit</span><span class=\"p\">,</span> <span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">nimg</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l1dist</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output</span><span class=\"p\">,</span>\n                                                         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">newimg</span><span class=\"p\">])</span>\n        <span class=\"k\">if</span> <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">//</span> <span class=\"mi\">10</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">((</span><span class=\"s2\">&quot;    Iteration </span><span class=\"si\">{}</span><span class=\"s2\"> of </span><span class=\"si\">{}</span><span class=\"s2\">: loss=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> &quot;</span> <span class=\"o\">+</span>\n                         <span class=\"s2\">&quot;l2=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> l1=</span><span class=\"si\">{:.3g}</span><span class=\"s2\"> f=</span><span class=\"si\">{:.3g}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n                             <span class=\"n\">iteration</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span><span class=\"p\">,</span> <span class=\"n\">l</span><span class=\"p\">,</span>\n                             <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">l2s</span><span class=\"p\">),</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">l1s</span><span class=\"p\">),</span>\n                             <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">scores</span><span class=\"p\">)))</span>\n\n        <span class=\"c1\"># check if we should abort search if we&#39;re getting nowhere.</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ABORT_EARLY</span> <span class=\"ow\">and</span> \\\n           <span class=\"n\">iteration</span> <span class=\"o\">%</span> <span class=\"p\">((</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">MAX_ITERATIONS</span> <span class=\"o\">//</span> <span class=\"mi\">10</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"k\">if</span> <span class=\"n\">l</span> <span class=\"o\">&gt;</span> <span class=\"n\">prev</span> <span class=\"o\">*</span> <span class=\"o\">.</span><span class=\"mi\">9999</span><span class=\"p\">:</span>\n            <span class=\"n\">msg</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;    Failed to make progress; stop early&quot;</span>\n            <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"n\">msg</span><span class=\"p\">)</span>\n            <span class=\"k\">break</span>\n          <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"n\">l</span>\n\n        <span class=\"c1\"># adjust the best result found so far</span>\n        <span class=\"k\">for</span> <span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">dst</span><span class=\"p\">,</span> <span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">ii</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">crit</span><span class=\"p\">,</span> <span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">nimg</span><span class=\"p\">)):</span>\n          <span class=\"n\">lab</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">batchlab</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">dst</span> <span class=\"o\">&lt;</span> <span class=\"n\">bestdst</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">lab</span><span class=\"p\">):</span>\n            <span class=\"n\">bestdst</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">dst</span>\n            <span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">)</span>\n          <span class=\"k\">if</span> <span class=\"n\">dst</span> <span class=\"o\">&lt;</span> <span class=\"n\">o_bestdst</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">,</span> <span class=\"n\">lab</span><span class=\"p\">):</span>\n            <span class=\"n\">o_bestdst</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">dst</span>\n            <span class=\"n\">o_bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">sc</span><span class=\"p\">)</span>\n            <span class=\"n\">o_bestattack</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">ii</span>\n\n      <span class=\"c1\"># adjust the constant as needed</span>\n      <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">compare</span><span class=\"p\">(</span><span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">batchlab</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]))</span> <span class=\"ow\">and</span> \\\n           <span class=\"n\">bestscore</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">:</span>\n          <span class=\"c1\"># success, divide const by two</span>\n          <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"c1\"># failure, either multiply by 10 if no solution found yet</span>\n          <span class=\"c1\">#          or do binary search with the known upper bound</span>\n          <span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">max</span><span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n          <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">*=</span> <span class=\"mi\">10</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Successfully generated adversarial examples &quot;</span> <span class=\"o\">+</span>\n                    <span class=\"s2\">&quot;on </span><span class=\"si\">{}</span><span class=\"s2\"> of </span><span class=\"si\">{}</span><span class=\"s2\"> instances.&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n                        <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">),</span> <span class=\"n\">batch_size</span><span class=\"p\">))</span>\n      <span class=\"n\">o_bestdst</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestdst</span><span class=\"p\">)</span>\n      <span class=\"n\">mean</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">o_bestdst</span><span class=\"p\">[</span><span class=\"n\">o_bestdst</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">]))</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">crit_p</span> <span class=\"o\">+</span>\n                    <span class=\"s2\">&quot; Mean successful distortion: </span><span class=\"si\">{:.4g}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">mean</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># return the best solution found</span>\n    <span class=\"n\">o_bestdst</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestdst</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">o_bestattack</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/fast_feature_adversaries.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.fast_feature_adversaries &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.fast_feature_adversaries</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The FastFeatureAdversaries attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils_tf</span> <span class=\"kn\">import</span> <span class=\"n\">clip_eta</span>\n\n\n<div class=\"viewcode-block\" id=\"FastFeatureAdversaries\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastFeatureAdversaries\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">FastFeatureAdversaries</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This is a fast implementation of &quot;Feature Adversaries&quot;, an attack</span>\n<span class=\"sd\">  against a target internal representation of a model.</span>\n<span class=\"sd\">  &quot;Feature adversaries&quot; were originally introduced in (Sabour et al. 2016),</span>\n<span class=\"sd\">  where the optimization was done using LBFGS.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1511.05122</span>\n\n<span class=\"sd\">  This implementation is similar to &quot;Basic Iterative Method&quot;</span>\n<span class=\"sd\">  (Kurakin et al. 2016) but applied to the internal representations.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a FastFeatureAdversaries instance.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">FastFeatureAdversaries</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                                 <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;eps_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;layer&#39;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"FastFeatureAdversaries.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">layer</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"mf\">0.05</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param layer: (required str) name of the layer to target.</span>\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param eps_iter: (optional float) step size for each attack iteration</span>\n<span class=\"sd\">    :param nb_iter: (optional int) Number of attack iterations.</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">                Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">layer</span> <span class=\"o\">=</span> <span class=\"n\">layer</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">=</span> <span class=\"n\">eps_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be either np.inf, 1, or 2.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div>\n\n<div class=\"viewcode-block\" id=\"FastFeatureAdversaries.attack_single_step\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.attack_single_step\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">attack_single_step</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"n\">g_feat</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    TensorFlow implementation of the Fast Feature Gradient. This is a</span>\n<span class=\"sd\">    single step attack similar to Fast Gradient Method that attacks an</span>\n<span class=\"sd\">    internal representation.</span>\n\n<span class=\"sd\">    :param x: the input placeholder</span>\n<span class=\"sd\">    :param eta: A tensor the same shape as x that holds the perturbation.</span>\n<span class=\"sd\">    :param g_feat: model&#39;s internal tensor for guide</span>\n<span class=\"sd\">    :return: a tensor for the adversarial example</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"n\">a_feat</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">layer</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># feat.shape = (batch, c) or (batch, w, h, c)</span>\n    <span class=\"n\">axis</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">a_feat</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># Compute loss</span>\n    <span class=\"c1\"># This is a targeted attack, hence the negative sign</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">a_feat</span> <span class=\"o\">-</span> <span class=\"n\">g_feat</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Define gradient of loss wrt input</span>\n    <span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Multiply by constant epsilon</span>\n    <span class=\"n\">scaled_signed_grad</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Add perturbation to original example to obtain adversarial example</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span> <span class=\"o\">+</span> <span class=\"n\">scaled_signed_grad</span>\n\n    <span class=\"c1\"># If clipping is needed,</span>\n    <span class=\"c1\"># reset all values outside of [clip_min, clip_max]</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span> <span class=\"o\">-</span> <span class=\"n\">x</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">eta</span></div>\n\n<div class=\"viewcode-block\" id=\"FastFeatureAdversaries.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">g</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param g: The target value of the symbolic representation</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">g_feat</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">g</span><span class=\"p\">)[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">layer</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># Initialize loop variables</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">e</span><span class=\"p\">):</span>\n      <span class=\"n\">new_eta</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_single_step</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"n\">g_feat</span><span class=\"p\">)</span>\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">new_eta</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">([]),</span> <span class=\"n\">eta</span><span class=\"p\">),</span> <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                           <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Define adversarial example (and clip if necessary)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/fast_gradient_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.fast_gradient_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.fast_gradient_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The FastGradientMethod attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_max</span><span class=\"p\">,</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n\n<div class=\"viewcode-block\" id=\"FastGradientMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastGradientMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">FastGradientMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This attack was originally implemented by Goodfellow et al. (2014) with the</span>\n<span class=\"sd\">  infinity norm (and is known as the &quot;Fast Gradient Sign Method&quot;). This</span>\n<span class=\"sd\">  implementation extends the attack to other norms, and is therefore called</span>\n<span class=\"sd\">  the Fast Gradient Method.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1412.6572</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a FastGradientMethod instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">FastGradientMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;sanity_checks&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;loss_fn&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"FastGradientMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastGradientMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Returns the graph for Fast Gradient Method adversarial examples.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">_nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">fgm</span><span class=\"p\">(</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span>\n        <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">,</span>\n        <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span>\n        <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span>\n        <span class=\"n\">loss_fn</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_fn</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span><span class=\"p\">,</span>\n        <span class=\"n\">targeted</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">),</span>\n        <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"FastGradientMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.FastGradientMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">loss_fn</span><span class=\"o\">=</span><span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) attack step size (input variation)</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics NumPy).</span>\n<span class=\"sd\">                Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">    :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels. Only provide</span>\n<span class=\"sd\">              this parameter if you&#39;d like to use true labels when crafting</span>\n<span class=\"sd\">              adversarial samples. Otherwise, model predictions are used as</span>\n<span class=\"sd\">              labels to avoid the &quot;label leaking&quot; effect (explained in this</span>\n<span class=\"sd\">              paper: https://arxiv.org/abs/1611.01236). Default is None.</span>\n<span class=\"sd\">              Labels should be one-hot-encoded.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the labels to target. Leave</span>\n<span class=\"sd\">                     y_target=None if y is also set. Labels should be</span>\n<span class=\"sd\">                     one-hot-encoded.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    :param clip_grad: (optional bool) Ignore gradient components</span>\n<span class=\"sd\">                      at positions where the input is already at the boundary</span>\n<span class=\"sd\">                      of the domain, and the update step will get clipped out.</span>\n<span class=\"sd\">    :param sanity_checks: bool, if True, include asserts</span>\n<span class=\"sd\">      (Turn them off to use less runtime / memory or for unit tests that</span>\n<span class=\"sd\">      intentionally pass strange input)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Save attack-specific parameters</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_fn</span> <span class=\"o\">=</span> <span class=\"n\">loss_fn</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"o\">=</span> <span class=\"n\">clip_grad</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span> <span class=\"o\">=</span> <span class=\"n\">sanity_checks</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must not set both y and y_target&quot;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">)]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be either np.inf, 1, or 2.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must set clip_min and clip_max if clip_grad is set&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<div class=\"viewcode-block\" id=\"fgm\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.fgm\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">fgm</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"n\">logits</span><span class=\"p\">,</span>\n        <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n        <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n        <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n        <span class=\"n\">loss_fn</span><span class=\"o\">=</span><span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"n\">targeted</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of the Fast Gradient Method.</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param logits: output of model.get_logits</span>\n<span class=\"sd\">  :param y: (optional) A placeholder for the true labels. If targeted</span>\n<span class=\"sd\">            is true, then provide the target label. Otherwise, only provide</span>\n<span class=\"sd\">            this parameter if you&#39;d like to use true labels when crafting</span>\n<span class=\"sd\">            adversarial samples. Otherwise, model predictions are used as</span>\n<span class=\"sd\">            labels to avoid the &quot;label leaking&quot; effect (explained in this</span>\n<span class=\"sd\">            paper: https://arxiv.org/abs/1611.01236). Default is None.</span>\n<span class=\"sd\">            Labels should be one-hot-encoded.</span>\n<span class=\"sd\">  :param eps: the epsilon (input variation parameter)</span>\n<span class=\"sd\">  :param ord: (optional) Order of the norm (mimics NumPy).</span>\n<span class=\"sd\">              Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">  :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss</span>\n<span class=\"sd\">  :param clip_min: Minimum float value for adversarial example components</span>\n<span class=\"sd\">  :param clip_max: Maximum float value for adversarial example components</span>\n<span class=\"sd\">  :param clip_grad: (optional bool) Ignore gradient components</span>\n<span class=\"sd\">                    at positions where the input is already at the boundary</span>\n<span class=\"sd\">                    of the domain, and the update step will get clipped out.</span>\n<span class=\"sd\">  :param targeted: Is the attack targeted or untargeted? Untargeted, the</span>\n<span class=\"sd\">                   default, will try to make the label incorrect. Targeted</span>\n<span class=\"sd\">                   will instead try to move in the direction of being more</span>\n<span class=\"sd\">                   like y.</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n  <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n  <span class=\"k\">if</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n  <span class=\"c1\"># Make sure the caller has not passed probs by accident</span>\n  <span class=\"k\">assert</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;Softmax&#39;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Using model predictions as ground truth to avoid label leaking</span>\n    <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n  <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span> <span class=\"o\">/</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Compute loss</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">targeted</span><span class=\"p\">:</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">loss</span>\n\n  <span class=\"c1\"># Define gradient of loss wrt input</span>\n  <span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_grad</span><span class=\"p\">:</span>\n    <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">zero_out_clipped_grads</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n  <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">optimize_linear</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Add perturbation to original example to obtain adversarial example</span>\n  <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">optimal_perturbation</span>\n\n  <span class=\"c1\"># If clipping is needed, reset all values outside of [clip_min, clip_max]</span>\n  <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"c1\"># We don&#39;t currently support one-sided clipping</span>\n    <span class=\"k\">assert</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n    <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n\n<div class=\"viewcode-block\" id=\"optimize_linear\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.optimize_linear\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">optimize_linear</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Solves for the optimal input to a linear function under a norm constraint.</span>\n\n<span class=\"sd\">  Optimal_perturbation = argmax_{eta, ||eta||_{ord} &lt; eps} dot(eta, grad)</span>\n\n<span class=\"sd\">  :param grad: tf tensor containing a batch of gradients</span>\n<span class=\"sd\">  :param eps: float scalar specifying size of constraint region</span>\n<span class=\"sd\">  :param ord: int specifying order of norm</span>\n<span class=\"sd\">  :returns:</span>\n<span class=\"sd\">    tf tensor containing optimal perturbation</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"c1\"># In Python 2, the `list` call in the following line is redundant / harmless.</span>\n  <span class=\"c1\"># In Python 3, the `list` call is needed to convert the iterator returned by `range` into a list.</span>\n  <span class=\"n\">red_ind</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())))</span>\n  <span class=\"n\">avoid_zero_div</span> <span class=\"o\">=</span> <span class=\"mf\">1e-12</span>\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Take sign of gradient</span>\n    <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n    <span class=\"c1\"># The following line should not change the numerical results.</span>\n    <span class=\"c1\"># It applies only because `optimal_perturbation` is the output of</span>\n    <span class=\"c1\"># a `sign` op, which has zero derivative anyway.</span>\n    <span class=\"c1\"># It should not be applied for the other norms, where the</span>\n    <span class=\"c1\"># perturbation has a non-zero derivative.</span>\n    <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">optimal_perturbation</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"n\">abs_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n    <span class=\"n\">sign</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n    <span class=\"n\">max_abs_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">red_ind</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">tied_for_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">max_abs_grad</span><span class=\"p\">))</span>\n    <span class=\"n\">num_ties</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tied_for_max</span><span class=\"p\">,</span> <span class=\"n\">red_ind</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">sign</span> <span class=\"o\">*</span> <span class=\"n\">tied_for_max</span> <span class=\"o\">/</span> <span class=\"n\">num_ties</span>\n  <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n    <span class=\"n\">square</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">avoid_zero_div</span><span class=\"p\">,</span>\n                        <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">),</span>\n                                   <span class=\"n\">reduction_indices</span><span class=\"o\">=</span><span class=\"n\">red_ind</span><span class=\"p\">,</span>\n                                   <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n    <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">grad</span> <span class=\"o\">/</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">square</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Only L-inf, L1 and L2 norms are &quot;</span>\n                              <span class=\"s2\">&quot;currently implemented.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Scale perturbation to be the solution for the norm=eps rather than</span>\n  <span class=\"c1\"># norm=1 problem</span>\n  <span class=\"n\">scaled_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">mul</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">optimal_perturbation</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">scaled_perturbation</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/hop_skip_jump_attack.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.hop_skip_jump_attack &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.hop_skip_jump_attack</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot; Boundary Attack++</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n<span class=\"kn\">from</span> <span class=\"nn\">warnings</span> <span class=\"kn\">import</span> <span class=\"n\">warn</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span><span class=\"p\">,</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">np_dtype</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.hop_skip_jump_attack&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"HopSkipJumpAttack\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.HopSkipJumpAttack\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">HopSkipJumpAttack</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright.</span>\n<span class=\"sd\">  It is a decision-based attack that requires access to output</span>\n<span class=\"sd\">  labels of a model alone.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1904.02144</span>\n<span class=\"sd\">  At a high level, this attack is an iterative attack composed of three</span>\n<span class=\"sd\">  steps: Binary search to approach the boundary; gradient estimation;</span>\n<span class=\"sd\">  stepsize search. HopSkipJumpAttack requires fewer model queries than</span>\n<span class=\"sd\">  Boundary Attack which was based on rejective sampling.</span>\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor.</span>\n<span class=\"sd\">  see parse_params for details.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">HopSkipJumpAttack</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span>\n                                                 <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;stepsize_search&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;constraint&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;num_iterations&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;initial_num_evals&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;max_num_evals&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;batch_size&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;verbose&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;gamma&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"HopSkipJumpAttack.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n<span class=\"sd\">    :param x: A tensor with the inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:]]</span>\n\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"n\">_check_first_dimension</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"s1\">&#39;input&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">_check_first_dimension</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n          <span class=\"s1\">&#39;Require a target image for targeted attack.&#39;</span>\n      <span class=\"n\">_check_first_dimension</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span><span class=\"p\">,</span> <span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Set shape and d.</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"n\">shape</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">prod</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># Set binary search threshold.</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Construct input placeholder and output for decision function.</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">input_ph</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">placeholder</span><span class=\"p\">(</span>\n        <span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;input_image&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">input_ph</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">hsja_wrap</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">target_label</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot; Wrapper to use tensors as input and output. &quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_hsja</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">target_label</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">),</span>\n                      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"c1\"># targeted attack that requires target label and image.</span>\n      <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">hsja_wrap</span><span class=\"p\">,</span>\n                        <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]],</span>\n                        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"c1\"># untargeted attack with an initialized image.</span>\n        <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">:</span> <span class=\"n\">hsja_wrap</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                            <span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">),</span>\n                          <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]],</span>\n                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># untargeted attack without an initialized image.</span>\n        <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">hsja_wrap</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">),</span>\n                          <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]],</span>\n                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"HopSkipJumpAttack.generate_np\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.generate_np\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate_np</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate adversarial images in a for loop.</span>\n<span class=\"sd\">    :param y: An array of shape (n, nb_classes) for true labels.</span>\n<span class=\"sd\">    :param y_target:  An array of shape (n, nb_classes) for target labels.</span>\n<span class=\"sd\">    Required for targeted attack.</span>\n<span class=\"sd\">    :param image_target: An array of shape (n, **image shape) for initial</span>\n<span class=\"sd\">    target images. Required for targeted attack.</span>\n\n<span class=\"sd\">    See parse_params for other kwargs.</span>\n\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;image_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">image_target</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">])</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">image_target</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">])</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">x_single</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n      <span class=\"n\">img</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">x_single</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">image_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">single_img_target</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">image_target</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;image_target&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">single_img_target</span>\n      <span class=\"k\">if</span> <span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">single_y_target</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">y_target</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">single_y_target</span>\n\n      <span class=\"n\">adv_img</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">HopSkipJumpAttack</span><span class=\"p\">,</span>\n                      <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">generate_np</span><span class=\"p\">(</span><span class=\"n\">img</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n      <span class=\"n\">x_adv</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">adv_img</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">concatenate</span><span class=\"p\">(</span><span class=\"n\">x_adv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"HopSkipJumpAttack.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">image_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">initial_num_evals</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_num_evals</span><span class=\"o\">=</span><span class=\"mi\">10000</span><span class=\"p\">,</span>\n                   <span class=\"n\">stepsize_search</span><span class=\"o\">=</span><span class=\"s1\">&#39;geometric_progression&#39;</span><span class=\"p\">,</span>\n                   <span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"mi\">64</span><span class=\"p\">,</span>\n                   <span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">constraint</span><span class=\"o\">=</span><span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">,</span>\n                   <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">,</span>\n                   <span class=\"n\">verbose</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param y: A tensor of shape (1, nb_classes) for true labels.</span>\n<span class=\"sd\">    :param y_target:  A tensor of shape (1, nb_classes) for target labels.</span>\n<span class=\"sd\">    Required for targeted attack.</span>\n<span class=\"sd\">    :param image_target: A tensor of shape (1, **image shape) for initial</span>\n<span class=\"sd\">    target images. Required for targeted attack.</span>\n<span class=\"sd\">    :param initial_num_evals: initial number of evaluations for</span>\n<span class=\"sd\">                              gradient estimation.</span>\n<span class=\"sd\">    :param max_num_evals: maximum number of evaluations for gradient estimation.</span>\n<span class=\"sd\">    :param stepsize_search: How to search for stepsize; choices are</span>\n<span class=\"sd\">                            &#39;geometric_progression&#39;, &#39;grid_search&#39;.</span>\n<span class=\"sd\">                            &#39;geometric progression&#39; initializes the stepsize</span>\n<span class=\"sd\">                             by ||x_t - x||_p / sqrt(iteration), and keep</span>\n<span class=\"sd\">                             decreasing by half until reaching the target</span>\n<span class=\"sd\">                             side of the boundary. &#39;grid_search&#39; chooses the</span>\n<span class=\"sd\">                             optimal epsilon over a grid, in the scale of</span>\n<span class=\"sd\">                             ||x_t - x||_p.</span>\n<span class=\"sd\">    :param num_iterations: The number of iterations.</span>\n<span class=\"sd\">    :param gamma: The binary search threshold theta is gamma / d^{3/2} for</span>\n<span class=\"sd\">                   l2 attack and gamma / d^2 for linf attack.</span>\n<span class=\"sd\">    :param constraint: The distance to optimize; choices are &#39;l2&#39;, &#39;linf&#39;.</span>\n<span class=\"sd\">    :param batch_size: batch_size for model prediction.</span>\n<span class=\"sd\">    :param verbose: (boolean) Whether distance at each step is printed.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ignore the y and y_target argument</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">image_target</span> <span class=\"o\">=</span> <span class=\"n\">image_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_num_evals</span> <span class=\"o\">=</span> <span class=\"n\">initial_num_evals</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_num_evals</span> <span class=\"o\">=</span> <span class=\"n\">max_num_evals</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stepsize_search</span> <span class=\"o\">=</span> <span class=\"n\">stepsize_search</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_iterations</span> <span class=\"o\">=</span> <span class=\"n\">num_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span> <span class=\"o\">=</span> <span class=\"n\">gamma</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span> <span class=\"o\">=</span> <span class=\"n\">constraint</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">verbose</span> <span class=\"o\">=</span> <span class=\"n\">verbose</span></div>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_hsja</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">target_label</span><span class=\"p\">,</span> <span class=\"n\">target_image</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Main algorithm for HopSkipJumpAttack.</span>\n\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n\n<span class=\"sd\">    :param sample: input image. Without the batchsize dimension.</span>\n<span class=\"sd\">    :param target_label: integer for targeted attack,</span>\n<span class=\"sd\">      None for nontargeted attack. Without the batchsize dimension.</span>\n<span class=\"sd\">    :param target_image: an array with the same size as sample, or None.</span>\n<span class=\"sd\">      Without the batchsize dimension.</span>\n\n\n<span class=\"sd\">    Output:</span>\n<span class=\"sd\">    perturbed image.</span>\n\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Original label required for untargeted attack.</span>\n    <span class=\"k\">if</span> <span class=\"n\">target_label</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">original_label</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">input_ph</span><span class=\"p\">:</span> <span class=\"n\">sample</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]})</span>\n          <span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">target_label</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">target_label</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">decision_function</span><span class=\"p\">(</span><span class=\"n\">images</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">      Decision function output 1 on the desired side of the boundary,</span>\n<span class=\"sd\">      0 otherwise.</span>\n<span class=\"sd\">      &quot;&quot;&quot;</span>\n      <span class=\"n\">images</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span><span class=\"n\">images</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n      <span class=\"n\">prob</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n      <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">images</span><span class=\"p\">),</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"n\">batch</span> <span class=\"o\">=</span> <span class=\"n\">images</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">:</span><span class=\"n\">i</span><span class=\"o\">+</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">]</span>\n        <span class=\"n\">prob_i</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">input_ph</span><span class=\"p\">:</span> <span class=\"n\">batch</span><span class=\"p\">})</span>\n        <span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">prob_i</span><span class=\"p\">)</span>\n      <span class=\"n\">prob</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">concatenate</span><span class=\"p\">(</span><span class=\"n\">prob</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">target_label</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">prob</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"n\">original_label</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">prob</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"n\">target_label</span>\n\n    <span class=\"c1\"># Initialize.</span>\n    <span class=\"k\">if</span> <span class=\"n\">target_image</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">initialize</span><span class=\"p\">(</span><span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                             <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">target_image</span>\n\n    <span class=\"c1\"># Project the initialization to the boundary.</span>\n    <span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">dist_post_update</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_batch</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"p\">,</span>\n                                                      <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">),</span>\n                                                      <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                                                      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                                                      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span>\n                                                      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">)</span>\n\n    <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">compute_distance</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">arange</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_iterations</span><span class=\"p\">):</span>\n      <span class=\"n\">current_iteration</span> <span class=\"o\">=</span> <span class=\"n\">j</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n\n      <span class=\"c1\"># Choose delta.</span>\n      <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"n\">select_delta</span><span class=\"p\">(</span><span class=\"n\">dist_post_update</span><span class=\"p\">,</span> <span class=\"n\">current_iteration</span><span class=\"p\">,</span>\n                           <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">d</span><span class=\"p\">,</span>\n                           <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Choose number of evaluations.</span>\n      <span class=\"n\">num_evals</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"nb\">min</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_num_evals</span> <span class=\"o\">*</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">j</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n                           <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_num_evals</span><span class=\"p\">]))</span>\n\n      <span class=\"c1\"># approximate gradient.</span>\n      <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"n\">approximate_gradient</span><span class=\"p\">(</span><span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">num_evals</span><span class=\"p\">,</span>\n                                   <span class=\"n\">delta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                                   <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">update</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">gradf</span><span class=\"p\">)</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">update</span> <span class=\"o\">=</span> <span class=\"n\">gradf</span>\n\n      <span class=\"c1\"># search step size.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stepsize_search</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;geometric_progression&#39;</span><span class=\"p\">:</span>\n        <span class=\"c1\"># find step size.</span>\n        <span class=\"n\">epsilon</span> <span class=\"o\">=</span> <span class=\"n\">geometric_progression_for_stepsize</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span>\n                                                     <span class=\"n\">update</span><span class=\"p\">,</span> <span class=\"n\">dist</span><span class=\"p\">,</span> <span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">current_iteration</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Update the sample.</span>\n        <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span><span class=\"n\">perturbed</span> <span class=\"o\">+</span> <span class=\"n\">epsilon</span> <span class=\"o\">*</span> <span class=\"n\">update</span><span class=\"p\">,</span>\n                               <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Binary search to return to the boundary.</span>\n        <span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">dist_post_update</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_batch</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"p\">,</span>\n                                                          <span class=\"n\">perturbed</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">],</span>\n                                                          <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                                                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                                                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span>\n                                                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">)</span>\n\n      <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stepsize_search</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;grid_search&#39;</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Grid search for stepsize.</span>\n        <span class=\"n\">epsilons</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">logspace</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">num</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">,</span> <span class=\"n\">endpoint</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">dist</span>\n        <span class=\"n\">epsilons_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mi\">20</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n        <span class=\"n\">perturbeds</span> <span class=\"o\">=</span> <span class=\"n\">perturbed</span> <span class=\"o\">+</span> <span class=\"n\">epsilons</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">epsilons_shape</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">update</span>\n        <span class=\"n\">perturbeds</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span><span class=\"n\">perturbeds</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n        <span class=\"n\">idx_perturbed</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">perturbeds</span><span class=\"p\">)</span>\n\n        <span class=\"k\">if</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">(</span><span class=\"n\">idx_perturbed</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n          <span class=\"c1\"># Select the perturbation that yields the minimum distance # after binary search.</span>\n          <span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">dist_post_update</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_batch</span><span class=\"p\">(</span><span class=\"n\">sample</span><span class=\"p\">,</span>\n                                                            <span class=\"n\">perturbeds</span><span class=\"p\">[</span><span class=\"n\">idx_perturbed</span><span class=\"p\">],</span>\n                                                            <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                                                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">,</span>\n                                                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span>\n                                                            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># compute new distance.</span>\n      <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">compute_distance</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">verbose</span><span class=\"p\">:</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s1\">&#39;iteration: </span><span class=\"si\">{:d}</span><span class=\"s1\">, </span><span class=\"si\">{:s}</span><span class=\"s1\"> distance </span><span class=\"si\">{:.4E}</span><span class=\"s1\">&#39;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span>\n            <span class=\"n\">j</span><span class=\"o\">+</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">constraint</span><span class=\"p\">,</span> <span class=\"n\">dist</span><span class=\"p\">))</span>\n\n    <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">perturbed</span></div>\n\n\n<div class=\"viewcode-block\" id=\"BoundaryAttackPlusPlus\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.BoundaryAttackPlusPlus\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">BoundaryAttackPlusPlus</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A previous name used for HopSkipJumpAttack.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;BoundaryAttackPlusPlus will be removed after 2019-12-08; use HopSkipJumpAttack.&quot;</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">HopSkipJumpAttack</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span></div>\n\n<span class=\"k\">def</span> <span class=\"nf\">_check_first_dimension</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tensor_name</span><span class=\"p\">):</span>\n  <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Tensor </span><span class=\"si\">{}</span><span class=\"s2\"> should have batch_size of 1.&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">tensor_name</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">check_batch</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"o\">=</span><span class=\"n\">message</span><span class=\"p\">)</span>\n    <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">([</span><span class=\"n\">check_batch</span><span class=\"p\">]):</span>\n      <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"n\">message</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">clip_image</span><span class=\"p\">(</span><span class=\"n\">image</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Clip an image, or an image batch, with upper and lower threshold. &quot;&quot;&quot;</span>\n  <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">image</span><span class=\"p\">),</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">compute_distance</span><span class=\"p\">(</span><span class=\"n\">x_ori</span><span class=\"p\">,</span> <span class=\"n\">x_pert</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"o\">=</span><span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Compute the distance between two images. &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linalg</span><span class=\"o\">.</span><span class=\"n\">norm</span><span class=\"p\">(</span><span class=\"n\">x_ori</span> <span class=\"o\">-</span> <span class=\"n\">x_pert</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">max</span><span class=\"p\">(</span><span class=\"nb\">abs</span><span class=\"p\">(</span><span class=\"n\">x_ori</span> <span class=\"o\">-</span> <span class=\"n\">x_pert</span><span class=\"p\">))</span>\n  <span class=\"k\">return</span> <span class=\"n\">dist</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">approximate_gradient</span><span class=\"p\">(</span><span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">num_evals</span><span class=\"p\">,</span>\n                         <span class=\"n\">delta</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Gradient direction estimation &quot;&quot;&quot;</span>\n  <span class=\"c1\"># Generate random vectors.</span>\n  <span class=\"n\">noise_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">num_evals</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">rv</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">randn</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">noise_shape</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">rv</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">uniform</span><span class=\"p\">(</span><span class=\"n\">low</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">high</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">size</span><span class=\"o\">=</span><span class=\"n\">noise_shape</span><span class=\"p\">)</span>\n\n  <span class=\"n\">axis</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span> <span class=\"o\">+</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">)))</span>\n  <span class=\"n\">rv</span> <span class=\"o\">=</span> <span class=\"n\">rv</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">(</span><span class=\"n\">rv</span> <span class=\"o\">**</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"n\">axis</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n  <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">sample</span> <span class=\"o\">+</span> <span class=\"n\">delta</span> <span class=\"o\">*</span> <span class=\"n\">rv</span>\n  <span class=\"n\">perturbed</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n  <span class=\"n\">rv</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">perturbed</span> <span class=\"o\">-</span> <span class=\"n\">sample</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"n\">delta</span>\n\n  <span class=\"c1\"># query the model.</span>\n  <span class=\"n\">decisions</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">perturbed</span><span class=\"p\">)</span>\n  <span class=\"n\">decision_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">decisions</span><span class=\"p\">)]</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n  <span class=\"n\">fval</span> <span class=\"o\">=</span> <span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"n\">decisions</span><span class=\"o\">.</span><span class=\"n\">astype</span><span class=\"p\">(</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">decision_shape</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mf\">1.0</span>\n\n  <span class=\"c1\"># Baseline subtraction (when fval differs)</span>\n  <span class=\"k\">if</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">fval</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mf\">1.0</span><span class=\"p\">:</span>  <span class=\"c1\"># label changes.</span>\n    <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">rv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">fval</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"o\">-</span><span class=\"mf\">1.0</span><span class=\"p\">:</span>  <span class=\"c1\"># label not change.</span>\n    <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"o\">-</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">rv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">fval</span> <span class=\"o\">=</span> <span class=\"n\">fval</span> <span class=\"o\">-</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">fval</span><span class=\"p\">)</span>\n    <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">fval</span> <span class=\"o\">*</span> <span class=\"n\">rv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Get the gradient direction.</span>\n  <span class=\"n\">gradf</span> <span class=\"o\">=</span> <span class=\"n\">gradf</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linalg</span><span class=\"o\">.</span><span class=\"n\">norm</span><span class=\"p\">(</span><span class=\"n\">gradf</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">gradf</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">project</span><span class=\"p\">(</span><span class=\"n\">original_image</span><span class=\"p\">,</span> <span class=\"n\">perturbed_images</span><span class=\"p\">,</span> <span class=\"n\">alphas</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Projection onto given l2 / linf balls in a batch. &quot;&quot;&quot;</span>\n  <span class=\"n\">alphas_shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">alphas</span><span class=\"p\">)]</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n  <span class=\"n\">alphas</span> <span class=\"o\">=</span> <span class=\"n\">alphas</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">alphas_shape</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">projected</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"o\">-</span><span class=\"n\">alphas</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">original_image</span> <span class=\"o\">+</span> <span class=\"n\">alphas</span> <span class=\"o\">*</span> <span class=\"n\">perturbed_images</span>\n  <span class=\"k\">elif</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">projected</span> <span class=\"o\">=</span> <span class=\"n\">clip_image</span><span class=\"p\">(</span>\n        <span class=\"n\">perturbed_images</span><span class=\"p\">,</span>\n        <span class=\"n\">original_image</span> <span class=\"o\">-</span> <span class=\"n\">alphas</span><span class=\"p\">,</span>\n        <span class=\"n\">original_image</span> <span class=\"o\">+</span> <span class=\"n\">alphas</span>\n    <span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">projected</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">binary_search_batch</span><span class=\"p\">(</span><span class=\"n\">original_image</span><span class=\"p\">,</span> <span class=\"n\">perturbed_images</span><span class=\"p\">,</span> <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                        <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">,</span> <span class=\"n\">theta</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Binary search to approach the boundary. &quot;&quot;&quot;</span>\n\n  <span class=\"c1\"># Compute distance between each of perturbed image and original image.</span>\n  <span class=\"n\">dists_post_update</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span>\n      <span class=\"n\">compute_distance</span><span class=\"p\">(</span>\n          <span class=\"n\">original_image</span><span class=\"p\">,</span>\n          <span class=\"n\">perturbed_image</span><span class=\"p\">,</span>\n          <span class=\"n\">constraint</span>\n      <span class=\"p\">)</span>\n      <span class=\"k\">for</span> <span class=\"n\">perturbed_image</span> <span class=\"ow\">in</span> <span class=\"n\">perturbed_images</span><span class=\"p\">])</span>\n\n  <span class=\"c1\"># Choose upper thresholds in binary searchs based on constraint.</span>\n  <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">highs</span> <span class=\"o\">=</span> <span class=\"n\">dists_post_update</span>\n    <span class=\"c1\"># Stopping criteria.</span>\n    <span class=\"n\">thresholds</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"n\">dists_post_update</span> <span class=\"o\">*</span> <span class=\"n\">theta</span><span class=\"p\">,</span> <span class=\"n\">theta</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">highs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">perturbed_images</span><span class=\"p\">))</span>\n    <span class=\"n\">thresholds</span> <span class=\"o\">=</span> <span class=\"n\">theta</span>\n\n  <span class=\"n\">lows</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">perturbed_images</span><span class=\"p\">))</span>\n\n  <span class=\"k\">while</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">max</span><span class=\"p\">((</span><span class=\"n\">highs</span> <span class=\"o\">-</span> <span class=\"n\">lows</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"n\">thresholds</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"c1\"># projection to mids.</span>\n    <span class=\"n\">mids</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">highs</span> <span class=\"o\">+</span> <span class=\"n\">lows</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mf\">2.0</span>\n    <span class=\"n\">mid_images</span> <span class=\"o\">=</span> <span class=\"n\">project</span><span class=\"p\">(</span><span class=\"n\">original_image</span><span class=\"p\">,</span> <span class=\"n\">perturbed_images</span><span class=\"p\">,</span>\n                         <span class=\"n\">mids</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Update highs and lows based on model decisions.</span>\n    <span class=\"n\">decisions</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">mid_images</span><span class=\"p\">)</span>\n    <span class=\"n\">lows</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">where</span><span class=\"p\">(</span><span class=\"n\">decisions</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">mids</span><span class=\"p\">,</span> <span class=\"n\">lows</span><span class=\"p\">)</span>\n    <span class=\"n\">highs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">where</span><span class=\"p\">(</span><span class=\"n\">decisions</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">mids</span><span class=\"p\">,</span> <span class=\"n\">highs</span><span class=\"p\">)</span>\n\n  <span class=\"n\">out_images</span> <span class=\"o\">=</span> <span class=\"n\">project</span><span class=\"p\">(</span><span class=\"n\">original_image</span><span class=\"p\">,</span> <span class=\"n\">perturbed_images</span><span class=\"p\">,</span>\n                       <span class=\"n\">highs</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Compute distance of the output image to select the best choice.</span>\n  <span class=\"c1\"># (only used when stepsize_search is grid_search.)</span>\n  <span class=\"n\">dists</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">([</span>\n      <span class=\"n\">compute_distance</span><span class=\"p\">(</span>\n          <span class=\"n\">original_image</span><span class=\"p\">,</span>\n          <span class=\"n\">out_image</span><span class=\"p\">,</span>\n          <span class=\"n\">constraint</span>\n      <span class=\"p\">)</span>\n      <span class=\"k\">for</span> <span class=\"n\">out_image</span> <span class=\"ow\">in</span> <span class=\"n\">out_images</span><span class=\"p\">])</span>\n  <span class=\"n\">idx</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmin</span><span class=\"p\">(</span><span class=\"n\">dists</span><span class=\"p\">)</span>\n\n  <span class=\"n\">dist</span> <span class=\"o\">=</span> <span class=\"n\">dists_post_update</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span>\n  <span class=\"n\">out_image</span> <span class=\"o\">=</span> <span class=\"n\">out_images</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span>\n  <span class=\"k\">return</span> <span class=\"n\">out_image</span><span class=\"p\">,</span> <span class=\"n\">dist</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">initialize</span><span class=\"p\">(</span><span class=\"n\">decision_function</span><span class=\"p\">,</span> <span class=\"n\">sample</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Efficient Implementation of BlendedUniformNoiseAttack in Foolbox.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">success</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n  <span class=\"n\">num_evals</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n\n  <span class=\"c1\"># Find a misclassified random noise.</span>\n  <span class=\"k\">while</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n    <span class=\"n\">random_noise</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">uniform</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">size</span><span class=\"o\">=</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n    <span class=\"n\">success</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">random_noise</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">])[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"n\">success</span><span class=\"p\">:</span>\n      <span class=\"k\">break</span>\n    <span class=\"n\">num_evals</span> <span class=\"o\">+=</span> <span class=\"mi\">1</span>\n    <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Initialization failed! Try to use a misclassified image as `target_image`&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"n\">num_evals</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e4</span><span class=\"p\">,</span> <span class=\"n\">message</span>\n\n  <span class=\"c1\"># Binary search to minimize l2 distance to original image.</span>\n  <span class=\"n\">low</span> <span class=\"o\">=</span> <span class=\"mf\">0.0</span>\n  <span class=\"n\">high</span> <span class=\"o\">=</span> <span class=\"mf\">1.0</span>\n  <span class=\"k\">while</span> <span class=\"n\">high</span> <span class=\"o\">-</span> <span class=\"n\">low</span> <span class=\"o\">&gt;</span> <span class=\"mf\">0.001</span><span class=\"p\">:</span>\n    <span class=\"n\">mid</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">high</span> <span class=\"o\">+</span> <span class=\"n\">low</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mf\">2.0</span>\n    <span class=\"n\">blended</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"n\">mid</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">sample</span> <span class=\"o\">+</span> <span class=\"n\">mid</span> <span class=\"o\">*</span> <span class=\"n\">random_noise</span>\n    <span class=\"n\">success</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">blended</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">])[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"n\">success</span><span class=\"p\">:</span>\n      <span class=\"n\">high</span> <span class=\"o\">=</span> <span class=\"n\">mid</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">low</span> <span class=\"o\">=</span> <span class=\"n\">mid</span>\n\n  <span class=\"n\">initialization</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">-</span> <span class=\"n\">high</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">sample</span> <span class=\"o\">+</span> <span class=\"n\">high</span> <span class=\"o\">*</span> <span class=\"n\">random_noise</span>\n  <span class=\"k\">return</span> <span class=\"n\">initialization</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">geometric_progression_for_stepsize</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">update</span><span class=\"p\">,</span> <span class=\"n\">dist</span><span class=\"p\">,</span> <span class=\"n\">decision_function</span><span class=\"p\">,</span>\n                                       <span class=\"n\">current_iteration</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot; Geometric progression to search for stepsize.</span>\n<span class=\"sd\">      Keep decreasing stepsize by half until reaching</span>\n<span class=\"sd\">      the desired side of the boundary.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">epsilon</span> <span class=\"o\">=</span> <span class=\"n\">dist</span> <span class=\"o\">/</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">current_iteration</span><span class=\"p\">)</span>\n  <span class=\"k\">while</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n    <span class=\"n\">updated</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">epsilon</span> <span class=\"o\">*</span> <span class=\"n\">update</span>\n    <span class=\"n\">success</span> <span class=\"o\">=</span> <span class=\"n\">decision_function</span><span class=\"p\">(</span><span class=\"n\">updated</span><span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">])[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"n\">success</span><span class=\"p\">:</span>\n      <span class=\"k\">break</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">epsilon</span> <span class=\"o\">=</span> <span class=\"n\">epsilon</span> <span class=\"o\">/</span> <span class=\"mf\">2.0</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">epsilon</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">select_delta</span><span class=\"p\">(</span><span class=\"n\">dist_post_update</span><span class=\"p\">,</span> <span class=\"n\">current_iteration</span><span class=\"p\">,</span>\n                 <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">d</span><span class=\"p\">,</span> <span class=\"n\">theta</span><span class=\"p\">,</span> <span class=\"n\">constraint</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Choose the delta at the scale of distance</span>\n<span class=\"sd\">   between x and perturbed sample.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">current_iteration</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"mf\">0.1</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"o\">-</span> <span class=\"n\">clip_min</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">if</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;l2&#39;</span><span class=\"p\">:</span>\n      <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">d</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">theta</span> <span class=\"o\">*</span> <span class=\"n\">dist_post_update</span>\n    <span class=\"k\">elif</span> <span class=\"n\">constraint</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;linf&#39;</span><span class=\"p\">:</span>\n      <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"n\">d</span> <span class=\"o\">*</span> <span class=\"n\">theta</span> <span class=\"o\">*</span> <span class=\"n\">dist_post_update</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">delta</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/lbfgs.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.lbfgs &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.lbfgs</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The LBFGS attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">wrapper_warning</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">utils</span><span class=\"o\">.</span><span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.attacks.lbfgs&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"LBFGS\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.LBFGS\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">LBFGS</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  LBFGS is the first adversarial attack for convolutional neural networks,</span>\n<span class=\"sd\">  and is a target &amp; iterative attack.</span>\n<span class=\"sd\">  Paper link: &quot;https://arxiv.org/pdf/1312.6199.pdf&quot;</span>\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;probs&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">LBFGS</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;batch_size&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;binary_search_steps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;max_iterations&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;initial_const&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"LBFGS.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.LBFGS.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">    input. Generate uses tf.py_func in order to operate over tensors.</span>\n<span class=\"sd\">    :param x: (required) A tensor with the inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> \\\n        <span class=\"s1\">&#39;Cannot use `generate` when no `sess` was provided&#39;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"n\">attack</span> <span class=\"o\">=</span> <span class=\"n\">LBFGS_impl</span><span class=\"p\">(</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">lbfgs_wrap</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">      Wrapper creating TensorFlow interface for use with py_func</span>\n<span class=\"sd\">      &quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">attack</span><span class=\"o\">.</span><span class=\"n\">attack</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y_val</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">np_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">wrap</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">lbfgs_wrap</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">],</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">wrap</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">wrap</span></div>\n\n<div class=\"viewcode-block\" id=\"LBFGS.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.LBFGS.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n                   <span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">,</span>\n                   <span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"mi\">1000</span><span class=\"p\">,</span>\n                   <span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"mf\">1e-2</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the one-hot target labels.</span>\n<span class=\"sd\">    :param batch_size: The number of inputs to include in a batch and</span>\n<span class=\"sd\">                       process simultaneously.</span>\n<span class=\"sd\">    :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                                search to find the optimal tradeoff-</span>\n<span class=\"sd\">                                constant between norm of the purturbation</span>\n<span class=\"sd\">                                and cross-entropy loss of classification.</span>\n<span class=\"sd\">    :param max_iterations: The maximum number of iterations.</span>\n<span class=\"sd\">    :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                          relative importance of size of the perturbation</span>\n<span class=\"sd\">                          and cross-entropy loss of the classification.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span></div></div>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">LBFGS_impl</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Return a tensor that constructs adversarial examples for the given</span>\n<span class=\"sd\">  input. Generate uses tf.py_func in order to operate over tensors.</span>\n<span class=\"sd\">  :param sess: a TF session.</span>\n<span class=\"sd\">  :param x: A tensor with the inputs.</span>\n<span class=\"sd\">  :param logits: A tensor with model&#39;s output logits.</span>\n<span class=\"sd\">  :param targeted_label: A tensor with the target labels.</span>\n<span class=\"sd\">  :param binary_search_steps: The number of times we perform binary</span>\n<span class=\"sd\">                              search to find the optimal tradeoff-</span>\n<span class=\"sd\">                              constant between norm of the purturbation</span>\n<span class=\"sd\">                              and cross-entropy loss of classification.</span>\n<span class=\"sd\">  :param max_iterations: The maximum number of iterations.</span>\n<span class=\"sd\">  :param initial_const: The initial tradeoff-constant to use to tune the</span>\n<span class=\"sd\">                        relative importance of size of the purturbation</span>\n<span class=\"sd\">                        and cross-entropy loss of the classification.</span>\n<span class=\"sd\">  :param clip_min: Minimum input component value</span>\n<span class=\"sd\">  :param clip_max: Maximum input component value</span>\n<span class=\"sd\">  :param num_labels: The number of classes in the model&#39;s output.</span>\n<span class=\"sd\">  :param batch_size: Number of attacks to run simultaneously.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">targeted_label</span><span class=\"p\">,</span> <span class=\"n\">targeted_attack</span><span class=\"p\">,</span>\n               <span class=\"n\">binary_search_steps</span><span class=\"p\">,</span> <span class=\"n\">max_iterations</span><span class=\"p\">,</span> <span class=\"n\">initial_const</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span>\n               <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span> <span class=\"o\">=</span> <span class=\"n\">sess</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">x</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"n\">logits</span>\n    <span class=\"k\">assert</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;Softmax&#39;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_label</span> <span class=\"o\">=</span> <span class=\"n\">targeted_label</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span> <span class=\"o\">=</span> <span class=\"n\">targeted_attack</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">=</span> <span class=\"n\">binary_search_steps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span> <span class=\"o\">=</span> <span class=\"n\">max_iterations</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span> <span class=\"o\">=</span> <span class=\"n\">initial_const</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">10</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"nb\">tuple</span><span class=\"p\">([</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">]</span> <span class=\"o\">+</span>\n                       <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:]))</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ori_img</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;ori_img&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Variable</span><span class=\"p\">(</span>\n        <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;const&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">score</span> <span class=\"o\">=</span> <span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span>\n        <span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_label</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ori_img</span><span class=\"p\">))</span>\n    <span class=\"c1\"># small self.const will result small adversarial perturbation</span>\n    <span class=\"c1\"># targeted attack aims at minimize loss against target label</span>\n    <span class=\"c1\"># untargeted attack aims at maximize loss against True label</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">score</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">score</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">l2dist</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">attack</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Perform the attack on the given instance for the given targets.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">lbfgs_objective</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">,</span> <span class=\"n\">oimgs</span><span class=\"p\">,</span> <span class=\"n\">CONST</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot; returns the function value and the gradient for fmin_l_bfgs_b &quot;&quot;&quot;</span>\n      <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss</span><span class=\"p\">,</span>\n          <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">adv_x</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">),</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_label</span><span class=\"p\">:</span> <span class=\"n\">targets</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ori_img</span><span class=\"p\">:</span> <span class=\"n\">oimgs</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"p\">:</span> <span class=\"n\">CONST</span>\n          <span class=\"p\">})</span>\n      <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad</span><span class=\"p\">,</span>\n          <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"p\">{</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">adv_x</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">),</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_label</span><span class=\"p\">:</span> <span class=\"n\">targets</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ori_img</span><span class=\"p\">:</span> <span class=\"n\">oimgs</span><span class=\"p\">,</span>\n              <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">const</span><span class=\"p\">:</span> <span class=\"n\">CONST</span>\n          <span class=\"p\">})</span>\n      <span class=\"k\">return</span> <span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">astype</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">attack_success</span><span class=\"p\">(</span><span class=\"n\">out</span><span class=\"p\">,</span> <span class=\"n\">target</span><span class=\"p\">,</span> <span class=\"n\">targeted_attack</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot; returns attack result &quot;&quot;&quot;</span>\n      <span class=\"k\">if</span> <span class=\"n\">targeted_attack</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">out</span> <span class=\"o\">==</span> <span class=\"n\">target</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">out</span> <span class=\"o\">!=</span> <span class=\"n\">target</span>\n\n    <span class=\"c1\"># begin the main part for the attack</span>\n    <span class=\"kn\">from</span> <span class=\"nn\">scipy.optimize</span> <span class=\"kn\">import</span> <span class=\"n\">fmin_l_bfgs_b</span>\n    <span class=\"n\">oimgs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">clip</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">initial_const</span>\n\n    <span class=\"c1\"># set the lower and upper bounds accordingly</span>\n    <span class=\"n\">lower_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n    <span class=\"n\">upper_bound</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"mf\">1e10</span>\n\n    <span class=\"c1\"># set the box constraints for the optimization function</span>\n    <span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">*</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[:])</span>\n    <span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">*</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[:])</span>\n    <span class=\"n\">clip_bound</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">(),</span> <span class=\"n\">clip_max</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">()))</span>\n\n    <span class=\"c1\"># placeholders for the best l2 and instance attack found so far</span>\n    <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"mf\">1e10</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n    <span class=\"n\">o_bestattack</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">outer_step</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">):</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Binary search step </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n                    <span class=\"n\">outer_step</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># The last iteration (if we run many steps) repeat the search once.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">repeat</span> <span class=\"ow\">and</span> <span class=\"n\">outer_step</span> <span class=\"o\">==</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">binary_search_steps</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"n\">CONST</span> <span class=\"o\">=</span> <span class=\"n\">upper_bound</span>\n\n      <span class=\"c1\"># optimization function</span>\n      <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">__</span> <span class=\"o\">=</span> <span class=\"n\">fmin_l_bfgs_b</span><span class=\"p\">(</span>\n          <span class=\"n\">lbfgs_objective</span><span class=\"p\">,</span>\n          <span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">astype</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">),</span>\n          <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">targets</span><span class=\"p\">,</span> <span class=\"n\">oimgs</span><span class=\"p\">,</span> <span class=\"n\">CONST</span><span class=\"p\">),</span>\n          <span class=\"n\">bounds</span><span class=\"o\">=</span><span class=\"n\">clip_bound</span><span class=\"p\">,</span>\n          <span class=\"n\">maxiter</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_iterations</span><span class=\"p\">,</span>\n          <span class=\"n\">iprint</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">oimgs</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">amax</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span> <span class=\"o\">&lt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">and</span> \\\n          <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">amin</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> \\\n          <span class=\"s1\">&#39;fmin_l_bfgs_b returns are invalid&#39;</span>\n\n      <span class=\"c1\"># adjust the best result (i.e., the adversarial example with the</span>\n      <span class=\"c1\"># smallest perturbation in terms of L_2 norm) found so far</span>\n      <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">atleast_1d</span><span class=\"p\">(</span>\n          <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">model_argmax</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">logits</span><span class=\"p\">,</span>\n                                <span class=\"n\">adv_x</span><span class=\"p\">))</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;predicted labels are </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"n\">preds</span><span class=\"p\">)</span>\n\n      <span class=\"n\">l2s</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n      <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"n\">l2s</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"n\">oimgs</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]))</span>\n\n      <span class=\"k\">for</span> <span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">l2</span><span class=\"p\">,</span> <span class=\"n\">pred</span><span class=\"p\">,</span> <span class=\"n\">ii</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">l2s</span><span class=\"p\">,</span> <span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">)):</span>\n        <span class=\"k\">if</span> <span class=\"n\">l2</span> <span class=\"o\">&lt;</span> <span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"ow\">and</span> <span class=\"n\">attack_success</span><span class=\"p\">(</span><span class=\"n\">pred</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]),</span>\n                                               <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span><span class=\"p\">):</span>\n          <span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">l2</span>\n          <span class=\"n\">o_bestattack</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">ii</span>\n\n      <span class=\"c1\"># adjust the constant as needed</span>\n      <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">attack_success</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">targets</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]),</span>\n                          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">targeted_attack</span><span class=\"p\">):</span>\n          <span class=\"c1\"># success, divide const by two</span>\n          <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n          <span class=\"c1\"># failure, either multiply by 10 if no solution found yet</span>\n          <span class=\"c1\">#          or do binary search with the known upper bound</span>\n          <span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"nb\">max</span><span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">],</span> <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span>\n          <span class=\"k\">if</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">lower_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">upper_bound</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">])</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n          <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">CONST</span><span class=\"p\">[</span><span class=\"n\">e</span><span class=\"p\">]</span> <span class=\"o\">*=</span> <span class=\"mi\">10</span>\n\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;  Successfully generated adversarial examples &quot;</span>\n                    <span class=\"s2\">&quot;on </span><span class=\"si\">%s</span><span class=\"s2\"> of </span><span class=\"si\">%s</span><span class=\"s2\"> instances.&quot;</span><span class=\"p\">,</span>\n                    <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">upper_bound</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">),</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n      <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">)</span>\n      <span class=\"n\">mean</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">[</span><span class=\"n\">o_bestl2</span> <span class=\"o\">&lt;</span> <span class=\"mf\">1e9</span><span class=\"p\">]))</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;   Mean successful distortion: </span><span class=\"si\">{:.4g}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">mean</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># return the best solution found</span>\n    <span class=\"n\">o_bestl2</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"n\">o_bestl2</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">o_bestattack</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/madry_et_al.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.madry_et_al &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.madry_et_al</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The MadryEtAl attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.projected_gradient_descent</span> <span class=\"kn\">import</span> <span class=\"n\">ProjectedGradientDescent</span>\n\n\n<div class=\"viewcode-block\" id=\"MadryEtAl\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MadryEtAl\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">MadryEtAl</span><span class=\"p\">(</span><span class=\"n\">ProjectedGradientDescent</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The attack from Madry et al 2017</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">MadryEtAl</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                                    <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                    <span class=\"n\">default_rand_init</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                                    <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/max_confidence.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.max_confidence &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.max_confidence</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The MaxConfidence attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.projected_gradient_descent</span> <span class=\"kn\">import</span> <span class=\"n\">ProjectedGradientDescent</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span>\n\n\n<div class=\"viewcode-block\" id=\"MaxConfidence\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">MaxConfidence</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The MaxConfidence attack.</span>\n\n<span class=\"sd\">  An attack designed for use against models that use confidence thresholding</span>\n<span class=\"sd\">  as a defense.</span>\n<span class=\"sd\">  If the underlying optimizer is optimal, this attack procedure gives the</span>\n<span class=\"sd\">  optimal failure rate for every confidence threshold t &gt; 0.5.</span>\n\n<span class=\"sd\">  Publication: https://openreview.net/forum?id=H1g0piA9tQ</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.session.Session</span>\n<span class=\"sd\">  :param base_attacker: cleverhans.attacks.Attack</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">base_attacker</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Model must be cleverhans.model.Model, got &quot;</span> <span class=\"o\">+</span>\n                      <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">)))</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">MaxConfidence</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">base_attacker</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span> <span class=\"o\">=</span> <span class=\"n\">ProjectedGradientDescent</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span> <span class=\"o\">=</span> <span class=\"n\">base_attacker</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span>\n\n<div class=\"viewcode-block\" id=\"MaxConfidence.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: Keyword arguments for the base attacker</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">_nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"MaxConfidence.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">nb_classes</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">params</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div>\n\n<div class=\"viewcode-block\" id=\"MaxConfidence.attack\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence.attack\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">attack</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">true_y</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Runs the untargeted attack.</span>\n<span class=\"sd\">    :param x: The input</span>\n<span class=\"sd\">    :param true_y: The correct label for `x`. This attack aims to produce misclassification.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">adv_x_cls</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"n\">prob_cls</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">true_y_idx</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">true_y</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"n\">expanded_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">concat</span><span class=\"p\">([</span><span class=\"n\">x</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">target_ys</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"bp\">cls</span><span class=\"p\">,</span>\n                                        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">))</span>\n                 <span class=\"k\">for</span> <span class=\"bp\">cls</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)]</span>\n    <span class=\"n\">target_y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">concat</span><span class=\"p\">(</span><span class=\"n\">target_ys</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x_cls</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">attack_class</span><span class=\"p\">(</span><span class=\"n\">expanded_x</span><span class=\"p\">,</span> <span class=\"n\">target_y</span><span class=\"p\">)</span>\n    <span class=\"n\">expanded_all_probs</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">adv_x_cls</span><span class=\"p\">)</span>\n\n    <span class=\"n\">adv_x_list</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"n\">adv_x_cls</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n    <span class=\"n\">all_probs_list</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"n\">expanded_all_probs</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n\n    <span class=\"k\">for</span> <span class=\"bp\">cls</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">):</span>\n      <span class=\"n\">target_y</span> <span class=\"o\">=</span> <span class=\"n\">target_ys</span><span class=\"p\">[</span><span class=\"bp\">cls</span><span class=\"p\">]</span>\n      <span class=\"n\">all_probs</span> <span class=\"o\">=</span> <span class=\"n\">all_probs_list</span><span class=\"p\">[</span><span class=\"bp\">cls</span><span class=\"p\">]</span>\n      <span class=\"c1\"># We don&#39;t actually care whether we hit the target class.</span>\n      <span class=\"c1\"># We care about the probability of the most likely wrong class</span>\n      <span class=\"n\">cur_prob_cls</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">all_probs</span> <span class=\"o\">-</span> <span class=\"n\">true_y</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n      <span class=\"c1\"># Knock out examples that are correctly classified.</span>\n      <span class=\"c1\"># This is not needed to be optimal for t &gt;= 0.5, but may as well do it</span>\n      <span class=\"c1\"># to get better failure rate at lower thresholds.</span>\n      <span class=\"n\">chosen_cls</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">all_probs</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n      <span class=\"n\">eligible</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">not_equal</span><span class=\"p\">(</span><span class=\"n\">true_y_idx</span><span class=\"p\">,</span> <span class=\"n\">chosen_cls</span><span class=\"p\">))</span>\n      <span class=\"n\">cur_prob_cls</span> <span class=\"o\">=</span> <span class=\"n\">cur_prob_cls</span> <span class=\"o\">*</span> <span class=\"n\">eligible</span>\n      <span class=\"n\">prob_cls</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">cur_prob_cls</span><span class=\"p\">)</span>\n\n    <span class=\"n\">probs</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">concat</span><span class=\"p\">([</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"n\">prob_cls</span><span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Don&#39;t need to censor here because we knocked out the true class above</span>\n    <span class=\"c1\"># probs = probs - true_y</span>\n    <span class=\"n\">most_confident</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">probs</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">fused_mask</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">most_confident</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n    <span class=\"n\">masks</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"n\">fused_mask</span><span class=\"p\">,</span> <span class=\"n\">num_or_size_splits</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">m</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">reshaped_masks</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">mask</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">mask</span> <span class=\"ow\">in</span> <span class=\"n\">masks</span><span class=\"p\">]</span>\n    <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"nb\">sum</span><span class=\"p\">(</span><span class=\"n\">adv_x</span> <span class=\"o\">*</span> <span class=\"n\">rmask</span> <span class=\"k\">for</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span>\n              <span class=\"n\">rmask</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">adv_x_list</span><span class=\"p\">,</span> <span class=\"n\">reshaped_masks</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">out</span></div>\n\n<div class=\"viewcode-block\" id=\"MaxConfidence.attack_class\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MaxConfidence.attack_class\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">attack_class</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">target_y</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Run the attack on a specific target class.</span>\n<span class=\"sd\">    :param x: tf Tensor. The input example.</span>\n<span class=\"sd\">    :param target_y: tf Tensor. The attacker&#39;s desired target class.</span>\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">      A targeted adversarial example, intended to be classified as the target class.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">adv</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">base_attacker</span><span class=\"o\">.</span><span class=\"n\">generate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"n\">target_y</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">params</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">adv</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/momentum_iterative_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.momentum_iterative_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.momentum_iterative_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The MomentumIterativeMethod attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.fast_gradient_method</span> <span class=\"kn\">import</span> <span class=\"n\">optimize_linear</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_mean</span><span class=\"p\">,</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n\n<div class=\"viewcode-block\" id=\"MomentumIterativeMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MomentumIterativeMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">MomentumIterativeMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The Momentum Iterative Method (Dong et al. 2017). This method won</span>\n<span class=\"sd\">  the first places in NIPS 2017 Non-targeted Adversarial Attacks and</span>\n<span class=\"sd\">  Targeted Adversarial Attacks. The original paper used hard labels</span>\n<span class=\"sd\">  for this attack; no label smoothing.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/pdf/1710.06081.pdf</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a MomentumIterativeMethod instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">MomentumIterativeMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                                  <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;eps_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;decay_factor&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;sanity_checks&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"MomentumIterativeMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MomentumIterativeMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: Keyword arguments. See `parse_params` for documentation.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                   <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                           <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                        <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># Initialize loop variables</span>\n    <span class=\"n\">momentum</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros_like</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span>\n\n    <span class=\"c1\"># Fix labels to the first model predictions for loss computation</span>\n    <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">_nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span> <span class=\"o\">/</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">__</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Iterate until number of iterations completed&quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">ax</span><span class=\"p\">,</span> <span class=\"n\">m</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Do a momentum step&quot;&quot;&quot;</span>\n      <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">ax</span><span class=\"p\">)</span>\n      <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">targeted</span><span class=\"p\">:</span>\n        <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">loss</span>\n\n      <span class=\"c1\"># Define gradient of loss wrt input</span>\n      <span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">ax</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Normalize current gradient and add it to the accumulated gradient</span>\n      <span class=\"n\">red_ind</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())))</span>\n      <span class=\"n\">avoid_zero_div</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">1e-12</span><span class=\"p\">,</span> <span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n      <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"n\">grad</span> <span class=\"o\">/</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span>\n          <span class=\"n\">avoid_zero_div</span><span class=\"p\">,</span>\n          <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">),</span> <span class=\"n\">red_ind</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n      <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decay_factor</span> <span class=\"o\">*</span> <span class=\"n\">m</span> <span class=\"o\">+</span> <span class=\"n\">grad</span>\n\n      <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">optimize_linear</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;This attack hasn&#39;t been tested for ord=1.&quot;</span>\n                                  <span class=\"s2\">&quot;It&#39;s not clear that FGM makes a good inner &quot;</span>\n                                  <span class=\"s2\">&quot;loop step for iterative optimization since &quot;</span>\n                                  <span class=\"s2\">&quot;it updates just one coordinate at a time.&quot;</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Update and clip adversarial example in current iteration</span>\n      <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">ax</span> <span class=\"o\">+</span> <span class=\"n\">optimal_perturbation</span>\n      <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">ax</span> <span class=\"o\">-</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">ax</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n      <span class=\"n\">ax</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">ax</span><span class=\"p\">)</span>\n\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">ax</span><span class=\"p\">,</span> <span class=\"n\">m</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span>\n        <span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">([]),</span> <span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">momentum</span><span class=\"p\">),</span> <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"MomentumIterativeMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.MomentumIterativeMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"mf\">0.06</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">decay_factor</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param eps_iter: (optional float) step size for each attack iteration</span>\n<span class=\"sd\">    :param nb_iter: (optional int) Number of attack iterations.</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the labels to target. Leave</span>\n<span class=\"sd\">                     y_target=None if y is also set. Labels should be</span>\n<span class=\"sd\">                     one-hot-encoded.</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">                Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">    :param decay_factor: (optional) Decay factor for the momentum term.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">=</span> <span class=\"n\">eps_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">decay_factor</span> <span class=\"o\">=</span> <span class=\"n\">decay_factor</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span> <span class=\"o\">=</span> <span class=\"n\">sanity_checks</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must not set both y and y_target&quot;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be either np.inf, 1, or 2.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/noise.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.noise &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.noise</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The Noise attack</span>\n\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n\n\n<div class=\"viewcode-block\" id=\"Noise\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Noise\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">Noise</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A weak attack that just picks a random point in the attacker&#39;s action space.</span>\n<span class=\"sd\">  When combined with an attack bundling function, this can be used to implement</span>\n<span class=\"sd\">  random search.</span>\n\n<span class=\"sd\">  References:</span>\n<span class=\"sd\">  https://arxiv.org/abs/1802.00420 recommends random search to help identify</span>\n<span class=\"sd\">    gradient masking.</span>\n<span class=\"sd\">  https://openreview.net/forum?id=H1g0piA9tQ recommends using noise as part</span>\n<span class=\"sd\">    of an attack bundling recipe combining many different optimizers to yield</span>\n<span class=\"sd\">    a stronger optimizer.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span>\n               <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">Noise</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"Noise.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Noise.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">!=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">)</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"o\">-</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span>\n                            <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"Noise.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Noise.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">                Possible values: np.inf</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be np.inf&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/projected_gradient_descent.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.projected_gradient_descent &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.projected_gradient_descent</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The ProjectedGradientDescent attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.fast_gradient_method</span> <span class=\"kn\">import</span> <span class=\"n\">FastGradientMethod</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils_tf</span> <span class=\"kn\">import</span> <span class=\"n\">clip_eta</span><span class=\"p\">,</span> <span class=\"n\">random_lp_vector</span>\n\n\n<div class=\"viewcode-block\" id=\"ProjectedGradientDescent\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ProjectedGradientDescent\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">ProjectedGradientDescent</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This class implements either the Basic Iterative Method</span>\n<span class=\"sd\">  (Kurakin et al. 2016) when rand_init is set to 0. or the</span>\n<span class=\"sd\">  Madry et al. (2017) method when rand_minmax is larger than 0.</span>\n<span class=\"sd\">  Paper link (Kurakin et al. 2016): https://arxiv.org/pdf/1607.02533.pdf</span>\n<span class=\"sd\">  Paper link (Madry et al. 2017): https://arxiv.org/pdf/1706.06083.pdf</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param default_rand_init: whether to use random initialization by default</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">FGM_CLASS</span> <span class=\"o\">=</span> <span class=\"n\">FastGradientMethod</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span>\n               <span class=\"n\">default_rand_init</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a ProjectedGradientDescent instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">ProjectedGradientDescent</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                                                   <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;eps_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;rand_init&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">,</span>\n                              <span class=\"s1\">&#39;sanity_checks&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;loss_fn&#39;</span><span class=\"p\">]</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">default_rand_init</span> <span class=\"o\">=</span> <span class=\"n\">default_rand_init</span>\n\n<div class=\"viewcode-block\" id=\"ProjectedGradientDescent.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                   <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                           <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                        <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># Initialize loop variables</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init</span><span class=\"p\">:</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">random_lp_vector</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span>\n                             <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init_eps</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n                             <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># Clip eta</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">model_preds</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">model_preds</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">model_preds</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n      <span class=\"k\">del</span> <span class=\"n\">model_preds</span>\n\n    <span class=\"n\">y_kwarg</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"k\">if</span> <span class=\"n\">targeted</span> <span class=\"k\">else</span> <span class=\"s1\">&#39;y&#39;</span>\n\n    <span class=\"n\">fgm_params</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span>\n        <span class=\"n\">y_kwarg</span><span class=\"p\">:</span> <span class=\"n\">y</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;ord&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;loss_fn&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_fn</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span>\n    <span class=\"p\">}</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;FGM is not a good inner loop step for PGD &quot;</span>\n                                <span class=\"s2\">&quot; when ord=1, because ord=1 FGM changes only &quot;</span>\n                                <span class=\"s2\">&quot; one pixel at a time. Use the SparseL1Descent &quot;</span>\n                                <span class=\"s2\">&quot; attack instead, which allows fine-grained &quot;</span>\n                                <span class=\"s2\">&quot; control over the sparsity of the gradient &quot;</span>\n                                <span class=\"s2\">&quot; updates.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Use getattr() to avoid errors in eager execution attacks</span>\n    <span class=\"n\">FGM</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">FGM_CLASS</span><span class=\"p\">(</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span>\n        <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"nb\">getattr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"s1\">&#39;sess&#39;</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">),</span>\n        <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dtypestr</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Iterate until requested number of iterations is completed&quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Do a projected gradient step&quot;&quot;&quot;</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">FGM</span><span class=\"o\">.</span><span class=\"n\">generate</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">fgm_params</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Clipping perturbation eta to self.ord norm ball</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span> <span class=\"o\">-</span> <span class=\"n\">x</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n\n      <span class=\"c1\"># Redo the clipping.</span>\n      <span class=\"c1\"># FGM already did it, but subtracting and re-adding eta can add some</span>\n      <span class=\"c1\"># small numerical error.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">([]),</span> <span class=\"n\">adv_x</span><span class=\"p\">),</span> <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                             <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Asserts run only on CPU.</span>\n    <span class=\"c1\"># When multi-GPU eval code tries to force all PGD ops onto GPU, this</span>\n    <span class=\"c1\"># can cause an error.</span>\n    <span class=\"n\">common_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span>\n                                                      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">common_dtype</span><span class=\"p\">),</span>\n                                              <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">common_dtype</span><span class=\"p\">)))</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">==</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"c1\"># The 1e-6 is needed to compensate for numerical error.</span>\n      <span class=\"c1\"># Without the 1e-6 this fails when e.g. eps=.2, clip_min=.5,</span>\n      <span class=\"c1\"># clip_max=.7</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n                                                <span class=\"mf\">1e-6</span> <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                               <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n                                                <span class=\"o\">-</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                          <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"ProjectedGradientDescent.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"mf\">0.05</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span>\n                   <span class=\"n\">loss_fn</span><span class=\"o\">=</span><span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">rand_init</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">rand_init_eps</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param eps_iter: (optional float) step size for each attack iteration</span>\n<span class=\"sd\">    :param nb_iter: (optional int) Number of attack iterations.</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the labels to target. Leave</span>\n<span class=\"sd\">                     y_target=None if y is also set. Labels should be</span>\n<span class=\"sd\">                     one-hot-encoded.</span>\n<span class=\"sd\">    :param ord: (optional) Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">                Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">    :param loss_fn: Loss function that takes (labels, logits) as arguments and returns loss</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    :param rand_init: (optional) Start the gradient descent from a point chosen</span>\n<span class=\"sd\">                      uniformly at random in the norm ball of radius</span>\n<span class=\"sd\">                      rand_init_eps</span>\n<span class=\"sd\">    :param rand_init_eps: (optional float) size of the norm ball from which</span>\n<span class=\"sd\">                          the initial starting point is chosen. Defaults to eps</span>\n<span class=\"sd\">    :param clip_grad: (optional bool) Ignore gradient components at positions</span>\n<span class=\"sd\">                      where the input is already at the boundary of the domain,</span>\n<span class=\"sd\">                      and the update step will get clipped out.</span>\n<span class=\"sd\">    :param sanity_checks: bool Insert tf asserts checking values</span>\n<span class=\"sd\">        (Some tests need to run with no sanity checks because the</span>\n<span class=\"sd\">         tests intentionally configure the attack strangely)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"k\">if</span> <span class=\"n\">rand_init</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">rand_init</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">default_rand_init</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init</span> <span class=\"o\">=</span> <span class=\"n\">rand_init</span>\n    <span class=\"k\">if</span> <span class=\"n\">rand_init_eps</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">rand_init_eps</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init_eps</span> <span class=\"o\">=</span> <span class=\"n\">rand_init_eps</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">=</span> <span class=\"n\">eps_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"o\">=</span> <span class=\"nb\">ord</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">loss_fn</span> <span class=\"o\">=</span> <span class=\"n\">loss_fn</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"o\">=</span> <span class=\"n\">clip_grad</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">):</span>\n      <span class=\"c1\"># If these are both known at compile time, we can check before anything</span>\n      <span class=\"c1\"># is run. If they are tf, we can&#39;t check them yet.</span>\n      <span class=\"k\">assert</span> <span class=\"n\">eps_iter</span> <span class=\"o\">&lt;=</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must not set both y and y_target&quot;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Check if order of the norm is acceptable given current implementation</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Norm order must be either np.inf, 1, or 2.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must set clip_min and clip_max if clip_grad is set&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span> <span class=\"o\">=</span> <span class=\"n\">sanity_checks</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/saliency_map_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.saliency_map_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.saliency_map_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The SalienceMapMethod attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">from</span> <span class=\"nn\">six.moves</span> <span class=\"kn\">import</span> <span class=\"n\">xrange</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_max</span><span class=\"p\">,</span> <span class=\"n\">reduce_any</span>\n\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"SaliencyMapMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SaliencyMapMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">SaliencyMapMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  The Jacobian-based Saliency Map Method (Papernot et al. 2016).</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/pdf/1511.07528.pdf</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n\n<span class=\"sd\">  :note: When not using symbolic implementation in `generate`, `sess` should</span>\n<span class=\"sd\">         be provided</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a SaliencyMapMethod instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SaliencyMapMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;theta&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;gamma&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;symbolic_impl&#39;</span>\n    <span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"SaliencyMapMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SaliencyMapMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">symbolic_impl</span><span class=\"p\">:</span>\n      <span class=\"c1\"># Create random targets if y_target not provided</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"kn\">from</span> <span class=\"nn\">random</span> <span class=\"kn\">import</span> <span class=\"n\">randint</span>\n\n        <span class=\"k\">def</span> <span class=\"nf\">random_targets</span><span class=\"p\">(</span><span class=\"n\">gt</span><span class=\"p\">):</span>\n          <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">gt</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">()</span>\n          <span class=\"n\">nb_s</span> <span class=\"o\">=</span> <span class=\"n\">gt</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n          <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">gt</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n\n          <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">nb_s</span><span class=\"p\">):</span>\n            <span class=\"n\">result</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"p\">:]</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">roll</span><span class=\"p\">(</span><span class=\"n\">result</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"p\">:],</span>\n                                   <span class=\"n\">randint</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n\n          <span class=\"k\">return</span> <span class=\"n\">result</span>\n\n        <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">py_func</span><span class=\"p\">(</span><span class=\"n\">random_targets</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">labels</span><span class=\"p\">],</span>\n                                   <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"o\">.</span><span class=\"n\">set_shape</span><span class=\"p\">([</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">])</span>\n\n      <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"n\">jsma_symbolic</span><span class=\"p\">(</span>\n          <span class=\"n\">x</span><span class=\"p\">,</span>\n          <span class=\"n\">model</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span>\n          <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span><span class=\"p\">,</span>\n          <span class=\"n\">theta</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span><span class=\"p\">,</span>\n          <span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span><span class=\"p\">,</span>\n          <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n          <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;The jsma_batch function has been removed.&quot;</span>\n                                <span class=\"s2\">&quot; The symbolic_impl argument to SaliencyMapMethod will be removed&quot;</span>\n                                <span class=\"s2\">&quot; on 2019-07-18 or after. Any code that depends on the non-symbolic&quot;</span>\n                                <span class=\"s2\">&quot; implementation of the JSMA should be revised. Consider using&quot;</span>\n                                <span class=\"s2\">&quot; SaliencyMapMethod.generate_np() instead.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">x_adv</span></div>\n\n<div class=\"viewcode-block\" id=\"SaliencyMapMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SaliencyMapMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">theta</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n                   <span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"mf\">0.</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">symbolic_impl</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param theta: (optional float) Perturbation introduced to modified</span>\n<span class=\"sd\">                  components (can be positive or negative)</span>\n<span class=\"sd\">    :param gamma: (optional float) Maximum percentage of perturbed features</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum component value for clipping</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum component value for clipping</span>\n<span class=\"sd\">    :param y_target: (optional) Target tensor if the attack is targeted</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">theta</span> <span class=\"o\">=</span> <span class=\"n\">theta</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">gamma</span> <span class=\"o\">=</span> <span class=\"n\">gamma</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">symbolic_impl</span> <span class=\"o\">=</span> <span class=\"n\">symbolic_impl</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">jsma_batch</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span>\n      <span class=\"s2\">&quot;The jsma_batch function has been removed. Any code that depends on it should be revised.&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">jsma_symbolic</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">theta</span><span class=\"p\">,</span> <span class=\"n\">gamma</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of the JSMA (see https://arxiv.org/abs/1511.07528</span>\n<span class=\"sd\">  for details about the algorithm design choices).</span>\n\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param y_target: the target tensor</span>\n<span class=\"sd\">  :param model: a cleverhans.model.Model object.</span>\n<span class=\"sd\">  :param theta: delta for each feature adjustment</span>\n<span class=\"sd\">  :param gamma: a float between 0 - 1 indicating the maximum distortion</span>\n<span class=\"sd\">      percentage</span>\n<span class=\"sd\">  :param clip_min: minimum value for components of the example returned</span>\n<span class=\"sd\">  :param clip_max: maximum value for components of the example returned</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">y_target</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">)</span>\n  <span class=\"n\">nb_features</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">product</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:])</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"o\">==</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span> <span class=\"ow\">and</span> <span class=\"n\">y_target</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"o\">==</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">:</span>\n    <span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"o\">==</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span> <span class=\"ow\">and</span> <span class=\"n\">y_target</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"o\">==</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float64</span><span class=\"p\">:</span>\n    <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Downcasting labels---this should be harmless unless&quot;</span>\n                  <span class=\"s2\">&quot; they are smoothed&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">)</span>\n\n  <span class=\"n\">max_iters</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">floor</span><span class=\"p\">(</span><span class=\"n\">nb_features</span> <span class=\"o\">*</span> <span class=\"n\">gamma</span> <span class=\"o\">/</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n  <span class=\"n\">increase</span> <span class=\"o\">=</span> <span class=\"nb\">bool</span><span class=\"p\">(</span><span class=\"n\">theta</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n\n  <span class=\"n\">tmp</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ones</span><span class=\"p\">((</span><span class=\"n\">nb_features</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">),</span> <span class=\"nb\">int</span><span class=\"p\">)</span>\n  <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">fill_diagonal</span><span class=\"p\">(</span><span class=\"n\">tmp</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n  <span class=\"n\">zero_diagonal</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">constant</span><span class=\"p\">(</span><span class=\"n\">tmp</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Compute our initial search domain. We optimize the initial search domain</span>\n  <span class=\"c1\"># by removing all features that are already at their maximum values (if</span>\n  <span class=\"c1\"># increasing input features---otherwise, at their minimum value).</span>\n  <span class=\"k\">if</span> <span class=\"n\">increase</span><span class=\"p\">:</span>\n    <span class=\"n\">search_domain</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"o\">&lt;</span> <span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">),</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">search_domain</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"o\">&gt;</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">),</span> <span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n\n  <span class=\"c1\"># Loop variables</span>\n  <span class=\"c1\"># x_in: the tensor that holds the latest adversarial outputs that are in</span>\n  <span class=\"c1\">#       progress.</span>\n  <span class=\"c1\"># y_in: the tensor for target labels</span>\n  <span class=\"c1\"># domain_in: the tensor that holds the latest search domain</span>\n  <span class=\"c1\"># cond_in: the boolean tensor to show if more iteration is needed for</span>\n  <span class=\"c1\">#          generating adversarial samples</span>\n  <span class=\"k\">def</span> <span class=\"nf\">condition</span><span class=\"p\">(</span><span class=\"n\">x_in</span><span class=\"p\">,</span> <span class=\"n\">y_in</span><span class=\"p\">,</span> <span class=\"n\">domain_in</span><span class=\"p\">,</span> <span class=\"n\">i_in</span><span class=\"p\">,</span> <span class=\"n\">cond_in</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Repeat the loop until we have achieved misclassification or</span>\n    <span class=\"c1\"># reaches the maximum iterations</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">logical_and</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i_in</span><span class=\"p\">,</span> <span class=\"n\">max_iters</span><span class=\"p\">),</span> <span class=\"n\">cond_in</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Same loop variables as above</span>\n  <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">x_in</span><span class=\"p\">,</span> <span class=\"n\">y_in</span><span class=\"p\">,</span> <span class=\"n\">domain_in</span><span class=\"p\">,</span> <span class=\"n\">i_in</span><span class=\"p\">,</span> <span class=\"n\">cond_in</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Create graph for model logits and predictions</span>\n    <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x_in</span><span class=\"p\">)</span>\n    <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n    <span class=\"n\">preds_onehot</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"n\">depth</span><span class=\"o\">=</span><span class=\"n\">nb_classes</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># create the Jacobian graph</span>\n    <span class=\"n\">list_derivatives</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> <span class=\"n\">class_ind</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"n\">nb_classes</span><span class=\"p\">):</span>\n      <span class=\"n\">derivatives</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">[:,</span> <span class=\"n\">class_ind</span><span class=\"p\">],</span> <span class=\"n\">x_in</span><span class=\"p\">)</span>\n      <span class=\"n\">list_derivatives</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">derivatives</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n    <span class=\"n\">grads</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">(</span><span class=\"n\">list_derivatives</span><span class=\"p\">),</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n\n    <span class=\"c1\"># Compute the Jacobian components</span>\n    <span class=\"c1\"># To help with the computation later, reshape the target_class</span>\n    <span class=\"c1\"># and other_class to [nb_classes, -1, 1].</span>\n    <span class=\"c1\"># The last dimention is added to allow broadcasting later.</span>\n    <span class=\"n\">target_class</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">transpose</span><span class=\"p\">(</span><span class=\"n\">y_in</span><span class=\"p\">,</span> <span class=\"n\">perm</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]),</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">])</span>\n    <span class=\"n\">other_classes</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">not_equal</span><span class=\"p\">(</span><span class=\"n\">target_class</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">grads_target</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">grads</span> <span class=\"o\">*</span> <span class=\"n\">target_class</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">grads_other</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">grads</span> <span class=\"o\">*</span> <span class=\"n\">other_classes</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Remove the already-used input features from the search space</span>\n    <span class=\"c1\"># Subtract 2 times the maximum value from those value so that</span>\n    <span class=\"c1\"># they won&#39;t be picked later</span>\n    <span class=\"n\">increase_coef</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"mi\">4</span> <span class=\"o\">*</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">increase</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mi\">2</span><span class=\"p\">)</span> \\\n        <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">domain_in</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">),</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">target_tmp</span> <span class=\"o\">=</span> <span class=\"n\">grads_target</span>\n    <span class=\"n\">target_tmp</span> <span class=\"o\">-=</span> <span class=\"n\">increase_coef</span> \\\n        <span class=\"o\">*</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grads_target</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">target_sum</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">target_tmp</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">])</span> \\\n        <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">target_tmp</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n\n    <span class=\"n\">other_tmp</span> <span class=\"o\">=</span> <span class=\"n\">grads_other</span>\n    <span class=\"n\">other_tmp</span> <span class=\"o\">+=</span> <span class=\"n\">increase_coef</span> \\\n        <span class=\"o\">*</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grads_other</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">other_sum</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">other_tmp</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">])</span> \\\n        <span class=\"o\">+</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">other_tmp</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">])</span>\n\n    <span class=\"c1\"># Create a mask to only keep features that match conditions</span>\n    <span class=\"k\">if</span> <span class=\"n\">increase</span><span class=\"p\">:</span>\n      <span class=\"n\">scores_mask</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"n\">target_sum</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"p\">(</span><span class=\"n\">other_sum</span> <span class=\"o\">&lt;</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">scores_mask</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"n\">target_sum</span> <span class=\"o\">&lt;</span> <span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"p\">(</span><span class=\"n\">other_sum</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># Create a 2D numpy array of scores for each pair of candidate features</span>\n    <span class=\"n\">scores</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">scores_mask</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">)</span> \\\n        <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">target_sum</span> <span class=\"o\">*</span> <span class=\"n\">other_sum</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">zero_diagonal</span>\n\n    <span class=\"c1\"># Extract the best two pixels</span>\n    <span class=\"n\">best</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">scores</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span> <span class=\"o\">*</span> <span class=\"n\">nb_features</span><span class=\"p\">]),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n    <span class=\"n\">p1</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">mod</span><span class=\"p\">(</span><span class=\"n\">best</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">)</span>\n    <span class=\"n\">p2</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">floordiv</span><span class=\"p\">(</span><span class=\"n\">best</span><span class=\"p\">,</span> <span class=\"n\">nb_features</span><span class=\"p\">)</span>\n    <span class=\"n\">p1_one_hot</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">p1</span><span class=\"p\">,</span> <span class=\"n\">depth</span><span class=\"o\">=</span><span class=\"n\">nb_features</span><span class=\"p\">)</span>\n    <span class=\"n\">p2_one_hot</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">p2</span><span class=\"p\">,</span> <span class=\"n\">depth</span><span class=\"o\">=</span><span class=\"n\">nb_features</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Check if more modification is needed for each sample</span>\n    <span class=\"n\">mod_not_done</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y_in</span> <span class=\"o\">*</span> <span class=\"n\">preds_onehot</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">cond</span> <span class=\"o\">=</span> <span class=\"n\">mod_not_done</span> <span class=\"o\">&amp;</span> <span class=\"p\">(</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">domain_in</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Update the search domain</span>\n    <span class=\"n\">cond_float</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">tf_dtype</span><span class=\"p\">),</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">])</span>\n    <span class=\"n\">to_mod</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">p1_one_hot</span> <span class=\"o\">+</span> <span class=\"n\">p2_one_hot</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">cond_float</span>\n\n    <span class=\"n\">domain_out</span> <span class=\"o\">=</span> <span class=\"n\">domain_in</span> <span class=\"o\">-</span> <span class=\"n\">to_mod</span>\n\n    <span class=\"c1\"># Apply the modification to the images</span>\n    <span class=\"n\">to_mod_reshape</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n        <span class=\"n\">to_mod</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"o\">=</span><span class=\"p\">([</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">x_in</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:]</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()))</span>\n    <span class=\"k\">if</span> <span class=\"n\">increase</span><span class=\"p\">:</span>\n      <span class=\"n\">x_out</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">x_in</span> <span class=\"o\">+</span> <span class=\"n\">to_mod_reshape</span> <span class=\"o\">*</span> <span class=\"n\">theta</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">x_out</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">x_in</span> <span class=\"o\">-</span> <span class=\"n\">to_mod_reshape</span> <span class=\"o\">*</span> <span class=\"n\">theta</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Increase the iterator, and check if all misclassifications are done</span>\n    <span class=\"n\">i_out</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">i_in</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">cond_out</span> <span class=\"o\">=</span> <span class=\"n\">reduce_any</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">x_out</span><span class=\"p\">,</span> <span class=\"n\">y_in</span><span class=\"p\">,</span> <span class=\"n\">domain_out</span><span class=\"p\">,</span> <span class=\"n\">i_out</span><span class=\"p\">,</span> <span class=\"n\">cond_out</span>\n\n  <span class=\"c1\"># Run loop to do JSMA</span>\n  <span class=\"n\">x_adv</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span>\n      <span class=\"n\">condition</span><span class=\"p\">,</span>\n      <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y_target</span><span class=\"p\">,</span> <span class=\"n\">search_domain</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"kc\">True</span><span class=\"p\">],</span>\n      <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">x_adv</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/semantic.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.semantic &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.semantic</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;Semantic adversarial examples</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n\n\n<div class=\"viewcode-block\" id=\"Semantic\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Semantic\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">Semantic</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Semantic adversarial examples</span>\n\n<span class=\"sd\">  https://arxiv.org/abs/1703.06857</span>\n\n<span class=\"sd\">  Note: data must either be centered (so that the negative image can be</span>\n<span class=\"sd\">  made by simple negation) or must be in the interval [-1, 1]</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param center: bool</span>\n<span class=\"sd\">    If True, assumes data has 0 mean so the negative image is just negation.</span>\n<span class=\"sd\">    If False, assumes data is in the interval [0, max_val]</span>\n<span class=\"sd\">  :param max_val: float</span>\n<span class=\"sd\">    Maximum value allowed in the input data</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of data</span>\n<span class=\"sd\">  :param kwargs: passed through to the super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">center</span><span class=\"p\">,</span> <span class=\"n\">max_val</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span>\n               <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">Semantic</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">center</span> <span class=\"o\">=</span> <span class=\"n\">center</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_val</span> <span class=\"o\">=</span> <span class=\"n\">max_val</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dataset_factory&#39;</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"s1\">&#39;center&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">dataset_factory</span><span class=\"o\">.</span><span class=\"n\">kwargs</span><span class=\"p\">:</span>\n        <span class=\"k\">assert</span> <span class=\"n\">center</span> <span class=\"o\">==</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">dataset_factory</span><span class=\"o\">.</span><span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;center&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"Semantic.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.Semantic.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">center</span><span class=\"p\">:</span>\n      <span class=\"k\">return</span> <span class=\"o\">-</span><span class=\"n\">x</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">max_val</span> <span class=\"o\">-</span> <span class=\"n\">x</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/sparse_l1_descent.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.sparse_l1_descent &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.sparse_l1_descent</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The SparseL1Descent attack.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n<span class=\"kn\">from</span> <span class=\"nn\">distutils.version</span> <span class=\"kn\">import</span> <span class=\"n\">LooseVersion</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils_tf</span> <span class=\"kn\">import</span> <span class=\"n\">clip_eta</span><span class=\"p\">,</span> <span class=\"n\">random_lp_vector</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_max</span><span class=\"p\">,</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> \\\n  <span class=\"n\">softmax_cross_entropy_with_logits</span>\n\n\n<div class=\"viewcode-block\" id=\"SparseL1Descent\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SparseL1Descent\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">SparseL1Descent</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This class implements a variant of Projected Gradient Descent for the l1-norm</span>\n<span class=\"sd\">  (Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2</span>\n<span class=\"sd\">  cases covered by the ProjectedGradientDescent class, because the steepest</span>\n<span class=\"sd\">  descent direction for the l1-norm is too sparse (it updates a single</span>\n<span class=\"sd\">  coordinate in the adversarial perturbation in each step). This attack has an</span>\n<span class=\"sd\">  additional parameter that controls the sparsity of the update step. For</span>\n<span class=\"sd\">  moderately sparse update steps, the attack vastly outperforms Projected</span>\n<span class=\"sd\">  Steepest Descent and is competitive with other attacks targeted at the l1-norm</span>\n<span class=\"sd\">  such as the ElasticNetMethod attack (which is much more computationally</span>\n<span class=\"sd\">  expensive).</span>\n<span class=\"sd\">  Paper link (Tramer and Boneh 2019): https://arxiv.org/pdf/1904.13000.pdf</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a SparseL1Descent instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SparseL1Descent</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                                          <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;eps_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;grad_sparsity&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;rand_init&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_grad&#39;</span><span class=\"p\">,</span>\n                              <span class=\"s1\">&#39;sanity_checks&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"SparseL1Descent.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SparseL1Descent.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                   <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                           <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                                                <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                        <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"c1\"># Initialize loop variables</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init</span><span class=\"p\">:</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">random_lp_vector</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n                             <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">))</span>\n\n    <span class=\"c1\"># Clip eta</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">model_preds</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">model_preds</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">model_preds</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n      <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n      <span class=\"n\">targeted</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n      <span class=\"k\">del</span> <span class=\"n\">model_preds</span>\n\n    <span class=\"n\">y_kwarg</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"k\">if</span> <span class=\"n\">targeted</span> <span class=\"k\">else</span> <span class=\"s1\">&#39;y&#39;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Iterate until requested number of iterations is completed&quot;&quot;&quot;</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;Do a projected gradient step&quot;&quot;&quot;</span>\n\n      <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"n\">y_kwarg</span><span class=\"p\">:</span> <span class=\"n\">y</span><span class=\"p\">})</span>\n      <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">sparse_l1_descent</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span>\n                                <span class=\"n\">logits</span><span class=\"p\">,</span>\n                                <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">,</span>\n                                <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span>\n                                <span class=\"n\">q</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"p\">,</span>\n                                <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span><span class=\"p\">,</span>\n                                <span class=\"n\">targeted</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">),</span>\n                                <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Clipping perturbation eta to the l1-ball</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">adv_x</span> <span class=\"o\">-</span> <span class=\"n\">x</span>\n      <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">)</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">eta</span>\n\n      <span class=\"c1\"># Redo the clipping.</span>\n      <span class=\"c1\"># Subtracting and re-adding eta can add some small numerical error.</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span><span class=\"n\">cond</span><span class=\"p\">,</span> <span class=\"n\">body</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">([]),</span> <span class=\"n\">adv_x</span><span class=\"p\">),</span> <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                             <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Asserts run only on CPU.</span>\n    <span class=\"c1\"># When multi-GPU eval code tries to force all PGD ops onto GPU, this</span>\n    <span class=\"c1\"># can cause an error.</span>\n    <span class=\"n\">common_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span>\n                                                      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">common_dtype</span><span class=\"p\">),</span>\n                                              <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">common_dtype</span><span class=\"p\">)))</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"SparseL1Descent.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SparseL1Descent.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">10.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">,</span>\n                   <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">rand_init</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                   <span class=\"n\">grad_sparsity</span><span class=\"o\">=</span><span class=\"mi\">99</span><span class=\"p\">,</span>\n                   <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float) maximum distortion of adversarial example</span>\n<span class=\"sd\">                compared to original input</span>\n<span class=\"sd\">    :param eps_iter: (optional float) step size for each attack iteration</span>\n<span class=\"sd\">    :param nb_iter: (optional int) Number of attack iterations.</span>\n<span class=\"sd\">    :param y: (optional) A tensor with the true labels.</span>\n<span class=\"sd\">    :param y_target: (optional) A tensor with the labels to target. Leave</span>\n<span class=\"sd\">                     y_target=None if y is also set. Labels should be</span>\n<span class=\"sd\">                     one-hot-encoded.</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    :param clip_grad: (optional bool) Ignore gradient components</span>\n<span class=\"sd\">                      at positions where the input is already at the boundary</span>\n<span class=\"sd\">                      of the domain, and the update step will get clipped out.</span>\n<span class=\"sd\">    :param grad_sparsity (optional) Relative sparsity of the gradient update</span>\n<span class=\"sd\">                         step, in percent. Only gradient values larger</span>\n<span class=\"sd\">                         than this percentile are retained. This parameter can</span>\n<span class=\"sd\">                         be a scalar, or a vector of the same length as the</span>\n<span class=\"sd\">                         input batch dimension.</span>\n<span class=\"sd\">    :param sanity_checks: bool Insert tf asserts checking values</span>\n<span class=\"sd\">        (Some tests need to run with no sanity checks because the</span>\n<span class=\"sd\">         tests intentionally configure the attack strangely)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">rand_init</span> <span class=\"o\">=</span> <span class=\"n\">rand_init</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps_iter</span> <span class=\"o\">=</span> <span class=\"n\">eps_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"o\">=</span> <span class=\"n\">clip_grad</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span> <span class=\"o\">=</span> <span class=\"n\">grad_sparsity</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">):</span>\n      <span class=\"c1\"># If these are both known at compile time, we can check before anything</span>\n      <span class=\"c1\"># is run. If they are tf, we can&#39;t check them yet.</span>\n      <span class=\"k\">assert</span> <span class=\"n\">eps_iter</span> <span class=\"o\">&lt;=</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">eps_iter</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must not set both y and y_target&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_grad</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must set clip_min and clip_max if clip_grad is set&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># The grad_sparsity argument governs the sparsity of the gradient</span>\n    <span class=\"c1\"># update. It indicates the percentile value above which gradient entries</span>\n    <span class=\"c1\"># are retained. It can be specified as a scalar or as a 1-dimensional</span>\n    <span class=\"c1\"># vector of the same size as the input&#39;s batch dimension.</span>\n    <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"p\">,</span> <span class=\"nb\">int</span><span class=\"p\">)</span> <span class=\"ow\">or</span> \\\n        <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"mi\">0</span> <span class=\"o\">&lt;</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span> <span class=\"o\">&lt;</span> <span class=\"mi\">100</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;grad_sparsity should be in (0, 100)&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">convert_to_tensor</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">grad_sparsity</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;grad_sparsity should either be a scalar or a vector&quot;</span><span class=\"p\">)</span>\n\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">sanity_checks</span> <span class=\"o\">=</span> <span class=\"n\">sanity_checks</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">sparse_l1_descent</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span>\n                      <span class=\"n\">logits</span><span class=\"p\">,</span>\n                      <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                      <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span>\n                      <span class=\"n\">q</span><span class=\"o\">=</span><span class=\"mi\">99</span><span class=\"p\">,</span>\n                      <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                      <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                      <span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                      <span class=\"n\">targeted</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                      <span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of the Dense L1 Descent Method.</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param logits: output of model.get_logits</span>\n<span class=\"sd\">  :param y: (optional) A placeholder for the true labels. If targeted</span>\n<span class=\"sd\">            is true, then provide the target label. Otherwise, only provide</span>\n<span class=\"sd\">            this parameter if you&#39;d like to use true labels when crafting</span>\n<span class=\"sd\">            adversarial samples. Otherwise, model predictions are used as</span>\n<span class=\"sd\">            labels to avoid the &quot;label leaking&quot; effect (explained in this</span>\n<span class=\"sd\">            paper: https://arxiv.org/abs/1611.01236). Default is None.</span>\n<span class=\"sd\">            Labels should be one-hot-encoded.</span>\n<span class=\"sd\">  :param eps: the epsilon (input variation parameter)</span>\n<span class=\"sd\">  :param q: the percentile above which gradient values are retained. Either a</span>\n<span class=\"sd\">            scalar or a vector of same length as the input batch dimension.</span>\n<span class=\"sd\">  :param clip_min: Minimum float value for adversarial example components</span>\n<span class=\"sd\">  :param clip_max: Maximum float value for adversarial example components</span>\n<span class=\"sd\">  :param clip_grad: (optional bool) Ignore gradient components</span>\n<span class=\"sd\">                    at positions where the input is already at the boundary</span>\n<span class=\"sd\">                    of the domain, and the update step will get clipped out.</span>\n<span class=\"sd\">  :param targeted: Is the attack targeted or untargeted? Untargeted, the</span>\n<span class=\"sd\">                   default, will try to make the label incorrect. Targeted</span>\n<span class=\"sd\">                   will instead try to move in the direction of being more</span>\n<span class=\"sd\">                   like y.</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n  <span class=\"c1\"># If a data range was specified, check that the input was in that range</span>\n  <span class=\"k\">if</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">asserts</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)))</span>\n\n  <span class=\"c1\"># Make sure the caller has not passed probs by accident</span>\n  <span class=\"k\">assert</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;Softmax&#39;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Using model predictions as ground truth to avoid label leaking</span>\n    <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n  <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span> <span class=\"o\">/</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Compute loss</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">targeted</span><span class=\"p\">:</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">loss</span>\n\n  <span class=\"c1\"># Define gradient of loss wrt input</span>\n  <span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_grad</span><span class=\"p\">:</span>\n    <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">zero_out_clipped_grads</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n  <span class=\"n\">red_ind</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())))</span>\n  <span class=\"n\">dim</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_prod</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n\n  <span class=\"n\">abs_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">dim</span><span class=\"p\">))</span>\n\n  <span class=\"c1\"># if q is a scalar, broadcast it to a vector of same length as the batch dim</span>\n  <span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">broadcast_to</span><span class=\"p\">(</span><span class=\"n\">q</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">:</span><span class=\"mi\">1</span><span class=\"p\">]),</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">)</span>\n  <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">floor</span><span class=\"p\">(</span><span class=\"n\">q</span> <span class=\"o\">/</span> <span class=\"mi\">100</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">dim</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">)),</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># `tf.sort` is much faster than `tf.contrib.distributions.percentile`.</span>\n  <span class=\"c1\"># For TF &lt;= 1.12, use `tf.nn.top_k` as `tf.sort` is not implemented.</span>\n  <span class=\"k\">if</span> <span class=\"n\">LooseVersion</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">__version__</span><span class=\"p\">)</span> <span class=\"o\">&lt;=</span> <span class=\"n\">LooseVersion</span><span class=\"p\">(</span><span class=\"s1\">&#39;1.12.0&#39;</span><span class=\"p\">):</span>\n    <span class=\"c1\"># `tf.sort` is only available in TF 1.13 onwards</span>\n    <span class=\"n\">sorted_grad</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">top_k</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"o\">=</span><span class=\"n\">dim</span><span class=\"p\">,</span> <span class=\"nb\">sorted</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">sorted_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n  <span class=\"n\">idx</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">((</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">range</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]),</span> <span class=\"n\">k</span><span class=\"p\">),</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"n\">percentiles</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gather_nd</span><span class=\"p\">(</span><span class=\"n\">sorted_grad</span><span class=\"p\">,</span> <span class=\"n\">idx</span><span class=\"p\">)</span>\n  <span class=\"n\">tied_for_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater_equal</span><span class=\"p\">(</span><span class=\"n\">abs_grad</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">percentiles</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n  <span class=\"n\">tied_for_max</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tied_for_max</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">))</span>\n  <span class=\"n\">num_ties</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tied_for_max</span><span class=\"p\">,</span> <span class=\"n\">red_ind</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n  <span class=\"n\">optimal_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">tied_for_max</span> <span class=\"o\">/</span> <span class=\"n\">num_ties</span>\n\n  <span class=\"c1\"># Add perturbation to original example to obtain adversarial example</span>\n  <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">mul</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">optimal_perturbation</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># If clipping is needed, reset all values outside of [clip_min, clip_max]</span>\n  <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">or</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"c1\"># We don&#39;t currently support one-sided clipping</span>\n    <span class=\"k\">assert</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">sanity_checks</span><span class=\"p\">:</span>\n    <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">adv_x</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/spatial_transformation_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.spatial_transformation_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.spatial_transformation_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The SpatialTransformationMethod attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n\n\n<div class=\"viewcode-block\" id=\"SpatialTransformationMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SpatialTransformationMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">SpatialTransformationMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Spatial transformation attack</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create a SpatialTransformationMethod instance.</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SpatialTransformationMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>\n        <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;n_samples&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dx_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dx_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;n_dxs&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dy_min&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;dy_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;n_dys&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;angle_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;angle_max&#39;</span><span class=\"p\">,</span>\n                            <span class=\"s1\">&#39;n_angles&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;black_border_size&#39;</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"SpatialTransformationMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SpatialTransformationMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks_tf</span> <span class=\"kn\">import</span> <span class=\"n\">spm</span>\n\n    <span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_or_guess_labels</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">spm</span><span class=\"p\">(</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span>\n        <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">,</span>\n        <span class=\"n\">n_samples</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_samples</span><span class=\"p\">,</span>\n        <span class=\"n\">dx_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_min</span><span class=\"p\">,</span> <span class=\"n\">dx_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_max</span><span class=\"p\">,</span> <span class=\"n\">n_dxs</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_dxs</span><span class=\"p\">,</span>\n        <span class=\"n\">dy_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_min</span><span class=\"p\">,</span> <span class=\"n\">dy_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_max</span><span class=\"p\">,</span> <span class=\"n\">n_dys</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_dys</span><span class=\"p\">,</span>\n        <span class=\"n\">angle_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">angle_min</span><span class=\"p\">,</span> <span class=\"n\">angle_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">angle_max</span><span class=\"p\">,</span>\n        <span class=\"n\">n_angles</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_angles</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">black_border_size</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"SpatialTransformationMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SpatialTransformationMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">n_samples</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">dx_min</span><span class=\"o\">=-</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n                   <span class=\"n\">dx_max</span><span class=\"o\">=</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n                   <span class=\"n\">n_dxs</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span>\n                   <span class=\"n\">dy_min</span><span class=\"o\">=-</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n                   <span class=\"n\">dy_max</span><span class=\"o\">=</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n                   <span class=\"n\">n_dys</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span>\n                   <span class=\"n\">angle_min</span><span class=\"o\">=-</span><span class=\"mi\">30</span><span class=\"p\">,</span>\n                   <span class=\"n\">angle_max</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">,</span>\n                   <span class=\"n\">n_angles</span><span class=\"o\">=</span><span class=\"mi\">6</span><span class=\"p\">,</span>\n                   <span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n<span class=\"sd\">    :param n_samples: (optional) The number of transformations sampled to</span>\n<span class=\"sd\">                      construct the attack. Set it to None to run</span>\n<span class=\"sd\">                      full grid attack.</span>\n<span class=\"sd\">    :param dx_min: (optional float) Minimum translation ratio along x-axis.</span>\n<span class=\"sd\">    :param dx_max: (optional float) Maximum translation ratio along x-axis.</span>\n<span class=\"sd\">    :param n_dxs: (optional int) Number of discretized translation ratios</span>\n<span class=\"sd\">                  along x-axis.</span>\n<span class=\"sd\">    :param dy_min: (optional float) Minimum translation ratio along y-axis.</span>\n<span class=\"sd\">    :param dy_max: (optional float) Maximum translation ratio along y-axis.</span>\n<span class=\"sd\">    :param n_dys: (optional int) Number of discretized translation ratios</span>\n<span class=\"sd\">                  along y-axis.</span>\n<span class=\"sd\">    :param angle_min: (optional float) Largest counter-clockwise rotation</span>\n<span class=\"sd\">                      angle.</span>\n<span class=\"sd\">    :param angle_max: (optional float) Largest clockwise rotation angle.</span>\n<span class=\"sd\">    :param n_angles: (optional int) Number of discretized angles.</span>\n<span class=\"sd\">    :param black_border_size: (optional int) size of the black border in pixels.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_samples</span> <span class=\"o\">=</span> <span class=\"n\">n_samples</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_min</span> <span class=\"o\">=</span> <span class=\"n\">dx_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_max</span> <span class=\"o\">=</span> <span class=\"n\">dx_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_dxs</span> <span class=\"o\">=</span> <span class=\"n\">n_dxs</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_min</span> <span class=\"o\">=</span> <span class=\"n\">dy_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_max</span> <span class=\"o\">=</span> <span class=\"n\">dy_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_dys</span> <span class=\"o\">=</span> <span class=\"n\">n_dys</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">angle_min</span> <span class=\"o\">=</span> <span class=\"n\">angle_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">angle_max</span> <span class=\"o\">=</span> <span class=\"n\">angle_max</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">n_angles</span> <span class=\"o\">=</span> <span class=\"n\">n_angles</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">black_border_size</span> <span class=\"o\">=</span> <span class=\"n\">black_border_size</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_min</span> <span class=\"o\">&lt;</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_min</span> <span class=\"o\">&lt;</span> <span class=\"o\">-</span><span class=\"mi\">1</span> <span class=\"ow\">or</span> \\\n       <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dx_max</span> <span class=\"o\">&gt;</span> <span class=\"mi\">1</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">dy_max</span> <span class=\"o\">&gt;</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;The value of translation must be bounded &quot;</span>\n                       <span class=\"s2\">&quot;within [-1, 1]&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/spsa.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.spsa &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.spsa</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The SPSA attack</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"c1\"># pylint: disable=missing-docstring</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">from</span> <span class=\"nn\">six.moves</span> <span class=\"kn\">import</span> <span class=\"n\">xrange</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n<span class=\"c1\"># import tensorflow_addons as tfa</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_mean</span><span class=\"p\">,</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n\n<div class=\"viewcode-block\" id=\"SPSA\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SPSA\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">SPSA</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This implements the SPSA adversary, as in https://arxiv.org/abs/1802.05666</span>\n<span class=\"sd\">  (Uesato et al. 2018). SPSA is a gradient-free optimization method, which</span>\n<span class=\"sd\">  is useful when the model is non-differentiable, or more generally, the</span>\n<span class=\"sd\">  gradients do not point in useful directions.</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">DEFAULT_SPSA_SAMPLES</span> <span class=\"o\">=</span> <span class=\"mi\">128</span>\n  <span class=\"n\">DEFAULT_SPSA_ITERS</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n  <span class=\"n\">DEFAULT_DELTA</span> <span class=\"o\">=</span> <span class=\"mf\">0.01</span>\n  <span class=\"n\">DEFAULT_LEARNING_RATE</span> <span class=\"o\">=</span> <span class=\"mf\">0.01</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SPSA</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"s1\">&#39;nb_iter&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;spsa_samples&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;spsa_iters&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;early_stop_loss_threshold&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;is_debug&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;is_targeted&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">]</span>\n\n    <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"SPSA.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SPSA.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n               <span class=\"n\">x</span><span class=\"p\">,</span>\n               <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">is_targeted</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">early_stop_loss_threshold</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"n\">DEFAULT_LEARNING_RATE</span><span class=\"p\">,</span>\n               <span class=\"n\">delta</span><span class=\"o\">=</span><span class=\"n\">DEFAULT_DELTA</span><span class=\"p\">,</span>\n               <span class=\"n\">spsa_samples</span><span class=\"o\">=</span><span class=\"n\">DEFAULT_SPSA_SAMPLES</span><span class=\"p\">,</span>\n               <span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">spsa_iters</span><span class=\"o\">=</span><span class=\"n\">DEFAULT_SPSA_ITERS</span><span class=\"p\">,</span>\n               <span class=\"n\">is_debug</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n               <span class=\"n\">epsilon</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">num_steps</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs. Must be a batch of size 1.</span>\n<span class=\"sd\">    :param y: A Tensor or None. The index of the correct label.</span>\n<span class=\"sd\">    :param y_target: A Tensor or None. The index of the target label in a</span>\n<span class=\"sd\">                     targeted attack.</span>\n<span class=\"sd\">    :param eps: The size of the maximum perturbation, measured in the</span>\n<span class=\"sd\">                L-infinity norm.</span>\n<span class=\"sd\">    :param clip_min: If specified, the minimum input value</span>\n<span class=\"sd\">    :param clip_max: If specified, the maximum input value</span>\n<span class=\"sd\">    :param nb_iter: The number of optimization steps.</span>\n<span class=\"sd\">    :param early_stop_loss_threshold: A float or None. If specified, the</span>\n<span class=\"sd\">                                      attack will end as soon as the loss</span>\n<span class=\"sd\">                                      is below `early_stop_loss_threshold`.</span>\n<span class=\"sd\">    :param learning_rate: Learning rate of ADAM optimizer.</span>\n<span class=\"sd\">    :param delta: Perturbation size used for SPSA approximation.</span>\n<span class=\"sd\">    :param spsa_samples: Number of inputs to evaluate at a single time.</span>\n<span class=\"sd\">                       The true batch size (the number of evaluated</span>\n<span class=\"sd\">                       inputs for each update) is `spsa_samples *</span>\n<span class=\"sd\">                       spsa_iters`</span>\n<span class=\"sd\">    :param batch_size: Deprecated param that is an alias for spsa_samples</span>\n<span class=\"sd\">    :param spsa_iters: Number of model evaluations before performing an</span>\n<span class=\"sd\">                       update, where each evaluation is on `spsa_samples`</span>\n<span class=\"sd\">                       different inputs.</span>\n<span class=\"sd\">    :param is_debug: If True, print the adversarial loss after each update.</span>\n<span class=\"sd\">    :param epsilon: Deprecated alias for `eps`</span>\n<span class=\"sd\">    :param num_steps: Deprecated alias for `nb_iter`.</span>\n<span class=\"sd\">    :param is_targeted: Deprecated argument. Ignored.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">epsilon</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">eps</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Should not specify both eps and its deprecated &quot;</span>\n                         <span class=\"s2\">&quot;alias, epsilon&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`epsilon` is deprecated. Switch to `eps`. `epsilon` may &quot;</span>\n                    <span class=\"s2\">&quot;be removed on or after 2019-04-15.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">epsilon</span>\n    <span class=\"k\">del</span> <span class=\"n\">epsilon</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">num_steps</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">nb_iter</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Should not specify both nb_iter and its deprecated &quot;</span>\n                         <span class=\"s2\">&quot;alias, num_steps&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`num_steps` is deprecated. Switch to `nb_iter`. &quot;</span>\n                    <span class=\"s2\">&quot;`num_steps` may be removed on or after 2019-04-15.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">num_steps</span>\n    <span class=\"k\">del</span> <span class=\"n\">num_steps</span>\n    <span class=\"k\">assert</span> <span class=\"n\">nb_iter</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Must specify exactly one of y (untargeted attack, &quot;</span>\n                       <span class=\"s2\">&quot;cause the input not to be classified as this true &quot;</span>\n                       <span class=\"s2\">&quot;label) and y_target (targeted attack, cause the &quot;</span>\n                       <span class=\"s2\">&quot;input to be classified as this target label).&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">is_targeted</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`is_targeted` is deprecated. Simply do not specify it.&quot;</span>\n                    <span class=\"s2\">&quot; It may become an error to specify it on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-15.&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"n\">is_targeted</span> <span class=\"o\">==</span> <span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n\n    <span class=\"n\">is_targeted</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">check_batch</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">([</span><span class=\"n\">check_batch</span><span class=\"p\">]):</span>\n        <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"k\">elif</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;For SPSA, input tensor x must have batch_size of 1.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">batch_size</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span>\n          <span class=\"s1\">&#39;The &quot;batch_size&quot; argument to SPSA is deprecated, and will &#39;</span>\n          <span class=\"s1\">&#39;be removed on 2019-03-17. &#39;</span>\n          <span class=\"s1\">&#39;Please use spsa_samples instead.&#39;</span><span class=\"p\">)</span>\n      <span class=\"n\">spsa_samples</span> <span class=\"o\">=</span> <span class=\"n\">batch_size</span>\n\n    <span class=\"n\">optimizer</span> <span class=\"o\">=</span> <span class=\"n\">SPSAAdam</span><span class=\"p\">(</span>\n        <span class=\"n\">lr</span><span class=\"o\">=</span><span class=\"n\">learning_rate</span><span class=\"p\">,</span>\n        <span class=\"n\">delta</span><span class=\"o\">=</span><span class=\"n\">delta</span><span class=\"p\">,</span>\n        <span class=\"n\">num_samples</span><span class=\"o\">=</span><span class=\"n\">spsa_samples</span><span class=\"p\">,</span>\n        <span class=\"n\">num_iters</span><span class=\"o\">=</span><span class=\"n\">spsa_iters</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">label</span><span class=\"p\">):</span>\n      <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">      Margin logit loss, with correct sign for targeted vs untargeted loss.</span>\n<span class=\"sd\">      &quot;&quot;&quot;</span>\n      <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n      <span class=\"n\">loss_multiplier</span> <span class=\"o\">=</span> <span class=\"mi\">1</span> <span class=\"k\">if</span> <span class=\"n\">is_targeted</span> <span class=\"k\">else</span> <span class=\"o\">-</span><span class=\"mi\">1</span>\n      <span class=\"k\">return</span> <span class=\"n\">loss_multiplier</span> <span class=\"o\">*</span> <span class=\"n\">margin_logit_loss</span><span class=\"p\">(</span>\n          <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">label</span><span class=\"p\">,</span>\n          <span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span> <span class=\"ow\">or</span> <span class=\"n\">logits</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()[</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n\n    <span class=\"n\">y_attack</span> <span class=\"o\">=</span> <span class=\"n\">y_target</span> <span class=\"k\">if</span> <span class=\"n\">is_targeted</span> <span class=\"k\">else</span> <span class=\"n\">y</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">projected_optimization</span><span class=\"p\">(</span>\n        <span class=\"n\">loss_fn</span><span class=\"p\">,</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"n\">y_attack</span><span class=\"p\">,</span>\n        <span class=\"n\">eps</span><span class=\"p\">,</span>\n        <span class=\"n\">num_steps</span><span class=\"o\">=</span><span class=\"n\">nb_iter</span><span class=\"p\">,</span>\n        <span class=\"n\">optimizer</span><span class=\"o\">=</span><span class=\"n\">optimizer</span><span class=\"p\">,</span>\n        <span class=\"n\">early_stop_loss_threshold</span><span class=\"o\">=</span><span class=\"n\">early_stop_loss_threshold</span><span class=\"p\">,</span>\n        <span class=\"n\">is_debug</span><span class=\"o\">=</span><span class=\"n\">is_debug</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"n\">clip_max</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n\n<div class=\"viewcode-block\" id=\"SPSA.generate_np\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.SPSA.generate_np\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate_np</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"s2\">&quot;epsilon&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Using deprecated argument: see `generate`&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"s2\">&quot;eps&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span>\n      <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;eps&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;epsilon&quot;</span><span class=\"p\">]</span>\n      <span class=\"k\">del</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;epsilon&quot;</span><span class=\"p\">]</span>\n    <span class=\"k\">assert</span> <span class=\"s2\">&quot;eps&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span>\n\n    <span class=\"k\">if</span> <span class=\"s2\">&quot;num_steps&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Using deprecated argument: see `generate`&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"s2\">&quot;nb_iter&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span>\n      <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;nb_iter&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;num_steps&quot;</span><span class=\"p\">]</span>\n      <span class=\"k\">del</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;num_steps&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;y&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">]</span>\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;y_target&#39;</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span> <span class=\"ow\">and</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s1\">&#39;y_target&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int64</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># Call self.generate() sequentially for each image in the batch</span>\n    <span class=\"n\">x_adv</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">x_val</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">(</span><span class=\"s1\">&#39;y&#39;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"n\">batch_size</span><span class=\"p\">)</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">),</span> <span class=\"s1\">&#39;# of images and labels should match&#39;</span>\n    <span class=\"k\">for</span> <span class=\"n\">x_single</span><span class=\"p\">,</span> <span class=\"n\">y_single</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">x_val</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">):</span>\n      <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">x_single</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"n\">adv_img</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SPSA</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">generate_np</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"n\">y_single</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n      <span class=\"n\">x_adv</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">adv_img</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">concatenate</span><span class=\"p\">(</span><span class=\"n\">x_adv</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span></div></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">_project_perturbation</span><span class=\"p\">(</span><span class=\"n\">perturbation</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                          <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Project `perturbation` onto L-infinity ball of radius `epsilon`.</span>\n<span class=\"sd\">  Also project into hypercube such that the resulting adversarial example</span>\n<span class=\"sd\">  is between clip_min and clip_max, if applicable.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;_project_perturbation currently has clipping &quot;</span>\n                              <span class=\"s2\">&quot;hard-coded in.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Ensure inputs are in the correct range</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">([</span>\n      <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                 <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n      <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                    <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))</span>\n  <span class=\"p\">]):</span>\n    <span class=\"n\">clipped_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span>\n        <span class=\"n\">perturbation</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"p\">)</span>\n    <span class=\"n\">new_image</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span>\n        <span class=\"n\">input_image</span> <span class=\"o\">+</span> <span class=\"n\">clipped_perturbation</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">new_image</span> <span class=\"o\">-</span> <span class=\"n\">input_image</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">TensorOptimizer</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Optimizer for Tensors rather than tf.Variables.</span>\n\n<span class=\"sd\">  TensorOptimizers implement optimizers where the values being optimized</span>\n<span class=\"sd\">  are ordinary Tensors, rather than Variables. TF Variables can have strange</span>\n<span class=\"sd\">  behaviors when being assigned multiple times within a single sess.run()</span>\n<span class=\"sd\">  call, particularly in Distributed TF, so this avoids thinking about those</span>\n<span class=\"sd\">  issues. These are helper classes for the `projected_optimization`</span>\n<span class=\"sd\">  method. Apart from not using Variables, they follow an interface very</span>\n<span class=\"sd\">  similar to tf.Optimizer.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_compute_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">loss_fn</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">unused_optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Compute a new value of `x` to minimize `loss_fn`.</span>\n\n<span class=\"sd\">    Args:</span>\n<span class=\"sd\">        loss_fn: a callable that takes `x`, a batch of images, and returns</span>\n<span class=\"sd\">            a batch of loss values. `x` will be optimized to minimize</span>\n<span class=\"sd\">            `loss_fn(x)`.</span>\n<span class=\"sd\">        x: A list of Tensors, the values to be updated. This is analogous</span>\n<span class=\"sd\">            to the `var_list` argument in standard TF Optimizer.</span>\n<span class=\"sd\">        unused_optim_state: A (possibly nested) dict, containing any state</span>\n<span class=\"sd\">            info needed for the optimizer.</span>\n\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">        new_x: A list of Tensors, the same length as `x`, which are updated</span>\n<span class=\"sd\">        new_optim_state: A dict, with the same structure as `optim_state`,</span>\n<span class=\"sd\">            which have been updated.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># Assumes `x` is a list,</span>\n    <span class=\"c1\"># and contains a tensor representing a batch of images</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">1</span> <span class=\"ow\">and</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"nb\">list</span><span class=\"p\">),</span> \\\n        <span class=\"s1\">&#39;x should be a list and contain only one image tensor&#39;</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_apply_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Given a gradient, make one optimization step.</span>\n\n<span class=\"sd\">    :param grads: list of tensors, same length as `x`, containing the corresponding gradients</span>\n<span class=\"sd\">    :param x: list of tensors to update</span>\n<span class=\"sd\">    :param optim_state: dict</span>\n\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">      new_x: list of tensors, updated version of `x`</span>\n<span class=\"sd\">      new_optim_state: dict, updated version of `optim_state`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;_apply_gradients should be defined in each subclass&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">minimize</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">loss_fn</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Analogous to tf.Optimizer.minimize</span>\n\n<span class=\"sd\">    :param loss_fn: tf Tensor, representing the loss to minimize</span>\n<span class=\"sd\">    :param x: list of Tensor, analogous to tf.Optimizer&#39;s var_list</span>\n<span class=\"sd\">    :param optim_state: A possibly nested dict, containing any optimizer state.</span>\n\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">      new_x: list of Tensor, updated version of `x`</span>\n<span class=\"sd\">      new_optim_state: dict, updated version of `optim_state`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">grads</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_compute_gradients</span><span class=\"p\">(</span><span class=\"n\">loss_fn</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_apply_gradients</span><span class=\"p\">(</span><span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">init_state</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Returns the initial state of the optimizer.</span>\n\n<span class=\"sd\">    Args:</span>\n<span class=\"sd\">        x: A list of Tensors, which will be optimized.</span>\n\n<span class=\"sd\">    Returns:</span>\n<span class=\"sd\">        A dictionary, representing the initial state of the optimizer.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;init_state should be defined in each subclass&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">TensorGradientDescent</span><span class=\"p\">(</span><span class=\"n\">TensorOptimizer</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Vanilla Gradient Descent TensorOptimizer.&quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">lr</span><span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_lr</span> <span class=\"o\">=</span> <span class=\"n\">lr</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">init_state</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"p\">{}</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_apply_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">):</span>\n    <span class=\"n\">new_x</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)):</span>\n      <span class=\"n\">new_x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_lr</span> <span class=\"o\">*</span> <span class=\"n\">grads</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"n\">new_x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">TensorAdam</span><span class=\"p\">(</span><span class=\"n\">TensorOptimizer</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;The Adam optimizer defined in https://arxiv.org/abs/1412.6980.&quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">lr</span><span class=\"o\">=</span><span class=\"mf\">0.001</span><span class=\"p\">,</span> <span class=\"n\">beta1</span><span class=\"o\">=</span><span class=\"mf\">0.9</span><span class=\"p\">,</span> <span class=\"n\">beta2</span><span class=\"o\">=</span><span class=\"mf\">0.999</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"o\">=</span><span class=\"mf\">1e-9</span><span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_lr</span> <span class=\"o\">=</span> <span class=\"n\">lr</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta1</span> <span class=\"o\">=</span> <span class=\"n\">beta1</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta2</span> <span class=\"o\">=</span> <span class=\"n\">beta2</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_epsilon</span> <span class=\"o\">=</span> <span class=\"n\">epsilon</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">init_state</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Initialize t, m, and u</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">optim_state</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n    <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;t&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mf\">0.</span>\n    <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;m&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros_like</span><span class=\"p\">(</span><span class=\"n\">v</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">x</span><span class=\"p\">]</span>\n    <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;u&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">zeros_like</span><span class=\"p\">(</span><span class=\"n\">v</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">x</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"n\">optim_state</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_apply_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">grads</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Refer to parent class documentation.&quot;&quot;&quot;</span>\n    <span class=\"n\">new_x</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">new_optim_state</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;t&quot;</span><span class=\"p\">:</span> <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;t&quot;</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"mf\">1.</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;m&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span>\n        <span class=\"s2\">&quot;u&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"p\">}</span>\n    <span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;t&quot;</span><span class=\"p\">]</span>\n    <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)):</span>\n      <span class=\"n\">g</span> <span class=\"o\">=</span> <span class=\"n\">grads</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span>\n      <span class=\"n\">m_old</span> <span class=\"o\">=</span> <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;m&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span>\n      <span class=\"n\">u_old</span> <span class=\"o\">=</span> <span class=\"n\">optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;u&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span>\n      <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;m&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta1</span> <span class=\"o\">*</span> <span class=\"n\">m_old</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"mf\">1.</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta1</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">g</span><span class=\"p\">)</span>\n      <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;u&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n          <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta2</span> <span class=\"o\">*</span> <span class=\"n\">u_old</span> <span class=\"o\">+</span> <span class=\"p\">(</span><span class=\"mf\">1.</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta2</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"n\">g</span> <span class=\"o\">*</span> <span class=\"n\">g</span><span class=\"p\">)</span>\n      <span class=\"n\">m_hat</span> <span class=\"o\">=</span> <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;m&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"mf\">1.</span> <span class=\"o\">-</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pow</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta1</span><span class=\"p\">,</span> <span class=\"n\">t</span><span class=\"p\">))</span>\n      <span class=\"n\">u_hat</span> <span class=\"o\">=</span> <span class=\"n\">new_optim_state</span><span class=\"p\">[</span><span class=\"s2\">&quot;u&quot;</span><span class=\"p\">][</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"mf\">1.</span> <span class=\"o\">-</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pow</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_beta2</span><span class=\"p\">,</span> <span class=\"n\">t</span><span class=\"p\">))</span>\n      <span class=\"n\">new_x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n          <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_lr</span> <span class=\"o\">*</span> <span class=\"n\">m_hat</span> <span class=\"o\">/</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">u_hat</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_epsilon</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">new_x</span><span class=\"p\">,</span> <span class=\"n\">new_optim_state</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">SPSAAdam</span><span class=\"p\">(</span><span class=\"n\">TensorAdam</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Optimizer for gradient-free attacks in https://arxiv.org/abs/1802.05666.</span>\n\n<span class=\"sd\">  Gradients estimates are computed using Simultaneous Perturbation Stochastic</span>\n<span class=\"sd\">  Approximation (SPSA), combined with the ADAM update rule.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n               <span class=\"n\">lr</span><span class=\"o\">=</span><span class=\"mf\">0.01</span><span class=\"p\">,</span>\n               <span class=\"n\">delta</span><span class=\"o\">=</span><span class=\"mf\">0.01</span><span class=\"p\">,</span>\n               <span class=\"n\">num_samples</span><span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">,</span>\n               <span class=\"n\">num_iters</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n               <span class=\"n\">compare_to_analytic_grad</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">SPSAAdam</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">lr</span><span class=\"o\">=</span><span class=\"n\">lr</span><span class=\"p\">)</span>\n    <span class=\"k\">assert</span> <span class=\"n\">num_samples</span> <span class=\"o\">%</span> <span class=\"mi\">2</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"s2\">&quot;number of samples must be even&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_delta</span> <span class=\"o\">=</span> <span class=\"n\">delta</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_samples</span> <span class=\"o\">=</span> <span class=\"n\">num_samples</span> <span class=\"o\">//</span> <span class=\"mi\">2</span>  <span class=\"c1\"># Since we mirror +/- delta later</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_iters</span> <span class=\"o\">=</span> <span class=\"n\">num_iters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_compare_to_analytic_grad</span> <span class=\"o\">=</span> <span class=\"n\">compare_to_analytic_grad</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_get_delta</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">delta</span><span class=\"p\">):</span>\n    <span class=\"n\">x_shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()</span>\n    <span class=\"n\">delta_x</span> <span class=\"o\">=</span> <span class=\"n\">delta</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span>\n            <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_samples</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">x_shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:],</span>\n            <span class=\"n\">minval</span><span class=\"o\">=-</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n            <span class=\"n\">maxval</span><span class=\"o\">=</span><span class=\"mf\">1.</span><span class=\"p\">,</span>\n            <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">delta_x</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_compute_gradients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">loss_fn</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">unused_optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Compute gradient estimates using SPSA.&quot;&quot;&quot;</span>\n    <span class=\"c1\"># Assumes `x` is a list, containing a [1, H, W, C] image</span>\n    <span class=\"c1\"># If static batch dimension is None, tf.reshape to batch size 1</span>\n    <span class=\"c1\"># so that static shape can be inferred</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">1</span>\n    <span class=\"n\">static_x_shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"n\">static_x_shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">static_x_shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n    <span class=\"k\">assert</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"mi\">1</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">x_shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">grad_array</span><span class=\"p\">):</span>\n      <span class=\"n\">delta</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_delta</span>\n      <span class=\"n\">delta_x</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_get_delta</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">delta</span><span class=\"p\">)</span>\n      <span class=\"n\">delta_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">concat</span><span class=\"p\">([</span><span class=\"n\">delta_x</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"n\">delta_x</span><span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"n\">loss_vals</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n          <span class=\"n\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">delta_x</span><span class=\"p\">),</span>\n          <span class=\"p\">[</span><span class=\"mi\">2</span> <span class=\"o\">*</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_samples</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x_shape</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n      <span class=\"n\">avg_grad</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">loss_vals</span> <span class=\"o\">*</span> <span class=\"n\">delta_x</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"n\">delta</span>\n      <span class=\"n\">avg_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">expand_dims</span><span class=\"p\">(</span><span class=\"n\">avg_grad</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n      <span class=\"n\">new_grad_array</span> <span class=\"o\">=</span> <span class=\"n\">grad_array</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">avg_grad</span><span class=\"p\">)</span>\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">new_grad_array</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">&lt;</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_iters</span>\n\n    <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">all_grads</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span>\n        <span class=\"n\">cond</span><span class=\"p\">,</span>\n        <span class=\"n\">body</span><span class=\"p\">,</span>\n        <span class=\"n\">loop_vars</span><span class=\"o\">=</span><span class=\"p\">[</span>\n            <span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">TensorArray</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_num_iters</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n        <span class=\"p\">],</span>\n        <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">avg_grad</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">all_grads</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">(),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">avg_grad</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">margin_logit_loss</span><span class=\"p\">(</span><span class=\"n\">model_logits</span><span class=\"p\">,</span> <span class=\"n\">label</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"n\">num_classes</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Computes difference between logit for `label` and next highest logit.</span>\n\n<span class=\"sd\">  The loss is high when `label` is unlikely (targeted by default).</span>\n<span class=\"sd\">  This follows the same interface as `loss_fn` for TensorOptimizer and</span>\n<span class=\"sd\">  projected_optimization, i.e. it returns a batch of loss values.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">num_classes</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`num_classes` is depreciated. Switch to `nb_classes`.&quot;</span>\n                  <span class=\"s2\">&quot; `num_classes` may be removed on or after 2019-04-23.&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">num_classes</span>\n    <span class=\"k\">del</span> <span class=\"n\">num_classes</span>\n  <span class=\"k\">if</span> <span class=\"s1\">&#39;int&#39;</span> <span class=\"ow\">in</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">label</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">):</span>\n    <span class=\"n\">logit_mask</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">one_hot</span><span class=\"p\">(</span><span class=\"n\">label</span><span class=\"p\">,</span> <span class=\"n\">depth</span><span class=\"o\">=</span><span class=\"n\">nb_classes</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">logit_mask</span> <span class=\"o\">=</span> <span class=\"n\">label</span>\n  <span class=\"k\">if</span> <span class=\"s1\">&#39;int&#39;</span> <span class=\"ow\">in</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">logit_mask</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">):</span>\n    <span class=\"n\">logit_mask</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">logit_mask</span><span class=\"p\">)</span>\n  <span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">label_logits</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">logit_mask</span> <span class=\"o\">*</span> <span class=\"n\">model_logits</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"k\">except</span> <span class=\"ne\">TypeError</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Could not take row-wise dot product between &quot;</span>\n                    <span class=\"s2\">&quot;logit mask, of dtype &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">logit_mask</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n                    <span class=\"o\">+</span> <span class=\"s2\">&quot; and model_logits, of dtype &quot;</span>\n                    <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">model_logits</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))</span>\n  <span class=\"n\">logits_with_target_label_neg_inf</span> <span class=\"o\">=</span> <span class=\"n\">model_logits</span> <span class=\"o\">-</span> <span class=\"n\">logit_mask</span> <span class=\"o\">*</span> <span class=\"mi\">99999</span>\n  <span class=\"n\">highest_nonlabel_logits</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span>\n      <span class=\"n\">logits_with_target_label_neg_inf</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">highest_nonlabel_logits</span> <span class=\"o\">-</span> <span class=\"n\">label_logits</span>\n  <span class=\"k\">return</span> <span class=\"n\">loss</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">_apply_black_border</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">border_size</span><span class=\"p\">):</span>\n  <span class=\"n\">orig_height</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n  <span class=\"n\">orig_width</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">resize_images</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">orig_width</span> <span class=\"o\">-</span> <span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">border_size</span><span class=\"p\">,</span>\n                                 <span class=\"n\">orig_height</span> <span class=\"o\">-</span> <span class=\"mi\">2</span><span class=\"o\">*</span><span class=\"n\">border_size</span><span class=\"p\">))</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pad</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">[[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">],</span>\n                    <span class=\"p\">[</span><span class=\"n\">border_size</span><span class=\"p\">,</span> <span class=\"n\">border_size</span><span class=\"p\">],</span>\n                    <span class=\"p\">[</span><span class=\"n\">border_size</span><span class=\"p\">,</span> <span class=\"n\">border_size</span><span class=\"p\">],</span>\n                    <span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]],</span> <span class=\"s1\">&#39;CONSTANT&#39;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">_apply_transformation</span><span class=\"p\">(</span><span class=\"n\">inputs</span><span class=\"p\">):</span>\n  <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">trans</span> <span class=\"o\">=</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n  <span class=\"n\">dx</span><span class=\"p\">,</span> <span class=\"n\">dy</span><span class=\"p\">,</span> <span class=\"n\">angle</span> <span class=\"o\">=</span> <span class=\"n\">trans</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">trans</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">],</span> <span class=\"n\">trans</span><span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n  <span class=\"n\">height</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">]</span>\n  <span class=\"n\">width</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n\n  <span class=\"c1\"># Pad the image to prevent two-step rotation / translation from truncating</span>\n  <span class=\"c1\"># corners</span>\n  <span class=\"n\">max_dist_from_center</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">height</span><span class=\"o\">**</span><span class=\"mi\">2</span><span class=\"o\">+</span><span class=\"n\">width</span><span class=\"o\">**</span><span class=\"mi\">2</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n  <span class=\"n\">min_edge_from_center</span> <span class=\"o\">=</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">min</span><span class=\"p\">([</span><span class=\"n\">height</span><span class=\"p\">,</span> <span class=\"n\">width</span><span class=\"p\">]))</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n  <span class=\"n\">padding</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ceil</span><span class=\"p\">(</span><span class=\"n\">max_dist_from_center</span> <span class=\"o\">-</span>\n                    <span class=\"n\">min_edge_from_center</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">astype</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pad</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">[[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">],</span>\n                 <span class=\"p\">[</span><span class=\"n\">padding</span><span class=\"p\">,</span> <span class=\"n\">padding</span><span class=\"p\">],</span>\n                 <span class=\"p\">[</span><span class=\"n\">padding</span><span class=\"p\">,</span> <span class=\"n\">padding</span><span class=\"p\">],</span>\n                 <span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">]],</span>\n             <span class=\"s1\">&#39;CONSTANT&#39;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Apply rotation</span>\n  <span class=\"n\">angle</span> <span class=\"o\">*=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">pi</span> <span class=\"o\">/</span> <span class=\"mi\">180</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tfa</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">rotate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">angle</span><span class=\"p\">,</span> <span class=\"n\">interpolation</span><span class=\"o\">=</span><span class=\"s1\">&#39;BILINEAR&#39;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Apply translation</span>\n  <span class=\"n\">dx_in_px</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">dx</span> <span class=\"o\">*</span> <span class=\"n\">height</span>\n  <span class=\"n\">dy_in_px</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">dy</span> <span class=\"o\">*</span> <span class=\"n\">width</span>\n  <span class=\"n\">translation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">convert_to_tensor</span><span class=\"p\">([</span><span class=\"n\">dx_in_px</span><span class=\"p\">,</span> <span class=\"n\">dy_in_px</span><span class=\"p\">])</span>\n\n  <span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tfa</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">translate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">translation</span><span class=\"p\">,</span> <span class=\"n\">interpolation</span><span class=\"o\">=</span><span class=\"s1\">&#39;BILINEAR&#39;</span><span class=\"p\">)</span>\n  <span class=\"k\">except</span> <span class=\"ne\">AttributeError</span> <span class=\"k\">as</span> <span class=\"n\">e</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;WARNING: SpatialAttack requires tf 1.6 or higher&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">raise</span> <span class=\"n\">e</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tfa</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">translate</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">translation</span><span class=\"p\">,</span> <span class=\"n\">interpolation</span><span class=\"o\">=</span><span class=\"s1\">&#39;BILINEAR&#39;</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"n\">resize_image_with_crop_or_pad</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">height</span><span class=\"p\">,</span> <span class=\"n\">width</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">spm</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">n_samples</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dx_min</span><span class=\"o\">=-</span><span class=\"mf\">0.1</span><span class=\"p\">,</span>\n        <span class=\"n\">dx_max</span><span class=\"o\">=</span><span class=\"mf\">0.1</span><span class=\"p\">,</span> <span class=\"n\">n_dxs</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"n\">dy_min</span><span class=\"o\">=-</span><span class=\"mf\">0.1</span><span class=\"p\">,</span> <span class=\"n\">dy_max</span><span class=\"o\">=</span><span class=\"mf\">0.1</span><span class=\"p\">,</span> <span class=\"n\">n_dys</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">,</span>\n        <span class=\"n\">angle_min</span><span class=\"o\">=-</span><span class=\"mi\">30</span><span class=\"p\">,</span> <span class=\"n\">angle_max</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">,</span> <span class=\"n\">n_angles</span><span class=\"o\">=</span><span class=\"mi\">31</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  TensorFlow implementation of the Spatial Transformation Method.</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">y</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Using model predictions as ground truth to avoid label leaking</span>\n    <span class=\"n\">preds_max</span> <span class=\"o\">=</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">to_float</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">preds</span><span class=\"p\">,</span> <span class=\"n\">preds_max</span><span class=\"p\">))</span>\n    <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span>\n    <span class=\"k\">del</span> <span class=\"n\">preds</span>\n  <span class=\"n\">y</span> <span class=\"o\">=</span> <span class=\"n\">y</span> <span class=\"o\">/</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Define the range of transformations</span>\n  <span class=\"n\">dxs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linspace</span><span class=\"p\">(</span><span class=\"n\">dx_min</span><span class=\"p\">,</span> <span class=\"n\">dx_max</span><span class=\"p\">,</span> <span class=\"n\">n_dxs</span><span class=\"p\">)</span>\n  <span class=\"n\">dys</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linspace</span><span class=\"p\">(</span><span class=\"n\">dy_min</span><span class=\"p\">,</span> <span class=\"n\">dy_max</span><span class=\"p\">,</span> <span class=\"n\">n_dys</span><span class=\"p\">)</span>\n  <span class=\"n\">angles</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">linspace</span><span class=\"p\">(</span><span class=\"n\">angle_min</span><span class=\"p\">,</span> <span class=\"n\">angle_max</span><span class=\"p\">,</span> <span class=\"n\">n_angles</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">n_samples</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"kn\">import</span> <span class=\"nn\">itertools</span>\n    <span class=\"n\">transforms</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">itertools</span><span class=\"o\">.</span><span class=\"n\">product</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"p\">[</span><span class=\"n\">dxs</span><span class=\"p\">,</span> <span class=\"n\">dys</span><span class=\"p\">,</span> <span class=\"n\">angles</span><span class=\"p\">]))</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">sampled_dxs</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">choice</span><span class=\"p\">(</span><span class=\"n\">dxs</span><span class=\"p\">,</span> <span class=\"n\">n_samples</span><span class=\"p\">)</span>\n    <span class=\"n\">sampled_dys</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">choice</span><span class=\"p\">(</span><span class=\"n\">dys</span><span class=\"p\">,</span> <span class=\"n\">n_samples</span><span class=\"p\">)</span>\n    <span class=\"n\">sampled_angles</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">choice</span><span class=\"p\">(</span><span class=\"n\">angles</span><span class=\"p\">,</span> <span class=\"n\">n_samples</span><span class=\"p\">)</span>\n    <span class=\"n\">transforms</span> <span class=\"o\">=</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">sampled_dxs</span><span class=\"p\">,</span> <span class=\"n\">sampled_dys</span><span class=\"p\">,</span> <span class=\"n\">sampled_angles</span><span class=\"p\">)</span>\n  <span class=\"n\">transformed_ims</span> <span class=\"o\">=</span> <span class=\"n\">parallel_apply_transformations</span><span class=\"p\">(</span>\n      <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">transforms</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">_compute_xent</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"n\">preds</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax_cross_entropy_with_logits_v2</span><span class=\"p\">(</span>\n        <span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">preds</span><span class=\"p\">)</span>\n\n  <span class=\"n\">all_xents</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">map_fn</span><span class=\"p\">(</span>\n      <span class=\"n\">_compute_xent</span><span class=\"p\">,</span>\n      <span class=\"n\">transformed_ims</span><span class=\"p\">,</span>\n      <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>  <span class=\"c1\"># Must be 1 to avoid keras race conditions</span>\n\n  <span class=\"c1\"># Return the adv_x with worst accuracy</span>\n\n  <span class=\"c1\"># all_xents is n_total_samples x batch_size (SB)</span>\n  <span class=\"n\">all_xents</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">(</span><span class=\"n\">all_xents</span><span class=\"p\">)</span>  <span class=\"c1\"># SB</span>\n\n  <span class=\"c1\"># We want the worst case sample, with the largest xent_loss</span>\n  <span class=\"n\">worst_sample_idx</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">all_xents</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>  <span class=\"c1\"># B</span>\n\n  <span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n  <span class=\"n\">keys</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stack</span><span class=\"p\">([</span>\n      <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">range</span><span class=\"p\">(</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">),</span>\n      <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">worst_sample_idx</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">int32</span><span class=\"p\">)</span>\n  <span class=\"p\">],</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n  <span class=\"n\">transformed_ims_bshwc</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">einsum</span><span class=\"p\">(</span><span class=\"s1\">&#39;sbhwc-&gt;bshwc&#39;</span><span class=\"p\">,</span> <span class=\"n\">transformed_ims</span><span class=\"p\">)</span>\n  <span class=\"n\">after_lookup</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gather_nd</span><span class=\"p\">(</span><span class=\"n\">transformed_ims_bshwc</span><span class=\"p\">,</span> <span class=\"n\">keys</span><span class=\"p\">)</span>  <span class=\"c1\"># BHWC</span>\n  <span class=\"k\">return</span> <span class=\"n\">after_lookup</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">parallel_apply_transformations</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">transforms</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Apply image transformations in parallel.</span>\n<span class=\"sd\">  :param transforms: TODO</span>\n<span class=\"sd\">  :param black_border_size: int, size of black border to apply</span>\n<span class=\"sd\">  Returns:</span>\n<span class=\"sd\">    Transformed images</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">transforms</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">convert_to_tensor</span><span class=\"p\">(</span><span class=\"n\">transforms</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">)</span>\n  <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">_apply_black_border</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">black_border_size</span><span class=\"p\">)</span>\n\n  <span class=\"n\">num_transforms</span> <span class=\"o\">=</span> <span class=\"n\">transforms</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n  <span class=\"n\">im_shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">as_list</span><span class=\"p\">()[</span><span class=\"mi\">1</span><span class=\"p\">:]</span>\n\n  <span class=\"c1\"># Pass a copy of x and a transformation to each iteration of the map_fn</span>\n  <span class=\"c1\"># callable</span>\n  <span class=\"n\">tiled_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span>\n      <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">tile</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">num_transforms</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">]),</span>\n      <span class=\"p\">[</span><span class=\"n\">num_transforms</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">im_shape</span><span class=\"p\">)</span>\n  <span class=\"n\">elems</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tiled_x</span><span class=\"p\">,</span> <span class=\"n\">transforms</span><span class=\"p\">]</span>\n  <span class=\"n\">transformed_ims</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">map_fn</span><span class=\"p\">(</span>\n      <span class=\"n\">_apply_transformation</span><span class=\"p\">,</span>\n      <span class=\"n\">elems</span><span class=\"p\">,</span>\n      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span>\n      <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>  <span class=\"c1\"># Must be 1 to avoid keras race conditions</span>\n  <span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">transformed_ims</span>\n\n\n<div class=\"viewcode-block\" id=\"projected_optimization\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.projected_optimization\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">projected_optimization</span><span class=\"p\">(</span><span class=\"n\">loss_fn</span><span class=\"p\">,</span>\n                           <span class=\"n\">input_image</span><span class=\"p\">,</span>\n                           <span class=\"n\">label</span><span class=\"p\">,</span>\n                           <span class=\"n\">epsilon</span><span class=\"p\">,</span>\n                           <span class=\"n\">num_steps</span><span class=\"p\">,</span>\n                           <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                           <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                           <span class=\"n\">optimizer</span><span class=\"o\">=</span><span class=\"n\">TensorAdam</span><span class=\"p\">(),</span>\n                           <span class=\"n\">project_perturbation</span><span class=\"o\">=</span><span class=\"n\">_project_perturbation</span><span class=\"p\">,</span>\n                           <span class=\"n\">early_stop_loss_threshold</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                           <span class=\"n\">is_debug</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Generic projected optimization, generalized to work with approximate</span>\n<span class=\"sd\">  gradients. Used for e.g. the SPSA attack.</span>\n\n<span class=\"sd\">  Args:</span>\n<span class=\"sd\">    :param loss_fn: A callable which takes `input_image` and `label` as</span>\n<span class=\"sd\">                    arguments, and returns a batch of loss values. Same</span>\n<span class=\"sd\">                    interface as TensorOptimizer.</span>\n<span class=\"sd\">    :param input_image: Tensor, a batch of images</span>\n<span class=\"sd\">    :param label: Tensor, a batch of labels</span>\n<span class=\"sd\">    :param epsilon: float, the L-infinity norm of the maximum allowable</span>\n<span class=\"sd\">                    perturbation</span>\n<span class=\"sd\">    :param num_steps: int, the number of steps of gradient descent</span>\n<span class=\"sd\">    :param clip_min: float, minimum pixel value</span>\n<span class=\"sd\">    :param clip_max: float, maximum pixel value</span>\n<span class=\"sd\">    :param optimizer: A `TensorOptimizer` object</span>\n<span class=\"sd\">    :param project_perturbation: A function, which will be used to enforce</span>\n<span class=\"sd\">                                 some constraint. It should have the same</span>\n<span class=\"sd\">                                 signature as `_project_perturbation`.</span>\n<span class=\"sd\">    :param early_stop_loss_threshold: A float or None. If specified, the attack will end if the loss is below</span>\n<span class=\"sd\">       `early_stop_loss_threshold`.</span>\n<span class=\"sd\">        Enabling this option can have several different effects:</span>\n<span class=\"sd\">          - Setting the threshold to 0. guarantees that if a successful attack is found, it is returned.</span>\n<span class=\"sd\">            This increases the attack success rate, because without early stopping the optimizer can accidentally</span>\n<span class=\"sd\">            bounce back to a point where the attack fails.</span>\n<span class=\"sd\">          - Early stopping can make the attack run faster because it may run for fewer steps.</span>\n<span class=\"sd\">          - Early stopping can make the attack run slower because the loss must be calculated at each step.</span>\n<span class=\"sd\">            The loss is not calculated as part of the normal SPSA optimization procedure.</span>\n<span class=\"sd\">            For most reasonable choices of hyperparameters, early stopping makes the attack much faster because</span>\n<span class=\"sd\">            it decreases the number of steps dramatically.</span>\n<span class=\"sd\">    :param is_debug: A bool. If True, print debug info for attack progress.</span>\n\n<span class=\"sd\">  Returns:</span>\n<span class=\"sd\">    adversarial version of `input_image`, with L-infinity difference less than</span>\n<span class=\"sd\">      epsilon, which tries to minimize loss_fn.</span>\n\n<span class=\"sd\">  Note that this function is not intended as an Attack by itself. Rather, it</span>\n<span class=\"sd\">  is designed as a helper function which you can use to write your own attack</span>\n<span class=\"sd\">  methods. The method uses a tf.while_loop to optimize a loss function in</span>\n<span class=\"sd\">  a single sess.run() call.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"n\">num_steps</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n  <span class=\"k\">if</span> <span class=\"n\">is_debug</span><span class=\"p\">:</span>\n    <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/cpu:0&quot;</span><span class=\"p\">):</span>\n      <span class=\"n\">input_image</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Print</span><span class=\"p\">(</span>\n          <span class=\"n\">input_image</span><span class=\"p\">,</span> <span class=\"p\">[],</span>\n          <span class=\"s2\">&quot;Starting PGD attack with epsilon: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">epsilon</span><span class=\"p\">)</span>\n\n  <span class=\"n\">init_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span>\n      <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">),</span>\n      <span class=\"n\">minval</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n      <span class=\"n\">maxval</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n      <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n  <span class=\"n\">init_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">project_perturbation</span><span class=\"p\">(</span><span class=\"n\">init_perturbation</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"p\">,</span>\n                                           <span class=\"n\">input_image</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                           <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n  <span class=\"n\">init_optim_state</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">init_state</span><span class=\"p\">([</span><span class=\"n\">init_perturbation</span><span class=\"p\">])</span>\n  <span class=\"n\">nest</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nest</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">loop_body</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">perturbation</span><span class=\"p\">,</span> <span class=\"n\">flat_optim_state</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Update perturbation to input image.&quot;&quot;&quot;</span>\n    <span class=\"n\">optim_state</span> <span class=\"o\">=</span> <span class=\"n\">nest</span><span class=\"o\">.</span><span class=\"n\">pack_sequence_as</span><span class=\"p\">(</span>\n        <span class=\"n\">structure</span><span class=\"o\">=</span><span class=\"n\">init_optim_state</span><span class=\"p\">,</span> <span class=\"n\">flat_sequence</span><span class=\"o\">=</span><span class=\"n\">flat_optim_state</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">wrapped_loss_fn</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">loss_fn</span><span class=\"p\">(</span><span class=\"n\">input_image</span> <span class=\"o\">+</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">label</span><span class=\"p\">)</span>\n\n    <span class=\"n\">new_perturbation_list</span><span class=\"p\">,</span> <span class=\"n\">new_optim_state</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span>\n        <span class=\"n\">wrapped_loss_fn</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">perturbation</span><span class=\"p\">],</span> <span class=\"n\">optim_state</span><span class=\"p\">)</span>\n    <span class=\"n\">projected_perturbation</span> <span class=\"o\">=</span> <span class=\"n\">project_perturbation</span><span class=\"p\">(</span><span class=\"n\">new_perturbation_list</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span>\n                                                  <span class=\"n\">epsilon</span><span class=\"p\">,</span> <span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                                  <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                  <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"n\">clip_max</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Be careful with this bool. A value of 0. is a valid threshold but evaluates to False, so we must explicitly</span>\n    <span class=\"c1\"># check whether the value is None.</span>\n    <span class=\"n\">early_stop</span> <span class=\"o\">=</span> <span class=\"n\">early_stop_loss_threshold</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n    <span class=\"n\">compute_loss</span> <span class=\"o\">=</span> <span class=\"n\">is_debug</span> <span class=\"ow\">or</span> <span class=\"n\">early_stop</span>\n    <span class=\"c1\"># Don&#39;t waste time building the loss graph if we&#39;re not going to use it</span>\n    <span class=\"k\">if</span> <span class=\"n\">compute_loss</span><span class=\"p\">:</span>\n      <span class=\"c1\"># NOTE: this step is not actually redundant with the optimizer step.</span>\n      <span class=\"c1\"># SPSA calculates the loss at randomly perturbed points but doesn&#39;t calculate the loss at the current point.</span>\n      <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">wrapped_loss_fn</span><span class=\"p\">(</span><span class=\"n\">projected_perturbation</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n      <span class=\"k\">if</span> <span class=\"n\">is_debug</span><span class=\"p\">:</span>\n        <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/cpu:0&quot;</span><span class=\"p\">):</span>\n          <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">Print</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">loss</span><span class=\"p\">],</span> <span class=\"s2\">&quot;Total batch loss&quot;</span><span class=\"p\">)</span>\n\n      <span class=\"k\">if</span> <span class=\"n\">early_stop</span><span class=\"p\">:</span>\n        <span class=\"n\">i</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cond</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">early_stop_loss_threshold</span><span class=\"p\">),</span>\n                    <span class=\"k\">lambda</span><span class=\"p\">:</span> <span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"n\">num_steps</span><span class=\"p\">),</span> <span class=\"k\">lambda</span><span class=\"p\">:</span> <span class=\"n\">i</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">projected_perturbation</span><span class=\"p\">,</span> <span class=\"n\">nest</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">(</span><span class=\"n\">new_optim_state</span><span class=\"p\">)</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">cond</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">_</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">num_steps</span><span class=\"p\">)</span>\n\n  <span class=\"n\">flat_init_optim_state</span> <span class=\"o\">=</span> <span class=\"n\">nest</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">(</span><span class=\"n\">init_optim_state</span><span class=\"p\">)</span>\n  <span class=\"n\">_</span><span class=\"p\">,</span> <span class=\"n\">final_perturbation</span><span class=\"p\">,</span> <span class=\"n\">_</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">while_loop</span><span class=\"p\">(</span>\n      <span class=\"n\">cond</span><span class=\"p\">,</span>\n      <span class=\"n\">loop_body</span><span class=\"p\">,</span>\n      <span class=\"n\">loop_vars</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">constant</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">),</span> <span class=\"n\">init_perturbation</span><span class=\"p\">,</span> <span class=\"n\">flat_init_optim_state</span><span class=\"p\">),</span>\n      <span class=\"n\">parallel_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n      <span class=\"n\">back_prop</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n      <span class=\"n\">maximum_iterations</span><span class=\"o\">=</span><span class=\"n\">num_steps</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">project_perturbation</span> <span class=\"ow\">is</span> <span class=\"n\">_project_perturbation</span><span class=\"p\">:</span>\n    <span class=\"c1\"># TODO: this assert looks totally wrong.</span>\n    <span class=\"c1\"># Not bothering to fix it now because it&#39;s only an assert.</span>\n    <span class=\"c1\"># 1) Multiplying by 1.1 gives a huge margin of error. This should probably</span>\n    <span class=\"c1\">#    take the difference and allow a tolerance of 1e-6 or something like</span>\n    <span class=\"c1\">#    that.</span>\n    <span class=\"c1\"># 2) I think it should probably check the *absolute value* of</span>\n    <span class=\"c1\"># final_perturbation</span>\n    <span class=\"n\">perturbation_max</span> <span class=\"o\">=</span> <span class=\"n\">epsilon</span> <span class=\"o\">*</span> <span class=\"mf\">1.1</span>\n    <span class=\"n\">check_diff</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span>\n        <span class=\"n\">final_perturbation</span><span class=\"p\">,</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">perturbation_max</span><span class=\"p\">,</span> <span class=\"n\">final_perturbation</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">),</span>\n        <span class=\"n\">message</span><span class=\"o\">=</span><span class=\"s2\">&quot;final_perturbation must change no pixel by more than &quot;</span>\n                <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">perturbation_max</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"c1\"># TODO: let caller pass in a check_diff function as well as</span>\n    <span class=\"c1\"># project_perturbation</span>\n    <span class=\"n\">check_diff</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">no_op</span><span class=\"p\">()</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;This function only supports clipping for now&quot;</span><span class=\"p\">)</span>\n  <span class=\"n\">check_range</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span>\n                                                    <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                 <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">input_image</span><span class=\"p\">,</span>\n                                               <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n                                                       <span class=\"n\">input_image</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))]</span>\n\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">([</span><span class=\"n\">check_diff</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">check_range</span><span class=\"p\">):</span>\n    <span class=\"n\">adversarial_image</span> <span class=\"o\">=</span> <span class=\"n\">input_image</span> <span class=\"o\">+</span> <span class=\"n\">final_perturbation</span>\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">adversarial_image</span><span class=\"p\">)</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/attacks/virtual_adversarial_method.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.attacks.virtual_adversarial_method &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../../\" src=\"../../../_static/documentation_options.js\"></script>\n    <script src=\"../../../_static/jquery.js\"></script>\n    <script src=\"../../../_static/underscore.js\"></script>\n    <script src=\"../../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.attacks.virtual_adversarial_method</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;The VirtualAdversarialMethod attack</span>\n\n<span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.attacks.attack</span> <span class=\"kn\">import</span> <span class=\"n\">Attack</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">Model</span><span class=\"p\">,</span> <span class=\"n\">CallableModelWrapper</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.model</span> <span class=\"kn\">import</span> <span class=\"n\">wrapper_warning_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n<span class=\"n\">tf_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"VirtualAdversarialMethod\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">VirtualAdversarialMethod</span><span class=\"p\">(</span><span class=\"n\">Attack</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This attack was originally proposed by Miyato et al. (2016) and was used</span>\n<span class=\"sd\">  for virtual adversarial training.</span>\n<span class=\"sd\">  Paper link: https://arxiv.org/abs/1507.00677</span>\n\n<span class=\"sd\">  :param model: cleverhans.model.Model</span>\n<span class=\"sd\">  :param sess: optional tf.Session</span>\n<span class=\"sd\">  :param dtypestr: dtype of the data</span>\n<span class=\"sd\">  :param kwargs: passed through to super constructor</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"s1\">&#39;float32&#39;</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Note: the model parameter should be an instance of the</span>\n<span class=\"sd\">    cleverhans.model.Model abstraction provided by CleverHans.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">Model</span><span class=\"p\">):</span>\n      <span class=\"n\">wrapper_warning_logits</span><span class=\"p\">()</span>\n      <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">VirtualAdversarialMethod</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">dtypestr</span><span class=\"p\">,</span>\n                                                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">feedable_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;eps&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;xi&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_min&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clip_max&#39;</span><span class=\"p\">)</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">structural_kwargs</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;num_iterations&#39;</span><span class=\"p\">]</span>\n\n<div class=\"viewcode-block\" id=\"VirtualAdversarialMethod.generate\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod.generate\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">generate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Generate symbolic graph for adversarial examples and return.</span>\n\n<span class=\"sd\">    :param x: The model&#39;s symbolic inputs.</span>\n<span class=\"sd\">    :param kwargs: See `parse_params`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Parse and save attack-specific parameters</span>\n    <span class=\"k\">assert</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">parse_params</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">vatm</span><span class=\"p\">(</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">,</span>\n        <span class=\"n\">x</span><span class=\"p\">,</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span>\n        <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span><span class=\"p\">,</span>\n        <span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_iterations</span><span class=\"p\">,</span>\n        <span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">xi</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span><span class=\"p\">,</span>\n        <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"VirtualAdversarialMethod.parse_params\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod.parse_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">parse_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                   <span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"mf\">2.0</span><span class=\"p\">,</span>\n                   <span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"mf\">1e-6</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Take in a dictionary of parameters and applies attack-specific checks</span>\n<span class=\"sd\">    before saving them as attributes.</span>\n\n<span class=\"sd\">    Attack-specific parameters:</span>\n\n<span class=\"sd\">    :param eps: (optional float )the epsilon (input variation parameter)</span>\n<span class=\"sd\">    :param nb_iter: (optional) the number of iterations</span>\n<span class=\"sd\">      Defaults to 1 if not specified</span>\n<span class=\"sd\">    :param xi: (optional float) the finite difference parameter</span>\n<span class=\"sd\">    :param clip_min: (optional float) Minimum input component value</span>\n<span class=\"sd\">    :param clip_max: (optional float) Maximum input component value</span>\n<span class=\"sd\">    :param num_iterations: Deprecated alias for `nb_iter`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"c1\"># Save attack-specific parameters</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">eps</span>\n    <span class=\"k\">if</span> <span class=\"n\">num_iterations</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`num_iterations` is deprecated. Switch to `nb_iter`.&quot;</span>\n                    <span class=\"s2\">&quot; The old name will be removed on or after 2019-04-26.&quot;</span><span class=\"p\">)</span>\n      <span class=\"c1\"># Note: when we remove the deprecated alias, we can put the default</span>\n      <span class=\"c1\"># value of 1 for nb_iter back in the method signature</span>\n      <span class=\"k\">assert</span> <span class=\"n\">nb_iter</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span>\n      <span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"n\">num_iterations</span>\n    <span class=\"k\">del</span> <span class=\"n\">num_iterations</span>\n    <span class=\"k\">if</span> <span class=\"n\">nb_iter</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">nb_iter</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_iterations</span> <span class=\"o\">=</span> <span class=\"n\">nb_iter</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">xi</span> <span class=\"o\">=</span> <span class=\"n\">xi</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_min</span> <span class=\"o\">=</span> <span class=\"n\">clip_min</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">clip_max</span> <span class=\"o\">=</span> <span class=\"n\">clip_max</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">keys</span><span class=\"p\">())</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;kwargs is unused and will be removed on or after &quot;</span>\n                    <span class=\"s2\">&quot;2019-04-26.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span></div></div>\n\n\n<div class=\"viewcode-block\" id=\"vatm\"><a class=\"viewcode-back\" href=\"../../../source/attacks.html#cleverhans.attacks.vatm\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">vatm</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">,</span>\n         <span class=\"n\">x</span><span class=\"p\">,</span>\n         <span class=\"n\">logits</span><span class=\"p\">,</span>\n         <span class=\"n\">eps</span><span class=\"p\">,</span>\n         <span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n         <span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"mf\">1e-6</span><span class=\"p\">,</span>\n         <span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n         <span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n         <span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Tensorflow implementation of the perturbation method used for virtual</span>\n<span class=\"sd\">  adversarial training: https://arxiv.org/abs/1507.00677</span>\n<span class=\"sd\">  :param model: the model which returns the network unnormalized logits</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param logits: the model&#39;s unnormalized output tensor (the input to</span>\n<span class=\"sd\">                 the softmax layer)</span>\n<span class=\"sd\">  :param eps: the epsilon (input variation parameter)</span>\n<span class=\"sd\">  :param num_iterations: the number of iterations</span>\n<span class=\"sd\">  :param xi: the finite difference parameter</span>\n<span class=\"sd\">  :param clip_min: optional parameter that can be used to set a minimum</span>\n<span class=\"sd\">                  value for components of the example returned</span>\n<span class=\"sd\">  :param clip_max: optional parameter that can be used to set a maximum</span>\n<span class=\"sd\">                  value for components of the example returned</span>\n<span class=\"sd\">  :param seed: the seed for random generator</span>\n<span class=\"sd\">  :return: a tensor for the adversarial example</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">name_scope</span><span class=\"p\">(</span><span class=\"n\">scope</span><span class=\"p\">,</span> <span class=\"s2\">&quot;virtual_adversarial_perturbation&quot;</span><span class=\"p\">):</span>\n    <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_normal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf_dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">_</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">num_iterations</span><span class=\"p\">):</span>\n      <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"n\">xi</span> <span class=\"o\">*</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">l2_batch_normalize</span><span class=\"p\">(</span><span class=\"n\">d</span><span class=\"p\">)</span>\n      <span class=\"n\">logits_d</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">d</span><span class=\"p\">)</span>\n      <span class=\"n\">kl</span> <span class=\"o\">=</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">kl_with_logits</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">logits_d</span><span class=\"p\">)</span>\n      <span class=\"n\">Hd</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">kl</span><span class=\"p\">,</span> <span class=\"n\">d</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n      <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">Hd</span><span class=\"p\">)</span>\n    <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"n\">eps</span> <span class=\"o\">*</span> <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">l2_batch_normalize</span><span class=\"p\">(</span><span class=\"n\">d</span><span class=\"p\">)</span>\n    <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"n\">d</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">clip_min</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">and</span> <span class=\"p\">(</span><span class=\"n\">clip_max</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">):</span>\n      <span class=\"n\">adv_x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">adv_x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">adv_x</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/compat.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.compat &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../\" src=\"../../_static/documentation_options.js\"></script>\n    <script src=\"../../_static/jquery.js\"></script>\n    <script src=\"../../_static/underscore.js\"></script>\n    <script src=\"../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.compat</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">Wrapper functions for writing code that is compatible with many versions</span>\n<span class=\"sd\">of TensorFlow.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n<span class=\"c1\"># The following 2 imports are not used in this module. They are imported so that users of cleverhans.compat can</span>\n<span class=\"c1\"># get access to device_lib, app, and flags. A pylint bug makes these imports cause errors when using python3+tf1.8.</span>\n<span class=\"c1\"># Doing the sanitized import here once makes it possible to do &quot;from cleverhans.compat import flags&quot; throughout the</span>\n<span class=\"c1\"># library without needing to repeat the pylint boilerplate.</span>\n<span class=\"kn\">from</span> <span class=\"nn\">tensorflow.python.client</span> <span class=\"kn\">import</span> <span class=\"n\">device_lib</span> <span class=\"c1\"># pylint: disable=no-name-in-module,unused-import</span>\n<span class=\"kn\">from</span> <span class=\"nn\">tensorflow.python.platform</span> <span class=\"kn\">import</span> <span class=\"n\">app</span><span class=\"p\">,</span> <span class=\"n\">flags</span> <span class=\"c1\"># pylint: disable=no-name-in-module,unused-import</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">_wrap</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wraps a callable `f` in a function that warns that the function is deprecated.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"nf\">wrapper</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Issues a deprecation warning and passes through the arguments.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; is deprecated. Switch to calling the equivalent function in tensorflow. &quot;</span>\n                  <span class=\"s2\">&quot; This function was originally needed as a compatibility layer for old versions of tensorflow, &quot;</span>\n                  <span class=\"s2\">&quot; but support for those versions has now been dropped.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">f</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">wrapper</span>\n\n<span class=\"n\">reduce_sum</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_max</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_min</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_min</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_mean</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_mean</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_prod</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_prod</span><span class=\"p\">)</span>\n<span class=\"n\">reduce_any</span> <span class=\"o\">=</span> <span class=\"n\">_wrap</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_any</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">reduce_function</span><span class=\"p\">(</span><span class=\"n\">op_func</span><span class=\"p\">,</span> <span class=\"n\">input_tensor</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">reduction_indices</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  This function used to be needed to support tf 1.4 and early, but support for tf 1.4 and earlier is now dropped.</span>\n<span class=\"sd\">  :param op_func: expects the function to handle eg: tf.reduce_sum.</span>\n<span class=\"sd\">  :param input_tensor: The tensor to reduce. Should have numeric type.</span>\n<span class=\"sd\">  :param axis: The dimensions to reduce. If None (the default),</span>\n<span class=\"sd\">          reduces all dimensions. Must be in the range</span>\n<span class=\"sd\">          [-rank(input_tensor), rank(input_tensor)).</span>\n<span class=\"sd\">  :param keepdims: If true, retains reduced dimensions with length 1.</span>\n<span class=\"sd\">  :param name: A name for the operation (optional).</span>\n<span class=\"sd\">  :param reduction_indices: The old (deprecated) name for axis.</span>\n<span class=\"sd\">  :return: outputs same value as op_func.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;`reduce_function` is deprecated and may be removed on or after 2019-09-08.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"n\">op_func</span><span class=\"p\">(</span><span class=\"n\">input_tensor</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"n\">axis</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"n\">keepdims</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">reduction_indices</span><span class=\"o\">=</span><span class=\"n\">reduction_indices</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">out</span>\n\n<div class=\"viewcode-block\" id=\"softmax_cross_entropy_with_logits\"><a class=\"viewcode-back\" href=\"../../source/attacks.html#cleverhans.attacks.softmax_cross_entropy_with_logits\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span><span class=\"n\">sentinel</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                                      <span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                                      <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                                      <span class=\"n\">dim</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle</span>\n<span class=\"sd\">  deprecated warning</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"c1\"># Make sure that all arguments were passed as named arguments.</span>\n  <span class=\"k\">if</span> <span class=\"n\">sentinel</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;softmax_cross_entropy_with_logits&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Only call `</span><span class=\"si\">%s</span><span class=\"s2\">` with &quot;</span>\n                     <span class=\"s2\">&quot;named arguments (labels=..., logits=..., ...)&quot;</span>\n                     <span class=\"o\">%</span> <span class=\"n\">name</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">labels</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"n\">logits</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Both labels and logits must be provided.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax_cross_entropy_with_logits_v2</span>\n  <span class=\"k\">except</span> <span class=\"ne\">AttributeError</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">RuntimeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;This version of TensorFlow is no longer supported. See cleverhans/README.md&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"n\">labels</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">stop_gradient</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"p\">)</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">f</span><span class=\"p\">(</span><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">labels</span><span class=\"p\">,</span> <span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">dim</span><span class=\"o\">=</span><span class=\"n\">dim</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">loss</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/model.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.model &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../\" src=\"../../_static/documentation_options.js\"></script>\n    <script src=\"../../_static/jquery.js\"></script>\n    <script src=\"../../_static/underscore.js\"></script>\n    <script src=\"../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.model</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">The Model class and related functionality.</span>\n<span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"kn\">from</span> <span class=\"nn\">abc</span> <span class=\"kn\">import</span> <span class=\"n\">ABCMeta</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans</span> <span class=\"kn\">import</span> <span class=\"n\">utils_tf</span>\n\n\n<div class=\"viewcode-block\" id=\"Model\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">Model</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  An abstract interface for model wrappers that exposes model symbols</span>\n<span class=\"sd\">  needed for making an attack. This abstraction removes the dependency on</span>\n<span class=\"sd\">  any specific neural network package (e.g. Keras) from the core</span>\n<span class=\"sd\">  code of CleverHans. It can also simplify exposing the hidden features of a</span>\n<span class=\"sd\">  model when a specific package does not directly expose them.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">__metaclass__</span> <span class=\"o\">=</span> <span class=\"n\">ABCMeta</span>\n  <span class=\"n\">O_LOGITS</span><span class=\"p\">,</span> <span class=\"n\">O_PROBS</span><span class=\"p\">,</span> <span class=\"n\">O_FEATURES</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;logits probs features&#39;</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">()</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">hparams</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">needs_dummy_fprop</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Constructor.</span>\n<span class=\"sd\">    :param scope: str, the name of model.</span>\n<span class=\"sd\">    :param nb_classes: integer, the number of classes.</span>\n<span class=\"sd\">    :param hparams: dict, hyper-parameters for the model.</span>\n<span class=\"sd\">    :needs_dummy_fprop: bool, if True the model&#39;s parameters are not</span>\n<span class=\"sd\">        created until fprop is called.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">scope</span> <span class=\"o\">=</span> <span class=\"n\">scope</span> <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"vm\">__class__</span><span class=\"o\">.</span><span class=\"vm\">__name__</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">nb_classes</span> <span class=\"o\">=</span> <span class=\"n\">nb_classes</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">hparams</span> <span class=\"o\">=</span> <span class=\"n\">hparams</span> <span class=\"ow\">or</span> <span class=\"p\">{}</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">needs_dummy_fprop</span> <span class=\"o\">=</span> <span class=\"n\">needs_dummy_fprop</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__call__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    For compatibility with functions used as model definitions (taking</span>\n<span class=\"sd\">    an input tensor and returning the tensor giving the output</span>\n<span class=\"sd\">    of the model on that input).</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Model.__call__ is deprecated. &quot;</span>\n                  <span class=\"s2\">&quot;The call is ambiguous as to whether the output should &quot;</span>\n                  <span class=\"s2\">&quot;be logits or probabilities, and getting the wrong one &quot;</span>\n                  <span class=\"s2\">&quot;can cause serious problems. &quot;</span>\n                  <span class=\"s2\">&quot;The output actually is probabilities, which are a very &quot;</span>\n                  <span class=\"s2\">&quot;dangerous thing to use as part of any interface for &quot;</span>\n                  <span class=\"s2\">&quot;cleverhans, because softmax probabilities are prone &quot;</span>\n                  <span class=\"s2\">&quot;to gradient masking.&quot;</span>\n                  <span class=\"s2\">&quot;On or after 2019-04-24, this method will change to raise &quot;</span>\n                  <span class=\"s2\">&quot;an exception explaining why Model.__call__ should not be &quot;</span>\n                  <span class=\"s2\">&quot;used.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_probs</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n<div class=\"viewcode-block\" id=\"Model.get_logits\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_logits\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_logits</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param x: A symbolic representation (Tensor) of the network input</span>\n<span class=\"sd\">    :return: A symbolic representation (Tensor) of the output logits</span>\n<span class=\"sd\">    (i.e., the values fed as inputs to the softmax layer).</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">outputs</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span> <span class=\"ow\">in</span> <span class=\"n\">outputs</span><span class=\"p\">:</span>\n      <span class=\"k\">return</span> <span class=\"n\">outputs</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span><span class=\"p\">]</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;must implement `get_logits`&quot;</span>\n                              <span class=\"s2\">&quot; or must define a &quot;</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span> <span class=\"o\">+</span>\n                              <span class=\"s2\">&quot; output in `fprop`&quot;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_predicted_class\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_predicted_class\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_predicted_class</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param x: A symbolic representation (Tensor) of the network input</span>\n<span class=\"sd\">    :return: A symbolic representation (Tensor) of the predicted label</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_logits</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_probs\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_probs\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_probs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    :param x: A symbolic representation (Tensor) of the network input</span>\n<span class=\"sd\">    :return: A symbolic representation (Tensor) of the output</span>\n<span class=\"sd\">    probabilities (i.e., the output values produced by the softmax layer).</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_PROBS</span> <span class=\"ow\">in</span> <span class=\"n\">d</span><span class=\"p\">:</span>\n      <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">d</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_PROBS</span><span class=\"p\">]</span>\n      <span class=\"n\">min_prob</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_min</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"n\">max_prob</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">min_prob</span><span class=\"p\">,</span>\n                                               <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">,</span> <span class=\"n\">min_prob</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                 <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">max_prob</span><span class=\"p\">,</span>\n                                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">1.</span><span class=\"p\">,</span> <span class=\"n\">min_prob</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))]</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"k\">return</span> <span class=\"n\">output</span>\n    <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span> <span class=\"ow\">in</span> <span class=\"n\">d</span><span class=\"p\">:</span>\n      <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">d</span><span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">O_LOGITS</span><span class=\"p\">])</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s1\">&#39;Cannot find probs or logits.&#39;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.fprop\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.fprop\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">fprop</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Forward propagation to compute the model outputs.</span>\n<span class=\"sd\">    :param x: A symbolic representation of the network input</span>\n<span class=\"sd\">    :return: A dictionary mapping layer names to the symbolic</span>\n<span class=\"sd\">             representation of their output.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s1\">&#39;`fprop` not implemented.&#39;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_params\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Provides access to the model&#39;s parameters.</span>\n<span class=\"sd\">    :return: A list of all Variables defining the model parameters.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"s1\">&#39;params&#39;</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">params</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Catch eager execution and assert function overload.</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">executing_eagerly</span><span class=\"p\">():</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"s2\">&quot;For Eager execution - get_params &quot;</span>\n                                  <span class=\"s2\">&quot;must be overridden.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"ne\">AttributeError</span><span class=\"p\">:</span>\n      <span class=\"k\">pass</span>\n\n    <span class=\"c1\"># For graph-based execution</span>\n    <span class=\"n\">scope_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">get_collection</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">GraphKeys</span><span class=\"o\">.</span><span class=\"n\">TRAINABLE_VARIABLES</span><span class=\"p\">,</span>\n                                   <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">scope</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;/&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">make_params</span><span class=\"p\">()</span>\n      <span class=\"n\">scope_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">get_collection</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">GraphKeys</span><span class=\"o\">.</span><span class=\"n\">TRAINABLE_VARIABLES</span><span class=\"p\">,</span>\n                                     <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">scope</span> <span class=\"o\">+</span> <span class=\"s2\">&quot;/&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span>\n\n    <span class=\"c1\"># Make sure no parameters have been added or removed</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"s2\">&quot;num_params&quot;</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_params</span> <span class=\"o\">!=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">):</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Scope: &quot;</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">scope</span><span class=\"p\">)</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Expected &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_params</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; variables&quot;</span><span class=\"p\">)</span>\n        <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Got &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">)))</span>\n        <span class=\"k\">for</span> <span class=\"n\">var</span> <span class=\"ow\">in</span> <span class=\"n\">scope_vars</span><span class=\"p\">:</span>\n          <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"se\">\\t</span><span class=\"s2\">&quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">))</span>\n        <span class=\"k\">assert</span> <span class=\"kc\">False</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">num_params</span> <span class=\"o\">=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">scope_vars</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">scope_vars</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.make_params\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.make_params\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">make_params</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Create all Variables to be returned later by get_params.</span>\n<span class=\"sd\">    By default this is a no-op.</span>\n<span class=\"sd\">    Models that need their fprop to be called for their params to be</span>\n<span class=\"sd\">    created can set `needs_dummy_fprop=True` in the constructor.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">needs_dummy_fprop</span><span class=\"p\">:</span>\n      <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"s2\">&quot;_dummy_input&quot;</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_dummy_input</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">make_input_placeholder</span><span class=\"p\">()</span>\n      <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_dummy_input</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_layer_names\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_layer_names\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_layer_names</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Return the list of exposed layers for this model.&quot;&quot;&quot;</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.get_layer\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.get_layer\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">get_layer</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">layer</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Return a layer output.</span>\n<span class=\"sd\">    :param x: tensor, the input to the network.</span>\n<span class=\"sd\">    :param layer: str, the name of the layer to compute.</span>\n<span class=\"sd\">    :param **kwargs: dict, extra optional params to pass to self.fprop.</span>\n<span class=\"sd\">    :return: the content of layer `layer`</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)[</span><span class=\"n\">layer</span><span class=\"p\">]</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.make_input_placeholder\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.make_input_placeholder\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">make_input_placeholder</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Create and return a placeholder representing an input to the model.</span>\n\n<span class=\"sd\">    This method should respect context managers (e.g. &quot;with tf.device&quot;)</span>\n<span class=\"sd\">    and should not just return a reference to a single pre-created</span>\n<span class=\"sd\">    placeholder.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; does not implement &quot;</span>\n                              <span class=\"s2\">&quot;make_input_placeholder&quot;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"Model.make_label_placeholder\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.Model.make_label_placeholder\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">make_label_placeholder</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Create and return a placeholder representing class labels.</span>\n\n<span class=\"sd\">    This method should respect context managers (e.g. &quot;with tf.device&quot;)</span>\n<span class=\"sd\">    and should not just return a reference to a single pre-created</span>\n<span class=\"sd\">    placeholder.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">raise</span> <span class=\"ne\">NotImplementedError</span><span class=\"p\">(</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; does not implement &quot;</span>\n                              <span class=\"s2\">&quot;make_label_placeholder&quot;</span><span class=\"p\">)</span></div>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__hash__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"nb\">hash</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">))</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__eq__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">other</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span> <span class=\"ow\">is</span> <span class=\"n\">other</span></div>\n\n\n<div class=\"viewcode-block\" id=\"CallableModelWrapper\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.CallableModelWrapper\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">CallableModelWrapper</span><span class=\"p\">(</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;A wrapper that turns a callable into a valid Model&quot;&quot;&quot;</span>\n\n  <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">callable_fn</span><span class=\"p\">,</span> <span class=\"n\">output_layer</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Wrap a callable function that takes a tensor as input and returns</span>\n<span class=\"sd\">    a tensor as output with the given layer name.</span>\n<span class=\"sd\">    :param callable_fn: The callable function taking a tensor and</span>\n<span class=\"sd\">                        returning a given layer as output.</span>\n<span class=\"sd\">    :param output_layer: A string of the output layer returned by the</span>\n<span class=\"sd\">                         function. (Usually either &quot;probs&quot; or &quot;logits&quot;.)</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">CallableModelWrapper</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">()</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_layer</span> <span class=\"o\">=</span> <span class=\"n\">output_layer</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">callable_fn</span> <span class=\"o\">=</span> <span class=\"n\">callable_fn</span>\n\n<div class=\"viewcode-block\" id=\"CallableModelWrapper.fprop\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.CallableModelWrapper.fprop\">[docs]</a>  <span class=\"k\">def</span> <span class=\"nf\">fprop</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">callable_fn</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Do some sanity checking to reduce the chance that probs are used</span>\n    <span class=\"c1\"># as logits accidentally or vice versa</span>\n    <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_layer</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;probs&#39;</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"n\">output</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;Softmax&quot;</span>\n      <span class=\"n\">min_prob</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_min</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"n\">max_prob</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n      <span class=\"n\">asserts</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"n\">min_prob</span><span class=\"p\">,</span>\n                                               <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">0.</span><span class=\"p\">,</span> <span class=\"n\">min_prob</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                 <span class=\"n\">utils_tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"n\">max_prob</span><span class=\"p\">,</span>\n                                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mf\">1.</span><span class=\"p\">,</span> <span class=\"n\">max_prob</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))]</span>\n      <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">asserts</span><span class=\"p\">):</span>\n        <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">identity</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n    <span class=\"k\">elif</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_layer</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;logits&#39;</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"n\">output</span><span class=\"o\">.</span><span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;Softmax&#39;</span>\n\n    <span class=\"k\">return</span> <span class=\"p\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">output_layer</span><span class=\"p\">:</span> <span class=\"n\">output</span><span class=\"p\">}</span></div></div>\n\n<div class=\"viewcode-block\" id=\"wrapper_warning\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.wrapper_warning\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">wrapper_warning</span><span class=\"p\">():</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Issue a deprecation warning. Used in multiple places that implemented</span>\n<span class=\"sd\">  attacks by automatically wrapping a user-supplied callable with a</span>\n<span class=\"sd\">  CallableModelWrapper with output_layer=&quot;probs&quot;.</span>\n<span class=\"sd\">  Using &quot;probs&quot; as any part of the attack interface is dangerous.</span>\n<span class=\"sd\">  We can&#39;t just change output_layer to logits because:</span>\n<span class=\"sd\">  - that would be a silent interface change. We&#39;d have no way of detecting</span>\n<span class=\"sd\">    code that still means to use probs. Note that we can&#39;t just check whether</span>\n<span class=\"sd\">    the final output op is a softmax---for example, Inception puts a reshape</span>\n<span class=\"sd\">    after the softmax.</span>\n<span class=\"sd\">  - automatically wrapping user-supplied callables with output_layer=&#39;logits&#39;</span>\n<span class=\"sd\">    is even worse, see `wrapper_warning_logits`</span>\n<span class=\"sd\">  Note: this function will be removed at the same time as the code that</span>\n<span class=\"sd\">  calls it.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Passing a callable is deprecated, because using&quot;</span>\n                <span class=\"s2\">&quot; probabilities is dangerous. It has a high risk &quot;</span>\n                <span class=\"s2\">&quot; of causing gradient masking due to loss of precision &quot;</span>\n                <span class=\"s2\">&quot; in the softmax op. Passing a callable rather than a &quot;</span>\n                <span class=\"s2\">&quot; Model subclass will become an error on or after &quot;</span>\n                <span class=\"s2\">&quot; 2019-04-24.&quot;</span><span class=\"p\">)</span></div>\n\n<div class=\"viewcode-block\" id=\"wrapper_warning_logits\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.wrapper_warning_logits\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">wrapper_warning_logits</span><span class=\"p\">():</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Issue a deprecation warning. Used in multiple places that implemented</span>\n<span class=\"sd\">  attacks by automatically wrapping a user-supplied callable with a</span>\n<span class=\"sd\">  CallableModelWrapper with output_layer=&quot;logits&quot;.</span>\n<span class=\"sd\">  This is dangerous because it is under-the-hood automagic that the user</span>\n<span class=\"sd\">  may not realize has been invoked for them. If they pass a callable</span>\n<span class=\"sd\">  that actually outputs probs, the probs will be treated as logits,</span>\n<span class=\"sd\">  resulting in an incorrect cross-entropy loss and severe gradient</span>\n<span class=\"sd\">  masking.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Passing a callable is deprecated, because it runs the &quot;</span>\n                <span class=\"s2\">&quot;risk of accidentally using probabilities in the place &quot;</span>\n                <span class=\"s2\">&quot;of logits. Please switch to passing a Model subclass &quot;</span>\n                <span class=\"s2\">&quot;so that you clearly specify which values are the logits. &quot;</span>\n                <span class=\"s2\">&quot;Passing a callable rather than a Model subclass will become &quot;</span>\n                <span class=\"s2\">&quot;an error on or after 2019-04-24.&quot;</span><span class=\"p\">)</span></div>\n\n\n<div class=\"viewcode-block\" id=\"NoSuchLayerError\"><a class=\"viewcode-back\" href=\"../../source/model.html#cleverhans.attacks.NoSuchLayerError\">[docs]</a><span class=\"k\">class</span> <span class=\"nc\">NoSuchLayerError</span><span class=\"p\">(</span><span class=\"ne\">ValueError</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Raised when a layer that does not exist is requested.&quot;&quot;&quot;</span></div>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/cleverhans/utils_tf.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>cleverhans.utils_tf &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../../\" src=\"../../_static/documentation_options.js\"></script>\n    <script src=\"../../_static/jquery.js\"></script>\n    <script src=\"../../_static/underscore.js\"></script>\n    <script src=\"../../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>Source code for cleverhans.utils_tf</h1><div class=\"highlight\"><pre>\n<span></span><span class=\"sd\">&quot;&quot;&quot;Utility functions for writing TensorFlow code&quot;&quot;&quot;</span>\n<span class=\"kn\">from</span> <span class=\"nn\">__future__</span> <span class=\"kn\">import</span> <span class=\"n\">absolute_import</span>\n<span class=\"kn\">from</span> <span class=\"nn\">__future__</span> <span class=\"kn\">import</span> <span class=\"n\">division</span>\n<span class=\"kn\">from</span> <span class=\"nn\">__future__</span> <span class=\"kn\">import</span> <span class=\"n\">print_function</span>\n<span class=\"kn\">from</span> <span class=\"nn\">__future__</span> <span class=\"kn\">import</span> <span class=\"n\">unicode_literals</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">logging</span>\n<span class=\"kn\">import</span> <span class=\"nn\">math</span>\n<span class=\"kn\">import</span> <span class=\"nn\">os</span>\n<span class=\"kn\">import</span> <span class=\"nn\">time</span>\n<span class=\"kn\">import</span> <span class=\"nn\">warnings</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span>\n<span class=\"kn\">import</span> <span class=\"nn\">six</span>\n<span class=\"kn\">from</span> <span class=\"nn\">six.moves</span> <span class=\"kn\">import</span> <span class=\"n\">xrange</span>\n<span class=\"kn\">import</span> <span class=\"nn\">tensorflow</span> <span class=\"k\">as</span> <span class=\"nn\">tf</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">device_lib</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_sum</span><span class=\"p\">,</span> <span class=\"n\">reduce_mean</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">reduce_max</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.compat</span> <span class=\"kn\">import</span> <span class=\"n\">softmax_cross_entropy_with_logits</span>\n<span class=\"kn\">from</span> <span class=\"nn\">cleverhans.utils</span> <span class=\"kn\">import</span> <span class=\"n\">batch_indices</span><span class=\"p\">,</span> <span class=\"n\">_ArgsWrapper</span><span class=\"p\">,</span> <span class=\"n\">create_logger</span>\n\n<span class=\"n\">_logger</span> <span class=\"o\">=</span> <span class=\"n\">create_logger</span><span class=\"p\">(</span><span class=\"s2\">&quot;cleverhans.utils.tf&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">setLevel</span><span class=\"p\">(</span><span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">INFO</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">model_loss</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">mean</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Define loss of TF graph</span>\n<span class=\"sd\">  :param y: correct labels</span>\n<span class=\"sd\">  :param model: output of the model</span>\n<span class=\"sd\">  :param mean: boolean indicating whether should return mean of loss</span>\n<span class=\"sd\">               or vector of losses for each input of the batch</span>\n<span class=\"sd\">  :return: return mean of loss if True, otherwise return vector with per</span>\n<span class=\"sd\">           sample loss</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;This function is deprecated and will be removed on or after&quot;</span>\n                <span class=\"s2\">&quot; 2019-04-05. Switch to cleverhans.train.train.&quot;</span><span class=\"p\">)</span>\n  <span class=\"n\">op</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">op</span>\n  <span class=\"k\">if</span> <span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;Softmax&quot;</span><span class=\"p\">:</span>\n    <span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">op</span><span class=\"o\">.</span><span class=\"n\">inputs</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">logits</span> <span class=\"o\">=</span> <span class=\"n\">model</span>\n\n  <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"n\">softmax_cross_entropy_with_logits</span><span class=\"p\">(</span><span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"n\">logits</span><span class=\"p\">,</span> <span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"n\">y</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">mean</span><span class=\"p\">:</span>\n    <span class=\"n\">out</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">out</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">out</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">initialize_uninitialized_global_variables</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Only initializes the variables of a TensorFlow session that were not</span>\n<span class=\"sd\">  already initialized.</span>\n<span class=\"sd\">  :param sess: the TensorFlow session</span>\n<span class=\"sd\">  :return:</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"c1\"># List all global variables</span>\n  <span class=\"n\">global_vars</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables</span><span class=\"p\">()</span>\n\n  <span class=\"c1\"># Find initialized status for all variables</span>\n  <span class=\"n\">is_var_init</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">is_variable_initialized</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">var</span> <span class=\"ow\">in</span> <span class=\"n\">global_vars</span><span class=\"p\">]</span>\n  <span class=\"n\">is_initialized</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">is_var_init</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># List all variables that were not initialized previously</span>\n  <span class=\"n\">not_initialized_vars</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">var</span> <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">,</span> <span class=\"n\">init</span><span class=\"p\">)</span> <span class=\"ow\">in</span>\n                          <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">global_vars</span><span class=\"p\">,</span> <span class=\"n\">is_initialized</span><span class=\"p\">)</span> <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">init</span><span class=\"p\">]</span>\n\n  <span class=\"c1\"># Initialize all uninitialized variables found, if any</span>\n  <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">not_initialized_vars</span><span class=\"p\">):</span>\n    <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">variables_initializer</span><span class=\"p\">(</span><span class=\"n\">not_initialized_vars</span><span class=\"p\">))</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">train</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">X_train</span><span class=\"p\">,</span> <span class=\"n\">Y_train</span><span class=\"p\">,</span> <span class=\"n\">save</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n          <span class=\"n\">init_all</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"n\">evaluate</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n          <span class=\"n\">rng</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">fprop_args</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">optimizer</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Train a TF graph.</span>\n<span class=\"sd\">  This function is deprecated. Prefer cleverhans.train.train when possible.</span>\n<span class=\"sd\">  cleverhans.train.train supports multiple GPUs but this function is still</span>\n<span class=\"sd\">  needed to support legacy models that do not support calling fprop more</span>\n<span class=\"sd\">  than once.</span>\n\n<span class=\"sd\">  :param sess: TF session to use when training the graph</span>\n<span class=\"sd\">  :param loss: tensor, the model training loss.</span>\n<span class=\"sd\">  :param x: input placeholder</span>\n<span class=\"sd\">  :param y: output placeholder (for labels)</span>\n<span class=\"sd\">  :param X_train: numpy array with training inputs</span>\n<span class=\"sd\">  :param Y_train: numpy array with training outputs</span>\n<span class=\"sd\">  :param save: boolean controlling the save operation</span>\n<span class=\"sd\">  :param init_all: (boolean) If set to true, all TF variables in the session</span>\n<span class=\"sd\">                   are (re)initialized, otherwise only previously</span>\n<span class=\"sd\">                   uninitialized variables are initialized before training.</span>\n<span class=\"sd\">  :param evaluate: function that is run after each training iteration</span>\n<span class=\"sd\">                   (typically to display the test/validation accuracy).</span>\n<span class=\"sd\">  :param feed: An optional dictionary that is appended to the feeding</span>\n<span class=\"sd\">               dictionary before the session runs. Can be used to feed</span>\n<span class=\"sd\">               the learning phase of a Keras model for instance.</span>\n<span class=\"sd\">  :param args: dict or argparse `Namespace` object.</span>\n<span class=\"sd\">               Should contain `nb_epochs`, `learning_rate`,</span>\n<span class=\"sd\">               `batch_size`</span>\n<span class=\"sd\">               If save is True, should also contain &#39;train_dir&#39;</span>\n<span class=\"sd\">               and &#39;filename&#39;</span>\n<span class=\"sd\">  :param rng: Instance of numpy.random.RandomState</span>\n<span class=\"sd\">  :param var_list: Optional list of parameters to train.</span>\n<span class=\"sd\">  :param fprop_args: dict, extra arguments to pass to fprop (loss and model).</span>\n<span class=\"sd\">  :param optimizer: Optimizer to be used for training</span>\n<span class=\"sd\">  :return: True if model trained</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;This function is deprecated and will be removed on or after&quot;</span>\n                <span class=\"s2\">&quot; 2019-04-05. Switch to cleverhans.train.train.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"n\">_ArgsWrapper</span><span class=\"p\">(</span><span class=\"n\">args</span> <span class=\"ow\">or</span> <span class=\"p\">{})</span>\n  <span class=\"n\">fprop_args</span> <span class=\"o\">=</span> <span class=\"n\">fprop_args</span> <span class=\"ow\">or</span> <span class=\"p\">{}</span>\n\n  <span class=\"c1\"># Check that necessary arguments were given (see doc above)</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">nb_epochs</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Number of epochs was not given in args dict&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">optimizer</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"s2\">&quot;Learning rate was not given &quot;</span>\n                                            <span class=\"s2\">&quot;in args dict&quot;</span><span class=\"p\">)</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Batch size was not given in args dict&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">save</span><span class=\"p\">:</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">train_dir</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Directory for save was not given in args dict&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Filename for save was not given in args dict&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">rng</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">rng</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">RandomState</span><span class=\"p\">()</span>\n\n  <span class=\"c1\"># Define optimizer</span>\n  <span class=\"n\">loss_value</span> <span class=\"o\">=</span> <span class=\"n\">loss</span><span class=\"o\">.</span><span class=\"n\">fprop</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">fprop_args</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">optimizer</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">optimizer</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">AdamOptimizer</span><span class=\"p\">(</span><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">optimizer</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">Optimizer</span><span class=\"p\">):</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;optimizer object must be from a child class of &quot;</span>\n                       <span class=\"s2\">&quot;tf.train.Optimizer&quot;</span><span class=\"p\">)</span>\n  <span class=\"c1\"># Trigger update operations within the default graph (such as batch_norm).</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">control_dependencies</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">get_collection</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">GraphKeys</span><span class=\"o\">.</span><span class=\"n\">UPDATE_OPS</span><span class=\"p\">)):</span>\n    <span class=\"n\">train_step</span> <span class=\"o\">=</span> <span class=\"n\">optimizer</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span><span class=\"n\">loss_value</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"n\">var_list</span><span class=\"p\">)</span>\n\n  <span class=\"k\">with</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">as_default</span><span class=\"p\">():</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"p\">,</span> <span class=\"s2\">&quot;global_variables_initializer&quot;</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"n\">init_all</span><span class=\"p\">:</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables_initializer</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">()</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">initialize_uninitialized_global_variables</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Update your copy of tensorflow; future versions of &quot;</span>\n                    <span class=\"s2\">&quot;CleverHans may drop support for this version.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">initialize_all_variables</span><span class=\"p\">())</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">epoch</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">nb_epochs</span><span class=\"p\">):</span>\n      <span class=\"c1\"># Compute number of batches</span>\n      <span class=\"n\">nb_batches</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">ceil</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">))</span> <span class=\"o\">/</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">))</span>\n      <span class=\"k\">assert</span> <span class=\"n\">nb_batches</span> <span class=\"o\">*</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Indices to shuffle training set</span>\n      <span class=\"n\">index_shuf</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)))</span>\n      <span class=\"n\">rng</span><span class=\"o\">.</span><span class=\"n\">shuffle</span><span class=\"p\">(</span><span class=\"n\">index_shuf</span><span class=\"p\">)</span>\n\n      <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n      <span class=\"k\">for</span> <span class=\"n\">batch</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">nb_batches</span><span class=\"p\">):</span>\n\n        <span class=\"c1\"># Compute batch start and end indices</span>\n        <span class=\"n\">start</span><span class=\"p\">,</span> <span class=\"n\">end</span> <span class=\"o\">=</span> <span class=\"n\">batch_indices</span><span class=\"p\">(</span>\n            <span class=\"n\">batch</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">),</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Perform one training step</span>\n        <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">X_train</span><span class=\"p\">[</span><span class=\"n\">index_shuf</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]],</span>\n                     <span class=\"n\">y</span><span class=\"p\">:</span> <span class=\"n\">Y_train</span><span class=\"p\">[</span><span class=\"n\">index_shuf</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]]}</span>\n        <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n          <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n        <span class=\"n\">train_step</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"n\">feed_dict</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"n\">end</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)</span>  <span class=\"c1\"># Check that all examples were used</span>\n      <span class=\"n\">cur</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Epoch &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">epoch</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; took &quot;</span> <span class=\"o\">+</span>\n                   <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">cur</span> <span class=\"o\">-</span> <span class=\"n\">prev</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; seconds&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">evaluate</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">evaluate</span><span class=\"p\">()</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">save</span><span class=\"p\">:</span>\n      <span class=\"n\">save_path</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">train_dir</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">)</span>\n      <span class=\"n\">saver</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">Saver</span><span class=\"p\">()</span>\n      <span class=\"n\">saver</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">save_path</span><span class=\"p\">)</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Completed model training and saved at: &quot;</span> <span class=\"o\">+</span>\n                   <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">save_path</span><span class=\"p\">))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Completed model training.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">model_eval</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">X_test</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">Y_test</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n               <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Compute the accuracy of a TF model on some data</span>\n<span class=\"sd\">  :param sess: TF session to use</span>\n<span class=\"sd\">  :param x: input placeholder</span>\n<span class=\"sd\">  :param y: output placeholder (for labels)</span>\n<span class=\"sd\">  :param predictions: model output predictions</span>\n<span class=\"sd\">  :param X_test: numpy array with training inputs</span>\n<span class=\"sd\">  :param Y_test: numpy array with training outputs</span>\n<span class=\"sd\">  :param feed: An optional dictionary that is appended to the feeding</span>\n<span class=\"sd\">           dictionary before the session runs. Can be used to feed</span>\n<span class=\"sd\">           the learning phase of a Keras model for instance.</span>\n<span class=\"sd\">  :param args: dict or argparse `Namespace` object.</span>\n<span class=\"sd\">               Should contain `batch_size`</span>\n<span class=\"sd\">  :return: a float with the accuracy value</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">global</span> <span class=\"n\">_model_eval_cache</span>\n  <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"n\">_ArgsWrapper</span><span class=\"p\">(</span><span class=\"n\">args</span> <span class=\"ow\">or</span> <span class=\"p\">{})</span>\n\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Batch size was not given in args dict&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">X_test</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span> <span class=\"ow\">or</span> <span class=\"n\">Y_test</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;X_test argument and Y_test argument &quot;</span>\n                     <span class=\"s2\">&quot;must be supplied.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Define accuracy symbolically</span>\n  <span class=\"n\">key</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">key</span> <span class=\"ow\">in</span> <span class=\"n\">_model_eval_cache</span><span class=\"p\">:</span>\n    <span class=\"n\">correct_preds</span> <span class=\"o\">=</span> <span class=\"n\">_model_eval_cache</span><span class=\"p\">[</span><span class=\"n\">key</span><span class=\"p\">]</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">correct_preds</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">equal</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n                             <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n    <span class=\"n\">_model_eval_cache</span><span class=\"p\">[</span><span class=\"n\">key</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">correct_preds</span>\n\n  <span class=\"c1\"># Init result var</span>\n  <span class=\"n\">accuracy</span> <span class=\"o\">=</span> <span class=\"mf\">0.0</span>\n\n  <span class=\"k\">with</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">as_default</span><span class=\"p\">():</span>\n    <span class=\"c1\"># Compute number of batches</span>\n    <span class=\"n\">nb_batches</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">ceil</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">))</span> <span class=\"o\">/</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">))</span>\n    <span class=\"k\">assert</span> <span class=\"n\">nb_batches</span> <span class=\"o\">*</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">)</span>\n\n    <span class=\"n\">X_cur</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,)</span> <span class=\"o\">+</span> <span class=\"n\">X_test</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:],</span>\n                     <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">X_test</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">Y_cur</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">zeros</span><span class=\"p\">((</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,)</span> <span class=\"o\">+</span> <span class=\"n\">Y_test</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:],</span>\n                     <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">Y_test</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">batch</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">nb_batches</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"n\">batch</span> <span class=\"o\">%</span> <span class=\"mi\">100</span> <span class=\"o\">==</span> <span class=\"mi\">0</span> <span class=\"ow\">and</span> <span class=\"n\">batch</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n        <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;Batch &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">batch</span><span class=\"p\">))</span>\n\n      <span class=\"c1\"># Must not use the `batch_indices` function here, because it</span>\n      <span class=\"c1\"># repeats some examples.</span>\n      <span class=\"c1\"># It&#39;s acceptable to repeat during training, but not eval.</span>\n      <span class=\"n\">start</span> <span class=\"o\">=</span> <span class=\"n\">batch</span> <span class=\"o\">*</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span>\n      <span class=\"n\">end</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">),</span> <span class=\"n\">start</span> <span class=\"o\">+</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># The last batch may be smaller than all others. This should not</span>\n      <span class=\"c1\"># affect the accuarcy disproportionately.</span>\n      <span class=\"n\">cur_batch_size</span> <span class=\"o\">=</span> <span class=\"n\">end</span> <span class=\"o\">-</span> <span class=\"n\">start</span>\n      <span class=\"n\">X_cur</span><span class=\"p\">[:</span><span class=\"n\">cur_batch_size</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">X_test</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]</span>\n      <span class=\"n\">Y_cur</span><span class=\"p\">[:</span><span class=\"n\">cur_batch_size</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">Y_test</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]</span>\n      <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">X_cur</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">:</span> <span class=\"n\">Y_cur</span><span class=\"p\">}</span>\n      <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n      <span class=\"n\">cur_corr_preds</span> <span class=\"o\">=</span> <span class=\"n\">correct_preds</span><span class=\"o\">.</span><span class=\"n\">eval</span><span class=\"p\">(</span><span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"n\">feed_dict</span><span class=\"p\">)</span>\n\n      <span class=\"n\">accuracy</span> <span class=\"o\">+=</span> <span class=\"n\">cur_corr_preds</span><span class=\"p\">[:</span><span class=\"n\">cur_batch_size</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">sum</span><span class=\"p\">()</span>\n\n    <span class=\"k\">assert</span> <span class=\"n\">end</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Divide by number of examples to get final value</span>\n    <span class=\"n\">accuracy</span> <span class=\"o\">/=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_test</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">accuracy</span>\n\n<span class=\"n\">_model_eval_cache</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">tf_model_load</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">file_path</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n\n<span class=\"sd\">  :param sess: the session object to restore</span>\n<span class=\"sd\">  :param file_path: path to the restored session, if None is</span>\n<span class=\"sd\">                    taken from FLAGS.train_dir and FLAGS.filename</span>\n<span class=\"sd\">  :return:</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">as_default</span><span class=\"p\">():</span>\n    <span class=\"n\">saver</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">Saver</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"n\">file_path</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">error</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;file_path argument is missing.&#39;</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"n\">error</span><span class=\"p\">)</span>\n    <span class=\"n\">saver</span><span class=\"o\">.</span><span class=\"n\">restore</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">file_path</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">batch_eval</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper around deprecated function.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"c1\"># Inside function to avoid circular import</span>\n  <span class=\"kn\">from</span> <span class=\"nn\">cleverhans.evaluation</span> <span class=\"kn\">import</span> <span class=\"n\">batch_eval</span> <span class=\"k\">as</span> <span class=\"n\">new_batch_eval</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;batch_eval has moved to cleverhans.evaluation. &quot;</span>\n                <span class=\"s2\">&quot;batch_eval will be removed from utils_tf on or after &quot;</span>\n                <span class=\"s2\">&quot;2019-03-09.&quot;</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">new_batch_eval</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">model_argmax</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">samples</span><span class=\"p\">,</span> <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function that computes the current class prediction</span>\n<span class=\"sd\">  :param sess: TF session</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param predictions: the model&#39;s symbolic output</span>\n<span class=\"sd\">  :param samples: numpy array with input samples (dims must match x)</span>\n<span class=\"sd\">  :param feed: An optional dictionary that is appended to the feeding</span>\n<span class=\"sd\">           dictionary before the session runs. Can be used to feed</span>\n<span class=\"sd\">           the learning phase of a Keras model for instance.</span>\n<span class=\"sd\">  :return: the argmax output of predictions, i.e. the current predicted class</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">samples</span><span class=\"p\">}</span>\n  <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n  <span class=\"n\">probabilities</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">feed_dict</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">samples</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">probabilities</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">return</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">probabilities</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">l2_batch_normalize</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">epsilon</span><span class=\"o\">=</span><span class=\"mf\">1e-12</span><span class=\"p\">,</span> <span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to normalize a batch of vectors.</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param epsilon: stabilizes division</span>\n<span class=\"sd\">  :return: the batch of l2 normalized vector</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">name_scope</span><span class=\"p\">(</span><span class=\"n\">scope</span><span class=\"p\">,</span> <span class=\"s2\">&quot;l2_batch_normalize&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">name_scope</span><span class=\"p\">:</span>\n    <span class=\"n\">x_shape</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">contrib</span><span class=\"o\">.</span><span class=\"n\">layers</span><span class=\"o\">.</span><span class=\"n\">flatten</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">x</span> <span class=\"o\">/=</span> <span class=\"p\">(</span><span class=\"n\">epsilon</span> <span class=\"o\">+</span> <span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n    <span class=\"n\">square_sum</span> <span class=\"o\">=</span> <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"n\">x_inv_norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">rsqrt</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">epsilon</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">square_sum</span><span class=\"p\">)</span>\n    <span class=\"n\">x_norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">multiply</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">x_inv_norm</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">x_norm</span><span class=\"p\">,</span> <span class=\"n\">x_shape</span><span class=\"p\">,</span> <span class=\"n\">name_scope</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">kl_with_logits</span><span class=\"p\">(</span><span class=\"n\">p_logits</span><span class=\"p\">,</span> <span class=\"n\">q_logits</span><span class=\"p\">,</span> <span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                   <span class=\"n\">loss_collection</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">GraphKeys</span><span class=\"o\">.</span><span class=\"n\">REGULARIZATION_LOSSES</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;Helper function to compute kl-divergence KL(p || q)</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">name_scope</span><span class=\"p\">(</span><span class=\"n\">scope</span><span class=\"p\">,</span> <span class=\"s2\">&quot;kl_divergence&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">name</span><span class=\"p\">:</span>\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">softmax</span><span class=\"p\">(</span><span class=\"n\">p_logits</span><span class=\"p\">)</span>\n    <span class=\"n\">p_log</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">log_softmax</span><span class=\"p\">(</span><span class=\"n\">p_logits</span><span class=\"p\">)</span>\n    <span class=\"n\">q_log</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">log_softmax</span><span class=\"p\">(</span><span class=\"n\">q_logits</span><span class=\"p\">)</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">reduce_mean</span><span class=\"p\">(</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">p</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">p_log</span> <span class=\"o\">-</span> <span class=\"n\">q_log</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n                       <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">)</span>\n    <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">losses</span><span class=\"o\">.</span><span class=\"n\">add_loss</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">loss_collection</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">loss</span>\n\n\n<div class=\"viewcode-block\" id=\"clip_eta\"><a class=\"viewcode-back\" href=\"../../source/attacks.html#cleverhans.attacks.clip_eta\">[docs]</a><span class=\"k\">def</span> <span class=\"nf\">clip_eta</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to clip the perturbation to epsilon norm ball.</span>\n<span class=\"sd\">  :param eta: A tensor with the current perturbation.</span>\n<span class=\"sd\">  :param ord: Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">              Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">  :param eps: Epsilon, bound of the perturbation.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"c1\"># Clipping perturbation eta to self.ord norm ball</span>\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s1\">&#39;ord must be np.inf, 1, or 2.&#39;</span><span class=\"p\">)</span>\n  <span class=\"n\">reduc_ind</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())))</span>\n  <span class=\"n\">avoid_zero_div</span> <span class=\"o\">=</span> <span class=\"mf\">1e-12</span>\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">:</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">)</span>\n  <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Implements a projection algorithm onto the l1-ball from</span>\n    <span class=\"c1\"># (Duchi et al. 2008) that runs in time O(d*log(d)) where d is the</span>\n    <span class=\"c1\"># input dimension.</span>\n    <span class=\"c1\"># Paper link (Duchi et al. 2008): https://dl.acm.org/citation.cfm?id=1390191</span>\n\n    <span class=\"n\">eps</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">dim</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_prod</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n    <span class=\"n\">eta_flat</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">dim</span><span class=\"p\">))</span>\n    <span class=\"n\">abs_eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">eta_flat</span><span class=\"p\">)</span>\n\n    <span class=\"k\">if</span> <span class=\"s1\">&#39;sort&#39;</span> <span class=\"ow\">in</span> <span class=\"nb\">dir</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"p\">):</span>\n      <span class=\"n\">mu</span> <span class=\"o\">=</span> <span class=\"o\">-</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">abs_eta</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"c1\"># `tf.sort` is only available in TF 1.13 onwards</span>\n      <span class=\"n\">mu</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">nn</span><span class=\"o\">.</span><span class=\"n\">top_k</span><span class=\"p\">(</span><span class=\"n\">abs_eta</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"o\">=</span><span class=\"n\">dim</span><span class=\"p\">,</span> <span class=\"nb\">sorted</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n    <span class=\"n\">cumsums</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cumsum</span><span class=\"p\">(</span><span class=\"n\">mu</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">js</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">divide</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">range</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">dim</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)),</span> <span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"n\">t</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater</span><span class=\"p\">(</span><span class=\"n\">mu</span> <span class=\"o\">-</span> <span class=\"n\">js</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">cumsums</span> <span class=\"o\">-</span> <span class=\"n\">eps</span><span class=\"p\">),</span> <span class=\"mi\">0</span><span class=\"p\">),</span> <span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n\n    <span class=\"n\">rho</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">argmax</span><span class=\"p\">(</span><span class=\"n\">t</span> <span class=\"o\">*</span> <span class=\"n\">cumsums</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">rho_val</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_max</span><span class=\"p\">(</span><span class=\"n\">t</span> <span class=\"o\">*</span> <span class=\"n\">cumsums</span><span class=\"p\">,</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">theta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">divide</span><span class=\"p\">(</span><span class=\"n\">rho_val</span> <span class=\"o\">-</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"o\">+</span> <span class=\"n\">rho</span><span class=\"p\">,</span> <span class=\"n\">eta</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">))</span>\n\n    <span class=\"n\">eta_sgn</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">eta_flat</span><span class=\"p\">)</span>\n    <span class=\"n\">eta_proj</span> <span class=\"o\">=</span> <span class=\"n\">eta_sgn</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">abs_eta</span> <span class=\"o\">-</span> <span class=\"n\">theta</span><span class=\"p\">[:,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">newaxis</span><span class=\"p\">],</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"n\">eta_proj</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">eta_proj</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">))</span>\n\n    <span class=\"n\">norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">),</span> <span class=\"n\">reduc_ind</span><span class=\"p\">)</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">where</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater</span><span class=\"p\">(</span><span class=\"n\">norm</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">),</span> <span class=\"n\">eta_proj</span><span class=\"p\">,</span> <span class=\"n\">eta</span><span class=\"p\">)</span>\n\n  <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n    <span class=\"c1\"># avoid_zero_div must go inside sqrt to avoid a divide by zero</span>\n    <span class=\"c1\"># in the gradient through this operation</span>\n    <span class=\"n\">norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">maximum</span><span class=\"p\">(</span><span class=\"n\">avoid_zero_div</span><span class=\"p\">,</span>\n                              <span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">eta</span><span class=\"p\">),</span>\n                                         <span class=\"n\">reduc_ind</span><span class=\"p\">,</span>\n                                         <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)))</span>\n    <span class=\"c1\"># We must *clip* to within the norm ball, not *normalize* onto the</span>\n    <span class=\"c1\"># surface of the ball</span>\n    <span class=\"n\">factor</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">minimum</span><span class=\"p\">(</span><span class=\"mf\">1.</span><span class=\"p\">,</span> <span class=\"n\">div</span><span class=\"p\">(</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">norm</span><span class=\"p\">))</span>\n    <span class=\"n\">eta</span> <span class=\"o\">=</span> <span class=\"n\">eta</span> <span class=\"o\">*</span> <span class=\"n\">factor</span>\n  <span class=\"k\">return</span> <span class=\"n\">eta</span></div>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">zero_out_clipped_grads</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">clip_max</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to erase entries in the gradient where the update would be</span>\n<span class=\"sd\">  clipped.</span>\n<span class=\"sd\">  :param grad: The gradient</span>\n<span class=\"sd\">  :param x: The current input</span>\n<span class=\"sd\">  :param clip_min: Minimum input component value</span>\n<span class=\"sd\">  :param clip_max: Maximum input component value</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">signed_grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">)</span>\n\n  <span class=\"c1\"># Find input components that lie at the boundary of the input range, and</span>\n  <span class=\"c1\"># where the gradient points in the wrong direction.</span>\n  <span class=\"n\">clip_low</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">logical_and</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_min</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                            <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">less</span><span class=\"p\">(</span><span class=\"n\">signed_grad</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n  <span class=\"n\">clip_high</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">logical_and</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater_equal</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip_max</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)),</span>\n                             <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">greater</span><span class=\"p\">(</span><span class=\"n\">signed_grad</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">))</span>\n  <span class=\"n\">clip</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">logical_or</span><span class=\"p\">(</span><span class=\"n\">clip_low</span><span class=\"p\">,</span> <span class=\"n\">clip_high</span><span class=\"p\">)</span>\n  <span class=\"n\">grad</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">where</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"p\">,</span> <span class=\"n\">mul</span><span class=\"p\">(</span><span class=\"n\">grad</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">),</span> <span class=\"n\">grad</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">grad</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">random_exponential</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">rate</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to sample from the exponential distribution, which is not</span>\n<span class=\"sd\">  included in core TensorFlow.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_gamma</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">alpha</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">beta</span><span class=\"o\">=</span><span class=\"mf\">1.</span> <span class=\"o\">/</span> <span class=\"n\">rate</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">random_laplace</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">loc</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"n\">scale</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to sample from the Laplace distribution, which is not</span>\n<span class=\"sd\">  included in core TensorFlow.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">z1</span> <span class=\"o\">=</span> <span class=\"n\">random_exponential</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">loc</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n  <span class=\"n\">z2</span> <span class=\"o\">=</span> <span class=\"n\">random_exponential</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"n\">scale</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">z1</span> <span class=\"o\">-</span> <span class=\"n\">z2</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">random_lp_vector</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"nb\">ord</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Helper function to generate uniformly random vectors from a norm ball of</span>\n<span class=\"sd\">  radius epsilon.</span>\n<span class=\"sd\">  :param shape: Output shape of the random sample. The shape is expected to be</span>\n<span class=\"sd\">                of the form `(n, d1, d2, ..., dn)` where `n` is the number of</span>\n<span class=\"sd\">                i.i.d. samples that will be drawn from a norm ball of dimension</span>\n<span class=\"sd\">                `d1*d1*...*dn`.</span>\n<span class=\"sd\">  :param ord: Order of the norm (mimics Numpy).</span>\n<span class=\"sd\">              Possible values: np.inf, 1 or 2.</span>\n<span class=\"sd\">  :param eps: Epsilon, radius of the norm ball.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"p\">[</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">]:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s1\">&#39;ord must be np.inf, 1, or 2.&#39;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">inf</span><span class=\"p\">:</span>\n    <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_uniform</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">eps</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n\n    <span class=\"c1\"># For ord=1 and ord=2, we use the generic technique from</span>\n    <span class=\"c1\"># (Calafiore et al. 1998) to sample uniformly from a norm ball.</span>\n    <span class=\"c1\"># Paper link (Calafiore et al. 1998):</span>\n    <span class=\"c1\"># https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=758215&amp;tag=1</span>\n    <span class=\"c1\"># We first sample from the surface of the norm ball, and then scale by</span>\n    <span class=\"c1\"># a factor `w^(1/d)` where `w~U[0,1]` is a standard uniform random variable</span>\n    <span class=\"c1\"># and `d` is the dimension of the ball. In high dimensions, this is roughly</span>\n    <span class=\"c1\"># equivalent to sampling from the surface of the ball.</span>\n\n    <span class=\"n\">dim</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_prod</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">:])</span>\n\n    <span class=\"k\">if</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n      <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">random_laplace</span><span class=\"p\">((</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">dim</span><span class=\"p\">),</span> <span class=\"n\">loc</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span> <span class=\"n\">scale</span><span class=\"o\">=</span><span class=\"mf\">1.0</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span>\n                         <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n      <span class=\"n\">norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">abs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">elif</span> <span class=\"nb\">ord</span> <span class=\"o\">==</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n      <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random_normal</span><span class=\"p\">((</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"n\">dim</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">)</span>\n      <span class=\"n\">norm</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sqrt</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reduce_sum</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">square</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span> <span class=\"n\">axis</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">keepdims</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s1\">&#39;ord must be np.inf, 1, or 2.&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"n\">w</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">pow</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">uniform</span><span class=\"p\">((</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">],</span> <span class=\"mi\">1</span><span class=\"p\">),</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">dtype</span><span class=\"p\">,</span> <span class=\"n\">seed</span><span class=\"o\">=</span><span class=\"n\">seed</span><span class=\"p\">),</span>\n               <span class=\"mf\">1.0</span> <span class=\"o\">/</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">dim</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"p\">))</span>\n    <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">eps</span> <span class=\"o\">*</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">reshape</span><span class=\"p\">(</span><span class=\"n\">w</span> <span class=\"o\">*</span> <span class=\"n\">x</span> <span class=\"o\">/</span> <span class=\"n\">norm</span><span class=\"p\">,</span> <span class=\"n\">shape</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">r</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">model_train</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">X_train</span><span class=\"p\">,</span> <span class=\"n\">Y_train</span><span class=\"p\">,</span> <span class=\"n\">save</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                <span class=\"n\">predictions_adv</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">init_all</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">evaluate</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span>\n                <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">rng</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Train a TF graph</span>\n<span class=\"sd\">  :param sess: TF session to use when training the graph</span>\n<span class=\"sd\">  :param x: input placeholder</span>\n<span class=\"sd\">  :param y: output placeholder (for labels)</span>\n<span class=\"sd\">  :param predictions: model output predictions</span>\n<span class=\"sd\">  :param X_train: numpy array with training inputs</span>\n<span class=\"sd\">  :param Y_train: numpy array with training outputs</span>\n<span class=\"sd\">  :param save: boolean controlling the save operation</span>\n<span class=\"sd\">  :param predictions_adv: if set with the adversarial example tensor,</span>\n<span class=\"sd\">                          will run adversarial training</span>\n<span class=\"sd\">  :param init_all: (boolean) If set to true, all TF variables in the session</span>\n<span class=\"sd\">                   are (re)initialized, otherwise only previously</span>\n<span class=\"sd\">                   uninitialized variables are initialized before training.</span>\n<span class=\"sd\">  :param evaluate: function that is run after each training iteration</span>\n<span class=\"sd\">                   (typically to display the test/validation accuracy).</span>\n<span class=\"sd\">  :param feed: An optional dictionary that is appended to the feeding</span>\n<span class=\"sd\">               dictionary before the session runs. Can be used to feed</span>\n<span class=\"sd\">               the learning phase of a Keras model for instance.</span>\n<span class=\"sd\">  :param args: dict or argparse `Namespace` object.</span>\n<span class=\"sd\">               Should contain `nb_epochs`, `learning_rate`,</span>\n<span class=\"sd\">               `batch_size`</span>\n<span class=\"sd\">               If save is True, should also contain &#39;train_dir&#39;</span>\n<span class=\"sd\">               and &#39;filename&#39;</span>\n<span class=\"sd\">  :param rng: Instance of numpy.random.RandomState</span>\n<span class=\"sd\">  :param var_list: Optional list of parameters to train.</span>\n<span class=\"sd\">  :return: True if model trained</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;This function is deprecated and will be removed on or after&quot;</span>\n                <span class=\"s2\">&quot; 2019-04-05. Switch to cleverhans.train.train.&quot;</span><span class=\"p\">)</span>\n  <span class=\"n\">args</span> <span class=\"o\">=</span> <span class=\"n\">_ArgsWrapper</span><span class=\"p\">(</span><span class=\"n\">args</span> <span class=\"ow\">or</span> <span class=\"p\">{})</span>\n\n  <span class=\"c1\"># Check that necessary arguments were given (see doc above)</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">nb_epochs</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Number of epochs was not given in args dict&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Learning rate was not given in args dict&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Batch size was not given in args dict&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">save</span><span class=\"p\">:</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">train_dir</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Directory for save was not given in args dict&quot;</span>\n    <span class=\"k\">assert</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Filename for save was not given in args dict&quot;</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">rng</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">rng</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">RandomState</span><span class=\"p\">()</span>\n\n  <span class=\"c1\"># Define loss</span>\n  <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"n\">model_loss</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions</span><span class=\"p\">)</span>\n  <span class=\"k\">if</span> <span class=\"n\">predictions_adv</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">loss</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">loss</span> <span class=\"o\">+</span> <span class=\"n\">model_loss</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span> <span class=\"n\">predictions_adv</span><span class=\"p\">))</span> <span class=\"o\">/</span> <span class=\"mi\">2</span>\n\n  <span class=\"n\">train_step</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">AdamOptimizer</span><span class=\"p\">(</span><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">learning_rate</span><span class=\"p\">)</span>\n  <span class=\"n\">train_step</span> <span class=\"o\">=</span> <span class=\"n\">train_step</span><span class=\"o\">.</span><span class=\"n\">minimize</span><span class=\"p\">(</span><span class=\"n\">loss</span><span class=\"p\">,</span> <span class=\"n\">var_list</span><span class=\"o\">=</span><span class=\"n\">var_list</span><span class=\"p\">)</span>\n\n  <span class=\"k\">with</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">as_default</span><span class=\"p\">():</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"p\">,</span> <span class=\"s2\">&quot;global_variables_initializer&quot;</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"n\">init_all</span><span class=\"p\">:</span>\n        <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">global_variables_initializer</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">()</span>\n      <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">initialize_uninitialized_global_variables</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;Update your copy of tensorflow; future versions of &quot;</span>\n                    <span class=\"s2\">&quot;CleverHans may drop support for this version.&quot;</span><span class=\"p\">)</span>\n      <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">initialize_all_variables</span><span class=\"p\">())</span>\n\n    <span class=\"k\">for</span> <span class=\"n\">epoch</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">nb_epochs</span><span class=\"p\">):</span>\n      <span class=\"c1\"># Compute number of batches</span>\n      <span class=\"n\">nb_batches</span> <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span><span class=\"n\">math</span><span class=\"o\">.</span><span class=\"n\">ceil</span><span class=\"p\">(</span><span class=\"nb\">float</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">))</span> <span class=\"o\">/</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">))</span>\n      <span class=\"k\">assert</span> <span class=\"n\">nb_batches</span> <span class=\"o\">*</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)</span>\n\n      <span class=\"c1\"># Indices to shuffle training set</span>\n      <span class=\"n\">index_shuf</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)))</span>\n      <span class=\"n\">rng</span><span class=\"o\">.</span><span class=\"n\">shuffle</span><span class=\"p\">(</span><span class=\"n\">index_shuf</span><span class=\"p\">)</span>\n\n      <span class=\"n\">prev</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n      <span class=\"k\">for</span> <span class=\"n\">batch</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">nb_batches</span><span class=\"p\">):</span>\n\n        <span class=\"c1\"># Compute batch start and end indices</span>\n        <span class=\"n\">start</span><span class=\"p\">,</span> <span class=\"n\">end</span> <span class=\"o\">=</span> <span class=\"n\">batch_indices</span><span class=\"p\">(</span>\n            <span class=\"n\">batch</span><span class=\"p\">,</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">),</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">batch_size</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Perform one training step</span>\n        <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">X_train</span><span class=\"p\">[</span><span class=\"n\">index_shuf</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]],</span>\n                     <span class=\"n\">y</span><span class=\"p\">:</span> <span class=\"n\">Y_train</span><span class=\"p\">[</span><span class=\"n\">index_shuf</span><span class=\"p\">[</span><span class=\"n\">start</span><span class=\"p\">:</span><span class=\"n\">end</span><span class=\"p\">]]}</span>\n        <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n          <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n        <span class=\"n\">train_step</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"n\">feed_dict</span><span class=\"p\">)</span>\n      <span class=\"k\">assert</span> <span class=\"n\">end</span> <span class=\"o\">&gt;=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_train</span><span class=\"p\">)</span>  <span class=\"c1\"># Check that all examples were used</span>\n      <span class=\"n\">cur</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Epoch &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">epoch</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; took &quot;</span> <span class=\"o\">+</span>\n                   <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">cur</span> <span class=\"o\">-</span> <span class=\"n\">prev</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; seconds&quot;</span><span class=\"p\">)</span>\n      <span class=\"k\">if</span> <span class=\"n\">evaluate</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">evaluate</span><span class=\"p\">()</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">save</span><span class=\"p\">:</span>\n      <span class=\"n\">save_path</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">train_dir</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">)</span>\n      <span class=\"n\">saver</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">train</span><span class=\"o\">.</span><span class=\"n\">Saver</span><span class=\"p\">()</span>\n      <span class=\"n\">saver</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span> <span class=\"n\">save_path</span><span class=\"p\">)</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Completed model training and saved at: &quot;</span> <span class=\"o\">+</span>\n                   <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">save_path</span><span class=\"p\">))</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n      <span class=\"n\">_logger</span><span class=\"o\">.</span><span class=\"n\">info</span><span class=\"p\">(</span><span class=\"s2\">&quot;Completed model training.&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">infer_devices</span><span class=\"p\">(</span><span class=\"n\">devices</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Returns the list of devices that multi-replica code should use.</span>\n<span class=\"sd\">  :param devices: list of string device names, e.g. [&quot;/GPU:0&quot;]</span>\n<span class=\"sd\">      If the user specifies this, `infer_devices` checks that it is</span>\n<span class=\"sd\">      valid, and then uses this user-specified list.</span>\n<span class=\"sd\">      If the user does not specify this, infer_devices uses:</span>\n<span class=\"sd\">          - All available GPUs, if there are any</span>\n<span class=\"sd\">          - CPU otherwise</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">if</span> <span class=\"n\">devices</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"n\">devices</span> <span class=\"o\">=</span> <span class=\"n\">get_available_gpus</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">devices</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n      <span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">warn</span><span class=\"p\">(</span><span class=\"s2\">&quot;No GPUS, running on CPU&quot;</span><span class=\"p\">)</span>\n      <span class=\"c1\"># Set device to empy string, tf will figure out whether to use</span>\n      <span class=\"c1\"># XLA or not, etc., automatically</span>\n      <span class=\"n\">devices</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">]</span>\n  <span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">devices</span><span class=\"p\">)</span> <span class=\"o\">&gt;</span> <span class=\"mi\">0</span>\n    <span class=\"k\">for</span> <span class=\"n\">device</span> <span class=\"ow\">in</span> <span class=\"n\">devices</span><span class=\"p\">:</span>\n      <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">device</span><span class=\"p\">,</span> <span class=\"n\">six</span><span class=\"o\">.</span><span class=\"n\">string_types</span><span class=\"p\">),</span> <span class=\"nb\">type</span><span class=\"p\">(</span><span class=\"n\">device</span><span class=\"p\">)</span>\n  <span class=\"k\">return</span> <span class=\"n\">devices</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">get_available_gpus</span><span class=\"p\">():</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Returns a list of string names of all available GPUs</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">local_device_protos</span> <span class=\"o\">=</span> <span class=\"n\">device_lib</span><span class=\"o\">.</span><span class=\"n\">list_local_devices</span><span class=\"p\">()</span>\n  <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"n\">local_device_protos</span> <span class=\"k\">if</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">device_type</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;GPU&#39;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">silence</span><span class=\"p\">():</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Silences tensorflaw&#39;s default printed messages</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">environ</span><span class=\"p\">[</span><span class=\"s1\">&#39;TF_CPP_MIN_LOG_LEVEL&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;3&#39;</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"p\">,</span> <span class=\"n\">clip_value_min</span><span class=\"p\">,</span> <span class=\"n\">clip_value_max</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A wrapper for clip_by_value that casts the clipping range if needed.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"nf\">cast_clip</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Cast clipping range argument if needed.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">dtype</span> <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float32</span><span class=\"p\">,</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">float64</span><span class=\"p\">):</span>\n      <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"p\">,</span> <span class=\"s1\">&#39;dtype&#39;</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Convert to tf dtype in case this is a numpy dtype</span>\n        <span class=\"n\">clip_dtype</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">as_dtype</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">clip_dtype</span> <span class=\"o\">!=</span> <span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">:</span>\n          <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">clip</span><span class=\"p\">,</span> <span class=\"n\">t</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">clip</span>\n\n  <span class=\"n\">clip_value_min</span> <span class=\"o\">=</span> <span class=\"n\">cast_clip</span><span class=\"p\">(</span><span class=\"n\">clip_value_min</span><span class=\"p\">)</span>\n  <span class=\"n\">clip_value_max</span> <span class=\"o\">=</span> <span class=\"n\">cast_clip</span><span class=\"p\">(</span><span class=\"n\">clip_value_max</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">clip_by_value</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"p\">,</span> <span class=\"n\">clip_value_min</span><span class=\"p\">,</span> <span class=\"n\">clip_value_max</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">mul</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A wrapper around tf multiplication that does more automatic casting of</span>\n<span class=\"sd\">  the input.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"nf\">multiply</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Multiplication&quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">a</span> <span class=\"o\">*</span> <span class=\"n\">b</span>\n  <span class=\"k\">return</span> <span class=\"n\">op_with_scalar_cast</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">multiply</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">div</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  A wrapper around tf division that does more automatic casting of</span>\n<span class=\"sd\">  the input.</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">def</span> <span class=\"nf\">divide</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Division&quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">a</span> <span class=\"o\">/</span> <span class=\"n\">b</span>\n  <span class=\"k\">return</span> <span class=\"n\">op_with_scalar_cast</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">divide</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">op_with_scalar_cast</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">f</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Builds the graph to compute f(a, b).</span>\n<span class=\"sd\">  If only one of the two arguments is a scalar and the operation would</span>\n<span class=\"sd\">  cause a type error without casting, casts the scalar to match the</span>\n<span class=\"sd\">  tensor.</span>\n<span class=\"sd\">  :param a: a tf-compatible array or scalar</span>\n<span class=\"sd\">  :param b: a tf-compatible array or scalar</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"k\">return</span> <span class=\"n\">f</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">)</span>\n  <span class=\"k\">except</span> <span class=\"p\">(</span><span class=\"ne\">TypeError</span><span class=\"p\">,</span> <span class=\"ne\">ValueError</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n  <span class=\"k\">def</span> <span class=\"nf\">is_scalar</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Return True if `x` is a scalar&quot;&quot;&quot;</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"s2\">&quot;get_shape&quot;</span><span class=\"p\">):</span>\n      <span class=\"n\">shape</span> <span class=\"o\">=</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">()</span>\n      <span class=\"k\">return</span> <span class=\"n\">shape</span><span class=\"o\">.</span><span class=\"n\">ndims</span> <span class=\"o\">==</span> <span class=\"mi\">0</span>\n    <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"s2\">&quot;ndim&quot;</span><span class=\"p\">):</span>\n      <span class=\"k\">return</span> <span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">ndim</span> <span class=\"o\">==</span> <span class=\"mi\">0</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"nb\">int</span><span class=\"p\">,</span> <span class=\"nb\">float</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n  <span class=\"n\">a_scalar</span> <span class=\"o\">=</span> <span class=\"n\">is_scalar</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">)</span>\n  <span class=\"n\">b_scalar</span> <span class=\"o\">=</span> <span class=\"n\">is_scalar</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">a_scalar</span> <span class=\"ow\">and</span> <span class=\"n\">b_scalar</span><span class=\"p\">:</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Trying to apply &quot;</span> <span class=\"o\">+</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"s2\">&quot; with mixed types&quot;</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">a_scalar</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"n\">b_scalar</span><span class=\"p\">:</span>\n    <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n\n  <span class=\"k\">if</span> <span class=\"n\">b_scalar</span> <span class=\"ow\">and</span> <span class=\"ow\">not</span> <span class=\"n\">a_scalar</span><span class=\"p\">:</span>\n    <span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">cast</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">,</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">dtype</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">f</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span> <span class=\"n\">b</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">assert_less_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper for tf.assert_less_equal</span>\n<span class=\"sd\">  Overrides tf.device so that the assert always goes on CPU.</span>\n<span class=\"sd\">  The unwrapped version raises an exception if used with tf.device(&quot;/GPU:x&quot;).</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/CPU:0&quot;</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assert_less_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper for tf.assert_greater_equal.</span>\n<span class=\"sd\">  Overrides tf.device so that the assert always goes on CPU.</span>\n<span class=\"sd\">  The unwrapped version raises an exception if used with tf.device(&quot;/GPU:x&quot;).</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/CPU:0&quot;</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assert_greater_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">assert_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Wrapper for tf.assert_equal.</span>\n<span class=\"sd\">  Overrides tf.device so that the assert always goes on CPU.</span>\n<span class=\"sd\">  The unwrapped version raises an exception if used with tf.device(&quot;/GPU:x&quot;).</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">with</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">device</span><span class=\"p\">(</span><span class=\"s2\">&quot;/CPU:0&quot;</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">assert_equal</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">jacobian_graph</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">,</span> <span class=\"n\">x</span><span class=\"p\">,</span> <span class=\"n\">nb_classes</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Create the Jacobian graph to be ran later in a TF session</span>\n<span class=\"sd\">  :param predictions: the model&#39;s symbolic output (linear output,</span>\n<span class=\"sd\">      pre-softmax)</span>\n<span class=\"sd\">  :param x: the input placeholder</span>\n<span class=\"sd\">  :param nb_classes: the number of classes the model has</span>\n<span class=\"sd\">  :return:</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n\n  <span class=\"c1\"># This function will return a list of TF gradients</span>\n  <span class=\"n\">list_derivatives</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n  <span class=\"c1\"># Define the TF graph elements to compute our derivatives for each class</span>\n  <span class=\"k\">for</span> <span class=\"n\">class_ind</span> <span class=\"ow\">in</span> <span class=\"n\">xrange</span><span class=\"p\">(</span><span class=\"n\">nb_classes</span><span class=\"p\">):</span>\n    <span class=\"n\">derivatives</span><span class=\"p\">,</span> <span class=\"o\">=</span> <span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">gradients</span><span class=\"p\">(</span><span class=\"n\">predictions</span><span class=\"p\">[:,</span> <span class=\"n\">class_ind</span><span class=\"p\">],</span> <span class=\"n\">x</span><span class=\"p\">)</span>\n    <span class=\"n\">list_derivatives</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">derivatives</span><span class=\"p\">)</span>\n\n  <span class=\"k\">return</span> <span class=\"n\">list_derivatives</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">jacobian_augmentation</span><span class=\"p\">(</span><span class=\"n\">sess</span><span class=\"p\">,</span>\n                          <span class=\"n\">x</span><span class=\"p\">,</span>\n                          <span class=\"n\">X_sub_prev</span><span class=\"p\">,</span>\n                          <span class=\"n\">Y_sub</span><span class=\"p\">,</span>\n                          <span class=\"n\">grads</span><span class=\"p\">,</span>\n                          <span class=\"n\">lmbda</span><span class=\"p\">,</span>\n                          <span class=\"n\">aug_batch_size</span><span class=\"o\">=</span><span class=\"mi\">512</span><span class=\"p\">,</span>\n                          <span class=\"n\">feed</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n  <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">  Augment an adversary&#39;s substitute training set using the Jacobian</span>\n<span class=\"sd\">  of a substitute model to generate new synthetic inputs.</span>\n<span class=\"sd\">  See https://arxiv.org/abs/1602.02697 for more details.</span>\n<span class=\"sd\">  See cleverhans_tutorials/mnist_blackbox.py for example use case</span>\n<span class=\"sd\">  :param sess: TF session in which the substitute model is defined</span>\n<span class=\"sd\">  :param x: input TF placeholder for the substitute model</span>\n<span class=\"sd\">  :param X_sub_prev: substitute training data available to the adversary</span>\n<span class=\"sd\">                     at the previous iteration</span>\n<span class=\"sd\">  :param Y_sub: substitute training labels available to the adversary</span>\n<span class=\"sd\">                at the previous iteration</span>\n<span class=\"sd\">  :param grads: Jacobian symbolic graph for the substitute</span>\n<span class=\"sd\">                (should be generated using utils_tf.jacobian_graph)</span>\n<span class=\"sd\">  :return: augmented substitute data (will need to be labeled by oracle)</span>\n<span class=\"sd\">  &quot;&quot;&quot;</span>\n  <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span> <span class=\"o\">==</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">(</span><span class=\"n\">X_sub_prev</span><span class=\"p\">))</span>\n  <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">grads</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">max</span><span class=\"p\">(</span><span class=\"n\">Y_sub</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n  <span class=\"k\">assert</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">X_sub_prev</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">Y_sub</span><span class=\"p\">)</span>\n\n  <span class=\"n\">aug_batch_size</span> <span class=\"o\">=</span> <span class=\"nb\">min</span><span class=\"p\">(</span><span class=\"n\">aug_batch_size</span><span class=\"p\">,</span> <span class=\"n\">X_sub_prev</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n\n  <span class=\"c1\"># Prepare input_shape (outside loop) for feeding dictionary below</span>\n  <span class=\"n\">input_shape</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">.</span><span class=\"n\">get_shape</span><span class=\"p\">())</span>\n  <span class=\"n\">input_shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n\n  <span class=\"c1\"># Create new numpy array for adversary training data</span>\n  <span class=\"c1\"># with twice as many components on the first dimension.</span>\n  <span class=\"n\">X_sub</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">vstack</span><span class=\"p\">([</span><span class=\"n\">X_sub_prev</span><span class=\"p\">,</span> <span class=\"n\">X_sub_prev</span><span class=\"p\">])</span>\n  <span class=\"n\">num_samples</span> <span class=\"o\">=</span> <span class=\"n\">X_sub_prev</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n\n  <span class=\"c1\"># Creating and processing as batch</span>\n  <span class=\"k\">for</span> <span class=\"n\">p_idxs</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">num_samples</span><span class=\"p\">,</span> <span class=\"n\">aug_batch_size</span><span class=\"p\">):</span>\n    <span class=\"n\">X_batch</span> <span class=\"o\">=</span> <span class=\"n\">X_sub_prev</span><span class=\"p\">[</span><span class=\"n\">p_idxs</span><span class=\"p\">:</span><span class=\"n\">p_idxs</span> <span class=\"o\">+</span> <span class=\"n\">aug_batch_size</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span>\n    <span class=\"n\">feed_dict</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">x</span><span class=\"p\">:</span> <span class=\"n\">X_batch</span><span class=\"p\">}</span>\n    <span class=\"k\">if</span> <span class=\"n\">feed</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n      <span class=\"n\">feed_dict</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">feed</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Compute sign matrix</span>\n    <span class=\"n\">grad_val</span> <span class=\"o\">=</span> <span class=\"n\">sess</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">([</span><span class=\"n\">tf</span><span class=\"o\">.</span><span class=\"n\">sign</span><span class=\"p\">(</span><span class=\"n\">grads</span><span class=\"p\">)],</span> <span class=\"n\">feed_dict</span><span class=\"o\">=</span><span class=\"n\">feed_dict</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># Create new synthetic point in adversary substitute training set</span>\n    <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"n\">indx</span><span class=\"p\">,</span> <span class=\"n\">ind</span><span class=\"p\">)</span> <span class=\"ow\">in</span> <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">p_idxs</span><span class=\"p\">,</span> <span class=\"n\">p_idxs</span> <span class=\"o\">+</span> <span class=\"n\">X_batch</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]),</span>\n                           <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">X_batch</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])):</span>\n      <span class=\"n\">X_sub</span><span class=\"p\">[</span><span class=\"n\">num_samples</span> <span class=\"o\">+</span> <span class=\"n\">indx</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n          <span class=\"n\">X_batch</span><span class=\"p\">[</span><span class=\"n\">ind</span><span class=\"p\">]</span> <span class=\"o\">+</span> <span class=\"n\">lmbda</span> <span class=\"o\">*</span> <span class=\"n\">grad_val</span><span class=\"p\">[</span><span class=\"n\">Y_sub</span><span class=\"p\">[</span><span class=\"n\">indx</span><span class=\"p\">],</span> <span class=\"n\">ind</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">])</span>\n\n  <span class=\"c1\"># Return augmented training data (needs to be labeled afterwards)</span>\n  <span class=\"k\">return</span> <span class=\"n\">X_sub</span>\n</pre></div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../../index.html\">Documentation overview</a><ul>\n  <li><a href=\"../index.html\">Module code</a><ul>\n  </ul></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_modules/index.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Overview: module code &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1>All modules for which code is available</h1>\n<ul><li><a href=\"abc.html\">abc</a></li>\n<li><a href=\"builtins.html\">builtins</a></li>\n<li><a href=\"cleverhans/attacks/attack.html\">cleverhans.attacks.attack</a></li>\n<li><a href=\"cleverhans/attacks/basic_iterative_method.html\">cleverhans.attacks.basic_iterative_method</a></li>\n<li><a href=\"cleverhans/attacks/carlini_wagner_l2.html\">cleverhans.attacks.carlini_wagner_l2</a></li>\n<li><a href=\"cleverhans/attacks/deep_fool.html\">cleverhans.attacks.deep_fool</a></li>\n<li><a href=\"cleverhans/attacks/elastic_net_method.html\">cleverhans.attacks.elastic_net_method</a></li>\n<li><a href=\"cleverhans/attacks/fast_feature_adversaries.html\">cleverhans.attacks.fast_feature_adversaries</a></li>\n<li><a href=\"cleverhans/attacks/fast_gradient_method.html\">cleverhans.attacks.fast_gradient_method</a></li>\n<li><a href=\"cleverhans/attacks/hop_skip_jump_attack.html\">cleverhans.attacks.hop_skip_jump_attack</a></li>\n<li><a href=\"cleverhans/attacks/lbfgs.html\">cleverhans.attacks.lbfgs</a></li>\n<li><a href=\"cleverhans/attacks/madry_et_al.html\">cleverhans.attacks.madry_et_al</a></li>\n<li><a href=\"cleverhans/attacks/max_confidence.html\">cleverhans.attacks.max_confidence</a></li>\n<li><a href=\"cleverhans/attacks/momentum_iterative_method.html\">cleverhans.attacks.momentum_iterative_method</a></li>\n<li><a href=\"cleverhans/attacks/noise.html\">cleverhans.attacks.noise</a></li>\n<li><a href=\"cleverhans/attacks/projected_gradient_descent.html\">cleverhans.attacks.projected_gradient_descent</a></li>\n<li><a href=\"cleverhans/attacks/saliency_map_method.html\">cleverhans.attacks.saliency_map_method</a></li>\n<li><a href=\"cleverhans/attacks/semantic.html\">cleverhans.attacks.semantic</a></li>\n<li><a href=\"cleverhans/attacks/sparse_l1_descent.html\">cleverhans.attacks.sparse_l1_descent</a></li>\n<li><a href=\"cleverhans/attacks/spatial_transformation_method.html\">cleverhans.attacks.spatial_transformation_method</a></li>\n<li><a href=\"cleverhans/attacks/spsa.html\">cleverhans.attacks.spsa</a></li>\n<li><a href=\"cleverhans/attacks/virtual_adversarial_method.html\">cleverhans.attacks.virtual_adversarial_method</a></li>\n<li><a href=\"cleverhans/compat.html\">cleverhans.compat</a></li>\n<li><a href=\"cleverhans/model.html\">cleverhans.model</a></li>\n<li><a href=\"cleverhans/utils_tf.html\">cleverhans.utils_tf</a></li>\n</ul>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"../source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/_sources/README.md.txt",
    "content": "# Generate documentation\r\n\r\nTo generate the documentation do:\r\n`make github`\r\n\r\nThe documentation files will be copied to the `cleverhans/docs` directory.\r\n\r\n### Preparation\r\n\r\nPlease do:\r\n`pip install sphinx`\r\n\r\nAdd a `.nojekyll` file in the `cleverhans/docs` directory. When GitHub sees\r\na `.nojekyll` file, it serves the root `index.html` file. The `.nojekyll` file\r\nindicates that we are not using Jekyll as our static site generator in this\r\nrepository.\r\n\r\n### Enable GitHub Pages for the GitHub repository\r\n\r\n1. Go to the repository on the GitHub website and make sure you are logged in.\r\n2. Add a /docs directory to the master branch. Otherwise you do not get the\r\n   master branch /docs folder for the Source option in the drop-down list.\r\n3. Click the Settings tab. You first go to the Options section.\r\n4. Scroll down to the GitHub Pages section and choose the drop-down list under\r\n   Source. Note: Your choices will differ based on whether you’re in a User repo\r\n   or an Org repository.\r\n5. To keep source and output HTML separate, choose master branch /docs folder\r\n   for Source.\r\n\r\n### Build Sphinx locally and publish on GitHub Pages\r\n\r\nWe keep the source docsource and output docs separate, but still are able to\r\npublish on GitHub Pages and preview builds locally.\r\n\r\nWe have the following option in the Makefile:\r\n\r\n```\r\n  github:\r\n      @make html\r\n      @cp -a _build/html/. ../docs\r\n```\r\n\r\nThus, we can run `make github` from the `docsource` directory to generate a\r\nlocal preview and move the docs where GitHub wants to serve them from.\r\n\r\n### Hacks\r\n\r\nIf you cannot build the docs for attacks, uncomment\r\n`import tensorflow_addons as tfa` in `cleverhans/attacks/spsa.py`.\r\n\r\nOtherwise:\r\n\r\n```angular2html\r\nWARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised:\r\ncannot import name 'keras_tensor'\r\n```\r\n\r\nIt is convenient to create a virtual environment to install all the specific\r\nlibraries (e.g. virutalen cleverhans).\r\n"
  },
  {
    "path": "docs/_sources/index.md.txt",
    "content": ".. CleverHans documentation master file, created by\n   sphinx-quickstart on Wed Sep 20 15:14:07 2017.\n   You can adapt this file completely to your liking, but it should at least\n   contain the root `toctree` directive.\n\n   WARNING: This file has a markdown suffix, but is in fact .rst\n\nCleverHans Documentation\n======================================\n\n\nThis documentation is auto-generated from the docstrings of modules of the current `master` branch of `cleverhans\n<http://github.com/cleverhans-lab/cleverhans/>`_.\n\nTo get started, we recommend reading the `github readme\n<https://github.com/cleverhans-lab/cleverhans#setting-up-cleverhans>`_. Afterwards, you can learn more by looking at the following modules:\n\n\n.. toctree::\n   :maxdepth: 4\n\n   source/attacks\n   <!-- source/devtools -->\n   <!-- source/future -->\n   source/model\n\n\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n\n"
  },
  {
    "path": "docs/_sources/source/attacks.md.txt",
    "content": "`attacks` module\n--------------------------\n\n.. automodule:: cleverhans.attacks\n    :members:\n    :imported-members:\n    :undoc-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/_sources/source/devtools.md.txt",
    "content": "`devtools` module\r\n------------------------\r\n\r\n.. automodule:: cleverhans.devtools\r\n    :members:\r\n    :undoc-members:\r\n    :show-inheritance:\r\n"
  },
  {
    "path": "docs/_sources/source/future.md.txt",
    "content": "`future` module\r\n------------------------\r\n\r\n.. automodule:: cleverhans.devtools\r\n    :members:\r\n    :undoc-members:\r\n    :show-inheritance:\r\n"
  },
  {
    "path": "docs/_sources/source/model.md.txt",
    "content": "`model` module\n------------------------\n\n.. automodule:: cleverhans.model\n    :members:\n    :undoc-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/_static/alabaster.css",
    "content": "@import url(\"basic.css\");\n\n/* -- page layout ----------------------------------------------------------- */\n\nbody {\n    font-family: Georgia, serif;\n    font-size: 17px;\n    background-color: #fff;\n    color: #000;\n    margin: 0;\n    padding: 0;\n}\n\n\ndiv.document {\n    width: 940px;\n    margin: 30px auto 0 auto;\n}\n\ndiv.documentwrapper {\n    float: left;\n    width: 100%;\n}\n\ndiv.bodywrapper {\n    margin: 0 0 0 220px;\n}\n\ndiv.sphinxsidebar {\n    width: 220px;\n    font-size: 14px;\n    line-height: 1.5;\n}\n\nhr {\n    border: 1px solid #B1B4B6;\n}\n\ndiv.body {\n    background-color: #fff;\n    color: #3E4349;\n    padding: 0 30px 0 30px;\n}\n\ndiv.body > .section {\n    text-align: left;\n}\n\ndiv.footer {\n    width: 940px;\n    margin: 20px auto 30px auto;\n    font-size: 14px;\n    color: #888;\n    text-align: right;\n}\n\ndiv.footer a {\n    color: #888;\n}\n\np.caption {\n    font-family: inherit;\n    font-size: inherit;\n}\n\n\ndiv.relations {\n    display: none;\n}\n\n\ndiv.sphinxsidebar a {\n    color: #444;\n    text-decoration: none;\n    border-bottom: 1px dotted #999;\n}\n\ndiv.sphinxsidebar a:hover {\n    border-bottom: 1px solid #999;\n}\n\ndiv.sphinxsidebarwrapper {\n    padding: 18px 10px;\n}\n\ndiv.sphinxsidebarwrapper p.logo {\n    padding: 0;\n    margin: -10px 0 0 0px;\n    text-align: center;\n}\n\ndiv.sphinxsidebarwrapper h1.logo {\n    margin-top: -10px;\n    text-align: center;\n    margin-bottom: 5px;\n    text-align: left;\n}\n\ndiv.sphinxsidebarwrapper h1.logo-name {\n    margin-top: 0px;\n}\n\ndiv.sphinxsidebarwrapper p.blurb {\n    margin-top: 0;\n    font-style: normal;\n}\n\ndiv.sphinxsidebar h3,\ndiv.sphinxsidebar h4 {\n    font-family: Georgia, serif;\n    color: #444;\n    font-size: 24px;\n    font-weight: normal;\n    margin: 0 0 5px 0;\n    padding: 0;\n}\n\ndiv.sphinxsidebar h4 {\n    font-size: 20px;\n}\n\ndiv.sphinxsidebar h3 a {\n    color: #444;\n}\n\ndiv.sphinxsidebar p.logo a,\ndiv.sphinxsidebar h3 a,\ndiv.sphinxsidebar p.logo a:hover,\ndiv.sphinxsidebar h3 a:hover {\n    border: none;\n}\n\ndiv.sphinxsidebar p {\n    color: #555;\n    margin: 10px 0;\n}\n\ndiv.sphinxsidebar ul {\n    margin: 10px 0;\n    padding: 0;\n    color: #000;\n}\n\ndiv.sphinxsidebar ul li.toctree-l1 > a {\n    font-size: 120%;\n}\n\ndiv.sphinxsidebar ul li.toctree-l2 > a {\n    font-size: 110%;\n}\n\ndiv.sphinxsidebar input {\n    border: 1px solid #CCC;\n    font-family: Georgia, serif;\n    font-size: 1em;\n}\n\ndiv.sphinxsidebar hr {\n    border: none;\n    height: 1px;\n    color: #AAA;\n    background: #AAA;\n\n    text-align: left;\n    margin-left: 0;\n    width: 50%;\n}\n\ndiv.sphinxsidebar .badge {\n    border-bottom: none;\n}\n\ndiv.sphinxsidebar .badge:hover {\n    border-bottom: none;\n}\n\n/* To address an issue with donation coming after search */\ndiv.sphinxsidebar h3.donation {\n    margin-top: 10px;\n}\n\n/* -- body styles ----------------------------------------------------------- */\n\na {\n    color: #004B6B;\n    text-decoration: underline;\n}\n\na:hover {\n    color: #6D4100;\n    text-decoration: underline;\n}\n\ndiv.body h1,\ndiv.body h2,\ndiv.body h3,\ndiv.body h4,\ndiv.body h5,\ndiv.body h6 {\n    font-family: Georgia, serif;\n    font-weight: normal;\n    margin: 30px 0px 10px 0px;\n    padding: 0;\n}\n\ndiv.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }\ndiv.body h2 { font-size: 180%; }\ndiv.body h3 { font-size: 150%; }\ndiv.body h4 { font-size: 130%; }\ndiv.body h5 { font-size: 100%; }\ndiv.body h6 { font-size: 100%; }\n\na.headerlink {\n    color: #DDD;\n    padding: 0 4px;\n    text-decoration: none;\n}\n\na.headerlink:hover {\n    color: #444;\n    background: #EAEAEA;\n}\n\ndiv.body p, div.body dd, div.body li {\n    line-height: 1.4em;\n}\n\ndiv.admonition {\n    margin: 20px 0px;\n    padding: 10px 30px;\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.admonition tt.xref, div.admonition code.xref, div.admonition a tt {\n    background-color: #FBFBFB;\n    border-bottom: 1px solid #fafafa;\n}\n\ndiv.admonition p.admonition-title {\n    font-family: Georgia, serif;\n    font-weight: normal;\n    font-size: 24px;\n    margin: 0 0 10px 0;\n    padding: 0;\n    line-height: 1;\n}\n\ndiv.admonition p.last {\n    margin-bottom: 0;\n}\n\ndiv.highlight {\n    background-color: #fff;\n}\n\ndt:target, .highlight {\n    background: #FAF3E8;\n}\n\ndiv.warning {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n}\n\ndiv.danger {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n    -moz-box-shadow: 2px 2px 4px #D52C2C;\n    -webkit-box-shadow: 2px 2px 4px #D52C2C;\n    box-shadow: 2px 2px 4px #D52C2C;\n}\n\ndiv.error {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n    -moz-box-shadow: 2px 2px 4px #D52C2C;\n    -webkit-box-shadow: 2px 2px 4px #D52C2C;\n    box-shadow: 2px 2px 4px #D52C2C;\n}\n\ndiv.caution {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n}\n\ndiv.attention {\n    background-color: #FCC;\n    border: 1px solid #FAA;\n}\n\ndiv.important {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.note {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.tip {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.hint {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.seealso {\n    background-color: #EEE;\n    border: 1px solid #CCC;\n}\n\ndiv.topic {\n    background-color: #EEE;\n}\n\np.admonition-title {\n    display: inline;\n}\n\np.admonition-title:after {\n    content: \":\";\n}\n\npre, tt, code {\n    font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;\n    font-size: 0.9em;\n}\n\n.hll {\n    background-color: #FFC;\n    margin: 0 -12px;\n    padding: 0 12px;\n    display: block;\n}\n\nimg.screenshot {\n}\n\ntt.descname, tt.descclassname, code.descname, code.descclassname {\n    font-size: 0.95em;\n}\n\ntt.descname, code.descname {\n    padding-right: 0.08em;\n}\n\nimg.screenshot {\n    -moz-box-shadow: 2px 2px 4px #EEE;\n    -webkit-box-shadow: 2px 2px 4px #EEE;\n    box-shadow: 2px 2px 4px #EEE;\n}\n\ntable.docutils {\n    border: 1px solid #888;\n    -moz-box-shadow: 2px 2px 4px #EEE;\n    -webkit-box-shadow: 2px 2px 4px #EEE;\n    box-shadow: 2px 2px 4px #EEE;\n}\n\ntable.docutils td, table.docutils th {\n    border: 1px solid #888;\n    padding: 0.25em 0.7em;\n}\n\ntable.field-list, table.footnote {\n    border: none;\n    -moz-box-shadow: none;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n}\n\ntable.footnote {\n    margin: 15px 0;\n    width: 100%;\n    border: 1px solid #EEE;\n    background: #FDFDFD;\n    font-size: 0.9em;\n}\n\ntable.footnote + table.footnote {\n    margin-top: -15px;\n    border-top: none;\n}\n\ntable.field-list th {\n    padding: 0 0.8em 0 0;\n}\n\ntable.field-list td {\n    padding: 0;\n}\n\ntable.field-list p {\n    margin-bottom: 0.8em;\n}\n\n/* Cloned from\n * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68\n */\n.field-name {\n    -moz-hyphens: manual;\n    -ms-hyphens: manual;\n    -webkit-hyphens: manual;\n    hyphens: manual;\n}\n\ntable.footnote td.label {\n    width: .1px;\n    padding: 0.3em 0 0.3em 0.5em;\n}\n\ntable.footnote td {\n    padding: 0.3em 0.5em;\n}\n\ndl {\n    margin: 0;\n    padding: 0;\n}\n\ndl dd {\n    margin-left: 30px;\n}\n\nblockquote {\n    margin: 0 0 0 30px;\n    padding: 0;\n}\n\nul, ol {\n    /* Matches the 30px from the narrow-screen \"li > ul\" selector below */\n    margin: 10px 0 10px 30px;\n    padding: 0;\n}\n\npre {\n    background: #EEE;\n    padding: 7px 30px;\n    margin: 15px 0px;\n    line-height: 1.3em;\n}\n\ndiv.viewcode-block:target {\n    background: #ffd;\n}\n\ndl pre, blockquote pre, li pre {\n    margin-left: 0;\n    padding-left: 30px;\n}\n\ntt, code {\n    background-color: #ecf0f3;\n    color: #222;\n    /* padding: 1px 2px; */\n}\n\ntt.xref, code.xref, a tt {\n    background-color: #FBFBFB;\n    border-bottom: 1px solid #fff;\n}\n\na.reference {\n    text-decoration: none;\n    border-bottom: 1px dotted #004B6B;\n}\n\n/* Don't put an underline on images */\na.image-reference, a.image-reference:hover {\n    border-bottom: none;\n}\n\na.reference:hover {\n    border-bottom: 1px solid #6D4100;\n}\n\na.footnote-reference {\n    text-decoration: none;\n    font-size: 0.7em;\n    vertical-align: top;\n    border-bottom: 1px dotted #004B6B;\n}\n\na.footnote-reference:hover {\n    border-bottom: 1px solid #6D4100;\n}\n\na:hover tt, a:hover code {\n    background: #EEE;\n}\n\n\n@media screen and (max-width: 870px) {\n\n    div.sphinxsidebar {\n    \tdisplay: none;\n    }\n\n    div.document {\n       width: 100%;\n\n    }\n\n    div.documentwrapper {\n    \tmargin-left: 0;\n    \tmargin-top: 0;\n    \tmargin-right: 0;\n    \tmargin-bottom: 0;\n    }\n\n    div.bodywrapper {\n    \tmargin-top: 0;\n    \tmargin-right: 0;\n    \tmargin-bottom: 0;\n    \tmargin-left: 0;\n    }\n\n    ul {\n    \tmargin-left: 0;\n    }\n\n\tli > ul {\n        /* Matches the 30px from the \"ul, ol\" selector above */\n\t\tmargin-left: 30px;\n\t}\n\n    .document {\n    \twidth: auto;\n    }\n\n    .footer {\n    \twidth: auto;\n    }\n\n    .bodywrapper {\n    \tmargin: 0;\n    }\n\n    .footer {\n    \twidth: auto;\n    }\n\n    .github {\n        display: none;\n    }\n\n\n\n}\n\n\n\n@media screen and (max-width: 875px) {\n\n    body {\n        margin: 0;\n        padding: 20px 30px;\n    }\n\n    div.documentwrapper {\n        float: none;\n        background: #fff;\n    }\n\n    div.sphinxsidebar {\n        display: block;\n        float: none;\n        width: 102.5%;\n        margin: 50px -30px -20px -30px;\n        padding: 10px 20px;\n        background: #333;\n        color: #FFF;\n    }\n\n    div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,\n    div.sphinxsidebar h3 a {\n        color: #fff;\n    }\n\n    div.sphinxsidebar a {\n        color: #AAA;\n    }\n\n    div.sphinxsidebar p.logo {\n        display: none;\n    }\n\n    div.document {\n        width: 100%;\n        margin: 0;\n    }\n\n    div.footer {\n        display: none;\n    }\n\n    div.bodywrapper {\n        margin: 0;\n    }\n\n    div.body {\n        min-height: 0;\n        padding: 0;\n    }\n\n    .rtd_doc_footer {\n        display: none;\n    }\n\n    .document {\n        width: auto;\n    }\n\n    .footer {\n        width: auto;\n    }\n\n    .footer {\n        width: auto;\n    }\n\n    .github {\n        display: none;\n    }\n}\n\n\n/* misc. */\n\n.revsys-inline {\n    display: none!important;\n}\n\n/* Make nested-list/multi-paragraph items look better in Releases changelog\n * pages. Without this, docutils' magical list fuckery causes inconsistent\n * formatting between different release sub-lists.\n */\ndiv#changelog > div.section > ul > li > p:only-child {\n    margin-bottom: 0;\n}\n\n/* Hide fugly table cell borders in ..bibliography:: directive output */\ntable.docutils.citation, table.docutils.citation td, table.docutils.citation th {\n  border: none;\n  /* Below needed in some edge cases; if not applied, bottom shadows appear */\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n\n/* relbar */\n\n.related {\n    line-height: 30px;\n    width: 100%;\n    font-size: 0.9rem;\n}\n\n.related.top {\n    border-bottom: 1px solid #EEE;\n    margin-bottom: 20px;\n}\n\n.related.bottom {\n    border-top: 1px solid #EEE;\n}\n\n.related ul {\n    padding: 0;\n    margin: 0;\n    list-style: none;\n}\n\n.related li {\n    display: inline;\n}\n\nnav#rellinks {\n    float: right;\n}\n\nnav#rellinks li+li:before {\n    content: \"|\";\n}\n\nnav#breadcrumbs li+li:before {\n    content: \"\\00BB\";\n}\n\n/* Hide certain items when printing */\n@media print {\n    div.related {\n        display: none;\n    }\n}"
  },
  {
    "path": "docs/_static/basic.css",
    "content": "/*\n * basic.css\n * ~~~~~~~~~\n *\n * Sphinx stylesheet -- basic theme.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\n/* -- main layout ----------------------------------------------------------- */\n\ndiv.clearer {\n    clear: both;\n}\n\ndiv.section::after {\n    display: block;\n    content: '';\n    clear: left;\n}\n\n/* -- relbar ---------------------------------------------------------------- */\n\ndiv.related {\n    width: 100%;\n    font-size: 90%;\n}\n\ndiv.related h3 {\n    display: none;\n}\n\ndiv.related ul {\n    margin: 0;\n    padding: 0 0 0 10px;\n    list-style: none;\n}\n\ndiv.related li {\n    display: inline;\n}\n\ndiv.related li.right {\n    float: right;\n    margin-right: 5px;\n}\n\n/* -- sidebar --------------------------------------------------------------- */\n\ndiv.sphinxsidebarwrapper {\n    padding: 10px 5px 0 10px;\n}\n\ndiv.sphinxsidebar {\n    float: left;\n    width: 230px;\n    margin-left: -100%;\n    font-size: 90%;\n    word-wrap: break-word;\n    overflow-wrap : break-word;\n}\n\ndiv.sphinxsidebar ul {\n    list-style: none;\n}\n\ndiv.sphinxsidebar ul ul,\ndiv.sphinxsidebar ul.want-points {\n    margin-left: 20px;\n    list-style: square;\n}\n\ndiv.sphinxsidebar ul ul {\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\ndiv.sphinxsidebar form {\n    margin-top: 10px;\n}\n\ndiv.sphinxsidebar input {\n    border: 1px solid #98dbcc;\n    font-family: sans-serif;\n    font-size: 1em;\n}\n\ndiv.sphinxsidebar #searchbox form.search {\n    overflow: hidden;\n}\n\ndiv.sphinxsidebar #searchbox input[type=\"text\"] {\n    float: left;\n    width: 80%;\n    padding: 0.25em;\n    box-sizing: border-box;\n}\n\ndiv.sphinxsidebar #searchbox input[type=\"submit\"] {\n    float: left;\n    width: 20%;\n    border-left: none;\n    padding: 0.25em;\n    box-sizing: border-box;\n}\n\n\nimg {\n    border: 0;\n    max-width: 100%;\n}\n\n/* -- search page ----------------------------------------------------------- */\n\nul.search {\n    margin: 10px 0 0 20px;\n    padding: 0;\n}\n\nul.search li {\n    padding: 5px 0 5px 20px;\n    background-image: url(file.png);\n    background-repeat: no-repeat;\n    background-position: 0 7px;\n}\n\nul.search li a {\n    font-weight: bold;\n}\n\nul.search li div.context {\n    color: #888;\n    margin: 2px 0 0 30px;\n    text-align: left;\n}\n\nul.keywordmatches li.goodmatch a {\n    font-weight: bold;\n}\n\n/* -- index page ------------------------------------------------------------ */\n\ntable.contentstable {\n    width: 90%;\n    margin-left: auto;\n    margin-right: auto;\n}\n\ntable.contentstable p.biglink {\n    line-height: 150%;\n}\n\na.biglink {\n    font-size: 1.3em;\n}\n\nspan.linkdescr {\n    font-style: italic;\n    padding-top: 5px;\n    font-size: 90%;\n}\n\n/* -- general index --------------------------------------------------------- */\n\ntable.indextable {\n    width: 100%;\n}\n\ntable.indextable td {\n    text-align: left;\n    vertical-align: top;\n}\n\ntable.indextable ul {\n    margin-top: 0;\n    margin-bottom: 0;\n    list-style-type: none;\n}\n\ntable.indextable > tbody > tr > td > ul {\n    padding-left: 0em;\n}\n\ntable.indextable tr.pcap {\n    height: 10px;\n}\n\ntable.indextable tr.cap {\n    margin-top: 10px;\n    background-color: #f2f2f2;\n}\n\nimg.toggler {\n    margin-right: 3px;\n    margin-top: 3px;\n    cursor: pointer;\n}\n\ndiv.modindex-jumpbox {\n    border-top: 1px solid #ddd;\n    border-bottom: 1px solid #ddd;\n    margin: 1em 0 1em 0;\n    padding: 0.4em;\n}\n\ndiv.genindex-jumpbox {\n    border-top: 1px solid #ddd;\n    border-bottom: 1px solid #ddd;\n    margin: 1em 0 1em 0;\n    padding: 0.4em;\n}\n\n/* -- domain module index --------------------------------------------------- */\n\ntable.modindextable td {\n    padding: 2px;\n    border-collapse: collapse;\n}\n\n/* -- general body styles --------------------------------------------------- */\n\ndiv.body {\n    min-width: 450px;\n    max-width: 800px;\n}\n\ndiv.body p, div.body dd, div.body li, div.body blockquote {\n    -moz-hyphens: auto;\n    -ms-hyphens: auto;\n    -webkit-hyphens: auto;\n    hyphens: auto;\n}\n\na.headerlink {\n    visibility: hidden;\n}\n\na.brackets:before,\nspan.brackets > a:before{\n    content: \"[\";\n}\n\na.brackets:after,\nspan.brackets > a:after {\n    content: \"]\";\n}\n\nh1:hover > a.headerlink,\nh2:hover > a.headerlink,\nh3:hover > a.headerlink,\nh4:hover > a.headerlink,\nh5:hover > a.headerlink,\nh6:hover > a.headerlink,\ndt:hover > a.headerlink,\ncaption:hover > a.headerlink,\np.caption:hover > a.headerlink,\ndiv.code-block-caption:hover > a.headerlink {\n    visibility: visible;\n}\n\ndiv.body p.caption {\n    text-align: inherit;\n}\n\ndiv.body td {\n    text-align: left;\n}\n\n.first {\n    margin-top: 0 !important;\n}\n\np.rubric {\n    margin-top: 30px;\n    font-weight: bold;\n}\n\nimg.align-left, .figure.align-left, object.align-left {\n    clear: left;\n    float: left;\n    margin-right: 1em;\n}\n\nimg.align-right, .figure.align-right, object.align-right {\n    clear: right;\n    float: right;\n    margin-left: 1em;\n}\n\nimg.align-center, .figure.align-center, object.align-center {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\nimg.align-default, .figure.align-default {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.align-left {\n    text-align: left;\n}\n\n.align-center {\n    text-align: center;\n}\n\n.align-default {\n    text-align: center;\n}\n\n.align-right {\n    text-align: right;\n}\n\n/* -- sidebars -------------------------------------------------------------- */\n\ndiv.sidebar {\n    margin: 0 0 0.5em 1em;\n    border: 1px solid #ddb;\n    padding: 7px;\n    background-color: #ffe;\n    width: 40%;\n    float: right;\n    clear: right;\n    overflow-x: auto;\n}\n\np.sidebar-title {\n    font-weight: bold;\n}\n\ndiv.admonition, div.topic, blockquote {\n    clear: left;\n}\n\n/* -- topics ---------------------------------------------------------------- */\n\ndiv.topic {\n    border: 1px solid #ccc;\n    padding: 7px;\n    margin: 10px 0 10px 0;\n}\n\np.topic-title {\n    font-size: 1.1em;\n    font-weight: bold;\n    margin-top: 10px;\n}\n\n/* -- admonitions ----------------------------------------------------------- */\n\ndiv.admonition {\n    margin-top: 10px;\n    margin-bottom: 10px;\n    padding: 7px;\n}\n\ndiv.admonition dt {\n    font-weight: bold;\n}\n\np.admonition-title {\n    margin: 0px 10px 5px 0px;\n    font-weight: bold;\n}\n\ndiv.body p.centered {\n    text-align: center;\n    margin-top: 25px;\n}\n\n/* -- content of sidebars/topics/admonitions -------------------------------- */\n\ndiv.sidebar > :last-child,\ndiv.topic > :last-child,\ndiv.admonition > :last-child {\n    margin-bottom: 0;\n}\n\ndiv.sidebar::after,\ndiv.topic::after,\ndiv.admonition::after,\nblockquote::after {\n    display: block;\n    content: '';\n    clear: both;\n}\n\n/* -- tables ---------------------------------------------------------------- */\n\ntable.docutils {\n    margin-top: 10px;\n    margin-bottom: 10px;\n    border: 0;\n    border-collapse: collapse;\n}\n\ntable.align-center {\n    margin-left: auto;\n    margin-right: auto;\n}\n\ntable.align-default {\n    margin-left: auto;\n    margin-right: auto;\n}\n\ntable caption span.caption-number {\n    font-style: italic;\n}\n\ntable caption span.caption-text {\n}\n\ntable.docutils td, table.docutils th {\n    padding: 1px 8px 1px 5px;\n    border-top: 0;\n    border-left: 0;\n    border-right: 0;\n    border-bottom: 1px solid #aaa;\n}\n\ntable.footnote td, table.footnote th {\n    border: 0 !important;\n}\n\nth {\n    text-align: left;\n    padding-right: 5px;\n}\n\ntable.citation {\n    border-left: solid 1px gray;\n    margin-left: 1px;\n}\n\ntable.citation td {\n    border-bottom: none;\n}\n\nth > :first-child,\ntd > :first-child {\n    margin-top: 0px;\n}\n\nth > :last-child,\ntd > :last-child {\n    margin-bottom: 0px;\n}\n\n/* -- figures --------------------------------------------------------------- */\n\ndiv.figure {\n    margin: 0.5em;\n    padding: 0.5em;\n}\n\ndiv.figure p.caption {\n    padding: 0.3em;\n}\n\ndiv.figure p.caption span.caption-number {\n    font-style: italic;\n}\n\ndiv.figure p.caption span.caption-text {\n}\n\n/* -- field list styles ----------------------------------------------------- */\n\ntable.field-list td, table.field-list th {\n    border: 0 !important;\n}\n\n.field-list ul {\n    margin: 0;\n    padding-left: 1em;\n}\n\n.field-list p {\n    margin: 0;\n}\n\n.field-name {\n    -moz-hyphens: manual;\n    -ms-hyphens: manual;\n    -webkit-hyphens: manual;\n    hyphens: manual;\n}\n\n/* -- hlist styles ---------------------------------------------------------- */\n\ntable.hlist {\n    margin: 1em 0;\n}\n\ntable.hlist td {\n    vertical-align: top;\n}\n\n\n/* -- other body styles ----------------------------------------------------- */\n\nol.arabic {\n    list-style: decimal;\n}\n\nol.loweralpha {\n    list-style: lower-alpha;\n}\n\nol.upperalpha {\n    list-style: upper-alpha;\n}\n\nol.lowerroman {\n    list-style: lower-roman;\n}\n\nol.upperroman {\n    list-style: upper-roman;\n}\n\n:not(li) > ol > li:first-child > :first-child,\n:not(li) > ul > li:first-child > :first-child {\n    margin-top: 0px;\n}\n\n:not(li) > ol > li:last-child > :last-child,\n:not(li) > ul > li:last-child > :last-child {\n    margin-bottom: 0px;\n}\n\nol.simple ol p,\nol.simple ul p,\nul.simple ol p,\nul.simple ul p {\n    margin-top: 0;\n}\n\nol.simple > li:not(:first-child) > p,\nul.simple > li:not(:first-child) > p {\n    margin-top: 0;\n}\n\nol.simple p,\nul.simple p {\n    margin-bottom: 0;\n}\n\ndl.footnote > dt,\ndl.citation > dt {\n    float: left;\n    margin-right: 0.5em;\n}\n\ndl.footnote > dd,\ndl.citation > dd {\n    margin-bottom: 0em;\n}\n\ndl.footnote > dd:after,\ndl.citation > dd:after {\n    content: \"\";\n    clear: both;\n}\n\ndl.field-list {\n    display: grid;\n    grid-template-columns: fit-content(30%) auto;\n}\n\ndl.field-list > dt {\n    font-weight: bold;\n    word-break: break-word;\n    padding-left: 0.5em;\n    padding-right: 5px;\n}\n\ndl.field-list > dt:after {\n    content: \":\";\n}\n\ndl.field-list > dd {\n    padding-left: 0.5em;\n    margin-top: 0em;\n    margin-left: 0em;\n    margin-bottom: 0em;\n}\n\ndl {\n    margin-bottom: 15px;\n}\n\ndd > :first-child {\n    margin-top: 0px;\n}\n\ndd ul, dd table {\n    margin-bottom: 10px;\n}\n\ndd {\n    margin-top: 3px;\n    margin-bottom: 10px;\n    margin-left: 30px;\n}\n\ndl > dd:last-child,\ndl > dd:last-child > :last-child {\n    margin-bottom: 0;\n}\n\ndt:target, span.highlighted {\n    background-color: #fbe54e;\n}\n\nrect.highlighted {\n    fill: #fbe54e;\n}\n\ndl.glossary dt {\n    font-weight: bold;\n    font-size: 1.1em;\n}\n\n.optional {\n    font-size: 1.3em;\n}\n\n.sig-paren {\n    font-size: larger;\n}\n\n.versionmodified {\n    font-style: italic;\n}\n\n.system-message {\n    background-color: #fda;\n    padding: 5px;\n    border: 3px solid red;\n}\n\n.footnote:target  {\n    background-color: #ffa;\n}\n\n.line-block {\n    display: block;\n    margin-top: 1em;\n    margin-bottom: 1em;\n}\n\n.line-block .line-block {\n    margin-top: 0;\n    margin-bottom: 0;\n    margin-left: 1.5em;\n}\n\n.guilabel, .menuselection {\n    font-family: sans-serif;\n}\n\n.accelerator {\n    text-decoration: underline;\n}\n\n.classifier {\n    font-style: oblique;\n}\n\n.classifier:before {\n    font-style: normal;\n    margin: 0.5em;\n    content: \":\";\n}\n\nabbr, acronym {\n    border-bottom: dotted 1px;\n    cursor: help;\n}\n\n/* -- code displays --------------------------------------------------------- */\n\npre {\n    overflow: auto;\n    overflow-y: hidden;  /* fixes display issues on Chrome browsers */\n}\n\npre, div[class*=\"highlight-\"] {\n    clear: both;\n}\n\nspan.pre {\n    -moz-hyphens: none;\n    -ms-hyphens: none;\n    -webkit-hyphens: none;\n    hyphens: none;\n}\n\ndiv[class*=\"highlight-\"] {\n    margin: 1em 0;\n}\n\ntd.linenos pre {\n    border: 0;\n    background-color: transparent;\n    color: #aaa;\n}\n\ntable.highlighttable {\n    display: block;\n}\n\ntable.highlighttable tbody {\n    display: block;\n}\n\ntable.highlighttable tr {\n    display: flex;\n}\n\ntable.highlighttable td {\n    margin: 0;\n    padding: 0;\n}\n\ntable.highlighttable td.linenos {\n    padding-right: 0.5em;\n}\n\ntable.highlighttable td.code {\n    flex: 1;\n    overflow: hidden;\n}\n\n.highlight .hll {\n    display: block;\n}\n\ndiv.highlight pre,\ntable.highlighttable pre {\n    margin: 0;\n}\n\ndiv.code-block-caption + div {\n    margin-top: 0;\n}\n\ndiv.code-block-caption {\n    margin-top: 1em;\n    padding: 2px 5px;\n    font-size: small;\n}\n\ndiv.code-block-caption code {\n    background-color: transparent;\n}\n\ntable.highlighttable td.linenos,\nspan.linenos,\ndiv.doctest > div.highlight span.gp {  /* gp: Generic.Prompt */\n    user-select: none;\n}\n\ndiv.code-block-caption span.caption-number {\n    padding: 0.1em 0.3em;\n    font-style: italic;\n}\n\ndiv.code-block-caption span.caption-text {\n}\n\ndiv.literal-block-wrapper {\n    margin: 1em 0;\n}\n\ncode.descname {\n    background-color: transparent;\n    font-weight: bold;\n    font-size: 1.2em;\n}\n\ncode.descclassname {\n    background-color: transparent;\n}\n\ncode.xref, a code {\n    background-color: transparent;\n    font-weight: bold;\n}\n\nh1 code, h2 code, h3 code, h4 code, h5 code, h6 code {\n    background-color: transparent;\n}\n\n.viewcode-link {\n    float: right;\n}\n\n.viewcode-back {\n    float: right;\n    font-family: sans-serif;\n}\n\ndiv.viewcode-block:target {\n    margin: -1px -10px;\n    padding: 0 10px;\n}\n\n/* -- math display ---------------------------------------------------------- */\n\nimg.math {\n    vertical-align: middle;\n}\n\ndiv.body div.math p {\n    text-align: center;\n}\n\nspan.eqno {\n    float: right;\n}\n\nspan.eqno a.headerlink {\n    position: absolute;\n    z-index: 1;\n}\n\ndiv.math:hover a.headerlink {\n    visibility: visible;\n}\n\n/* -- printout stylesheet --------------------------------------------------- */\n\n@media print {\n    div.document,\n    div.documentwrapper,\n    div.bodywrapper {\n        margin: 0 !important;\n        width: 100%;\n    }\n\n    div.sphinxsidebar,\n    div.related,\n    div.footer,\n    #top-link {\n        display: none;\n    }\n}"
  },
  {
    "path": "docs/_static/custom.css",
    "content": "/* This file intentionally left blank. */\n"
  },
  {
    "path": "docs/_static/doctools.js",
    "content": "/*\n * doctools.js\n * ~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for all documentation.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\n/**\n * select a different prefix for underscore\n */\n$u = _.noConflict();\n\n/**\n * make the code below compatible with browsers without\n * an installed firebug like debugger\nif (!window.console || !console.firebug) {\n  var names = [\"log\", \"debug\", \"info\", \"warn\", \"error\", \"assert\", \"dir\",\n    \"dirxml\", \"group\", \"groupEnd\", \"time\", \"timeEnd\", \"count\", \"trace\",\n    \"profile\", \"profileEnd\"];\n  window.console = {};\n  for (var i = 0; i < names.length; ++i)\n    window.console[names[i]] = function() {};\n}\n */\n\n/**\n * small helper function to urldecode strings\n */\njQuery.urldecode = function(x) {\n  return decodeURIComponent(x).replace(/\\+/g, ' ');\n};\n\n/**\n * small helper function to urlencode strings\n */\njQuery.urlencode = encodeURIComponent;\n\n/**\n * This function returns the parsed url parameters of the\n * current request. Multiple values per key are supported,\n * it will always return arrays of strings for the value parts.\n */\njQuery.getQueryParameters = function(s) {\n  if (typeof s === 'undefined')\n    s = document.location.search;\n  var parts = s.substr(s.indexOf('?') + 1).split('&');\n  var result = {};\n  for (var i = 0; i < parts.length; i++) {\n    var tmp = parts[i].split('=', 2);\n    var key = jQuery.urldecode(tmp[0]);\n    var value = jQuery.urldecode(tmp[1]);\n    if (key in result)\n      result[key].push(value);\n    else\n      result[key] = [value];\n  }\n  return result;\n};\n\n/**\n * highlight a given string on a jquery object by wrapping it in\n * span elements with the given class name.\n */\njQuery.fn.highlightText = function(text, className) {\n  function highlight(node, addItems) {\n    if (node.nodeType === 3) {\n      var val = node.nodeValue;\n      var pos = val.toLowerCase().indexOf(text);\n      if (pos >= 0 &&\n          !jQuery(node.parentNode).hasClass(className) &&\n          !jQuery(node.parentNode).hasClass(\"nohighlight\")) {\n        var span;\n        var isInSVG = jQuery(node).closest(\"body, svg, foreignObject\").is(\"svg\");\n        if (isInSVG) {\n          span = document.createElementNS(\"http://www.w3.org/2000/svg\", \"tspan\");\n        } else {\n          span = document.createElement(\"span\");\n          span.className = className;\n        }\n        span.appendChild(document.createTextNode(val.substr(pos, text.length)));\n        node.parentNode.insertBefore(span, node.parentNode.insertBefore(\n          document.createTextNode(val.substr(pos + text.length)),\n          node.nextSibling));\n        node.nodeValue = val.substr(0, pos);\n        if (isInSVG) {\n          var rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n          var bbox = node.parentElement.getBBox();\n          rect.x.baseVal.value = bbox.x;\n          rect.y.baseVal.value = bbox.y;\n          rect.width.baseVal.value = bbox.width;\n          rect.height.baseVal.value = bbox.height;\n          rect.setAttribute('class', className);\n          addItems.push({\n              \"parent\": node.parentNode,\n              \"target\": rect});\n        }\n      }\n    }\n    else if (!jQuery(node).is(\"button, select, textarea\")) {\n      jQuery.each(node.childNodes, function() {\n        highlight(this, addItems);\n      });\n    }\n  }\n  var addItems = [];\n  var result = this.each(function() {\n    highlight(this, addItems);\n  });\n  for (var i = 0; i < addItems.length; ++i) {\n    jQuery(addItems[i].parent).before(addItems[i].target);\n  }\n  return result;\n};\n\n/*\n * backward compatibility for jQuery.browser\n * This will be supported until firefox bug is fixed.\n */\nif (!jQuery.browser) {\n  jQuery.uaMatch = function(ua) {\n    ua = ua.toLowerCase();\n\n    var match = /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n      /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n      /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n      /(msie) ([\\w.]+)/.exec(ua) ||\n      ua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua) ||\n      [];\n\n    return {\n      browser: match[ 1 ] || \"\",\n      version: match[ 2 ] || \"0\"\n    };\n  };\n  jQuery.browser = {};\n  jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;\n}\n\n/**\n * Small JavaScript module for the documentation.\n */\nvar Documentation = {\n\n  init : function() {\n    this.fixFirefoxAnchorBug();\n    this.highlightSearchWords();\n    this.initIndexTable();\n    if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {\n      this.initOnKeyListeners();\n    }\n  },\n\n  /**\n   * i18n support\n   */\n  TRANSLATIONS : {},\n  PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },\n  LOCALE : 'unknown',\n\n  // gettext and ngettext don't access this so that the functions\n  // can safely bound to a different name (_ = Documentation.gettext)\n  gettext : function(string) {\n    var translated = Documentation.TRANSLATIONS[string];\n    if (typeof translated === 'undefined')\n      return string;\n    return (typeof translated === 'string') ? translated : translated[0];\n  },\n\n  ngettext : function(singular, plural, n) {\n    var translated = Documentation.TRANSLATIONS[singular];\n    if (typeof translated === 'undefined')\n      return (n == 1) ? singular : plural;\n    return translated[Documentation.PLURALEXPR(n)];\n  },\n\n  addTranslations : function(catalog) {\n    for (var key in catalog.messages)\n      this.TRANSLATIONS[key] = catalog.messages[key];\n    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');\n    this.LOCALE = catalog.locale;\n  },\n\n  /**\n   * add context elements like header anchor links\n   */\n  addContextElements : function() {\n    $('div[id] > :header:first').each(function() {\n      $('<a class=\"headerlink\">\\u00B6</a>').\n      attr('href', '#' + this.id).\n      attr('title', _('Permalink to this headline')).\n      appendTo(this);\n    });\n    $('dt[id]').each(function() {\n      $('<a class=\"headerlink\">\\u00B6</a>').\n      attr('href', '#' + this.id).\n      attr('title', _('Permalink to this definition')).\n      appendTo(this);\n    });\n  },\n\n  /**\n   * workaround a firefox stupidity\n   * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075\n   */\n  fixFirefoxAnchorBug : function() {\n    if (document.location.hash && $.browser.mozilla)\n      window.setTimeout(function() {\n        document.location.href += '';\n      }, 10);\n  },\n\n  /**\n   * highlight the search words provided in the url in the text\n   */\n  highlightSearchWords : function() {\n    var params = $.getQueryParameters();\n    var terms = (params.highlight) ? params.highlight[0].split(/\\s+/) : [];\n    if (terms.length) {\n      var body = $('div.body');\n      if (!body.length) {\n        body = $('body');\n      }\n      window.setTimeout(function() {\n        $.each(terms, function() {\n          body.highlightText(this.toLowerCase(), 'highlighted');\n        });\n      }, 10);\n      $('<p class=\"highlight-link\"><a href=\"javascript:Documentation.' +\n        'hideSearchWords()\">' + _('Hide Search Matches') + '</a></p>')\n          .appendTo($('#searchbox'));\n    }\n  },\n\n  /**\n   * init the domain index toggle buttons\n   */\n  initIndexTable : function() {\n    var togglers = $('img.toggler').click(function() {\n      var src = $(this).attr('src');\n      var idnum = $(this).attr('id').substr(7);\n      $('tr.cg-' + idnum).toggle();\n      if (src.substr(-9) === 'minus.png')\n        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');\n      else\n        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');\n    }).css('display', '');\n    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {\n        togglers.click();\n    }\n  },\n\n  /**\n   * helper function to hide the search marks again\n   */\n  hideSearchWords : function() {\n    $('#searchbox .highlight-link').fadeOut(300);\n    $('span.highlighted').removeClass('highlighted');\n  },\n\n  /**\n   * make the url absolute\n   */\n  makeURL : function(relativeURL) {\n    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;\n  },\n\n  /**\n   * get the current relative url\n   */\n  getCurrentURL : function() {\n    var path = document.location.pathname;\n    var parts = path.split(/\\//);\n    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\\//), function() {\n      if (this === '..')\n        parts.pop();\n    });\n    var url = parts.join('/');\n    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);\n  },\n\n  initOnKeyListeners: function() {\n    $(document).keydown(function(event) {\n      var activeElementType = document.activeElement.tagName;\n      // don't navigate when in search box, textarea, dropdown or button\n      if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'\n          && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey\n          && !event.shiftKey) {\n        switch (event.keyCode) {\n          case 37: // left\n            var prevHref = $('link[rel=\"prev\"]').prop('href');\n            if (prevHref) {\n              window.location.href = prevHref;\n              return false;\n            }\n          case 39: // right\n            var nextHref = $('link[rel=\"next\"]').prop('href');\n            if (nextHref) {\n              window.location.href = nextHref;\n              return false;\n            }\n        }\n      }\n    });\n  }\n};\n\n// quick alias for translations\n_ = Documentation.gettext;\n\n$(document).ready(function() {\n  Documentation.init();\n});\n"
  },
  {
    "path": "docs/_static/documentation_options.js",
    "content": "var DOCUMENTATION_OPTIONS = {\n    URL_ROOT: document.getElementById(\"documentation_options\").getAttribute('data-url_root'),\n    VERSION: '',\n    LANGUAGE: 'None',\n    COLLAPSE_INDEX: false,\n    BUILDER: 'html',\n    FILE_SUFFIX: '.html',\n    LINK_SUFFIX: '.html',\n    HAS_SOURCE: true,\n    SOURCELINK_SUFFIX: '.txt',\n    NAVIGATION_WITH_KEYS: false\n};"
  },
  {
    "path": "docs/_static/jquery-3.5.1.js",
    "content": "/*!\n * jQuery JavaScript Library v3.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2020-05-04T22:49Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n      // Support: Chrome <=57, Firefox <=52\n      // In some browsers, typeof returns \"function\" for HTML <object> elements\n      // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n      // We don't want to classify *any* DOM node as a function.\n      return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.5.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( _i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.5\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2020-03-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px\";\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = parseInt( trStyle.height ) > 3;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = (\n\t\t\t\t\tdataPriv.get( cur, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script\n\t\t\tif ( !isSuccess && jQuery.inArray( \"script\", s.dataTypes ) > -1 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tif ( typeof props.top === \"number\" ) {\n\t\t\t\tprops.top += \"px\";\n\t\t\t}\n\t\t\tif ( typeof props.left === \"number\" ) {\n\t\t\t\tprops.left += \"px\";\n\t\t\t}\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t} );\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "docs/_static/jquery.js",
    "content": "/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(C,e){\"use strict\";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement(\"script\");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[o.call(e)]||\"object\":typeof e}var f=\"3.5.1\",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&\"length\"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],\"__proto__\"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:\"jQuery\"+(f+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==o.call(e))&&(!(t=r(e))||\"function\"==typeof(n=v.call(t,\"constructor\")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,\"string\"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),\"function\"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){n[\"[object \"+t+\"]\"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S=\"sizzle\"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",M=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",I=\"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\"+M+\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",W=\"\\\\[\"+M+\"*(\"+I+\")(?:\"+M+\"*([*^$|!~]?=)\"+M+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+I+\"))|)\"+M+\"*\\\\]\",F=\":(\"+I+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+W+\")*)|.*)\\\\)|)\",B=new RegExp(M+\"+\",\"g\"),$=new RegExp(\"^\"+M+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+M+\"+$\",\"g\"),_=new RegExp(\"^\"+M+\"*,\"+M+\"*\"),z=new RegExp(\"^\"+M+\"*([>+~]|\"+M+\")\"+M+\"*\"),U=new RegExp(M+\"|>\"),X=new RegExp(F),V=new RegExp(\"^\"+I+\"$\"),G={ID:new RegExp(\"^#(\"+I+\")\"),CLASS:new RegExp(\"^\\\\.(\"+I+\")\"),TAG:new RegExp(\"^(\"+I+\"|[*])\"),ATTR:new RegExp(\"^\"+W),PSEUDO:new RegExp(\"^\"+F),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+M+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+M+\"*(?:([+-]|)\"+M+\"*(\\\\d+)|))\"+M+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+R+\")$\",\"i\"),needsContext:new RegExp(\"^\"+M+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+M+\"*((?:-\\\\d)?\\\\d*)\"+M+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\\d$/i,K=/^[^{]+\\{\\s*\\[native \\w/,Z=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ee=/[+~]/,te=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+M+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),ne=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,ie=function(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&\"fieldset\"===e.nodeName.toLowerCase()},{dir:\"parentNode\",next:\"legend\"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+\" \"]&&(!v||!v.test(t))&&(1!==p||\"object\"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute(\"id\"))?s=s.replace(re,ie):e.setAttribute(\"id\",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+xe(l[o]);c=l.join(\",\")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return g(t.replace($,\"$1\"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split(\"|\"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return\"input\"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return(\"input\"===t||\"button\"===t)&&e.type===n}}function ge(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||\"HTML\")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener(\"unload\",oe,!1):n.attachEvent&&n.attachEvent(\"onunload\",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement(\"div\")),\"undefined\"!=typeof e.querySelectorAll&&!e.querySelectorAll(\":scope fieldset div\").length}),d.attributes=ce(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=\"<a id='\"+S+\"'></a><select id='\"+S+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&v.push(\"[*^$]=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||v.push(\"\\\\[\"+M+\"*(?:value|\"+R+\")\"),e.querySelectorAll(\"[id~=\"+S+\"-]\").length||v.push(\"~=\"),(t=C.createElement(\"input\")).setAttribute(\"name\",\"\"),e.appendChild(t),e.querySelectorAll(\"[name='']\").length||v.push(\"\\\\[\"+M+\"*name\"+M+\"*=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\":checked\").length||v.push(\":checked\"),e.querySelectorAll(\"a#\"+S+\"+*\").length||v.push(\".#.+[+~]\"),e.querySelectorAll(\"\\\\\\f\"),v.push(\"[\\\\r\\\\n\\\\f]\")}),ce(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=C.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&v.push(\"name\"+M+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&v.push(\":enabled\",\":disabled\"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&v.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),v.push(\",.*:\")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,\"*\"),c.call(e,\"[s!='']:x\"),s.push(\"!=\",F)}),v=v.length&&new RegExp(v.join(\"|\")),s=s.length&&new RegExp(s.join(\"|\")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+\" \"]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+\"\").replace(re,ie)},se.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n=\"\",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||\"\").replace(te,ne),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+\" \"];return t||(t=new RegExp(\"(^|\"+M+\")\"+e+\"(\"+M+\"|$)\"))&&m(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?\"!=\"===r:!r||(t+=\"\",\"=\"===r?t===i:\"!=\"===r?t!==i:\"^=\"===r?i&&0===t.indexOf(i):\"*=\"===r?i&&-1<t.indexOf(i):\"$=\"===r?i&&t.slice(-i.length)===i:\"~=\"===r?-1<(\" \"+t.replace(B,\" \")+\" \").indexOf(i):\"|=\"===r&&(t===i||t.slice(0,i.length+1)===i+\"-\"))}},CHILD:function(h,e,t,g,v){var y=\"nth\"!==h.slice(0,3),m=\"last\"!==h.slice(-4),x=\"of-type\"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?\"nextSibling\":\"previousSibling\",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l=\"only\"===h&&!u&&\"nextSibling\"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error(\"unsupported pseudo: \"+e);return a[S]?a(o):1<a.length?(t=[e,e,\"\",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,\"$1\"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||\"\")||se.error(\"unsupported lang: \"+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute(\"xml:lang\")||e.getAttribute(\"lang\"))return(t=t.toLowerCase())===n||0===t.indexOf(n+\"-\")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&\"parentNode\"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||\"*\",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[\" \"],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:\" \"===e[s-2].type?\"*\":\"\"})).replace($,\"$1\"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+\" \"];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($,\" \")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+\" \"];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l=\"0\",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG(\"*\",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l=\"function\"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&\"ID\"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split(\"\").sort(D).join(\"\")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement(\"fieldset\"))}),ce(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||fe(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||fe(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute(\"disabled\")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[\":\"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):\"string\"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if(\"string\"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,\"string\"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,\"string\"==typeof e){if(!(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a=\"string\"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?\"string\"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,\"parentNode\")},parentsUntil:function(e,t,n){return h(e,\"parentNode\",n)},next:function(e){return O(e,\"nextSibling\")},prev:function(e){return O(e,\"previousSibling\")},nextAll:function(e){return h(e,\"nextSibling\")},prevAll:function(e){return h(e,\"previousSibling\")},nextUntil:function(e,t,n){return h(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return h(e,\"previousSibling\",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,\"template\")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return\"Until\"!==r.slice(-5)&&(t=e),t&&\"string\"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\\x20\\t\\r\\n\\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r=\"string\"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:\"\")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&\"string\"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t=\"\",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=\"\"),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[[\"notify\",\"progress\",S.Callbacks(\"memory\"),S.Callbacks(\"memory\"),2],[\"resolve\",\"done\",S.Callbacks(\"once memory\"),S.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",S.Callbacks(\"once memory\"),S.Callbacks(\"once memory\"),1,\"rejected\"]],i=\"pending\",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},\"catch\":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+\"With\"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError(\"Thenable self-resolution\");t=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+\"With\"](this===s?void 0:this,arguments),this},s[t[0]+\"With\"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),\"pending\"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn(\"jQuery.Deferred exception: \"+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener(\"DOMContentLoaded\",B),C.removeEventListener(\"load\",B),S.ready()}S.fn.ready=function(e){return F.then(e)[\"catch\"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,\"complete\"===E.readyState||\"loading\"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener(\"DOMContentLoaded\",B),C.addEventListener(\"load\",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if(\"object\"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,\"ms-\").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if(\"string\"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(K,\"-$&\").toLowerCase(),\"string\"==typeof(n=e.getAttribute(r))){try{n=\"true\"===(i=n)||\"false\"!==i&&(\"null\"===i?null:i===+i+\"\"?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,\"hasDataAttrs\"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf(\"data-\")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,\"hasDataAttrs\",!0)}return i}return\"object\"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks(\"once memory\").add(function(){Y.remove(e,[t+\"queue\",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return\"string\"!=typeof t&&(n=t,t=\"fx\",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),\"fx\"===t&&\"inprogress\"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";while(a--)(n=Y.get(o[a],e+\"queueHooks\"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,te=new RegExp(\"^(?:([+-])=|)(\"+ee+\")([a-z%]*)$\",\"i\"),ne=[\"Top\",\"Right\",\"Bottom\",\"Left\"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return\"none\"===(e=t||e).style.display||\"\"===e.style.display&&ie(e)&&\"none\"===S.css(e,\"display\")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,\"\")},u=s(),l=n&&n[3]||(S.cssNumber[t]?\"\":\"px\"),c=e.nodeType&&(S.cssNumber[t]||\"px\"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?(\"none\"===n&&(l[c]=Y.get(r,\"display\")||null,l[c]||(r.style.display=\"\")),\"\"===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,\"display\"),o.parentNode.removeChild(o),\"none\"===u&&(u=\"block\"),ue[s]=u)))):\"none\"!==n&&(l[c]=\"none\",Y.set(r,\"display\",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i,he=/^$|^module$|\\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement(\"div\")),(fe=E.createElement(\"input\")).setAttribute(\"type\",\"radio\"),fe.setAttribute(\"checked\",\"checked\"),fe.setAttribute(\"name\",\"t\"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML=\"<textarea>x</textarea>\",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=\"<option></option>\",y.option=!!ce.lastChild;var ge={thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};function ve(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],\"globalEval\",!t||Y.get(t[n],\"globalEval\"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,\"<select multiple='multiple'>\",\"</select>\"]);var me=/<|&#?\\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if(\"object\"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement(\"div\")),s=(de.exec(o)||[\"\",\"\"])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=\"\"}else p.push(t.createTextNode(o));f.textContent=\"\",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),\"script\"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||\"\")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==(\"focus\"===t)}function ke(e,t,n,r,i,o){var a,s;if(\"object\"==typeof t){for(s in\"string\"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&(\"string\"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return\"undefined\"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||\"\").match(P)||[\"\"]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||\"\").match(P)||[\"\"]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,\"events\")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+\" \"]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Ae(t,\"click\",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Ae(t,\"click\"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,\"input\")&&Y.get(t,\"click\")||A(t,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,\"char\":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&\"function\"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\\s*(?:[^=]|=\\s*.checked.)/i,je=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;function qe(e,t){return A(e,\"table\")&&A(11!==t.nodeType?t:t.firstChild,\"tr\")&&S(e).children(\"tbody\")[0]||e}function Le(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function He(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,\"handle events\"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&\"string\"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,\"script\"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,\"script\"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||\"\")&&!Y.access(u,\"globalEval\")&&S.contains(l,u)&&(u.src&&\"module\"!==(u.type||\"\").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute(\"nonce\")},l):b(u.textContent.replace(je,\"\"),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,\"script\")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,\"input\"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:\"input\"!==l&&\"textarea\"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,\"script\")).length&&ye(a,!f&&ve(e,\"script\")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp(\"^(\"+ee+\")(?!px)[a-z%]+$\",\"i\"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join(\"|\"),\"i\");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(\"\"!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+\"\":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText=\"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\",l.style.cssText=\"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n=\"1%\"!==e.top,s=12===t(e.marginLeft),l.style.right=\"60%\",o=36===t(e.right),r=36===t(e.width),l.style.position=\"absolute\",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement(\"div\"),l=E.createElement(\"div\");l.style&&(l.style.backgroundClip=\"content-box\",l.cloneNode(!0).style.backgroundClip=\"\",y.clearCloneStyle=\"content-box\"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement(\"table\"),t=E.createElement(\"tr\"),n=E.createElement(\"div\"),e.style.cssText=\"position:absolute;left:-11111px\",t.style.height=\"1px\",n.style.height=\"9px\",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=[\"Webkit\",\"Moz\",\"ms\"],ze=E.createElement(\"div\").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Qe={letterSpacing:\"0\",fontWeight:\"400\"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function Ke(e,t,n,r,i,o){var a=\"width\"===t?1:0,s=0,u=0;if(n===(r?\"border\":\"content\"))return 0;for(;a<4;a+=2)\"margin\"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?(\"content\"===n&&(u-=S.css(e,\"padding\"+ne[a],!0,i)),\"margin\"!==n&&(u-=S.css(e,\"border\"+ne[a]+\"Width\",!0,i))):(u+=S.css(e,\"padding\"+ne[a],!0,i),\"padding\"!==n?u+=S.css(e,\"border\"+ne[a]+\"Width\",!0,i):s+=S.css(e,\"border\"+ne[a]+\"Width\",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&\"border-box\"===S.css(e,\"boxSizing\",!1,r),o=i,a=Be(e,t,r),s=\"offset\"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a=\"auto\"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,\"tr\")||\"auto\"===a||!parseFloat(a)&&\"inline\"===S.css(e,\"display\",!1,r))&&e.getClientRects().length&&(i=\"border-box\"===S.css(e,\"boxSizing\",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?\"border\":\"content\"),o,r,a)+\"px\"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&\"get\"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];\"string\"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o=\"number\"),null!=n&&n==n&&(\"number\"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?\"\":\"px\")),y.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(l[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&\"get\"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),\"normal\"===i&&t in Qe&&(i=Qe[t]),\"\"===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each([\"height\",\"width\"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&\"absolute\"===i.position,a=(o||n)&&\"border-box\"===S.css(e,\"boxSizing\",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e[\"offset\"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,\"border\",!1,i)-.5)),s&&(r=te.exec(t))&&\"px\"!==(r[3]||\"px\")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,\"marginLeft\"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),S.each({margin:\"\",padding:\"\",border:\"Width\"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r=\"string\"==typeof e?e.split(\" \"):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},\"margin\"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?\"\":\"px\")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,\"\"))&&\"auto\"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i[\"margin\"+(n=ne[r])]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners[\"*\"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&\"expand\"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=[\"*\"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,\"fxshow\");for(r in n.queue||(null==(a=S._queueHooks(e,\"fx\")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,\"fx\").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||\"toggle\"===i,i===(g?\"hide\":\"show\")){if(\"show\"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,\"display\")),\"none\"===(c=S.css(e,\"display\"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,\"display\"),le([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===S.css(e,\"float\")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l=\"none\"===c?\"\":c)),h.display=\"inline-block\")),n.overflow&&(h.overflow=\"hidden\",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?\"hidden\"in v&&(g=v.hidden):v=Y.access(e,\"fxshow\",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,\"fxshow\"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&\"object\"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,\"finish\"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return\"string\"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||\"fx\",[]),this.each(function(){var e=!0,t=null!=i&&i+\"queueHooks\",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||\"fx\"),this.each(function(){var e,t=Y.get(this),n=t[a+\"queue\"],r=t[a+\"queueHooks\"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each([\"toggle\",\"show\",\"hide\"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||\"boolean\"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt(\"show\"),slideUp:lt(\"hide\"),slideToggle:lt(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||\"fx\",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement(\"input\"),it=E.createElement(\"select\").appendChild(E.createElement(\"option\")),rt.type=\"checkbox\",y.checkOn=\"\"!==rt.value,y.optSelected=it.selected,(rt=E.createElement(\"input\")).value=\"t\",rt.type=\"radio\",y.radioValue=\"t\"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return\"undefined\"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):i&&\"get\"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&\"radio\"===t&&A(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(\" \")}function yt(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function mt(e){return Array.isArray(e)?e:\"string\"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,\"tabindex\");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&\" \"+vt(i)+\" \"){a=0;while(o=e[a++])r.indexOf(\" \"+o+\" \")<0&&(r+=o+\" \");i!==(s=vt(r))&&n.setAttribute(\"class\",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&\" \"+vt(i)+\" \"){a=0;while(o=e[a++])while(-1<r.indexOf(\" \"+o+\" \"))r=r.replace(\" \"+o+\" \",\" \");i!==(s=vt(r))&&n.setAttribute(\"class\",s)}return this},toggleClass:function(i,t){var o=typeof i,a=\"string\"===o||Array.isArray(i);return\"boolean\"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&\"boolean\"!==o||((e=yt(this))&&Y.set(this,\"__className__\",e),this.setAttribute&&this.setAttribute(\"class\",e||!1===i?\"\":Y.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;t=\" \"+e+\" \";while(n=this[r++])if(1===n.nodeType&&-1<(\" \"+vt(yt(n))+\" \").indexOf(t))return!0;return!1}});var xt=/\\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t=\"\":\"number\"==typeof t?t+=\"\":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?\"\":e+\"\"})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&\"set\"in r&&void 0!==r.set(this,t,\"value\")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&\"get\"in r&&void 0!==(e=r.get(t,\"value\"))?e:\"string\"==typeof(e=t.value)?e.replace(xt,\"\"):null==e?\"\":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,\"value\");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,\"optgroup\"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each([\"radio\",\"checkbox\"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})}),y.focusin=\"onfocusin\"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,\"type\")?e.type:e,h=v.call(e,\"namespace\")?e.namespace.split(\".\"):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(\".\")&&(d=(h=d.split(\".\")).shift(),h.sort()),u=d.indexOf(\":\")<0&&\"on\"+d,(e=e[S.expando]?e:new S.Event(d,\"object\"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join(\".\"),e.rnamespace=e.namespace?new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,\"events\")||Object.create(null))[e.type]&&Y.get(o,\"handle\"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:\"focusin\",blur:\"focusout\"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\\?/;S.parseXML=function(e){var t;if(!e||\"string\"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,\"text/xml\")}catch(e){t=void 0}return t&&!t.getElementsByTagName(\"parsererror\").length||S.error(\"Invalid XML: \"+e),t};var St=/\\[\\]$/,kt=/\\r?\\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+\"[\"+(\"object\"==typeof t&&null!=t?e:\"\")+\"]\",t,r,i)});else if(r||\"object\"!==w(e))i(n,e);else for(t in e)Dt(n+\"[\"+t+\"]\",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(null==e)return\"\";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join(\"&\")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,\"elements\");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(\":disabled\")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,\"\\r\\n\")}}):{name:t.name,value:n.replace(kt,\"\\r\\n\")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\\/\\//,Rt={},Mt={},It=\"*/\".concat(\"*\"),Wt=E.createElement(\"a\");function Ft(o){return function(e,t){\"string\"!=typeof e&&(t=e,e=\"*\");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])\"+\"===n[0]?(n=n.slice(1)||\"*\",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return\"string\"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s[\"*\"]&&l(\"*\")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:\"GET\",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":It,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){\"object\"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks(\"once memory\"),w=v.statusCode||{},a={},s={},u=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+\" \"]=(n[t[1].toLowerCase()+\" \"]||[]).concat(t[2])}t=n[e.toLowerCase()+\" \"]}return null==t?null:t.join(\", \")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+\"\").replace(Pt,Tt.protocol+\"//\"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||\"*\").toLowerCase().match(P)||[\"\"],null==v.crossDomain){r=E.createElement(\"a\");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+\"//\"+Wt.host!=r.protocol+\"//\"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&\"string\"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger(\"ajaxStart\"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,\"\"),v.hasContent?v.data&&v.processData&&0===(v.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(v.data=v.data.replace(jt,\"+\")):(o=v.url.slice(f.length),v.data&&(v.processData||\"string\"==typeof v.data)&&(f+=(Et.test(f)?\"&\":\"?\")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,\"$1\"),o=(Et.test(f)?\"&\":\"?\")+\"_=\"+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader(\"If-Modified-Since\",S.lastModified[f]),S.etag[f]&&T.setRequestHeader(\"If-None-Match\",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader(\"Content-Type\",v.contentType),T.setRequestHeader(\"Accept\",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+(\"*\"!==v.dataTypes[0]?\", \"+It+\"; q=0.01\":\"\"):v.accepts[\"*\"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u=\"abort\",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger(\"ajaxSend\",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort(\"timeout\")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,\"No Transport\");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||\"\",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray(\"script\",v.dataTypes)&&(v.converters[\"text script\"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(!(a=l[u+\" \"+o]||l[\"* \"+o]))for(i in l)if((s=i.split(\" \"))[1]===o&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader(\"Last-Modified\"))&&(S.lastModified[f]=u),(u=T.getResponseHeader(\"etag\"))&&(S.etag[f]=u)),204===e||\"HEAD\"===v.type?l=\"nocontent\":304===e?l=\"notmodified\":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l=\"error\",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+\"\",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?\"ajaxSuccess\":\"ajaxError\",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger(\"ajaxComplete\",[T,v]),--S.active||S.event.trigger(\"ajaxStop\")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,\"json\")},getScript:function(e,t){return S.get(e,void 0,t,\"script\")}}),S.each([\"get\",\"post\"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)\"content-type\"===t.toLowerCase()&&(e.contentType=e.headers[t]||\"\")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,converters:{\"text script\":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&\"withCredentials\"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e[\"X-Requested-With\"]||(e[\"X-Requested-With\"]=\"XMLHttpRequest\"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,\"abort\"===e?r.abort():\"error\"===e?\"number\"!=typeof r.status?t(0,\"error\"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,\"text\"!==(r.responseType||\"text\")||\"string\"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o(\"error\"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o(\"abort\");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),S.ajaxTransport(\"script\",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S(\"<script>\").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on(\"load error\",i=function(e){r.remove(),i=null,e&&t(\"error\"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\\?(?=&|$)|\\?\\?/;S.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Xt.pop()||S.expando+\"_\"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter(\"json jsonp\",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?\"url\":\"string\"==typeof e.data&&0===(e.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Vt.test(e.data)&&\"data\");if(a||\"jsonp\"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,\"$1\"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?\"&\":\"?\")+e.jsonp+\"=\"+r),e.converters[\"script json\"]=function(){return o||S.error(r+\" was not called\"),o[0]},e.dataTypes[0]=\"json\",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),\"script\"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument(\"\").body).innerHTML=\"<form></form><form></form>\",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return\"string\"!=typeof e?[]:(\"boolean\"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(i=\"POST\"),0<a.length&&S.ajax({url:e,type:i||\"GET\",dataType:\"html\",data:t}).done(function(e){o=arguments,a.html(r?S(\"<div>\").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,\"position\"),c=S(e),f={};\"static\"===l&&(e.style.position=\"relative\"),s=c.offset(),o=S.css(e,\"top\"),u=S.css(e,\"left\"),(\"absolute\"===l||\"fixed\"===l)&&-1<(o+u).indexOf(\"auto\")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),\"using\"in t?t.using.call(e,f):(\"number\"==typeof f.top&&(f.top+=\"px\"),\"number\"==typeof f.left&&(f.left+=\"px\"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===S.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===S.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,\"borderTopWidth\",!0),i.left+=S.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-S.css(r,\"marginTop\",!0),left:t.left-i.left-S.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===S.css(e,\"position\"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,i){var o=\"pageYOffset\"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each([\"top\",\"left\"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+\"px\":t})}),S.each({Height:\"height\",Width:\"width\"},function(a,s){S.each({padding:\"inner\"+a,content:s,\"\":\"outer\"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||\"boolean\"!=typeof e),i=r||(!0===e||!0===t?\"margin\":\"border\");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf(\"outer\")?e[\"inner\"+a]:e.document.documentElement[\"client\"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body[\"scroll\"+a],r[\"scroll\"+a],e.body[\"offset\"+a],r[\"offset\"+a],r[\"client\"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?\"\":(e+\"\").replace(Gt,\"\")},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},\"undefined\"==typeof e&&(C.jQuery=C.$=S),S});\n"
  },
  {
    "path": "docs/_static/language_data.js",
    "content": "/*\n * language_data.js\n * ~~~~~~~~~~~~~~~~\n *\n * This script contains the language-specific data used by searchtools.js,\n * namely the list of stopwords, stemmer, scorer and splitter.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\nvar stopwords = [\"a\",\"and\",\"are\",\"as\",\"at\",\"be\",\"but\",\"by\",\"for\",\"if\",\"in\",\"into\",\"is\",\"it\",\"near\",\"no\",\"not\",\"of\",\"on\",\"or\",\"such\",\"that\",\"the\",\"their\",\"then\",\"there\",\"these\",\"they\",\"this\",\"to\",\"was\",\"will\",\"with\"];\n\n\n/* Non-minified version JS is _stemmer.js if file is provided */ \n/**\n * Porter Stemmer\n */\nvar Stemmer = function() {\n\n  var step2list = {\n    ational: 'ate',\n    tional: 'tion',\n    enci: 'ence',\n    anci: 'ance',\n    izer: 'ize',\n    bli: 'ble',\n    alli: 'al',\n    entli: 'ent',\n    eli: 'e',\n    ousli: 'ous',\n    ization: 'ize',\n    ation: 'ate',\n    ator: 'ate',\n    alism: 'al',\n    iveness: 'ive',\n    fulness: 'ful',\n    ousness: 'ous',\n    aliti: 'al',\n    iviti: 'ive',\n    biliti: 'ble',\n    logi: 'log'\n  };\n\n  var step3list = {\n    icate: 'ic',\n    ative: '',\n    alize: 'al',\n    iciti: 'ic',\n    ical: 'ic',\n    ful: '',\n    ness: ''\n  };\n\n  var c = \"[^aeiou]\";          // consonant\n  var v = \"[aeiouy]\";          // vowel\n  var C = c + \"[^aeiouy]*\";    // consonant sequence\n  var V = v + \"[aeiou]*\";      // vowel sequence\n\n  var mgr0 = \"^(\" + C + \")?\" + V + C;                      // [C]VC... is m>0\n  var meq1 = \"^(\" + C + \")?\" + V + C + \"(\" + V + \")?$\";    // [C]VC[V] is m=1\n  var mgr1 = \"^(\" + C + \")?\" + V + C + V + C;              // [C]VCVC... is m>1\n  var s_v   = \"^(\" + C + \")?\" + v;                         // vowel in stem\n\n  this.stemWord = function (w) {\n    var stem;\n    var suffix;\n    var firstch;\n    var origword = w;\n\n    if (w.length < 3)\n      return w;\n\n    var re;\n    var re2;\n    var re3;\n    var re4;\n\n    firstch = w.substr(0,1);\n    if (firstch == \"y\")\n      w = firstch.toUpperCase() + w.substr(1);\n\n    // Step 1a\n    re = /^(.+?)(ss|i)es$/;\n    re2 = /^(.+?)([^s])s$/;\n\n    if (re.test(w))\n      w = w.replace(re,\"$1$2\");\n    else if (re2.test(w))\n      w = w.replace(re2,\"$1$2\");\n\n    // Step 1b\n    re = /^(.+?)eed$/;\n    re2 = /^(.+?)(ed|ing)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      re = new RegExp(mgr0);\n      if (re.test(fp[1])) {\n        re = /.$/;\n        w = w.replace(re,\"\");\n      }\n    }\n    else if (re2.test(w)) {\n      var fp = re2.exec(w);\n      stem = fp[1];\n      re2 = new RegExp(s_v);\n      if (re2.test(stem)) {\n        w = stem;\n        re2 = /(at|bl|iz)$/;\n        re3 = new RegExp(\"([^aeiouylsz])\\\\1$\");\n        re4 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n        if (re2.test(w))\n          w = w + \"e\";\n        else if (re3.test(w)) {\n          re = /.$/;\n          w = w.replace(re,\"\");\n        }\n        else if (re4.test(w))\n          w = w + \"e\";\n      }\n    }\n\n    // Step 1c\n    re = /^(.+?)y$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      re = new RegExp(s_v);\n      if (re.test(stem))\n        w = stem + \"i\";\n    }\n\n    // Step 2\n    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      suffix = fp[2];\n      re = new RegExp(mgr0);\n      if (re.test(stem))\n        w = stem + step2list[suffix];\n    }\n\n    // Step 3\n    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      suffix = fp[2];\n      re = new RegExp(mgr0);\n      if (re.test(stem))\n        w = stem + step3list[suffix];\n    }\n\n    // Step 4\n    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n    re2 = /^(.+?)(s|t)(ion)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      re = new RegExp(mgr1);\n      if (re.test(stem))\n        w = stem;\n    }\n    else if (re2.test(w)) {\n      var fp = re2.exec(w);\n      stem = fp[1] + fp[2];\n      re2 = new RegExp(mgr1);\n      if (re2.test(stem))\n        w = stem;\n    }\n\n    // Step 5\n    re = /^(.+?)e$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      re = new RegExp(mgr1);\n      re2 = new RegExp(meq1);\n      re3 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))\n        w = stem;\n    }\n    re = /ll$/;\n    re2 = new RegExp(mgr1);\n    if (re.test(w) && re2.test(w)) {\n      re = /.$/;\n      w = w.replace(re,\"\");\n    }\n\n    // and turn initial Y back to y\n    if (firstch == \"y\")\n      w = firstch.toLowerCase() + w.substr(1);\n    return w;\n  }\n}\n\n\n\n\n\nvar splitChars = (function() {\n    var result = {};\n    var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,\n         1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,\n         2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,\n         2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,\n         3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,\n         3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,\n         4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,\n         8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,\n         11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,\n         43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];\n    var i, j, start, end;\n    for (i = 0; i < singles.length; i++) {\n        result[singles[i]] = true;\n    }\n    var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],\n         [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],\n         [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],\n         [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],\n         [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],\n         [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],\n         [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],\n         [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],\n         [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],\n         [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],\n         [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],\n         [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],\n         [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],\n         [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],\n         [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],\n         [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],\n         [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],\n         [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],\n         [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],\n         [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],\n         [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],\n         [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],\n         [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],\n         [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],\n         [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],\n         [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],\n         [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],\n         [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],\n         [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],\n         [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],\n         [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],\n         [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],\n         [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],\n         [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],\n         [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],\n         [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],\n         [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],\n         [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],\n         [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],\n         [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],\n         [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],\n         [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],\n         [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],\n         [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],\n         [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],\n         [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],\n         [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],\n         [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],\n         [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];\n    for (i = 0; i < ranges.length; i++) {\n        start = ranges[i][0];\n        end = ranges[i][1];\n        for (j = start; j <= end; j++) {\n            result[j] = true;\n        }\n    }\n    return result;\n})();\n\nfunction splitQuery(query) {\n    var result = [];\n    var start = -1;\n    for (var i = 0; i < query.length; i++) {\n        if (splitChars[query.charCodeAt(i)]) {\n            if (start !== -1) {\n                result.push(query.slice(start, i));\n                start = -1;\n            }\n        } else if (start === -1) {\n            start = i;\n        }\n    }\n    if (start !== -1) {\n        result.push(query.slice(start));\n    }\n    return result;\n}\n\n\n"
  },
  {
    "path": "docs/_static/pygments.css",
    "content": "pre { line-height: 125%; }\ntd.linenos pre { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; }\nspan.linenos { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; }\ntd.linenos pre.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\nspan.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n.highlight .hll { background-color: #ffffcc }\n.highlight { background: #eeffcc; }\n.highlight .c { color: #408090; font-style: italic } /* Comment */\n.highlight .err { border: 1px solid #FF0000 } /* Error */\n.highlight .k { color: #007020; font-weight: bold } /* Keyword */\n.highlight .o { color: #666666 } /* Operator */\n.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */\n.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */\n.highlight .cp { color: #007020 } /* Comment.Preproc */\n.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */\n.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */\n.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */\n.highlight .gd { color: #A00000 } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #FF0000 } /* Generic.Error */\n.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.highlight .gi { color: #00A000 } /* Generic.Inserted */\n.highlight .go { color: #333333 } /* Generic.Output */\n.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.highlight .gt { color: #0044DD } /* Generic.Traceback */\n.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */\n.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */\n.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */\n.highlight .kp { color: #007020 } /* Keyword.Pseudo */\n.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */\n.highlight .kt { color: #902000 } /* Keyword.Type */\n.highlight .m { color: #208050 } /* Literal.Number */\n.highlight .s { color: #4070a0 } /* Literal.String */\n.highlight .na { color: #4070a0 } /* Name.Attribute */\n.highlight .nb { color: #007020 } /* Name.Builtin */\n.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */\n.highlight .no { color: #60add5 } /* Name.Constant */\n.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */\n.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */\n.highlight .ne { color: #007020 } /* Name.Exception */\n.highlight .nf { color: #06287e } /* Name.Function */\n.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */\n.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */\n.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */\n.highlight .nv { color: #bb60d5 } /* Name.Variable */\n.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */\n.highlight .w { color: #bbbbbb } /* Text.Whitespace */\n.highlight .mb { color: #208050 } /* Literal.Number.Bin */\n.highlight .mf { color: #208050 } /* Literal.Number.Float */\n.highlight .mh { color: #208050 } /* Literal.Number.Hex */\n.highlight .mi { color: #208050 } /* Literal.Number.Integer */\n.highlight .mo { color: #208050 } /* Literal.Number.Oct */\n.highlight .sa { color: #4070a0 } /* Literal.String.Affix */\n.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */\n.highlight .sc { color: #4070a0 } /* Literal.String.Char */\n.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */\n.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */\n.highlight .s2 { color: #4070a0 } /* Literal.String.Double */\n.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */\n.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */\n.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */\n.highlight .sx { color: #c65d09 } /* Literal.String.Other */\n.highlight .sr { color: #235388 } /* Literal.String.Regex */\n.highlight .s1 { color: #4070a0 } /* Literal.String.Single */\n.highlight .ss { color: #517918 } /* Literal.String.Symbol */\n.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #06287e } /* Name.Function.Magic */\n.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */\n.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */\n.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */\n.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */\n.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */"
  },
  {
    "path": "docs/_static/searchtools.js",
    "content": "/*\n * searchtools.js\n * ~~~~~~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for the full-text search.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\nif (!Scorer) {\n  /**\n   * Simple result scoring code.\n   */\n  var Scorer = {\n    // Implement the following function to further tweak the score for each result\n    // The function takes a result array [filename, title, anchor, descr, score]\n    // and returns the new score.\n    /*\n    score: function(result) {\n      return result[4];\n    },\n    */\n\n    // query matches the full name of an object\n    objNameMatch: 11,\n    // or matches in the last dotted part of the object name\n    objPartialMatch: 6,\n    // Additive scores depending on the priority of the object\n    objPrio: {0:  15,   // used to be importantResults\n              1:  5,   // used to be objectResults\n              2: -5},  // used to be unimportantResults\n    //  Used when the priority is not in the mapping.\n    objPrioDefault: 0,\n\n    // query found in title\n    title: 15,\n    partialTitle: 7,\n    // query found in terms\n    term: 5,\n    partialTerm: 2\n  };\n}\n\nif (!splitQuery) {\n  function splitQuery(query) {\n    return query.split(/\\s+/);\n  }\n}\n\n/**\n * Search Module\n */\nvar Search = {\n\n  _index : null,\n  _queued_query : null,\n  _pulse_status : -1,\n\n  htmlToText : function(htmlString) {\n      var virtualDocument = document.implementation.createHTMLDocument('virtual');\n      var htmlElement = $(htmlString, virtualDocument);\n      htmlElement.find('.headerlink').remove();\n      docContent = htmlElement.find('[role=main]')[0];\n      if(docContent === undefined) {\n          console.warn(\"Content block not found. Sphinx search tries to obtain it \" +\n                       \"via '[role=main]'. Could you check your theme or template.\");\n          return \"\";\n      }\n      return docContent.textContent || docContent.innerText;\n  },\n\n  init : function() {\n      var params = $.getQueryParameters();\n      if (params.q) {\n          var query = params.q[0];\n          $('input[name=\"q\"]')[0].value = query;\n          this.performSearch(query);\n      }\n  },\n\n  loadIndex : function(url) {\n    $.ajax({type: \"GET\", url: url, data: null,\n            dataType: \"script\", cache: true,\n            complete: function(jqxhr, textstatus) {\n              if (textstatus != \"success\") {\n                document.getElementById(\"searchindexloader\").src = url;\n              }\n            }});\n  },\n\n  setIndex : function(index) {\n    var q;\n    this._index = index;\n    if ((q = this._queued_query) !== null) {\n      this._queued_query = null;\n      Search.query(q);\n    }\n  },\n\n  hasIndex : function() {\n      return this._index !== null;\n  },\n\n  deferQuery : function(query) {\n      this._queued_query = query;\n  },\n\n  stopPulse : function() {\n      this._pulse_status = 0;\n  },\n\n  startPulse : function() {\n    if (this._pulse_status >= 0)\n        return;\n    function pulse() {\n      var i;\n      Search._pulse_status = (Search._pulse_status + 1) % 4;\n      var dotString = '';\n      for (i = 0; i < Search._pulse_status; i++)\n        dotString += '.';\n      Search.dots.text(dotString);\n      if (Search._pulse_status > -1)\n        window.setTimeout(pulse, 500);\n    }\n    pulse();\n  },\n\n  /**\n   * perform a search for something (or wait until index is loaded)\n   */\n  performSearch : function(query) {\n    // create the required interface elements\n    this.out = $('#search-results');\n    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);\n    this.dots = $('<span></span>').appendTo(this.title);\n    this.status = $('<p class=\"search-summary\">&nbsp;</p>').appendTo(this.out);\n    this.output = $('<ul class=\"search\"/>').appendTo(this.out);\n\n    $('#search-progress').text(_('Preparing search...'));\n    this.startPulse();\n\n    // index already loaded, the browser was quick!\n    if (this.hasIndex())\n      this.query(query);\n    else\n      this.deferQuery(query);\n  },\n\n  /**\n   * execute search (requires search index to be loaded)\n   */\n  query : function(query) {\n    var i;\n\n    // stem the searchterms and add them to the correct list\n    var stemmer = new Stemmer();\n    var searchterms = [];\n    var excluded = [];\n    var hlterms = [];\n    var tmp = splitQuery(query);\n    var objectterms = [];\n    for (i = 0; i < tmp.length; i++) {\n      if (tmp[i] !== \"\") {\n          objectterms.push(tmp[i].toLowerCase());\n      }\n\n      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === \"\") {\n        // skip this \"word\"\n        continue;\n      }\n      // stem the word\n      var word = stemmer.stemWord(tmp[i].toLowerCase());\n      // prevent stemmer from cutting word smaller than two chars\n      if(word.length < 3 && tmp[i].length >= 3) {\n        word = tmp[i];\n      }\n      var toAppend;\n      // select the correct list\n      if (word[0] == '-') {\n        toAppend = excluded;\n        word = word.substr(1);\n      }\n      else {\n        toAppend = searchterms;\n        hlterms.push(tmp[i].toLowerCase());\n      }\n      // only add if not already in the list\n      if (!$u.contains(toAppend, word))\n        toAppend.push(word);\n    }\n    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(\" \"));\n\n    // console.debug('SEARCH: searching for:');\n    // console.info('required: ', searchterms);\n    // console.info('excluded: ', excluded);\n\n    // prepare search\n    var terms = this._index.terms;\n    var titleterms = this._index.titleterms;\n\n    // array of [filename, title, anchor, descr, score]\n    var results = [];\n    $('#search-progress').empty();\n\n    // lookup as object\n    for (i = 0; i < objectterms.length; i++) {\n      var others = [].concat(objectterms.slice(0, i),\n                             objectterms.slice(i+1, objectterms.length));\n      results = results.concat(this.performObjectSearch(objectterms[i], others));\n    }\n\n    // lookup as search terms in fulltext\n    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));\n\n    // let the scorer override scores with a custom scoring function\n    if (Scorer.score) {\n      for (i = 0; i < results.length; i++)\n        results[i][4] = Scorer.score(results[i]);\n    }\n\n    // now sort the results by score (in opposite order of appearance, since the\n    // display function below uses pop() to retrieve items) and then\n    // alphabetically\n    results.sort(function(a, b) {\n      var left = a[4];\n      var right = b[4];\n      if (left > right) {\n        return 1;\n      } else if (left < right) {\n        return -1;\n      } else {\n        // same score: sort alphabetically\n        left = a[1].toLowerCase();\n        right = b[1].toLowerCase();\n        return (left > right) ? -1 : ((left < right) ? 1 : 0);\n      }\n    });\n\n    // for debugging\n    //Search.lastresults = results.slice();  // a copy\n    //console.info('search results:', Search.lastresults);\n\n    // print the results\n    var resultCount = results.length;\n    function displayNextItem() {\n      // results left, load the summary and display it\n      if (results.length) {\n        var item = results.pop();\n        var listItem = $('<li style=\"display:none\"></li>');\n        var requestUrl = \"\";\n        var linkUrl = \"\";\n        if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {\n          // dirhtml builder\n          var dirname = item[0] + '/';\n          if (dirname.match(/\\/index\\/$/)) {\n            dirname = dirname.substring(0, dirname.length-6);\n          } else if (dirname == 'index/') {\n            dirname = '';\n          }\n          requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;\n          linkUrl = requestUrl;\n\n        } else {\n          // normal html builders\n          requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;\n          linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;\n        }\n        listItem.append($('<a/>').attr('href',\n            linkUrl +\n            highlightstring + item[2]).html(item[1]));\n        if (item[3]) {\n          listItem.append($('<span> (' + item[3] + ')</span>'));\n          Search.output.append(listItem);\n          listItem.slideDown(5, function() {\n            displayNextItem();\n          });\n        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {\n          $.ajax({url: requestUrl,\n                  dataType: \"text\",\n                  complete: function(jqxhr, textstatus) {\n                    var data = jqxhr.responseText;\n                    if (data !== '' && data !== undefined) {\n                      listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));\n                    }\n                    Search.output.append(listItem);\n                    listItem.slideDown(5, function() {\n                      displayNextItem();\n                    });\n                  }});\n        } else {\n          // no source available, just display title\n          Search.output.append(listItem);\n          listItem.slideDown(5, function() {\n            displayNextItem();\n          });\n        }\n      }\n      // search finished, update title and status message\n      else {\n        Search.stopPulse();\n        Search.title.text(_('Search Results'));\n        if (!resultCount)\n          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\\'ve selected enough categories.'));\n        else\n            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));\n        Search.status.fadeIn(500);\n      }\n    }\n    displayNextItem();\n  },\n\n  /**\n   * search for object names\n   */\n  performObjectSearch : function(object, otherterms) {\n    var filenames = this._index.filenames;\n    var docnames = this._index.docnames;\n    var objects = this._index.objects;\n    var objnames = this._index.objnames;\n    var titles = this._index.titles;\n\n    var i;\n    var results = [];\n\n    for (var prefix in objects) {\n      for (var name in objects[prefix]) {\n        var fullname = (prefix ? prefix + '.' : '') + name;\n        var fullnameLower = fullname.toLowerCase()\n        if (fullnameLower.indexOf(object) > -1) {\n          var score = 0;\n          var parts = fullnameLower.split('.');\n          // check for different match types: exact matches of full name or\n          // \"last name\" (i.e. last dotted part)\n          if (fullnameLower == object || parts[parts.length - 1] == object) {\n            score += Scorer.objNameMatch;\n          // matches in last name\n          } else if (parts[parts.length - 1].indexOf(object) > -1) {\n            score += Scorer.objPartialMatch;\n          }\n          var match = objects[prefix][name];\n          var objname = objnames[match[1]][2];\n          var title = titles[match[0]];\n          // If more than one term searched for, we require other words to be\n          // found in the name/title/description\n          if (otherterms.length > 0) {\n            var haystack = (prefix + ' ' + name + ' ' +\n                            objname + ' ' + title).toLowerCase();\n            var allfound = true;\n            for (i = 0; i < otherterms.length; i++) {\n              if (haystack.indexOf(otherterms[i]) == -1) {\n                allfound = false;\n                break;\n              }\n            }\n            if (!allfound) {\n              continue;\n            }\n          }\n          var descr = objname + _(', in ') + title;\n\n          var anchor = match[3];\n          if (anchor === '')\n            anchor = fullname;\n          else if (anchor == '-')\n            anchor = objnames[match[1]][1] + '-' + fullname;\n          // add custom score for some objects according to scorer\n          if (Scorer.objPrio.hasOwnProperty(match[2])) {\n            score += Scorer.objPrio[match[2]];\n          } else {\n            score += Scorer.objPrioDefault;\n          }\n          results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);\n        }\n      }\n    }\n\n    return results;\n  },\n\n  /**\n   * search for full-text terms in the index\n   */\n  performTermsSearch : function(searchterms, excluded, terms, titleterms) {\n    var docnames = this._index.docnames;\n    var filenames = this._index.filenames;\n    var titles = this._index.titles;\n\n    var i, j, file;\n    var fileMap = {};\n    var scoreMap = {};\n    var results = [];\n\n    // perform the search on the required terms\n    for (i = 0; i < searchterms.length; i++) {\n      var word = searchterms[i];\n      var files = [];\n      var _o = [\n        {files: terms[word], score: Scorer.term},\n        {files: titleterms[word], score: Scorer.title}\n      ];\n      // add support for partial matches\n      if (word.length > 2) {\n        for (var w in terms) {\n          if (w.match(word) && !terms[word]) {\n            _o.push({files: terms[w], score: Scorer.partialTerm})\n          }\n        }\n        for (var w in titleterms) {\n          if (w.match(word) && !titleterms[word]) {\n              _o.push({files: titleterms[w], score: Scorer.partialTitle})\n          }\n        }\n      }\n\n      // no match but word was a required one\n      if ($u.every(_o, function(o){return o.files === undefined;})) {\n        break;\n      }\n      // found search word in contents\n      $u.each(_o, function(o) {\n        var _files = o.files;\n        if (_files === undefined)\n          return\n\n        if (_files.length === undefined)\n          _files = [_files];\n        files = files.concat(_files);\n\n        // set score for the word in each file to Scorer.term\n        for (j = 0; j < _files.length; j++) {\n          file = _files[j];\n          if (!(file in scoreMap))\n            scoreMap[file] = {};\n          scoreMap[file][word] = o.score;\n        }\n      });\n\n      // create the mapping\n      for (j = 0; j < files.length; j++) {\n        file = files[j];\n        if (file in fileMap && fileMap[file].indexOf(word) === -1)\n          fileMap[file].push(word);\n        else\n          fileMap[file] = [word];\n      }\n    }\n\n    // now check if the files don't contain excluded terms\n    for (file in fileMap) {\n      var valid = true;\n\n      // check if all requirements are matched\n      var filteredTermCount = // as search terms with length < 3 are discarded: ignore\n        searchterms.filter(function(term){return term.length > 2}).length\n      if (\n        fileMap[file].length != searchterms.length &&\n        fileMap[file].length != filteredTermCount\n      ) continue;\n\n      // ensure that none of the excluded terms is in the search result\n      for (i = 0; i < excluded.length; i++) {\n        if (terms[excluded[i]] == file ||\n            titleterms[excluded[i]] == file ||\n            $u.contains(terms[excluded[i]] || [], file) ||\n            $u.contains(titleterms[excluded[i]] || [], file)) {\n          valid = false;\n          break;\n        }\n      }\n\n      // if we have still a valid result we can add it to the result list\n      if (valid) {\n        // select one (max) score for the file.\n        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...\n        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));\n        results.push([docnames[file], titles[file], '', null, score, filenames[file]]);\n      }\n    }\n    return results;\n  },\n\n  /**\n   * helper function to return a node containing the\n   * search summary for a given text. keywords is a list\n   * of stemmed words, hlwords is the list of normal, unstemmed\n   * words. the first one is used to find the occurrence, the\n   * latter for highlighting it.\n   */\n  makeSearchSummary : function(htmlText, keywords, hlwords) {\n    var text = Search.htmlToText(htmlText);\n    var textLower = text.toLowerCase();\n    var start = 0;\n    $.each(keywords, function() {\n      var i = textLower.indexOf(this.toLowerCase());\n      if (i > -1)\n        start = i;\n    });\n    start = Math.max(start - 120, 0);\n    var excerpt = ((start > 0) ? '...' : '') +\n      $.trim(text.substr(start, 240)) +\n      ((start + 240 - text.length) ? '...' : '');\n    var rv = $('<div class=\"context\"></div>').text(excerpt);\n    $.each(hlwords, function() {\n      rv = rv.highlightText(this, 'highlighted');\n    });\n    return rv;\n  }\n};\n\n$(document).ready(function() {\n  Search.init();\n});\n"
  },
  {
    "path": "docs/_static/underscore-1.3.1.js",
    "content": "//     Underscore.js 1.3.1\n//     (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.\n//     Underscore is freely distributable under the MIT license.\n//     Portions of Underscore are inspired or borrowed from Prototype,\n//     Oliver Steele's Functional, and John Resig's Micro-Templating.\n//     For all details and documentation:\n//     http://documentcloud.github.com/underscore\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `global` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Establish the object that gets returned to break out of a loop iteration.\n  var breaker = {};\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var slice            = ArrayProto.slice,\n      unshift          = ArrayProto.unshift,\n      toString         = ObjProto.toString,\n      hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeForEach      = ArrayProto.forEach,\n    nativeMap          = ArrayProto.map,\n    nativeReduce       = ArrayProto.reduce,\n    nativeReduceRight  = ArrayProto.reduceRight,\n    nativeFilter       = ArrayProto.filter,\n    nativeEvery        = ArrayProto.every,\n    nativeSome         = ArrayProto.some,\n    nativeIndexOf      = ArrayProto.indexOf,\n    nativeLastIndexOf  = ArrayProto.lastIndexOf,\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind;\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) { return new wrapper(obj); };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object via a string identifier,\n  // for Closure Compiler \"advanced\" mode.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root['_'] = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.3.1';\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles objects with the built-in `forEach`, arrays, and raw objects.\n  // Delegates to **ECMAScript 5**'s native `forEach` if available.\n  var each = _.each = _.forEach = function(obj, iterator, context) {\n    if (obj == null) return;\n    if (nativeForEach && obj.forEach === nativeForEach) {\n      obj.forEach(iterator, context);\n    } else if (obj.length === +obj.length) {\n      for (var i = 0, l = obj.length; i < l; i++) {\n        if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;\n      }\n    } else {\n      for (var key in obj) {\n        if (_.has(obj, key)) {\n          if (iterator.call(context, obj[key], key, obj) === breaker) return;\n        }\n      }\n    }\n  };\n\n  // Return the results of applying the iterator to each element.\n  // Delegates to **ECMAScript 5**'s native `map` if available.\n  _.map = _.collect = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n    each(obj, function(value, index, list) {\n      results[results.length] = iterator.call(context, value, index, list);\n    });\n    if (obj.length === +obj.length) results.length = obj.length;\n    return results;\n  };\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.\n  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduce && obj.reduce === nativeReduce) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n    }\n    each(obj, function(value, index, list) {\n      if (!initial) {\n        memo = value;\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, value, index, list);\n      }\n    });\n    if (!initial) throw new TypeError('Reduce of empty array with no initial value');\n    return memo;\n  };\n\n  // The right-associative version of reduce, also known as `foldr`.\n  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\n  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n    }\n    var reversed = _.toArray(obj).reverse();\n    if (context && !initial) iterator = _.bind(iterator, context);\n    return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);\n  };\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, iterator, context) {\n    var result;\n    any(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) {\n        result = value;\n        return true;\n      }\n    });\n    return result;\n  };\n\n  // Return all the elements that pass a truth test.\n  // Delegates to **ECMAScript 5**'s native `filter` if available.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n    each(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    each(obj, function(value, index, list) {\n      if (!iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Delegates to **ECMAScript 5**'s native `every` if available.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, iterator, context) {\n    var result = true;\n    if (obj == null) return result;\n    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\n    each(obj, function(value, index, list) {\n      if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n    });\n    return result;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Delegates to **ECMAScript 5**'s native `some` if available.\n  // Aliased as `any`.\n  var any = _.some = _.any = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = false;\n    if (obj == null) return result;\n    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n    each(obj, function(value, index, list) {\n      if (result || (result = iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if a given value is included in the array or object using `===`.\n  // Aliased as `contains`.\n  _.include = _.contains = function(obj, target) {\n    var found = false;\n    if (obj == null) return found;\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n    found = any(obj, function(value) {\n      return value === target;\n    });\n    return found;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    return _.map(obj, function(value) {\n      return (_.isFunction(method) ? method || value : value[method]).apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, function(value){ return value[key]; });\n  };\n\n  // Return the maximum element or (element-based computation).\n  _.max = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);\n    if (!iterator && _.isEmpty(obj)) return -Infinity;\n    var result = {computed : -Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed >= result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);\n    if (!iterator && _.isEmpty(obj)) return Infinity;\n    var result = {computed : Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed < result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Shuffle an array.\n  _.shuffle = function(obj) {\n    var shuffled = [], rand;\n    each(obj, function(value, index, list) {\n      if (index == 0) {\n        shuffled[0] = value;\n      } else {\n        rand = Math.floor(Math.random() * (index + 1));\n        shuffled[index] = shuffled[rand];\n        shuffled[rand] = value;\n      }\n    });\n    return shuffled;\n  };\n\n  // Sort the object's values by a criterion produced by an iterator.\n  _.sortBy = function(obj, iterator, context) {\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value : value,\n        criteria : iterator.call(context, value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria, b = right.criteria;\n      return a < b ? -1 : a > b ? 1 : 0;\n    }), 'value');\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = function(obj, val) {\n    var result = {};\n    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };\n    each(obj, function(value, index) {\n      var key = iterator(value, index);\n      (result[key] || (result[key] = [])).push(value);\n    });\n    return result;\n  };\n\n  // Use a comparator function to figure out at what index an object should\n  // be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iterator) {\n    iterator || (iterator = _.identity);\n    var low = 0, high = array.length;\n    while (low < high) {\n      var mid = (low + high) >> 1;\n      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;\n    }\n    return low;\n  };\n\n  // Safely convert anything iterable into a real, live array.\n  _.toArray = function(iterable) {\n    if (!iterable)                return [];\n    if (iterable.toArray)         return iterable.toArray();\n    if (_.isArray(iterable))      return slice.call(iterable);\n    if (_.isArguments(iterable))  return slice.call(iterable);\n    return _.values(iterable);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    return _.toArray(obj).length;\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head`. The **guard** check allows it to work\n  // with `_.map`.\n  _.first = _.head = function(array, n, guard) {\n    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];\n  };\n\n  // Returns everything but the last entry of the array. Especcialy useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N. The **guard** check allows it to work with\n  // `_.map`.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  _.last = function(array, n, guard) {\n    if ((n != null) && !guard) {\n      return slice.call(array, Math.max(array.length - n, 0));\n    } else {\n      return array[array.length - 1];\n    }\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail`.\n  // Especially useful on the arguments object. Passing an **index** will return\n  // the rest of the values in the array from that index onward. The **guard**\n  // check allows it to work with `_.map`.\n  _.rest = _.tail = function(array, index, guard) {\n    return slice.call(array, (index == null) || guard ? 1 : index);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, function(value){ return !!value; });\n  };\n\n  // Return a completely flattened version of an array.\n  _.flatten = function(array, shallow) {\n    return _.reduce(array, function(memo, value) {\n      if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));\n      memo[memo.length] = value;\n      return memo;\n    }, []);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iterator) {\n    var initial = iterator ? _.map(array, iterator) : array;\n    var result = [];\n    _.reduce(initial, function(memo, el, i) {\n      if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {\n        memo[memo.length] = el;\n        result[result.length] = array[i];\n      }\n      return memo;\n    }, []);\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(_.flatten(arguments, true));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays. (Aliased as \"intersect\" for back-compat.)\n  _.intersection = _.intersect = function(array) {\n    var rest = slice.call(arguments, 1);\n    return _.filter(_.uniq(array), function(item) {\n      return _.every(rest, function(other) {\n        return _.indexOf(other, item) >= 0;\n      });\n    });\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = _.flatten(slice.call(arguments, 1));\n    return _.filter(array, function(value){ return !_.include(rest, value); });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    var args = slice.call(arguments);\n    var length = _.max(_.pluck(args, 'length'));\n    var results = new Array(length);\n    for (var i = 0; i < length; i++) results[i] = _.pluck(args, \"\" + i);\n    return results;\n  };\n\n  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\n  // we need this function. Return the position of the first occurrence of an\n  // item in an array, or -1 if the item is not included in the array.\n  // Delegates to **ECMAScript 5**'s native `indexOf` if available.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = function(array, item, isSorted) {\n    if (array == null) return -1;\n    var i, l;\n    if (isSorted) {\n      i = _.sortedIndex(array, item);\n      return array[i] === item ? i : -1;\n    }\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);\n    for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;\n    return -1;\n  };\n\n  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\n  _.lastIndexOf = function(array, item) {\n    if (array == null) return -1;\n    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);\n    var i = array.length;\n    while (i--) if (i in array && array[i] === item) return i;\n    return -1;\n  };\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (arguments.length <= 1) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = arguments[2] || 1;\n\n    var len = Math.max(Math.ceil((stop - start) / step), 0);\n    var idx = 0;\n    var range = new Array(len);\n\n    while(idx < len) {\n      range[idx++] = start;\n      start += step;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Reusable constructor function for prototype setting.\n  var ctor = function(){};\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Binding with arguments is also known as `curry`.\n  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.\n  // We check for `func.bind` first, to fail fast when `func` is undefined.\n  _.bind = function bind(func, context) {\n    var bound, args;\n    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError;\n    args = slice.call(arguments, 2);\n    return bound = function() {\n      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));\n      ctor.prototype = func.prototype;\n      var self = new ctor;\n      var result = func.apply(self, args.concat(slice.call(arguments)));\n      if (Object(result) === result) return result;\n      return self;\n    };\n  };\n\n  // Bind all of an object's methods to that object. Useful for ensuring that\n  // all callbacks defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var funcs = slice.call(arguments, 1);\n    if (funcs.length == 0) funcs = _.functions(obj);\n    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memo = {};\n    hasher || (hasher = _.identity);\n    return function() {\n      var key = hasher.apply(this, arguments);\n      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n    };\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){ return func.apply(func, args); }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = function(func) {\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n  };\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time.\n  _.throttle = function(func, wait) {\n    var context, args, timeout, throttling, more;\n    var whenDone = _.debounce(function(){ more = throttling = false; }, wait);\n    return function() {\n      context = this; args = arguments;\n      var later = function() {\n        timeout = null;\n        if (more) func.apply(context, args);\n        whenDone();\n      };\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (throttling) {\n        more = true;\n      } else {\n        func.apply(context, args);\n      }\n      whenDone();\n      throttling = true;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds.\n  _.debounce = function(func, wait) {\n    var timeout;\n    return function() {\n      var context = this, args = arguments;\n      var later = function() {\n        timeout = null;\n        func.apply(context, args);\n      };\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = function(func) {\n    var ran = false, memo;\n    return function() {\n      if (ran) return memo;\n      ran = true;\n      return memo = func.apply(this, arguments);\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return function() {\n      var args = [func].concat(slice.call(arguments, 0));\n      return wrapper.apply(this, args);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var funcs = arguments;\n    return function() {\n      var args = arguments;\n      for (var i = funcs.length - 1; i >= 0; i--) {\n        args = [funcs[i].apply(this, args)];\n      }\n      return args[0];\n    };\n  };\n\n  // Returns a function that will only be executed after being called N times.\n  _.after = function(times, func) {\n    if (times <= 0) return func();\n    return function() {\n      if (--times < 1) { return func.apply(this, arguments); }\n    };\n  };\n\n  // Object Functions\n  // ----------------\n\n  // Retrieve the names of an object's properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = nativeKeys || function(obj) {\n    if (obj !== Object(obj)) throw new TypeError('Invalid object');\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    return _.map(obj, _.identity);\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    });\n    return obj;\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      for (var prop in source) {\n        if (obj[prop] == null) obj[prop] = source[prop];\n      }\n    });\n    return obj;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Internal recursive comparison function.\n  function eq(a, b, stack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.\n    if (a === b) return a !== 0 || 1 / a == 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a._chain) a = a._wrapped;\n    if (b._chain) b = b._wrapped;\n    // Invoke a custom `isEqual` method if one is provided.\n    if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);\n    if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className != toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, dates, and booleans are compared by value.\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return a == String(b);\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\n        // other numeric values.\n        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a == +b;\n      // RegExps are compared by their source patterns and flags.\n      case '[object RegExp]':\n        return a.source == b.source &&\n               a.global == b.global &&\n               a.multiline == b.multiline &&\n               a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != 'object' || typeof b != 'object') return false;\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n    var length = stack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (stack[length] == a) return true;\n    }\n    // Add the first object to the stack of traversed objects.\n    stack.push(a);\n    var size = 0, result = true;\n    // Recursively compare objects and arrays.\n    if (className == '[object Array]') {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      size = a.length;\n      result = size == b.length;\n      if (result) {\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (size--) {\n          // Ensure commutative equality for sparse arrays.\n          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;\n        }\n      }\n    } else {\n      // Objects with different constructors are not equivalent.\n      if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;\n      // Deep compare objects.\n      for (var key in a) {\n        if (_.has(a, key)) {\n          // Count the expected number of properties.\n          size++;\n          // Deep compare each member.\n          if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;\n        }\n      }\n      // Ensure that both objects contain the same number of properties.\n      if (result) {\n        for (key in b) {\n          if (_.has(b, key) && !(size--)) break;\n        }\n        result = !size;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    stack.pop();\n    return result;\n  }\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b, []);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n    for (var key in obj) if (_.has(obj, key)) return false;\n    return true;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType == 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) == '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    return obj === Object(obj);\n  };\n\n  // Is a given variable an arguments object?\n  _.isArguments = function(obj) {\n    return toString.call(obj) == '[object Arguments]';\n  };\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return !!(obj && _.has(obj, 'callee'));\n    };\n  }\n\n  // Is a given value a function?\n  _.isFunction = function(obj) {\n    return toString.call(obj) == '[object Function]';\n  };\n\n  // Is a given value a string?\n  _.isString = function(obj) {\n    return toString.call(obj) == '[object String]';\n  };\n\n  // Is a given value a number?\n  _.isNumber = function(obj) {\n    return toString.call(obj) == '[object Number]';\n  };\n\n  // Is the given value `NaN`?\n  _.isNaN = function(obj) {\n    // `NaN` is the only value for which `===` is not reflexive.\n    return obj !== obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n  };\n\n  // Is a given value a date?\n  _.isDate = function(obj) {\n    return toString.call(obj) == '[object Date]';\n  };\n\n  // Is the given value a regular expression?\n  _.isRegExp = function(obj) {\n    return toString.call(obj) == '[object RegExp]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Has own property?\n  _.has = function(obj, key) {\n    return hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iterators.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Run a function **n** times.\n  _.times = function (n, iterator, context) {\n    for (var i = 0; i < n; i++) iterator.call(context, i);\n  };\n\n  // Escape a string for HTML interpolation.\n  _.escape = function(string) {\n    return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\\//g,'&#x2F;');\n  };\n\n  // Add your own custom functions to the Underscore object, ensuring that\n  // they're correctly added to the OOP wrapper as well.\n  _.mixin = function(obj) {\n    each(_.functions(obj), function(name){\n      addToWrapper(name, _[name] = obj[name]);\n    });\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = idCounter++;\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /.^/;\n\n  // Within an interpolation, evaluation, or escaping, remove HTML escaping\n  // that had been previously added.\n  var unescape = function(code) {\n    return code.replace(/\\\\\\\\/g, '\\\\').replace(/\\\\'/g, \"'\");\n  };\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  _.template = function(str, data) {\n    var c  = _.templateSettings;\n    var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +\n      'with(obj||{}){__p.push(\\'' +\n      str.replace(/\\\\/g, '\\\\\\\\')\n         .replace(/'/g, \"\\\\'\")\n         .replace(c.escape || noMatch, function(match, code) {\n           return \"',_.escape(\" + unescape(code) + \"),'\";\n         })\n         .replace(c.interpolate || noMatch, function(match, code) {\n           return \"',\" + unescape(code) + \",'\";\n         })\n         .replace(c.evaluate || noMatch, function(match, code) {\n           return \"');\" + unescape(code).replace(/[\\r\\n\\t]/g, ' ') + \";__p.push('\";\n         })\n         .replace(/\\r/g, '\\\\r')\n         .replace(/\\n/g, '\\\\n')\n         .replace(/\\t/g, '\\\\t')\n         + \"');}return __p.join('');\";\n    var func = new Function('obj', '_', tmpl);\n    if (data) return func(data, _);\n    return function(data) {\n      return func.call(this, data, _);\n    };\n  };\n\n  // Add a \"chain\" function, which will delegate to the wrapper.\n  _.chain = function(obj) {\n    return _(obj).chain();\n  };\n\n  // The OOP Wrapper\n  // ---------------\n\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n  var wrapper = function(obj) { this._wrapped = obj; };\n\n  // Expose `wrapper.prototype` as `_.prototype`\n  _.prototype = wrapper.prototype;\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(obj, chain) {\n    return chain ? _(obj).chain() : obj;\n  };\n\n  // A method to easily add functions to the OOP wrapper.\n  var addToWrapper = function(name, func) {\n    wrapper.prototype[name] = function() {\n      var args = slice.call(arguments);\n      unshift.call(args, this._wrapped);\n      return result(func.apply(_, args), this._chain);\n    };\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    wrapper.prototype[name] = function() {\n      var wrapped = this._wrapped;\n      method.apply(wrapped, arguments);\n      var length = wrapped.length;\n      if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];\n      return result(wrapped, this._chain);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    wrapper.prototype[name] = function() {\n      return result(method.apply(this._wrapped, arguments), this._chain);\n    };\n  });\n\n  // Start chaining a wrapped Underscore object.\n  wrapper.prototype.chain = function() {\n    this._chain = true;\n    return this;\n  };\n\n  // Extracts the result from a wrapped and chained object.\n  wrapper.prototype.value = function() {\n    return this._wrapped;\n  };\n\n}).call(this);\n"
  },
  {
    "path": "docs/_static/underscore.js",
    "content": "// Underscore.js 1.3.1\n// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.\n// Underscore is freely distributable under the MIT license.\n// Portions of Underscore are inspired or borrowed from Prototype,\n// Oliver Steele's Functional, and John Resig's Micro-Templating.\n// For all details and documentation:\n// http://documentcloud.github.com/underscore\n(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case \"[object String]\":return a==String(c);case \"[object Number]\":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case \"[object Date]\":case \"[object Boolean]\":return+a==+c;case \"[object RegExp]\":return a.source==\nc.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!=\"object\"||typeof c!=\"object\")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e==\"[object Array]\"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if(\"constructor\"in a!=\"constructor\"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,\nh)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!==\"undefined\"){if(typeof module!==\"undefined\"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION=\"1.3.1\";var j=b.each=\nb.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==\nnull&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError(\"Reduce of empty array with no initial value\");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=\nfunction(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=\ne&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=\nfunction(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});\nreturn e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),\"value\")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,\nc,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=\nb.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);\nreturn e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,\"length\")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,\"\"+e);return d};b.indexOf=function(a,c,\nd){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};\nvar F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,\nc){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:\na.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};\nb.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError(\"Invalid object\");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,\n1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)==\"[object Array]\"};b.isObject=function(a){return a===Object(a)};\nb.isArguments=function(a){return l.call(a)==\"[object Arguments]\"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,\"callee\"))};b.isFunction=function(a){return l.call(a)==\"[object Function]\"};b.isString=function(a){return l.call(a)==\"[object String]\"};b.isNumber=function(a){return l.call(a)==\"[object Number]\"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)==\"[object Boolean]\"};b.isDate=function(a){return l.call(a)==\"[object Date]\"};\nb.isRegExp=function(a){return l.call(a)==\"[object RegExp]\"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(\"\"+a).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#x27;\").replace(/\\//g,\"&#x2F;\")};b.mixin=function(a){j(b.functions(a),\nfunction(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\\s\\S]+?)%>/g,interpolate:/<%=([\\s\\S]+?)%>/g,escape:/<%-([\\s\\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\\\\\/g,\"\\\\\").replace(/\\\\'/g,\"'\")};b.template=function(a,c){var d=b.templateSettings,d=\"var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('\"+a.replace(/\\\\/g,\"\\\\\\\\\").replace(/'/g,\"\\\\'\").replace(d.escape||t,function(a,b){return\"',_.escape(\"+\nu(b)+\"),'\"}).replace(d.interpolate||t,function(a,b){return\"',\"+u(b)+\",'\"}).replace(d.evaluate||t,function(a,b){return\"');\"+u(b).replace(/[\\r\\n\\t]/g,\" \")+\";__p.push('\"}).replace(/\\r/g,\"\\\\r\").replace(/\\n/g,\"\\\\n\").replace(/\\t/g,\"\\\\t\")+\"');}return __p.join('');\",e=new Function(\"obj\",\"_\",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=\nfunction(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j(\"pop,push,reverse,shift,sort,splice,unshift\".split(\",\"),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a==\"shift\"||a==\"splice\")&&e===0&&delete d[0];return v(d,this._chain)}});j([\"concat\",\"join\",\"slice\"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=\ntrue;return this};m.prototype.value=function(){return this._wrapped}}).call(this);\n"
  },
  {
    "path": "docs/genindex.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Index &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"#\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n\n<h1 id=\"index\">Index</h1>\n\n<div class=\"genindex-jumpbox\">\n <a href=\"#A\"><strong>A</strong></a>\n | <a href=\"#B\"><strong>B</strong></a>\n | <a href=\"#C\"><strong>C</strong></a>\n | <a href=\"#D\"><strong>D</strong></a>\n | <a href=\"#E\"><strong>E</strong></a>\n | <a href=\"#F\"><strong>F</strong></a>\n | <a href=\"#G\"><strong>G</strong></a>\n | <a href=\"#H\"><strong>H</strong></a>\n | <a href=\"#L\"><strong>L</strong></a>\n | <a href=\"#M\"><strong>M</strong></a>\n | <a href=\"#N\"><strong>N</strong></a>\n | <a href=\"#O\"><strong>O</strong></a>\n | <a href=\"#P\"><strong>P</strong></a>\n | <a href=\"#R\"><strong>R</strong></a>\n | <a href=\"#S\"><strong>S</strong></a>\n | <a href=\"#V\"><strong>V</strong></a>\n | <a href=\"#W\"><strong>W</strong></a>\n | <a href=\"#X\"><strong>X</strong></a>\n \n</div>\n<h2 id=\"A\">A</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ABCMeta\">ABCMeta (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack\">Attack (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence.attack\">attack() (cleverhans.attacks.MaxConfidence method)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence.attack_class\">attack_class() (cleverhans.attacks.MaxConfidence method)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.attack_single_step\">attack_single_step() (cleverhans.attacks.FastFeatureAdversaries method)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"B\">B</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.BasicIterativeMethod\">BasicIterativeMethod (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.BoundaryAttackPlusPlus\">BoundaryAttackPlusPlus() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"C\">C</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.CallableModelWrapper\">CallableModelWrapper (class in cleverhans.attacks)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.CallableModelWrapper\">(class in cleverhans.model)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.CarliniWagnerL2\">CarliniWagnerL2 (class in cleverhans.attacks)</a>\n</li>\n      <li>\n    cleverhans.attacks\n\n      <ul>\n        <li><a href=\"source/attacks.html#module-cleverhans.attacks\">module</a>\n</li>\n      </ul></li>\n      <li>\n    cleverhans.devtools\n\n      <ul>\n        <li><a href=\"source/devtools.html#module-cleverhans.devtools\">module</a>, <a href=\"source/future.html#module-cleverhans.devtools\">[1]</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li>\n    cleverhans.model\n\n      <ul>\n        <li><a href=\"source/model.html#module-cleverhans.model\">module</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.clip_eta\">clip_eta() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.construct_graph\">construct_graph() (cleverhans.attacks.Attack method)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.construct_variables\">construct_variables() (cleverhans.attacks.Attack method)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"D\">D</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.DeepFool\">DeepFool (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.DEFAULT_DELTA\">DEFAULT_DELTA (cleverhans.attacks.SPSA attribute)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.DEFAULT_LEARNING_RATE\">DEFAULT_LEARNING_RATE (cleverhans.attacks.SPSA attribute)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.DEFAULT_SPSA_ITERS\">DEFAULT_SPSA_ITERS (cleverhans.attacks.SPSA attribute)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.DEFAULT_SPSA_SAMPLES\">DEFAULT_SPSA_SAMPLES (cleverhans.attacks.SPSA attribute)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"E\">E</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ElasticNetMethod\">ElasticNetMethod (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"F\">F</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.FastFeatureAdversaries\">FastFeatureAdversaries (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.FastGradientMethod\">FastGradientMethod (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.fgm\">fgm() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.FGM_CLASS\">FGM_CLASS (cleverhans.attacks.ProjectedGradientDescent attribute)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.CallableModelWrapper.fprop\">fprop() (cleverhans.attacks.CallableModelWrapper method)</a>\n\n      <ul>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.Model.fprop\">(cleverhans.attacks.Model method)</a>\n</li>\n        <li><a href=\"source/model.html#cleverhans.model.CallableModelWrapper.fprop\">(cleverhans.model.CallableModelWrapper method)</a>\n</li>\n        <li><a href=\"source/model.html#cleverhans.model.Model.fprop\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"G\">G</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.generate\">generate() (cleverhans.attacks.Attack method)</a>\n\n      <ul>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.CarliniWagnerL2.generate\">(cleverhans.attacks.CarliniWagnerL2 method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.DeepFool.generate\">(cleverhans.attacks.DeepFool method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.ElasticNetMethod.generate\">(cleverhans.attacks.ElasticNetMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.generate\">(cleverhans.attacks.FastFeatureAdversaries method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.FastGradientMethod.generate\">(cleverhans.attacks.FastGradientMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.generate\">(cleverhans.attacks.HopSkipJumpAttack method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.LBFGS.generate\">(cleverhans.attacks.LBFGS method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence.generate\">(cleverhans.attacks.MaxConfidence method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.MomentumIterativeMethod.generate\">(cleverhans.attacks.MomentumIterativeMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.Noise.generate\">(cleverhans.attacks.Noise method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.generate\">(cleverhans.attacks.ProjectedGradientDescent method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SaliencyMapMethod.generate\">(cleverhans.attacks.SaliencyMapMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.Semantic.generate\">(cleverhans.attacks.Semantic method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SparseL1Descent.generate\">(cleverhans.attacks.SparseL1Descent method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SpatialTransformationMethod.generate\">(cleverhans.attacks.SpatialTransformationMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.generate\">(cleverhans.attacks.SPSA method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod.generate\">(cleverhans.attacks.VirtualAdversarialMethod method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.generate_np\">generate_np() (cleverhans.attacks.Attack method)</a>\n\n      <ul>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.generate_np\">(cleverhans.attacks.HopSkipJumpAttack method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA.generate_np\">(cleverhans.attacks.SPSA method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_layer\">get_layer() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_layer\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_layer_names\">get_layer_names() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_layer_names\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_logits\">get_logits() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_logits\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.get_or_guess_labels\">get_or_guess_labels() (cleverhans.attacks.Attack method)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_params\">get_params() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_params\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_predicted_class\">get_predicted_class() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_predicted_class\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.get_probs\">get_probs() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.get_probs\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"H\">H</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.HopSkipJumpAttack\">HopSkipJumpAttack (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"L\">L</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.LBFGS\">LBFGS (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"M\">M</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MadryEtAl\">MadryEtAl (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.make_input_placeholder\">make_input_placeholder() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.make_input_placeholder\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.make_label_placeholder\">make_label_placeholder() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.make_label_placeholder\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.make_params\">make_params() (cleverhans.attacks.Model method)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.make_params\">(cleverhans.model.Model method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence\">MaxConfidence (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model\">Model (class in cleverhans.attacks)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model\">(class in cleverhans.model)</a>\n</li>\n      </ul></li>\n      <li>\n    module\n\n      <ul>\n        <li><a href=\"source/attacks.html#module-cleverhans.attacks\">cleverhans.attacks</a>\n</li>\n        <li><a href=\"source/devtools.html#module-cleverhans.devtools\">cleverhans.devtools</a>, <a href=\"source/future.html#module-cleverhans.devtools\">[1]</a>\n</li>\n        <li><a href=\"source/model.html#module-cleverhans.model\">cleverhans.model</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.MomentumIterativeMethod\">MomentumIterativeMethod (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"N\">N</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Noise\">Noise (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/model.html#cleverhans.model.NoSuchLayerError\">NoSuchLayerError</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"O\">O</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.O_FEATURES\">O_FEATURES (cleverhans.attacks.Model attribute)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.O_FEATURES\">(cleverhans.model.Model attribute)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.O_LOGITS\">O_LOGITS (cleverhans.attacks.Model attribute)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.O_LOGITS\">(cleverhans.model.Model attribute)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Model.O_PROBS\">O_PROBS (cleverhans.attacks.Model attribute)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.Model.O_PROBS\">(cleverhans.model.Model attribute)</a>\n</li>\n      </ul></li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.optimize_linear\">optimize_linear() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"P\">P</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Attack.parse_params\">parse_params() (cleverhans.attacks.Attack method)</a>\n\n      <ul>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.CarliniWagnerL2.parse_params\">(cleverhans.attacks.CarliniWagnerL2 method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.DeepFool.parse_params\">(cleverhans.attacks.DeepFool method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.ElasticNetMethod.parse_params\">(cleverhans.attacks.ElasticNetMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.FastFeatureAdversaries.parse_params\">(cleverhans.attacks.FastFeatureAdversaries method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.FastGradientMethod.parse_params\">(cleverhans.attacks.FastGradientMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.HopSkipJumpAttack.parse_params\">(cleverhans.attacks.HopSkipJumpAttack method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.LBFGS.parse_params\">(cleverhans.attacks.LBFGS method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.MaxConfidence.parse_params\">(cleverhans.attacks.MaxConfidence method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.MomentumIterativeMethod.parse_params\">(cleverhans.attacks.MomentumIterativeMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.Noise.parse_params\">(cleverhans.attacks.Noise method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.ProjectedGradientDescent.parse_params\">(cleverhans.attacks.ProjectedGradientDescent method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SaliencyMapMethod.parse_params\">(cleverhans.attacks.SaliencyMapMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SparseL1Descent.parse_params\">(cleverhans.attacks.SparseL1Descent method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.SpatialTransformationMethod.parse_params\">(cleverhans.attacks.SpatialTransformationMethod method)</a>\n</li>\n        <li><a href=\"source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod.parse_params\">(cleverhans.attacks.VirtualAdversarialMethod method)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.projected_optimization\">projected_optimization() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ProjectedGradientDescent\">ProjectedGradientDescent (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"R\">R</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.reduce_max\">reduce_max() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.reduce_mean\">reduce_mean() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.reduce_sum\">reduce_sum() (in module cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.ABCMeta.register\">register() (cleverhans.attacks.ABCMeta method)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"S\">S</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SaliencyMapMethod\">SaliencyMapMethod (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.Semantic\">Semantic (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.softmax_cross_entropy_with_logits\">softmax_cross_entropy_with_logits() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SparseL1Descent\">SparseL1Descent (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SpatialTransformationMethod\">SpatialTransformationMethod (class in cleverhans.attacks)</a>\n</li>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.SPSA\">SPSA (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"V\">V</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.vatm\">vatm() (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.VirtualAdversarialMethod\">VirtualAdversarialMethod (class in cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"W\">W</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.wrapper_warning\">wrapper_warning() (in module cleverhans.attacks)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.wrapper_warning\">(in module cleverhans.model)</a>\n</li>\n      </ul></li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.wrapper_warning_logits\">wrapper_warning_logits() (in module cleverhans.attacks)</a>\n\n      <ul>\n        <li><a href=\"source/model.html#cleverhans.model.wrapper_warning_logits\">(in module cleverhans.model)</a>\n</li>\n      </ul></li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"X\">X</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"source/attacks.html#cleverhans.attacks.xrange\">xrange (in module cleverhans.attacks)</a>\n</li>\n  </ul></td>\n</tr></table>\n\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/index.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>CleverHans Documentation &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" />\n    <link rel=\"next\" title=\"attacks module\" href=\"source/attacks.html\" />\n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"cleverhans-documentation\">\n<h1>CleverHans Documentation<a class=\"headerlink\" href=\"#cleverhans-documentation\" title=\"Permalink to this headline\">¶</a></h1>\n<p>This documentation is auto-generated from the docstrings of modules of the current <cite>master</cite> branch of <a class=\"reference external\" href=\"http://github.com/cleverhans-lab/cleverhans/\">cleverhans</a>.</p>\n<p>To get started, we recommend reading the <a class=\"reference external\" href=\"https://github.com/cleverhans-lab/cleverhans#setting-up-cleverhans\">github readme</a>. Afterwards, you can learn more by looking at the following modules:</p>\n<div class=\"toctree-wrapper compound\">\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n</div>\n</div>\n<div class=\"section\" id=\"indices-and-tables\">\n<h1>Indices and tables<a class=\"headerlink\" href=\"#indices-and-tables\" title=\"Permalink to this headline\">¶</a></h1>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"genindex.html\"><span class=\"std std-ref\">Index</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"py-modindex.html\"><span class=\"std std-ref\">Module Index</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"search.html\"><span class=\"std std-ref\">Search Page</span></a></p></li>\n</ul>\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"#\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"#\">Documentation overview</a><ul>\n      <li>Next: <a href=\"source/attacks.html\" title=\"next chapter\"><cite>attacks</cite> module</a></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/py-modindex.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Python Module Index &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" />\n\n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n\n   <h1>Python Module Index</h1>\n\n   <div class=\"modindex-jumpbox\">\n   <a href=\"#cap-c\"><strong>c</strong></a>\n   </div>\n\n   <table class=\"indextable modindextable\">\n     <tr class=\"pcap\"><td></td><td>&#160;</td><td></td></tr>\n     <tr class=\"cap\" id=\"cap-c\"><td></td><td>\n       <strong>c</strong></td><td></td></tr>\n     <tr>\n       <td><img src=\"_static/minus.png\" class=\"toggler\"\n              id=\"toggle-1\" style=\"display: none\" alt=\"-\" /></td>\n       <td>\n       <code class=\"xref\">cleverhans</code></td><td>\n       <em></em></td></tr>\n     <tr class=\"cg-1\">\n       <td></td>\n       <td>&#160;&#160;&#160;\n       <a href=\"source/attacks.html#module-cleverhans.attacks\"><code class=\"xref\">cleverhans.attacks</code></a></td><td>\n       <em></em></td></tr>\n     <tr class=\"cg-1\">\n       <td></td>\n       <td>&#160;&#160;&#160;\n       <a href=\"source/future.html#module-cleverhans.devtools\"><code class=\"xref\">cleverhans.devtools</code></a></td><td>\n       <em></em></td></tr>\n     <tr class=\"cg-1\">\n       <td></td>\n       <td>&#160;&#160;&#160;\n       <a href=\"source/model.html#module-cleverhans.model\"><code class=\"xref\">cleverhans.model</code></a></td><td>\n       <em></em></td></tr>\n   </table>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/search.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Search &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"_static/alabaster.css\" type=\"text/css\" />\n    \n    <script id=\"documentation_options\" data-url_root=\"./\" src=\"_static/documentation_options.js\"></script>\n    <script src=\"_static/jquery.js\"></script>\n    <script src=\"_static/underscore.js\"></script>\n    <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/searchtools.js\"></script>\n    <script src=\"_static/language_data.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"#\" />\n  <script src=\"searchindex.js\" defer></script>\n  \n   \n  <link rel=\"stylesheet\" href=\"_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <h1 id=\"search-documentation\">Search</h1>\n  <div id=\"fallback\" class=\"admonition warning\">\n  <script>$('#fallback').hide();</script>\n  <p>\n    Please activate JavaScript to enable the search\n    functionality.\n  </p>\n  </div>\n  <p>\n    Searching for multiple words only shows matches that contain\n    all words.\n  </p>\n  <form action=\"\" method=\"get\">\n    <input type=\"text\" name=\"q\" aria-labelledby=\"search-documentation\" value=\"\" />\n    <input type=\"submit\" value=\"search\" />\n    <span id=\"search-progress\" style=\"padding-left: 10px\"></span>\n  </form>\n  \n  <div id=\"search-results\">\n  \n  </div>\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"source/model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/searchindex.js",
    "content": "Search.setIndex({docnames:[\"README\",\"index\",\"source/attacks\",\"source/devtools\",\"source/future\",\"source/model\"],envversion:{\"sphinx.domains.c\":2,\"sphinx.domains.changeset\":1,\"sphinx.domains.citation\":1,\"sphinx.domains.cpp\":3,\"sphinx.domains.index\":1,\"sphinx.domains.javascript\":2,\"sphinx.domains.math\":2,\"sphinx.domains.python\":2,\"sphinx.domains.rst\":2,\"sphinx.domains.std\":1,\"sphinx.ext.viewcode\":1,sphinx:56},filenames:[\"README.md\",\"index.md\",\"source/attacks.md\",\"source/devtools.md\",\"source/future.md\",\"source/model.md\"],objects:{\"cleverhans.attacks\":{ABCMeta:[2,1,1,\"\"],Attack:[2,1,1,\"\"],BasicIterativeMethod:[2,1,1,\"\"],BoundaryAttackPlusPlus:[2,3,1,\"\"],CallableModelWrapper:[2,1,1,\"\"],CarliniWagnerL2:[2,1,1,\"\"],DeepFool:[2,1,1,\"\"],ElasticNetMethod:[2,1,1,\"\"],FastFeatureAdversaries:[2,1,1,\"\"],FastGradientMethod:[2,1,1,\"\"],HopSkipJumpAttack:[2,1,1,\"\"],LBFGS:[2,1,1,\"\"],MadryEtAl:[2,1,1,\"\"],MaxConfidence:[2,1,1,\"\"],Model:[2,1,1,\"\"],MomentumIterativeMethod:[2,1,1,\"\"],Noise:[2,1,1,\"\"],ProjectedGradientDescent:[2,1,1,\"\"],SPSA:[2,1,1,\"\"],SaliencyMapMethod:[2,1,1,\"\"],Semantic:[2,1,1,\"\"],SparseL1Descent:[2,1,1,\"\"],SpatialTransformationMethod:[2,1,1,\"\"],VirtualAdversarialMethod:[2,1,1,\"\"],clip_eta:[2,3,1,\"\"],fgm:[2,3,1,\"\"],optimize_linear:[2,3,1,\"\"],projected_optimization:[2,3,1,\"\"],reduce_max:[2,3,1,\"\"],reduce_mean:[2,3,1,\"\"],reduce_sum:[2,3,1,\"\"],softmax_cross_entropy_with_logits:[2,3,1,\"\"],vatm:[2,3,1,\"\"],wrapper_warning:[2,3,1,\"\"],wrapper_warning_logits:[2,3,1,\"\"],xrange:[2,4,1,\"\"]},\"cleverhans.attacks.ABCMeta\":{register:[2,2,1,\"\"]},\"cleverhans.attacks.Attack\":{construct_graph:[2,2,1,\"\"],construct_variables:[2,2,1,\"\"],generate:[2,2,1,\"\"],generate_np:[2,2,1,\"\"],get_or_guess_labels:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.CallableModelWrapper\":{fprop:[2,2,1,\"\"]},\"cleverhans.attacks.CarliniWagnerL2\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.DeepFool\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.ElasticNetMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.FastFeatureAdversaries\":{attack_single_step:[2,2,1,\"\"],generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.FastGradientMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.HopSkipJumpAttack\":{generate:[2,2,1,\"\"],generate_np:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.LBFGS\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.MaxConfidence\":{attack:[2,2,1,\"\"],attack_class:[2,2,1,\"\"],generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.Model\":{O_FEATURES:[2,4,1,\"\"],O_LOGITS:[2,4,1,\"\"],O_PROBS:[2,4,1,\"\"],fprop:[2,2,1,\"\"],get_layer:[2,2,1,\"\"],get_layer_names:[2,2,1,\"\"],get_logits:[2,2,1,\"\"],get_params:[2,2,1,\"\"],get_predicted_class:[2,2,1,\"\"],get_probs:[2,2,1,\"\"],make_input_placeholder:[2,2,1,\"\"],make_label_placeholder:[2,2,1,\"\"],make_params:[2,2,1,\"\"]},\"cleverhans.attacks.MomentumIterativeMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.Noise\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.ProjectedGradientDescent\":{FGM_CLASS:[2,4,1,\"\"],generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.SPSA\":{DEFAULT_DELTA:[2,4,1,\"\"],DEFAULT_LEARNING_RATE:[2,4,1,\"\"],DEFAULT_SPSA_ITERS:[2,4,1,\"\"],DEFAULT_SPSA_SAMPLES:[2,4,1,\"\"],generate:[2,2,1,\"\"],generate_np:[2,2,1,\"\"]},\"cleverhans.attacks.SaliencyMapMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.Semantic\":{generate:[2,2,1,\"\"]},\"cleverhans.attacks.SparseL1Descent\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.SpatialTransformationMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.attacks.VirtualAdversarialMethod\":{generate:[2,2,1,\"\"],parse_params:[2,2,1,\"\"]},\"cleverhans.model\":{CallableModelWrapper:[5,1,1,\"\"],Model:[5,1,1,\"\"],NoSuchLayerError:[5,5,1,\"\"],wrapper_warning:[5,3,1,\"\"],wrapper_warning_logits:[5,3,1,\"\"]},\"cleverhans.model.CallableModelWrapper\":{fprop:[5,2,1,\"\"]},\"cleverhans.model.Model\":{O_FEATURES:[5,4,1,\"\"],O_LOGITS:[5,4,1,\"\"],O_PROBS:[5,4,1,\"\"],fprop:[5,2,1,\"\"],get_layer:[5,2,1,\"\"],get_layer_names:[5,2,1,\"\"],get_logits:[5,2,1,\"\"],get_params:[5,2,1,\"\"],get_predicted_class:[5,2,1,\"\"],get_probs:[5,2,1,\"\"],make_input_placeholder:[5,2,1,\"\"],make_label_placeholder:[5,2,1,\"\"],make_params:[5,2,1,\"\"]},cleverhans:{attacks:[2,0,0,\"-\"],devtools:[4,0,0,\"-\"],model:[5,0,0,\"-\"]}},objnames:{\"0\":[\"py\",\"module\",\"Python module\"],\"1\":[\"py\",\"class\",\"Python class\"],\"2\":[\"py\",\"method\",\"Python method\"],\"3\":[\"py\",\"function\",\"Python function\"],\"4\":[\"py\",\"attribute\",\"Python attribute\"],\"5\":[\"py\",\"exception\",\"Python exception\"]},objtypes:{\"0\":\"py:module\",\"1\":\"py:class\",\"2\":\"py:method\",\"3\":\"py:function\",\"4\":\"py:attribute\",\"5\":\"py:exception\"},terms:{\"001\":2,\"00420\":2,\"005\":2,\"00677\":2,\"01236\":2,\"02144\":2,\"02533\":2,\"04114\":2,\"04599\":2,\"04644\":2,\"05122\":2,\"05666\":2,\"06081\":2,\"06083\":2,\"06857\":2,\"07528\":2,\"100\":2,\"1000\":2,\"10000\":2,\"128\":2,\"13000\":2,\"1312\":2,\"1412\":2,\"1507\":2,\"1511\":2,\"1607\":2,\"1608\":2,\"1611\":2,\"1703\":2,\"1706\":2,\"1709\":2,\"1710\":2,\"1802\":2,\"1904\":2,\"2014\":2,\"2016\":2,\"2017\":2,\"2018\":2,\"2019\":2,\"6199\":2,\"6572\":2,\"abstract\":[2,5],\"boolean\":2,\"case\":2,\"class\":[2,5],\"default\":[2,5],\"final\":[2,5],\"float\":2,\"function\":[2,5],\"import\":[0,2],\"int\":2,\"new\":2,\"public\":2,\"return\":[2,5],\"static\":0,\"super\":2,\"true\":[2,5],\"try\":2,For:2,The:[0,2,5],Use:2,Used:[2,5],Using:[2,5],_build:0,_project_perturb:2,abc:2,abcmeta:2,abl:0,abort:2,abort_earli:2,abs:2,acceler:2,access:[2,5],accident:2,accord:2,act:2,action:2,actual:[2,5],adam:2,add:0,addit:2,adversari:2,after:[2,5],afterward:1,against:2,aim:2,algorithm:2,alia:2,all:[0,2,5],allow:2,alon:2,along:2,alreadi:2,also:[2,5],angl:2,angle_max:2,angle_min:2,angular2html:0,ani:[2,5],appli:2,approach:2,approxim:2,arg:2,arg_typ:2,argmax_:2,argument:2,around:2,arrai:2,arxiv:2,assert:2,assign:2,assum:2,attack:[0,1,5],attack_class:2,attack_single_step:2,attain:2,attribut:2,auto:1,autodoc:0,automag:[2,5],automat:[2,5],avoid:2,axi:2,back:2,ball:2,base:[0,2,5],base_attack:2,basic:2,basiciterativemethod:2,batch:2,batch_siz:2,becaus:[2,5],been:[2,5],befor:2,being:2,below:2,beta:2,better:2,between:2,binari:2,binary_search_step:2,black:2,black_border_s:2,boneh:2,bool:2,border:2,bounc:2,bound:2,boundari:2,boundaryattackplusplu:2,box:2,branch:[0,1],build:0,built:2,bundl:2,cach:2,calcul:2,call:[2,5],callabl:[2,5],callable_fn:[2,5],callablemodelwrapp:[2,5],can:[0,1,2,5],cannot:0,carlini:2,carliniwagnerl2:2,center:2,chang:[2,5],check:[2,5],chen:2,child:2,choic:[0,2],choos:[0,2],chosen:2,classif:2,classifi:2,cleverhan:[0,2,5],click:0,clip:2,clip_eta:2,clip_grad:2,clip_max:2,clip_min:2,clockwis:2,code:[2,5],combin:2,come:2,compar:2,competit:2,complement:2,compon:2,compos:2,comput:[2,5],computation:2,concept:2,concret:2,confid:2,configur:2,consid:2,consist:2,constant:2,constraint:2,construct:2,construct_graph:2,construct_vari:2,constructor:[2,5],contain:2,content:[2,5],context:[2,5],control:2,conveni:0,converg:2,convolut:2,coordin:2,copi:0,core:[2,5],correct:2,cost:2,counter:2,cover:2,craft:2,creat:[0,2,5],criterion:2,cross:[2,5],current:[1,2],danger:[2,5],data:2,debug:2,decai:2,decay_factor:2,decis:2,decision_rul:2,decor:2,decreas:2,deepfool:2,default_delta:2,default_learning_r:2,default_rand_init:2,default_spsa_it:2,default_spsa_sampl:2,defens:2,defin:[2,5],delta:2,depend:[2,5],deprec:[2,5],descend:2,descent:2,describ:2,design:2,desir:2,detail:2,detect:[2,5],devic:[2,5],dict:[2,5],dictionari:[2,5],differ:[0,2],differenti:2,dim:2,dimens:2,direct:2,directli:[2,5],directori:0,discret:2,distanc:2,distort:2,doc:0,docsourc:0,docstr:1,document:[0,2],doe:[2,5],domain:2,done:2,dong:2,dot:2,down:0,dramat:2,drop:0,dtype:2,dtypestr:2,dure:2,dx_max:2,dx_min:2,dy_max:2,dy_min:2,each:2,earli:2,early_stop_loss_threshold:2,effect:2,effici:2,either:2,elast:2,elasticnetmethod:2,element:2,enabl:[0,2],encod:2,end:2,enforc:2,entropi:[2,5],environ:0,eps:2,eps_it:2,epsilon:2,estim:2,eta:2,evalu:2,even:[2,5],everi:2,exampl:[2,5],except:[0,5],exist:5,expens:2,explain:2,expos:[2,5],express:2,extend:2,extra:[2,5],factor:2,fail:[0,2],failur:2,fals:[2,5],fast:2,fast_gradient_method:2,faster:2,fastfeatureadversari:2,fastgradientmethod:2,featur:[2,5],fed:[2,5],feedabl:2,few:2,fewer:2,fgm:2,fgm_class:2,file:0,find:2,finit:2,first:[0,2],fix:2,float32:2,folder:0,follow:[0,1,2],forum:2,forward:[2,5],found:2,fprop:[2,5],free:2,from:[0,1,2,5],full:2,g_feat:2,gamma:2,gener:[0,1,2],generate_np:2,geometr:2,geometric_progress:2,get:[0,1,2],get_lay:[2,5],get_layer_nam:[2,5],get_logit:[2,5],get_or_guess_label:2,get_param:[2,5],get_predicted_class:[2,5],get_prob:[2,5],github:[0,1],give:2,given:2,good:2,goodfellow:2,grad:2,grad_spars:2,gradient:[2,5],graph:2,greatli:2,grid:2,grid_search:2,guarante:2,guid:2,h1g0pia9tq:2,hack:0,half:2,handl:2,hard:2,has:[2,5],hash_kei:2,have:[0,2,5],help:2,helper:2,here:2,hidden:[2,5],high:2,higher:2,hold:2,hood:[2,5],hopskipjumpattack:2,hot:2,how:2,hparam:[2,5],html:0,http:2,hurt:2,hyperparamet:2,idea:2,identifi:2,ignor:2,imag:2,image_target:2,imagenet:2,implement:[2,5],importantli:2,improv:2,incept:[2,5],includ:2,incorrect:[2,5],increas:2,index:[0,1,2],indic:0,inf:2,infer:2,infin:2,info:2,initi:2,initial_const:2,initial_num_ev:2,input:[2,5],input_imag:2,insert:2,instal:0,instead:2,intend:2,intention:2,interfac:[2,5],intern:2,interv:2,introduc:2,invok:[2,5],is_debug:2,is_target:2,issu:[2,5],issubclass:2,iter:2,itself:2,jacobian:2,jekyl:0,jordan:2,just:[2,5],keep:[0,2],kei:2,kera:[2,5],keras_tensor:0,keyword:2,known:2,kurakin:2,kwarg:[2,5],label:[2,5],larg:2,larger:2,largest:2,later:[2,5],layer:[2,5],lbfg:2,leak:2,learn:[1,2],learning_r:2,least:2,leav:2,length:2,less:2,level:2,librari:0,like:2,linear:2,linf:2,link:2,list:[0,2,5],local:[0,2],log:0,logit:[2,5],look:1,loop:2,loss:[2,5],loss_fn:2,lower:2,made:2,madri:2,madryet:2,mai:[2,5],make:[0,2,5],make_input_placehold:[2,5],make_label_placehold:[2,5],make_param:[2,5],makefil:0,manag:[2,5],mani:2,map:[2,5],mask:[2,5],master:[0,1],max_it:2,max_iter:2,max_num_ev:2,max_val:2,maxconfid:2,maximum:2,mean:[2,5],measur:2,memori:2,metaclass:2,method:[2,5],mimic:2,minim:2,minimum:2,misclassif:2,mix:2,miyato:2,model:[1,2],moder:2,modifi:2,modul:[0,1],momentum:2,momentumiterativemethod:2,more:[1,2],most:2,move:[0,2],mro:2,much:2,multipl:[2,5],must:2,n_angl:2,n_dx:2,n_dy:2,n_sampl:2,name:[0,2,5],namespac:2,nb_candid:2,nb_class:[2,5],nb_iter:2,need:[2,5],needs_dummy_fprop:[2,5],neg:2,negat:2,neither:2,net:2,network:[2,5],neural:[2,5],nip:2,nois:2,nojekyl:0,non:2,none:[2,5],nor:2,norm:2,normal:2,nosuchlayererror:5,note:[0,2,5],num_iter:2,num_step:2,number:2,numer:2,numpi:2,o_featur:[2,5],o_logit:[2,5],o_prob:[2,5],object:[2,5],off:2,often:2,one:2,onli:2,openreview:2,oper:2,optim:2,optimal_perturb:2,optimize_linear:2,option:[0,2,5],ord:2,order:2,org:[0,2],orient:2,origin:2,other:2,otherwis:[0,2],our:[0,2],out:2,outperform:2,output:[0,2,5],output_lay:[2,5],over:2,overriden:2,overshoot:2,own:2,packag:[2,5],page:[0,1],paper:2,papernot:2,param:[2,5],paramet:[2,5],pars:2,parse_param:2,part:[2,5],particularli:2,pass:[2,5],pdf:2,percent:2,percentag:2,percentil:2,perform:2,perturb:2,pick:2,pip:0,pixel:2,place:[2,5],placehold:[2,5],pleas:0,point:2,posit:2,possibl:2,pre:[2,5],predict:[2,5],prepar:0,prevent:2,preview:0,previou:2,print:2,prob:[2,5],probabl:[2,5],procedur:2,process:2,produc:[2,5],progress:2,project:2,project_perturb:2,projected_gradient_desc:2,projected_optim:2,projectedgradientdesc:2,propag:[2,5],properti:2,propos:2,provid:[2,5],publish:0,purturb:2,put:[2,5],py_func:2,queri:2,radiu:2,rais:[0,5],rand_init:2,rand_init_ep:2,rand_minmax:2,random:2,rang:2,rate:2,rather:2,ratio:2,reach:2,read:[1,2],readm:1,realiz:[2,5],reason:2,recip:2,recommend:[1,2],reduce_max:2,reduce_mean:2,reduce_sum:2,refer:[2,5],region:2,regist:2,reject:2,rel:2,relat:5,remov:[2,5],repo:0,repositori:0,repres:[2,5],represent:[2,5],request:5,requir:2,reshap:[2,5],resolut:2,respect:[2,5],result:[2,5],retain:2,robust:2,root:0,rotat:2,run:[0,2],runtim:2,sabour:2,salienc:2,saliencymapmethod:2,same:[2,5],sampl:2,saniti:2,sanity_check:2,save:2,scalar:2,scale:2,scope:[2,5],scroll:0,search:[1,2],section:0,see:[0,2,5],seed:2,select:2,self:[2,5],semant:2,sentinel:2,separ:0,serv:0,sess:2,session:2,set:[0,2,5],sever:[2,5],shape:2,should:[2,5],show:2,side:2,sign:2,signatur:2,silent:[2,5],similar:2,simpl:2,simplifi:[2,5],simultan:2,singl:[2,5],site:0,size:2,slower:2,smaller:2,smooth:2,softmax:[2,5],softmax_cross_entropy_with_logit:2,softmax_cross_entropy_with_logits_v2:2,solv:2,some:2,soon:2,sourc:[0,2,5],space:2,spars:2,sparsel1desc:2,sparsiti:2,spatial:2,spatialtransformationmethod:2,special:2,specif:[0,2,5],specifi:2,speed:2,sphinx:0,spsa:[0,2],spsa_it:2,spsa_sampl:2,sqrt:2,start:[1,2],steepest:2,step:2,stepsiz:2,stepsize_search:2,still:[0,2,5],stop:2,store:2,str:[2,5],strang:2,stronger:2,strongli:2,structur:2,stuck:2,sub:2,subclass:2,success:2,suppli:[2,5],sure:0,symbol:[2,5],symbolic_impl:2,tab:0,take:2,target:2,target_i:2,tensor:[2,5],tensoradam:2,tensorflow:2,tensorflow_addon:0,tensoroptim:2,term:2,termin:2,test:2,tfa:0,than:2,thei:[2,5],them:[0,2,5],therefor:2,theta:2,thi:[0,1,2,5],those:2,three:2,threshold:2,through:2,thu:[0,2],time:[2,5],too:2,total:2,trade:2,tradeoff:2,train:2,tramer:2,transfer:2,transform:2,translat:2,treat:[2,5],tri:2,tricki:2,true_i:2,tune:2,turn:[2,5],type:2,typic:2,uesato:2,unabl:2,uncom:0,under:[0,2,5],underli:2,uniformli:2,uniqu:2,unit:2,univers:2,unless:2,unnorm:2,unrel:2,untarget:2,until:2,updat:2,usag:2,use:[2,5],used:2,useful:2,user:[0,2,5],uses:2,using:[0,2],valid:[2,5],valu:[2,5],valueerror:5,vanish:2,variabl:[2,5],variant:2,variat:2,vastli:2,vatm:2,vector:2,verbos:2,version:2,via:2,virtual:[0,2],virtualadversarialmethod:2,virutalen:0,wagner:2,wai:[2,5],wainwright:2,want:0,warn:[0,2,5],weak:2,websit:0,were:2,when:[0,2,5],where:[0,2],whether:[0,2,5],which:2,while_loop:2,white:2,without:2,won:2,work:2,wors:[2,5],would:[2,5],wrap:[2,5],wrapper:[2,5],wrapper_warn:[2,5],wrapper_warning_logit:[2,5],write:2,x_t:2,x_val:2,xrang:2,y_target:2,yield:2,you:[0,1,2],your:[0,2]},titles:[\"&lt;no title&gt;\",\"CleverHans Documentation\",\"<cite>attacks</cite> module\",\"<cite>devtools</cite> module\",\"<cite>future</cite> module\",\"<cite>model</cite> module\"],titleterms:{attack:2,cleverhan:1,devtool:3,document:1,futur:4,indic:1,model:5,modul:[2,3,4,5],tabl:1}})"
  },
  {
    "path": "docs/source/attacks.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>attacks module &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n    <link rel=\"next\" title=\"model module\" href=\"model.html\" />\n    <link rel=\"prev\" title=\"CleverHans Documentation\" href=\"../index.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"module-cleverhans.attacks\">\n<span id=\"attacks-module\"></span><h1><cite>attacks</cite> module<a class=\"headerlink\" href=\"#module-cleverhans.attacks\" title=\"Permalink to this headline\">¶</a></h1>\n<p>The Attack class, providing a universal abstract interface describing attacks, and many implementations of it.</p>\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.ABCMeta\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">ABCMeta</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">name</span></em>, <em class=\"sig-param\"><span class=\"n\">bases</span></em>, <em class=\"sig-param\"><span class=\"n\">namespace</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/abc.html#ABCMeta\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ABCMeta\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">type</span></code></p>\n<p>Metaclass for defining Abstract Base Classes (ABCs).</p>\n<p>Use this metaclass to create an ABC.  An ABC can be subclassed\ndirectly, and then acts as a mix-in class.  You can also register\nunrelated concrete classes (even built-in classes) and unrelated\nABCs as ‘virtual subclasses’ – these and their descendants will\nbe considered subclasses of the registering ABC by the built-in\nissubclass() function, but the registering ABC won’t show up in\ntheir MRO (Method Resolution Order) nor will method\nimplementations defined by the registering ABC be callable (not\neven via super()).</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ABCMeta.register\">\n<code class=\"sig-name descname\">register</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">subclass</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/abc.html#ABCMeta.register\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ABCMeta.register\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Register a virtual subclass of an ABC.</p>\n<p>Returns the subclass, to allow usage as a class decorator.</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.Attack\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">Attack</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">object</span></code></p>\n<p>Abstract base class for all attack classes.</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.construct_graph\">\n<code class=\"sig-name descname\">construct_graph</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">fixed</span></em>, <em class=\"sig-param\"><span class=\"n\">feedable</span></em>, <em class=\"sig-param\"><span class=\"n\">x_val</span></em>, <em class=\"sig-param\"><span class=\"n\">hash_key</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.construct_graph\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.construct_graph\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Construct the graph required to run the attack through generate_np.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>fixed</strong> – Structural elements that require defining a new graph.</p></li>\n<li><p><strong>feedable</strong> – Arguments that can be fed to the same graph when\nthey take different values.</p></li>\n<li><p><strong>x_val</strong> – symbolic adversarial example</p></li>\n<li><p><strong>hash_key</strong> – the key used to store this graph in our cache</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.construct_variables\">\n<code class=\"sig-name descname\">construct_variables</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.construct_variables\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.construct_variables\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Construct the inputs to the attack graph to be used by generate_np.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>kwargs</strong> – Keyword arguments to generate_np.</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>Structural arguments\nFeedable arguments\nOutput of <cite>arg_type</cite> describing feedable arguments\nA unique key</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate the attack’s symbolic graph for adversarial examples. This\nmethod should be overriden in any child class that implements an\nattack that is expressable symbolically. Otherwise, it will wrap the\nnumerical implementation as a symbolic operator.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>**kwargs</strong> – <p>optional parameters used by child classes.\nEach child class defines additional parameters as needed.\nChild classes that use the following concepts should use the following\nnames:</p>\n<blockquote>\n<div><p>clip_min: minimum feature value\nclip_max: maximum feature value\neps: size of norm constraint on adversarial perturbation\nord: order of norm constraint\nnb_iter: number of iterations\neps_iter: size of norm constraint on iteration\ny_target: if specified, the attack is targeted.\ny: Do not specify if y_target is specified.</p>\n<blockquote>\n<div><p>If specified, the attack is untargeted, aims to make the output\nclass not be y.\nIf neither y_target nor y is specified, y is inferred by having\nthe model classify the input.</p>\n</div></blockquote>\n</div></blockquote>\n<p>For other concepts, it’s generally a good idea to read other classes\nand check for name consistency.</p>\n</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation of the adversarial examples.</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.generate_np\">\n<code class=\"sig-name descname\">generate_np</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x_val</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.generate_np\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.generate_np\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate adversarial examples and return them as a NumPy array.\nSub-classes <em>should not</em> implement this method unless they must\nperform special handling of arguments.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x_val</strong> – A NumPy array with the original inputs.</p></li>\n<li><p><strong>**kwargs</strong> – <p>optional parameters used by child classes.</p>\n</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A NumPy array holding the adversarial examples.</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.get_or_guess_labels\">\n<code class=\"sig-name descname\">get_or_guess_labels</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.get_or_guess_labels\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.get_or_guess_labels\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Get the label to use in generating an adversarial example for x.\nThe kwargs are fed directly from the kwargs of the attack.\nIf ‘y’ is in kwargs, then assume it’s an untargeted attack and\nuse that as the label.\nIf ‘y_target’ is in kwargs and is not none, then assume it’s a\ntargeted attack and use that as the label.\nOtherwise, use the model’s prediction as the label and perform an\nuntargeted attack.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Attack.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">params</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/attack.html#Attack.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Attack.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>params</strong> – a dictionary of attack-specific parameters</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>True when parsing was successful</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.BasicIterativeMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">BasicIterativeMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/basic_iterative_method.html#BasicIterativeMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.BasicIterativeMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.projected_gradient_descent.ProjectedGradientDescent</span></code></p>\n<p>The BasicIterativeMethod attack.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.BoundaryAttackPlusPlus\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">BoundaryAttackPlusPlus</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#BoundaryAttackPlusPlus\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.BoundaryAttackPlusPlus\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>A previous name used for HopSkipJumpAttack.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.CallableModelWrapper\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">CallableModelWrapper</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">callable_fn</span></em>, <em class=\"sig-param\"><span class=\"n\">output_layer</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#CallableModelWrapper\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CallableModelWrapper\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <a class=\"reference internal\" href=\"model.html#cleverhans.model.Model\" title=\"cleverhans.model.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.model.Model</span></code></a></p>\n<p>A wrapper that turns a callable into a valid Model</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.CallableModelWrapper.fprop\">\n<code class=\"sig-name descname\">fprop</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#CallableModelWrapper.fprop\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CallableModelWrapper.fprop\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Forward propagation to compute the model outputs.\n:param x: A symbolic representation of the network input\n:return: A dictionary mapping layer names to the symbolic</p>\n<blockquote>\n<div><p>representation of their output.</p>\n</div></blockquote>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.CarliniWagnerL2\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">CarliniWagnerL2</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/carlini_wagner_l2.html#CarliniWagnerL2\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CarliniWagnerL2\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This attack was originally proposed by Carlini and Wagner. It is an\niterative attack that finds adversarial examples on many defenses that\nare robust to other attacks.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1608.04644\">https://arxiv.org/abs/1608.04644</a></p>\n<p>At a high level, this attack is an iterative attack using Adam and\na specially-chosen loss function to find adversarial examples with\nlower distortion than other attacks. This comes at the cost of speed,\nas this attack is often much slower than others.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.CarliniWagnerL2.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/carlini_wagner_l2.html#CarliniWagnerL2.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CarliniWagnerL2.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a tensor that constructs adversarial examples for the given\ninput. Generate uses tf.py_func in order to operate over tensors.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – A tensor with the inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.CarliniWagnerL2.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">confidence</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"default_value\">0.005</span></em>, <em class=\"sig-param\"><span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"default_value\">5</span></em>, <em class=\"sig-param\"><span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"default_value\">1000</span></em>, <em class=\"sig-param\"><span class=\"n\">abort_early</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/carlini_wagner_l2.html#CarliniWagnerL2.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.CarliniWagnerL2.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>y</strong> – (optional) A tensor with the true labels for an untargeted\nattack. If None (and y_target is None) then use the\noriginal labels the classifier assigns.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the target labels for a\ntargeted attack.</p></li>\n<li><p><strong>confidence</strong> – Confidence of adversarial examples: higher produces\nexamples with larger l2 distortion, but more\nstrongly classified as adversarial.</p></li>\n<li><p><strong>batch_size</strong> – Number of attacks to run simultaneously.</p></li>\n<li><p><strong>learning_rate</strong> – The learning rate for the attack algorithm.\nSmaller values produce better results but are\nslower to converge.</p></li>\n<li><p><strong>binary_search_steps</strong> – The number of times we perform binary\nsearch to find the optimal tradeoff-\nconstant between norm of the purturbation\nand confidence of the classification.</p></li>\n<li><p><strong>max_iterations</strong> – The maximum number of iterations. Setting this\nto a larger value will produce lower distortion\nresults. Using only a few iterations requires\na larger learning rate, and will produce larger\ndistortion results.</p></li>\n<li><p><strong>abort_early</strong> – If true, allows early aborts if gradient descent\nis unable to make progress (i.e., gets stuck in\na local minimum).</p></li>\n<li><p><strong>initial_const</strong> – The initial tradeoff-constant to use to tune the\nrelative importance of size of the perturbation\nand confidence of classification.\nIf binary_search_steps is large, the initial\nconstant is not important. A smaller value of\nthis constant gives lower distortion results.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.DeepFool\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">DeepFool</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/deep_fool.html#DeepFool\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.DeepFool\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>DeepFool is an untargeted &amp; iterative attack which is based on an\niterative linearization of the classifier. The implementation here\nis w.r.t. the L2 norm.\nPaper link: “<a class=\"reference external\" href=\"https://arxiv.org/pdf/1511.04599.pdf\">https://arxiv.org/pdf/1511.04599.pdf</a>”</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.DeepFool.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/deep_fool.html#DeepFool.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.DeepFool.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.DeepFool.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">nb_candidate</span><span class=\"o\">=</span><span class=\"default_value\">10</span></em>, <em class=\"sig-param\"><span class=\"n\">overshoot</span><span class=\"o\">=</span><span class=\"default_value\">0.02</span></em>, <em class=\"sig-param\"><span class=\"n\">max_iter</span><span class=\"o\">=</span><span class=\"default_value\">50</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0.0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/deep_fool.html#DeepFool.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.DeepFool.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>nb_candidate</strong> – The number of classes to test against, i.e.,\ndeepfool only consider nb_candidate classes when\nattacking(thus accelerate speed). The nb_candidate\nclasses are chosen according to the prediction\nconfidence during implementation.</p></li>\n<li><p><strong>overshoot</strong> – A termination criterion to prevent vanishing updates</p></li>\n<li><p><strong>max_iter</strong> – Maximum number of iteration for deepfool</p></li>\n<li><p><strong>clip_min</strong> – Minimum component value for clipping</p></li>\n<li><p><strong>clip_max</strong> – Maximum component value for clipping</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.ElasticNetMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">ElasticNetMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/elastic_net_method.html#ElasticNetMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ElasticNetMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This attack features L1-oriented adversarial examples and includes\nthe C&amp;W L2 attack as a special case (when beta is set to 0).\nAdversarial examples attain similar performance to those\ngenerated by the C&amp;W L2 attack in the white-box case,\nand more importantly, have improved transferability properties\nand complement adversarial training.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1709.04114\">https://arxiv.org/abs/1709.04114</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ElasticNetMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/elastic_net_method.html#ElasticNetMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ElasticNetMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a tensor that constructs adversarial examples for the given\ninput. Generate uses tf.py_func in order to operate over tensors.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – (required) A tensor with the inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ElasticNetMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">beta</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">decision_rule</span><span class=\"o\">=</span><span class=\"default_value\">'EN'</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">confidence</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"default_value\">9</span></em>, <em class=\"sig-param\"><span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"default_value\">1000</span></em>, <em class=\"sig-param\"><span class=\"n\">abort_early</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\"><span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"default_value\">0.001</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/elastic_net_method.html#ElasticNetMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ElasticNetMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>y</strong> – (optional) A tensor with the true labels for an untargeted\nattack. If None (and y_target is None) then use the\noriginal labels the classifier assigns.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the target labels for a\ntargeted attack.</p></li>\n<li><p><strong>beta</strong> – Trades off L2 distortion with L1 distortion: higher\nproduces examples with lower L1 distortion, at the\ncost of higher L2 (and typically Linf) distortion</p></li>\n<li><p><strong>decision_rule</strong> – EN or L1. Select final adversarial example from\nall successful examples based on the least\nelastic-net or L1 distortion criterion.</p></li>\n<li><p><strong>confidence</strong> – Confidence of adversarial examples: higher produces\nexamples with larger l2 distortion, but more\nstrongly classified as adversarial.</p></li>\n<li><p><strong>batch_size</strong> – Number of attacks to run simultaneously.</p></li>\n<li><p><strong>learning_rate</strong> – The learning rate for the attack algorithm.\nSmaller values produce better results but are\nslower to converge.</p></li>\n<li><p><strong>binary_search_steps</strong> – The number of times we perform binary\nsearch to find the optimal tradeoff-\nconstant between norm of the perturbation\nand confidence of the classification. Set\n‘initial_const’ to a large value and fix\nthis param to 1 for speed.</p></li>\n<li><p><strong>max_iterations</strong> – The maximum number of iterations. Setting this\nto a larger value will produce lower distortion\nresults. Using only a few iterations requires\na larger learning rate, and will produce larger\ndistortion results.</p></li>\n<li><p><strong>abort_early</strong> – If true, allows early abort when the total\nloss starts to increase (greatly speeds up attack,\nbut hurts performance, particularly on ImageNet)</p></li>\n<li><p><strong>initial_const</strong> – The initial tradeoff-constant to use to tune the\nrelative importance of size of the perturbation\nand confidence of classification.\nIf binary_search_steps is large, the initial\nconstant is not important. A smaller value of\nthis constant gives lower distortion results.\nFor computational efficiency, fix\nbinary_search_steps to 1 and set this param\nto a large value.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.FastFeatureAdversaries\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">FastFeatureAdversaries</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_feature_adversaries.html#FastFeatureAdversaries\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastFeatureAdversaries\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This is a fast implementation of “Feature Adversaries”, an attack\nagainst a target internal representation of a model.\n“Feature adversaries” were originally introduced in (Sabour et al. 2016),\nwhere the optimization was done using LBFGS.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1511.05122\">https://arxiv.org/abs/1511.05122</a></p>\n<p>This implementation is similar to “Basic Iterative Method”\n(Kurakin et al. 2016) but applied to the internal representations.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastFeatureAdversaries.attack_single_step\">\n<code class=\"sig-name descname\">attack_single_step</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">eta</span></em>, <em class=\"sig-param\"><span class=\"n\">g_feat</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_feature_adversaries.html#FastFeatureAdversaries.attack_single_step\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastFeatureAdversaries.attack_single_step\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>TensorFlow implementation of the Fast Feature Gradient. This is a\nsingle step attack similar to Fast Gradient Method that attacks an\ninternal representation.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – the input placeholder</p></li>\n<li><p><strong>eta</strong> – A tensor the same shape as x that holds the perturbation.</p></li>\n<li><p><strong>g_feat</strong> – model’s internal tensor for guide</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>a tensor for the adversarial example</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastFeatureAdversaries.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">g</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_feature_adversaries.html#FastFeatureAdversaries.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastFeatureAdversaries.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>g</strong> – The target value of the symbolic representation</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastFeatureAdversaries.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">layer</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">0.3</span></em>, <em class=\"sig-param\"><span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"default_value\">0.05</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">10</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span><span class=\"o\">=</span><span class=\"default_value\">inf</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_feature_adversaries.html#FastFeatureAdversaries.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastFeatureAdversaries.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>layer</strong> – (required str) name of the layer to target.</p></li>\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>eps_iter</strong> – (optional float) step size for each attack iteration</p></li>\n<li><p><strong>nb_iter</strong> – (optional int) Number of attack iterations.</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics Numpy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.FastGradientMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">FastGradientMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#FastGradientMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastGradientMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This attack was originally implemented by Goodfellow et al. (2014) with the\ninfinity norm (and is known as the “Fast Gradient Sign Method”). This\nimplementation extends the attack to other norms, and is therefore called\nthe Fast Gradient Method.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1412.6572\">https://arxiv.org/abs/1412.6572</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastGradientMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#FastGradientMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastGradientMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Returns the graph for Fast Gradient Method adversarial examples.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.FastGradientMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\">eps=0.3</em>, <em class=\"sig-param\">ord=inf</em>, <em class=\"sig-param\">loss_fn=&lt;function softmax_cross_entropy_with_logits&gt;</em>, <em class=\"sig-param\">y=None</em>, <em class=\"sig-param\">y_target=None</em>, <em class=\"sig-param\">clip_min=None</em>, <em class=\"sig-param\">clip_max=None</em>, <em class=\"sig-param\">clip_grad=False</em>, <em class=\"sig-param\">sanity_checks=True</em>, <em class=\"sig-param\">**kwargs</em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#FastGradientMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.FastGradientMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) attack step size (input variation)</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics NumPy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>loss_fn</strong> – Loss function that takes (labels, logits) as arguments and returns loss</p></li>\n<li><p><strong>y</strong> – (optional) A tensor with the true labels. Only provide\nthis parameter if you’d like to use true labels when crafting\nadversarial samples. Otherwise, model predictions are used as\nlabels to avoid the “label leaking” effect (explained in this\npaper: <a class=\"reference external\" href=\"https://arxiv.org/abs/1611.01236\">https://arxiv.org/abs/1611.01236</a>). Default is None.\nLabels should be one-hot-encoded.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the labels to target. Leave\ny_target=None if y is also set. Labels should be\none-hot-encoded.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n<li><p><strong>clip_grad</strong> – (optional bool) Ignore gradient components\nat positions where the input is already at the boundary\nof the domain, and the update step will get clipped out.</p></li>\n<li><p><strong>sanity_checks</strong> – bool, if True, include asserts\n(Turn them off to use less runtime / memory or for unit tests that\nintentionally pass strange input)</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.HopSkipJumpAttack\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">HopSkipJumpAttack</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#HopSkipJumpAttack\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.HopSkipJumpAttack\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>HopSkipJumpAttack was originally proposed by Chen, Jordan and Wainwright.\nIt is a decision-based attack that requires access to output\nlabels of a model alone.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1904.02144\">https://arxiv.org/abs/1904.02144</a>\nAt a high level, this attack is an iterative attack composed of three\nsteps: Binary search to approach the boundary; gradient estimation;\nstepsize search. HopSkipJumpAttack requires fewer model queries than\nBoundary Attack which was based on rejective sampling.\n:param model: cleverhans.model.Model\n:param sess: tf.Session\n:param dtypestr: dtype of the data\n:param kwargs: passed through to super constructor.\nsee parse_params for details.</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.HopSkipJumpAttack.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#HopSkipJumpAttack.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.HopSkipJumpAttack.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a tensor that constructs adversarial examples for the given\ninput. Generate uses tf.py_func in order to operate over tensors.\n:param x: A tensor with the inputs.\n:param kwargs: See <cite>parse_params</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.HopSkipJumpAttack.generate_np\">\n<code class=\"sig-name descname\">generate_np</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#HopSkipJumpAttack.generate_np\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.HopSkipJumpAttack.generate_np\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate adversarial images in a for loop.\n:param y: An array of shape (n, nb_classes) for true labels.\n:param y_target:  An array of shape (n, nb_classes) for target labels.\nRequired for targeted attack.\n:param image_target: An array of shape (n, <a href=\"#id5\"><span class=\"problematic\" id=\"id6\">**</span></a>image shape) for initial\ntarget images. Required for targeted attack.</p>\n<p>See parse_params for other kwargs.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.HopSkipJumpAttack.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">image_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">initial_num_evals</span><span class=\"o\">=</span><span class=\"default_value\">100</span></em>, <em class=\"sig-param\"><span class=\"n\">max_num_evals</span><span class=\"o\">=</span><span class=\"default_value\">10000</span></em>, <em class=\"sig-param\"><span class=\"n\">stepsize_search</span><span class=\"o\">=</span><span class=\"default_value\">'geometric_progression'</span></em>, <em class=\"sig-param\"><span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"default_value\">64</span></em>, <em class=\"sig-param\"><span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">constraint</span><span class=\"o\">=</span><span class=\"default_value\">'l2'</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">128</span></em>, <em class=\"sig-param\"><span class=\"n\">verbose</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/hop_skip_jump_attack.html#HopSkipJumpAttack.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.HopSkipJumpAttack.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>y</strong> – A tensor of shape (1, nb_classes) for true labels.</p></li>\n<li><p><strong>y_target</strong> – A tensor of shape (1, nb_classes) for target labels.</p></li>\n</ul>\n</dd>\n</dl>\n<p>Required for targeted attack.\n:param image_target: A tensor of shape (1, <a href=\"#id7\"><span class=\"problematic\" id=\"id8\">**</span></a>image shape) for initial\ntarget images. Required for targeted attack.\n:param initial_num_evals: initial number of evaluations for</p>\n<blockquote>\n<div><p>gradient estimation.</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>max_num_evals</strong> – maximum number of evaluations for gradient estimation.</p></li>\n<li><p><strong>stepsize_search</strong> – <p>How to search for stepsize; choices are\n‘geometric_progression’, ‘grid_search’.\n‘geometric progression’ initializes the stepsize</p>\n<blockquote>\n<div><p>by ||x_t - x||_p / sqrt(iteration), and keep\ndecreasing by half until reaching the target\nside of the boundary. ‘grid_search’ chooses the\noptimal epsilon over a grid, in the scale of\n||x_t - x||_p.</p>\n</div></blockquote>\n</p></li>\n<li><p><strong>num_iterations</strong> – The number of iterations.</p></li>\n<li><p><strong>gamma</strong> – The binary search threshold theta is gamma / d^{3/2} for\nl2 attack and gamma / d^2 for linf attack.</p></li>\n<li><p><strong>constraint</strong> – The distance to optimize; choices are ‘l2’, ‘linf’.</p></li>\n<li><p><strong>batch_size</strong> – batch_size for model prediction.</p></li>\n<li><p><strong>verbose</strong> – (boolean) Whether distance at each step is printed.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.LBFGS\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">LBFGS</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/lbfgs.html#LBFGS\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.LBFGS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>LBFGS is the first adversarial attack for convolutional neural networks,\nand is a target &amp; iterative attack.\nPaper link: “<a class=\"reference external\" href=\"https://arxiv.org/pdf/1312.6199.pdf\">https://arxiv.org/pdf/1312.6199.pdf</a>”\n:param model: cleverhans.model.Model\n:param sess: tf.Session\n:param dtypestr: dtype of the data\n:param kwargs: passed through to super constructor</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.LBFGS.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/lbfgs.html#LBFGS.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.LBFGS.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a tensor that constructs adversarial examples for the given\ninput. Generate uses tf.py_func in order to operate over tensors.\n:param x: (required) A tensor with the inputs.\n:param kwargs: See <cite>parse_params</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.LBFGS.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">binary_search_steps</span><span class=\"o\">=</span><span class=\"default_value\">5</span></em>, <em class=\"sig-param\"><span class=\"n\">max_iterations</span><span class=\"o\">=</span><span class=\"default_value\">1000</span></em>, <em class=\"sig-param\"><span class=\"n\">initial_const</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/lbfgs.html#LBFGS.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.LBFGS.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>y_target</strong> – (optional) A tensor with the one-hot target labels.</p></li>\n<li><p><strong>batch_size</strong> – The number of inputs to include in a batch and\nprocess simultaneously.</p></li>\n<li><p><strong>binary_search_steps</strong> – The number of times we perform binary\nsearch to find the optimal tradeoff-\nconstant between norm of the purturbation\nand cross-entropy loss of classification.</p></li>\n<li><p><strong>max_iterations</strong> – The maximum number of iterations.</p></li>\n<li><p><strong>initial_const</strong> – The initial tradeoff-constant to use to tune the\nrelative importance of size of the perturbation\nand cross-entropy loss of the classification.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.MadryEtAl\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">MadryEtAl</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/madry_et_al.html#MadryEtAl\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MadryEtAl\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.projected_gradient_descent.ProjectedGradientDescent</span></code></p>\n<p>The attack from Madry et al 2017</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.MaxConfidence\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">MaxConfidence</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">base_attacker</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>The MaxConfidence attack.</p>\n<p>An attack designed for use against models that use confidence thresholding\nas a defense.\nIf the underlying optimizer is optimal, this attack procedure gives the\noptimal failure rate for every confidence threshold t &gt; 0.5.</p>\n<p>Publication: <a class=\"reference external\" href=\"https://openreview.net/forum?id=H1g0piA9tQ\">https://openreview.net/forum?id=H1g0piA9tQ</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.session.Session</p></li>\n<li><p><strong>base_attacker</strong> – cleverhans.attacks.Attack</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MaxConfidence.attack\">\n<code class=\"sig-name descname\">attack</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">true_y</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence.attack\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence.attack\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Runs the untargeted attack.\n:param x: The input\n:param true_y: The correct label for <cite>x</cite>. This attack aims to produce misclassification.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MaxConfidence.attack_class\">\n<code class=\"sig-name descname\">attack_class</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">target_y</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence.attack_class\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence.attack_class\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Run the attack on a specific target class.\n:param x: tf Tensor. The input example.\n:param target_y: tf Tensor. The attacker’s desired target class.\nReturns:</p>\n<blockquote>\n<div><p>A targeted adversarial example, intended to be classified as the target class.</p>\n</div></blockquote>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MaxConfidence.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – Keyword arguments for the base attacker</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MaxConfidence.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"default_value\">10</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/max_confidence.html#MaxConfidence.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MaxConfidence.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>params</strong> – a dictionary of attack-specific parameters</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>True when parsing was successful</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.Model\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">Model</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">hparams</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">needs_dummy_fprop</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">object</span></code></p>\n<p>An abstract interface for model wrappers that exposes model symbols\nneeded for making an attack. This abstraction removes the dependency on\nany specific neural network package (e.g. Keras) from the core\ncode of CleverHans. It can also simplify exposing the hidden features of a\nmodel when a specific package does not directly expose them.</p>\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.Model.O_FEATURES\">\n<code class=\"sig-name descname\">O_FEATURES</code><em class=\"property\"> = 'features'</em><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.O_FEATURES\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.Model.O_LOGITS\">\n<code class=\"sig-name descname\">O_LOGITS</code><em class=\"property\"> = 'logits'</em><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.O_LOGITS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.Model.O_PROBS\">\n<code class=\"sig-name descname\">O_PROBS</code><em class=\"property\"> = 'probs'</em><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.O_PROBS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.fprop\">\n<code class=\"sig-name descname\">fprop</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.fprop\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.fprop\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Forward propagation to compute the model outputs.\n:param x: A symbolic representation of the network input\n:return: A dictionary mapping layer names to the symbolic</p>\n<blockquote>\n<div><p>representation of their output.</p>\n</div></blockquote>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_layer\">\n<code class=\"sig-name descname\">get_layer</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">layer</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_layer\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_layer\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a layer output.\n:param x: tensor, the input to the network.\n:param layer: str, the name of the layer to compute.\n:param <a href=\"#id9\"><span class=\"problematic\" id=\"id10\">**</span></a>kwargs: dict, extra optional params to pass to self.fprop.\n:return: the content of layer <cite>layer</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_layer_names\">\n<code class=\"sig-name descname\">get_layer_names</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_layer_names\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_layer_names\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return the list of exposed layers for this model.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_logits\">\n<code class=\"sig-name descname\">get_logits</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the output logits</p>\n</dd>\n</dl>\n<p>(i.e., the values fed as inputs to the softmax layer).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_params\">\n<code class=\"sig-name descname\">get_params</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Provides access to the model’s parameters.\n:return: A list of all Variables defining the model parameters.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_predicted_class\">\n<code class=\"sig-name descname\">get_predicted_class</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_predicted_class\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_predicted_class\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the predicted label</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.get_probs\">\n<code class=\"sig-name descname\">get_probs</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_probs\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.get_probs\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the output</p>\n</dd>\n</dl>\n<p>probabilities (i.e., the output values produced by the softmax layer).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.make_input_placeholder\">\n<code class=\"sig-name descname\">make_input_placeholder</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_input_placeholder\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.make_input_placeholder\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create and return a placeholder representing an input to the model.</p>\n<p>This method should respect context managers (e.g. “with tf.device”)\nand should not just return a reference to a single pre-created\nplaceholder.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.make_label_placeholder\">\n<code class=\"sig-name descname\">make_label_placeholder</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_label_placeholder\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.make_label_placeholder\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create and return a placeholder representing class labels.</p>\n<p>This method should respect context managers (e.g. “with tf.device”)\nand should not just return a reference to a single pre-created\nplaceholder.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Model.make_params\">\n<code class=\"sig-name descname\">make_params</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Model.make_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create all Variables to be returned later by get_params.\nBy default this is a no-op.\nModels that need their fprop to be called for their params to be\ncreated can set <cite>needs_dummy_fprop=True</cite> in the constructor.</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.MomentumIterativeMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">MomentumIterativeMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/momentum_iterative_method.html#MomentumIterativeMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MomentumIterativeMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>The Momentum Iterative Method (Dong et al. 2017). This method won\nthe first places in NIPS 2017 Non-targeted Adversarial Attacks and\nTargeted Adversarial Attacks. The original paper used hard labels\nfor this attack; no label smoothing.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/pdf/1710.06081.pdf\">https://arxiv.org/pdf/1710.06081.pdf</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MomentumIterativeMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/momentum_iterative_method.html#MomentumIterativeMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MomentumIterativeMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – Keyword arguments. See <cite>parse_params</cite> for documentation.</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.MomentumIterativeMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">0.3</span></em>, <em class=\"sig-param\"><span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"default_value\">0.06</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">10</span></em>, <em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span><span class=\"o\">=</span><span class=\"default_value\">inf</span></em>, <em class=\"sig-param\"><span class=\"n\">decay_factor</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/momentum_iterative_method.html#MomentumIterativeMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.MomentumIterativeMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>eps_iter</strong> – (optional float) step size for each attack iteration</p></li>\n<li><p><strong>nb_iter</strong> – (optional int) Number of attack iterations.</p></li>\n<li><p><strong>y</strong> – (optional) A tensor with the true labels.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the labels to target. Leave\ny_target=None if y is also set. Labels should be\none-hot-encoded.</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics Numpy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>decay_factor</strong> – (optional) Decay factor for the momentum term.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.Noise\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">Noise</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/noise.html#Noise\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Noise\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>A weak attack that just picks a random point in the attacker’s action space.\nWhen combined with an attack bundling function, this can be used to implement\nrandom search.</p>\n<p>References:\n<a class=\"reference external\" href=\"https://arxiv.org/abs/1802.00420\">https://arxiv.org/abs/1802.00420</a> recommends random search to help identify</p>\n<blockquote>\n<div><p>gradient masking.</p>\n</div></blockquote>\n<dl class=\"simple\">\n<dt><a class=\"reference external\" href=\"https://openreview.net/forum?id=H1g0piA9tQ\">https://openreview.net/forum?id=H1g0piA9tQ</a> recommends using noise as part</dt><dd><p>of an attack bundling recipe combining many different optimizers to yield\na stronger optimizer.</p>\n</dd>\n</dl>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Noise.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/noise.html#Noise.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Noise.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Noise.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">0.3</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span><span class=\"o\">=</span><span class=\"default_value\">inf</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/noise.html#Noise.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Noise.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics Numpy).\nPossible values: np.inf</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.ProjectedGradientDescent\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">ProjectedGradientDescent</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"n\">default_rand_init</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/projected_gradient_descent.html#ProjectedGradientDescent\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ProjectedGradientDescent\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This class implements either the Basic Iterative Method\n(Kurakin et al. 2016) when rand_init is set to 0. or the\nMadry et al. (2017) method when rand_minmax is larger than 0.\nPaper link (Kurakin et al. 2016): <a class=\"reference external\" href=\"https://arxiv.org/pdf/1607.02533.pdf\">https://arxiv.org/pdf/1607.02533.pdf</a>\nPaper link (Madry et al. 2017): <a class=\"reference external\" href=\"https://arxiv.org/pdf/1706.06083.pdf\">https://arxiv.org/pdf/1706.06083.pdf</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>default_rand_init</strong> – whether to use random initialization by default</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.ProjectedGradientDescent.FGM_CLASS\">\n<code class=\"sig-name descname\">FGM_CLASS</code><a class=\"headerlink\" href=\"#cleverhans.attacks.ProjectedGradientDescent.FGM_CLASS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>alias of <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.fast_gradient_method.FastGradientMethod</span></code></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ProjectedGradientDescent.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/projected_gradient_descent.html#ProjectedGradientDescent.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ProjectedGradientDescent.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.ProjectedGradientDescent.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\">eps=0.3</em>, <em class=\"sig-param\">eps_iter=0.05</em>, <em class=\"sig-param\">nb_iter=10</em>, <em class=\"sig-param\">y=None</em>, <em class=\"sig-param\">ord=inf</em>, <em class=\"sig-param\">loss_fn=&lt;function softmax_cross_entropy_with_logits&gt;</em>, <em class=\"sig-param\">clip_min=None</em>, <em class=\"sig-param\">clip_max=None</em>, <em class=\"sig-param\">y_target=None</em>, <em class=\"sig-param\">rand_init=None</em>, <em class=\"sig-param\">rand_init_eps=None</em>, <em class=\"sig-param\">clip_grad=False</em>, <em class=\"sig-param\">sanity_checks=True</em>, <em class=\"sig-param\">**kwargs</em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/projected_gradient_descent.html#ProjectedGradientDescent.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.ProjectedGradientDescent.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>eps_iter</strong> – (optional float) step size for each attack iteration</p></li>\n<li><p><strong>nb_iter</strong> – (optional int) Number of attack iterations.</p></li>\n<li><p><strong>y</strong> – (optional) A tensor with the true labels.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the labels to target. Leave\ny_target=None if y is also set. Labels should be\none-hot-encoded.</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics Numpy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>loss_fn</strong> – Loss function that takes (labels, logits) as arguments and returns loss</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n<li><p><strong>rand_init</strong> – (optional) Start the gradient descent from a point chosen\nuniformly at random in the norm ball of radius\nrand_init_eps</p></li>\n<li><p><strong>rand_init_eps</strong> – (optional float) size of the norm ball from which\nthe initial starting point is chosen. Defaults to eps</p></li>\n<li><p><strong>clip_grad</strong> – (optional bool) Ignore gradient components at positions\nwhere the input is already at the boundary of the domain,\nand the update step will get clipped out.</p></li>\n<li><p><strong>sanity_checks</strong> – <p>bool Insert tf asserts checking values\n(Some tests need to run with no sanity checks because the</p>\n<blockquote>\n<div><p>tests intentionally configure the attack strangely)</p>\n</div></blockquote>\n</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.SPSA\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">SPSA</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spsa.html#SPSA\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This implements the SPSA adversary, as in <a class=\"reference external\" href=\"https://arxiv.org/abs/1802.05666\">https://arxiv.org/abs/1802.05666</a>\n(Uesato et al. 2018). SPSA is a gradient-free optimization method, which\nis useful when the model is non-differentiable, or more generally, the\ngradients do not point in useful directions.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.SPSA.DEFAULT_DELTA\">\n<code class=\"sig-name descname\">DEFAULT_DELTA</code><em class=\"property\"> = 0.01</em><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.DEFAULT_DELTA\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.SPSA.DEFAULT_LEARNING_RATE\">\n<code class=\"sig-name descname\">DEFAULT_LEARNING_RATE</code><em class=\"property\"> = 0.01</em><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.DEFAULT_LEARNING_RATE\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.SPSA.DEFAULT_SPSA_ITERS\">\n<code class=\"sig-name descname\">DEFAULT_SPSA_ITERS</code><em class=\"property\"> = 1</em><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.DEFAULT_SPSA_ITERS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.SPSA.DEFAULT_SPSA_SAMPLES\">\n<code class=\"sig-name descname\">DEFAULT_SPSA_SAMPLES</code><em class=\"property\"> = 128</em><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.DEFAULT_SPSA_SAMPLES\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SPSA.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">is_targeted</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">early_stop_loss_threshold</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">learning_rate</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">delta</span><span class=\"o\">=</span><span class=\"default_value\">0.01</span></em>, <em class=\"sig-param\"><span class=\"n\">spsa_samples</span><span class=\"o\">=</span><span class=\"default_value\">128</span></em>, <em class=\"sig-param\"><span class=\"n\">batch_size</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">spsa_iters</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">is_debug</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\"><span class=\"n\">epsilon</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">num_steps</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spsa.html#SPSA.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs. Must be a batch of size 1.</p></li>\n<li><p><strong>y</strong> – A Tensor or None. The index of the correct label.</p></li>\n<li><p><strong>y_target</strong> – A Tensor or None. The index of the target label in a\ntargeted attack.</p></li>\n<li><p><strong>eps</strong> – The size of the maximum perturbation, measured in the\nL-infinity norm.</p></li>\n<li><p><strong>clip_min</strong> – If specified, the minimum input value</p></li>\n<li><p><strong>clip_max</strong> – If specified, the maximum input value</p></li>\n<li><p><strong>nb_iter</strong> – The number of optimization steps.</p></li>\n<li><p><strong>early_stop_loss_threshold</strong> – A float or None. If specified, the\nattack will end as soon as the loss\nis below <cite>early_stop_loss_threshold</cite>.</p></li>\n<li><p><strong>learning_rate</strong> – Learning rate of ADAM optimizer.</p></li>\n<li><p><strong>delta</strong> – Perturbation size used for SPSA approximation.</p></li>\n<li><p><strong>spsa_samples</strong> – Number of inputs to evaluate at a single time.\nThe true batch size (the number of evaluated\ninputs for each update) is <cite>spsa_samples *\nspsa_iters</cite></p></li>\n<li><p><strong>batch_size</strong> – Deprecated param that is an alias for spsa_samples</p></li>\n<li><p><strong>spsa_iters</strong> – Number of model evaluations before performing an\nupdate, where each evaluation is on <cite>spsa_samples</cite>\ndifferent inputs.</p></li>\n<li><p><strong>is_debug</strong> – If True, print the adversarial loss after each update.</p></li>\n<li><p><strong>epsilon</strong> – Deprecated alias for <cite>eps</cite></p></li>\n<li><p><strong>num_steps</strong> – Deprecated alias for <cite>nb_iter</cite>.</p></li>\n<li><p><strong>is_targeted</strong> – Deprecated argument. Ignored.</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SPSA.generate_np\">\n<code class=\"sig-name descname\">generate_np</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x_val</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spsa.html#SPSA.generate_np\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SPSA.generate_np\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate adversarial examples and return them as a NumPy array.\nSub-classes <em>should not</em> implement this method unless they must\nperform special handling of arguments.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x_val</strong> – A NumPy array with the original inputs.</p></li>\n<li><p><strong>**kwargs</strong> – <p>optional parameters used by child classes.</p>\n</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A NumPy array holding the adversarial examples.</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.SaliencyMapMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">SaliencyMapMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/saliency_map_method.html#SaliencyMapMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SaliencyMapMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>The Jacobian-based Saliency Map Method (Papernot et al. 2016).\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/pdf/1511.07528.pdf\">https://arxiv.org/pdf/1511.07528.pdf</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Note</dt>\n<dd class=\"field-even\"><p>When not using symbolic implementation in <cite>generate</cite>, <cite>sess</cite> should\nbe provided</p>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SaliencyMapMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/saliency_map_method.html#SaliencyMapMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SaliencyMapMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SaliencyMapMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">theta</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">gamma</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">0.0</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">symbolic_impl</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/saliency_map_method.html#SaliencyMapMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SaliencyMapMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>theta</strong> – (optional float) Perturbation introduced to modified\ncomponents (can be positive or negative)</p></li>\n<li><p><strong>gamma</strong> – (optional float) Maximum percentage of perturbed features</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum component value for clipping</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum component value for clipping</p></li>\n<li><p><strong>y_target</strong> – (optional) Target tensor if the attack is targeted</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.Semantic\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">Semantic</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">center</span></em>, <em class=\"sig-param\"><span class=\"n\">max_val</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/semantic.html#Semantic\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Semantic\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>Semantic adversarial examples</p>\n<p><a class=\"reference external\" href=\"https://arxiv.org/abs/1703.06857\">https://arxiv.org/abs/1703.06857</a></p>\n<p>Note: data must either be centered (so that the negative image can be\nmade by simple negation) or must be in the interval [-1, 1]</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>center</strong> – bool\nIf True, assumes data has 0 mean so the negative image is just negation.\nIf False, assumes data is in the interval [0, max_val]</p></li>\n<li><p><strong>max_val</strong> – float\nMaximum value allowed in the input data</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of data</p></li>\n<li><p><strong>kwargs</strong> – passed through to the super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.Semantic.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/semantic.html#Semantic.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.Semantic.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate the attack’s symbolic graph for adversarial examples. This\nmethod should be overriden in any child class that implements an\nattack that is expressable symbolically. Otherwise, it will wrap the\nnumerical implementation as a symbolic operator.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>**kwargs</strong> – <p>optional parameters used by child classes.\nEach child class defines additional parameters as needed.\nChild classes that use the following concepts should use the following\nnames:</p>\n<blockquote>\n<div><p>clip_min: minimum feature value\nclip_max: maximum feature value\neps: size of norm constraint on adversarial perturbation\nord: order of norm constraint\nnb_iter: number of iterations\neps_iter: size of norm constraint on iteration\ny_target: if specified, the attack is targeted.\ny: Do not specify if y_target is specified.</p>\n<blockquote>\n<div><p>If specified, the attack is untargeted, aims to make the output\nclass not be y.\nIf neither y_target nor y is specified, y is inferred by having\nthe model classify the input.</p>\n</div></blockquote>\n</div></blockquote>\n<p>For other concepts, it’s generally a good idea to read other classes\nand check for name consistency.</p>\n</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation of the adversarial examples.</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.SparseL1Descent\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">SparseL1Descent</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/sparse_l1_descent.html#SparseL1Descent\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SparseL1Descent\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This class implements a variant of Projected Gradient Descent for the l1-norm\n(Tramer and Boneh 2019). The l1-norm case is more tricky than the l-inf and l2\ncases covered by the ProjectedGradientDescent class, because the steepest\ndescent direction for the l1-norm is too sparse (it updates a single\ncoordinate in the adversarial perturbation in each step). This attack has an\nadditional parameter that controls the sparsity of the update step. For\nmoderately sparse update steps, the attack vastly outperforms Projected\nSteepest Descent and is competitive with other attacks targeted at the l1-norm\nsuch as the ElasticNetMethod attack (which is much more computationally\nexpensive).\nPaper link (Tramer and Boneh 2019): <a class=\"reference external\" href=\"https://arxiv.org/pdf/1904.13000.pdf\">https://arxiv.org/pdf/1904.13000.pdf</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SparseL1Descent.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/sparse_l1_descent.html#SparseL1Descent.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SparseL1Descent.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SparseL1Descent.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">10.0</span></em>, <em class=\"sig-param\"><span class=\"n\">eps_iter</span><span class=\"o\">=</span><span class=\"default_value\">1.0</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">20</span></em>, <em class=\"sig-param\"><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">y_target</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">rand_init</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_grad</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\"><span class=\"n\">grad_sparsity</span><span class=\"o\">=</span><span class=\"default_value\">99</span></em>, <em class=\"sig-param\"><span class=\"n\">sanity_checks</span><span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/sparse_l1_descent.html#SparseL1Descent.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SparseL1Descent.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float) maximum distortion of adversarial example\ncompared to original input</p></li>\n<li><p><strong>eps_iter</strong> – (optional float) step size for each attack iteration</p></li>\n<li><p><strong>nb_iter</strong> – (optional int) Number of attack iterations.</p></li>\n<li><p><strong>y</strong> – (optional) A tensor with the true labels.</p></li>\n<li><p><strong>y_target</strong> – (optional) A tensor with the labels to target. Leave\ny_target=None if y is also set. Labels should be\none-hot-encoded.</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n<li><p><strong>clip_grad</strong> – (optional bool) Ignore gradient components\nat positions where the input is already at the boundary\nof the domain, and the update step will get clipped out.</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"simple\">\n<dt>:param grad_sparsity (optional) Relative sparsity of the gradient update</dt><dd><p>step, in percent. Only gradient values larger\nthan this percentile are retained. This parameter can\nbe a scalar, or a vector of the same length as the\ninput batch dimension.</p>\n</dd>\n</dl>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>sanity_checks</strong> – <p>bool Insert tf asserts checking values\n(Some tests need to run with no sanity checks because the</p>\n<blockquote>\n<div><p>tests intentionally configure the attack strangely)</p>\n</div></blockquote>\n</p>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.SpatialTransformationMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">SpatialTransformationMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spatial_transformation_method.html#SpatialTransformationMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SpatialTransformationMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>Spatial transformation attack</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SpatialTransformationMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spatial_transformation_method.html#SpatialTransformationMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SpatialTransformationMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.\n:param x: The model’s symbolic inputs.\n:param kwargs: See <cite>parse_params</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.SpatialTransformationMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">n_samples</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dx_min</span><span class=\"o\">=</span><span class=\"default_value\">- 0.1</span></em>, <em class=\"sig-param\"><span class=\"n\">dx_max</span><span class=\"o\">=</span><span class=\"default_value\">0.1</span></em>, <em class=\"sig-param\"><span class=\"n\">n_dxs</span><span class=\"o\">=</span><span class=\"default_value\">2</span></em>, <em class=\"sig-param\"><span class=\"n\">dy_min</span><span class=\"o\">=</span><span class=\"default_value\">- 0.1</span></em>, <em class=\"sig-param\"><span class=\"n\">dy_max</span><span class=\"o\">=</span><span class=\"default_value\">0.1</span></em>, <em class=\"sig-param\"><span class=\"n\">n_dys</span><span class=\"o\">=</span><span class=\"default_value\">2</span></em>, <em class=\"sig-param\"><span class=\"n\">angle_min</span><span class=\"o\">=</span><span class=\"default_value\">- 30</span></em>, <em class=\"sig-param\"><span class=\"n\">angle_max</span><span class=\"o\">=</span><span class=\"default_value\">30</span></em>, <em class=\"sig-param\"><span class=\"n\">n_angles</span><span class=\"o\">=</span><span class=\"default_value\">6</span></em>, <em class=\"sig-param\"><span class=\"n\">black_border_size</span><span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spatial_transformation_method.html#SpatialTransformationMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.SpatialTransformationMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.\n:param n_samples: (optional) The number of transformations sampled to</p>\n<blockquote>\n<div><p>construct the attack. Set it to None to run\nfull grid attack.</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>dx_min</strong> – (optional float) Minimum translation ratio along x-axis.</p></li>\n<li><p><strong>dx_max</strong> – (optional float) Maximum translation ratio along x-axis.</p></li>\n<li><p><strong>n_dxs</strong> – (optional int) Number of discretized translation ratios\nalong x-axis.</p></li>\n<li><p><strong>dy_min</strong> – (optional float) Minimum translation ratio along y-axis.</p></li>\n<li><p><strong>dy_max</strong> – (optional float) Maximum translation ratio along y-axis.</p></li>\n<li><p><strong>n_dys</strong> – (optional int) Number of discretized translation ratios\nalong y-axis.</p></li>\n<li><p><strong>angle_min</strong> – (optional float) Largest counter-clockwise rotation\nangle.</p></li>\n<li><p><strong>angle_max</strong> – (optional float) Largest clockwise rotation angle.</p></li>\n<li><p><strong>n_angles</strong> – (optional int) Number of discretized angles.</p></li>\n<li><p><strong>black_border_size</strong> – (optional int) size of the black border in pixels.</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.attacks.VirtualAdversarialMethod\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">VirtualAdversarialMethod</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">sess</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dtypestr</span><span class=\"o\">=</span><span class=\"default_value\">'float32'</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/virtual_adversarial_method.html#VirtualAdversarialMethod\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.VirtualAdversarialMethod\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.attacks.attack.Attack</span></code></p>\n<p>This attack was originally proposed by Miyato et al. (2016) and was used\nfor virtual adversarial training.\nPaper link: <a class=\"reference external\" href=\"https://arxiv.org/abs/1507.00677\">https://arxiv.org/abs/1507.00677</a></p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>model</strong> – cleverhans.model.Model</p></li>\n<li><p><strong>sess</strong> – optional tf.Session</p></li>\n<li><p><strong>dtypestr</strong> – dtype of the data</p></li>\n<li><p><strong>kwargs</strong> – passed through to super constructor</p></li>\n</ul>\n</dd>\n</dl>\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.VirtualAdversarialMethod.generate\">\n<code class=\"sig-name descname\">generate</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/virtual_adversarial_method.html#VirtualAdversarialMethod.generate\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.VirtualAdversarialMethod.generate\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generate symbolic graph for adversarial examples and return.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>x</strong> – The model’s symbolic inputs.</p></li>\n<li><p><strong>kwargs</strong> – See <cite>parse_params</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.attacks.VirtualAdversarialMethod.parse_params\">\n<code class=\"sig-name descname\">parse_params</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eps</span><span class=\"o\">=</span><span class=\"default_value\">2.0</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_iter</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"default_value\">1e-06</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/virtual_adversarial_method.html#VirtualAdversarialMethod.parse_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.VirtualAdversarialMethod.parse_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Take in a dictionary of parameters and applies attack-specific checks\nbefore saving them as attributes.</p>\n<p>Attack-specific parameters:</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – (optional float )the epsilon (input variation parameter)</p></li>\n<li><p><strong>nb_iter</strong> – (optional) the number of iterations\nDefaults to 1 if not specified</p></li>\n<li><p><strong>xi</strong> – (optional float) the finite difference parameter</p></li>\n<li><p><strong>clip_min</strong> – (optional float) Minimum input component value</p></li>\n<li><p><strong>clip_max</strong> – (optional float) Maximum input component value</p></li>\n<li><p><strong>num_iterations</strong> – Deprecated alias for <cite>nb_iter</cite></p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.clip_eta\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">clip_eta</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">eta</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/utils_tf.html#clip_eta\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.clip_eta\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Helper function to clip the perturbation to epsilon norm ball.\n:param eta: A tensor with the current perturbation.\n:param ord: Order of the norm (mimics Numpy).</p>\n<blockquote>\n<div><p>Possible values: np.inf, 1 or 2.</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>eps</strong> – Epsilon, bound of the perturbation.</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.fgm\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">fgm</code><span class=\"sig-paren\">(</span><em class=\"sig-param\">x</em>, <em class=\"sig-param\">logits</em>, <em class=\"sig-param\">y=None</em>, <em class=\"sig-param\">eps=0.3</em>, <em class=\"sig-param\">ord=inf</em>, <em class=\"sig-param\">loss_fn=&lt;function softmax_cross_entropy_with_logits&gt;</em>, <em class=\"sig-param\">clip_min=None</em>, <em class=\"sig-param\">clip_max=None</em>, <em class=\"sig-param\">clip_grad=False</em>, <em class=\"sig-param\">targeted=False</em>, <em class=\"sig-param\">sanity_checks=True</em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#fgm\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.fgm\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>TensorFlow implementation of the Fast Gradient Method.\n:param x: the input placeholder\n:param logits: output of model.get_logits\n:param y: (optional) A placeholder for the true labels. If targeted</p>\n<blockquote>\n<div><p>is true, then provide the target label. Otherwise, only provide\nthis parameter if you’d like to use true labels when crafting\nadversarial samples. Otherwise, model predictions are used as\nlabels to avoid the “label leaking” effect (explained in this\npaper: <a class=\"reference external\" href=\"https://arxiv.org/abs/1611.01236\">https://arxiv.org/abs/1611.01236</a>). Default is None.\nLabels should be one-hot-encoded.</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – the epsilon (input variation parameter)</p></li>\n<li><p><strong>ord</strong> – (optional) Order of the norm (mimics NumPy).\nPossible values: np.inf, 1 or 2.</p></li>\n<li><p><strong>loss_fn</strong> – Loss function that takes (labels, logits) as arguments and returns loss</p></li>\n<li><p><strong>clip_min</strong> – Minimum float value for adversarial example components</p></li>\n<li><p><strong>clip_max</strong> – Maximum float value for adversarial example components</p></li>\n<li><p><strong>clip_grad</strong> – (optional bool) Ignore gradient components\nat positions where the input is already at the boundary\nof the domain, and the update step will get clipped out.</p></li>\n<li><p><strong>targeted</strong> – Is the attack targeted or untargeted? Untargeted, the\ndefault, will try to make the label incorrect. Targeted\nwill instead try to move in the direction of being more\nlike y.</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>a tensor for the adversarial example</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.optimize_linear\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">optimize_linear</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">grad</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span></em>, <em class=\"sig-param\"><span class=\"n\">ord</span><span class=\"o\">=</span><span class=\"default_value\">inf</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/fast_gradient_method.html#optimize_linear\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.optimize_linear\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Solves for the optimal input to a linear function under a norm constraint.</p>\n<p>Optimal_perturbation = argmax_{eta, ||eta||_{ord} &lt; eps} dot(eta, grad)</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>grad</strong> – tf tensor containing a batch of gradients</p></li>\n<li><p><strong>eps</strong> – float scalar specifying size of constraint region</p></li>\n<li><p><strong>ord</strong> – int specifying order of norm</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>tf tensor containing optimal perturbation</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.projected_optimization\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">projected_optimization</code><span class=\"sig-paren\">(</span><em class=\"sig-param\">loss_fn</em>, <em class=\"sig-param\">input_image</em>, <em class=\"sig-param\">label</em>, <em class=\"sig-param\">epsilon</em>, <em class=\"sig-param\">num_steps</em>, <em class=\"sig-param\">clip_min=None</em>, <em class=\"sig-param\">clip_max=None</em>, <em class=\"sig-param\">optimizer=&lt;cleverhans.attacks.spsa.TensorAdam object&gt;</em>, <em class=\"sig-param\">project_perturbation=&lt;function _project_perturbation&gt;</em>, <em class=\"sig-param\">early_stop_loss_threshold=None</em>, <em class=\"sig-param\">is_debug=False</em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/spsa.html#projected_optimization\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.projected_optimization\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Generic projected optimization, generalized to work with approximate\ngradients. Used for e.g. the SPSA attack.</p>\n<dl>\n<dt>Args:</dt><dd><dl class=\"field-list\">\n<dt class=\"field-odd\">param loss_fn</dt>\n<dd class=\"field-odd\"><p>A callable which takes <cite>input_image</cite> and <cite>label</cite> as\narguments, and returns a batch of loss values. Same\ninterface as TensorOptimizer.</p>\n</dd>\n<dt class=\"field-even\">param input_image</dt>\n<dd class=\"field-even\"><p>Tensor, a batch of images</p>\n</dd>\n<dt class=\"field-odd\">param label</dt>\n<dd class=\"field-odd\"><p>Tensor, a batch of labels</p>\n</dd>\n<dt class=\"field-even\">param epsilon</dt>\n<dd class=\"field-even\"><p>float, the L-infinity norm of the maximum allowable\nperturbation</p>\n</dd>\n<dt class=\"field-odd\">param num_steps</dt>\n<dd class=\"field-odd\"><p>int, the number of steps of gradient descent</p>\n</dd>\n<dt class=\"field-even\">param clip_min</dt>\n<dd class=\"field-even\"><p>float, minimum pixel value</p>\n</dd>\n<dt class=\"field-odd\">param clip_max</dt>\n<dd class=\"field-odd\"><p>float, maximum pixel value</p>\n</dd>\n<dt class=\"field-even\">param optimizer</dt>\n<dd class=\"field-even\"><p>A <cite>TensorOptimizer</cite> object</p>\n</dd>\n<dt class=\"field-odd\">param project_perturbation</dt>\n<dd class=\"field-odd\"><p>A function, which will be used to enforce\nsome constraint. It should have the same\nsignature as <cite>_project_perturbation</cite>.</p>\n</dd>\n<dt class=\"field-even\">param early_stop_loss_threshold</dt>\n<dd class=\"field-even\"><p>A float or None. If specified, the attack will end if the loss is below\n<cite>early_stop_loss_threshold</cite>.</p>\n<blockquote>\n<div><dl class=\"simple\">\n<dt>Enabling this option can have several different effects:</dt><dd><ul class=\"simple\">\n<li><p>Setting the threshold to 0. guarantees that if a successful attack is found, it is returned.\nThis increases the attack success rate, because without early stopping the optimizer can accidentally\nbounce back to a point where the attack fails.</p></li>\n<li><p>Early stopping can make the attack run faster because it may run for fewer steps.</p></li>\n<li><p>Early stopping can make the attack run slower because the loss must be calculated at each step.\nThe loss is not calculated as part of the normal SPSA optimization procedure.\nFor most reasonable choices of hyperparameters, early stopping makes the attack much faster because\nit decreases the number of steps dramatically.</p></li>\n</ul>\n</dd>\n</dl>\n</div></blockquote>\n</dd>\n<dt class=\"field-odd\">param is_debug</dt>\n<dd class=\"field-odd\"><p>A bool. If True, print debug info for attack progress.</p>\n</dd>\n</dl>\n</dd>\n<dt>Returns:</dt><dd><dl class=\"simple\">\n<dt>adversarial version of <cite>input_image</cite>, with L-infinity difference less than</dt><dd><p>epsilon, which tries to minimize loss_fn.</p>\n</dd>\n</dl>\n</dd>\n</dl>\n<p>Note that this function is not intended as an Attack by itself. Rather, it\nis designed as a helper function which you can use to write your own attack\nmethods. The method uses a tf.while_loop to optimize a loss function in\na single sess.run() call.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.reduce_max\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">reduce_max</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span><span class=\"n\">args</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"headerlink\" href=\"#cleverhans.attacks.reduce_max\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issues a deprecation warning and passes through the arguments.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.reduce_mean\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">reduce_mean</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span><span class=\"n\">args</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"headerlink\" href=\"#cleverhans.attacks.reduce_mean\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issues a deprecation warning and passes through the arguments.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.reduce_sum\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">reduce_sum</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span><span class=\"n\">args</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"headerlink\" href=\"#cleverhans.attacks.reduce_sum\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issues a deprecation warning and passes through the arguments.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.softmax_cross_entropy_with_logits\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">softmax_cross_entropy_with_logits</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">sentinel</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">labels</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">logits</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">dim</span><span class=\"o\">=</span><span class=\"default_value\">- 1</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/compat.html#softmax_cross_entropy_with_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.softmax_cross_entropy_with_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Wrapper around tf.nn.softmax_cross_entropy_with_logits_v2 to handle\ndeprecated warning</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.vatm\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">vatm</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">model</span></em>, <em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">logits</span></em>, <em class=\"sig-param\"><span class=\"n\">eps</span></em>, <em class=\"sig-param\"><span class=\"n\">num_iterations</span><span class=\"o\">=</span><span class=\"default_value\">1</span></em>, <em class=\"sig-param\"><span class=\"n\">xi</span><span class=\"o\">=</span><span class=\"default_value\">1e-06</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_min</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">clip_max</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/attacks/virtual_adversarial_method.html#vatm\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.vatm\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Tensorflow implementation of the perturbation method used for virtual\nadversarial training: <a class=\"reference external\" href=\"https://arxiv.org/abs/1507.00677\">https://arxiv.org/abs/1507.00677</a>\n:param model: the model which returns the network unnormalized logits\n:param x: the input placeholder\n:param logits: the model’s unnormalized output tensor (the input to</p>\n<blockquote>\n<div><p>the softmax layer)</p>\n</div></blockquote>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>eps</strong> – the epsilon (input variation parameter)</p></li>\n<li><p><strong>num_iterations</strong> – the number of iterations</p></li>\n<li><p><strong>xi</strong> – the finite difference parameter</p></li>\n<li><p><strong>clip_min</strong> – optional parameter that can be used to set a minimum\nvalue for components of the example returned</p></li>\n<li><p><strong>clip_max</strong> – optional parameter that can be used to set a maximum\nvalue for components of the example returned</p></li>\n<li><p><strong>seed</strong> – the seed for random generator</p></li>\n</ul>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>a tensor for the adversarial example</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.wrapper_warning\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">wrapper_warning</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#wrapper_warning\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.wrapper_warning\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issue a deprecation warning. Used in multiple places that implemented\nattacks by automatically wrapping a user-supplied callable with a\nCallableModelWrapper with output_layer=”probs”.\nUsing “probs” as any part of the attack interface is dangerous.\nWe can’t just change output_layer to logits because:\n- that would be a silent interface change. We’d have no way of detecting</p>\n<blockquote>\n<div><p>code that still means to use probs. Note that we can’t just check whether\nthe final output op is a softmax—for example, Inception puts a reshape\nafter the softmax.</p>\n</div></blockquote>\n<ul class=\"simple\">\n<li><p>automatically wrapping user-supplied callables with output_layer=’logits’\nis even worse, see <cite>wrapper_warning_logits</cite></p></li>\n</ul>\n<p>Note: this function will be removed at the same time as the code that\ncalls it.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.attacks.wrapper_warning_logits\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">wrapper_warning_logits</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#wrapper_warning_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.attacks.wrapper_warning_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issue a deprecation warning. Used in multiple places that implemented\nattacks by automatically wrapping a user-supplied callable with a\nCallableModelWrapper with output_layer=”logits”.\nThis is dangerous because it is under-the-hood automagic that the user\nmay not realize has been invoked for them. If they pass a callable\nthat actually outputs probs, the probs will be treated as logits,\nresulting in an incorrect cross-entropy loss and severe gradient\nmasking.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.attacks.xrange\">\n<code class=\"sig-prename descclassname\">cleverhans.attacks.</code><code class=\"sig-name descname\">xrange</code><a class=\"headerlink\" href=\"#cleverhans.attacks.xrange\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>alias of <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">range</span></code></p>\n</dd></dl>\n\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul class=\"current\">\n<li class=\"toctree-l1 current\"><a class=\"current reference internal\" href=\"#\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n      <li>Previous: <a href=\"../index.html\" title=\"previous chapter\">CleverHans Documentation</a></li>\n      <li>Next: <a href=\"model.html\" title=\"next chapter\"><cite>model</cite> module</a></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/source/devtools.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>devtools module &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"module-cleverhans.devtools\">\n<span id=\"devtools-module\"></span><h1><cite>devtools</cite> module<a class=\"headerlink\" href=\"#module-cleverhans.devtools\" title=\"Permalink to this headline\">¶</a></h1>\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/source/future.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>future module &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"module-cleverhans.devtools\">\n<span id=\"future-module\"></span><h1><cite>future</cite> module<a class=\"headerlink\" href=\"#module-cleverhans.devtools\" title=\"Permalink to this headline\">¶</a></h1>\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"model.html\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docs/source/model.html",
    "content": "\n<!DOCTYPE html>\n\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>model module &#8212; CleverHans  documentation</title>\n    <link rel=\"stylesheet\" href=\"../_static/pygments.css\" type=\"text/css\" />\n    <link rel=\"stylesheet\" href=\"../_static/alabaster.css\" type=\"text/css\" />\n    <script id=\"documentation_options\" data-url_root=\"../\" src=\"../_static/documentation_options.js\"></script>\n    <script src=\"../_static/jquery.js\"></script>\n    <script src=\"../_static/underscore.js\"></script>\n    <script src=\"../_static/doctools.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"../genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"../search.html\" />\n    <link rel=\"prev\" title=\"attacks module\" href=\"attacks.html\" />\n   \n  <link rel=\"stylesheet\" href=\"../_static/custom.css\" type=\"text/css\" />\n  \n  \n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=0.9, maximum-scale=0.9\" />\n\n  </head><body>\n  \n\n    <div class=\"document\">\n      <div class=\"documentwrapper\">\n        <div class=\"bodywrapper\">\n          \n\n          <div class=\"body\" role=\"main\">\n            \n  <div class=\"section\" id=\"module-cleverhans.model\">\n<span id=\"model-module\"></span><h1><cite>model</cite> module<a class=\"headerlink\" href=\"#module-cleverhans.model\" title=\"Permalink to this headline\">¶</a></h1>\n<p>The Model class and related functionality.</p>\n<dl class=\"py class\">\n<dt id=\"cleverhans.model.CallableModelWrapper\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">CallableModelWrapper</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">callable_fn</span></em>, <em class=\"sig-param\"><span class=\"n\">output_layer</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#CallableModelWrapper\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.CallableModelWrapper\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <a class=\"reference internal\" href=\"#cleverhans.model.Model\" title=\"cleverhans.model.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cleverhans.model.Model</span></code></a></p>\n<p>A wrapper that turns a callable into a valid Model</p>\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.CallableModelWrapper.fprop\">\n<code class=\"sig-name descname\">fprop</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#CallableModelWrapper.fprop\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.CallableModelWrapper.fprop\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Forward propagation to compute the model outputs.\n:param x: A symbolic representation of the network input\n:return: A dictionary mapping layer names to the symbolic</p>\n<blockquote>\n<div><p>representation of their output.</p>\n</div></blockquote>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt id=\"cleverhans.model.Model\">\n<em class=\"property\">class </em><code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">Model</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">scope</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">nb_classes</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">hparams</span><span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"n\">needs_dummy_fprop</span><span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">object</span></code></p>\n<p>An abstract interface for model wrappers that exposes model symbols\nneeded for making an attack. This abstraction removes the dependency on\nany specific neural network package (e.g. Keras) from the core\ncode of CleverHans. It can also simplify exposing the hidden features of a\nmodel when a specific package does not directly expose them.</p>\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.model.Model.O_FEATURES\">\n<code class=\"sig-name descname\">O_FEATURES</code><em class=\"property\"> = 'features'</em><a class=\"headerlink\" href=\"#cleverhans.model.Model.O_FEATURES\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.model.Model.O_LOGITS\">\n<code class=\"sig-name descname\">O_LOGITS</code><em class=\"property\"> = 'logits'</em><a class=\"headerlink\" href=\"#cleverhans.model.Model.O_LOGITS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt id=\"cleverhans.model.Model.O_PROBS\">\n<code class=\"sig-name descname\">O_PROBS</code><em class=\"property\"> = 'probs'</em><a class=\"headerlink\" href=\"#cleverhans.model.Model.O_PROBS\" title=\"Permalink to this definition\">¶</a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.fprop\">\n<code class=\"sig-name descname\">fprop</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.fprop\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.fprop\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Forward propagation to compute the model outputs.\n:param x: A symbolic representation of the network input\n:return: A dictionary mapping layer names to the symbolic</p>\n<blockquote>\n<div><p>representation of their output.</p>\n</div></blockquote>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_layer\">\n<code class=\"sig-name descname\">get_layer</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"n\">layer</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_layer\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_layer\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return a layer output.\n:param x: tensor, the input to the network.\n:param layer: str, the name of the layer to compute.\n:param <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">**</span></a>kwargs: dict, extra optional params to pass to self.fprop.\n:return: the content of layer <cite>layer</cite></p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_layer_names\">\n<code class=\"sig-name descname\">get_layer_names</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_layer_names\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_layer_names\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Return the list of exposed layers for this model.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_logits\">\n<code class=\"sig-name descname\">get_logits</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the output logits</p>\n</dd>\n</dl>\n<p>(i.e., the values fed as inputs to the softmax layer).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_params\">\n<code class=\"sig-name descname\">get_params</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Provides access to the model’s parameters.\n:return: A list of all Variables defining the model parameters.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_predicted_class\">\n<code class=\"sig-name descname\">get_predicted_class</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_predicted_class\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_predicted_class\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the predicted label</p>\n</dd>\n</dl>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.get_probs\">\n<code class=\"sig-name descname\">get_probs</code><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\">x</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span><span class=\"n\">kwargs</span></em><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.get_probs\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.get_probs\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parameters</dt>\n<dd class=\"field-odd\"><p><strong>x</strong> – A symbolic representation (Tensor) of the network input</p>\n</dd>\n<dt class=\"field-even\">Returns</dt>\n<dd class=\"field-even\"><p>A symbolic representation (Tensor) of the output</p>\n</dd>\n</dl>\n<p>probabilities (i.e., the output values produced by the softmax layer).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.make_input_placeholder\">\n<code class=\"sig-name descname\">make_input_placeholder</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_input_placeholder\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.make_input_placeholder\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create and return a placeholder representing an input to the model.</p>\n<p>This method should respect context managers (e.g. “with tf.device”)\nand should not just return a reference to a single pre-created\nplaceholder.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.make_label_placeholder\">\n<code class=\"sig-name descname\">make_label_placeholder</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_label_placeholder\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.make_label_placeholder\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create and return a placeholder representing class labels.</p>\n<p>This method should respect context managers (e.g. “with tf.device”)\nand should not just return a reference to a single pre-created\nplaceholder.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt id=\"cleverhans.model.Model.make_params\">\n<code class=\"sig-name descname\">make_params</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#Model.make_params\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.Model.make_params\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Create all Variables to be returned later by get_params.\nBy default this is a no-op.\nModels that need their fprop to be called for their params to be\ncreated can set <cite>needs_dummy_fprop=True</cite> in the constructor.</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py exception\">\n<dt id=\"cleverhans.model.NoSuchLayerError\">\n<em class=\"property\">exception </em><code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">NoSuchLayerError</code><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#NoSuchLayerError\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.NoSuchLayerError\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Bases: <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ValueError</span></code></p>\n<p>Raised when a layer that does not exist is requested.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.model.wrapper_warning\">\n<code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">wrapper_warning</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#wrapper_warning\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.wrapper_warning\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issue a deprecation warning. Used in multiple places that implemented\nattacks by automatically wrapping a user-supplied callable with a\nCallableModelWrapper with output_layer=”probs”.\nUsing “probs” as any part of the attack interface is dangerous.\nWe can’t just change output_layer to logits because:\n- that would be a silent interface change. We’d have no way of detecting</p>\n<blockquote>\n<div><p>code that still means to use probs. Note that we can’t just check whether\nthe final output op is a softmax—for example, Inception puts a reshape\nafter the softmax.</p>\n</div></blockquote>\n<ul class=\"simple\">\n<li><p>automatically wrapping user-supplied callables with output_layer=’logits’\nis even worse, see <cite>wrapper_warning_logits</cite></p></li>\n</ul>\n<p>Note: this function will be removed at the same time as the code that\ncalls it.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt id=\"cleverhans.model.wrapper_warning_logits\">\n<code class=\"sig-prename descclassname\">cleverhans.model.</code><code class=\"sig-name descname\">wrapper_warning_logits</code><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"reference internal\" href=\"../_modules/cleverhans/model.html#wrapper_warning_logits\"><span class=\"viewcode-link\">[source]</span></a><a class=\"headerlink\" href=\"#cleverhans.model.wrapper_warning_logits\" title=\"Permalink to this definition\">¶</a></dt>\n<dd><p>Issue a deprecation warning. Used in multiple places that implemented\nattacks by automatically wrapping a user-supplied callable with a\nCallableModelWrapper with output_layer=”logits”.\nThis is dangerous because it is under-the-hood automagic that the user\nmay not realize has been invoked for them. If they pass a callable\nthat actually outputs probs, the probs will be treated as logits,\nresulting in an incorrect cross-entropy loss and severe gradient\nmasking.</p>\n</dd></dl>\n\n</div>\n\n\n          </div>\n          \n        </div>\n      </div>\n      <div class=\"sphinxsidebar\" role=\"navigation\" aria-label=\"main navigation\">\n        <div class=\"sphinxsidebarwrapper\">\n<h1 class=\"logo\"><a href=\"../index.html\">CleverHans</a></h1>\n\n\n\n\n\n\n\n\n<h3>Navigation</h3>\n<ul class=\"current\">\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"attacks.html\"><cite>attacks</cite> module</a></li>\n<li class=\"toctree-l1 current\"><a class=\"current reference internal\" href=\"#\"><cite>model</cite> module</a></li>\n</ul>\n\n<div class=\"relations\">\n<h3>Related Topics</h3>\n<ul>\n  <li><a href=\"../index.html\">Documentation overview</a><ul>\n      <li>Previous: <a href=\"attacks.html\" title=\"previous chapter\"><cite>attacks</cite> module</a></li>\n  </ul></li>\n</ul>\n</div>\n<div id=\"searchbox\" style=\"display: none\" role=\"search\">\n  <h3 id=\"searchlabel\">Quick search</h3>\n    <div class=\"searchformwrapper\">\n    <form class=\"search\" action=\"../search.html\" method=\"get\">\n      <input type=\"text\" name=\"q\" aria-labelledby=\"searchlabel\" />\n      <input type=\"submit\" value=\"Go\" />\n    </form>\n    </div>\n</div>\n<script>$('#searchbox').show(0);</script>\n\n\n\n\n\n\n\n\n        </div>\n      </div>\n      <div class=\"clearer\"></div>\n    </div>\n\n\n  </body>\n</html>"
  },
  {
    "path": "docsource/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = python -msphinx\nSPHINXPROJ    = CleverHans\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\nfull-api:\n\tsphinx-apidoc --suffix .md -o source ..\n\n\n.PHONY: help Makefile\n\n# To keep the source and output separate, but still be able to both publish\n# on GitHub Pages and preview builds locally.\ngithub:\n\t@make html\n\t@cp -a _build/html/. ../docs\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)"
  },
  {
    "path": "docsource/README.md",
    "content": "# Generate documentation\r\n\r\nTo generate the documentation do:\r\n`make github`\r\n\r\nThe documentation files will be copied to the `cleverhans/docs` directory.\r\n\r\n### Preparation\r\n\r\nPlease do:\r\n`pip install sphinx`\r\n\r\nAdd a `.nojekyll` file in the `cleverhans/docs` directory. When GitHub sees\r\na `.nojekyll` file, it serves the root `index.html` file. The `.nojekyll` file\r\nindicates that we are not using Jekyll as our static site generator in this\r\nrepository.\r\n\r\n### Enable GitHub Pages for the GitHub repository\r\n\r\n1. Go to the repository on the GitHub website and make sure you are logged in.\r\n2. Add a /docs directory to the master branch. Otherwise you do not get the\r\n   master branch /docs folder for the Source option in the drop-down list.\r\n3. Click the Settings tab. You first go to the Options section.\r\n4. Scroll down to the GitHub Pages section and choose the drop-down list under\r\n   Source. Note: Your choices will differ based on whether you’re in a User repo\r\n   or an Org repository.\r\n5. To keep source and output HTML separate, choose master branch /docs folder\r\n   for Source.\r\n\r\n### Build Sphinx locally and publish on GitHub Pages\r\n\r\nWe keep the source docsource and output docs separate, but still are able to\r\npublish on GitHub Pages and preview builds locally.\r\n\r\nWe have the following option in the Makefile:\r\n\r\n```\r\n  github:\r\n      @make html\r\n      @cp -a _build/html/. ../docs\r\n```\r\n\r\nThus, we can run `make github` from the `docsource` directory to generate a\r\nlocal preview and move the docs where GitHub wants to serve them from.\r\n\r\n### Hacks\r\n\r\nIf you cannot build the docs for attacks, uncomment\r\n`import tensorflow_addons as tfa` in `cleverhans/attacks/spsa.py`.\r\n\r\nOtherwise:\r\n\r\n```angular2html\r\nWARNING: autodoc: failed to import module 'attacks' from module 'cleverhans'; the following exception was raised:\r\ncannot import name 'keras_tensor'\r\n```\r\n\r\nIt is convenient to create a virtual environment to install all the specific\r\nlibraries (e.g. virutalen cleverhans).\r\n"
  },
  {
    "path": "docsource/_templates/layout.html",
    "content": "{% extends '!layout.html' %}\n\n{% block footer %}\n\n{% endblock %}"
  },
  {
    "path": "docsource/conf.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n#\n# CleverHans documentation build configuration file, created by\n# sphinx-quickstart on Wed Sep 20 15:14:07 2017.\n#\n# This file is execfile()d with the current directory set to its\n# containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, as shown here.\n#\nimport os\nimport sys\n\nsys.path.insert(0, os.path.abspath(\"..\"))\n\n# -- General configuration ------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    \"sphinx.ext.autodoc\",\n    \"sphinx.ext.mathjax\",\n    \"sphinx.ext.viewcode\",\n    \"sphinx.ext.githubpages\",\n]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n#\n# source_suffix = ['.rst', '.md']\nsource_suffix = \".md\"\n\n# The master toctree document.\nmaster_doc = \"index\"\n\n# General information about the project.\nproject = \"CleverHans\"\n\nauthor = \"Ian Goodfellow, Nicolas Papernot, Ryan Sheatsley\"\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\n# version = '2.0.0'\n# The full version, including alpha/beta/rc tags.\n# release = '2.0.0'\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = None\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This patterns also effect to html_static_path and html_extra_path\nexclude_patterns = [\"_build\", \"Thumbs.db\", \".DS_Store\"]\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = \"sphinx\"\n\n# If true, `todo` and `todoList` produce output, else they produce nothing.\ntodo_include_todos = False\n\n# -- Options for HTML output ----------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = \"alabaster\"\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#\n# html_theme_options = {}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = [\"_static\"]\n\n# Custom sidebar templates must be a dictionary that maps document names\n# to template names.\n#\n# This is required for the alabaster theme\n# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars\nhtml_sidebars = {\n    \"**\": [\n        \"about.html\",\n        \"navigation.html\",\n        \"relations.html\",  # needs 'show_related': True theme option to display\n        \"searchbox.html\",\n        \"donate.html\",\n    ]\n}\n\n# -- Options for HTMLHelp output ------------------------------------------\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = \"CleverHansdoc\"\n\n# -- Options for LaTeX output ---------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    #\n    # 'papersize': 'letterpaper',\n    # The font size ('10pt', '11pt' or '12pt').\n    #\n    # 'pointsize': '10pt',\n    # Additional stuff for the LaTeX preamble.\n    #\n    # 'preamble': '',\n    # Latex figure (float) alignment\n    #\n    # 'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (\n        master_doc,\n        \"CleverHans.tex\",\n        \"CleverHans Documentation\",\n        \"Ian Goodfellow, Nicolas Papernot, Ryan Sheatsley\",\n        \"manual\",\n    ),\n]\n\n# -- Options for manual page output ---------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [(master_doc, \"cleverhans\", \"CleverHans Documentation\", [author], 1)]\n\n# -- Options for Texinfo output -------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (\n        master_doc,\n        \"CleverHans\",\n        \"CleverHans Documentation\",\n        author,\n        \"CleverHans\",\n        \"One line description of project.\",\n        \"Miscellaneous\",\n    ),\n]\n"
  },
  {
    "path": "docsource/docs_requirements.txt",
    "content": "tensorflow"
  },
  {
    "path": "docsource/index.md",
    "content": ".. CleverHans documentation master file, created by\n   sphinx-quickstart on Wed Sep 20 15:14:07 2017.\n   You can adapt this file completely to your liking, but it should at least\n   contain the root `toctree` directive.\n\n   WARNING: This file has a markdown suffix, but is in fact .rst\n\nCleverHans Documentation\n======================================\n\n\nThis documentation is auto-generated from the docstrings of modules of the current `master` branch of `cleverhans\n<http://github.com/cleverhans-lab/cleverhans/>`_.\n\nTo get started, we recommend reading the `github readme\n<https://github.com/cleverhans-lab/cleverhans#setting-up-cleverhans>`_. Afterwards, you can learn more by looking at the following modules:\n\n\n.. toctree::\n   :maxdepth: 4\n\n   source/attacks\n   <!-- source/devtools -->\n   <!-- source/future -->\n   source/model\n\n\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n\n"
  },
  {
    "path": "docsource/source/attacks.md",
    "content": "`attacks` module\n--------------------------\n\n.. automodule:: cleverhans.attacks\n    :members:\n    :imported-members:\n    :undoc-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docsource/source/devtools.md",
    "content": "`devtools` module\r\n------------------------\r\n\r\n.. automodule:: cleverhans.devtools\r\n    :members:\r\n    :undoc-members:\r\n    :show-inheritance:\r\n"
  },
  {
    "path": "docsource/source/future.md",
    "content": "`future` module\r\n------------------------\r\n\r\n.. automodule:: cleverhans.devtools\r\n    :members:\r\n    :undoc-members:\r\n    :show-inheritance:\r\n"
  },
  {
    "path": "docsource/source/model.md",
    "content": "`model` module\n------------------------\n\n.. automodule:: cleverhans.model\n    :members:\n    :undoc-members:\n    :show-inheritance:\n"
  },
  {
    "path": "examples/README.md",
    "content": "# Examples\n"
  },
  {
    "path": "requirements/requirements-dev.txt",
    "content": "black>=20.8b1\nflake8>=3.8.0\nmypy>=0.790\nmypy-extensions>=0.4.3\npytest>=6.2.0\npre-commit>=2.9.0\n"
  },
  {
    "path": "requirements/requirements-gpu.txt",
    "content": "--find-links https://storage.googleapis.com/jax-releases/jax_releases.html\njaxlib>=0.1.60+cuda101\n"
  },
  {
    "path": "requirements/requirements-jax.txt",
    "content": "jax>=0.2.8\njaxlib>=0.1.60"
  },
  {
    "path": "requirements/requirements-pytorch.txt",
    "content": "torch>=1.7.0\ntorchvision>=0.8.2"
  },
  {
    "path": "requirements/requirements-tf2.txt",
    "content": "tensorflow>=2.3.0\ntensorflow-datasets>=4.2.0"
  },
  {
    "path": "requirements/requirements.txt",
    "content": "numpy>=1.19.0\nscipy>=1.5.0\neasydict>=1.9\nabsl-py>=0.10.0\nrequests>=2.25.0\n"
  },
  {
    "path": "setup.py",
    "content": "from setuptools import find_packages\nfrom setuptools import setup\n\nsetup(\n    name=\"cleverhans\",\n    version=\"4.0.0\",\n    url=\"https://github.com/cleverhans-lab/cleverhans\",\n    license=\"MIT\",\n    install_requires=[\n        \"nose\",\n        \"pycodestyle\",\n        \"scipy\",\n        \"matplotlib\",\n        \"mnist\",\n        \"numpy\",\n        \"tensorflow-probability\",\n        \"joblib\",\n        \"easydict\",\n        \"absl-py\",\n        \"six\",\n    ],\n    extras_require={\n        \"jax\": [\"jax>=0.2.9\", \"jaxlib\"],\n        \"tf\": [\"tensorflow>=2.4.0\", \"tensorflow-probability\", \"tensorflow-datasets\"],\n        \"pytorch\": [\"torch>=1.7.0\", \"torchvision>=0.8.0\"],\n    },\n    packages=find_packages(),\n)\n"
  },
  {
    "path": "tutorials/README.md",
    "content": "# Tutorials\n\nThis folder contains scripts demonstrating the features of CleverHans\nimplemented in one of the three supported frameworks (JAX, PyTorch, and TF2).\n"
  },
  {
    "path": "tutorials/generic/README.md",
    "content": "# Tutorials for framework independent features\n\nThis folder contains implementations of features that are implemented in a \nframework independent way (for example, it uses the numpy library only or can \nhandle support for all major deep learning libraries).\n"
  },
  {
    "path": "tutorials/generic/__init__.py",
    "content": ""
  },
  {
    "path": "tutorials/jax/__init__.py",
    "content": "\n"
  },
  {
    "path": "tutorials/jax/datasets.py",
    "content": "# Copyright 2018 Google LLC\n#\n# 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.\n\n\"\"\"Datasets used in examples.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport array\nimport gzip\nimport os\nfrom os import path\nimport struct\nfrom six.moves.urllib.request import urlretrieve\n\nimport numpy as np\n\nfrom cleverhans.jax.utils import one_hot, partial_flatten\n\n\n_DATA = \"/tmp/jax_example_data/\"\n\n\ndef _download(url, filename):\n    \"\"\"Download a url to a file in the JAX data temp directory.\"\"\"\n    if not path.exists(_DATA):\n        os.makedirs(_DATA)\n    out_file = path.join(_DATA, filename)\n    if not path.isfile(out_file):\n        urlretrieve(url, out_file)\n        print(\"downloaded {} to {}\".format(url, _DATA))\n\n\ndef mnist_raw():\n    \"\"\"Download and parse the raw MNIST dataset.\"\"\"\n    # CVDF mirror of http://yann.lecun.com/exdb/mnist/\n    base_url = \"https://storage.googleapis.com/cvdf-datasets/mnist/\"\n\n    def parse_labels(filename):\n        with gzip.open(filename, \"rb\") as fh:\n            _ = struct.unpack(\">II\", fh.read(8))\n            return np.array(array.array(\"B\", fh.read()), dtype=np.uint8)\n\n    def parse_images(filename):\n        with gzip.open(filename, \"rb\") as fh:\n            _, num_data, rows, cols = struct.unpack(\">IIII\", fh.read(16))\n            return np.array(array.array(\"B\", fh.read()), dtype=np.uint8).reshape(\n                num_data, rows, cols\n            )\n\n    for filename in [\n        \"train-images-idx3-ubyte.gz\",\n        \"train-labels-idx1-ubyte.gz\",\n        \"t10k-images-idx3-ubyte.gz\",\n        \"t10k-labels-idx1-ubyte.gz\",\n    ]:\n        _download(base_url + filename, filename)\n\n    train_images = parse_images(path.join(_DATA, \"train-images-idx3-ubyte.gz\"))\n    train_labels = parse_labels(path.join(_DATA, \"train-labels-idx1-ubyte.gz\"))\n    test_images = parse_images(path.join(_DATA, \"t10k-images-idx3-ubyte.gz\"))\n    test_labels = parse_labels(path.join(_DATA, \"t10k-labels-idx1-ubyte.gz\"))\n\n    return train_images, train_labels, test_images, test_labels\n\n\ndef mnist(permute_train=False):\n    \"\"\"Download, parse and process MNIST data to unit scale and one-hot labels.\"\"\"\n    train_images, train_labels, test_images, test_labels = mnist_raw()\n\n    train_images = partial_flatten(train_images) / np.float32(255.0)\n    test_images = partial_flatten(test_images) / np.float32(255.0)\n    train_labels = one_hot(train_labels, 10)\n    test_labels = one_hot(test_labels, 10)\n\n    if permute_train:\n        perm = np.random.RandomState(0).permutation(train_images.shape[0])\n        train_images = train_images[perm]\n        train_labels = train_labels[perm]\n\n    return train_images, train_labels, test_images, test_labels\n"
  },
  {
    "path": "tutorials/jax/mnist_tutorial.py",
    "content": "from absl import app, flags\n\nimport datasets\nimport itertools\nimport time\nimport jax.numpy as np\nimport numpy.random as npr\nfrom jax import jit, grad, random\nfrom jax.experimental import optimizers\nfrom jax.experimental import stax\nfrom jax.experimental.stax import logsoftmax\n\nfrom cleverhans.jax.attacks.fast_gradient_method import fast_gradient_method\nfrom cleverhans.jax.attacks.projected_gradient_descent import projected_gradient_descent\n\nFLAGS = flags.FLAGS\n\n\ndef main(_):\n    rng = random.PRNGKey(0)\n\n    # Load MNIST dataset\n    train_images, train_labels, test_images, test_labels = datasets.mnist()\n\n    batch_size = 128\n    batch_shape = (-1, 28, 28, 1)\n    num_train = train_images.shape[0]\n    num_complete_batches, leftover = divmod(num_train, batch_size)\n    num_batches = num_complete_batches + bool(leftover)\n\n    train_images = np.reshape(train_images, batch_shape)\n    test_images = np.reshape(test_images, batch_shape)\n\n    def data_stream():\n        rng = npr.RandomState(0)\n        while True:\n            perm = rng.permutation(num_train)\n            for i in range(num_batches):\n                batch_idx = perm[i * batch_size : (i + 1) * batch_size]\n                yield train_images[batch_idx], train_labels[batch_idx]\n\n    batches = data_stream()\n\n    # Model, loss, and accuracy functions\n    init_random_params, predict = stax.serial(\n        stax.Conv(32, (8, 8), strides=(2, 2), padding=\"SAME\"),\n        stax.Relu,\n        stax.Conv(128, (6, 6), strides=(2, 2), padding=\"VALID\"),\n        stax.Relu,\n        stax.Conv(128, (5, 5), strides=(1, 1), padding=\"VALID\"),\n        stax.Flatten,\n        stax.Dense(128),\n        stax.Relu,\n        stax.Dense(10),\n    )\n\n    def loss(params, batch):\n        inputs, targets = batch\n        preds = predict(params, inputs)\n        return -np.mean(logsoftmax(preds) * targets)\n\n    def accuracy(params, batch):\n        inputs, targets = batch\n        target_class = np.argmax(targets, axis=1)\n        predicted_class = np.argmax(predict(params, inputs), axis=1)\n        return np.mean(predicted_class == target_class)\n\n    # Instantiate an optimizer\n    opt_init, opt_update, get_params = optimizers.adam(0.001)\n\n    @jit\n    def update(i, opt_state, batch):\n        params = get_params(opt_state)\n        return opt_update(i, grad(loss)(params, batch), opt_state)\n\n    # Initialize model\n    _, init_params = init_random_params(rng, batch_shape)\n    opt_state = opt_init(init_params)\n    itercount = itertools.count()\n\n    # Training loop\n    print(\"\\nStarting training...\")\n    for epoch in range(FLAGS.nb_epochs):\n        start_time = time.time()\n        for _ in range(num_batches):\n            opt_state = update(next(itercount), opt_state, next(batches))\n        epoch_time = time.time() - start_time\n\n        # Evaluate model on clean data\n        params = get_params(opt_state)\n        train_acc = accuracy(params, (train_images, train_labels))\n        test_acc = accuracy(params, (test_images, test_labels))\n\n        # Evaluate model on adversarial data\n        model_fn = lambda images: predict(params, images)\n        test_images_fgm = fast_gradient_method(model_fn, test_images, FLAGS.eps, np.inf)\n        test_images_pgd = projected_gradient_descent(\n            model_fn, test_images, FLAGS.eps, 0.01, 40, np.inf\n        )\n        test_acc_fgm = accuracy(params, (test_images_fgm, test_labels))\n        test_acc_pgd = accuracy(params, (test_images_pgd, test_labels))\n\n        print(\"Epoch {} in {:0.2f} sec\".format(epoch, epoch_time))\n        print(\"Training set accuracy: {}\".format(train_acc))\n        print(\"Test set accuracy on clean examples: {}\".format(test_acc))\n        print(\"Test set accuracy on FGM adversarial examples: {}\".format(test_acc_fgm))\n        print(\"Test set accuracy on PGD adversarial examples: {}\".format(test_acc_pgd))\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_epochs\", 8, \"Number of epochs.\")\n    flags.DEFINE_float(\"eps\", 0.3, \"Total epsilon for FGM and PGD attacks.\")\n\n    app.run(main)\n"
  },
  {
    "path": "tutorials/tf2/__init__.py",
    "content": "\n"
  },
  {
    "path": "tutorials/tf2/cifar10_tutorial.py",
    "content": "import math\nimport numpy as np\nimport tensorflow as tf\nimport tensorflow_datasets as tfds\nfrom absl import app, flags\nfrom easydict import EasyDict\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.layers import AveragePooling2D, Conv2D\n\nfrom cleverhans.tf2.attacks.projected_gradient_descent import projected_gradient_descent\nfrom cleverhans.tf2.attacks.fast_gradient_method import fast_gradient_method\n\nFLAGS = flags.FLAGS\n\n\nclass CNN(Model):\n    def __init__(self, nb_filters=64):\n        super(CNN, self).__init__()\n        img_size = 32\n        log_resolution = int(round(math.log(img_size) / math.log(2)))\n        conv_args = dict(activation=tf.nn.leaky_relu, kernel_size=3, padding=\"same\")\n        self.layers_obj = []\n        for scale in range(log_resolution - 2):\n            conv1 = Conv2D(nb_filters << scale, **conv_args)\n            conv2 = Conv2D(nb_filters << (scale + 1), **conv_args)\n            pool = AveragePooling2D(pool_size=(2, 2), strides=(2, 2))\n            self.layers_obj.append(conv1)\n            self.layers_obj.append(conv2)\n            self.layers_obj.append(pool)\n        conv = Conv2D(10, **conv_args)\n        self.layers_obj.append(conv)\n\n    def call(self, x):\n        for layer in self.layers_obj:\n            x = layer(x)\n        return tf.reduce_mean(x, [1, 2])\n\n\ndef ld_cifar10():\n    \"\"\"Load training and test data.\"\"\"\n\n    def convert_types(image, label):\n        image = tf.cast(image, tf.float32)\n        image /= 127.5\n        image -= 1.0\n        return image, label\n\n    dataset, info = tfds.load(\"cifar10\", with_info=True, as_supervised=True)\n\n    def augment_mirror(x):\n        return tf.image.random_flip_left_right(x)\n\n    def augment_shift(x, w=4):\n        y = tf.pad(x, [[w] * 2, [w] * 2, [0] * 2], mode=\"REFLECT\")\n        return tf.image.random_crop(y, tf.shape(x))\n\n    cifar10_train, cifar10_test = dataset[\"train\"], dataset[\"test\"]\n    # Augmentation helps a lot in CIFAR10\n    cifar10_train = cifar10_train.map(\n        lambda x, y: (augment_mirror(augment_shift(x)), y)\n    )\n    cifar10_train = cifar10_train.map(convert_types).shuffle(10000).batch(128)\n    cifar10_test = cifar10_test.map(convert_types).batch(128)\n\n    return EasyDict(train=cifar10_train, test=cifar10_test)\n\n\ndef main(_):\n    # Load training and test data\n    data = ld_cifar10()\n    model = CNN()\n    loss_object = tf.losses.SparseCategoricalCrossentropy(from_logits=True)\n    optimizer = tf.optimizers.Adam(learning_rate=0.001)\n\n    # Metrics to track the different accuracies.\n    train_loss = tf.metrics.Mean(name=\"train_loss\")\n    test_acc_clean = tf.metrics.SparseCategoricalAccuracy()\n    test_acc_fgsm = tf.metrics.SparseCategoricalAccuracy()\n    test_acc_pgd = tf.metrics.SparseCategoricalAccuracy()\n\n    @tf.function\n    def train_step(x, y):\n        with tf.GradientTape() as tape:\n            predictions = model(x)\n            loss = loss_object(y, predictions)\n        gradients = tape.gradient(loss, model.trainable_variables)\n        optimizer.apply_gradients(zip(gradients, model.trainable_variables))\n        train_loss(loss)\n\n    # Train model with adversarial training\n    for epoch in range(FLAGS.nb_epochs):\n        # keras like display of progress\n        progress_bar_train = tf.keras.utils.Progbar(50000)\n        for (x, y) in data.train:\n            if FLAGS.adv_train:\n                # Replace clean example with adversarial example for adversarial training\n                x = projected_gradient_descent(model, x, FLAGS.eps, 0.01, 40, np.inf)\n            train_step(x, y)\n            progress_bar_train.add(x.shape[0], values=[(\"loss\", train_loss.result())])\n\n    # Evaluate on clean and adversarial data\n    progress_bar_test = tf.keras.utils.Progbar(10000)\n    for x, y in data.test:\n        y_pred = model(x)\n        test_acc_clean(y, y_pred)\n\n        x_fgm = fast_gradient_method(model, x, FLAGS.eps, np.inf)\n        y_pred_fgm = model(x_fgm)\n        test_acc_fgsm(y, y_pred_fgm)\n\n        x_pgd = projected_gradient_descent(model, x, FLAGS.eps, 0.01, 40, np.inf)\n        y_pred_pgd = model(x_pgd)\n        test_acc_pgd(y, y_pred_pgd)\n\n        progress_bar_test.add(x.shape[0])\n\n    print(\n        \"test acc on clean examples (%): {:.3f}\".format(test_acc_clean.result() * 100)\n    )\n    print(\n        \"test acc on FGM adversarial examples (%): {:.3f}\".format(\n            test_acc_fgsm.result() * 100\n        )\n    )\n    print(\n        \"test acc on PGD adversarial examples (%): {:.3f}\".format(\n            test_acc_pgd.result() * 100\n        )\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_epochs\", 8, \"Number of epochs.\")\n    flags.DEFINE_float(\"eps\", 0.05, \"Total epsilon for FGM and PGD attacks.\")\n    flags.DEFINE_bool(\n        \"adv_train\", False, \"Use adversarial training (on PGD adversarial examples).\"\n    )\n    app.run(main)\n"
  },
  {
    "path": "tutorials/tf2/mnist_tutorial.py",
    "content": "import numpy as np\nimport tensorflow as tf\nimport tensorflow_datasets as tfds\nfrom absl import app, flags\nfrom easydict import EasyDict\nfrom tensorflow.keras import Model\nfrom tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D\n\nfrom cleverhans.tf2.attacks.projected_gradient_descent import projected_gradient_descent\nfrom cleverhans.tf2.attacks.fast_gradient_method import fast_gradient_method\n\nFLAGS = flags.FLAGS\n\n\nclass Net(Model):\n    def __init__(self):\n        super(Net, self).__init__()\n        self.conv1 = Conv2D(64, 8, strides=(2, 2), activation=\"relu\", padding=\"same\")\n        self.conv2 = Conv2D(128, 6, strides=(2, 2), activation=\"relu\", padding=\"valid\")\n        self.conv3 = Conv2D(128, 5, strides=(1, 1), activation=\"relu\", padding=\"valid\")\n        self.dropout = Dropout(0.25)\n        self.flatten = Flatten()\n        self.dense1 = Dense(128, activation=\"relu\")\n        self.dense2 = Dense(10)\n\n    def call(self, x):\n        x = self.conv1(x)\n        x = self.conv2(x)\n        x = self.conv3(x)\n        x = self.dropout(x)\n        x = self.flatten(x)\n        x = self.dense1(x)\n        return self.dense2(x)\n\n\ndef ld_mnist():\n    \"\"\"Load training and test data.\"\"\"\n\n    def convert_types(image, label):\n        image = tf.cast(image, tf.float32)\n        image /= 255\n        return image, label\n\n    dataset, info = tfds.load(\n        \"mnist\", data_dir=\"gs://tfds-data/datasets\", with_info=True, as_supervised=True\n    )\n    mnist_train, mnist_test = dataset[\"train\"], dataset[\"test\"]\n    mnist_train = mnist_train.map(convert_types).shuffle(10000).batch(128)\n    mnist_test = mnist_test.map(convert_types).batch(128)\n    return EasyDict(train=mnist_train, test=mnist_test)\n\n\ndef main(_):\n    # Load training and test data\n    data = ld_mnist()\n    model = Net()\n    loss_object = tf.losses.SparseCategoricalCrossentropy(from_logits=True)\n    optimizer = tf.optimizers.Adam(learning_rate=0.001)\n\n    # Metrics to track the different accuracies.\n    train_loss = tf.metrics.Mean(name=\"train_loss\")\n    test_acc_clean = tf.metrics.SparseCategoricalAccuracy()\n    test_acc_fgsm = tf.metrics.SparseCategoricalAccuracy()\n    test_acc_pgd = tf.metrics.SparseCategoricalAccuracy()\n\n    @tf.function\n    def train_step(x, y):\n        with tf.GradientTape() as tape:\n            predictions = model(x)\n            loss = loss_object(y, predictions)\n        gradients = tape.gradient(loss, model.trainable_variables)\n        optimizer.apply_gradients(zip(gradients, model.trainable_variables))\n        train_loss(loss)\n\n    # Train model with adversarial training\n    for epoch in range(FLAGS.nb_epochs):\n        # keras like display of progress\n        progress_bar_train = tf.keras.utils.Progbar(60000)\n        for (x, y) in data.train:\n            if FLAGS.adv_train:\n                # Replace clean example with adversarial example for adversarial training\n                x = projected_gradient_descent(model, x, FLAGS.eps, 0.01, 40, np.inf)\n            train_step(x, y)\n            progress_bar_train.add(x.shape[0], values=[(\"loss\", train_loss.result())])\n\n    # Evaluate on clean and adversarial data\n    progress_bar_test = tf.keras.utils.Progbar(10000)\n    for x, y in data.test:\n        y_pred = model(x)\n        test_acc_clean(y, y_pred)\n\n        x_fgm = fast_gradient_method(model, x, FLAGS.eps, np.inf)\n        y_pred_fgm = model(x_fgm)\n        test_acc_fgsm(y, y_pred_fgm)\n\n        x_pgd = projected_gradient_descent(model, x, FLAGS.eps, 0.01, 40, np.inf)\n        y_pred_pgd = model(x_pgd)\n        test_acc_pgd(y, y_pred_pgd)\n\n        progress_bar_test.add(x.shape[0])\n\n    print(\n        \"test acc on clean examples (%): {:.3f}\".format(test_acc_clean.result() * 100)\n    )\n    print(\n        \"test acc on FGM adversarial examples (%): {:.3f}\".format(\n            test_acc_fgsm.result() * 100\n        )\n    )\n    print(\n        \"test acc on PGD adversarial examples (%): {:.3f}\".format(\n            test_acc_pgd.result() * 100\n        )\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_epochs\", 8, \"Number of epochs.\")\n    flags.DEFINE_float(\"eps\", 0.3, \"Total epsilon for FGM and PGD attacks.\")\n    flags.DEFINE_bool(\n        \"adv_train\", False, \"Use adversarial training (on PGD adversarial examples).\"\n    )\n    app.run(main)\n"
  },
  {
    "path": "tutorials/torch/__init__.py",
    "content": "\n"
  },
  {
    "path": "tutorials/torch/cifar10_tutorial.py",
    "content": "from absl import app, flags\nfrom easydict import EasyDict\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torchvision\n\nfrom cleverhans.torch.attacks.fast_gradient_method import fast_gradient_method\nfrom cleverhans.torch.attacks.projected_gradient_descent import (\n    projected_gradient_descent,\n)\n\nFLAGS = flags.FLAGS\n\n\nclass CNN(torch.nn.Module):\n    \"\"\"Basic CNN architecture.\"\"\"\n\n    def __init__(self, in_channels=1):\n        super(CNN, self).__init__()\n        self.conv1 = nn.Conv2d(in_channels, 64, 8, 1)\n        self.conv2 = nn.Conv2d(64, 128, 6, 2)\n        self.conv3 = nn.Conv2d(128, 128, 5, 2)\n        self.fc = nn.Linear(128 * 3 * 3, 10)\n\n    def forward(self, x):\n        x = F.relu(self.conv1(x))\n        x = F.relu(self.conv2(x))\n        x = F.relu(self.conv3(x))\n        x = x.view(-1, 128 * 3 * 3)\n        x = self.fc(x)\n        return x\n\n\ndef ld_cifar10():\n    \"\"\"Load training and test data.\"\"\"\n    train_transforms = torchvision.transforms.Compose(\n        [torchvision.transforms.ToTensor()]\n    )\n    test_transforms = torchvision.transforms.Compose(\n        [torchvision.transforms.ToTensor()]\n    )\n    train_dataset = torchvision.datasets.CIFAR10(\n        root=\"/tmp/data\", train=True, transform=train_transforms, download=True\n    )\n    test_dataset = torchvision.datasets.CIFAR10(\n        root=\"/tmp/data\", train=False, transform=test_transforms, download=True\n    )\n    train_loader = torch.utils.data.DataLoader(\n        train_dataset, batch_size=128, shuffle=True, num_workers=2\n    )\n    test_loader = torch.utils.data.DataLoader(\n        test_dataset, batch_size=128, shuffle=False, num_workers=2\n    )\n    return EasyDict(train=train_loader, test=test_loader)\n\n\ndef main(_):\n    # Load training and test data\n    data = ld_cifar10()\n\n    # Instantiate model, loss, and optimizer for training\n    net = CNN(in_channels=3)\n    device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n    if device == \"cuda\":\n        net = net.cuda()\n    loss_fn = torch.nn.CrossEntropyLoss(reduction=\"mean\")\n    optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n\n    # Train vanilla model\n    net.train()\n    for epoch in range(1, FLAGS.nb_epochs + 1):\n        train_loss = 0.0\n        for x, y in data.train:\n            x, y = x.to(device), y.to(device)\n            if FLAGS.adv_train:\n                # Replace clean example with adversarial example for adversarial training\n                x = projected_gradient_descent(net, x, FLAGS.eps, 0.01, 40, np.inf)\n            optimizer.zero_grad()\n            loss = loss_fn(net(x), y)\n            loss.backward()\n            optimizer.step()\n            train_loss += loss.item()\n        print(\n            \"epoch: {}/{}, train loss: {:.3f}\".format(\n                epoch, FLAGS.nb_epochs, train_loss\n            )\n        )\n\n    # Evaluate on clean and adversarial data\n    net.eval()\n    report = EasyDict(nb_test=0, correct=0, correct_fgm=0, correct_pgd=0)\n    for x, y in data.test:\n        x, y = x.to(device), y.to(device)\n        x_fgm = fast_gradient_method(net, x, FLAGS.eps, np.inf)\n        x_pgd = projected_gradient_descent(net, x, FLAGS.eps, 0.01, 40, np.inf)\n        _, y_pred = net(x).max(1)  # model prediction on clean examples\n        _, y_pred_fgm = net(x_fgm).max(\n            1\n        )  # model prediction on FGM adversarial examples\n        _, y_pred_pgd = net(x_pgd).max(\n            1\n        )  # model prediction on PGD adversarial examples\n        report.nb_test += y.size(0)\n        report.correct += y_pred.eq(y).sum().item()\n        report.correct_fgm += y_pred_fgm.eq(y).sum().item()\n        report.correct_pgd += y_pred_pgd.eq(y).sum().item()\n    print(\n        \"test acc on clean examples (%): {:.3f}\".format(\n            report.correct / report.nb_test * 100.0\n        )\n    )\n    print(\n        \"test acc on FGM adversarial examples (%): {:.3f}\".format(\n            report.correct_fgm / report.nb_test * 100.0\n        )\n    )\n    print(\n        \"test acc on PGD adversarial examples (%): {:.3f}\".format(\n            report.correct_pgd / report.nb_test * 100.0\n        )\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_epochs\", 8, \"Number of epochs.\")\n    flags.DEFINE_float(\"eps\", 0.3, \"Total epsilon for FGM and PGD attacks.\")\n    flags.DEFINE_bool(\n        \"adv_train\", False, \"Use adversarial training (on PGD adversarial examples).\"\n    )\n\n    app.run(main)\n"
  },
  {
    "path": "tutorials/torch/datasets.py",
    "content": "from __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport array\nimport gzip\nimport os\nfrom os import path\nimport struct\nfrom six.moves.urllib.request import urlretrieve\n\nimport numpy as np\nimport torch\n\n_DATA = \"/tmp/data/\"\n\n\ndef _download(url, filename):\n    \"\"\"Download a url to a file in the JAX data temp directory.\"\"\"\n    if not path.exists(_DATA):\n        os.makedirs(_DATA)\n    out_file = path.join(_DATA, filename)\n    if not path.isfile(out_file):\n        urlretrieve(url, out_file)\n        print(\"downloaded {} to {}\".format(url, _DATA))\n\n\ndef mnist_raw(root=_DATA):\n    \"\"\"Download and parse the raw MNIST dataset.\"\"\"\n    # CVDF mirror of http://yann.lecun.com/exdb/mnist/\n    base_url = \"https://storage.googleapis.com/cvdf-datasets/mnist/\"\n\n    def parse_labels(filename):\n        with gzip.open(filename, \"rb\") as fh:\n            _ = struct.unpack(\">II\", fh.read(8))\n            return np.array(array.array(\"B\", fh.read()), dtype=np.uint8)\n\n    def parse_images(filename):\n        with gzip.open(filename, \"rb\") as fh:\n            _, num_data, rows, cols = struct.unpack(\">IIII\", fh.read(16))\n            return np.array(array.array(\"B\", fh.read()), dtype=np.uint8).reshape(\n                num_data, rows, cols\n            )\n\n    for filename in [\n        \"train-images-idx3-ubyte.gz\",\n        \"train-labels-idx1-ubyte.gz\",\n        \"t10k-images-idx3-ubyte.gz\",\n        \"t10k-labels-idx1-ubyte.gz\",\n    ]:\n        _download(base_url + filename, filename)\n\n    train_images = parse_images(path.join(root, \"train-images-idx3-ubyte.gz\"))\n    train_labels = parse_labels(path.join(root, \"train-labels-idx1-ubyte.gz\"))\n    test_images = parse_images(path.join(root, \"t10k-images-idx3-ubyte.gz\"))\n    test_labels = parse_labels(path.join(root, \"t10k-labels-idx1-ubyte.gz\"))\n\n    return train_images, train_labels, test_images, test_labels\n\n\nclass MNISTDataset(torch.utils.data.Dataset):\n    \"\"\"MNIST Dataset.\"\"\"\n\n    def __init__(self, root=_DATA, train=True, transform=None):\n        train_images, train_labels, test_images, test_labels = mnist_raw(root=root)\n\n        if train:\n            self.images = train_images\n            self.labels = torch.from_numpy(train_labels).long()\n        else:\n            self.images = test_images\n            self.labels = torch.from_numpy(test_labels).long()\n\n        self.transform = transform\n\n    def __getitem__(self, index):\n        x = self.images[index]\n        y = self.labels[index]\n\n        if self.transform:\n            x = self.transform(x)\n\n        return x, y\n\n    def __len__(self):\n        return len(self.images)\n"
  },
  {
    "path": "tutorials/torch/mnist_tutorial.py",
    "content": "from absl import app, flags\nfrom easydict import EasyDict\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torchvision\nfrom datasets import MNISTDataset\n\nfrom cleverhans.torch.attacks.fast_gradient_method import fast_gradient_method\nfrom cleverhans.torch.attacks.projected_gradient_descent import (\n    projected_gradient_descent,\n)\n\n\nFLAGS = flags.FLAGS\n\n\nclass CNN(torch.nn.Module):\n    \"\"\"Basic CNN architecture.\"\"\"\n\n    def __init__(self, in_channels=1):\n        super(CNN, self).__init__()\n        self.conv1 = nn.Conv2d(\n            in_channels, 64, 8, 1\n        )  # (batch_size, 3, 28, 28) --> (batch_size, 64, 21, 21)\n        self.conv2 = nn.Conv2d(\n            64, 128, 6, 2\n        )  # (batch_size, 64, 21, 21) --> (batch_size, 128, 8, 8)\n        self.conv3 = nn.Conv2d(\n            128, 128, 5, 1\n        )  # (batch_size, 128, 8, 8) --> (batch_size, 128, 4, 4)\n        self.fc1 = nn.Linear(\n            128 * 4 * 4, 128\n        )  # (batch_size, 128, 4, 4) --> (batch_size, 2048)\n        self.fc2 = nn.Linear(128, 10)  # (batch_size, 128) --> (batch_size, 10)\n\n    def forward(self, x):\n        x = F.relu(self.conv1(x))\n        x = F.relu(self.conv2(x))\n        x = F.relu(self.conv3(x))\n        x = x.view(-1, 128 * 4 * 4)\n        x = self.fc1(x)\n        x = self.fc2(x)\n        return x\n\n\nclass PyNet(nn.Module):\n    \"\"\"CNN architecture. This is the same MNIST model from pytorch/examples/mnist repository\"\"\"\n\n    def __init__(self, in_channels=1):\n        super(PyNet, self).__init__()\n        self.conv1 = nn.Conv2d(in_channels, 32, 3, 1)\n        self.conv2 = nn.Conv2d(32, 64, 3, 1)\n        self.dropout1 = nn.Dropout(0.25)\n        self.dropout2 = nn.Dropout(0.5)\n        self.fc1 = nn.Linear(9216, 128)\n        self.fc2 = nn.Linear(128, 10)\n\n    def forward(self, x):\n        x = self.conv1(x)\n        x = F.relu(x)\n        x = self.conv2(x)\n        x = F.relu(x)\n        x = F.max_pool2d(x, 2)\n        x = self.dropout1(x)\n        x = torch.flatten(x, 1)\n        x = self.fc1(x)\n        x = F.relu(x)\n        x = self.dropout2(x)\n        x = self.fc2(x)\n        output = F.log_softmax(x, dim=1)\n        return output\n\n\ndef ld_mnist():\n    \"\"\"Load training and test data.\"\"\"\n    train_transforms = torchvision.transforms.Compose(\n        [torchvision.transforms.ToTensor()]\n    )\n    test_transforms = torchvision.transforms.Compose(\n        [torchvision.transforms.ToTensor()]\n    )\n\n    # Load MNIST dataset\n    train_dataset = MNISTDataset(root=\"/tmp/data\", transform=train_transforms)\n    test_dataset = MNISTDataset(\n        root=\"/tmp/data\", train=False, transform=test_transforms\n    )\n\n    train_loader = torch.utils.data.DataLoader(\n        train_dataset, batch_size=128, shuffle=True, num_workers=2\n    )\n    test_loader = torch.utils.data.DataLoader(\n        test_dataset, batch_size=128, shuffle=False, num_workers=2\n    )\n    return EasyDict(train=train_loader, test=test_loader)\n\n\ndef main(_):\n    # Load training and test data\n    data = ld_mnist()\n\n    # Instantiate model, loss, and optimizer for training\n    if FLAGS.model == \"cnn\":\n        net = CNN(in_channels=1)\n\n    elif FLAGS.model == \"pynet\":\n        net = PyNet(in_channels=1)\n    else:\n        raise NotImplementedError\n\n    device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n    if device == \"cuda\":\n        net = net.cuda()\n    loss_fn = torch.nn.CrossEntropyLoss(reduction=\"mean\")\n    optimizer = torch.optim.Adam(net.parameters(), lr=1e-3)\n\n    # Train vanilla model\n    net.train()\n    for epoch in range(1, FLAGS.nb_epochs + 1):\n        train_loss = 0.0\n        for x, y in data.train:\n            x, y = x.to(device), y.to(device)\n            if FLAGS.adv_train:\n                # Replace clean example with adversarial example for adversarial training\n                x = projected_gradient_descent(net, x, FLAGS.eps, 0.01, 40, np.inf)\n            optimizer.zero_grad()\n            loss = loss_fn(net(x), y)\n            loss.backward()\n            optimizer.step()\n            train_loss += loss.item()\n        print(\n            \"epoch: {}/{}, train loss: {:.3f}\".format(\n                epoch, FLAGS.nb_epochs, train_loss\n            )\n        )\n\n    # Evaluate on clean and adversarial data\n    net.eval()\n    report = EasyDict(nb_test=0, correct=0, correct_fgm=0, correct_pgd=0)\n    for x, y in data.test:\n        x, y = x.to(device), y.to(device)\n        x_fgm = fast_gradient_method(net, x, FLAGS.eps, np.inf)\n        x_pgd = projected_gradient_descent(net, x, FLAGS.eps, 0.01, 40, np.inf)\n        _, y_pred = net(x).max(1)  # model prediction on clean examples\n        _, y_pred_fgm = net(x_fgm).max(\n            1\n        )  # model prediction on FGM adversarial examples\n        _, y_pred_pgd = net(x_pgd).max(\n            1\n        )  # model prediction on PGD adversarial examples\n        report.nb_test += y.size(0)\n        report.correct += y_pred.eq(y).sum().item()\n        report.correct_fgm += y_pred_fgm.eq(y).sum().item()\n        report.correct_pgd += y_pred_pgd.eq(y).sum().item()\n    print(\n        \"test acc on clean examples (%): {:.3f}\".format(\n            report.correct / report.nb_test * 100.0\n        )\n    )\n    print(\n        \"test acc on FGM adversarial examples (%): {:.3f}\".format(\n            report.correct_fgm / report.nb_test * 100.0\n        )\n    )\n    print(\n        \"test acc on PGD adversarial examples (%): {:.3f}\".format(\n            report.correct_pgd / report.nb_test * 100.0\n        )\n    )\n\n\nif __name__ == \"__main__\":\n    flags.DEFINE_integer(\"nb_epochs\", 8, \"Number of epochs.\")\n    flags.DEFINE_float(\"eps\", 0.3, \"Total epsilon for FGM and PGD attacks.\")\n    flags.DEFINE_bool(\n        \"adv_train\", False, \"Use adversarial training (on PGD adversarial examples).\"\n    )\n    flags.DEFINE_enum(\"model\", \"cnn\", [\"cnn\", \"pynet\"], \"Choose model type.\")\n\n    app.run(main)\n"
  }
]