Full Code of gocaio/goca for AI

master 87e455691952 cached
107 files
2.6 MB
676.5k tokens
303 symbols
1 requests
Download .txt
Showing preview only (2,710K chars total). Download the full file or copy to clipboard to get everything.
Repository: gocaio/goca
Branch: master
Commit: 87e455691952
Files: 107
Total size: 2.6 MB

Directory structure:
gitextract_f3d27aex/

├── .drone.yml
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       └── codeql-analysis.yml
├── .gitignore
├── .travis.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── build.sh
├── controller.go
├── dorker/
│   ├── dork.go
│   ├── dork_test.go
│   ├── google.go
│   ├── logger/
│   │   ├── arena.go
│   │   ├── arena_test.go
│   │   ├── coord.go
│   │   ├── food.go
│   │   ├── food_test.go
│   │   ├── game.go
│   │   ├── game_test.go
│   │   ├── keyboard.go
│   │   ├── keyboard_test.go
│   │   ├── presenter.go
│   │   ├── presenter_test.go
│   │   ├── snake.go
│   │   └── snake_test.go
│   ├── logger.go
│   ├── parser.go
│   ├── scrapper.go
│   ├── scrapper_test.go
│   └── webHandler.go
├── go.mod
├── go.sum
├── goca/
│   └── goca.go
├── goca.go
├── gocaTesting/
│   ├── testData/
│   │   ├── doc/
│   │   │   ├── Doc1.docx
│   │   │   ├── Doc2.docx
│   │   │   └── Doc3.docx
│   │   ├── dsstore/
│   │   │   ├── DS_Store_1
│   │   │   ├── DS_Store_2
│   │   │   ├── DS_Store_3
│   │   │   └── DS_Store_bad
│   │   ├── gpx/
│   │   │   ├── gpx_1.gpx
│   │   │   ├── gpx_2.gpx
│   │   │   └── gpx_3.gpx
│   │   ├── img/
│   │   │   ├── img_4.ps
│   │   │   ├── img_5.ai
│   │   │   ├── img_6.eps
│   │   │   └── img_7.psd
│   │   ├── kml/
│   │   │   ├── kml_2.kml
│   │   │   ├── kml_3.kml
│   │   │   ├── kml_4.kml
│   │   │   └── lml_1.kml
│   │   ├── odp/
│   │   │   ├── Odp1.odp
│   │   │   ├── Odp2.odp
│   │   │   └── Odp3.odp
│   │   ├── ods/
│   │   │   ├── Ods1.ods
│   │   │   ├── Ods2.ods
│   │   │   └── Ods3.ods
│   │   ├── odt/
│   │   │   ├── Odt1.odt
│   │   │   ├── Odt2.odt
│   │   │   └── Odt3.odt
│   │   ├── ppt/
│   │   │   ├── Ppt1.pptx
│   │   │   ├── Ppt2.pptx
│   │   │   └── Ppt3.pptx
│   │   ├── swf/
│   │   │   ├── swf_1.swf
│   │   │   ├── swf_2.swf
│   │   │   └── swf_3.swf
│   │   └── xls/
│   │       ├── Xls1.xlsx
│   │       ├── Xls2.xlsx
│   │       └── Xls3.xlsx
│   ├── testServer/
│   │   └── server.go
│   └── test_helpers.go
├── img/
│   └── Goca.xml
├── output.go
├── plugin.go
├── plugins/
│   ├── doc/
│   │   ├── doc.go
│   │   └── doc_test.go
│   ├── dsstore/
│   │   ├── dsStore.go
│   │   └── dsstore_test.go
│   ├── dummy/
│   │   └── dummy.go
│   ├── gpx/
│   │   ├── gpx.go
│   │   └── gpx_test.go
│   ├── image/
│   │   └── image.go
│   ├── mp3/
│   │   ├── mp3.go
│   │   └── mp3_test.go
│   ├── odp/
│   │   ├── odp.go
│   │   └── odp_test.go
│   ├── ods/
│   │   ├── ods.go
│   │   └── ods_test.go
│   ├── odt/
│   │   ├── odt.go
│   │   └── odt_test.go
│   ├── pdf/
│   │   ├── pdf.go
│   │   └── pdf_test.go
│   ├── plugins.go
│   ├── ppt/
│   │   ├── ppt.go
│   │   └── ppt_test.go
│   ├── swf/
│   │   ├── swf.go
│   │   └── swf_test.go
│   └── xls/
│       ├── xls.go
│       └── xls_test.go
├── projects.go
└── scripts/
    └── deploy_to_docker.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .drone.yml
================================================
clone:
  git:
    image: plugins/git
    path: /drone/src/gituhb.com/gocaio/Goca

pipeline:
  test:
    image: golang:${GO_VERSION}
    environment:
      - GOPATH=/drone
      - GO111MODULE=on
    commands:
      - make deps
      - make test
    when:
      branch: dev
  
  build:
    image: golang:${GO_VERSION}
    environment:
      - GOPATH=/drone
      - GO111MODULE=on
    commands:
      - make deps
      - make test
      - make build
    when:
      branch: master

  release:
    image: plugins/github-release
    secrets: [ github_api_key ]
    settings:
      api_key:
        from_secret: github_api_key
      files:
        - build/*
     checksum:
       - md5
       - sha1
       - sha256
       - sha512
       - adler32
       - crc32
    when:
      branch: master

  telegram:
    image: appleboy/drone-telegram
    secrets: [ telegram_token, telegram_to ]
    format: markdown
    message: >
      \[DRONE] {{uppercasefirst build.status}} build for commit [{{commit.message}} ({{truncate commit.sha 10}})]({{commit.link}}) by {{commit.author}}
    when:
      status: [success, failure]

matrix:
  GO_VERSION:
    - latest

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: ''
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Command executed
2. Query searched

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Environment**
1. OS
2. Go version


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: "[FEATURE]"
labels: ''
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: "CodeQL"

on:
  push:
    branches: [master]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [master]
  schedule:
    - cron: '0 8 * * 6'

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        # Override automatic language detection by changing the below list
        # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
        language: ['go']
        # Learn more...
        # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
      with:
        # We must fetch at least the immediate parents so that if this is
        # a pull request then we can checkout the head.
        fetch-depth: 2

    # If this run was triggered by a pull request event, then checkout
    # the head of the pull request instead of the merge commit.
    - run: git checkout HEAD^2
      if: ${{ github.event_name == 'pull_request' }}

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v1
      with:
        languages: ${{ matrix.language }}

    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@v1

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 https://git.io/JvXDl

    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
    #    and modify them (or add more) to build your code if your project
    #    uses a compiled language

    #- run: |
    #   make bootstrap
    #   make release

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v1


================================================
FILE: .gitignore
================================================
# ---> Project stuff
.cask/
build/
*.db

# ---> Go
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so

# Folders
_obj
_test

# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out

*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*

_testmain.go

*.exe
*.test
*.prof

# Python
*.pyc
**/__pycache__
__pycache__

# ---> Linux
*~

# KDE directory preferences
.directory

# Linux trash folder which might appear on any partition or disk
.Trash-*

# ---> macOS
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# ---> Windows
# Windows image file caches
Thumbs.db
ehthumbs.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk

# ---> SublimeText
# cache files for sublime text
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache

# workspace files are user-specific
*.sublime-workspace

# project files should be checked into the repository, unless a significant
# proportion of contributors will probably not be using SublimeText
# *.sublime-project

# sftp configuration file
sftp-config.json

# ---> VisualStudioCode
.settings
.vscode

# ---> Vim
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
*.un~
Session.vim
.netrwhist
*~

# ---> Emacs
# -*- mode: gitignore; -*-
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*

# Org-mode
.org-id-locations
*_archive

# flymake-mode
*_flymake.*

# eshell files
/eshell/history
/eshell/lastdir

# elpa packages
/elpa/

# reftex files
*.rel

# AUCTeX auto folder
/auto/


================================================
FILE: .travis.yml
================================================
env:
  - GO111MODULE=on

language: go
go:
  - "1.11.x"
  - "1.12.x"
  - tip

matrix:
  allow_failures:
    - go: tip

before_script:
  - "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | sudo bash"

script:
  - make deps
  - make test
  - if [ "$TRAVIS_BRANCH" = "master" ]; then fossa init; fi
  - if [ "$TRAVIS_BRANCH" = "master" ]; then fossa analyze; fi

after_success:
  - ./scripts/deploy_to_docker.sh
  - if [ "$TRAVIS_BRANCH" = "master" ]; then fossa test; fi

before_deploy:
  - ./build.sh

