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
================================================

[](https://t.me/GocaIO)
[](https://travis-ci.org/gocaio/goca)
[](https://github.com/gocaio/goca/issues)
[](https://github.com/gocaio/goca/tags)
[](https://golang.org/dl/)
[](https://www.apache.org/licenses/LICENSE-2.0)
[](https://github.com/gocaio/goca/blob/master/CONTRIBUTING.md)
[](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
[](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=(.*?)&sa=U&`
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>
</
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
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": "\n\n[](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.