deploy:
  provider: releases
  api_key: $GH_KEY
  file_glob: true
  file: build/*
  skip_cleanup: true
  overwrite: true
  on:
    tags: true

notifications:
  webhooks: 
    urls:
      - https://tgwh.goca.io/travisci
    on_success: always
    on_failure: always

================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
 advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
 address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
 professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at goca@goca.io. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq



================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

When contributing to this repository, please first discuss the change you wish to make via issue.

Please note we have a code of conduct, please follow it in all your interactions with the project.

## Pull Request Process

1. Open an issue with the module or feature you want to implement. An **admin** will give you feedback or suggestions as soon as possible.

2. Clone the repository and be sure that you have all dependencies in your `$GOPATH`.

3. Add module under `modules` folder.

4. When commiting, always reference the issue you are working with. Eg.
  
- `git commit -m "#9 - Adding module images"`
- `git commit -m "#9 - Adding images to testData and getting GPS Coordinates"`

5. When done, open a Pull Request to **Goca** `dev` branch. An **admin** will review it.
  
- If something is wrong or needs changes, the admin will comment on the issue/Pull Request.
- When everything is OK, the **admin** will accept the Pull Request.

6. Increase the version numbers in any examples files and the README.md to the new version that this
   Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/).
7. You may merge the Pull Request in once you have the sign-off of two other developers, or if you
   do not have permission to do that, you may request the second reviewer to merge it for you.

## Code of Conduct

### Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

### Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language.
* Being respectful of differing viewpoints and experiences.
* Gracefully accepting constructive criticism.
* Focusing on what is best for the community.
* Showing empathy towards other community members.

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances.
* Trolling, insulting/derogatory comments, and personal or political attacks.
* Public or private harassment.
* Publishing others' private information, such as a physical or electronic   address, without explicit permission.
* Other conduct which could reasonably be considered inappropriate in a   professional setting.

### Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

### Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

### Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

### Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


================================================
FILE: Dockerfile
================================================
FROM golang:alpine

RUN apk add gcc git musl-dev && go get -u -v github.com/gocaio/goca

WORKDIR /go/src/github.com/gocaio/goca

ENV GO111MODULE on
RUN go get ./...

ENTRYPOINT ["go","run","goca/goca.go"]


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: Makefile
================================================
# Go parameters
GOCMD=go
GOBUILD=$(GOCMD) build
GORUN=$(GOCMD) run
GOCLEAN=$(GOCMD) clean
GOTEST=$(GOCMD) test
GOGET=$(GOCMD) get

BUILD_DIR=build/

APPNAME=GOCA
BINARY_NAME=goca
BINARY_UNIX=$(BINARY_NAME)_unix

SRC=$(wildcard goca/*.go)

all: test build

build: $(SRC)
	$(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)$(BINARY_NAME) -v $^

test:
	GOCA_TEST_SERVER="https://test.goca.io" $(GOTEST) -v -race -cover -count 1 ./...

test-local:
	GOCA_TEST_SERVER="http://localhost:5000" $(GOTEST) -v -race -cover -count 1 ./...

clean: 
	$(GOCLEAN)
	rm -rf $(BUILD_DIR)

deps:
	$(GOGET) -t -v ./...

# Cross compilation
build-linux: $(SRC)
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -o $(BINARY_UNIX) -v $^

.PHONY: all build test clean run deps build-linux

================================================
FILE: README.md
================================================
![](img/Goca_banner.png)

[![](https://img.shields.io/badge/Chat-Telegram-blue.svg?style=plastic&logo=telegram)](https://t.me/GocaIO) 
[![Build Status](https://travis-ci.org/gocaio/goca.svg?branch=dev)](https://travis-ci.org/gocaio/goca)
[![GitHub Issues](https://img.shields.io/github/issues/gocaio/goca.svg)](https://github.com/gocaio/goca/issues)
[![GitHub tag](https://img.shields.io/github/tag/gocaio/goca.svg)](https://github.com/gocaio/goca/tags)
[![Go Version](https://img.shields.io/badge/go-1.12-blue.svg?logo=go)](https://golang.org/dl/)
[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
[![Contribute Yes](https://img.shields.io/badge/contribute-yes-brightgreen.svg)](https://github.com/gocaio/goca/blob/master/CONTRIBUTING.md)
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fgocaio%2Fgoca.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fgocaio%2Fgoca?ref=badge_shield)

**Goca** is a [FOCA](https://github.com/ElevenPaths/FOCA) fork written in Go, which is a tool used mainly to find metadata and hidden information in the documents its scans. These documents may be on web pages, and can be downloaded and analyzed with **Goca**.

It is capable of analyzing a wide variety of documents, with the most common being Microsoft Office, Open Office, or PDF files, although it also analyzes Adobe InDesign or SVG files, for instance.

These documents are searched for using search engines such as:

+ [x] Google
+ [ ] Bing
+ [ ] DuckDuckGo
+ [ ] Yahoo
+ [ ] Ask

Then downloads the documents and extracts the EXIF information from graphic files, and a complete analysis of the information discovered through the URL is conducted even before downloading the file.

***

## USAGE

Download built packages from [**Releases**](https://github.com/gocaio/goca/releases)

To build from source, you will need Go installed.

```bash
$ export GO111MODULE=on 
$ go get ./...
$ go run goca/goca.go -h
```

To run Goca from Docker:

```bash
$ docker build -t gocaio/goca /path/to/goca
$ docker run gocaio/goca -h
```

***

## Contributing Guide

Please reade the Contributing guide:

+ [Contributing](CONTRIBUTING.md)

***

## Documentation

Refer to the [Official Doc](https://github.com/gocaio/Doc).


## License
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fgocaio%2Fgoca.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fgocaio%2Fgoca?ref=badge_large)

================================================
FILE: build.sh
================================================
#!/usr/bin/env bash

package=goca/goca.go
package_name=goca

buildDate=$(date -R)
gitTag=$(git describe --exact-match HEAD 2> /dev/null)
gitCommit=$(git rev-parse HEAD)
build_dir=build/
ldflags="-X \"main.buildDate=$buildDate\" \
-X \"main.gitTag=$gitTag\" \
-X \"main.gitCommit=$gitCommit\" \
-s \
-w"

platforms=("windows/amd64" "windows/386" "darwin/amd64" "linux/amd64" "linux/386" "linux/arm64" "linux/arm")

for platform in "${platforms[@]}"
do
    platform_split=(${platform//\// })
    GOOS=${platform_split[0]}
    GOARCH=${platform_split[1]}
    output_name=$package_name'-'$GOOS'-'$GOARCH
    if [ $GOOS = "windows" ]; then
        output_name+='.exe'
    fi

    GOOS=$GOOS GOARCH=$GOARCH go build -o $build_dir$output_name -ldflags "$ldflags" $package
    if [ $? -ne 0 ]; then
        echo 'An error has occurred! Aborting the script execution...'
        exit 1
    else
        sha256sum $build_dir$output_name > $build_dir$output_name.sha256
    fi
done


================================================
FILE: controller.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package goca

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"

	"github.com/asaskevich/EventBus"
	"github.com/gocolly/colly"
	"github.com/h2non/filetype"
	log "github.com/sirupsen/logrus"
)

var (
	// Topics is a list available event topics
	Topics = map[string]string{
		"NewTarget": "topic:new:url",
		"NewOutput": "topic:new:output",
	}
)

// Manager represents what interface should satisfies a Goca controller
type Manager interface {
	Publish(string, ...interface{})
	Subscribe(string, interface{}) error
	SubscribeOnce(string, interface{}) error
	Unsubscribe(string, interface{}) error
}

// Controller satisfy the Manager interface
type Controller struct {
	eventBus EventBus.Bus
	input    Input
}

func NewController(input Input) *Controller {
	ctrl := &Controller{
		eventBus: EventBus.New(),
		input:    input,
	}
	// This could be done outside NewController
	ctrl.Subscribe(Topics["NewOutput"], processOutput) // processOutput could be also a controller method
	return ctrl
}

func NewControllerTest() *Controller {
	ctrl := &Controller{
		eventBus: EventBus.New(),
	}
	return ctrl
}

func (c *Controller) Subscribe(topic string, fn interface{}) error {
	return c.eventBus.SubscribeAsync(topic, fn, false)
}

func (c *Controller) SubscribeOnce(topic string, fn interface{}) error {
	return c.eventBus.SubscribeOnceAsync(topic, fn)
}

func (c *Controller) Unsubscribe(topic string, fn interface{}) error {
	return c.eventBus.Unsubscribe(topic, fn)
}

func (c *Controller) Publish(topic string, args ...interface{}) {
	c.eventBus.Publish(topic, args...)
}

func (c *Controller) getData(plugType string, targets []string, files, recursive bool) {
	var data []byte
	var err error

	for _, url := range targets {
		if files {
			data, err = c.getFiles(url)
		} else {
			data, err = c.getURL(url)
		}

		if err != nil {
			log.Errorf("Unable to download %s", url)
		} else {
			kind, unknown := filetype.Match(data)
			if unknown != nil {
				log.Debugf("Unknown: %s", unknown)
			} else {
				if mimeAssociation.existMime(plugType, kind.MIME.Value) {
					// Publishing here may not be the best option
					log.Debugf("Data Length: %d\n", len(data))
					c.Publish(Topics["NewTarget"], url, data)
				} else {
					log.Debugf("Trying to download html for %s (%s)\n", kind.Extension, kind.MIME.Value)
					var newTargets []string
					var scrap *colly.Collector
					if c.input.URL != "" {
						scrap = colly.NewCollector(
							colly.AllowedDomains(c.input.URL),
						)
					} else {
						scrap = colly.NewCollector()
					}

					scrap.OnHTML("a[href]", func(e *colly.HTMLElement) {
						// TODO: Some URL has query strings or fragments that must be
						// removed in terms to build a propper url pointing to the file
						link := e.Attr("href")
						if strings.HasSuffix(url, "/") {
							newTargets = append(newTargets, fmt.Sprintf("%s%s", url, link))
						} else {
							newTargets = append(newTargets, fmt.Sprintf("%s/%s", url, link))
						}
					})
					scrap.Visit(url)
					if !recursive {
						c.getData(plugType, newTargets, false, true)
					} else {
						// Only addmited one level of recursion
						log.Errorf("There is no plugin processor for type %s: %s (%s)\n", plugType, kind.Extension, kind.MIME.Value)
					}
				}
			}
		}
	}
}

// get helps downloadURL to download the url content
func (c *Controller) getURL(url string) ([]byte, error) {
	var body []byte

	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return body, err
	}

	// Set headers
	req.Header.Set("User-Agent", c.input.UA)

	// Create a new client
	client := &http.Client{} // This struct accepts config params
	res, err := client.Do(req)
	if err != nil {
		return body, err
	}
	defer res.Body.Close()

	// Readout the body
	body, err = ioutil.ReadAll(res.Body)
	if err != nil {
		return body, err
	}

	return body, nil
}

func (c *Controller) getFiles(file string) ([]byte, error) {
	f, err := os.Open(file)
	if err != nil {
		return nil, err
	}
	defer f.Close()

	data, err := ioutil.ReadAll(f)
	if err != nil {
		return nil, err
	}
	return data, nil
}


================================================
FILE: dorker/dork.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package dorker

import (
	"fmt"
)

const (
	DEFAULT_DEPTH   = 1  // recurse into
	DEFAULT_TIMEOUT = 30 // TODO: Set req timeout
)

type dorkLib map[string][]Dork

var DorkLib = dorkLib{
	"application/pdf": []Dork{
		Dork{"google", "filetype:pdf"},
	},
	"audio/mpeg": []Dork{
		Dork{"google", "intitle:index.of +?last modified? +?parent directory? +(mp3|wma|ogg) -htm -html -php -asp"},
		Dork{"google", "filetype:mp3"},
		Dork{"google", "filetype:mp4"},
		Dork{"google", "filetype:m4a"},
		Dork{"google", "filetype:m4p"},
		Dork{"google", "filetype:m4v"},
		Dork{"google", "filetype:3gp"},
		Dork{"google", "filetype:3g2"},
	},
	"audio/MPA": []Dork{
		Dork{"google", "filetype:mp3"},
		Dork{"google", "filetype:mp4"},
		Dork{"google", "filetype:m4a"},
		Dork{"google", "filetype:m4p"},
		Dork{"google", "filetype:m4v"},
		Dork{"google", "filetype:3gp"},
		Dork{"google", "filetype:3g2"},
	},
	"audio/mpa-robust": []Dork{
		Dork{"google", "filetype:mp3"},
		Dork{"google", "filetype:mp4"},
		Dork{"google", "filetype:m4a"},
		Dork{"google", "filetype:m4p"},
		Dork{"google", "filetype:m4v"},
		Dork{"google", "filetype:3gp"},
		Dork{"google", "filetype:3g2"},
	},
	"application/ogg": []Dork{
		Dork{"google", "filetype:ogg"},
		Dork{"google", "filetype:ogv"},
		Dork{"google", "filetype:oga"},
		Dork{"google", "filetype:ogx"},
		Dork{"google", "filetype:ogm"},
		Dork{"google", "filetype:spx"},
		Dork{"google", "filetype:opus"},
	},
	"video/ogg": []Dork{
		Dork{"google", "filetype:ogg"},
		Dork{"google", "filetype:ogv"},
		Dork{"google", "filetype:oga"},
		Dork{"google", "filetype:ogx"},
		Dork{"google", "filetype:ogm"},
		Dork{"google", "filetype:spx"},
		Dork{"google", "filetype:opus"},
	},
	"audio/ogg": []Dork{
		Dork{"google", "filetype:ogg"},
		Dork{"google", "filetype:ogv"},
		Dork{"google", "filetype:oga"},
		Dork{"google", "filetype:ogx"},
		Dork{"google", "filetype:ogm"},
		Dork{"google", "filetype:spx"},
		Dork{"google", "filetype:opus"},
	},
	"image/jpeg": {
		Dork{"google", "intitle:index.of +?last modified? +?parent directory? +(jpeg|jpg|jpe|jfif|jfi|jif) -htm -html -php -asp"},
		Dork{"google", "filetype:jpeg"},
		Dork{"google", "filetype:jpg"},
		Dork{"google", "filetype:jpe"},
		Dork{"google", "filetype:jfif"},
		Dork{"google", "filetype:jfi"},
		Dork{"google", "filetype:jif"},
	},
	"image/png": []Dork{
		Dork{"google", "intitle:index.of +?last modified? +?parent directory? +(png) -htm -html -php -asp"},
		Dork{"google", "filetype:png"},
	},
	"image/gif": []Dork{
		Dork{"google", "intitle:index.of +?last modified? +?parent directory? +(gif) -htm -html -php -asp"},
		Dork{"google", "filetype:gif"},
	},
	"image/webp": []Dork{
		Dork{"google", "intitle:index.of +?last modified? +?parent directory? +(webp) -htm -html -php -asp"},
		Dork{"google", "filetype:webp"},
	},
	"image/vnd.adobe.photoshop": []Dork{
		Dork{"google", "intitle:index.of +?last modified? +?parent directory? +(psd) -htm -html -php -asp"},
		Dork{"google", "filetype:psd"},
	},
	"audio/x-flac": []Dork{
		Dork{"google", "filetype:flac"},
	},
	"application/vnd.openxmlformats-officedocument.wordprocessingml.document": []Dork{
		Dork{"google", "filetype:docx"},
	},
	"application/vnd.openxmlformats-officedocument.wordprocessingml.template": []Dork{
		Dork{"google", "filetype:dotx"},
	},
	"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": []Dork{
		Dork{"google", "filetype:xlsx"},
	},
	"application/vnd.openxmlformats-officedocument.presentationml.presentation": []Dork{
		Dork{"google", "filetype:pptx"},
	},
	"application/vnd.openxmlformats-officedocument.presentationml.template": []Dork{
		Dork{"google", "filetype:potx"},
	},
	"application/vnd.openxmlformats-officedocument.presentationml.slideshow": []Dork{
		Dork{"google", "filetype:ppsx"},
	},
	"application/octet-stream": []Dork{
		Dork{"google", "inurl:.DS_Store intitle:index.of"},
		Dork{"google", "intext:.DS_Store & intitle:index -github"},
	},
	"application/vnd.oasis.opendocument.text": []Dork{
		Dork{"google", "filetype:odt"},
	},
	"application/vnd.oasis.opendocument.spreadsheet": []Dork{
		Dork{"google", "filetype:ods"},
	},
	"application/vnd.oasis.opendocument.presentation": []Dork{
		Dork{"google", "filetype:odp"},
	},
	"application/x-shockwave-flash": []Dork{
		Dork{"google", "filetype:swf"},
	},
	"application/gpx": []Dork{
		Dork{"google", "intitle:index.of +?last modified? +?parent directory? +(gpx) -htm -html -php -asp"},
		Dork{"google", "filetype:gpx"},
	},
	"application/gpx+xml": []Dork{
		Dork{"google", "intitle:index.of +?last modified? +?parent directory? +(gpx) -htm -html -php -asp"},
		Dork{"google", "filetype:gpx"},
	},
	"application/postscript": []Dork{
		Dork{"google", "filetype:ps"},
	},
}

func (dl dorkLib) GetByType(typ string) []Dork {
	if _, ok := dl[typ]; ok {
		return dl[typ]
	}
	return nil
}

func (dl dorkLib) GetByEngine(typ, engine string) []Dork {
	dorks := dl.GetByType(typ)
	if dorks != nil {
		var d []Dork
		for _, dork := range dorks {
			if dork.Engine == engine {
				d = append(d, dork)
			}
		}
		return d
	}
	return dorks
}

// Dork defines a dork for a particular engine
// TODO: Load dorks from a custom json file
type Dork struct {
	Engine string `json:"engine"`
	String string `json:"string"`
}

// GetEngine returns dork engine
func (d *Dork) GetEngine() string {
	return d.Engine
}

// GetSrting returns query string for dorking
func (d *Dork) GetSrting() string {
	return d.String
}

// UpdateDork updates the dork values
func (d *Dork) UpdateDork(engine, site, term string) {
	if d.Engine != engine {
		d.Engine = engine
	}
	if site != "" {
		d.String = fmt.Sprintf("site:%s %s", site, term)
	}
	if term != "" {
		if d.String != "" {
			d.String = fmt.Sprintf("%s +\"%s\"", d.String, term)
		} else {
			d.String = fmt.Sprintf("+\"%s\"", term)
		}
	} else {
		d.String = term
	}
}

// UpdateEngine unpdates dork's engine
func (d *Dork) UpdateEngine(engine string) {
	if d.Engine != engine {
		d.Engine = engine
	}
}

// UpdateString unpdates dork's search string
func (d *Dork) UpdateString(site, term string) {
	if d.String == "" {
		d.String = term
	} else {
		if term != "" {
			if d.String != "" {
				d.String = fmt.Sprintf("%s +\"%s\"", d.String, term)
			} else {
				d.String = fmt.Sprintf("+\"%s\"", term)
			}
		}
	}
	if site != "" {
		d.String = fmt.Sprintf("site:%s %s", site, d.String)
	}
}

// NewDork returns a new dork
func NewDork(engine, term string) Dork {
	return Dork{Engine: engine, String: term}
}

// Dorker defines a dorker structure. Used to store dorks.
type Dorker struct {
	userAgent string
	timeout   int
	depth     int
	Dorks     []Dork
}

// NewDorker returns a new dorker
func NewDorker(userAgent string, timeout, depth int) *Dorker {
	if depth < 1 {
		depth = DEFAULT_DEPTH
	}

	if timeout < 1 {
		timeout = DEFAULT_TIMEOUT
	}

	return &Dorker{
		userAgent: userAgent,
		timeout:   timeout,
		depth:     depth,
	}
}

// AddDork adds a dork in the dorker object
func (d *Dorker) AddDork(dork Dork) {
	d.Dorks = append(d.Dorks, dork)
}


================================================
FILE: dorker/dork_test.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package dorker

import (
	"strings"
	"testing"
)

func TestDorkGoogle(t *testing.T) {
	d := NewDorker("The_Goca_v0.1", 30, 1)
	d.AddDork(Dork{
		Engine: "google",
		String: "Chema Alonso",
	})

	urls := d.Google()

	if len(urls) == 0 {
		t.Errorf("expected some url but found %d", len(urls))
	}
}

func TestGetType(t *testing.T) {
	dl := dorkLib{
		"pdf": []Dork{
			Dork{"google", "filetype:pdf +\"%s\""},
			Dork{"bing", "filetype:pdf +\"%s\""},
		},
		"mp3": []Dork{
			Dork{"google", "filetype:mp3 +\"%s\""},
		},
	}

	typExpected := len(dl["pdf"])
	typ := dl.GetByType("pdf")

	if len(typ) != typExpected {
		t.Errorf("expected %d Dork but found %d", len(typ), typExpected)
	}

	typExpected = len(dl["mp3"])
	typ = dl.GetByType("mp3")

	if len(typ) != typExpected {
		t.Errorf("expected %d Dork but found %d", len(typ), typExpected)
	}
}

func TestGetByEngine(t *testing.T) {
	dl := dorkLib{
		"pdf": []Dork{
			Dork{"google", "filetype:pdf +\"%s\""},
			Dork{"bing", "filetype:pdf +\"%s\""},
		},
		"mp3": []Dork{
			Dork{"google", "filetype:mp3 +\"%s\""},
		},
	}

	typExpected := 1
	typ := dl.GetByEngine("pdf", "google")

	if len(typ) != typExpected {
		t.Errorf("expected %d Dork but found %d", len(typ), typExpected)
	}

	typExpected = 1
	typ = dl.GetByEngine("pdf", "bing")

	if len(typ) != typExpected {
		t.Errorf("expected %d Dork but found %d", len(typ), typExpected)
	}

	typExpected = 0
	typ = dl.GetByEngine("mp3", "bing")

	if len(typ) != typExpected {
		t.Errorf("expected %d Dork but found %d", len(typ), typExpected)
	}
}

func TestUpdateDork(t *testing.T) {
	d := NewDork("bing", "")

	d.UpdateDork("bing", "", "torm")

	if d.Engine != "bing" {
		t.Errorf("expected %s as engine but found %s", "bing", d.Engine)
	}

	if d.String != "+\"torm\"" {
		t.Errorf("expected +\"torm\" as String but found %s", d.String)
	}

	if strings.HasPrefix(d.String, "site") {
		t.Errorf("expected String without site limit, but found %s", d.String)
	}

	d = NewDork("bing", "term")

	d.UpdateDork("google", "google.com", "torm")

	if d.Engine != "google" {
		t.Errorf("expected %s as engine but found %s", "google", d.String)
	}

	if !strings.HasPrefix(d.String, "site") {
		t.Errorf("expected String to have site as prexif, but sit not found")
	}
}

func TestUpdateEngine(t *testing.T) {
	d := NewDork("google", "")

	d.UpdateEngine("bing")

	if d.Engine != "bing" {
		t.Errorf("expected %s as engine but found %s", "bing", d.Engine)
	}

	if d.String != "" {
		t.Errorf("expected '%s' as String but found %s", "", d.String)
	}
}

func TestUpdateString(t *testing.T) {
	d := NewDork("google", "")

	d.UpdateString("", "term")

	if d.Engine != "google" {
		t.Errorf("expected %s as engine but found %s", "google", d.Engine)
	}

	if d.String != "term" {
		t.Errorf("expected '%s' as String but found %s", "term", d.String)
	}

	if strings.HasPrefix(d.String, "site") {
		t.Errorf("expecting string without site limit, but found site")
	}

	d.UpdateString("google.com", "torm")
	if !strings.HasPrefix(d.String, "site:") {
		t.Errorf("expected String to have site, but found %s", d.String)
	}
}

// func TestNewDorker(t *testing.T)          {}
// func TestDorkBing(t *testing.T)           {}
// func TestDorkDuckDuckGo(t *testing.T)     {}
// func TestDorkYahoo(t *testing.T)          {}
// func TestDorkAsk(t *testing.T)            {}
// func TestDorkTLSCertificate(t *testing.T) {}


================================================
FILE: dorker/google.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package dorker

import (
	"fmt"
	"net/url"

	log "github.com/sirupsen/logrus"
)

// Google dorks Google engine
func (d *Dorker) Google() (results []string) {
	for _, dork := range d.Dorks {
		if dork.Engine != "google" {
			continue
		}

		re := `"><a href="/url\?q=(.*?)&amp;sa=U&amp;`
		escapedDork := url.QueryEscape(dork.String)

		for i := 0; i < d.depth; i++ {
			u := fmt.Sprintf("https://www.google.com/search?q=%s&start=%d0", escapedDork, i)

			wbuf, err := d.get(u)
			if err != nil {
				log.Printf("[!] (%s): %s", u, err.Error())
				continue
			}

			parsedData := parser(wbuf, re)
			for j := range parsedData {
				urlUnescaped, err := url.QueryUnescape(parsedData[j][1])
				if err != nil {
					log.Printf("[!] %s", err.Error())
					continue
				}

				results = append(results, urlUnescaped)
			}
		}
	}

	return
}


================================================
FILE: dorker/logger/arena.go
================================================
package logger

import (
	"math/rand"
	"time"
)

type arena struct {
	food       *food
	snake      *snake
	hasFood    func(*arena, coord) bool
	height     int
	width      int
	pointsChan chan (int)
}

func newArena(s *snake, p chan (int), h, w int) *arena {
	rand.Seed(time.Now().UnixNano())

	a := &arena{
		snake:      s,
		height:     h,
		width:      w,
		pointsChan: p,
		hasFood:    hasFood,
	}

	a.placeFood()

	return a
}

func (a *arena) moveSnake() error {
	if err := a.snake.move(); err != nil {
		return err
	}

	if a.snakeLeftArena() {
		return a.snake.die()
	}

	if a.hasFood(a, a.snake.head()) {
		go a.addPoints(a.food.points)
		a.snake.length++
		a.placeFood()
	}

	return nil
}

func (a *arena) snakeLeftArena() bool {
	h := a.snake.head()
	return h.x > a.width || h.y > a.height || h.x < 0 || h.y < 0
}

func (a *arena) addPoints(p int) {
	a.pointsChan <- p
}

func (a *arena) placeFood() {
	var x, y int

	for {
		x = rand.Intn(a.width)
		y = rand.Intn(a.height)

		if !a.isOccupied(coord{x: x, y: y}) {
			break
		}
	}

	a.food = newFood(x, y)
}

func hasFood(a *arena, c coord) bool {
	return c.x == a.food.x && c.y == a.food.y
}

func (a *arena) isOccupied(c coord) bool {
	return a.snake.isOnPosition(c)
}


================================================
FILE: dorker/logger/arena_test.go
================================================
package logger

import "testing"

var pointsDouble = make(chan int)

func newDoubleArenaWithFoodFinder(h, w int, f func(*arena, coord) bool) *arena {
	a := newDoubleArena(h, w)
	a.hasFood = f
	return a
}

func newDoubleArena(h, w int) *arena {
	s := newSnake(RIGHT, []coord{
		coord{x: 1, y: 0},
		coord{x: 1, y: 1},
		coord{x: 1, y: 2},
		coord{x: 1, y: 3},
		coord{x: 1, y: 4},
	})

	return newArena(s, pointsDouble, h, w)
}

func TestArenaHaveFoodPlaced(t *testing.T) {
	if a := newDoubleArena(20, 20); a.food == nil {
		t.Fatal("Arena expected to have food placed")
	}
}

func TestMoveSnakeOutOfArenaHeightLimit(t *testing.T) {
	a := newDoubleArena(4, 10)
	a.snake.changeDirection(UP)

	if err := a.moveSnake(); err == nil || err.Error() != "Died" {
		t.Fatal("Expected Snake to die when moving outside the Arena height limits")
	}
}

func TestMoveSnakeOutOfArenaWidthLimit(t *testing.T) {
	a := newDoubleArena(10, 1)
	a.snake.changeDirection(LEFT)

	if err := a.moveSnake(); err == nil || err.Error() != "Died" {
		t.Fatal("Expected Snake to die when moving outside the Arena height limits")
	}
}

func TestPlaceNewFoodWhenEatFood(t *testing.T) {
	a := newDoubleArenaWithFoodFinder(10, 10, func(*arena, coord) bool {
		return true
	})

	f := a.food

	a.moveSnake()

	if a.food.x == f.x && a.food.y == f.y {
		t.Fatal("Expected new food to have been placed on Arena")
	}
}

func TestIncreaseSnakeLengthWhenEatFood(t *testing.T) {
	a := newDoubleArenaWithFoodFinder(10, 10, func(*arena, coord) bool {
		return true
	})

	l := a.snake.length

	a.moveSnake()

	if a.snake.length != l+1 {
		t.Fatal("Expected Snake to have grown")
	}
}

func TestAddPointsWhenEatFood(t *testing.T) {
	a := newDoubleArenaWithFoodFinder(10, 10, func(*arena, coord) bool {
		return true
	})

	if p, ok := <-pointsDouble; ok && p != a.food.points {
		t.Fatalf("Value %d was expected but got %d", a.food.points, p)
	}

	a.moveSnake()
}

func TestDoesNotAddPointsWhenFoodNotFound(t *testing.T) {
	a := newDoubleArenaWithFoodFinder(10, 10, func(*arena, coord) bool {
		return false
	})

	select {
	case p, _ := <-pointsChan:
		t.Fatalf("No point was expected to be received but received %d", p)
	default:
		close(pointsChan)
	}

	a.moveSnake()
}

func TestDoesNotPlaceNewFoodWhenFoodNotFound(t *testing.T) {
	a := newDoubleArenaWithFoodFinder(10, 10, func(*arena, coord) bool {
		return false
	})

	f := a.food

	a.moveSnake()

	if a.food.x != f.x || a.food.y != f.y {
		t.Fatal("Food in Arena expected not to have changed")
	}
}

func TestDoesNotIncreaseSnakeLengthWhenFoodNotFound(t *testing.T) {
	a := newDoubleArenaWithFoodFinder(10, 10, func(*arena, coord) bool {
		return false
	})

	l := a.snake.length

	a.moveSnake()

	if a.snake.length != l {
		t.Fatal("Expected Snake not to have grown")
	}
}

func TestHasFood(t *testing.T) {
	a := newDoubleArena(20, 20)

	if !hasFood(a, coord{x: a.food.x, y: a.food.y}) {
		t.Fatal("Food expected to be found")
	}
}

func TestHasNotFood(t *testing.T) {
	a := newDoubleArena(20, 20)

	if hasFood(a, coord{x: a.food.x - 1, y: a.food.y}) {
		t.Fatal("No food expected to be found")
	}
}


================================================
FILE: dorker/logger/coord.go
================================================
package logger

type coord struct {
	x, y int
}


================================================
FILE: dorker/logger/food.go
================================================
package logger

import (
	"math/rand"
	"os"
	"strings"
)

type food struct {
	emoji        rune
	points, x, y int
}

func newFood(x, y int) *food {
	return &food{
		points: 10,
		emoji:  getFoodEmoji(),
		x:      x,
		y:      y,
	}
}

func getFoodEmoji() rune {
	if hasUnicodeSupport() {
		return randomFoodEmoji()
	}

	return '@'
}

func randomFoodEmoji() rune {
	f := []rune{
		'G',
		// '🍒',
		// '🍍',
		// '🍑',
		// '🍇',
		// '🍏',
		// '🍌',
		// '🍫',
		// '🍭',
		// '🍕',
		// '🍩',
		// '🍗',
		// '🍖',
		// '🍬',
		// '🍤',
		// '🍪',
	}

	return f[rand.Intn(len(f))]
}

func hasUnicodeSupport() bool {
	return strings.Contains(os.Getenv("LANG"), "UTF-8")
}


================================================
FILE: dorker/logger/food_test.go
================================================
package logger

import (
	"os"
	"testing"
)

func TestFoodDefaultPoints(t *testing.T) {
	f := newFood(10, 10)

	if f.points != 10 {
		t.Fatalf("Expected Food default points to be 10 but got %v", f.points)
	}
}

func TestFoodEmoji(t *testing.T) {
	f := newFood(10, 10)

	if string(f.emoji) == "" {
		t.Fatal("Food emoji not expected to be blank")
	}
}

func TestFoodFallback(t *testing.T) {
	os.Setenv("LANG", "c")

	f := newFood(10, 10)

	if string(f.emoji) != "@" {
		t.Fatal("Food emoji expected to be '@'")
	}
}


================================================
FILE: dorker/logger/game.go
================================================
package logger

import (
	"time"

	"github.com/nsf/termbox-go"
)

var (
	pointsChan         = make(chan int)
	keyboardEventsChan = make(chan keyboardEvent)
)

// Game type
type Game struct {
	arena  *arena
	score  int
	isOver bool
}

func initialSnake() *snake {
	return newSnake(RIGHT, []coord{
		coord{x: 1, y: 1},
		coord{x: 1, y: 2},
		coord{x: 1, y: 3},
		coord{x: 1, y: 4},
	})
}

func initialScore() int {
	return 0
}

func initialArena() *arena {
	return newArena(initialSnake(), pointsChan, 20, 50)
}

func (g *Game) end() {
	g.isOver = true
}

func (g *Game) moveInterval() time.Duration {
	ms := 100 - (g.score / 10)
	return time.Duration(ms) * time.Millisecond
}

func (g *Game) retry() {
	g.arena = initialArena()
	g.score = initialScore()
	g.isOver = false
}

func (g *Game) addPoints(p int) {
	g.score += p
}

// NewGame creates new Game object
func NewGame() *Game {
	return &Game{arena: initialArena(), score: initialScore()}
}

// Start starts the game
func (g *Game) Start() {
	if err := termbox.Init(); err != nil {
		panic(err)
	}
	defer termbox.Close()

	go listenToKeyboard(keyboardEventsChan)

	if err := g.render(); err != nil {
		panic(err)
	}

mainloop:
	for {
		select {
		case p := <-pointsChan:
			g.addPoints(p)
		case e := <-keyboardEventsChan:
			switch e.eventType {
			case MOVE:
				d := keyToDirection(e.key)
				g.arena.snake.changeDirection(d)
			case RETRY:
				g.retry()
			case END:
				break mainloop
			}
		default:
			if !g.isOver {
				if err := g.arena.moveSnake(); err != nil {
					g.end()
				}
			}

			if err := g.render(); err != nil {
				panic(err)
			}

			time.Sleep(g.moveInterval())
		}
	}
}


================================================
FILE: dorker/logger/game_test.go
================================================
package logger

import (
	"testing"
	"time"
)

func TestDefaultGameScore(t *testing.T) {
	g := NewGame()

	if g.score != 0 {
		t.Fatalf("Initial Game Score expected to be 0 but it was %d", g.score)
	}
}

func TestGameMoveInterval(t *testing.T) {
	e := time.Duration(85) * time.Millisecond
	g := NewGame()
	g.score = 150

	if d := g.moveInterval(); d != e {
		t.Fatalf("Expected move interval to be %d but got %d", e, d)
	}
}

func TestAddPoints(t *testing.T) {
	g := NewGame()
	s := g.score
	g.addPoints(10)

	if s != 0 || g.score != 10 {
		t.Fatal("Expected 10 points to have been added to Game Score")
	}
}

func TestRetryGoBackToGameInitialState(t *testing.T) {
	g := NewGame()
	initScore := g.score
	initSnake := g.arena.snake

	g.arena.snake.changeDirection(UP)
	g.arena.moveSnake()
	g.addPoints(10)
	g.end()

	g.retry()

	if g.score != initScore {
		t.Fatal("Expected Score to have been reset")
	}

	for i, c := range g.arena.snake.body {
		if initSnake.body[i].x == c.x && initSnake.body[i].y == c.y {
			t.Fatal("Expected Snake body to have been reset")
		}
	}

	if g.arena.snake.direction == initSnake.direction {
		t.Fatal("Expected Snake direction to have been reset")
	}
}


================================================
FILE: dorker/logger/keyboard.go
================================================
package logger

import "github.com/nsf/termbox-go"

type keyboardEventType int

// Keyboard events
const (
	MOVE keyboardEventType = 1 + iota
	RETRY
	END
)

type keyboardEvent struct {
	eventType keyboardEventType
	key       termbox.Key
}

func keyToDirection(k termbox.Key) direction {
	switch k {
	case termbox.KeyArrowLeft:
		return LEFT
	case termbox.KeyArrowDown:
		return DOWN
	case termbox.KeyArrowRight:
		return RIGHT
	case termbox.KeyArrowUp:
		return UP
	default:
		return 0
	}
}

func listenToKeyboard(evChan chan keyboardEvent) {
	termbox.SetInputMode(termbox.InputEsc)

	for {
		switch ev := termbox.PollEvent(); ev.Type {
		case termbox.EventKey:
			switch ev.Key {
			case termbox.KeyArrowLeft:
				evChan <- keyboardEvent{eventType: MOVE, key: ev.Key}
			case termbox.KeyArrowDown:
				evChan <- keyboardEvent{eventType: MOVE, key: ev.Key}
			case termbox.KeyArrowRight:
				evChan <- keyboardEvent{eventType: MOVE, key: ev.Key}
			case termbox.KeyArrowUp:
				evChan <- keyboardEvent{eventType: MOVE, key: ev.Key}
			case termbox.KeyEsc:
				evChan <- keyboardEvent{eventType: END, key: ev.Key}
			default:
				if ev.Ch == 'r' {
					evChan <- keyboardEvent{eventType: RETRY, key: ev.Key}
				}
			}
		case termbox.EventError:
			panic(ev.Err)
		}
	}
}


================================================
FILE: dorker/logger/keyboard_test.go
================================================
package logger

import (
	"testing"

	"github.com/nsf/termbox-go"
)

func TestKeyToDirectionDefault(t *testing.T) {
	d := keyToDirection(termbox.KeyEsc)

	if d != 0 {
		t.Fatalf("Expected direction to be 0 but got %v", d)
	}
}

func TestKeyToDirectionRight(t *testing.T) {
	d := keyToDirection(termbox.KeyArrowRight)

	if d != RIGHT {
		t.Fatalf("Expected direction to be RIGHT but got %v", d)
	}
}

func TestKeyToDirectionDown(t *testing.T) {
	d := keyToDirection(termbox.KeyArrowDown)

	if d != DOWN {
		t.Fatalf("Expected direction to be DOWN but got %v", d)
	}
}

func TestKeyToDirectionLeft(t *testing.T) {
	d := keyToDirection(termbox.KeyArrowLeft)

	if d != LEFT {
		t.Fatalf("Expected direction to be LEFT but got %v", d)
	}
}

func TestKeyToDirectionUp(t *testing.T) {
	d := keyToDirection(termbox.KeyArrowUp)

	if d != UP {
		t.Fatalf("Expected direction to be UP but got %v", d)
	}
}


================================================
FILE: dorker/logger/presenter.go
================================================
package logger

import (
	"fmt"

	"github.com/mattn/go-runewidth"
	"github.com/nsf/termbox-go"
)

const (
	defaultColor = termbox.ColorDefault
	bgColor      = termbox.ColorDefault
	snakeColor   = termbox.ColorGreen
)

func (g *Game) render() error {
	termbox.Clear(defaultColor, defaultColor)

	var (
		w, h   = termbox.Size()
		midY   = h / 2
		left   = (w - g.arena.width) / 2
		right  = (w + g.arena.width) / 2
		top    = midY - (g.arena.height / 2)
		bottom = midY + (g.arena.height / 2) + 1
	)

	renderTitle(left, top)
	renderArena(g.arena, top, bottom, left)
	renderSnake(left, bottom, g.arena.snake)
	renderFood(left, bottom, g.arena.food)
	renderScore(left, bottom, g.score)
	renderQuitMessage(right, bottom)

	return termbox.Flush()
}

func renderSnake(left, bottom int, s *snake) {
	for _, b := range s.body {
		termbox.SetCell(left+b.x, bottom-b.y, ' ', snakeColor, snakeColor)
	}
}

func renderFood(left, bottom int, f *food) {
	termbox.SetCell(left+f.x, bottom-f.y, f.emoji, defaultColor, bgColor)
}

func renderArena(a *arena, top, bottom, left int) {
	for i := top; i < bottom; i++ {
		termbox.SetCell(left-1, i, '│', defaultColor, bgColor)
		termbox.SetCell(left+a.width, i, '│', defaultColor, bgColor)
	}

	termbox.SetCell(left-1, top, '┌', defaultColor, bgColor)
	termbox.SetCell(left-1, bottom, '└', defaultColor, bgColor)
	termbox.SetCell(left+a.width, top, '┐', defaultColor, bgColor)
	termbox.SetCell(left+a.width, bottom, '┘', defaultColor, bgColor)

	fill(left, top, a.width, 1, termbox.Cell{Ch: '─'})
	fill(left, bottom, a.width, 1, termbox.Cell{Ch: '─'})
}

func renderScore(left, bottom, s int) {
	score := fmt.Sprintf("Score: %v", s)
	tbprint(left, bottom+1, defaultColor, defaultColor, score)
}

func renderQuitMessage(right, bottom int) {
	m := "Press ESC to quit"
	tbprint(right-17, bottom+1, defaultColor, defaultColor, m)
}

func renderTitle(left, top int) {
	tbprint(left, top-1, defaultColor, defaultColor, "Goca Snake")
}

func fill(x, y, w, h int, cell termbox.Cell) {
	for ly := 0; ly < h; ly++ {
		for lx := 0; lx < w; lx++ {
			termbox.SetCell(x+lx, y+ly, cell.Ch, cell.Fg, cell.Bg)
		}
	}
}

func tbprint(x, y int, fg, bg termbox.Attribute, msg string) {
	for _, c := range msg {
		termbox.SetCell(x, y, c, fg, bg)
		x += runewidth.RuneWidth(c)
	}
}


================================================
FILE: dorker/logger/presenter_test.go
================================================
package logger

import "testing"

func TestPresenterRendersSuccessfully(t *testing.T) {
	g := NewGame()

	if err := g.render(); err != nil {
		t.Fatal("Expected Game to have been rendered successfully")
	}
}


================================================
FILE: dorker/logger/snake.go
================================================
package logger

import "errors"

// Allowed snake movement directions
const (
	RIGHT direction = 1 + iota
	LEFT
	UP
	DOWN
)

type direction int

type snake struct {
	body      []coord
	direction direction
	length    int
}

func newSnake(d direction, b []coord) *snake {
	return &snake{
		length:    len(b),
		body:      b,
		direction: d,
	}
}

func (s *snake) changeDirection(d direction) {
	opposites := map[direction]direction{
		RIGHT: LEFT,
		LEFT:  RIGHT,
		UP:    DOWN,
		DOWN:  UP,
	}

	if o := opposites[d]; o != 0 && o != s.direction {
		s.direction = d
	}
}

func (s *snake) head() coord {
	return s.body[len(s.body)-1]
}

func (s *snake) die() error {
	return errors.New("Died")
}

func (s *snake) move() error {
	h := s.head()
	c := coord{x: h.x, y: h.y}

	switch s.direction {
	case RIGHT:
		c.x++
	case LEFT:
		c.x--
	case UP:
		c.y++
	case DOWN:
		c.y--
	}

	if s.isOnPosition(c) {
		return s.die()
	}

	if s.length > len(s.body) {
		s.body = append(s.body, c)
	} else {
		s.body = append(s.body[1:], c)
	}

	return nil
}

func (s *snake) isOnPosition(c coord) bool {
	for _, b := range s.body {
		if b.x == c.x && b.y == c.y {
			return true
		}
	}

	return false
}


================================================
FILE: dorker/logger/snake_test.go
================================================
package logger

import "testing"

func newDoubleSnake(d direction) *snake {
	return newSnake(d, []coord{
		coord{x: 1, y: 0},
		coord{x: 1, y: 1},
		coord{x: 1, y: 2},
		coord{x: 1, y: 3},
		coord{x: 1, y: 4},
	})
}

func TestSnakeBodyMove(t *testing.T) {
	snake := newDoubleSnake(RIGHT)
	snake.move()

	if snake.body[0].x != 1 || snake.body[0].y != 1 {
		t.Fatalf("Invalid body position %x", snake.body[0])
	}

	if snake.body[1].x != 1 || snake.body[1].y != 2 {
		t.Fatalf("Invalid body position %x", snake.body[1])
	}

	if snake.body[2].x != 1 || snake.body[2].y != 3 {
		t.Fatalf("Invalid body position %x", snake.body[2])
	}

	if snake.body[3].x != 1 || snake.body[3].y != 4 {
		t.Fatalf("Invalid body position %x", snake.body[3])
	}

	if snake.body[4].x != 2 || snake.body[4].y != 4 {
		t.Fatalf("Invalid body position %x", snake.body[4])
	}
}

func TestSnakeHeadMoveRight(t *testing.T) {
	snake := newDoubleSnake(RIGHT)
	snake.move()

	if snake.head().x != 2 || snake.head().y != 4 {
		t.Fatalf("Expected head to have moved to position [2 4], got %x", snake.head())
	}
}

func TestSnakeHeadMoveUp(t *testing.T) {
	snake := newDoubleSnake(UP)
	snake.move()

	if snake.head().x != 1 || snake.head().y != 5 {
		t.Fatalf("Expected head to have moved to position [1 5], got %x", snake.head())
	}
}

func TestSnakeHeadMoveDown(t *testing.T) {
	snake := newDoubleSnake(RIGHT)
	snake.move()

	snake.changeDirection(DOWN)
	snake.move()

	if snake.head().x != 2 || snake.head().y != 3 {
		t.Fatalf("Expected head to have moved to position [2 3], got %x", snake.head())
	}
}

func TestSnakeHeadMoveLeft(t *testing.T) {
	snake := newDoubleSnake(LEFT)
	snake.move()

	if snake.head().x != 0 || snake.head().y != 4 {
		t.Fatalf("Expected head to have moved to position [0 4], got %x", snake.head())
	}
}

func TestChangeDirectionToNotOposity(t *testing.T) {
	snake := newDoubleSnake(DOWN)
	snake.changeDirection(RIGHT)
	if snake.direction != RIGHT {
		t.Fatal("Expected to change Snake Direction to DOWN")
	}
}

func TestChangeDirectionToOposity(t *testing.T) {
	snake := newDoubleSnake(RIGHT)
	snake.changeDirection(LEFT)
	if snake.direction == LEFT {
		t.Fatal("Expected not to have changed Snake Direction to LEFT")
	}
}

func TestChangeDirectionToInvalidDirection(t *testing.T) {
	snake := newDoubleSnake(RIGHT)
	snake.changeDirection(5)
	if snake.direction != RIGHT {
		t.Fatal("Expected not to have changed Snake Direction")
	}
}

func TestSnakeDie(t *testing.T) {
	snake := newDoubleSnake(RIGHT)

	if err := snake.die(); err.Error() != "Died" {
		t.Fatal("Expected Snake die() to return error")
	}
}

func TestSnakeDieWhenMoveOnTopOfItself(t *testing.T) {
	snake := newDoubleSnake(RIGHT)
	snake.move()

	snake.changeDirection(DOWN)
	snake.move()

	snake.changeDirection(LEFT)

	if err := snake.die(); err.Error() != "Died" {
		t.Fatal("Expected Snake to die when moved on top of itself")
	}
}


================================================
FILE: dorker/logger.go
================================================
package dorker

import (
	"github.com/gocaio/goca/dorker/logger"
)

// LogMeIn logs the scrapped files
func LogMeIn() {
	logger.NewGame().Start()
}


================================================
FILE: dorker/parser.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package dorker

import (
	"regexp"
)

func parser(buf []byte, re string) [][]string {
	rex := regexp.MustCompile(re)
	parsed := rex.FindAllStringSubmatch(string(buf), -1)[0:]

	return parsed
}


================================================
FILE: dorker/scrapper.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package dorker

import (
	"net/url"

	"github.com/gocolly/colly"
	log "github.com/sirupsen/logrus"
)

// Scrapper is the main scrapping class
type Scrapper struct {
	domain  string
	depthN  int
	files   []string
	targets map[string]struct {
		parent    string
		linkDepth int
		scrapped  bool
	}
}

// NewScrapper initializes the scrapper
func NewScrapper(domain string, depth int) *Scrapper {
	return &Scrapper{
		domain: domain,
		depthN: depth,
	}
}

// Run begins the scrapping task
func (s *Scrapper) Run() error {
	log.Infof("Scrapping %s", s.domain)

	u, err := url.Parse(s.domain)
	if err != nil {
		return err
	}

	// Instantiate default collector
	c := colly.NewCollector(
		colly.AllowedDomains(u.Host),
	)

	// On every a element which has href attribute call callback
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		link := e.Attr("href")
		// Print link
		// log.Infof("Link found: %s", link)
		// Visit link found on page
		// Only those links are visited which are in AllowedDomains
		c.Visit(e.Request.AbsoluteURL(link))
	})

	// Before making a request print "Visiting ..."
	c.OnRequest(func(r *colly.Request) {
		log.Debugf("Found: %s", r.URL.String())
		s.files = append(s.files, r.URL.String())
	})

	// Start scraping on the domain
	c.Visit(s.domain)

	return nil
}

// Links is a helper method to return all the recovered file URLs
func (s *Scrapper) Links() []string {
	log.Debug("Ret scrapped file links")
	return s.files
}

// =================
// = Class helpers =
// =================
func (s *Scrapper) foo() {}


================================================
FILE: dorker/scrapper_test.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package dorker

import (
	"testing"
)

func TestScrapper(t *testing.T) {}


================================================
FILE: dorker/webHandler.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package dorker

import (
	"io/ioutil"
	"net/http"
)

func (d *Dorker) get(url string) ([]byte, error) {
	var body []byte

	// For POST methods, "nil" is a http form
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return body, err
	}

	// Set headers
	req.Header.Set("User-Agent", d.userAgent)

	// Create a new client
	client := &http.Client{} // This struct accepts config params
	res, err := client.Do(req)
	if err != nil {
		return body, err
	}
	defer res.Body.Close()

	// Readout the body
	body, err = ioutil.ReadAll(res.Body)
	if err != nil {
		return body, err
	}

	return body, nil
}


================================================
FILE: go.mod
================================================
module github.com/gocaio/goca

require (
	github.com/32bitkid/bitreader v0.0.0-20180710164922-66b707e0f706 // indirect
	github.com/PuerkitoBio/goquery v1.5.0 // indirect
	github.com/RangelReale/swfinfo v0.0.0-20180612120335-24bc2c8ef835
	github.com/antchfx/htmlquery v0.0.0-20181228060131-db5c1236cbb4 // indirect
	github.com/antchfx/xmlquery v0.0.0-20181223105952-355641961c92 // indirect
	github.com/antchfx/xpath v0.0.0-20181208024549-4bbdf6db12aa // indirect
	github.com/asaskevich/EventBus v0.0.0-20180315140547-d46933a94f05
	github.com/dhowden/tag v0.0.0-20181104225729-a9f04c2798ca
	github.com/fatih/color v1.7.0 // indirect
	github.com/gehaxelt/ds_store v0.0.0-20160410173536-89310cee0104
	github.com/gobwas/glob v0.2.3 // indirect
	github.com/gocolly/colly v1.1.0
	github.com/h2non/filetype v1.0.6
	github.com/kennygrant/sanitize v1.2.4 // indirect
	github.com/kevinborras/metagoffice v1.0.0
	github.com/kevinborras/metagopenoffice v0.0.0-20190130115525-5f50564a872b
	github.com/mattn/go-colorable v0.0.9 // indirect
	github.com/mattn/go-isatty v0.0.4 // indirect
	github.com/mattn/go-runewidth v0.0.4
	github.com/nsf/termbox-go v0.0.0-20190325093121-288510b9734e
	github.com/nwidger/jsoncolor v0.0.0-20170215171346-75a6de4340e5
	github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
	github.com/sirupsen/logrus v1.3.0
	github.com/smira/lzma v0.0.0-20160124201817-7f0af6269940 // indirect
	github.com/temoto/robotstxt v0.0.0-20180810133444-97ee4a9ee6ea // indirect
	github.com/timshannon/bolthold v0.0.0-20190315152903-eed35b755671
	github.com/tkrajina/gpxgo v1.0.0
	go.etcd.io/bbolt v1.3.2 // indirect
	go.mongodb.org/mongo-driver v1.0.0
	golang.org/x/net v0.0.0-20190311183353-d8887717615a // indirect
	golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect
	google.golang.org/appengine v1.4.0 // indirect
	trimmer.io/go-xmp v0.0.0-20181216222714-4f6a2fb384a3
)


================================================
FILE: go.sum
================================================
github.com/32bitkid/bitreader v0.0.0-20180710164922-66b707e0f706 h1:kaeJjKUVtEiF0+EjX9q0XPyhX6VmFJRagHU07Noxjzo=
github.com/32bitkid/bitreader v0.0.0-20180710164922-66b707e0f706/go.mod h1:/f3zY7lVofN23ZcM80fEiNJXjOZrPxRrsa6mLLleEKg=
github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk=
github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
github.com/RangelReale/swfinfo v0.0.0-20180612120335-24bc2c8ef835 h1:vhlQZK53Y1p5NmjO9FYqY9laYXZgDx5QmS8zV7AuXgY=
github.com/RangelReale/swfinfo v0.0.0-20180612120335-24bc2c8ef835/go.mod h1:kh32rkqHW5q6gpiuzSiTNZmPMy1rk6FgTp0VRNyGovI=
github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/antchfx/htmlquery v0.0.0-20181228060131-db5c1236cbb4 h1:BTaaUJk9rPlRPuQ91lRhckgc9LdLBfoN8AMeW/9SOBw=
github.com/antchfx/htmlquery v0.0.0-20181228060131-db5c1236cbb4/go.mod h1:MS9yksVSQXls00iXkiMqXr0J+umL/AmxXKuP28SUJM8=
github.com/antchfx/xmlquery v0.0.0-20181223105952-355641961c92 h1:4EgP6xLAdrD/TRlbSw4n2W6h68K2P3+R7lKqFoL5U9Q=
github.com/antchfx/xmlquery v0.0.0-20181223105952-355641961c92/go.mod h1:/+CnyD/DzHRnv2eRxrVbieRU/FIF6N0C+7oTtyUtCKk=
github.com/antchfx/xpath v0.0.0-20181208024549-4bbdf6db12aa h1:lL66YnJWy1tHlhjSx8fXnpgmv8kQVYnI4ilbYpNB6Zs=
github.com/antchfx/xpath v0.0.0-20181208024549-4bbdf6db12aa/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/asaskevich/EventBus v0.0.0-20180315140547-d46933a94f05 h1:Shem5lRG4gJyrrg9YMIl7dOQazyWCq0Daz4LjompZ28=
github.com/asaskevich/EventBus v0.0.0-20180315140547-d46933a94f05/go.mod h1:JS7hed4L1fj0hXcyEejnW57/7LCetXggd+vwrRnYeII=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dhowden/tag v0.0.0-20181104225729-a9f04c2798ca h1:EsPh1VImRZ6OOhWtz/zzwTjxVQKcKIiqS5tYNdx2eCg=
github.com/dhowden/tag v0.0.0-20181104225729-a9f04c2798ca/go.mod h1:SniNVYuaD1jmdEEvi+7ywb1QFR7agjeTdGKyFb0p7Rw=
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/gehaxelt/ds_store v0.0.0-20160410173536-89310cee0104 h1:CWrm2Yv3qH+ERRb/iHIRldu6jfKIGI51nBlR1oYF+t8=
github.com/gehaxelt/ds_store v0.0.0-20160410173536-89310cee0104/go.mod h1:iPCmcm7/tQJc127INL5EEEMamPzc6HaACoIh3yclQR4=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gocolly/colly v1.1.0 h1:B1M8NzjFpuhagut8f2ILUDlWMag+nTx+PWEmPy7RhrE=
github.com/gocolly/colly v1.1.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/h2non/filetype v1.0.6 h1:g84/+gdkAT1hnYO+tHpCLoikm13Ju55OkN4KCb1uGEQ=
github.com/h2non/filetype v1.0.6/go.mod h1:isekKqOuhMj+s/7r3rIeTErIRy4Rub5uBWHfvMusLMU=
github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
github.com/kevinborras/metagoffice v1.0.0 h1:COCoMk8wDJWWjw3K3E1wvpxIs7FLRqsYD7aWHA6QTA4=
github.com/kevinborras/metagoffice v1.0.0/go.mod h1:Tq5NCJ9B+Qr4DAdQz7+Y6pmbWcWVei1wm5trNZ3KBR0=
github.com/kevinborras/metagopenoffice v0.0.0-20190130115525-5f50564a872b h1:ldGH+SWEQkePEWj3WlvWaC0taGXeNPnSgGTSCKg1M0k=
github.com/kevinborras/metagopenoffice v0.0.0-20190130115525-5f50564a872b/go.mod h1:TX8Q24xepQtWZsJZ/riwKBRp0PpCBtoRlj6Aax4l5NE=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/nsf/termbox-go v0.0.0-20190325093121-288510b9734e h1:Vbib8wJAaMEF9jusI/kMSYMr/LtRzM7+F9MJgt/nH8k=
github.com/nsf/termbox-go v0.0.0-20190325093121-288510b9734e/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ=
github.com/nwidger/jsoncolor v0.0.0-20170215171346-75a6de4340e5 h1:d+C3xJdxZT7wNlxqEwbXn3R355CwAhYBL9raVNfSnK0=
github.com/nwidger/jsoncolor v0.0.0-20170215171346-75a6de4340e5/go.mod h1:GYFm0zZgTNeoK1QxuIofRDasy2ibmaJZhZLzwsMXUF4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
github.com/sirupsen/logrus v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME=
github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/smira/lzma v0.0.0-20160124201817-7f0af6269940 h1:z3NJMtzxmGxEs+RUxFpp3jxuFzeG2ihp6jZ0FZi75Wc=
github.com/smira/lzma v0.0.0-20160124201817-7f0af6269940/go.mod h1:zmVvOLLLFrvqaEvoz1i14UoaNPVg8ge70IA/NblPfw8=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/temoto/robotstxt v0.0.0-20180810133444-97ee4a9ee6ea h1:hH8P1IiDpzRU6ZDbDh/RDnVuezi2oOXJpApa06M0zyI=
github.com/temoto/robotstxt v0.0.0-20180810133444-97ee4a9ee6ea/go.mod h1:aOux3gHPCftJ3KHq6Pz/AlDjYJ7Y+yKfm1gU/3B0u04=
github.com/timshannon/bolthold v0.0.0-20190315152903-eed35b755671 h1:9Gto1/QATFGggnnonRqCCuDKMu4pWxmNtLPZmt6Wyfg=
github.com/timshannon/bolthold v0.0.0-20190315152903-eed35b755671/go.mod h1:jUigdmrbdCxcIDEFrq82t4X9805XZfwFZoYUap0ET/U=
github.com/tkrajina/gpxgo v1.0.0 h1:gg7O1KHOnlmvCn7Xo5b3leSd9yAUJhlaKiHVgF55Qvs=
github.com/tkrajina/gpxgo v1.0.0/go.mod h1:hsBsIBkzEjyYpLUmDeCBb1+x+Dj3vCD0mYL3562UV2Y=
go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.mongodb.org/mongo-driver v1.0.0 h1:KxPRDyfB2xXnDE2My8acoOWBQkfv3tz0SaWTRZjJR0c=
go.mongodb.org/mongo-driver v1.0.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
trimmer.io/go-xmp v0.0.0-20181216222714-4f6a2fb384a3 h1:Eoi62HBpULakI5UOxj198gFRK4J4GFNEVekzHY4eKGs=
trimmer.io/go-xmp v0.0.0-20181216222714-4f6a2fb384a3/go.mod h1:SMaHrR8/c7YtKZ2zt8r9n93tJjQQOGAagAewi9axCj4=


================================================
FILE: goca/goca.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package main

import (
	"flag"
	"fmt"
	"os"
	"strings"

	"github.com/gocaio/goca"
	"github.com/gocaio/goca/dorker"
	_ "github.com/gocaio/goca/plugins"
	log "github.com/sirupsen/logrus"
)

const banner = "Fear The Goca!"
const appName = "GOCA"

var (
	buildDate    string
	gitTag       string
	gitCommit    string
	term         string
	domain       string
	url          string
	listURL      bool
	folder       string
	pages        = 1
	timeOut      = 30
	ua           string
	listPlugins  bool
	filetype     = "*"
	loglevel     = "info"
	scrapper     string
	projectName  string
	printProject string
	listProjects bool
)

func init() {
	flag.StringVar(&term, "term", term, "Dork term")
	flag.StringVar(&domain, "domain", domain, "Scrape domain")
	flag.StringVar(&url, "url", url, "Scope Goca acctions to a domain")
	flag.BoolVar(&listURL, "listurls", listURL, "Just list url do not process them")
	flag.StringVar(&folder, "folder", folder, "Run goca against local folder")
	flag.IntVar(&pages, "dorkpages", pages, "Number of pages to dork form the search engine")
	flag.IntVar(&timeOut, "timeout", timeOut, "Timeout per request")
	flag.StringVar(&ua, "ua", ua, "User-Agent to be used.")
	flag.StringVar(&filetype, "filetype", filetype, "Look for metadata on")
	flag.StringVar(&loglevel, "loglevel", loglevel, "Log level")
	flag.BoolVar(&listPlugins, "listplugins", listPlugins, "List available plugins")
	flag.StringVar(&scrapper, "scrapper", scrapper, "Scrapes the given domain (e.g. test.goca.io)")
	flag.StringVar(&projectName, "project", projectName, "Project name to work on")
	flag.StringVar(&printProject, "printproject", printProject, "Project name to print")
	flag.BoolVar(&listProjects, "listprojects", listProjects, "List stored projects")

	flag.Parse()
}

func main() {
	var err error
	goca.AppName = appName
	goca.AppVersion = gitTag
	if len(gitTag) == 0 {
		goca.AppVersion = "(dev)"
	}

	setLogLevel()

	if listPlugins {
		plugins := goca.ListPlugins()
		for typ, plugs := range plugins {
			fmt.Printf("Plugins for: %s\n", typ)
			for _, plug := range plugs {
				fmt.Printf("  - %s\n", plug)
			}
			fmt.Printf("\n")
		}
		os.Exit(0)
	}

	if (term != "" || url != "" || domain != "" || folder != "" || scrapper != "") && !listProjects {
		if len(loglevel) != 0 {
			log.Infof("%s\n", banner)
			log.Infof("Version: %s (%s) built on %s\n", goca.AppVersion, gitCommit, buildDate)
		}

		if projectName != "" {
			goca.PS, err = goca.OpenProjectStore()
			if err != nil {
				log.Fatal(err)
			}
			defer goca.PS.DS.Close()

			project, err := goca.PS.GetProject(projectName)
			if err != nil {
				project, err = goca.PS.NewProject(projectName)
				if err != nil {
					log.Fatal(err)
				}
			}

			goca.CurrentProject = project
		}

		types := strings.Split(filetype, ",")

		for _, t := range types {
			if !goca.IsPluginTypeValid(t) {
				log.Errorf("There are no plugin processor for %s.\n", t)
				os.Exit(1)
			}
		}

		if len(loglevel) != 0 && len(types) == 1 && types[0] == "*" {
			log.Warnln("Running Goca with all plugins")
		}

		if len(ua) == 0 {
			ua = goca.UserAgent
		}

		if len(folder) != 0 {
			in := goca.Input{
				Folder:    folder,
				FileType:  types,
				PagesDork: pages,
				URL:       url,
				ListURL:   listURL,
				TimeOut:   timeOut,
				UA:        ua,
			}

			goca.StartFolder(in)
		} else {
			in := goca.Input{
				Term:      term,
				Domain:    domain,
				URL:       url,
				ListURL:   listURL,
				FileType:  types,
				PagesDork: pages,
				TimeOut:   timeOut,
				UA:        ua,
				Scrapper:  scrapper,
			}

			if scrapper != "" {
				goca.StartScrapper(in)
			} else {
				goca.StartTerm(in)
			}
		}
	} else {
		if printProject != "" {
			goca.PS, err = goca.OpenProjectStore()
			if err != nil {
				log.Fatal(err)
			}
			defer goca.PS.DS.Close()

			err = goca.PS.PrintProject(printProject)
			if err != nil {
				log.Fatal("Project not found.")
			}
		} else if listProjects {
			goca.PS, err = goca.OpenProjectStore()
			if err != nil {
				log.Fatal(err)
			}
			defer goca.PS.DS.Close()

			projects, err := goca.PS.GetProjectList()
			if err != nil {
				log.Fatal("Project not found.")
			}

			fmt.Println("Goca projects:")
			for _, project := range projects {
				fmt.Println("- " + project.Name)
			}
		} else {
			flag.PrintDefaults()
		}
	}
}

func setLogLevel() {
	log.SetOutput(os.Stdout)

	switch loglevel {
	case "3":
		log.SetLevel(log.DebugLevel)
	case "debug":
		log.SetLevel(log.DebugLevel)
	case "2":
		log.SetLevel(log.InfoLevel)
	case "info":
		log.SetLevel(log.InfoLevel)
	case "1":
		log.SetLevel(log.WarnLevel)
	case "warn":
		log.SetLevel(log.WarnLevel)
	case "0":
		log.SetLevel(log.ErrorLevel)
	case "error":
		log.SetLevel(log.ErrorLevel)
	default:
		log.SetLevel(log.InfoLevel)
		log.Error("No valid loglevel, falling back to info level")
	}

	if os.Getenv("HIDDEN") == "BUNNY" {
		dorker.LogMeIn()
		os.Exit(0)
	}
}


================================================
FILE: goca.go
================================================
/*
	Copyright © 2019 The Goca.io team

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at

	    http://www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/

package goca

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/gocaio/goca/dorker"
	log "github.com/sirupsen/logrus"
)

// UserAgent defines the UserAgent used by goca
const UserAgent = "The_Goca_v0.1"

var (
	// AppName is the Application name
	AppName string
	// AppVersion is the Application version
	AppVersion string
)

// StartTerm is the Goca library entrypoint for terms
func StartTerm(input Input) {
	if input.ListURL {
		fmt.Println("Goca has got the following URLs for you")
	}

	for _, plugType := range input.FileType {
		dorks := getDorkers(plugType, input)

		log.Debugf("Dorks for plugin %s: %v\n", plugType, dorks.Dorks)

		// Initialize context or controller per each type
		ctx := NewController(input)

		// Initialize all plugins based on context
		executePlugins(plugType, ctx)

		urls := dorks.Google() // In the future user will be able to choose other search engine

		log.Debugf("Got %d url\n", len(urls))
		log.Debugln(urls)

		if input.ListURL {
			listURL(plugType, urls)
			break
		}

		if len(urls) == 0 {
			log.Warnln("Empty URL from dorker, Engine may have ban you.")
		}

		// TODO: Downloader should just download assets.
		ctx.getData(plugType, urls, false, false)
	}
}

// StartFolder is the Goca library entrypoint for folders
func StartFolder(input Input) {
	if !validFolder(input.Folder) {
		log.Fatalf("The folder %s is not valid\n", input.Folder)
	}
	var files []string
	for _, plugType := range input.FileType {
		files = []string{}
		// Initialize context or controller per each type
		ctx := NewController(input)

		// Initialize all plugins based on context
		executePlugins(plugType, ctx)

		err := filepath.Walk(input.Folder,
			func(path string, info os.FileInfo, err error) error {
				if err != nil {
					return err
				}
				if !info.IsDir() {
					files = append(files, path)
				}
				return nil
			})
		if err != nil {
			log.Errorln(err)
		}
		if err != nil {
			log.Errorln(err)
		}

		ctx.getData(plugType, files, true, false)
	}
}

// StartScrapper is the Goca library entrypoint for the web scrapper
// TODO: v0.3.0 (core rewrite) This should been placed on other file/location
func StartScrapper(input Input) {
	// FIXME: This should be passed with the input config and set with a flag
	var depth = 3

	for _, plugType := range input.FileType {
		// Initialize context or controller per each type
		ctx := NewController(input)

		// Initialize all plugins based on context
		executePlugins(plugType, ctx)

		scrapper := dorker.NewScrapper(input.Scrapper, depth)
		if err := scrapper.Run(); err != nil {
			log.Fatal(err)
		}

		urls := scrapper.Links()

		log.Debugf("Got %d url\n", len(urls))
		log.Debugln(urls)

		if len(urls) <= 0 {
			log.Infof("No file URLs available on %s with depth %d", input.Scrapper, depth)
			break
		}

		if input.ListURL {
			listURL(plugType, urls)
			break
		}

		if len(urls) == 0 {
			log.Warnln("Empty URL from dorker, Engine may have ban you.")
		}

		// TODO: Downloader should just download assets.
		ctx.getData(plugType, urls, false, false)
	}
}

func executePlugins(typ string, ctx *Controller) {
	if typ == "*" {
		for _, plugs := range plugins {
			for name, plug := range plugs {
				log.Debugf("Executing plugin %s", name)
				go plug.Action(ctx)
			}
		}
	} else {
		for name, plug := range plugins[typ] {
			log.Debugf("Executing plugin %s", name)
			go plug.Action(ctx)
		}
	}
}

func getDorkers(typ string, input Input) *dorker.Dorker {
	var dorkers []dorker.Dork
	var types []string
	d := dorker.NewDorker(input.UA, input.TimeOut, input.PagesDork)

	if typ == "*" {
		types = listPluginTypes()
	} else {
		types = []string{typ}
	}

	for _, t := range types {
		for _, mime := range mimeAssociation.getAssoc(t) {
			dorkers = dorker.DorkLib.GetByType(mime)
			if dorkers != nil {
				for _, dork := range dorkers {
					dork.UpdateString(input.URL, input.Term)
					d.AddDork(dork)
				}
			}
		}
	}
	return d
}

func validFolder(folder string) bool {
	_, err := os.Stat(folder)
	return !os.IsNotExist(err)
}

func listURL(plugType string, urls []string) {
	fmt.Printf("URLs for: %s\n", plugType)
	for _, url := range urls {
		fmt.Printf("\t- %s\n", url)
	}
}

// Input represents the command line arguments
type Input struct {
	Term      string
	Domain    string
	URL       string
	ListURL   bool
	Folder    string
	FileType  []string
	PagesDork int
	TimeOut   int
	UA        string
	Scrapper  string
}


================================================
FILE: gocaTesting/testData/gpx/gpx_1.gpx
================================================
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="DDAAXX TCX Extractor and Converter" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
  <trk>
    <name>2009-08-16</name>
    <trkseg>
      <trkpt lat="46.290405" lon="10.514108">
        <ele>1520.943115</ele>
        <time>2009-08-16T06:44:30Z</time>
      </trkpt>
      <trkpt lat="46.290405" lon="10.514115">
        <ele>1520.943115</ele>
        <time>2009-08-16T06:44:31Z</time>
      </trkpt>
      <trkpt lat="46.290417" lon="10.514122">
        <ele>1520.943115</ele>
        <time>2009-08-16T06:44:36Z</time>
      </trkpt>
      <trkpt lat="46.290430" lon="10.514106">
        <ele>1521.904297</ele>
        <time>2009-08-16T06:44:41Z</time>
      </trkpt>
      <trkpt lat="46.290454" lon="10.514031">
        <ele>1522.865723</ele>
        <time>2009-08-16T06:44:47Z</time>
      </trkpt>
      <trkpt lat="46.290477" lon="10.514042">
        <ele>1522.865723</ele>
        <time>2009-08-16T06:44:53Z</time>
      </trkpt>
      <trkpt lat="46.290495" lon="10.514058">
        <ele>1523.346436</ele>
        <time>2009-08-16T06:45:13Z</time>
      </trkpt>
      <trkpt lat="46.290522" lon="10.514195">
        <ele>1523.346436</ele>
        <time>2009-08-16T06:45:18Z</time>
      </trkpt>
      <trkpt lat="46.290541" lon="10.514296">
        <ele>1522.865723</ele>
        <time>2009-08-16T06:45:20Z</time>
      </trkpt>
      <trkpt lat="46.290563" lon="10.514384">
        <ele>1522.865723</ele>
        <time>2009-08-16T06:45:22Z</time>
      </trkpt>
      <trkpt lat="46.290519" lon="10.514603">
        <ele>1526.230225</ele>
        <time>2009-08-16T06:45:30Z</time>
      </trkpt>
      <trkpt lat="46.290479" lon="10.514800">
        <ele>1529.114014</ele>
        <time>2009-08-16T06:45:37Z</time>
      </trkpt>
      <trkpt lat="46.290387" lon="10.514970">
        <ele>1529.114014</ele>
        <time>2009-08-16T06:45:43Z</time>
      </trkpt>
      <trkpt lat="46.290299" lon="10.515184">
        <ele>1532.479004</ele>
        <time>2009-08-16T06:45:51Z</time>
      </trkpt>
      <trkpt lat="46.290245" lon="10.515324">
        <ele>1535.843506</ele>
        <time>2009-08-16T06:45:57Z</time>
      </trkpt>
      <trkpt lat="46.290155" lon="10.515490">
        <ele>1535.843506</ele>
        <time>2009-08-16T06:46:04Z</time>
      </trkpt>
      <trkpt lat="46.290058" lon="10.515656">
        <ele>1533.920898</ele>
        <time>2009-08-16T06:46:11Z</time>
      </trkpt>
      <trkpt lat="46.289999" lon="10.515778">
        <ele>1534.882324</ele>
        <time>2009-08-16T06:46:17Z</time>
      </trkpt>
      <trkpt lat="46.289945" lon="10.515895">
        <ele>1537.766113</ele>
        <time>2009-08-16T06:46:23Z</time>
      </trkpt>
      <trkpt lat="46.289865" lon="10.516032">
        <ele>1540.649902</ele>
        <time>2009-08-16T06:46:30Z</time>
      </trkpt>
      <trkpt lat="46.289776" lon="10.516239">
        <ele>1544.495117</ele>
        <time>2009-08-16T06:46:40Z</time>
      </trkpt>
      <trkpt lat="46.289719" lon="10.516376">
        <ele>1545.937256</ele>
        <time>2009-08-16T06:46:47Z</time>
      </trkpt>
      <trkpt lat="46.289667" lon="10.516549">
        <ele>1544.975830</ele>
        <time>2009-08-16T06:46:54Z</time>
      </trkpt>
      <trkpt lat="46.289632" lon="10.516793">
        <ele>1544.014648</ele>
        <time>2009-08-16T06:47:03Z</time>
      </trkpt>
      <trkpt lat="46.289630" lon="10.517047">
        <ele>1544.495117</ele>
        <time>2009-08-16T06:47:12Z</time>
      </trkpt>
      <trkpt lat="46.289615" lon="10.517245">
        <ele>1544.975830</ele>
        <time>2009-08-16T06:47:19Z</time>
      </trkpt>
      <trkpt lat="46.289558" lon="10.517492">
        <ele>1545.937256</ele>
        <time>2009-08-16T06:47:28Z</time>
      </trkpt>
      <trkpt lat="46.289538" lon="10.517696">
        <ele>1551.224609</ele>
        <time>2009-08-16T06:47:36Z</time>
      </trkpt>
      <trkpt lat="46.289460" lon="10.517862">
        <ele>1551.224609</ele>
        <time>2009-08-16T06:47:43Z</time>
      </trkpt>
      <trkpt lat="46.289382" lon="10.517996">
        <ele>1548.821289</ele>
        <time>2009-08-16T06:47:49Z</time>
      </trkpt>
      <trkpt lat="46.289265" lon="10.518126">
        <ele>1546.417969</ele>
        <time>2009-08-16T06:47:56Z</time>
      </trkpt>
      <trkpt lat="46.289175" lon="10.518280">
        <ele>1549.302002</ele>
        <time>2009-08-16T06:48:04Z</time>
      </trkpt>
      <trkpt lat="46.289145" lon="10.518364">
        <ele>1551.224609</ele>
        <time>2009-08-16T06:48:09Z</time>
      </trkpt>
      <trkpt lat="46.289091" lon="10.518551">
        <ele>1554.108643</ele>
        <time>2009-08-16T06:48:16Z</time>
      </trkpt>
      <trkpt lat="46.288999" lon="10.518664">
        <ele>1554.589111</ele>
        <time>2009-08-16T06:48:21Z</time>
      </trkpt>
      <trkpt lat="46.288953" lon="10.518889">
        <ele>1555.550537</ele>
        <time>2009-08-16T06:48:27Z</time>
      </trkpt>
      <trkpt lat="46.288933" lon="10.519239">
        <ele>1554.589111</ele>
        <time>2009-08-16T06:48:35Z</time>
      </trkpt>
      <trkpt lat="46.288950" lon="10.519527">
        <ele>1554.108643</ele>
        <time>2009-08-16T06:48:42Z</time>
      </trkpt>
      <trkpt lat="46.288968" lon="10.519846">
        <ele>1555.069824</ele>
        <time>2009-08-16T06:48:51Z</time>
      </trkpt>
      <trkpt lat="46.288996" lon="10.520117">
        <ele>1557.473145</ele>
        <time>2009-08-16T06:49:00Z</time>
      </trkpt>
      <trkpt lat="46.289022" lon="10.520304">
        <ele>1561.799072</ele>
        <time>2009-08-16T06:49:07Z</time>
      </trkpt>
      <trkpt lat="46.288985" lon="10.520367">
        <ele>1563.721436</ele>
        <time>2009-08-16T06:49:10Z</time>
      </trkpt>
      <trkpt lat="46.289044" lon="10.520577">
        <ele>1565.163818</ele>
        <time>2009-08-16T06:49:18Z</time>
      </trkpt>
      <trkpt lat="46.289050" lon="10.520598">
        <ele>1565.163818</ele>
        <time>2009-08-16T06:49:19Z</time>
      </trkpt>
      <trkpt lat="46.289025" lon="10.520774">
        <ele>1570.931641</ele>
        <time>2009-08-16T06:49:26Z</time>
      </trkpt>
      <trkpt lat="46.289027" lon="10.520915">
        <ele>1576.218750</ele>
        <time>2009-08-16T06:49:31Z</time>
      </trkpt>
      <trkpt lat="46.289029" lon="10.520940">
        <ele>1577.660645</ele>
        <time>2009-08-16T06:49:33Z</time>
      </trkpt>
      <trkpt lat="46.289012" lon="10.521025">
        <ele>1581.986816</ele>
        <time>2009-08-16T06:49:39Z</time>
      </trkpt>
      <trkpt lat="46.288915" lon="10.521119">
        <ele>1583.428711</ele>
        <time>2009-08-16T06:49:43Z</time>
      </trkpt>
      <trkpt lat="46.288665" lon="10.521256">
        <ele>1575.738037</ele>
        <time>2009-08-16T06:49:48Z</time>
      </trkpt>
      <trkpt lat="46.288444" lon="10.521395">
        <ele>1569.970215</ele>
        <time>2009-08-16T06:49:54Z</time>
      </trkpt>
      <trkpt lat="46.288315" lon="10.521429">
        <ele>1568.047607</ele>
        <time>2009-08-16T06:49:59Z</time>
      </trkpt>
      <trkpt lat="46.288187" lon="10.521518">
        <ele>1565.644531</ele>
        <time>2009-08-16T06:50:03Z</time>
      </trkpt>
      <trkpt lat="46.288092" lon="10.521571">
        <ele>1568.528320</ele>
        <time>2009-08-16T06:50:07Z</time>
      </trkpt>
      <trkpt lat="46.287951" lon="10.521663">
        <ele>1565.163818</ele>
        <time>2009-08-16T06:50:13Z</time>
      </trkpt>
      <trkpt lat="46.287783" lon="10.521731">
        <ele>1559.876221</ele>
        <time>2009-08-16T06:50:17Z</time>
      </trkpt>
      <trkpt lat="46.287705" lon="10.521909">
        <ele>1561.799072</ele>
        <time>2009-08-16T06:50:22Z</time>
      </trkpt>
      <trkpt lat="46.287706" lon="10.521938">
        <ele>1563.240967</ele>
        <time>2009-08-16T06:50:23Z</time>
      </trkpt>
      <trkpt lat="46.287730" lon="10.522027">
        <ele>1567.086426</ele>
        <time>2009-08-16T06:50:26Z</time>
      </trkpt>
      <trkpt lat="46.287669" lon="10.522207">
        <ele>1566.605713</ele>
        <time>2009-08-16T06:50:33Z</time>
      </trkpt>
      <trkpt lat="46.287634" lon="10.522417">
        <ele>1566.605713</ele>
        <time>2009-08-16T06:50:39Z</time>
      </trkpt>
      <trkpt lat="46.287591" lon="10.522588">
        <ele>1569.009033</ele>
        <time>2009-08-16T06:50:45Z</time>
      </trkpt>
      <trkpt lat="46.287482" lon="10.522790">
        <ele>1569.970215</ele>
        <time>2009-08-16T06:50:51Z</time>
      </trkpt>
      <trkpt lat="46.287449" lon="10.522842">
        <ele>1569.009033</ele>
        <time>2009-08-16T06:50:52Z</time>
      </trkpt>
      <trkpt lat="46.287377" lon="10.523099">
        <ele>1568.047607</ele>
        <time>2009-08-16T06:50:56Z</time>
      </trkpt>
      <trkpt lat="46.287369" lon="10.523347">
        <ele>1568.528320</ele>
        <time>2009-08-16T06:51:01Z</time>
      </trkpt>
      <trkpt lat="46.287371" lon="10.523583">
        <ele>1570.931641</ele>
        <time>2009-08-16T06:51:08Z</time>
      </trkpt>
      <trkpt lat="46.287366" lon="10.523810">
        <ele>1571.892822</ele>
        <time>2009-08-16T06:51:14Z</time>
      </trkpt>
      <trkpt lat="46.287379" lon="10.524032">
        <ele>1571.892822</ele>
        <time>2009-08-16T06:51:20Z</time>
      </trkpt>
      <trkpt lat="46.287426" lon="10.524244">
        <ele>1572.854248</ele>
        <time>2009-08-16T06:51:27Z</time>
      </trkpt>
      <trkpt lat="46.287453" lon="10.524411">
        <ele>1575.257324</ele>
        <time>2009-08-16T06:51:34Z</time>
      </trkpt>
      <trkpt lat="46.287522" lon="10.524590">
        <ele>1576.218750</ele>
        <time>2009-08-16T06:51:42Z</time>
      </trkpt>
      <trkpt lat="46.287527" lon="10.524600">
        <ele>1576.218750</ele>
        <time>2009-08-16T06:51:43Z</time>
      </trkpt>
      <trkpt lat="46.287564" lon="10.524727">
        <ele>1581.986816</ele>
        <time>2009-08-16T06:51:51Z</time>
      </trkpt>
      <trkpt lat="46.287607" lon="10.524755">
        <ele>1585.832031</ele>
        <time>2009-08-16T06:51:57Z</time>
      </trkpt>
      <trkpt lat="46.287697" lon="10.524770">
        <ele>1590.638428</ele>
        <time>2009-08-16T06:52:03Z</time>
      </trkpt>
      <trkpt lat="46.287787" lon="10.524904">
        <ele>1593.041748</ele>
        <time>2009-08-16T06:52:11Z</time>
      </trkpt>
      <trkpt lat="46.287821" lon="10.524956">
        <ele>1594.003174</ele>
        <time>2009-08-16T06:52:15Z</time>
      </trkpt>
      <trkpt lat="46.287858" lon="10.525089">
        <ele>1594.483643</ele>
        <time>2009-08-16T06:52:24Z</time>
      </trkpt>
      <trkpt lat="46.287898" lon="10.525206">
        <ele>1591.599854</ele>
        <time>2009-08-16T06:52:31Z</time>
      </trkpt>
      <trkpt lat="46.287965" lon="10.525392">
        <ele>1591.599854</ele>
        <time>2009-08-16T06:52:39Z</time>
      </trkpt>
      <trkpt lat="46.288063" lon="10.525644">
        <ele>1594.964355</ele>
        <time>2009-08-16T06:52:50Z</time>
      </trkpt>
      <trkpt lat="46.288108" lon="10.525773">
        <ele>1597.848633</ele>
        <time>2009-08-16T06:52:57Z</time>
      </trkpt>
      <trkpt lat="46.288122" lon="10.525933">
        <ele>1605.058350</ele>
        <time>2009-08-16T06:53:05Z</time>
      </trkpt>
      <trkpt lat="46.288120" lon="10.526075">
        <ele>1608.903564</ele>
        <time>2009-08-16T06:53:13Z</time>
      </trkpt>
      <trkpt lat="46.288114" lon="10.526166">
        <ele>1613.229736</ele>
        <time>2009-08-16T06:53:17Z</time>
      </trkpt>
      <trkpt lat="46.288088" lon="10.526261">
        <ele>1610.826172</ele>
        <time>2009-08-16T06:53:21Z</time>
      </trkpt>
      <trkpt lat="46.288084" lon="10.526446">
        <ele>1612.268311</ele>
        <time>2009-08-16T06:53:30Z</time>
      </trkpt>
      <trkpt lat="46.288090" lon="10.526600">
        <ele>1608.903564</ele>
        <time>2009-08-16T06:53:38Z</time>
      </trkpt>
      <trkpt lat="46.288108" lon="10.526793">
        <ele>1606.019531</ele>
        <time>2009-08-16T06:53:47Z</time>
      </trkpt>
      <trkpt lat="46.288136" lon="10.526983">
        <ele>1604.577637</ele>
        <time>2009-08-16T06:53:56Z</time>
      </trkpt>
      <trkpt lat="46.288189" lon="10.527179">
        <ele>1602.655029</ele>
        <time>2009-08-16T06:54:04Z</time>
      </trkpt>
      <trkpt lat="46.288285" lon="10.527340">
        <ele>1601.693848</ele>
        <time>2009-08-16T06:54:12Z</time>
      </trkpt>
      <trkpt lat="46.288351" lon="10.527501">
        <ele>1600.732422</ele>
        <time>2009-08-16T06:54:19Z</time>
      </trkpt>
      <trkpt lat="46.288364" lon="10.527657">
        <ele>1599.771240</ele>
        <time>2009-08-16T06:54:24Z</time>
      </trkpt>
      <trkpt lat="46.288393" lon="10.527896">
        <ele>1599.290527</ele>
        <time>2009-08-16T06:54:31Z</time>
      </trkpt>
      <trkpt lat="46.288442" lon="10.528142">
        <ele>1600.251953</ele>
        <time>2009-08-16T06:54:39Z</time>
      </trkpt>
      <trkpt lat="46.288470" lon="10.528277">
        <ele>1600.732422</ele>
        <time>2009-08-16T06:54:45Z</time>
      </trkpt>
      <trkpt lat="46.288507" lon="10.528452">
        <ele>1600.251953</ele>
        <time>2009-08-16T06:54:52Z</time>
      </trkpt>
      <trkpt lat="46.288556" lon="10.528751">
        <ele>1599.290527</ele>
        <time>2009-08-16T06:54:59Z</time>
      </trkpt>
      <trkpt lat="46.288604" lon="10.529064">
        <ele>1598.809814</ele>
        <time>2009-08-16T06:55:06Z</time>
      </trkpt>
      <trkpt lat="46.288640" lon="10.529332">
        <ele>1598.329102</ele>
        <time>2009-08-16T06:55:13Z</time>
      </trkpt>
      <trkpt lat="46.288650" lon="10.529506">
        <ele>1598.809814</ele>
        <time>2009-08-16T06:55:20Z</time>
      </trkpt>
      <trkpt lat="46.288627" lon="10.529669">
        <ele>1599.290527</ele>
        <time>2009-08-16T06:55:26Z</time>
      </trkpt>
      <trkpt lat="46.288581" lon="10.529971">
        <ele>1597.367920</ele>
        <time>2009-08-16T06:55:31Z</time>
      </trkpt>
      <trkpt lat="46.288550" lon="10.530199">
        <ele>1596.887207</ele>
        <time>2009-08-16T06:55:34Z</time>
      </trkpt>
      <trkpt lat="46.288532" lon="10.530640">
        <ele>1596.406738</ele>
        <time>2009-08-16T06:55:41Z</time>
      </trkpt>
      <trkpt lat="46.288574" lon="10.530901">
        <ele>1594.003174</ele>
        <time>2009-08-16T06:55:48Z</time>
      </trkpt>
      <trkpt lat="46.288621" lon="10.531134">
        <ele>1594.483643</ele>
        <time>2009-08-16T06:55:54Z</time>
      </trkpt>
      <trkpt lat="46.288698" lon="10.531342">
        <ele>1594.483643</ele>
        <time>2009-08-16T06:56:02Z</time>
      </trkpt>
      <trkpt lat="46.288740" lon="10.531511">
        <ele>1594.483643</ele>
        <time>2009-08-16T06:56:09Z</time>
      </trkpt>
      <trkpt lat="46.288761" lon="10.531764">
        <ele>1596.406738</ele>
        <time>2009-08-16T06:56:17Z</time>
      </trkpt>
      <trkpt lat="46.288816" lon="10.531962">
        <ele>1596.406738</ele>
        <time>2009-08-16T06:56:25Z</time>
      </trkpt>
      <trkpt lat="46.288843" lon="10.532186">
        <ele>1596.887207</ele>
        <time>2009-08-16T06:56:33Z</time>
      </trkpt>
      <trkpt lat="46.288909" lon="10.532433">
        <ele>1595.445068</ele>
        <time>2009-08-16T06:56:42Z</time>
      </trkpt>
      <trkpt lat="46.288971" lon="10.532653">
        <ele>1595.445068</ele>
        <time>2009-08-16T06:56:49Z</time>
      </trkpt>
      <trkpt lat="46.289001" lon="10.532963">
        <ele>1598.329102</ele>
        <time>2009-08-16T06:56:58Z</time>
      </trkpt>
      <trkpt lat="46.289052" lon="10.533222">
        <ele>1600.251953</ele>
        <time>2009-08-16T06:57:07Z</time>
      </trkpt>
      <trkpt lat="46.289100" lon="10.533492">
        <ele>1601.213135</ele>
        <time>2009-08-16T06:57:16Z</time>
      </trkpt>
      <trkpt lat="46.289171" lon="10.533729">
        <ele>1603.135742</ele>
        <time>2009-08-16T06:57:25Z</time>
      </trkpt>
      <trkpt lat="46.289266" lon="10.533907">
        <ele>1605.058350</ele>
        <time>2009-08-16T06:57:34Z</time>
      </trkpt>
      <trkpt lat="46.289388" lon="10.534133">
        <ele>1606.019531</ele>
        <time>2009-08-16T06:57:45Z</time>
      </trkpt>
      <trkpt lat="46.289492" lon="10.534323">
        <ele>1608.903564</ele>
        <time>2009-08-16T06:57:55Z</time>
      </trkpt>
      <trkpt lat="46.289534" lon="10.534503">
        <ele>1611.306885</ele>
        <time>2009-08-16T06:58:03Z</time>
      </trkpt>
      <trkpt lat="46.289613" lon="10.534726">
        <ele>1610.345459</ele>
        <time>2009-08-16T06:58:12Z</time>
      </trkpt>
      <trkpt lat="46.289717" lon="10.534935">
        <ele>1610.345459</ele>
        <time>2009-08-16T06:58:22Z</time>
      </trkpt>
      <trkpt lat="46.289809" lon="10.535155">
        <ele>1611.306885</ele>
        <time>2009-08-16T06:58:32Z</time>
      </trkpt>
      <trkpt lat="46.289894" lon="10.535370">
        <ele>1611.787598</ele>
        <time>2009-08-16T06:58:41Z</time>
      </trkpt>
      <trkpt lat="46.289910" lon="10.535593">
        <ele>1613.710205</ele>
        <time>2009-08-16T06:58:50Z</time>
      </trkpt>
      <trkpt lat="46.289922" lon="10.535819">
        <ele>1616.113525</ele>
        <time>2009-08-16T06:58:59Z</time>
      </trkpt>
      <trkpt lat="46.289940" lon="10.536120">
        <ele>1618.516846</ele>
        <time>2009-08-16T06:59:10Z</time>
      </trkpt>
      <trkpt lat="46.289941" lon="10.536309">
        <ele>1619.478271</ele>
        <time>2009-08-16T06:59:17Z</time>
      </trkpt>
      <trkpt lat="46.289976" lon="10.536540">
        <ele>1619.958740</ele>
        <time>2009-08-16T06:59:25Z</time>
      </trkpt>
      <trkpt lat="46.290092" lon="10.536846">
        <ele>1621.400635</ele>
        <time>2009-08-16T06:59:37Z</time>
      </trkpt>
      <trkpt lat="46.290172" lon="10.537076">
        <ele>1622.362061</ele>
        <time>2009-08-16T06:59:46Z</time>
      </trkpt>
      <trkpt lat="46.290216" lon="10.537303">
        <ele>1622.842773</ele>
        <time>2009-08-16T06:59:54Z</time>
      </trkpt>
      <trkpt lat="46.290233" lon="10.537537">
        <ele>1623.323486</ele>
        <time>2009-08-16T07:00:02Z</time>
      </trkpt>
      <trkpt lat="46.290253" lon="10.537765">
        <ele>1621.881348</ele>
        <time>2009-08-16T07:00:09Z</time>
      </trkpt>
      <trkpt lat="46.290211" lon="10.537843">
        <ele>1622.362061</ele>
        <time>2009-08-16T07:00:13Z</time>
      </trkpt>
      <trkpt lat="46.290098" lon="10.537986">
        <ele>1624.765381</ele>
        <time>2009-08-16T07:00:20Z</time>
      </trkpt>
      <trkpt lat="46.289995" lon="10.538074">
        <ele>1626.207275</ele>
        <time>2009-08-16T07:00:25Z</time>
      </trkpt>
      <trkpt lat="46.289870" lon="10.537955">
        <ele>1626.207275</ele>
        <time>2009-08-16T07:00:31Z</time>
      </trkpt>
      <trkpt lat="46.289814" lon="10.537823">
        <ele>1628.130127</ele>
        <time>2009-08-16T07:00:37Z</time>
      </trkpt>
      <trkpt lat="46.289741" lon="10.537853">
        <ele>1638.223877</ele>
        <time>2009-08-16T07:00:42Z</time>
      </trkpt>
      <trkpt lat="46.289741" lon="10.537853">
        <ele>1639.665771</ele>
        <time>2009-08-16T07:00:44Z</time>
      </trkpt>
      <trkpt lat="46.289766" lon="10.537837">
        <ele>1643.510986</ele>
        <time>2009-08-16T07:00:50Z</time>
      </trkpt>
      <trkpt lat="46.289708" lon="10.537890">
        <ele>1646.395264</ele>
        <time>2009-08-16T07:00:58Z</time>
      </trkpt>
      <trkpt lat="46.289607" lon="10.537941">
        <ele>1648.798340</ele>
        <time>2009-08-16T07:01:06Z</time>
      </trkpt>
      <trkpt lat="46.289454" lon="10.537900">
        <ele>1645.433838</ele>
        <time>2009-08-16T07:01:12Z</time>
      </trkpt>
      <trkpt lat="46.289413" lon="10.537840">
        <ele>1643.030273</ele>
        <time>2009-08-16T07:01:16Z</time>
      </trkpt>
      <trkpt lat="46.289371" lon="10.537656">
        <ele>1640.626953</ele>
        <time>2009-08-16T07:01:26Z</time>
      </trkpt>
      <trkpt lat="46.289357" lon="10.537526">
        <ele>1643.510986</ele>
        <time>2009-08-16T07:01:33Z</time>
      </trkpt>
      <trkpt lat="46.289363" lon="10.537401">
        <ele>1650.240479</ele>
        <time>2009-08-16T07:01:41Z</time>
      </trkpt>
      <trkpt lat="46.289359" lon="10.537336">
        <ele>1656.488770</ele>
        <time>2009-08-16T07:01:49Z</time>
      </trkpt>
      <trkpt lat="46.289300" lon="10.537277">
        <ele>1663.698730</ele>
        <time>2009-08-16T07:02:00Z</time>
      </trkpt>
      <trkpt lat="46.289241" lon="10.537256">
        <ele>1664.660156</ele>
        <time>2009-08-16T07:02:05Z</time>
      </trkpt>
      <trkpt lat="46.289193" lon="10.537250">
        <ele>1664.179443</ele>
        <time>2009-08-16T07:02:09Z</time>
      </trkpt>
      <trkpt lat="46.289181" lon="10.537295">
        <ele>1663.698730</ele>
        <time>2009-08-16T07:02:12Z</time>
      </trkpt>
      <trkpt lat="46.289205" lon="10.537428">
        <ele>1661.776367</ele>
        <time>2009-08-16T07:02:21Z</time>
      </trkpt>
      <trkpt lat="46.289213" lon="10.537562">
        <ele>1661.295654</ele>
        <time>2009-08-16T07:02:28Z</time>
      </trkpt>
      <trkpt lat="46.289194" lon="10.537728">
        <ele>1661.295654</ele>
        <time>2009-08-16T07:02:36Z</time>
      </trkpt>
      <trkpt lat="46.289161" lon="10.537884">
        <ele>1661.776367</ele>
        <time>2009-08-16T07:02:44Z</time>
      </trkpt>
      <trkpt lat="46.289193" lon="10.538047">
        <ele>1666.102051</ele>
        <time>2009-08-16T07:02:53Z</time>
      </trkpt>
      <trkpt lat="46.289244" lon="10.538175">
        <ele>1668.986084</ele>
        <time>2009-08-16T07:03:01Z</time>
      </trkpt>
      <trkpt lat="46.289310" lon="10.538295">
        <ele>1672.831299</ele>
        <time>2009-08-16T07:03:09Z</time>
      </trkpt>
      <trkpt lat="46.289353" lon="10.538437">
        <ele>1673.312012</ele>
        <time>2009-08-16T07:03:17Z</time>
      </trkpt>
      <trkpt lat="46.289421" lon="10.538609">
        <ele>1673.792480</ele>
        <time>2009-08-16T07:03:27Z</time>
      </trkpt>
      <trkpt lat="46.289443" lon="10.538755">
        <ele>1670.908691</ele>
        <time>2009-08-16T07:03:35Z</time>
      </trkpt>
      <trkpt lat="46.289447" lon="10.538912">
        <ele>1665.621582</ele>
        <time>2009-08-16T07:03:44Z</time>
      </trkpt>
      <trkpt lat="46.289463" lon="10.539093">
        <ele>1662.256836</ele>
        <time>2009-08-16T07:03:54Z</time>
      </trkpt>
      <trkpt lat="46.289504" lon="10.539231">
        <ele>1664.179443</ele>
        <time>2009-08-16T07:04:03Z</time>
      </trkpt>
      <trkpt lat="46.289604" lon="10.539364">
        <ele>1668.986084</ele>
        <time>2009-08-16T07:04:11Z</time>
      </trkpt>
      <trkpt lat="46.289638" lon="10.539537">
        <ele>1668.505371</ele>
        <time>2009-08-16T07:04:19Z</time>
      </trkpt>
      <trkpt lat="46.289668" lon="10.539714">
        <ele>1666.582764</ele>
        <time>2009-08-16T07:04:27Z</time>
      </trkpt>
      <trkpt lat="46.289702" lon="10.539903">
        <ele>1663.218262</ele>
        <time>2009-08-16T07:04:36Z</time>
      </trkpt>
      <trkpt lat="46.289778" lon="10.540027">
        <ele>1664.660156</ele>
        <time>2009-08-16T07:04:43Z</time>
      </trkpt>
      <trkpt lat="46.289840" lon="10.540177">
        <ele>1664.179443</ele>
        <time>2009-08-16T07:04:51Z</time>
      </trkpt>
      <trkpt lat="46.289914" lon="10.540290">
        <ele>1666.582764</ele>
        <time>2009-08-16T07:04:58Z</time>
      </trkpt>
      <trkpt lat="46.289981" lon="10.540465">
        <ele>1666.102051</ele>
        <time>2009-08-16T07:05:07Z</time>
      </trkpt>
      <trkpt lat="46.290101" lon="10.540625">
        <ele>1672.831299</ele>
        <time>2009-08-16T07:05:16Z</time>
      </trkpt>
      <trkpt lat="46.290193" lon="10.540847">
        <ele>1675.234375</ele>
        <time>2009-08-16T07:05:28Z</time>
      </trkpt>
      <trkpt lat="46.290233" lon="10.540976">
        <ele>1675.234375</ele>
        <time>2009-08-16T07:05:35Z</time>
      </trkpt>
      <trkpt lat="46.290317" lon="10.541144">
        <ele>1675.715088</ele>
        <time>2009-08-16T07:05:44Z</time>
      </trkpt>
      <trkpt lat="46.290421" lon="10.541237">
        <ele>1679.079834</ele>
        <time>2009-08-16T07:05:51Z</time>
      </trkpt>
      <trkpt lat="46.290548" lon="10.541279">
        <ele>1684.367188</ele>
        <time>2009-08-16T07:05:57Z</time>
      </trkpt>
      <trkpt lat="46.290731" lon="10.541343">
        <ele>1690.615479</ele>
        <time>2009-08-16T07:06:06Z</time>
      </trkpt>
      <trkpt lat="46.290891" lon="10.541400">
        <ele>1693.980469</ele>
        <time>2009-08-16T07:06:15Z</time>
      </trkpt>
      <trkpt lat="46.291039" lon="10.541462">
        <ele>1695.422363</ele>
        <time>2009-08-16T07:06:25Z</time>
      </trkpt>
      <trkpt lat="46.291012" lon="10.541575">
        <ele>1686.770264</ele>
        <time>2009-08-16T07:06:32Z</time>
      </trkpt>
      <trkpt lat="46.291066" lon="10.541706">
        <ele>1685.809082</ele>
        <time>2009-08-16T07:06:40Z</time>
      </trkpt>
      <trkpt lat="46.291146" lon="10.541885">
        <ele>1686.770264</ele>
        <time>2009-08-16T07:06:49Z</time>
      </trkpt>
      <trkpt lat="46.291203" lon="10.542056">
        <ele>1688.212402</ele>
        <time>2009-08-16T07:06:57Z</time>
      </trkpt>
      <trkpt lat="46.291238" lon="10.542258">
        <ele>1690.135010</ele>
        <time>2009-08-16T07:07:06Z</time>
      </trkpt>
      <trkpt lat="46.291302" lon="10.542468">
        <ele>1692.057861</ele>
        <time>2009-08-16T07:07:16Z</time>
      </trkpt>
      <trkpt lat="46.291411" lon="10.542610">
        <ele>1693.499756</ele>
        <time>2009-08-16T07:07:25Z</time>
      </trkpt>
      <trkpt lat="46.291533" lon="10.542682">
        <ele>1694.460938</ele>
        <time>2009-08-16T07:07:33Z</time>
      </trkpt>
      <trkpt lat="46.291710" lon="10.542819">
        <ele>1696.383789</ele>
        <time>2009-08-16T07:07:45Z</time>
      </trkpt>
      <trkpt lat="46.291837" lon="10.542931">
        <ele>1697.825684</ele>
        <time>2009-08-16T07:07:54Z</time>
      </trkpt>
      <trkpt lat="46.291946" lon="10.543035">
        <ele>1699.267578</ele>
        <time>2009-08-16T07:08:02Z</time>
      </trkpt>
      <trkpt lat="46.292073" lon="10.543137">
        <ele>1700.709473</ele>
        <time>2009-08-16T07:08:11Z</time>
      </trkpt>
      <trkpt lat="46.292207" lon="10.543200">
        <ele>1702.151367</ele>
        <time>2009-08-16T07:08:20Z</time>
      </trkpt>
      <trkpt lat="46.292334" lon="10.543324">
        <ele>1703.112793</ele>
        <time>2009-08-16T07:08:29Z</time>
      </trkpt>
      <trkpt lat="46.292470" lon="10.543458">
        <ele>1704.074219</ele>
        <time>2009-08-16T07:08:37Z</time>
      </trkpt>
      <trkpt lat="46.292601" lon="10.543591">
        <ele>1705.516113</ele>
        <time>2009-08-16T07:08:46Z</time>
      </trkpt>
      <trkpt lat="46.292700" lon="10.543706">
        <ele>1706.958008</ele>
        <time>2009-08-16T07:08:54Z</time>
      </trkpt>
      <trkpt lat="46.292783" lon="10.543824">
        <ele>1708.880859</ele>
        <time>2009-08-16T07:09:02Z</time>
      </trkpt>
      <trkpt lat="46.292877" lon="10.543985">
        <ele>1710.803467</ele>
        <time>2009-08-16T07:09:11Z</time>
      </trkpt>
      <trkpt lat="46.292979" lon="10.544170">
        <ele>1712.245361</ele>
        <time>2009-08-16T07:09:21Z</time>
      </trkpt>
      <trkpt lat="46.293100" lon="10.544349">
        <ele>1714.167969</ele>
        <time>2009-08-16T07:09:31Z</time>
      </trkpt>
      <trkpt lat="46.293175" lon="10.544524">
        <ele>1715.610107</ele>
        <time>2009-08-16T07:09:39Z</time>
      </trkpt>
      <trkpt lat="46.293230" lon="10.544741">
        <ele>1717.532471</ele>
        <time>2009-08-16T07:09:49Z</time>
      </trkpt>
      <trkpt lat="46.293268" lon="10.545001">
        <ele>1719.455322</ele>
        <time>2009-08-16T07:10:00Z</time>
      </trkpt>
      <trkpt lat="46.293310" lon="10.545291">
        <ele>1721.858398</ele>
        <time>2009-08-16T07:10:10Z</time>
      </trkpt>
      <trkpt lat="46.293317" lon="10.545501">
        <ele>1723.781006</ele>
        <time>2009-08-16T07:10:17Z</time>
      </trkpt>
      <trkpt lat="46.293338" lon="10.545810">
        <ele>1724.742676</ele>
        <time>2009-08-16T07:10:28Z</time>
      </trkpt>
      <trkpt lat="46.293381" lon="10.545942">
        <ele>1725.223145</ele>
        <time>2009-08-16T07:10:34Z</time>
      </trkpt>
      <trkpt lat="46.293493" lon="10.546175">
        <ele>1726.665283</ele>
        <time>2009-08-16T07:10:44Z</time>
      </trkpt>
      <trkpt lat="46.293585" lon="10.546357">
        <ele>1728.587891</ele>
        <time>2009-08-16T07:10:53Z</time>
      </trkpt>
      <trkpt lat="46.293677" lon="10.546507">
        <ele>1729.068359</ele>
        <time>2009-08-16T07:11:02Z</time>
      </trkpt>
      <trkpt lat="46.293753" lon="10.546596">
        <ele>1730.029785</ele>
        <time>2009-08-16T07:11:08Z</time>
      </trkpt>
      <trkpt lat="46.293833" lon="10.546688">
        <ele>1730.029785</ele>
        <time>2009-08-16T07:11:15Z</time>
      </trkpt>
      <trkpt lat="46.293917" lon="10.546791">
        <ele>1730.029785</ele>
        <time>2009-08-16T07:11:22Z</time>
      </trkpt>
      <trkpt lat="46.294060" lon="10.546922">
        <ele>1731.952393</ele>
        <time>2009-08-16T07:11:31Z</time>
      </trkpt>
      <trkpt lat="46.294216" lon="10.547078">
        <ele>1731.471680</ele>
        <time>2009-08-16T07:11:42Z</time>
      </trkpt>
      <trkpt lat="46.294309" lon="10.547175">
        <ele>1731.471680</ele>
        <time>2009-08-16T07:11:49Z</time>
      </trkpt>
      <trkpt lat="46.294434" lon="10.547324">
        <ele>1732.913574</ele>
        <time>2009-08-16T07:11:59Z</time>
      </trkpt>
      <trkpt lat="46.294540" lon="10.547448">
        <ele>1734.355713</ele>
        <time>2009-08-16T07:12:08Z</time>
      </trkpt>
      <trkpt lat="46.294602" lon="10.547510">
        <ele>1735.797607</ele>
        <time>2009-08-16T07:12:14Z</time>
      </trkpt>
      <trkpt lat="46.294655" lon="10.547563">
        <ele>1738.200928</ele>
        <time>2009-08-16T07:12:20Z</time>
      </trkpt>
      <trkpt lat="46.294768" lon="10.547660">
        <ele>1739.162109</ele>
        <time>2009-08-16T07:12:28Z</time>
      </trkpt>
      <trkpt lat="46.294871" lon="10.547704">
        <ele>1739.642822</ele>
        <time>2009-08-16T07:12:35Z</time>
      </trkpt>
      <trkpt lat="46.295008" lon="10.547778">
        <ele>1740.604248</ele>
        <time>2009-08-16T07:12:44Z</time>
      </trkpt>
      <trkpt lat="46.295121" lon="10.547854">
        <ele>1741.084961</ele>
        <time>2009-08-16T07:12:52Z</time>
      </trkpt>
      <trkpt lat="46.295224" lon="10.547931">
        <ele>1741.565674</ele>
        <time>2009-08-16T07:12:59Z</time>
      </trkpt>
      <trkpt lat="46.295366" lon="10.548046">
        <ele>1742.527100</ele>
        <time>2009-08-16T07:13:09Z</time>
      </trkpt>
      <trkpt lat="46.295496" lon="10.548173">
        <ele>1743.488281</ele>
        <time>2009-08-16T07:13:19Z</time>
      </trkpt>
      <trkpt lat="46.295581" lon="10.548253">
        <ele>1745.891602</ele>
        <time>2009-08-16T07:13:27Z</time>
      </trkpt>
      <trkpt lat="46.295695" lon="10.548382">
        <ele>1747.333496</ele>
        <time>2009-08-16T07:13:36Z</time>
      </trkpt>
      <trkpt lat="46.295728" lon="10.548393">
        <ele>1749.256104</ele>
        <time>2009-08-16T07:13:42Z</time>
      </trkpt>
      <trkpt lat="46.295763" lon="10.548425">
        <ele>1750.697998</ele>
        <time>2009-08-16T07:13:47Z</time>
      </trkpt>
      <trkpt lat="46.295840" lon="10.548506">
        <ele>1751.178711</ele>
        <time>2009-08-16T07:13:54Z</time>
      </trkpt>
      <trkpt lat="46.295924" lon="10.548581">
        <ele>1752.620605</ele>
        <time>2009-08-16T07:14:02Z</time>
      </trkpt>
      <trkpt lat="46.295933" lon="10.548612">
        <ele>1754.062744</ele>
        <time>2009-08-16T07:14:07Z</time>
      </trkpt>
      <trkpt lat="46.295956" lon="10.548617">
        <ele>1744.449463</ele>
        <time>2009-08-16T07:15:12Z</time>
      </trkpt>
      <trkpt lat="46.296012" lon="10.548632">
        <ele>1746.372314</ele>
        <time>2009-08-16T07:15:16Z</time>
      </trkpt>
      <trkpt lat="46.296151" lon="10.548719">
        <ele>1749.736816</ele>
        <time>2009-08-16T07:15:26Z</time>
      </trkpt>
      <trkpt lat="46.296277" lon="10.548854">
        <ele>1752.139893</ele>
        <time>2009-08-16T07:15:35Z</time>
      </trkpt>
      <trkpt lat="46.296447" lon="10.549042">
        <ele>1753.101318</ele>
        <time>2009-08-16T07:15:43Z</time>
      </trkpt>
      <trkpt lat="46.296663" lon="10.549201">
        <ele>1754.062744</ele>
        <time>2009-08-16T07:15:52Z</time>
      </trkpt>
      <trkpt lat="46.296905" lon="10.549367">
        <ele>1755.023926</ele>
        <time>2009-08-16T07:16:02Z</time>
      </trkpt>
      <trkpt lat="46.297158" lon="10.549436">
        <ele>1755.985107</ele>
        <time>2009-08-16T07:16:12Z</time>
      </trkpt>
      <trkpt lat="46.297408" lon="10.549489">
        <ele>1756.946777</ele>
        <time>2009-08-16T07:16:23Z</time>
      </trkpt>
      <trkpt lat="46.297624" lon="10.549542">
        <ele>1759.830566</ele>
        <time>2009-08-16T07:16:33Z</time>
      </trkpt>
      <trkpt lat="46.297826" lon="10.549608">
        <ele>1762.233887</ele>
        <time>2009-08-16T07:16:42Z</time>
      </trkpt>
      <trkpt lat="46.297985" lon="10.549656">
        <ele>1763.195313</ele>
        <time>2009-08-16T07:16:49Z</time>
      </trkpt>
      <trkpt lat="46.298219" lon="10.549736">
        <ele>1763.195313</ele>
        <time>2009-08-16T07:16:59Z</time>
      </trkpt>
      <trkpt lat="46.298408" lon="10.549787">
        <ele>1763.195313</ele>
        <time>2009-08-16T07:17:08Z</time>
      </trkpt>
      <trkpt lat="46.298618" lon="10.549822">
        <ele>1762.714600</ele>
        <time>2009-08-16T07:17:18Z</time>
      </trkpt>
      <trkpt lat="46.298744" lon="10.549878">
        <ele>1763.195313</ele>
        <time>2009-08-16T07:17:26Z</time>
      </trkpt>
      <trkpt lat="46.298819" lon="10.550005">
        <ele>1764.637207</ele>
        <time>2009-08-16T07:17:33Z</time>
      </trkpt>
      <trkpt lat="46.298855" lon="10.550140">
        <ele>1772.808594</ele>
        <time>2009-08-16T07:17:40Z</time>
      </trkpt>
      <trkpt lat="46.298869" lon="10.550313">
        <ele>1774.250488</ele>
        <time>2009-08-16T07:17:47Z</time>
      </trkpt>
      <trkpt lat="46.298884" lon="10.550367">
        <ele>1774.731201</ele>
        <time>2009-08-16T07:17:52Z</time>
      </trkpt>
      <trkpt lat="46.298887" lon="10.550386">
        <ele>1781.460205</ele>
        <time>2009-08-16T07:18:19Z</time>
      </trkpt>
      <trkpt lat="46.298926" lon="10.550340">
        <ele>1781.460205</ele>
        <time>2009-08-16T07:18:36Z</time>
      </trkpt>
      <trkpt lat="46.298863" lon="10.550391">
        <ele>1766.079102</ele>
        <time>2009-08-16T07:30:42Z</time>
      </trkpt>
      <trkpt lat="46.298884" lon="10.550389">
        <ele>1766.559814</ele>
        <time>2009-08-16T07:30:44Z</time>
      </trkpt>
      <trkpt lat="46.298992" lon="10.550298">
        <ele>1767.520996</ele>
        <time>2009-08-16T07:30:50Z</time>
      </trkpt>
      <trkpt lat="46.299006" lon="10.550290">
        <ele>1768.001709</ele>
        <time>2009-08-16T07:30:51Z</time>
      </trkpt>
      <trkpt lat="46.299033" lon="10.550334">
        <ele>1768.963135</ele>
        <time>2009-08-16T07:30:55Z</time>
      </trkpt>
      <trkpt lat="46.299100" lon="10.550422">
        <ele>1772.327881</ele>
        <time>2009-08-16T07:31:03Z</time>
      </trkpt>
      <trkpt lat="46.299135" lon="10.550476">
        <ele>1773.769775</ele>
        <time>2009-08-16T07:31:08Z</time>
      </trkpt>
      <trkpt lat="46.299226" lon="10.550560">
        <ele>1776.173096</ele>
        <time>2009-08-16T07:31:17Z</time>
      </trkpt>
      <trkpt lat="46.299296" lon="10.550598">
        <ele>1776.653809</ele>
        <time>2009-08-16T07:31:23Z</time>
      </trkpt>
      <trkpt lat="46.299360" lon="10.550647">
        <ele>1777.134521</ele>
        <time>2009-08-16T07:31:28Z</time>
      </trkpt>
      <trkpt lat="46.299490" lon="10.550696">
        <ele>1777.134521</ele>
        <time>2009-08-16T07:31:37Z</time>
      </trkpt>
      <trkpt lat="46.299645" lon="10.550672">
        <ele>1782.902100</ele>
        <time>2009-08-16T07:31:46Z</time>
      </trkpt>
      <trkpt lat="46.299806" lon="10.550616">
        <ele>1790.112305</ele>
        <time>2009-08-16T07:31:56Z</time>
      </trkpt>
      <trkpt lat="46.299911" lon="10.550615">
        <ele>1788.670410</ele>
        <time>2009-08-16T07:32:04Z</time>
      </trkpt>
      <trkpt lat="46.300027" lon="10.550615">
        <ele>1789.150879</ele>
        <time>2009-08-16T07:32:12Z</time>
      </trkpt>
      <trkpt lat="46.300134" lon="10.550633">
        <ele>1786.266846</ele>
        <time>2009-08-16T07:32:20Z</time>
      </trkpt>
      <trkpt lat="46.300209" lon="10.550617">
        <ele>1786.747314</ele>
        <time>2009-08-16T07:32:25Z</time>
      </trkpt>
      <trkpt lat="46.300295" lon="10.550623">
        <ele>1785.786133</ele>
        <time>2009-08-16T07:32:31Z</time>
      </trkpt>
      <trkpt lat="46.300453" lon="10.550607">
        <ele>1788.670410</ele>
        <time>2009-08-16T07:32:41Z</time>
      </trkpt>
      <trkpt lat="46.300586" lon="10.550594">
        <ele>1790.592773</ele>
        <time>2009-08-16T07:32:50Z</time>
      </trkpt>
      <trkpt lat="46.300705" lon="10.550587">
        <ele>1792.515625</ele>
        <time>2009-08-16T07:32:58Z</time>
      </trkpt>
      <trkpt lat="46.300861" lon="10.550579">
        <ele>1793.476807</ele>
        <time>2009-08-16T07:33:09Z</time>
      </trkpt>
      <trkpt lat="46.300963" lon="10.550584">
        <ele>1793.476807</ele>
        <time>2009-08-16T07:33:17Z</time>
      </trkpt>
      <trkpt lat="46.301080" lon="10.550569">
        <ele>1795.399414</ele>
        <time>2009-08-16T07:33:25Z</time>
      </trkpt>
      <trkpt lat="46.301207" lon="10.550562">
        <ele>1795.399414</ele>
        <time>2009-08-16T07:33:35Z</time>
      </trkpt>
      <trkpt lat="46.301322" lon="10.550556">
        <ele>1794.437988</ele>
        <time>2009-08-16T07:33:44Z</time>
      </trkpt>
      <trkpt lat="46.301457" lon="10.550522">
        <ele>1801.167236</ele>
        <time>2009-08-16T07:33:53Z</time>
      </trkpt>
      <trkpt lat="46.301642" lon="10.550474">
        <ele>1807.896729</ele>
        <time>2009-08-16T07:34:06Z</time>
      </trkpt>
      <trkpt lat="46.301760" lon="10.550461">
        <ele>1809.819092</ele>
        <time>2009-08-16T07:34:15Z</time>
      </trkpt>
      <trkpt lat="46.301868" lon="10.550461">
        <ele>1807.416016</ele>
        <time>2009-08-16T07:34:24Z</time>
      </trkpt>
      <trkpt lat="46.301974" lon="10.550483">
        <ele>1806.935303</ele>
        <time>2009-08-16T07:34:32Z</time>
      </trkpt>
      <trkpt lat="46.302097" lon="10.550539">
        <ele>1807.896729</ele>
        <time>2009-08-16T07:34:41Z</time>
      </trkpt>
      <trkpt lat="46.302185" lon="10.550611">
        <ele>1809.819092</ele>
        <time>2009-08-16T07:34:49Z</time>
      </trkpt>
      <trkpt lat="46.302288" lon="10.550693">
        <ele>1811.261230</ele>
        <time>2009-08-16T07:34:58Z</time>
      </trkpt>
      <trkpt lat="46.302391" lon="10.550731">
        <ele>1812.222412</ele>
        <time>2009-08-16T07:35:06Z</time>
      </trkpt>
      <trkpt lat="46.302505" lon="10.550716">
        <ele>1813.664307</ele>
        <time>2009-08-16T07:35:14Z</time>
      </trkpt>
      <trkpt lat="46.302629" lon="10.550661">
        <ele>1818.470947</ele>
        <time>2009-08-16T07:35:23Z</time>
      </trkpt>
      <trkpt lat="46.302670" lon="10.550654">
        <ele>1819.432373</ele>
        <time>2009-08-16T07:35:26Z</time>
      </trkpt>
      <trkpt lat="46.302747" lon="10.550638">
        <ele>1818.470947</ele>
        <time>2009-08-16T07:35:32Z</time>
      </trkpt>
      <trkpt lat="46.302885" lon="10.550575">
        <ele>1819.912842</ele>
        <time>2009-08-16T07:35:42Z</time>
      </trkpt>
      <trkpt lat="46.302997" lon="10.550471">
        <ele>1823.277832</ele>
        <time>2009-08-16T07:35:51Z</time>
      </trkpt>
      <trkpt lat="46.303042" lon="10.550427">
        <ele>1822.797119</ele>
        <time>2009-08-16T07:35:55Z</time>
      </trkpt>
      <trkpt lat="46.303119" lon="10.550360">
        <ele>1823.277832</ele>
        <time>2009-08-16T07:36:02Z</time>
      </trkpt>
      <trkpt lat="46.303199" lon="10.550284">
        <ele>1823.277832</ele>
        <time>2009-08-16T07:36:10Z</time>
      </trkpt>
      <trkpt lat="46.303256" lon="10.550255">
        <ele>1823.277832</ele>
        <time>2009-08-16T07:36:15Z</time>
      </trkpt>
      <trkpt lat="46.303328" lon="10.550258">
        <ele>1826.161621</ele>
        <time>2009-08-16T07:36:20Z</time>
      </trkpt>
      <trkpt lat="46.303357" lon="10.550401">
        <ele>1827.603516</ele>
        <time>2009-08-16T07:36:28Z</time>
      </trkpt>
      <trkpt lat="46.303300" lon="10.550606">
        <ele>1827.603516</ele>
        <time>2009-08-16T07:36:38Z</time>
      </trkpt>
      <trkpt lat="46.303205" lon="10.550808">
        <ele>1826.161621</ele>
        <time>2009-08-16T07:36:48Z</time>
      </trkpt>
      <trkpt lat="46.303105" lon="10.551004">
        <ele>1826.161621</ele>
        <time>2009-08-16T07:36:57Z</time>
      </trkpt>
      <trkpt lat="46.303021" lon="10.551172">
        <ele>1824.719727</ele>
        <time>2009-08-16T07:37:05Z</time>
      </trkpt>
      <trkpt lat="46.302928" lon="10.551360">
        <ele>1825.680908</ele>
        <time>2009-08-16T07:37:14Z</time>
      </trkpt>
      <trkpt lat="46.302898" lon="10.551435">
        <ele>1824.239014</ele>
        <time>2009-08-16T07:37:18Z</time>
      </trkpt>
      <trkpt lat="46.302833" lon="10.551566">
        <ele>1823.758301</ele>
        <time>2009-08-16T07:37:25Z</time>
      </trkpt>
      <trkpt lat="46.302742" lon="10.551760">
        <ele>1826.161621</ele>
        <time>2009-08-16T07:37:34Z</time>
      </trkpt>
      <trkpt lat="46.302654" lon="10.551974">
        <ele>1829.526123</ele>
        <time>2009-08-16T07:37:44Z</time>
      </trkpt>
      <trkpt lat="46.302572" lon="10.552153">
        <ele>1828.564941</ele>
        <time>2009-08-16T07:37:53Z</time>
      </trkpt>
      <trkpt lat="46.302492" lon="10.552323">
        <ele>1830.006836</ele>
        <time>2009-08-16T07:38:02Z</time>
      </trkpt>
      <trkpt lat="46.302419" lon="10.552560">
        <ele>1831.448730</ele>
        <time>2009-08-16T07:38:11Z</time>
      </trkpt>
      <trkpt lat="46.302330" lon="10.552662">
        <ele>1830.487549</ele>
        <time>2009-08-16T07:38:16Z</time>
      </trkpt>
      <trkpt lat="46.302116" lon="10.552750">
        <ele>1829.045410</ele>
        <time>2009-08-16T07:38:26Z</time>
      </trkpt>
      <trkpt lat="46.301943" lon="10.552824">
        <ele>1828.564941</ele>
        <time>2009-08-16T07:38:34Z</time>
      </trkpt>
      <trkpt lat="46.301735" lon="10.552941">
        <ele>1829.526123</ele>
        <time>2009-08-16T07:38:44Z</time>
      </trkpt>
      <trkpt lat="46.301562" lon="10.552981">
        <ele>1831.448730</ele>
        <time>2009-08-16T07:38:53Z</time>
      </trkpt>
      <trkpt lat="46.301403" lon="10.552999">
        <ele>1833.852051</ele>
        <time>2009-08-16T07:39:02Z</time>
      </trkpt>
      <trkpt lat="46.301255" lon="10.553064">
        <ele>1835.774658</ele>
        <time>2009-08-16T07:39:11Z</time>
      </trkpt>
      <trkpt lat="46.301110" lon="10.553208">
        <ele>1837.216797</ele>
        <time>2009-08-16T07:39:21Z</time>
      </trkpt>
      <trkpt lat="46.300992" lon="10.553297">
        <ele>1838.658936</ele>
        <time>2009-08-16T07:39:29Z</time>
      </trkpt>
      <trkpt lat="46.300867" lon="10.553348">
        <ele>1840.100830</ele>
        <time>2009-08-16T07:39:37Z</time>
      </trkpt>
      <trkpt lat="46.300761" lon="10.553372">
        <ele>1841.062012</ele>
        <time>2009-08-16T07:39:44Z</time>
      </trkpt>
      <trkpt lat="46.300718" lon="10.553428">
        <ele>1841.542725</ele>
        <time>2009-08-16T07:39:49Z</time>
      </trkpt>
      <trkpt lat="46.300779" lon="10.553491">
        <ele>1842.504150</ele>
        <time>2009-08-16T07:39:55Z</time>
      </trkpt>
      <trkpt lat="46.300919" lon="10.553452">
        <ele>1847.791260</ele>
        <time>2009-08-16T07:40:03Z</time>
      </trkpt>
      <trkpt lat="46.301030" lon="10.553439">
        <ele>1849.713867</ele>
        <time>2009-08-16T07:40:09Z</time>
      </trkpt>
      <trkpt lat="46.301137" lon="10.553416">
        <ele>1853.078613</ele>
        <time>2009-08-16T07:40:15Z</time>
      </trkpt>
      <trkpt lat="46.301259" lon="10.553375">
        <ele>1853.078613</ele>
        <time>2009-08-16T07:40:23Z</time>
      </trkpt>
      <trkpt lat="46.301442" lon="10.553350">
        <ele>1853.078613</ele>
        <time>2009-08-16T07:40:34Z</time>
      </trkpt>
      <trkpt lat="46.301628" lon="10.553394">
        <ele>1852.597900</ele>
        <time>2009-08-16T07:40:45Z</time>
      </trkpt>
      <trkpt lat="46.301741" lon="10.553375">
        <ele>1853.559326</ele>
        <time>2009-08-16T07:40:52Z</time>
      </trkpt>
      <trkpt lat="46.301889" lon="10.553327">
        <ele>1855.481934</ele>
        <time>2009-08-16T07:41:01Z</time>
      </trkpt>
      <trkpt lat="46.302020" lon="10.553281">
        <ele>1857.885254</ele>
        <time>2009-08-16T07:41:09Z</time>
      </trkpt>
      <trkpt lat="46.302145" lon="10.553253">
        <ele>1858.365723</ele>
        <time>2009-08-16T07:41:17Z</time>
      </trkpt>
      <trkpt lat="46.302291" lon="10.553202">
        <ele>1861.249756</ele>
        <time>2009-08-16T07:41:26Z</time>
      </trkpt>
      <trkpt lat="46.302460" lon="10.553172">
        <ele>1864.133545</ele>
        <time>2009-08-16T07:41:37Z</time>
      </trkpt>
      <trkpt lat="46.302596" lon="10.553191">
        <ele>1865.575684</ele>
        <time>2009-08-16T07:41:46Z</time>
      </trkpt>
      <trkpt lat="46.302730" lon="10.553178">
        <ele>1866.536865</ele>
        <time>2009-08-16T07:41:55Z</time>
      </trkpt>
      <trkpt lat="46.302851" lon="10.553171">
        <ele>1867.498047</ele>
        <time>2009-08-16T07:42:03Z</time>
      </trkpt>
      <trkpt lat="46.302964" lon="10.553133">
        <ele>1868.940430</ele>
        <time>2009-08-16T07:42:11Z</time>
      </trkpt>
      <trkpt lat="46.303098" lon="10.553081">
        <ele>1871.824219</ele>
        <time>2009-08-16T07:42:20Z</time>
      </trkpt>
      <trkpt lat="46.303244" lon="10.553025">
        <ele>1873.746826</ele>
        <time>2009-08-16T07:42:30Z</time>
      </trkpt>
      <trkpt lat="46.303367" lon="10.552982">
        <ele>1873.746826</ele>
        <time>2009-08-16T07:42:39Z</time>
      </trkpt>
      <trkpt lat="46.303489" lon="10.552890">
        <ele>1876.630859</ele>
        <time>2009-08-16T07:42:48Z</time>
      </trkpt>
      <trkpt lat="46.303614" lon="10.552774">
        <ele>1878.553467</ele>
        <time>2009-08-16T07:42:58Z</time>
      </trkpt>
      <trkpt lat="46.303738" lon="10.552682">
        <ele>1879.995361</ele>
        <time>2009-08-16T07:43:07Z</time>
      </trkpt>
      <trkpt lat="46.303853" lon="10.552636">
        <ele>1883.359863</ele>
        <time>2009-08-16T07:43:15Z</time>
      </trkpt>
      <trkpt lat="46.303937" lon="10.552593">
        <ele>1882.879150</ele>
        <time>2009-08-16T07:43:22Z</time>
      </trkpt>
      <trkpt lat="46.304028" lon="10.552536">
        <ele>1883.359863</ele>
        <time>2009-08-16T07:43:29Z</time>
      </trkpt>
      <trkpt lat="46.304137" lon="10.552420">
        <ele>1885.763428</ele>
        <time>2009-08-16T07:43:38Z</time>
      </trkpt>
      <trkpt lat="46.304223" lon="10.552326">
        <ele>1887.205322</ele>
        <time>2009-08-16T07:43:46Z</time>
      </trkpt>
      <trkpt lat="46.304341" lon="10.552204">
        <ele>1887.686035</ele>
        <time>2009-08-16T07:43:56Z</time>
      </trkpt>
      <trkpt lat="46.304475" lon="10.552065">
        <ele>1888.166748</ele>
        <time>2009-08-16T07:44:07Z</time>
      </trkpt>
      <trkpt lat="46.304572" lon="10.551949">
        <ele>1889.127930</ele>
        <time>2009-08-16T07:44:15Z</time>
      </trkpt>
      <trkpt lat="46.304656" lon="10.551777">
        <ele>1890.569824</ele>
        <time>2009-08-16T07:44:24Z</time>
      </trkpt>
      <trkpt lat="46.304688" lon="10.551634">
        <ele>1888.647461</ele>
        <time>2009-08-16T07:44:32Z</time>
      </trkpt>
      <trkpt lat="46.304700" lon="10.551530">
        <ele>1888.647461</ele>
        <time>2009-08-16T07:44:37Z</time>
      </trkpt>
      <trkpt lat="46.304715" lon="10.551430">
        <ele>1886.244141</ele>
        <time>2009-08-16T07:44:42Z</time>
      </trkpt>
      <trkpt lat="46.304772" lon="10.551284">
        <ele>1893.453857</ele>
        <time>2009-08-16T07:44:50Z</time>
      </trkpt>
      <trkpt lat="46.304868" lon="10.551198">
        <ele>1896.818359</ele>
        <time>2009-08-16T07:44:57Z</time>
      </trkpt>
      <trkpt lat="46.304967" lon="10.551261">
        <ele>1899.221680</ele>
        <time>2009-08-16T07:45:04Z</time>
      </trkpt>
      <trkpt lat="46.305016" lon="10.551379">
        <ele>1901.144531</ele>
        <time>2009-08-16T07:45:10Z</time>
      </trkpt>
      <trkpt lat="46.305047" lon="10.551597">
        <ele>1899.702393</ele>
        <time>2009-08-16T07:45:18Z</time>
      </trkpt>
      <trkpt lat="46.305044" lon="10.551835">
        <ele>1896.818359</ele>
        <time>2009-08-16T07:45:28Z</time>
      </trkpt>
      <trkpt lat="46.304956" lon="10.551970">
        <ele>1896.337891</ele>
        <time>2009-08-16T07:45:36Z</time>
      </trkpt>
      <trkpt lat="46.304911" lon="10.552035">
        <ele>1894.895752</ele>
        <time>2009-08-16T07:45:40Z</time>
      </trkpt>
      <trkpt lat="46.304812" lon="10.552206">
        <ele>1897.779785</ele>
        <time>2009-08-16T07:45:49Z</time>
      </trkpt>
      <trkpt lat="46.304728" lon="10.552359">
        <ele>1893.453857</ele>
        <time>2009-08-16T07:45:58Z</time>
      </trkpt>
      <trkpt lat="46.304608" lon="10.552496">
        <ele>1887.686035</ele>
        <time>2009-08-16T07:46:08Z</time>
      </trkpt>
      <trkpt lat="46.304522" lon="10.552658">
        <ele>1892.011963</ele>
        <time>2009-08-16T07:46:16Z</time>
      </trkpt>
      <trkpt lat="46.304465" lon="10.552779">
        <ele>1893.934570</ele>
        <time>2009-08-16T07:46:22Z</time>
      </trkpt>
      <trkpt lat="46.304372" lon="10.552898">
        <ele>1893.934570</ele>
        <time>2009-08-16T07:46:30Z</time>
      </trkpt>
      <trkpt lat="46.304231" lon="10.553036">
        <ele>1891.531250</ele>
        <time>2009-08-16T07:46:41Z</time>
      </trkpt>
      <trkpt lat="46.304160" lon="10.553190">
        <ele>1892.492676</ele>
        <time>2009-08-16T07:46:49Z</time>
      </trkpt>
      <trkpt lat="46.304110" lon="10.553340">
        <ele>1893.934570</ele>
        <time>2009-08-16T07:46:56Z</time>
      </trkpt>
      <trkpt lat="46.304041" lon="10.553446">
        <ele>1895.857178</ele>
        <time>2009-08-16T07:47:03Z</time>
      </trkpt>
      <trkpt lat="46.303925" lon="10.553507">
        <ele>1898.260254</ele>
        <time>2009-08-16T07:47:13Z</time>
      </trkpt>
      <trkpt lat="46.303820" lon="10.553536">
        <ele>1899.702393</ele>
        <time>2009-08-16T07:47:21Z</time>
      </trkpt>
      <trkpt lat="46.303696" lon="10.553593">
        <ele>1900.663818</ele>
        <time>2009-08-16T07:47:30Z</time>
      </trkpt>
      <trkpt lat="46.303600" lon="10.553662">
        <ele>1901.625244</ele>
        <time>2009-08-16T07:47:38Z</time>
      </trkpt>
      <trkpt lat="46.303522" lon="10.553763">
        <ele>1903.547852</ele>
        <time>2009-08-16T07:47:46Z</time>
      </trkpt>
      <trkpt lat="46.303434" lon="10.553885">
        <ele>1906.431641</ele>
        <time>2009-08-16T07:47:56Z</time>
      </trkpt>
      <trkpt lat="46.303381" lon="10.553954">
        <ele>1907.873779</ele>
        <time>2009-08-16T07:48:03Z</time>
      </trkpt>
      <trkpt lat="46.303327" lon="10.554022">
        <ele>1909.796143</ele>
        <time>2009-08-16T07:48:10Z</time>
      </trkpt>
      <trkpt lat="46.303280" lon="10.554094">
        <ele>1911.238281</ele>
        <time>2009-08-16T07:48:18Z</time>
      </trkpt>
      <trkpt lat="46.303219" lon="10.554180">
        <ele>1912.680176</ele>
        <time>2009-08-16T07:48:26Z</time>
      </trkpt>
      <trkpt lat="46.303166" lon="10.554261">
        <ele>1914.602783</ele>
        <time>2009-08-16T07:48:34Z</time>
      </trkpt>
      <trkpt lat="46.303148" lon="10.554291">
        <ele>1915.083496</ele>
        <time>2009-08-16T07:48:37Z</time>
      </trkpt>
      <trkpt lat="46.303085" lon="10.554354">
        <ele>1916.525635</ele>
        <time>2009-08-16T07:48:45Z</time>
      </trkpt>
      <trkpt lat="46.303016" lon="10.554390">
        <ele>1918.448242</ele>
        <time>2009-08-16T07:48:53Z</time>
      </trkpt>
      <trkpt lat="46.302942" lon="10.554457">
        <ele>1919.409668</ele>
        <time>2009-08-16T07:49:01Z</time>
      </trkpt>
      <trkpt lat="46.302865" lon="10.554527">
        <ele>1920.370850</ele>
        <time>2009-08-16T07:49:10Z</time>
      </trkpt>
      <trkpt lat="46.302840" lon="10.554543">
        <ele>1920.851563</ele>
        <time>2009-08-16T07:49:13Z</time>
      </trkpt>
      <trkpt lat="46.302773" lon="10.554562">
        <ele>1922.293457</ele>
        <time>2009-08-16T07:49:20Z</time>
      </trkpt>
      <trkpt lat="46.302695" lon="10.554590">
        <ele>1925.657959</ele>
        <time>2009-08-16T07:49:29Z</time>
      </trkpt>
      <trkpt lat="46.302635" lon="10.554645">
        <ele>1926.619385</ele>
        <time>2009-08-16T07:49:35Z</time>
      </trkpt>
      <trkpt lat="46.302584" lon="10.554710">
        <ele>1927.580566</ele>
        <time>2009-08-16T07:49:41Z</time>
      </trkpt>
      <trkpt lat="46.302527" lon="10.554799">
        <ele>1928.541992</ele>
        <time>2009-08-16T07:49:49Z</time>
      </trkpt>
      <trkpt lat="46.302483" lon="10.554881">
        <ele>1928.541992</ele>
        <time>2009-08-16T07:49:55Z</time>
      </trkpt>
      <trkpt lat="46.302439" lon="10.554959">
        <ele>1929.022461</ele>
        <time>2009-08-16T07:50:02Z</time>
      </trkpt>
      <trkpt lat="46.302415" lon="10.555001">
        <ele>1929.503174</ele>
        <time>2009-08-16T07:50:06Z</time>
      </trkpt>
      <trkpt lat="46.302322" lon="10.555123">
        <ele>1930.945313</ele>
        <time>2009-08-16T07:50:17Z</time>
      </trkpt>
      <trkpt lat="46.302273" lon="10.555165">
        <ele>1932.387451</ele>
        <time>2009-08-16T07:50:23Z</time>
      </trkpt>
      <trkpt lat="46.302193" lon="10.555238">
        <ele>1933.829346</ele>
        <time>2009-08-16T07:50:33Z</time>
      </trkpt>
      <trkpt lat="46.302126" lon="10.555288">
        <ele>1935.271240</ele>
        <time>2009-08-16T07:50:41Z</time>
      </trkpt>
      <trkpt lat="46.302064" lon="10.555341">
        <ele>1936.713135</ele>
        <time>2009-08-16T07:50:50Z</time>
      </trkpt>
      <trkpt lat="46.302025" lon="10.555352">
        <ele>1937.193848</ele>
        <time>2009-08-16T07:50:55Z</time>
      </trkpt>
      <trkpt lat="46.301975" lon="10.555362">
        <ele>1937.674561</ele>
        <time>2009-08-16T07:51:00Z</time>
      </trkpt>
      <trkpt lat="46.301853" lon="10.555421">
        <ele>1939.116455</ele>
        <time>2009-08-16T07:51:11Z</time>
      </trkpt>
      <trkpt lat="46.301794" lon="10.555459">
        <ele>1940.558350</ele>
        <time>2009-08-16T07:51:17Z</time>
      </trkpt>
      <trkpt lat="46.301796" lon="10.555501">
        <ele>1941.039063</ele>
        <time>2009-08-16T07:51:20Z</time>
      </trkpt>
      <trkpt lat="46.301857" lon="10.555497">
        <ele>1941.519775</ele>
        <time>2009-08-16T07:51:26Z</time>
      </trkpt>
      <trkpt lat="46.301948" lon="10.555467">
        <ele>1943.442383</ele>
        <time>2009-08-16T07:51:34Z</time>
      </trkpt>
      <trkpt lat="46.302027" lon="10.555462">
        <ele>1944.884277</ele>
        <time>2009-08-16T07:51:41Z</time>
      </trkpt>
      <trkpt lat="46.302131" lon="10.555490">
        <ele>1946.326416</ele>
        <time>2009-08-16T07:51:50Z</time>
      </trkpt>
      <trkpt lat="46.302246" lon="10.555504">
        <ele>1948.249023</ele>
        <time>2009-08-16T07:52:00Z</time>
      </trkpt>
      <trkpt lat="46.302337" lon="10.555492">
        <ele>1950.652344</ele>
        <time>2009-08-16T07:52:08Z</time>
      </trkpt>
      <trkpt lat="46.302367" lon="10.555493">
        <ele>1951.613770</ele>
        <time>2009-08-16T07:52:11Z</time>
      </trkpt>
      <trkpt lat="46.302395" lon="10.555513">
        <ele>1952.094238</ele>
        <time>2009-08-16T07:52:14Z</time>
      </trkpt>
      <trkpt lat="46.302492" lon="10.555506">
        <ele>1954.497559</ele>
        <time>2009-08-16T07:52:23Z</time>
      </trkpt>
      <trkpt lat="46.302606" lon="10.555481">
        <ele>1957.862305</ele>
        <time>2009-08-16T07:52:33Z</time>
      </trkpt>
      <trkpt lat="46.302712" lon="10.555453">
        <ele>1960.265381</ele>
        <time>2009-08-16T07:52:43Z</time>
      </trkpt>
      <trkpt lat="46.302752" lon="10.555437">
        <ele>1961.226807</ele>
        <time>2009-08-16T07:52:47Z</time>
      </trkpt>
      <trkpt lat="46.302841" lon="10.555428">
        <ele>1962.668701</ele>
        <time>2009-08-16T07:52:55Z</time>
      </trkpt>
      <trkpt lat="46.302954" lon="10.555426">
        <ele>1964.591553</ele>
        <time>2009-08-16T07:53:05Z</time>
      </trkpt>
      <trkpt lat="46.303066" lon="10.555400">
        <ele>1966.514160</ele>
        <time>2009-08-16T07:53:15Z</time>
      </trkpt>
      <trkpt lat="46.303174" lon="10.555381">
        <ele>1969.878662</ele>
        <time>2009-08-16T07:53:25Z</time>
      </trkpt>
      <trkpt lat="46.303257" lon="10.555356">
        <ele>1971.801270</ele>
        <time>2009-08-16T07:53:33Z</time>
      </trkpt>
      <trkpt lat="46.303333" lon="10.555321">
        <ele>1973.723877</ele>
        <time>2009-08-16T07:53:40Z</time>
      </trkpt>
      <trkpt lat="46.303422" lon="10.555258">
        <ele>1976.127197</ele>
        <time>2009-08-16T07:53:48Z</time>
      </trkpt>
      <trkpt lat="46.303499" lon="10.555190">
        <ele>1979.010986</ele>
        <time>2009-08-16T07:53:56Z</time>
      </trkpt>
      <trkpt lat="46.303575" lon="10.555118">
        <ele>1981.895264</ele>
        <time>2009-08-16T07:54:03Z</time>
      </trkpt>
      <trkpt lat="46.303686" lon="10.555051">
        <ele>1983.337158</ele>
        <time>2009-08-16T07:54:13Z</time>
      </trkpt>
      <trkpt lat="46.303827" lon="10.555038">
        <ele>1983.337158</ele>
        <time>2009-08-16T07:54:24Z</time>
      </trkpt>
      <trkpt lat="46.303919" lon="10.554963">
        <ele>1985.740479</ele>
        <time>2009-08-16T07:54:32Z</time>
      </trkpt>
      <trkpt lat="46.304024" lon="10.554848">
        <ele>1989.104980</ele>
        <time>2009-08-16T07:54:42Z</time>
      </trkpt>
      <trkpt lat="46.304114" lon="10.554756">
        <ele>1991.989014</ele>
        <time>2009-08-16T07:54:50Z</time>
      </trkpt>
      <trkpt lat="46.304229" lon="10.554678">
        <ele>1993.430908</ele>
        <time>2009-08-16T07:54:59Z</time>
      </trkpt>
      <trkpt lat="46.304355" lon="10.554623">
        <ele>1995.353516</ele>
        <time>2009-08-16T07:55:08Z</time>
      </trkpt>
      <trkpt lat="46.304405" lon="10.554625">
        <ele>1996.315186</ele>
        <time>2009-08-16T07:55:12Z</time>
      </trkpt>
      <trkpt lat="46.304394" lon="10.554682">
        <ele>1996.315186</ele>
        <time>2009-08-16T07:55:17Z</time>
      </trkpt>
      <trkpt lat="46.304355" lon="10.554690">
        <ele>1996.315186</ele>
        <time>2009-08-16T07:55:20Z</time>
      </trkpt>
      <trkpt lat="46.304244" lon="10.554781">
        <ele>1996.795654</ele>
        <time>2009-08-16T07:55:30Z</time>
      </trkpt>
      <trkpt lat="46.304147" lon="10.554928">
        <ele>1995.353516</ele>
        <time>2009-08-16T07:55:40Z</time>
      </trkpt>
      <trkpt lat="46.304095" lon="10.555062">
        <ele>1994.872803</ele>
        <time>2009-08-16T07:55:48Z</time>
      </trkpt>
      <trkpt lat="46.304058" lon="10.555187">
        <ele>1994.392090</ele>
        <time>2009-08-16T07:55:55Z</time>
      </trkpt>
      <trkpt lat="46.304021" lon="10.555295">
        <ele>1993.911621</ele>
        <time>2009-08-16T07:56:01Z</time>
      </trkpt>
      <trkpt lat="46.303971" lon="10.555425">
        <ele>1994.872803</ele>
        <time>2009-08-16T07:56:10Z</time>
      </trkpt>
      <trkpt lat="46.303906" lon="10.555533">
        <ele>1994.872803</ele>
        <time>2009-08-16T07:56:18Z</time>
      </trkpt>
      <trkpt lat="46.303831" lon="10.555641">
        <ele>1996.795654</ele>
        <time>2009-08-16T07:56:28Z</time>
      </trkpt>
      <trkpt lat="46.303777" lon="10.555737">
        <ele>1997.276367</ele>
        <time>2009-08-16T07:56:35Z</time>
      </trkpt>
      <trkpt lat="46.303730" lon="10.555836">
        <ele>1997.757080</ele>
        <time>2009-08-16T07:56:41Z</time>
      </trkpt>
      <trkpt lat="46.303667" lon="10.555958">
        <ele>1998.237549</ele>
        <time>2009-08-16T07:56:49Z</time>
      </trkpt>
      <trkpt lat="46.303602" lon="10.556077">
        <ele>1999.679688</ele>
        <time>2009-08-16T07:56:58Z</time>
      </trkpt>
      <trkpt lat="46.303531" lon="10.556158">
        <ele>2001.602295</ele>
        <time>2009-08-16T07:57:06Z</time>
      </trkpt>
      <trkpt lat="46.303445" lon="10.556215">
        <ele>2004.966797</ele>
        <time>2009-08-16T07:57:16Z</time>
      </trkpt>
      <trkpt lat="46.303354" lon="10.556276">
        <ele>2006.408691</ele>
        <time>2009-08-16T07:57:25Z</time>
      </trkpt>
      <trkpt lat="46.303346" lon="10.556282">
        <ele>2006.889404</ele>
        <time>2009-08-16T07:57:26Z</time>
      </trkpt>
      <trkpt lat="46.303263" lon="10.556366">
        <ele>2007.370117</ele>
        <time>2009-08-16T07:57:34Z</time>
      </trkpt>
      <trkpt lat="46.303149" lon="10.556463">
        <ele>2008.812012</ele>
        <time>2009-08-16T07:57:45Z</time>
      </trkpt>
      <trkpt lat="46.303076" lon="10.556522">
        <ele>2010.734619</ele>
        <time>2009-08-16T07:57:53Z</time>
      </trkpt>
      <trkpt lat="46.302974" lon="10.556603">
        <ele>2012.176758</ele>
        <time>2009-08-16T07:58:03Z</time>
      </trkpt>
      <trkpt lat="46.302898" lon="10.556649">
        <ele>2014.099365</ele>
        <time>2009-08-16T07:58:11Z</time>
      </trkpt>
      <trkpt lat="46.302798" lon="10.556707">
        <ele>2015.541504</ele>
        <time>2009-08-16T07:58:20Z</time>
      </trkpt>
      <trkpt lat="46.302710" lon="10.556760">
        <ele>2016.983398</ele>
        <time>2009-08-16T07:58:28Z</time>
      </trkpt>
      <trkpt lat="46.302612" lon="10.556841">
        <ele>2018.425293</ele>
        <time>2009-08-16T07:58:37Z</time>
      </trkpt>
      <trkpt lat="46.302539" lon="10.556904">
        <ele>2022.270508</ele>
        <time>2009-08-16T07:58:46Z</time>
      </trkpt>
      <trkpt lat="46.302457" lon="10.556993">
        <ele>2022.270508</ele>
        <time>2009-08-16T07:58:54Z</time>
      </trkpt>
      <trkpt lat="46.302369" lon="10.557098">
        <ele>2023.231934</ele>
        <time>2009-08-16T07:59:04Z</time>
      </trkpt>
      <trkpt lat="46.302297" lon="10.557162">
        <ele>2024.193115</ele>
        <time>2009-08-16T07:59:12Z</time>
      </trkpt>
      <trkpt lat="46.302188" lon="10.557211">
        <ele>2026.596436</ele>
        <time>2009-08-16T07:59:24Z</time>
      </trkpt>
      <trkpt lat="46.302116" lon="10.557247">
        <ele>2027.077148</ele>
        <time>2009-08-16T07:59:31Z</time>
      </trkpt>
      <trkpt lat="46.302113" lon="10.557318">
        <ele>2028.038574</ele>
        <time>2009-08-16T07:59:37Z</time>
      </trkpt>
      <trkpt lat="46.302166" lon="10.557303">
        <ele>2029.480469</ele>
        <time>2009-08-16T07:59:42Z</time>
      </trkpt>
      <trkpt lat="46.302167" lon="10.557296">
        <ele>2030.441895</ele>
        <time>2009-08-16T07:59:48Z</time>
      </trkpt>
      <trkpt lat="46.302223" lon="10.557253">
        <ele>2039.093506</ele>
        <time>2009-08-16T08:00:23Z</time>
      </trkpt>
      <trkpt lat="46.302337" lon="10.557236">
        <ele>2039.574219</ele>
        <time>2009-08-16T08:00:34Z</time>
      </trkpt>
      <trkpt lat="46.302440" lon="10.557220">
        <ele>2040.054932</ele>
        <time>2009-08-16T08:00:44Z</time>
      </trkpt>
      <trkpt lat="46.302544" lon="10.557191">
        <ele>2041.977539</ele>
        <time>2009-08-16T08:00:55Z</time>
      </trkpt>
      <trkpt lat="46.302639" lon="10.557168">
        <ele>2043.419434</ele>
        <time>2009-08-16T08:01:05Z</time>
      </trkpt>
      <trkpt lat="46.302667" lon="10.557158">
        <ele>2044.380859</ele>
        <time>2009-08-16T08:01:08Z</time>
      </trkpt>
      <trkpt lat="46.302697" lon="10.557156">
        <ele>2044.861572</ele>
        <time>2009-08-16T08:01:11Z</time>
      </trkpt>
      <trkpt lat="46.302716" lon="10.557145">
        <ele>2045.342285</ele>
        <time>2009-08-16T08:01:13Z</time>
      </trkpt>
      <trkpt lat="46.302808" lon="10.557137">
        <ele>2046.303711</ele>
        <time>2009-08-16T08:01:22Z</time>
      </trkpt>
      <trkpt lat="46.302915" lon="10.557157">
        <ele>2046.303711</ele>
        <time>2009-08-16T08:01:32Z</time>
      </trkpt>
      <trkpt lat="46.303003" lon="10.557198">
        <ele>2047.264893</ele>
        <time>2009-08-16T08:01:41Z</time>
      </trkpt>
      <trkpt lat="46.303093" lon="10.557193">
        <ele>2048.226074</ele>
        <time>2009-08-16T08:01:50Z</time>
      </trkpt>
      <trkpt lat="46.303185" lon="10.557168">
        <ele>2049.668213</ele>
        <time>2009-08-16T08:01:59Z</time>
      </trkpt>
      <trkpt lat="46.303291" lon="10.557159">
        <ele>2051.110107</ele>
        <time>2009-08-16T08:02:09Z</time>
      </trkpt>
      <trkpt lat="46.303368" lon="10.557130">
        <ele>2053.032715</ele>
        <time>2009-08-16T08:02:17Z</time>
      </trkpt>
      <trkpt lat="46.303458" lon="10.557112">
        <ele>2054.474609</ele>
        <time>2009-08-16T08:02:25Z</time>
      </trkpt>
      <trkpt lat="46.303587" lon="10.557111">
        <ele>2054.955322</ele>
        <time>2009-08-16T08:02:36Z</time>
      </trkpt>
      <trkpt lat="46.303704" lon="10.557124">
        <ele>2055.916504</ele>
        <time>2009-08-16T08:02:46Z</time>
      </trkpt>
      <trkpt lat="46.303818" lon="10.557144">
        <ele>2056.877930</ele>
        <time>2009-08-16T08:02:56Z</time>
      </trkpt>
      <trkpt lat="46.303927" lon="10.557163">
        <ele>2058.800537</ele>
        <time>2009-08-16T08:03:06Z</time>
      </trkpt>
      <trkpt lat="46.304019" lon="10.557134">
        <ele>2060.242676</ele>
        <time>2009-08-16T08:03:14Z</time>
      </trkpt>
      <trkpt lat="46.304131" lon="10.557083">
        <ele>2062.165283</ele>
        <time>2009-08-16T08:03:24Z</time>
      </trkpt>
      <trkpt lat="46.304249" lon="10.557064">
        <ele>2063.607178</ele>
        <time>2009-08-16T08:03:34Z</time>
      </trkpt>
      <trkpt lat="46.304343" lon="10.557055">
        <ele>2064.568604</ele>
        <time>2009-08-16T08:03:42Z</time>
      </trkpt>
      <trkpt lat="46.304464" lon="10.556984">
        <ele>2067.933105</ele>
        <time>2009-08-16T08:03:53Z</time>
      </trkpt>
      <trkpt lat="46.304475" lon="10.556981">
        <ele>2067.933105</ele>
        <time>2009-08-16T08:03:54Z</time>
      </trkpt>
      <trkpt lat="46.304558" lon="10.556935">
        <ele>2068.413818</ele>
        <time>2009-08-16T08:04:02Z</time>
      </trkpt>
      <trkpt lat="46.304647" lon="10.556833">
        <ele>2069.375244</ele>
        <time>2009-08-16T08:04:12Z</time>
      </trkpt>
      <trkpt lat="46.304736" lon="10.556675">
        <ele>2070.817139</ele>
        <time>2009-08-16T08:04:24Z</time>
      </trkpt>
      <trkpt lat="46.304818" lon="10.556540">
        <ele>2075.142822</ele>
        <time>2009-08-16T08:04:34Z</time>
      </trkpt>
      <trkpt lat="46.304895" lon="10.556430">
        <ele>2078.027100</ele>
        <time>2009-08-16T08:04:44Z</time>
      </trkpt>
      <trkpt lat="46.304976" lon="10.556378">
        <ele>2078.988281</ele>
        <time>2009-08-16T08:04:53Z</time>
      </trkpt>
      <trkpt lat="46.304972" lon="10.556464">
        <ele>2077.546387</ele>
        <time>2009-08-16T08:04:59Z</time>
      </trkpt>
      <trkpt lat="46.304962" lon="10.556479">
        <ele>2077.546387</ele>
        <time>2009-08-16T08:05:00Z</time>
      </trkpt>
      <trkpt lat="46.304873" lon="10.556596">
        <ele>2077.065918</ele>
        <time>2009-08-16T08:05:10Z</time>
      </trkpt>
      <trkpt lat="46.304811" lon="10.556796">
        <ele>2076.585205</ele>
        <time>2009-08-16T08:05:22Z</time>
      </trkpt>
      <trkpt lat="46.304772" lon="10.556954">
        <ele>2076.585205</ele>
        <time>2009-08-16T08:05:31Z</time>
      </trkpt>
      <trkpt lat="46.304748" lon="10.557083">
        <ele>2078.027100</ele>
        <time>2009-08-16T08:05:39Z</time>
      </trkpt>
      <trkpt lat="46.304684" lon="10.557258">
        <ele>2078.027100</ele>
        <time>2009-08-16T08:05:50Z</time>
      </trkpt>
      <trkpt lat="46.304603" lon="10.557379">
        <ele>2078.027100</ele>
        <time>2009-08-16T08:05:59Z</time>
      </trkpt>
      <trkpt lat="46.304514" lon="10.557483">
        <ele>2078.027100</ele>
        <time>2009-08-16T08:06:08Z</time>
      </trkpt>
      <trkpt lat="46.304422" lon="10.557567">
        <ele>2080.911133</ele>
        <time>2009-08-16T08:06:18Z</time>
      </trkpt>
      <trkpt lat="46.304345" lon="10.557631">
        <ele>2084.756348</ele>
        <time>2009-08-16T08:06:26Z</time>
      </trkpt>
      <trkpt lat="46.304246" lon="10.557712">
        <ele>2088.601563</ele>
        <time>2009-08-16T08:06:37Z</time>
      </trkpt>
      <trkpt lat="46.304163" lon="10.557781">
        <ele>2091.485352</ele>
        <time>2009-08-16T08:06:46Z</time>
      </trkpt>
      <trkpt lat="46.304077" lon="10.557849">
        <ele>2092.927490</ele>
        <time>2009-08-16T08:06:55Z</time>
      </trkpt>
      <trkpt lat="46.304001" lon="10.557935">
        <ele>2093.888916</ele>
        <time>2009-08-16T08:07:04Z</time>
      </trkpt>
      <trkpt lat="46.303918" lon="10.557985">
        <ele>2095.811523</ele>
        <time>2009-08-16T08:07:13Z</time>
      </trkpt>
      <trkpt lat="46.303830" lon="10.558083">
        <ele>2096.772705</ele>
        <time>2009-08-16T08:07:23Z</time>
      </trkpt>
      <trkpt lat="46.303763" lon="10.558162">
        <ele>2097.734131</ele>
        <time>2009-08-16T08:07:31Z</time>
      </trkpt>
      <trkpt lat="46.303675" lon="10.558289">
        <ele>2094.850098</ele>
        <time>2009-08-16T08:07:40Z</time>
      </trkpt>
      <trkpt lat="46.303666" lon="10.558300">
        <ele>2094.850098</ele>
        <time>2009-08-16T08:07:41Z</time>
      </trkpt>
      <trkpt lat="46.303579" lon="10.558315">
        <ele>2100.137451</ele>
        <time>2009-08-16T08:07:51Z</time>
      </trkpt>
      <trkpt lat="46.303491" lon="10.558342">
        <ele>2103.501953</ele>
        <time>2009-08-16T08:08:01Z</time>
      </trkpt>
      <trkpt lat="46.303403" lon="10.558395">
        <ele>2103.982666</ele>
        <time>2009-08-16T08:08:10Z</time>
      </trkpt>
      <trkpt lat="46.303308" lon="10.558414">
        <ele>2104.943848</ele>
        <time>2009-08-16T08:08:18Z</time>
      </trkpt>
      <trkpt lat="46.303205" lon="10.558413">
        <ele>2106.385742</ele>
        <time>2009-08-16T08:08:26Z</time>
      </trkpt>
      <trkpt lat="46.303090" lon="10.558432">
        <ele>2108.308594</ele>
        <time>2009-08-16T08:08:36Z</time>
      </trkpt>
      <trkpt lat="46.303086" lon="10.558423">
        <ele>2109.270020</ele>
        <time>2009-08-16T08:08:42Z</time>
      </trkpt>
      <trkpt lat="46.303040" lon="10.558397">
        <ele>2115.037842</ele>
        <time>2009-08-16T08:09:28Z</time>
      </trkpt>
      <trkpt lat="46.302953" lon="10.558450">
        <ele>2112.153809</ele>
        <time>2009-08-16T08:09:35Z</time>
      </trkpt>
      <trkpt lat="46.302867" lon="10.558500">
        <ele>2110.711914</ele>
        <time>2009-08-16T08:09:41Z</time>
      </trkpt>
      <trkpt lat="46.302775" lon="10.558516">
        <ele>2111.192627</ele>
        <time>2009-08-16T08:09:48Z</time>
      </trkpt>
      <trkpt lat="46.302700" lon="10.558542">
        <ele>2110.711914</ele>
        <time>2009-08-16T08:09:54Z</time>
      </trkpt>
      <trkpt lat="46.302600" lon="10.558544">
        <ele>2112.153809</ele>
        <time>2009-08-16T08:10:03Z</time>
      </trkpt>
      <trkpt lat="46.302539" lon="10.558581">
        <ele>2112.153809</ele>
        <time>2009-08-16T08:10:12Z</time>
      </trkpt>
      <trkpt lat="46.302422" lon="10.558633">
        <ele>2110.711914</ele>
        <time>2009-08-16T08:10:20Z</time>
      </trkpt>
      <trkpt lat="46.302334" lon="10.558624">
        <ele>2111.192627</ele>
        <time>2009-08-16T08:10:28Z</time>
      </trkpt>
      <trkpt lat="46.302199" lon="10.558604">
        <ele>2114.076416</ele>
        <time>2009-08-16T08:10:39Z</time>
      </trkpt>
      <trkpt lat="46.302100" lon="10.558602">
        <ele>2116.479736</ele>
        <time>2009-08-16T08:10:48Z</time>
      </trkpt>
      <trkpt lat="46.301955" lon="10.558616">
        <ele>2119.844238</ele>
        <time>2009-08-16T08:11:01Z</time>
      </trkpt>
      <trkpt lat="46.301860" lon="10.558650">
        <ele>2121.766846</ele>
        <time>2009-08-16T08:11:11Z</time>
      </trkpt>
      <trkpt lat="46.301716" lon="10.558707">
        <ele>2121.286133</ele>
        <time>2009-08-16T08:11:18Z</time>
      </trkpt>
      <trkpt lat="46.301550" lon="10.558736">
        <ele>2121.286133</ele>
        <time>2009-08-16T08:11:24Z</time>
      </trkpt>
      <trkpt lat="46.301418" lon="10.558802">
        <ele>2120.324951</ele>
        <time>2009-08-16T08:11:29Z</time>
      </trkpt>
      <trkpt lat="46.301207" lon="10.558824">
        <ele>2118.883057</ele>
        <time>2009-08-16T08:11:34Z</time>
      </trkpt>
      <trkpt lat="46.301161" lon="10.558806">
        <ele>2118.883057</ele>
        <time>2009-08-16T08:11:35Z</time>
      </trkpt>
      <trkpt lat="46.300979" lon="10.558722">
        <ele>2118.402344</ele>
        <time>2009-08-16T08:11:39Z</time>
      </trkpt>
      <trkpt lat="46.300618" lon="10.558576">
        <ele>2117.921631</ele>
        <time>2009-08-16T08:11:47Z</time>
      </trkpt>
      <trkpt lat="46.300491" lon="10.558503">
        <ele>2117.440918</ele>
        <time>2009-08-16T08:11:50Z</time>
      </trkpt>
      <trkpt lat="46.300341" lon="10.558494">
        <ele>2117.440918</ele>
        <time>2009-08-16T08:11:54Z</time>
      </trkpt>
      <trkpt lat="46.300311" lon="10.558517">
        <ele>2117.440918</ele>
        <time>2009-08-16T08:11:55Z</time>
      </trkpt>
      <trkpt lat="46.300092" lon="10.558711">
        <ele>2115.518555</ele>
        <time>2009-08-16T08:12:04Z</time>
      </trkpt>
      <trkpt lat="46.299940" lon="10.558764">
        <ele>2116.479736</ele>
        <time>2009-08-16T08:12:11Z</time>
      </trkpt>
      <trkpt lat="46.299741" lon="10.558823">
        <ele>2119.844238</ele>
        <time>2009-08-16T08:12:21Z</time>
      </trkpt>
      <trkpt lat="46.299574" lon="10.558955">
        <ele>2117.921631</ele>
        <time>2009-08-16T08:12:30Z</time>
      </trkpt>
      <trkpt lat="46.299445" lon="10.559025">
        <ele>2121.286133</ele>
        <time>2009-08-16T08:12:39Z</time>
      </trkpt>
      <trkpt lat="46.299322" lon="10.559081">
        <ele>2123.208984</ele>
        <time>2009-08-16T08:12:48Z</time>
      </trkpt>
      <trkpt lat="46.299232" lon="10.559119">
        <ele>2124.651123</ele>
        <time>2009-08-16T08:12:56Z</time>
      </trkpt>
      <trkpt lat="46.299240" lon="10.559117">
        <ele>2126.093018</ele>
        <time>2009-08-16T08:13:02Z</time>
      </trkpt>
      <trkpt lat="46.299262" lon="10.559132">
        <ele>2121.286133</ele>
        <time>2009-08-16T08:13:34Z</time>
      </trkpt>
      <trkpt lat="46.299256" lon="10.559152">
        <ele>2118.402344</ele>
        <time>2009-08-16T08:13:52Z</time>
      </trkpt>
      <trkpt lat="46.299245" lon="10.559151">
        <ele>2118.402344</ele>
        <time>2009-08-16T08:13:54Z</time>
      </trkpt>
      <trkpt lat="46.299152" lon="10.559252">
        <ele>2119.363770</ele>
        <time>2009-08-16T08:14:03Z</time>
      </trkpt>
      <trkpt lat="46.299072" lon="10.559354">
        <ele>2120.324951</ele>
        <time>2009-08-16T08:14:11Z</time>
      </trkpt>
      <trkpt lat="46.298986" lon="10.559461">
        <ele>2121.766846</ele>
        <time>2009-08-16T08:14:20Z</time>
      </trkpt>
      <trkpt lat="46.298916" lon="10.559580">
        <ele>2123.208984</ele>
        <time>2009-08-16T08:14:28Z</time>
      </trkpt>
      <trkpt lat="46.298836" lon="10.559667">
        <ele>2126.573730</ele>
        <time>2009-08-16T08:14:36Z</time>
      </trkpt>
      <trkpt lat="46.298739" lon="10.559685">
        <ele>2130.899658</ele>
        <time>2009-08-16T08:14:44Z</time>
      </trkpt>
      <trkpt lat="46.298646" lon="10.559663">
        <ele>2132.341553</ele>
        <time>2009-08-16T08:14:51Z</time>
      </trkpt>
      <trkpt lat="46.298541" lon="10.559596">
        <ele>2134.264160</ele>
        <time>2009-08-16T08:14:59Z</time>
      </trkpt>
      <trkpt lat="46.298425" lon="10.559564">
        <ele>2134.264160</ele>
        <time>2009-08-16T08:15:08Z</time>
      </trkpt>
      <trkpt lat="46.298317" lon="10.559576">
        <ele>2135.225342</ele>
        <time>2009-08-16T08:15:16Z</time>
      </trkpt>
      <trkpt lat="46.298195" lon="10.559584">
        <ele>2137.147949</ele>
        <time>2009-08-16T08:15:25Z</time>
      </trkpt>
      <trkpt lat="46.298104" lon="10.559556">
        <ele>2138.590088</ele>
        <time>2009-08-16T08:15:32Z</time>
      </trkpt>
      <trkpt lat="46.297969" lon="10.559498">
        <ele>2140.032227</ele>
        <time>2009-08-16T08:15:43Z</time>
      </trkpt>
      <trkpt lat="46.297806" lon="10.559436">
        <ele>2142.916016</ele>
        <time>2009-08-16T08:15:56Z</time>
      </trkpt>
      <trkpt lat="46.297707" lon="10.559417">
        <ele>2143.396729</ele>
        <time>2009-08-16T08:16:04Z</time>
      </trkpt>
      <trkpt lat="46.297683" lon="10.559404">
        <ele>2143.396729</ele>
        <time>2009-08-16T08:16:06Z</time>
      </trkpt>
      <trkpt lat="46.297582" lon="10.559301">
        <ele>2146.280762</ele>
        <time>2009-08-16T08:16:16Z</time>
      </trkpt>
      <trkpt lat="46.297460" lon="10.559179">
        <ele>2149.164551</ele>
        <time>2009-08-16T08:16:26Z</time>
      </trkpt>
      <trkpt lat="46.297334" lon="10.559120">
        <ele>2153.009766</ele>
        <time>2009-08-16T08:16:35Z</time>
      </trkpt>
      <trkpt lat="46.297187" lon="10.559112">
        <ele>2154.451660</ele>
        <time>2009-08-16T08:16:45Z</time>
      </trkpt>
      <trkpt lat="46.297065" lon="10.559125">
        <ele>2155.413086</ele>
        <time>2009-08-16T08:16:54Z</time>
      </trkpt>
      <trkpt lat="46.296958" lon="10.559115">
        <ele>2156.374512</ele>
        <time>2009-08-16T08:17:02Z</time>
      </trkpt>
      <trkpt lat="46.296857" lon="10.559170">
        <ele>2156.855225</ele>
        <time>2009-08-16T08:17:10Z</time>
      </trkpt>
      <trkpt lat="46.296790" lon="10.559217">
        <ele>2156.374512</ele>
        <time>2009-08-16T08:17:17Z</time>
      </trkpt>
      <trkpt lat="46.296790" lon="10.559205">
        <ele>2158.777832</ele>
        <time>2009-08-16T08:17:23Z</time>
      </trkpt>
      <trkpt lat="46.296804" lon="10.559185">
        <ele>2161.181152</ele>
        <time>2009-08-16T08:18:45Z</time>
      </trkpt>
      <trkpt lat="46.296840" lon="10.559201">
        <ele>2158.297119</ele>
        <time>2009-08-16T08:18:58Z</time>
      </trkpt>
      <trkpt lat="46.296906" lon="10.559174">
        <ele>2160.700439</ele>
        <time>2009-08-16T08:19:04Z</time>
      </trkpt>
      <trkpt lat="46.297027" lon="10.559188">
        <ele>2158.777832</ele>
        <time>2009-08-16T08:19:12Z</time>
      </trkpt>
      <trkpt lat="46.297145" lon="10.559233">
        <ele>2157.816650</ele>
        <time>2009-08-16T08:19:20Z</time>
      </trkpt>
      <trkpt lat="46.297262" lon="10.559266">
        <ele>2157.816650</ele>
        <time>2009-08-16T08:19:29Z</time>
      </trkpt>
      <trkpt lat="46.297347" lon="10.559298">
        <ele>2157.816650</ele>
        <time>2009-08-16T08:19:36Z</time>
      </trkpt>
      <trkpt lat="46.297440" lon="10.559377">
        <ele>2158.297119</ele>
        <time>2009-08-16T08:19:45Z</time>
      </trkpt>
      <trkpt lat="46.297493" lon="10.559488">
        <ele>2158.297119</ele>
        <time>2009-08-16T08:19:53Z</time>
      </trkpt>
      <trkpt lat="46.297528" lon="10.559643">
        <ele>2160.219727</ele>
        <time>2009-08-16T08:20:03Z</time>
      </trkpt>
      <trkpt lat="46.297587" lon="10.559734">
        <ele>2161.181152</ele>
        <time>2009-08-16T08:20:10Z</time>
      </trkpt>
      <trkpt lat="46.297669" lon="10.559793">
        <ele>2161.661865</ele>
        <time>2009-08-16T08:20:18Z</time>
      </trkpt>
      <trkpt lat="46.297746" lon="10.559861">
        <ele>2162.142334</ele>
        <time>2009-08-16T08:20:25Z</time>
      </trkpt>
      <trkpt lat="46.297837" lon="10.559974">
        <ele>2163.584229</ele>
        <time>2009-08-16T08:20:35Z</time>
      </trkpt>
      <trkpt lat="46.297932" lon="10.560023">
        <ele>2164.064941</ele>
        <time>2009-08-16T08:20:43Z</time>
      </trkpt>
      <trkpt lat="46.298038" lon="10.560044">
        <ele>2165.507080</ele>
        <time>2009-08-16T08:20:52Z</time>
      </trkpt>
      <trkpt lat="46.298165" lon="10.560073">
        <ele>2166.468262</ele>
        <time>2009-08-16T08:21:02Z</time>
      </trkpt>
      <trkpt lat="46.298272" lon="10.560139">
        <ele>2167.429443</ele>
        <time>2009-08-16T08:21:11Z</time>
      </trkpt>
      <trkpt lat="46.298359" lon="10.560211">
        <ele>2167.910156</ele>
        <time>2009-08-16T08:21:19Z</time>
      </trkpt>
      <trkpt lat="46.298430" lon="10.560292">
        <ele>2168.871582</ele>
        <time>2009-08-16T08:21:27Z</time>
      </trkpt>
      <trkpt lat="46.298510" lon="10.560392">
        <ele>2170.313477</ele>
        <time>2009-08-16T08:21:37Z</time>
      </trkpt>
      <trkpt lat="46.298545" lon="10.560445">
        <ele>2171.274658</ele>
        <time>2009-08-16T08:21:42Z</time>
      </trkpt>
      <trkpt lat="46.298625" lon="10.560533">
        <ele>2172.236328</ele>
        <time>2009-08-16T08:21:51Z</time>
      </trkpt>
      <trkpt lat="46.298664" lon="10.560579">
        <ele>2173.197754</ele>
        <time>2009-08-16T08:21:56Z</time>
      </trkpt>
      <trkpt lat="46.298772" lon="10.560648">
        <ele>2173.197754</ele>
        <time>2009-08-16T08:22:06Z</time>
      </trkpt>
      <trkpt lat="46.298858" lon="10.560645">
        <ele>2175.120117</ele>
        <time>2009-08-16T08:22:14Z</time>
      </trkpt>
      <trkpt lat="46.298925" lon="10.560660">
        <ele>2177.042969</ele>
        <time>2009-08-16T08:22:19Z</time>
      </trkpt>
      <trkpt lat="46.299028" lon="10.560653">
        <ele>2179.446045</ele>
        <time>2009-08-16T08:22:28Z</time>
      </trkpt>
      <trkpt lat="46.299119" lon="10.560658">
        <ele>2180.888184</ele>
        <time>2009-08-16T08:22:36Z</time>
      </trkpt>
      <trkpt lat="46.299173" lon="10.560679">
        <ele>2181.368652</ele>
        <time>2009-08-16T08:22:41Z</time>
      </trkpt>
      <trkpt lat="46.299275" lon="10.560703">
        <ele>2183.771973</ele>
        <time>2009-08-16T08:22:51Z</time>
      </trkpt>
      <trkpt lat="46.299374" lon="10.560721">
        <ele>2185.694580</ele>
        <time>2009-08-16T08:23:00Z</time>
      </trkpt>
      <trkpt lat="46.299454" lon="10.560734">
        <ele>2187.136475</ele>
        <time>2009-08-16T08:23:07Z</time>
      </trkpt>
      <trkpt lat="46.299563" lon="10.560733">
        <ele>2189.540039</ele>
        <time>2009-08-16T08:23:17Z</time>
      </trkpt>
      <trkpt lat="46.299669" lon="10.560746">
        <ele>2191.462646</ele>
        <time>2009-08-16T08:23:27Z</time>
      </trkpt>
      <trkpt lat="46.299778" lon="10.560751">
        <ele>2193.385254</ele>
        <time>2009-08-16T08:23:37Z</time>
      </trkpt>
      <trkpt lat="46.299886" lon="10.560743">
        <ele>2194.346436</ele>
        <time>2009-08-16T08:23:46Z</time>
      </trkpt>
      <trkpt lat="46.299987" lon="10.560676">
        <ele>2196.749756</ele>
        <time>2009-08-16T08:23:55Z</time>
      </trkpt>
      <trkpt lat="46.300053" lon="10.560553">
        <ele>2199.153076</ele>
        <time>2009-08-16T08:24:04Z</time>
      </trkpt>
      <trkpt lat="46.300120" lon="10.560424">
        <ele>2201.556396</ele>
        <time>2009-08-16T08:24:14Z</time>
      </trkpt>
      <trkpt lat="46.300200" lon="10.560356">
        <ele>2202.998291</ele>
        <time>2009-08-16T08:24:22Z</time>
      </trkpt>
      <trkpt lat="46.300308" lon="10.560335">
        <ele>2204.921143</ele>
        <time>2009-08-16T08:24:32Z</time>
      </trkpt>
      <trkpt lat="46.300394" lon="10.560352">
        <ele>2205.882324</ele>
        <time>2009-08-16T08:24:40Z</time>
      </trkpt>
      <trkpt lat="46.300472" lon="10.560415">
        <ele>2205.401855</ele>
        <time>2009-08-16T08:24:49Z</time>
      </trkpt>
      <trkpt lat="46.300551" lon="10.560455">
        <ele>2206.843750</ele>
        <time>2009-08-16T08:24:57Z</time>
      </trkpt>
      <trkpt lat="46.300641" lon="10.560507">
        <ele>2204.921143</ele>
        <time>2009-08-16T08:25:04Z</time>
      </trkpt>
      <trkpt lat="46.300752" lon="10.560608">
        <ele>2203.479004</ele>
        <time>2009-08-16T08:25:14Z</time>
      </trkpt>
      <trkpt lat="46.300842" lon="10.560615">
        <ele>2207.324463</ele>
        <time>2009-08-16T08:25:23Z</time>
      </trkpt>
      <trkpt lat="46.300960" lon="10.560705">
        <ele>2206.363037</ele>
        <time>2009-08-16T08:25:33Z</time>
      </trkpt>
      <trkpt lat="46.301051" lon="10.560772">
        <ele>2206.363037</ele>
        <time>2009-08-16T08:25:41Z</time>
      </trkpt>
      <trkpt lat="46.301147" lon="10.560761">
        <ele>2209.247070</ele>
        <time>2009-08-16T08:25:50Z</time>
      </trkpt>
      <trkpt lat="46.301220" lon="10.560731">
        <ele>2214.053467</ele>
        <time>2009-08-16T08:25:58Z</time>
      </trkpt>
      <trkpt lat="46.301328" lon="10.560739">
        <ele>2215.495605</ele>
        <time>2009-08-16T08:26:07Z</time>
      </trkpt>
      <trkpt lat="46.301423" lon="10.560777">
        <ele>2216.456787</ele>
        <time>2009-08-16T08:26:15Z</time>
      </trkpt>
      <trkpt lat="46.301549" lon="10.560854">
        <ele>2216.937500</ele>
        <time>2009-08-16T08:26:26Z</time>
      </trkpt>
      <trkpt lat="46.301634" lon="10.560905">
        <ele>2217.417969</ele>
        <time>2009-08-16T08:26:34Z</time>
      </trkpt>
      <trkpt lat="46.301758" lon="10.560974">
        <ele>2217.898682</ele>
        <time>2009-08-16T08:26:45Z</time>
      </trkpt>
      <trkpt lat="46.301855" lon="10.561009">
        <ele>2218.379395</ele>
        <time>2009-08-16T08:26:53Z</time>
      </trkpt>
      <trkpt lat="46.301943" lon="10.560980">
        <ele>2219.340820</ele>
        <time>2009-08-16T08:27:01Z</time>
      </trkpt>
      <trkpt lat="46.301979" lon="10.560940">
        <ele>2220.302246</ele>
        <time>2009-08-16T08:27:05Z</time>
      </trkpt>
      <trkpt lat="46.302011" lon="10.560985">
        <ele>2221.263428</ele>
        <time>2009-08-16T08:27:10Z</time>
      </trkpt>
      <trkpt lat="46.301983" lon="10.561014">
        <ele>2221.744141</ele>
        <time>2009-08-16T08:27:13Z</time>
      </trkpt>
      <trkpt lat="46.301840" lon="10.561054">
        <ele>2223.186279</ele>
        <time>2009-08-16T08:27:24Z</time>
      </trkpt>
      <trkpt lat="46.301734" lon="10.561062">
        <ele>2224.147461</ele>
        <time>2009-08-16T08:27:32Z</time>
      </trkpt>
      <trkpt lat="46.301619" lon="10.561057">
        <ele>2225.108643</ele>
        <time>2009-08-16T08:27:41Z</time>
      </trkpt>
      <trkpt lat="46.301490" lon="10.561058">
        <ele>2226.550781</ele>
        <time>2009-08-16T08:27:51Z</time>
      </trkpt>
      <trkpt lat="46.301393" lon="10.561068">
        <ele>2227.031494</ele>
        <time>2009-08-16T08:27:59Z</time>
      </trkpt>
      <trkpt lat="46.301298" lon="10.561100">
        <ele>2228.473389</ele>
        <time>2009-08-16T08:28:06Z</time>
      </trkpt>
      <trkpt lat="46.301178" lon="10.561106">
        <ele>2229.434570</ele>
        <time>2009-08-16T08:28:15Z</time>
      </trkpt>
      <trkpt lat="46.301058" lon="10.561061">
        <ele>2229.434570</ele>
        <time>2009-08-16T08:28:25Z</time>
      </trkpt>
      <trkpt lat="46.300964" lon="10.561018">
        <ele>2231.357178</ele>
        <time>2009-08-16T08:28:33Z</time>
      </trkpt>
      <trkpt lat="46.300851" lon="10.561018">
        <ele>2232.799072</ele>
        <time>2009-08-16T08:28:42Z</time>
      </trkpt>
      <trkpt lat="46.300789" lon="10.561118">
        <ele>2233.279785</ele>
        <time>2009-08-16T08:28:49Z</time>
      </trkpt>
      <trkpt lat="46.300746" lon="10.561271">
        <ele>2235.683105</ele>
        <time>2009-08-16T08:28:58Z</time>
      </trkpt>
      <trkpt lat="46.300675" lon="10.561420">
        <ele>2235.683105</ele>
        <time>2009-08-16T08:29:07Z</time>
      </trkpt>
      <trkpt lat="46.300602" lon="10.561581">
        <ele>2238.567383</ele>
        <time>2009-08-16T08:29:18Z</time>
      </trkpt>
      <trkpt lat="46.300556" lon="10.561644">
        <ele>2239.528564</ele>
        <time>2009-08-16T08:29:23Z</time>
      </trkpt>
      <trkpt lat="46.300560" lon="10.561734">
        <ele>2240.489746</ele>
        <time>2009-08-16T08:29:29Z</time>
      </trkpt>
      <trkpt lat="46.300604" lon="10.561745">
        <ele>2241.451172</ele>
        <time>2009-08-16T08:29:33Z</time>
      </trkpt>
      <trkpt lat="46.300699" lon="10.561729">
        <ele>2242.893066</ele>
        <time>2009-08-16T08:29:41Z</time>
      </trkpt>
      <trkpt lat="46.300776" lon="10.561739">
        <ele>2244.815674</ele>
        <time>2009-08-16T08:29:48Z</time>
      </trkpt>
      <trkpt lat="46.300838" lon="10.561723">
        <ele>2246.738281</ele>
        <time>2009-08-16T08:29:54Z</time>
      </trkpt>
      <trkpt lat="46.300926" lon="10.561632">
        <ele>2249.622314</ele>
        <time>2009-08-16T08:30:04Z</time>
      </trkpt>
      <trkpt lat="46.300992" lon="10.561526">
        <ele>2252.025635</ele>
        <time>2009-08-16T08:30:13Z</time>
      </trkpt>
      <trkpt lat="46.301016" lon="10.561495">
        <ele>2252.987061</ele>
        <time>2009-08-16T08:30:16Z</time>
      </trkpt>
      <trkpt lat="46.301047" lon="10.561485">
        <ele>2253.467773</ele>
        <time>2009-08-16T08:30:19Z</time>
      </trkpt>
      <trkpt lat="46.301074" lon="10.561517">
        <ele>2253.467773</ele>
        <time>2009-08-16T08:30:22Z</time>
      </trkpt>
      <trkpt lat="46.301072" lon="10.561575">
        <ele>2252.987061</ele>
        <time>2009-08-16T08:30:26Z</time>
      </trkpt>
      <trkpt lat="46.301014" lon="10.561698">
        <ele>2252.506348</ele>
        <time>2009-08-16T08:30:36Z</time>
      </trkpt>
      <trkpt lat="46.300965" lon="10.561825">
        <ele>2253.948486</ele>
        <time>2009-08-16T08:30:45Z</time>
      </trkpt>
      <trkpt lat="46.300927" lon="10.561889">
        <ele>2254.428955</ele>
        <time>2009-08-16T08:30:50Z</time>
      </trkpt>
      <trkpt lat="46.300886" lon="10.562010">
        <ele>2255.870850</ele>
        <time>2009-08-16T08:30:59Z</time>
      </trkpt>
      <trkpt lat="46.300885" lon="10.562011">
        <ele>2255.390381</ele>
        <time>2009-08-16T08:31:13Z</time>
      </trkpt>
      <trkpt lat="46.300846" lon="10.562062">
        <ele>2257.312988</ele>
        <time>2009-08-16T08:33:45Z</time>
      </trkpt>
      <trkpt lat="46.300792" lon="10.562153">
        <ele>2258.754883</ele>
        <time>2009-08-16T08:33:52Z</time>
      </trkpt>
      <trkpt lat="46.300713" lon="10.562233">
        <ele>2260.196777</ele>
        <time>2009-08-16T08:34:01Z</time>
      </trkpt>
      <trkpt lat="46.300653" lon="10.562303">
        <ele>2261.638916</ele>
        <time>2009-08-16T08:34:09Z</time>
      </trkpt>
      <trkpt lat="46.300590" lon="10.562376">
        <ele>2262.119385</ele>
        <time>2009-08-16T08:34:18Z</time>
      </trkpt>
      <trkpt lat="46.300514" lon="10.562446">
        <ele>2264.041992</ele>
        <time>2009-08-16T08:34:28Z</time>
      </trkpt>
      <trkpt lat="46.300440" lon="10.562494">
        <ele>2265.003418</ele>
        <time>2009-08-16T08:34:36Z</time>
      </trkpt>
      <trkpt lat="46.300429" lon="10.562498">
        <ele>2265.484131</ele>
        <time>2009-08-16T08:34:37Z</time>
      </trkpt>
      <trkpt lat="46.300338" lon="10.562531">
        <ele>2268.368164</ele>
        <time>2009-08-16T08:34:47Z</time>
      </trkpt>
      <trkpt lat="46.300239" lon="10.562538">
        <ele>2271.251953</ele>
        <time>2009-08-16T08:34:57Z</time>
      </trkpt>
      <trkpt lat="46.300163" lon="10.562565">
        <ele>2273.655273</ele>
        <time>2009-08-16T08:35:05Z</time>
      </trkpt>
      <trkpt lat="46.300108" lon="10.562581">
        <ele>2274.135986</ele>
        <time>2009-08-16T08:35:10Z</time>
      </trkpt>
      <trkpt lat="46.299988" lon="10.562563">
        <ele>2277.500488</ele>
        <time>2009-08-16T08:35:20Z</time>
      </trkpt>
      <trkpt lat="46.299902" lon="10.562534">
        <ele>2278.942383</ele>
        <time>2009-08-16T08:35:29Z</time>
      </trkpt>
      <trkpt lat="46.299892" lon="10.562530">
        <ele>2278.942383</ele>
        <time>2009-08-16T08:35:35Z</time>
      </trkpt>
      <trkpt lat="46.299864" lon="10.562509">
        <ele>2272.213379</ele>
        <time>2009-08-16T08:36:41Z</time>
      </trkpt>
      <trkpt lat="46.299797" lon="10.562485">
        <ele>2272.213379</ele>
        <time>2009-08-16T08:36:48Z</time>
      </trkpt>
      <trkpt lat="46.299692" lon="10.562458">
        <ele>2273.174805</ele>
        <time>2009-08-16T08:36:57Z</time>
      </trkpt>
      <trkpt lat="46.299577" lon="10.562392">
        <ele>2274.616699</ele>
        <time>2009-08-16T08:37:06Z</time>
      </trkpt>
      <trkpt lat="46.299510" lon="10.562338">
        <ele>2276.058594</ele>
        <time>2009-08-16T08:37:13Z</time>
      </trkpt>
      <trkpt lat="46.299434" lon="10.562256">
        <ele>2278.942383</ele>
        <time>2009-08-16T08:37:21Z</time>
      </trkpt>
      <trkpt lat="46.299394" lon="10.562221">
        <ele>2280.384521</ele>
        <time>2009-08-16T08:37:25Z</time>
      </trkpt>
      <trkpt lat="46.299364" lon="10.562302">
        <ele>2281.345703</ele>
        <time>2009-08-16T08:37:32Z</time>
      </trkpt>
      <trkpt lat="46.299387" lon="10.562351">
        <ele>2281.826416</ele>
        <time>2009-08-16T08:37:36Z</time>
      </trkpt>
      <trkpt lat="46.299422" lon="10.562456">
        <ele>2284.710693</ele>
        <time>2009-08-16T08:37:44Z</time>
      </trkpt>
      <trkpt lat="46.299452" lon="10.562506">
        <ele>2286.633057</ele>
        <time>2009-08-16T08:37:51Z</time>
      </trkpt>
      <trkpt lat="46.299489" lon="10.562562">
        <ele>2287.594482</ele>
        <time>2009-08-16T08:37:57Z</time>
      </trkpt>
      <trkpt lat="46.299540" lon="10.562630">
        <ele>2289.517090</ele>
        <time>2009-08-16T08:38:05Z</time>
      </trkpt>
      <trkpt lat="46.299597" lon="10.562680">
        <ele>2290.958984</ele>
        <time>2009-08-16T08:38:12Z</time>
      </trkpt>
      <trkpt lat="46.299643" lon="10.562749">
        <ele>2291.920410</ele>
        <time>2009-08-16T08:38:19Z</time>
      </trkpt>
      <trkpt lat="46.299724" lon="10.562858">
        <ele>2294.323486</ele>
        <time>2009-08-16T08:38:30Z</time>
      </trkpt>
      <trkpt lat="46.299776" lon="10.562945">
        <ele>2296.726807</ele>
        <time>2009-08-16T08:38:38Z</time>
      </trkpt>
      <trkpt lat="46.299843" lon="10.563007">
        <ele>2295.284912</ele>
        <time>2009-08-16T08:38:44Z</time>
      </trkpt>
      <trkpt lat="46.299905" lon="10.563084">
        <ele>2298.649414</ele>
        <time>2009-08-16T08:38:53Z</time>
      </trkpt>
      <trkpt lat="46.299998" lon="10.563162">
        <ele>2299.130127</ele>
        <time>2009-08-16T08:39:02Z</time>
      </trkpt>
      <trkpt lat="46.300116" lon="10.563228">
        <ele>2301.052979</ele>
        <time>2009-08-16T08:39:14Z</time>
      </trkpt>
      <trkpt lat="46.300212" lon="10.563247">
        <ele>2302.975586</ele>
        <time>2009-08-16T08:39:23Z</time>
      </trkpt>
      <trkpt lat="46.300318" lon="10.563303">
        <ele>2304.898193</ele>
        <time>2009-08-16T08:39:33Z</time>
      </trkpt>
      <trkpt lat="46.300398" lon="10.563371">
        <ele>2307.301514</ele>
        <time>2009-08-16T08:39:42Z</time>
      </trkpt>
      <trkpt lat="46.300476" lon="10.563419">
        <ele>2310.185303</ele>
        <time>2009-08-16T08:39:50Z</time>
      </trkpt>
      <trkpt lat="46.300569" lon="10.563467">
        <ele>2311.146729</ele>
        <time>2009-08-16T08:39:58Z</time>
      </trkpt>
      <trkpt lat="46.300662" lon="10.563550">
        <ele>2311.627441</ele>
        <time>2009-08-16T08:40:07Z</time>
      </trkpt>
      <trkpt lat="46.300687" lon="10.563644">
        <ele>2315.472656</ele>
        <time>2009-08-16T08:40:15Z</time>
      </trkpt>
      <trkpt lat="46.300621" lon="10.563651">
        <ele>2317.395264</ele>
        <time>2009-08-16T08:40:22Z</time>
      </trkpt>
      <trkpt lat="46.300525" lon="10.563615">
        <ele>2319.318115</ele>
        <time>2009-08-16T08:40:32Z</time>
      </trkpt>
      <trkpt lat="46.300433" lon="10.563620">
        <ele>2320.279297</ele>
        <time>2009-08-16T08:40:40Z</time>
      </
Download .txt
gitextract_f3d27aex/

├── .drone.yml
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       └── codeql-analysis.yml
├── .gitignore
├── .travis.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── build.sh
├── controller.go
├── dorker/
│   ├── dork.go
│   ├── dork_test.go
│   ├── google.go
│   ├── logger/
│   │   ├── arena.go
│   │   ├── arena_test.go
│   │   ├── coord.go
│   │   ├── food.go
│   │   ├── food_test.go
│   │   ├── game.go
│   │   ├── game_test.go
│   │   ├── keyboard.go
│   │   ├── keyboard_test.go
│   │   ├── presenter.go
│   │   ├── presenter_test.go
│   │   ├── snake.go
│   │   └── snake_test.go
│   ├── logger.go
│   ├── parser.go
│   ├── scrapper.go
│   ├── scrapper_test.go
│   └── webHandler.go
├── go.mod
├── go.sum
├── goca/
│   └── goca.go
├── goca.go
├── gocaTesting/
│   ├── testData/
│   │   ├── doc/
│   │   │   ├── Doc1.docx
│   │   │   ├── Doc2.docx
│   │   │   └── Doc3.docx
│   │   ├── dsstore/
│   │   │   ├── DS_Store_1
│   │   │   ├── DS_Store_2
│   │   │   ├── DS_Store_3
│   │   │   └── DS_Store_bad
│   │   ├── gpx/
│   │   │   ├── gpx_1.gpx
│   │   │   ├── gpx_2.gpx
│   │   │   └── gpx_3.gpx
│   │   ├── img/
│   │   │   ├── img_4.ps
│   │   │   ├── img_5.ai
│   │   │   ├── img_6.eps
│   │   │   └── img_7.psd
│   │   ├── kml/
│   │   │   ├── kml_2.kml
│   │   │   ├── kml_3.kml
│   │   │   ├── kml_4.kml
│   │   │   └── lml_1.kml
│   │   ├── odp/
│   │   │   ├── Odp1.odp
│   │   │   ├── Odp2.odp
│   │   │   └── Odp3.odp
│   │   ├── ods/
│   │   │   ├── Ods1.ods
│   │   │   ├── Ods2.ods
│   │   │   └── Ods3.ods
│   │   ├── odt/
│   │   │   ├── Odt1.odt
│   │   │   ├── Odt2.odt
│   │   │   └── Odt3.odt
│   │   ├── ppt/
│   │   │   ├── Ppt1.pptx
│   │   │   ├── Ppt2.pptx
│   │   │   └── Ppt3.pptx
│   │   ├── swf/
│   │   │   ├── swf_1.swf
│   │   │   ├── swf_2.swf
│   │   │   └── swf_3.swf
│   │   └── xls/
│   │       ├── Xls1.xlsx
│   │       ├── Xls2.xlsx
│   │       └── Xls3.xlsx
│   ├── testServer/
│   │   └── server.go
│   └── test_helpers.go
├── img/
│   └── Goca.xml
├── output.go
├── plugin.go
├── plugins/
│   ├── doc/
│   │   ├── doc.go
│   │   └── doc_test.go
│   ├── dsstore/
│   │   ├── dsStore.go
│   │   └── dsstore_test.go
│   ├── dummy/
│   │   └── dummy.go
│   ├── gpx/
│   │   ├── gpx.go
│   │   └── gpx_test.go
│   ├── image/
│   │   └── image.go
│   ├── mp3/
│   │   ├── mp3.go
│   │   └── mp3_test.go
│   ├── odp/
│   │   ├── odp.go
│   │   └── odp_test.go
│   ├── ods/
│   │   ├── ods.go
│   │   └── ods_test.go
│   ├── odt/
│   │   ├── odt.go
│   │   └── odt_test.go
│   ├── pdf/
│   │   ├── pdf.go
│   │   └── pdf_test.go
│   ├── plugins.go
│   ├── ppt/
│   │   ├── ppt.go
│   │   └── ppt_test.go
│   ├── swf/
│   │   ├── swf.go
│   │   └── swf_test.go
│   └── xls/
│       ├── xls.go
│       └── xls_test.go
├── projects.go
└── scripts/
    └── deploy_to_docker.sh
Download .txt
SYMBOL INDEX (303 symbols across 53 files)

FILE: controller.go
  type Manager (line 41) | type Manager interface
  type Controller (line 49) | type Controller struct
    method Subscribe (line 71) | func (c *Controller) Subscribe(topic string, fn interface{}) error {
    method SubscribeOnce (line 75) | func (c *Controller) SubscribeOnce(topic string, fn interface{}) error {
    method Unsubscribe (line 79) | func (c *Controller) Unsubscribe(topic string, fn interface{}) error {
    method Publish (line 83) | func (c *Controller) Publish(topic string, args ...interface{}) {
    method getData (line 87) | func (c *Controller) getData(plugType string, targets []string, files,...
    method getURL (line 145) | func (c *Controller) getURL(url string) ([]byte, error) {
    method getFiles (line 173) | func (c *Controller) getFiles(file string) ([]byte, error) {
  function NewController (line 54) | func NewController(input Input) *Controller {
  function NewControllerTest (line 64) | func NewControllerTest() *Controller {

FILE: dorker/dork.go
  constant DEFAULT_DEPTH (line 24) | DEFAULT_DEPTH   = 1
  constant DEFAULT_TIMEOUT (line 25) | DEFAULT_TIMEOUT = 30
  type dorkLib (line 28) | type dorkLib
    method GetByType (line 164) | func (dl dorkLib) GetByType(typ string) []Dork {
    method GetByEngine (line 171) | func (dl dorkLib) GetByEngine(typ, engine string) []Dork {
  type Dork (line 187) | type Dork struct
    method GetEngine (line 193) | func (d *Dork) GetEngine() string {
    method GetSrting (line 198) | func (d *Dork) GetSrting() string {
    method UpdateDork (line 203) | func (d *Dork) UpdateDork(engine, site, term string) {
    method UpdateEngine (line 222) | func (d *Dork) UpdateEngine(engine string) {
    method UpdateString (line 229) | func (d *Dork) UpdateString(site, term string) {
  function NewDork (line 247) | func NewDork(engine, term string) Dork {
  type Dorker (line 252) | type Dorker struct
    method AddDork (line 277) | func (d *Dorker) AddDork(dork Dork) {
  function NewDorker (line 260) | func NewDorker(userAgent string, timeout, depth int) *Dorker {

FILE: dorker/dork_test.go
  function TestDorkGoogle (line 24) | func TestDorkGoogle(t *testing.T) {
  function TestGetType (line 38) | func TestGetType(t *testing.T) {
  function TestGetByEngine (line 64) | func TestGetByEngine(t *testing.T) {
  function TestUpdateDork (line 97) | func TestUpdateDork(t *testing.T) {
  function TestUpdateEngine (line 127) | func TestUpdateEngine(t *testing.T) {
  function TestUpdateString (line 141) | func TestUpdateString(t *testing.T) {

FILE: dorker/google.go
  method Google (line 27) | func (d *Dorker) Google() (results []string) {

FILE: dorker/logger.go
  function LogMeIn (line 8) | func LogMeIn() {

FILE: dorker/logger/arena.go
  type arena (line 8) | type arena struct
    method moveSnake (line 33) | func (a *arena) moveSnake() error {
    method snakeLeftArena (line 51) | func (a *arena) snakeLeftArena() bool {
    method addPoints (line 56) | func (a *arena) addPoints(p int) {
    method placeFood (line 60) | func (a *arena) placeFood() {
    method isOccupied (line 79) | func (a *arena) isOccupied(c coord) bool {
  function newArena (line 17) | func newArena(s *snake, p chan (int), h, w int) *arena {
  function hasFood (line 75) | func hasFood(a *arena, c coord) bool {

FILE: dorker/logger/arena_test.go
  function newDoubleArenaWithFoodFinder (line 7) | func newDoubleArenaWithFoodFinder(h, w int, f func(*arena, coord) bool) ...
  function newDoubleArena (line 13) | func newDoubleArena(h, w int) *arena {
  function TestArenaHaveFoodPlaced (line 25) | func TestArenaHaveFoodPlaced(t *testing.T) {
  function TestMoveSnakeOutOfArenaHeightLimit (line 31) | func TestMoveSnakeOutOfArenaHeightLimit(t *testing.T) {
  function TestMoveSnakeOutOfArenaWidthLimit (line 40) | func TestMoveSnakeOutOfArenaWidthLimit(t *testing.T) {
  function TestPlaceNewFoodWhenEatFood (line 49) | func TestPlaceNewFoodWhenEatFood(t *testing.T) {
  function TestIncreaseSnakeLengthWhenEatFood (line 63) | func TestIncreaseSnakeLengthWhenEatFood(t *testing.T) {
  function TestAddPointsWhenEatFood (line 77) | func TestAddPointsWhenEatFood(t *testing.T) {
  function TestDoesNotAddPointsWhenFoodNotFound (line 89) | func TestDoesNotAddPointsWhenFoodNotFound(t *testing.T) {
  function TestDoesNotPlaceNewFoodWhenFoodNotFound (line 104) | func TestDoesNotPlaceNewFoodWhenFoodNotFound(t *testing.T) {
  function TestDoesNotIncreaseSnakeLengthWhenFoodNotFound (line 118) | func TestDoesNotIncreaseSnakeLengthWhenFoodNotFound(t *testing.T) {
  function TestHasFood (line 132) | func TestHasFood(t *testing.T) {
  function TestHasNotFood (line 140) | func TestHasNotFood(t *testing.T) {

FILE: dorker/logger/coord.go
  type coord (line 3) | type coord struct

FILE: dorker/logger/food.go
  type food (line 9) | type food struct
  function newFood (line 14) | func newFood(x, y int) *food {
  function getFoodEmoji (line 23) | func getFoodEmoji() rune {
  function randomFoodEmoji (line 31) | func randomFoodEmoji() rune {
  function hasUnicodeSupport (line 54) | func hasUnicodeSupport() bool {

FILE: dorker/logger/food_test.go
  function TestFoodDefaultPoints (line 8) | func TestFoodDefaultPoints(t *testing.T) {
  function TestFoodEmoji (line 16) | func TestFoodEmoji(t *testing.T) {
  function TestFoodFallback (line 24) | func TestFoodFallback(t *testing.T) {

FILE: dorker/logger/game.go
  type Game (line 15) | type Game struct
    method end (line 38) | func (g *Game) end() {
    method moveInterval (line 42) | func (g *Game) moveInterval() time.Duration {
    method retry (line 47) | func (g *Game) retry() {
    method addPoints (line 53) | func (g *Game) addPoints(p int) {
    method Start (line 63) | func (g *Game) Start() {
  function initialSnake (line 21) | func initialSnake() *snake {
  function initialScore (line 30) | func initialScore() int {
  function initialArena (line 34) | func initialArena() *arena {
  function NewGame (line 58) | func NewGame() *Game {

FILE: dorker/logger/game_test.go
  function TestDefaultGameScore (line 8) | func TestDefaultGameScore(t *testing.T) {
  function TestGameMoveInterval (line 16) | func TestGameMoveInterval(t *testing.T) {
  function TestAddPoints (line 26) | func TestAddPoints(t *testing.T) {
  function TestRetryGoBackToGameInitialState (line 36) | func TestRetryGoBackToGameInitialState(t *testing.T) {

FILE: dorker/logger/keyboard.go
  type keyboardEventType (line 5) | type keyboardEventType
  constant MOVE (line 9) | MOVE keyboardEventType = 1 + iota
  constant RETRY (line 10) | RETRY
  constant END (line 11) | END
  type keyboardEvent (line 14) | type keyboardEvent struct
  function keyToDirection (line 19) | func keyToDirection(k termbox.Key) direction {
  function listenToKeyboard (line 34) | func listenToKeyboard(evChan chan keyboardEvent) {

FILE: dorker/logger/keyboard_test.go
  function TestKeyToDirectionDefault (line 9) | func TestKeyToDirectionDefault(t *testing.T) {
  function TestKeyToDirectionRight (line 17) | func TestKeyToDirectionRight(t *testing.T) {
  function TestKeyToDirectionDown (line 25) | func TestKeyToDirectionDown(t *testing.T) {
  function TestKeyToDirectionLeft (line 33) | func TestKeyToDirectionLeft(t *testing.T) {
  function TestKeyToDirectionUp (line 41) | func TestKeyToDirectionUp(t *testing.T) {

FILE: dorker/logger/presenter.go
  constant defaultColor (line 11) | defaultColor = termbox.ColorDefault
  constant bgColor (line 12) | bgColor      = termbox.ColorDefault
  constant snakeColor (line 13) | snakeColor   = termbox.ColorGreen
  method render (line 16) | func (g *Game) render() error {
  function renderSnake (line 38) | func renderSnake(left, bottom int, s *snake) {
  function renderFood (line 44) | func renderFood(left, bottom int, f *food) {
  function renderArena (line 48) | func renderArena(a *arena, top, bottom, left int) {
  function renderScore (line 63) | func renderScore(left, bottom, s int) {
  function renderQuitMessage (line 68) | func renderQuitMessage(right, bottom int) {
  function renderTitle (line 73) | func renderTitle(left, top int) {
  function fill (line 77) | func fill(x, y, w, h int, cell termbox.Cell) {
  function tbprint (line 85) | func tbprint(x, y int, fg, bg termbox.Attribute, msg string) {

FILE: dorker/logger/presenter_test.go
  function TestPresenterRendersSuccessfully (line 5) | func TestPresenterRendersSuccessfully(t *testing.T) {

FILE: dorker/logger/snake.go
  constant RIGHT (line 7) | RIGHT direction = 1 + iota
  constant LEFT (line 8) | LEFT
  constant UP (line 9) | UP
  constant DOWN (line 10) | DOWN
  type direction (line 13) | type direction
  type snake (line 15) | type snake struct
    method changeDirection (line 29) | func (s *snake) changeDirection(d direction) {
    method head (line 42) | func (s *snake) head() coord {
    method die (line 46) | func (s *snake) die() error {
    method move (line 50) | func (s *snake) move() error {
    method isOnPosition (line 78) | func (s *snake) isOnPosition(c coord) bool {
  function newSnake (line 21) | func newSnake(d direction, b []coord) *snake {

FILE: dorker/logger/snake_test.go
  function newDoubleSnake (line 5) | func newDoubleSnake(d direction) *snake {
  function TestSnakeBodyMove (line 15) | func TestSnakeBodyMove(t *testing.T) {
  function TestSnakeHeadMoveRight (line 40) | func TestSnakeHeadMoveRight(t *testing.T) {
  function TestSnakeHeadMoveUp (line 49) | func TestSnakeHeadMoveUp(t *testing.T) {
  function TestSnakeHeadMoveDown (line 58) | func TestSnakeHeadMoveDown(t *testing.T) {
  function TestSnakeHeadMoveLeft (line 70) | func TestSnakeHeadMoveLeft(t *testing.T) {
  function TestChangeDirectionToNotOposity (line 79) | func TestChangeDirectionToNotOposity(t *testing.T) {
  function TestChangeDirectionToOposity (line 87) | func TestChangeDirectionToOposity(t *testing.T) {
  function TestChangeDirectionToInvalidDirection (line 95) | func TestChangeDirectionToInvalidDirection(t *testing.T) {
  function TestSnakeDie (line 103) | func TestSnakeDie(t *testing.T) {
  function TestSnakeDieWhenMoveOnTopOfItself (line 111) | func TestSnakeDieWhenMoveOnTopOfItself(t *testing.T) {

FILE: dorker/parser.go
  function parser (line 23) | func parser(buf []byte, re string) [][]string {

FILE: dorker/scrapper.go
  type Scrapper (line 27) | type Scrapper struct
    method Run (line 47) | func (s *Scrapper) Run() error {
    method Links (line 83) | func (s *Scrapper) Links() []string {
    method foo (line 91) | func (s *Scrapper) foo() {}
  function NewScrapper (line 39) | func NewScrapper(domain string, depth int) *Scrapper {

FILE: dorker/scrapper_test.go
  function TestScrapper (line 23) | func TestScrapper(t *testing.T) {}

FILE: dorker/webHandler.go
  method get (line 24) | func (d *Dorker) get(url string) ([]byte, error) {

FILE: goca.go
  constant UserAgent (line 29) | UserAgent = "The_Goca_v0.1"
  function StartTerm (line 39) | func StartTerm(input Input) {
  function StartFolder (line 75) | func StartFolder(input Input) {
  function StartScrapper (line 111) | func StartScrapper(input Input) {
  function executePlugins (line 151) | func executePlugins(typ string, ctx *Controller) {
  function getDorkers (line 167) | func getDorkers(typ string, input Input) *dorker.Dorker {
  function validFolder (line 192) | func validFolder(folder string) bool {
  function listURL (line 197) | func listURL(plugType string, urls []string) {
  type Input (line 205) | type Input struct

FILE: goca/goca.go
  constant banner (line 31) | banner = "Fear The Goca!"
  constant appName (line 32) | appName = "GOCA"
  function init (line 55) | func init() {
  function main (line 75) | func main() {
  function setLogLevel (line 203) | func setLogLevel() {

FILE: gocaTesting/testServer/server.go
  function init (line 22) | func init() {
  function main (line 29) | func main() {
  function handler (line 47) | func handler(w http.ResponseWriter, req *http.Request) {
  function extractParts (line 128) | func extractParts(req *http.Request) (string, string) {
  type Asset (line 144) | type Asset struct

FILE: gocaTesting/test_helpers.go
  type Assets (line 30) | type Assets struct
  function GetAssets (line 40) | func GetAssets(t *testing.T, ctrl goca.Manager, testserver, plugName str...

FILE: output.go
  function NewOutput (line 28) | func NewOutput() *Output {
  type Output (line 34) | type Output struct
  function processOutput (line 77) | func processOutput(module, url string, out *Output) {

FILE: plugin.go
  function RegisterPlugin (line 34) | func RegisterPlugin(name string, plugin Plugin) {
  function listPluginTypes (line 64) | func listPluginTypes() []string {
  function IsPluginTypeValid (line 73) | func IsPluginTypeValid(plugType string) bool {
  function ListPlugins (line 83) | func ListPlugins() map[string][]string {
  type Plugin (line 108) | type Plugin struct
  type SetupFunc (line 116) | type SetupFunc
  type mimeAssoc (line 118) | type mimeAssoc
    method addMIME (line 124) | func (m mimeAssoc) addMIME(typ string, mimes []string) {
    method existMime (line 132) | func (m mimeAssoc) existMime(typ, mime string) bool {
    method getAssoc (line 146) | func (m mimeAssoc) getAssoc(typ string) []string {
  function newMimeAssoc (line 120) | func newMimeAssoc() mimeAssoc {
  function PluginRecover (line 153) | func PluginRecover(plugName, funcName string) {

FILE: plugins/doc/doc.go
  constant plugName (line 30) | plugName = "doc"
  function init (line 32) | func init() {
  function setup (line 48) | func setup(m goca.Manager) error {
  type docMetaExtractor (line 55) | type docMetaExtractor struct
    method readDOC (line 59) | func (doc *docMetaExtractor) readDOC(target string, data []byte) {

FILE: plugins/doc/doc_test.go
  function TestReadDOC (line 36) | func TestReadDOC(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 63) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 99) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 135) | func validateCaseC(out *goca.Output) {

FILE: plugins/dsstore/dsStore.go
  constant plugName (line 31) | plugName = "dsstore"
  function init (line 33) | func init() {
  function setup (line 44) | func setup(m goca.Manager) error {
  function matcher (line 51) | func matcher(buf []byte) bool {
  type dsstoreMetaExtractor (line 63) | type dsstoreMetaExtractor struct
    method readDSSTORE (line 67) | func (dsstore *dsstoreMetaExtractor) readDSSTORE(target string, data [...

FILE: plugins/dsstore/dsstore_test.go
  function TestReadDSSTORE (line 36) | func TestReadDSSTORE(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 65) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 74) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 83) | func validateCaseC(out *goca.Output) {
  function validateCaseD (line 92) | func validateCaseD(out *goca.Output) {

FILE: plugins/dummy/dummy.go
  constant plugName (line 27) | plugName = "dummy"
  function init (line 32) | func init() {
  function setup (line 47) | func setup(m goca.Manager) error {
  type dummyMetaExtractor (line 59) | type dummyMetaExtractor struct
    method handler (line 64) | func (dummy *dummyMetaExtractor) handler(url string, msg []byte) {

FILE: plugins/gpx/gpx.go
  constant plugName (line 30) | plugName = "gpx"
  function init (line 32) | func init() {
  function setup (line 45) | func setup(m goca.Manager) error {
  type gpxMetaExtractor (line 52) | type gpxMetaExtractor struct
    method readGPX (line 56) | func (gpx *gpxMetaExtractor) readGPX(target string, data []byte) {

FILE: plugins/gpx/gpx_test.go
  function TestReadgpx (line 36) | func TestReadgpx(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 63) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 100) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 137) | func validateCaseC(out *goca.Output) {

FILE: plugins/image/image.go
  constant plugName (line 28) | plugName = "image"
  function init (line 30) | func init() {
  function setup (line 47) | func setup(m goca.Manager) error {
  type imgMetaExtractor (line 54) | type imgMetaExtractor struct
    method readIMG (line 58) | func (img *imgMetaExtractor) readIMG(target string, data []byte) {

FILE: plugins/mp3/mp3.go
  constant plugName (line 27) | plugName = "mp3"
  function init (line 29) | func init() {
  function setup (line 46) | func setup(m goca.Manager) error {
  type mp3MetaExtractor (line 53) | type mp3MetaExtractor struct
    method readMP3 (line 57) | func (mp3 *mp3MetaExtractor) readMP3(target string, data []byte) {

FILE: plugins/mp3/mp3_test.go
  function TestReadMP3 (line 36) | func TestReadMP3(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 61) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 157) | func validateCaseB(out *goca.Output) {

FILE: plugins/odp/odp.go
  constant plugName (line 30) | plugName = "odp"
  function init (line 32) | func init() {
  function setup (line 43) | func setup(m goca.Manager) error {
  type odpMetaExtractor (line 50) | type odpMetaExtractor struct
    method readODP (line 54) | func (odp *odpMetaExtractor) readODP(target string, data []byte) {

FILE: plugins/odp/odp_test.go
  function TestReadODP (line 36) | func TestReadODP(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 63) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 99) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 135) | func validateCaseC(out *goca.Output) {

FILE: plugins/ods/ods.go
  constant plugName (line 30) | plugName = "ods"
  function init (line 32) | func init() {
  function setup (line 43) | func setup(m goca.Manager) error {
  type odsMetaExtractor (line 50) | type odsMetaExtractor struct
    method readODS (line 54) | func (ods *odsMetaExtractor) readODS(target string, data []byte) {

FILE: plugins/ods/ods_test.go
  function TestReadODS (line 36) | func TestReadODS(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 63) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 99) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 135) | func validateCaseC(out *goca.Output) {

FILE: plugins/odt/odt.go
  constant plugName (line 30) | plugName = "odt"
  function init (line 32) | func init() {
  function setup (line 43) | func setup(m goca.Manager) error {
  type odtMetaExtractor (line 50) | type odtMetaExtractor struct
    method readODT (line 54) | func (odt *odtMetaExtractor) readODT(target string, data []byte) {

FILE: plugins/odt/odt_test.go
  function TestReadODT (line 36) | func TestReadODT(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 63) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 99) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 135) | func validateCaseC(out *goca.Output) {

FILE: plugins/pdf/pdf.go
  constant plugName (line 28) | plugName = "pdf"
  function init (line 30) | func init() {
  function setup (line 41) | func setup(m goca.Manager) error {
  type pdfMetaExtractor (line 48) | type pdfMetaExtractor struct
    method readPDF (line 52) | func (pdf *pdfMetaExtractor) readPDF(target string, data []byte) {

FILE: plugins/pdf/pdf_test.go
  function Test_readPDF (line 36) | func Test_readPDF(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 70) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 166) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 262) | func validateCaseC(out *goca.Output) {

FILE: plugins/ppt/ppt.go
  constant plugName (line 30) | plugName = "ppt"
  function init (line 32) | func init() {
  function setup (line 50) | func setup(m goca.Manager) error {
  type pptMetaExtractor (line 57) | type pptMetaExtractor struct
    method readPPT (line 61) | func (ppt *pptMetaExtractor) readPPT(target string, data []byte) {

FILE: plugins/ppt/ppt_test.go
  function TestReadPPT (line 36) | func TestReadPPT(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 63) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 99) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 135) | func validateCaseC(out *goca.Output) {

FILE: plugins/swf/swf.go
  constant plugName (line 30) | plugName = "swf"
  function init (line 32) | func init() {
  function setup (line 43) | func setup(m goca.Manager) error {
  type swfMetaExtractor (line 50) | type swfMetaExtractor struct
    method readSWF (line 54) | func (swf *swfMetaExtractor) readSWF(target string, data []byte) {

FILE: plugins/swf/swf_test.go
  function TestReadSWF (line 36) | func TestReadSWF(t *testing.T) {
  function processOutput (line 49) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 63) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 85) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 107) | func validateCaseC(out *goca.Output) {

FILE: plugins/xls/xls.go
  constant plugName (line 30) | plugName = "xls"
  function init (line 32) | func init() {
  function setup (line 50) | func setup(m goca.Manager) error {
  type xlsMetaExtractor (line 57) | type xlsMetaExtractor struct
    method readXLS (line 61) | func (xls *xlsMetaExtractor) readXLS(target string, data []byte) {

FILE: plugins/xls/xls_test.go
  function TestReadXLS (line 35) | func TestReadXLS(t *testing.T) {
  function processOutput (line 48) | func processOutput(module, url string, out *goca.Output) {
  function validateCaseA (line 62) | func validateCaseA(out *goca.Output) {
  function validateCaseB (line 98) | func validateCaseB(out *goca.Output) {
  function validateCaseC (line 134) | func validateCaseC(out *goca.Output) {

FILE: projects.go
  type ProjectStore (line 36) | type ProjectStore struct
    method NewProject (line 69) | func (ps ProjectStore) NewProject(name string) (Project, error) {
    method GetProject (line 86) | func (ps ProjectStore) GetProject(name string) (Project, error) {
    method AddScanToProject (line 102) | func (ps ProjectStore) AddScanToProject(name string, scan bson.ObjectI...
    method DeleteProject (line 124) | func (ps ProjectStore) DeleteProject(name string) error {
    method SaveScan (line 139) | func (ps ProjectStore) SaveScan(project string, output *Output) error {
    method GetScan (line 161) | func (ps ProjectStore) GetScan(id bson.ObjectID) (Scan, error) {
    method GetProjectList (line 173) | func (ps ProjectStore) GetProjectList() ([]Project, error) {
    method PrintProject (line 189) | func (ps ProjectStore) PrintProject(name string) error {
  type Project (line 40) | type Project struct
  type Scan (line 47) | type Scan struct
  function OpenProjectStore (line 55) | func OpenProjectStore() (ProjectStore, error) {
Condensed preview — 107 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,934K chars).
[
  {
    "path": ".drone.yml",
    "chars": 1148,
    "preview": "clone:\n  git:\n    image: plugins/git\n    path: /drone/src/gituhb.com/gocaio/Goca\n\npipeline:\n  test:\n    image: golang:${"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 473,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG]\"\nlabels: ''\nassignees: ''\n\n---\n\n**Describe "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 604,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[FEATURE]\"\nlabels: ''\nassignees: ''\n\n---\n\n**Is"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 1986,
    "preview": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [master]\n  pull_request:\n    # The branches below must be a subset of the bran"
  },
  {
    "path": ".gitignore",
    "chars": 1892,
    "preview": "# ---> Project stuff\n.cask/\nbuild/\n*.db\n\n# ---> Go\n# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o"
  },
  {
    "path": ".travis.yml",
    "chars": 820,
    "preview": "env:\n  - GO111MODULE=on\n\nlanguage: go\ngo:\n  - \"1.11.x\"\n  - \"1.12.x\"\n  - tip\n\nmatrix:\n  allow_failures:\n    - go: tip\n\nbe"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3345,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4552,
    "preview": "# Contributing\n\nWhen contributing to this repository, please first discuss the change you wish to make via issue.\n\nPleas"
  },
  {
    "path": "Dockerfile",
    "chars": 205,
    "preview": "FROM golang:alpine\n\nRUN apk add gcc git musl-dev && go get -u -v github.com/gocaio/goca\n\nWORKDIR /go/src/github.com/goca"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "Makefile",
    "chars": 750,
    "preview": "# Go parameters\nGOCMD=go\nGOBUILD=$(GOCMD) build\nGORUN=$(GOCMD) run\nGOCLEAN=$(GOCMD) clean\nGOTEST=$(GOCMD) test\nGOGET=$(G"
  },
  {
    "path": "README.md",
    "chars": 2499,
    "preview": "![](img/Goca_banner.png)\n\n[![](https://img.shields.io/badge/Chat-Telegram-blue.svg?style=plastic&logo=telegram)](https:/"
  },
  {
    "path": "build.sh",
    "chars": 971,
    "preview": "#!/usr/bin/env bash\n\npackage=goca/goca.go\npackage_name=goca\n\nbuildDate=$(date -R)\ngitTag=$(git describe --exact-match HE"
  },
  {
    "path": "controller.go",
    "chars": 4664,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "dorker/dork.go",
    "chars": 7605,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "dorker/dork_test.go",
    "chars": 3962,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "dorker/google.go",
    "chars": 1411,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "dorker/logger/arena.go",
    "chars": 1230,
    "preview": "package logger\n\nimport (\n\t\"math/rand\"\n\t\"time\"\n)\n\ntype arena struct {\n\tfood       *food\n\tsnake      *snake\n\thasFood    fu"
  },
  {
    "path": "dorker/logger/arena_test.go",
    "chars": 3107,
    "preview": "package logger\n\nimport \"testing\"\n\nvar pointsDouble = make(chan int)\n\nfunc newDoubleArenaWithFoodFinder(h, w int, f func("
  },
  {
    "path": "dorker/logger/coord.go",
    "chars": 48,
    "preview": "package logger\n\ntype coord struct {\n\tx, y int\n}\n"
  },
  {
    "path": "dorker/logger/food.go",
    "chars": 658,
    "preview": "package logger\n\nimport (\n\t\"math/rand\"\n\t\"os\"\n\t\"strings\"\n)\n\ntype food struct {\n\temoji        rune\n\tpoints, x, y int\n}\n\nfun"
  },
  {
    "path": "dorker/logger/food_test.go",
    "chars": 515,
    "preview": "package logger\n\nimport (\n\t\"os\"\n\t\"testing\"\n)\n\nfunc TestFoodDefaultPoints(t *testing.T) {\n\tf := newFood(10, 10)\n\n\tif f.poi"
  },
  {
    "path": "dorker/logger/game.go",
    "chars": 1651,
    "preview": "package logger\n\nimport (\n\t\"time\"\n\n\t\"github.com/nsf/termbox-go\"\n)\n\nvar (\n\tpointsChan         = make(chan int)\n\tkeyboardEv"
  },
  {
    "path": "dorker/logger/game_test.go",
    "chars": 1185,
    "preview": "package logger\n\nimport (\n\t\"testing\"\n\t\"time\"\n)\n\nfunc TestDefaultGameScore(t *testing.T) {\n\tg := NewGame()\n\n\tif g.score !="
  },
  {
    "path": "dorker/logger/keyboard.go",
    "chars": 1271,
    "preview": "package logger\n\nimport \"github.com/nsf/termbox-go\"\n\ntype keyboardEventType int\n\n// Keyboard events\nconst (\n\tMOVE keyboar"
  },
  {
    "path": "dorker/logger/keyboard_test.go",
    "chars": 895,
    "preview": "package logger\n\nimport (\n\t\"testing\"\n\n\t\"github.com/nsf/termbox-go\"\n)\n\nfunc TestKeyToDirectionDefault(t *testing.T) {\n\td :"
  },
  {
    "path": "dorker/logger/presenter.go",
    "chars": 2291,
    "preview": "package logger\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/mattn/go-runewidth\"\n\t\"github.com/nsf/termbox-go\"\n)\n\nconst (\n\tdefaultColor "
  },
  {
    "path": "dorker/logger/presenter_test.go",
    "chars": 208,
    "preview": "package logger\n\nimport \"testing\"\n\nfunc TestPresenterRendersSuccessfully(t *testing.T) {\n\tg := NewGame()\n\n\tif err := g.re"
  },
  {
    "path": "dorker/logger/snake.go",
    "chars": 1183,
    "preview": "package logger\n\nimport \"errors\"\n\n// Allowed snake movement directions\nconst (\n\tRIGHT direction = 1 + iota\n\tLEFT\n\tUP\n\tDOW"
  },
  {
    "path": "dorker/logger/snake_test.go",
    "chars": 2892,
    "preview": "package logger\n\nimport \"testing\"\n\nfunc newDoubleSnake(d direction) *snake {\n\treturn newSnake(d, []coord{\n\t\tcoord{x: 1, y"
  },
  {
    "path": "dorker/logger.go",
    "chars": 148,
    "preview": "package dorker\n\nimport (\n\t\"github.com/gocaio/goca/dorker/logger\"\n)\n\n// LogMeIn logs the scrapped files\nfunc LogMeIn() {\n"
  },
  {
    "path": "dorker/parser.go",
    "chars": 769,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "dorker/scrapper.go",
    "chars": 2121,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "dorker/scrapper_test.go",
    "chars": 650,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "dorker/webHandler.go",
    "chars": 1185,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "go.mod",
    "chars": 1905,
    "preview": "module github.com/gocaio/goca\n\nrequire (\n\tgithub.com/32bitkid/bitreader v0.0.0-20180710164922-66b707e0f706 // indirect\n\t"
  },
  {
    "path": "go.sum",
    "chars": 9142,
    "preview": "github.com/32bitkid/bitreader v0.0.0-20180710164922-66b707e0f706 h1:kaeJjKUVtEiF0+EjX9q0XPyhX6VmFJRagHU07Noxjzo=\ngithub."
  },
  {
    "path": "goca/goca.go",
    "chars": 5492,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "goca.go",
    "chars": 4996,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "gocaTesting/testData/gpx/gpx_1.gpx",
    "chars": 341537,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" creator=\"DDAAXX "
  },
  {
    "path": "gocaTesting/testData/gpx/gpx_2.gpx",
    "chars": 271571,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<gpx creator=\"StravaGPX\" version=\"1.1\" xmlns=\"http://www.topografix.com/GPX/1/1\" "
  },
  {
    "path": "gocaTesting/testData/gpx/gpx_3.gpx",
    "chars": 716644,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><gpx creator=\"Garmin Desktop App\" version=\"1.1\" xsi:schemaLocation=\"http://www.to"
  },
  {
    "path": "gocaTesting/testData/img/img_4.ps",
    "chars": 712396,
    "preview": "%!PS-Adobe-3.0\n%%Title: (lisp2002-no-background.pdf)\n%%Version: 1 3\n%%Creator: (TeX)\n%%CreationDate: (D:20021002124600)\n"
  },
  {
    "path": "gocaTesting/testData/img/img_5.ai",
    "chars": 154215,
    "preview": "%PDF-1.5\r%\r\n1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 6 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R"
  },
  {
    "path": "gocaTesting/testData/img/img_6.eps",
    "chars": 255949,
    "preview": "%!PS-Adobe-3.0 EPSF-3.0\n%%Creator: (ImageMagick)\n%%Title: (football_seal.eps)\n%%CreationDate: (Sat Apr  7 11:01:34 2007)"
  },
  {
    "path": "gocaTesting/testData/kml/kml_3.kml",
    "chars": 1697,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<kml xmlns=\"http://www.opengis.net/kml/2.2\" xmlns:ns2=\"http://ww"
  },
  {
    "path": "gocaTesting/testData/kml/lml_1.kml",
    "chars": 25951,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><kml xmlns=\"http://earth.google.com/kml/2.0\"><Folder><name>Shapefile Converter Gen"
  },
  {
    "path": "gocaTesting/testServer/server.go",
    "chars": 3466,
    "preview": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\t\"time\"\n"
  },
  {
    "path": "gocaTesting/test_helpers.go",
    "chars": 2665,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "img/Goca.xml",
    "chars": 2920,
    "preview": "<mxfile modified=\"2019-01-04T22:59:46.386Z\" host=\"www.draw.io\" agent=\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) Ap"
  },
  {
    "path": "output.go",
    "chars": 3548,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugin.go",
    "chars": 3735,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/doc/doc.go",
    "chars": 2578,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/doc/doc_test.go",
    "chars": 5225,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/dsstore/dsStore.go",
    "chars": 2789,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/dsstore/dsstore_test.go",
    "chars": 3109,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/dummy/dummy.go",
    "chars": 2273,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/gpx/gpx.go",
    "chars": 2115,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/gpx/gpx_test.go",
    "chars": 4685,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/image/image.go",
    "chars": 2402,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/mp3/mp3.go",
    "chars": 2075,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/mp3/mp3_test.go",
    "chars": 7921,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/odp/odp.go",
    "chars": 2354,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/odp/odp_test.go",
    "chars": 6185,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/ods/ods.go",
    "chars": 2352,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/ods/ods_test.go",
    "chars": 7126,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/odt/odt.go",
    "chars": 2346,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/odt/odt_test.go",
    "chars": 5853,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/pdf/pdf.go",
    "chars": 2241,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/pdf/pdf_test.go",
    "chars": 10758,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/plugins.go",
    "chars": 1090,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/ppt/ppt.go",
    "chars": 2810,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/ppt/ppt_test.go",
    "chars": 5170,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/swf/swf.go",
    "chars": 2029,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/swf/swf_test.go",
    "chars": 3447,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/xls/xls.go",
    "chars": 2763,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "plugins/xls/xls_test.go",
    "chars": 5445,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "projects.go",
    "chars": 4225,
    "preview": "/*\n\tCopyright © 2019 The Goca.io team\n\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use"
  },
  {
    "path": "scripts/deploy_to_docker.sh",
    "chars": 468,
    "preview": "#!/bin/bash\n\nif [[ \"$TRAVIS_BRANCH\" != \"master\" ]]; then\n  echo \"We're not on the master branch.\"\n  exit 0\nfi\n\nif [[ \"$T"
  }
]

// ... and 28 more files (download for full content)

About this extraction

This page contains the full source code of the gocaio/goca GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 107 files (2.6 MB), approximately 676.5k tokens, and a symbol index with 303 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!