text:
"""
.. dialect:: postgresql+psycopg2
    :name: psycopg2
    :dbapi: psycopg2
    :connectstring: postgresql+psycopg2://user:password@host:port/dbname\
[?key=value&key=value...]
    :url: http://pypi.python.org/pypi/psycopg2/

psycopg2 Connect Arguments
-----------------------------------

psycopg2-specific keyword arguments which are accepted by
:func:`.create_engine()` are:

* ``server_side_cursors``: Enable the usage of "server side cursors" for SQL
  statements which support this feature. What this essentially means from a
  psycopg2 point of view is that the cursor is created using a name, e.g.
  ``connection.cursor('some name')``, which has the effect that result rows
  are not immediately pre-fetched and buffered after statement execution, but
  are instead left on the server and only retrieved as needed. SQLAlchemy's
  :class:`~sqlalchemy.engine.ResultProxy` uses special row-buffering
  behavior when this feature is enabled, such that groups of 100 rows at a
  time are fetched over the wire to reduce conversational overhead.
  Note that the ``stream_results=True`` execution option is a more targeted
  way of enabling this mode on a per-execution basis.
* ``use_native_unicode``: Enable the usage of Psycopg2 "native unicode" mode
  per connection.  True by default.

  .. seealso::

    :ref:`psycopg2_disable_native_unicode`

* ``isolation_level``: This option, available for all PostgreSQL dialects,
  includes the ``AUTOCOMMIT`` isolation level when using the psycopg2
  dialect.

  .. seealso::

    :ref:`psycopg2_isolation_level`

* ``client_encoding``: sets the client encoding in a libpq-agnostic way,
  using psycopg2's ``set_client_encoding()`` method.

  .. seealso::

    :ref:`psycopg2_unicode`

Unix Domain Connections
------------------------

psycopg2 supports connecting via Unix domain connections.   When the ``host``
portion of the URL is omitted, SQLAlchemy passes ``None`` to psycopg2,
which specifies Unix-domain communication rather than TCP/IP communication::

    create_engine("postgresql+psycopg2://user:password@/dbname")

By default, the socket file used is to connect to a Unix-domain socket
in ``/tmp``, or whatever socket directory was specified when PostgreSQL
was built.  This value can be overridden by passing a pathname to psycopg2,
using ``host`` as an additional keyword argument::

    create_engine("postgresql+psycopg2://user:password@/dbname?host=/var/lib/postgresql")

See also:

`PQconnectdbParams <http://www.postgresql.org/docs/9.1/static\
/libpq-connect.html#LIBPQ-PQCONNECTDBPARAMS>`_

Per-Statement/Connection Execution Options
-------------------------------------------

The following DBAPI-specific options are respected when used with
:meth:`.Connection.execution_options`, :meth:`.Executable.execution_options`,
:meth:`.Query.execution_options`, in addition to those not specific to DBAPIs:

* isolation_level - Set the transaction isolation level for the lifespan of a
  :class:`.Connection` (can only be set on a connection, not a statement
  or query).   See :ref:`psycopg2_isolation_level`.

* stream_results - Enable or disable usage of psycopg2 server side cursors -
  this feature makes use of "named" cursors in combination with special
  result handling methods so that result rows are not fully buffered.
  If ``None`` or not set, the ``server_side_cursors`` option of the
  :class:`.Engine` is used.

.. _psycopg2_unicode:

Unicode with Psycopg2
----------------------

By default, the psycopg2 driver uses the ``psycopg2.extensions.UNICODE``
extension, such that the DBAPI receives and returns all strings as Python
Unicode objects directly - SQLAlchemy passes these values through without
change.   Psycopg2 here will encode/decode string values based on the
current "client encoding" setting; by default this is the value in
the ``postgresql.conf`` file, which often defaults to ``SQL_ASCII``.
Typically, this can be changed to ``utf8``, as a more useful default::

    # postgresql.conf file

    # client_encoding = sql_ascii # actually, defaults to database
                                 # encoding
    client_encoding = utf8

A second way to affect the client encoding is to set it within Psycopg2
locally.   SQLAlchemy will call psycopg2's
:meth:`psycopg2:connection.set_client_encoding` method
on all new connections based on the value passed to
:func:`.create_engine` using the ``client_encoding`` parameter::

    # set_client_encoding() setting;
    # works for *all* Postgresql versions
    engine = create_engine("postgresql://user:pass@host/dbname",
                           client_encoding='utf8')

This overrides the encoding specified in the Postgresql client configuration.
When using the parameter in this way, the psycopg2 driver emits
``SET client_encoding TO 'utf8'`` on the connection explicitly, and works
in all Postgresql versions.

Note that the ``client_encoding`` setting as passed to :func:`.create_engine`
is **not the same** as the more recently added ``client_encoding`` parameter
now supported by libpq directly.   This is enabled when ``client_encoding``
is passed directly to ``psycopg2.connect()``, and from SQLAlchemy is passed
using the :paramref:`.create_engine.connect_args` parameter::

    # libpq direct parameter setting;
    # only works for Postgresql **9.1 and above**
    engine = create_engine("postgresql://user:pass@host/dbname",
                           connect_args={'client_encoding': 'utf8'})

    # using the query string is equivalent
    engine = create_engine("postgresql://user:pass@host/dbname?client_encoding=utf8")

The above parameter was only added to libpq as of version 9.1 of Postgresql,
so using the previous method is better for cross-version support.

.. _psycopg2_disable_native_unicode:

Disabling Native Unicode
^^^^^^^^^^^^^^^^^^^^^^^^

SQLAlchemy can also be instructed to skip the usage of the psycopg2
``UNICODE`` extension and to instead utilize its own unicode encode/decode
services, which are normally reserved only for those DBAPIs that don't
fully support unicode directly.  Passing ``use_native_unicode=False`` to
:func:`.create_engine` will disable usage of ``psycopg2.extensions.UNICODE``.
SQLAlchemy will instead encode data itself into Python bytestrings on the way
in and coerce from bytes on the way back,
using the value of the :func:`.create_engine` ``encoding`` parameter, which
defaults to ``utf-8``.
SQLAlchemy's own unicode encode/decode functionality is steadily becoming
obsolete as most DBAPIs now support unicode fully.

Transactions
------------

The psycopg2 dialect fully supports SAVEPOINT and two-phase commit operations.

.. _psycopg2_isolation_level:

Psycopg2 Transaction Isolation Level
-------------------------------------

As discussed in :ref:`postgresql_isolation_level`,
all Postgresql dialects support setting of transaction isolation level
both via the ``isolation_level`` parameter passed to :func:`.create_engine`,
as well as the ``isolation_level`` argument used by
:meth:`.Connection.execution_options`.  When using the psycopg2 dialect, these
options make use of psycopg2's ``set_isolation_level()`` connection method,
rather than emitting a Postgresql directive; this is because psycopg2's
API-level setting is always emitted at the start of each transaction in any
case.

The psycopg2 dialect supports these constants for isolation level:

* ``READ COMMITTED``
* ``READ UNCOMMITTED``
* ``REPEATABLE READ``
* ``SERIALIZABLE``
* ``AUTOCOMMIT``

.. versionadded:: 0.8.2 support for AUTOCOMMIT isolation level when using
   psycopg2.

.. seealso::

    :ref:`postgresql_isolation_level`

    :ref:`pg8000_isolation_level`

NOTICE logging
---------------

The psycopg2 dialect will log Postgresql NOTICE messages via the
``sqlalchemy.dialects.postgresql`` logger::

    import logging
    logging.getLogger('sqlalchemy.dialects.postgresql').setLevel(logging.INFO)

.. _psycopg2_hstore::

HSTORE type
------------

The ``psycopg2`` DBAPI includes an extension to natively handle marshalling of
the HSTORE type.   The SQLAlchemy psycopg2 dialect will enable this extension
by default when it is detected that the target database has the HSTORE
type set up for use.   In other words, when the dialect makes the first
connection, a sequence like the following is performed:

1. Request the available HSTORE oids using
   ``psycopg2.extras.HstoreAdapter.get_oids()``.
   If this function returns a list of HSTORE identifiers, we then determine
   that the ``HSTORE`` extension is present.

2. If the ``use_native_hstore`` flag is at its default of ``True``, and
   we've detected that ``HSTORE`` oids are available, the
   ``psycopg2.extensions.register_hstore()`` extension is invoked for all
   connections.

The ``register_hstore()`` extension has the effect of **all Python
dictionaries being accepted as parameters regardless of the type of target
column in SQL**. The dictionaries are converted by this extension into a
textual HSTORE expression.  If this behavior is not desired, disable the
use of the hstore extension by setting ``use_native_hstore`` to ``False`` as
follows::

    engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test",
                use_native_hstore=False)

The ``HSTORE`` type is **still supported** when the
``psycopg2.extensions.register_hstore()`` extension is not used.  It merely
means that the coercion between Python dictionaries and the HSTORE
string format, on both the parameter side and the result side, will take
place within SQLAlchemy's own marshalling logic, and not that of ``psycopg2``
which may be more performant.

"""
from __future__ import absolute_import

import re
import logging

from ... import util, exc
import decimal
from ... import processors
from ...engine import result as _result
from ...sql import expression
from ... import types as sqltypes
from .base import PGDialect, PGCompiler, \
    PGIdentifierPreparer, PGExecutionContext, \
    ENUM, ARRAY, _DECIMAL_TYPES, _FLOAT_TYPES,\
    _INT_TYPES
from .hstore import HSTORE
from .json import JSON

logger = logging.getLogger('sqlalchemy.dialects.postgresql')

class _PGNumeric(sqltypes.Numeric):
    def bind_processor(self, dialect):
        return None

    def result_processor(self, dialect, coltype):
        if self.asdecimal:
            if coltype in _FLOAT_TYPES:
                return processors.to_decimal_processor_factory(
                    decimal.Decimal,
                    self._effective_decimal_return_scale)
            elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES:
                # pg8000 returns Decimal natively for 1700
                return None
            else:
                raise exc.InvalidRequestError(
                    "Unknown PG numeric type: %d" % coltype)
        else:
            if coltype in _FLOAT_TYPES:
                # pg8000 returns float natively for 701
                return None
            elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES:
                return processors.to_float
            else:
                raise exc.InvalidRequestError(
                    "Unknown PG numeric type: %d" % coltype)

class _PGEnum(ENUM):
    def result_processor(self, dialect, coltype):
        if util.py2k and self.convert_unicode is True:
            # we can't easily use PG's extensions here because
            # the OID is on the fly, and we need to give it a python
            # function anyway - not really worth it.
            self.convert_unicode = "force_nocheck"
        return super(_PGEnum, self).result_processor(dialect, coltype)

class _PGHStore(HSTORE):
    def bind_processor(self, dialect):
        if dialect._has_native_hstore:
            return None
        else:
            return super(_PGHStore, self).bind_processor(dialect)

    def result_processor(self, dialect, coltype):
        if dialect._has_native_hstore:
            return None
        else:
            return super(_PGHStore, self).result_processor(dialect, coltype)

class _PGJSON(JSON):

    def result_processor(self, dialect, coltype):
        if dialect._has_native_json:
            return None
        else:
            return super(_PGJSON, self).result_processor(dialect, coltype)

# When we're handed literal SQL, ensure it's a SELECT query. Since
# 8.3, combining cursors and "FOR UPDATE" has been fine.
SERVER_SIDE_CURSOR_RE = re.compile(
    r'\s*SELECT',
    re.I | re.UNICODE)

_server_side_id = util.counter()

class PGExecutionContext_psycopg2(PGExecutionContext):
    def create_cursor(self):
        # TODO: coverage for server side cursors + select.for_update()

        if self.dialect.server_side_cursors:
            is_server_side = \
                self.execution_options.get('stream_results', True) and (
                    (self.compiled and isinstance(self.compiled.statement,
                                                  expression.Selectable)
                     or
                     (
                        (not self.compiled or
                         isinstance(self.compiled.statement,
                                    expression.TextClause))
                        and self.statement and SERVER_SIDE_CURSOR_RE.match(
                            self.statement))
                     )
                )
        else:
            is_server_side = \
                self.execution_options.get('stream_results', False)

        self.__is_server_side = is_server_side
        if is_server_side:
            # use server-side cursors:
            # http://lists.initd.org/pipermail/psycopg/2007-January/005251.html
            ident = "c_%s_%s" % (hex(id(self))[2:],
                                 hex(_server_side_id())[2:])
            return self._dbapi_connection.cursor(ident)
        else:
            return self._dbapi_connection.cursor()

    def get_result_proxy(self):
        # TODO: ouch
        if logger.isEnabledFor(logging.INFO):
            self._log_notices(self.cursor)

        if self.__is_server_side:
            return _result.BufferedRowResultProxy(self)
        else:
            return _result.ResultProxy(self)

    def _log_notices(self, cursor):
        for notice in cursor.connection.notices:
            # NOTICE messages have a
            # newline character at the end
            logger.info(notice.rstrip())

        cursor.connection.notices[:] = []

class PGCompiler_psycopg2(PGCompiler):
    def visit_mod_binary(self, binary, operator, **kw):
        return self.process(binary.left, **kw) + " %% " + \
            self.process(binary.right, **kw)

    def post_process_text(self, text):
        return text.replace('%', '%%')

class PGIdentifierPreparer_psycopg2(PGIdentifierPreparer):
    def _escape_identifier(self, value):
        value = value.replace(self.escape_quote, self.escape_to_quote)
        return value.replace('%', '%%')

class PGDialect_psycopg2(PGDialect):
    driver = 'psycopg2'
    if util.py2k:
        supports_unicode_statements = False

    default_paramstyle = 'pyformat'
    # set to true based on psycopg2 version
    supports_sane_multi_rowcount = False
    execution_ctx_cls = PGExecutionContext_psycopg2
    statement_compiler = PGCompiler_psycopg2
    preparer = PGIdentifierPreparer_psycopg2
    psycopg2_version = (0, 0)

    _has_native_hstore = False
    _has_native_json = False

    colspecs = util.update_copy(
        PGDialect.colspecs,
        {
            sqltypes.Numeric: _PGNumeric,
            ENUM: _PGEnum,  # needs force_unicode
            sqltypes.Enum: _PGEnum,  # needs force_unicode
            HSTORE: _PGHStore,
            JSON: _PGJSON
        }
    )

    def __init__(self, server_side_cursors=False, use_native_unicode=True,
                 client_encoding=None,
                 use_native_hstore=True,
                 **kwargs):
        PGDialect.__init__(self, **kwargs)
        self.server_side_cursors = server_side_cursors
        self.use_native_unicode = use_native_unicode
        self.use_native_hstore = use_native_hstore
        self.supports_unicode_binds = use_native_unicode
        self.client_encoding = client_encoding
        if self.dbapi and hasattr(self.dbapi, '__version__'):
            m = re.match(r'(\d+)\.(\d+)(?:\.(\d+))?',
                         self.dbapi.__version__)
            if m:
                self.psycopg2_version = tuple(
                    int(x)
                    for x in m.group(1, 2, 3)
                    if x is not None)

    def initialize(self, connection):
        super(PGDialect_psycopg2, self).initialize(connection)
        self._has_native_hstore = self.use_native_hstore and \
            self._hstore_oids(connection.connection) \
            is not None
        self._has_native_json = self.psycopg2_version >= (2, 5)

        # http://initd.org/psycopg/docs/news.html#what-s-new-in-psycopg-2-0-9
        self.supports_sane_multi_rowcount = self.psycopg2_version >= (2, 0, 9)

    @classmethod
    def dbapi(cls):
        import psycopg2
        return psycopg2

    @util.memoized_property
    def _isolation_lookup(self):
        from psycopg2 import extensions
        return {
            'AUTOCOMMIT': extensions.ISOLATION_LEVEL_AUTOCOMMIT,
            'READ COMMITTED': extensions.ISOLATION_LEVEL_READ_COMMITTED,
            'READ UNCOMMITTED': extensions.ISOLATION_LEVEL_READ_UNCOMMITTED,
            'REPEATABLE READ': extensions.ISOLATION_LEVEL_REPEATABLE_READ,
            'SERIALIZABLE': extensions.ISOLATION_LEVEL_SERIALIZABLE
        }

    def set_isolation_level(self, connection, level):
        try:
            level = self._isolation_lookup[level.replace('_', ' ')]
        except KeyError:
            raise exc.ArgumentError(
                "Invalid value '%s' for isolation_level. "
                "Valid isolation levels for %s are %s" %
                (level, self.name, ", ".join(self._isolation_lookup))
            )

        connection.set_isolation_level(level)

    def on_connect(self):
        from psycopg2 import extras, extensions

        fns = []
        if self.client_encoding is not None:
            def on_connect(conn):
                conn.set_client_encoding(self.client_encoding)
            fns.append(on_connect)

        if self.isolation_level is not None:
            def on_connect(conn):
                self.set_isolation_level(conn, self.isolation_level)
            fns.append(on_connect)

        if self.dbapi and self.use_native_unicode:
            def on_connect(conn):
                extensions.register_type(extensions.UNICODE, conn)
                extensions.register_type(extensions.UNICODEARRAY, conn)
            fns.append(on_connect)

        if self.dbapi and self.use_native_hstore:
            def on_connect(conn):
                hstore_oids = self._hstore_oids(conn)
                if hstore_oids is not None:
                    oid, array_oid = hstore_oids
                    if util.py2k:
                        extras.register_hstore(conn, oid=oid,
                                               array_oid=array_oid,
                                               unicode=True)
                    else:
                        extras.register_hstore(conn, oid=oid,
                                               array_oid=array_oid)
            fns.append(on_connect)

        if self.dbapi and self._json_deserializer:
            def on_connect(conn):
                extras.register_default_json(
                    conn, loads=self._json_deserializer)
            fns.append(on_connect)

        if fns:
            def on_connect(conn):
                for fn in fns:
                    fn(conn)
            return on_connect
        else:
            return None

    @util.memoized_instancemethod
    def _hstore_oids(self, conn):
        if self.psycopg2_version >= (2, 4):
            from psycopg2 import extras
            oids = extras.HstoreAdapter.get_oids(conn)
            if oids is not None and oids[0]:
                return oids[0:2]
        return None

    def create_connect_args(self, url):
        opts = url.translate_connect_args(username='user')
        if 'port' in opts:
            opts['port'] = int(opts['port'])
        opts.update(url.query)
        return ([], opts)

    def is_disconnect(self, e, connection, cursor):
        if isinstance(e, self.dbapi.Error):
            # check the "closed" flag.  this might not be
            # present on old psycopg2 versions.   Also,
            # this flag doesn't actually help in a lot of disconnect
            # situations, so don't rely on it.
            if getattr(connection, 'closed', False):
                return True

            # checks based on strings.  in the case that .closed
            # didn't cut it, fall back onto these.
            str_e = str(e).partition("\n")[0]
            for msg in [
                # these error messages from libpq: interfaces/libpq/fe-misc.c
                # and interfaces/libpq/fe-secure.c.
                'terminating connection',
                'closed the connection',
                'connection not open',
                'could not receive data from server',
                'could not send data to server',
                # psycopg2 client errors, psycopg2/conenction.h,
                # psycopg2/cursor.h
                'connection already closed',
                'cursor already closed',
                # not sure where this path is originally from, it may
                # be obsolete.   It really says "losed", not "closed".
                'losed the connection unexpectedly',
                # these can occur in newer SSL
                'connection has been closed unexpectedly',
                'SSL SYSCALL error: Bad file descriptor',
                'SSL SYSCALL error: EOF detected',
            ]:
                idx = str_e.find(msg)
                if idx >= 0 and '"' not in str_e[:idx]:
                    return True
        return False

dialect = PGDialect_psycopg2

redpajama_set_name: RedPajamaGithub


Rabbi Shawn Zevit, Director of Congregational Services, Outreach and Tikkun Olam at the Jewish Reconstructionist Federation, asks Jewcology's 6th Question of the Week.
one of the most challenging environmental changes I've dealt with is the pollution and destruction that sometimes comes with development and advancement. I grew up in a suburb of DC. Long before I was born the creeks and springs around the area had become polluted, or filled in to a great extent, or even stopped up. There was a disconnect between the people and the land because of that, I think.


text:
Q: Access violation while the program was idle - not trace information to track down the bug I have a program that just popped up an AV. Until now the Eureka Log could find the source code line that generated the error but now it displays only this:
Access violation at address 7E452E4E in module 'USER32.dll'. Read of address 00000015.

Call Stack Information:
--------------------------------------------------------------------------------------------
|Address |Module          |Unit         |Class|Procedure/Method                     |Line  |
--------------------------------------------------------------------------------------------
|Running Thread: ID=2640; Priority=0; Class=; [Main]                                       |
|------------------------------------------------------------------------------------------|
|77F16A7E|GDI32.dll       |             |     |IntersectClipRect                    |      |
|7E433000|USER32.dll      |             |     |EditWndProc                          |      |
|7E42A993|USER32.dll      |             |     |CallWindowProcA                      |      |
|7E42A97D|USER32.dll      |             |     |CallWindowProcA                      |      |
|7E429011|USER32.dll      |             |     |OffsetRect                           |      |
|7E4196C2|USER32.dll      |             |     |DispatchMessageA                     |      |
|7E4196B8|USER32.dll      |             |     |DispatchMessageA                     |      |
|00625E13|Amper.exe       |Amper.DPR    |     |                                     |76[16]|
|7C915511|ntdll.dll       |             |     |RtlFindActivationContextSectionString|      |
|7C915D61|ntdll.dll       |             |     |RtlFindCharInUnicodeString           |      |
|7C910466|ntdll.dll       |             |     |RtlFreeUnicodeString                 |      |
|7C80B87C|kernel32.dll    |             |     |IsDBCSLeadByte                       |      |
|7C9113ED|ntdll.dll       |             |     |RtlDeleteCriticalSection             |      |
|7C80EEF5|kernel32.dll    |             |     |FindClose                            |      |
|7C901000|ntdll.dll       |             |     |RtlEnterCriticalSection              |      |
|7C912CFF|ntdll.dll       |             |     |LdrLockLoaderLock                    |      |
|7C9010E0|ntdll.dll       |             |     |RtlLeaveCriticalSection              |      |
|7C912D19|ntdll.dll       |             |     |LdrUnlockLoaderLock                  |      |
|7C9166C1|ntdll.dll       |             |     |LdrGetDllHandleEx                    |      |
|7C9166B3|ntdll.dll       |             |     |LdrGetDllHandle                      |      |
|7C9166A0|ntdll.dll       |             |     |LdrGetDllHandle                      |      |
|7C912A8D|ntdll.dll       |             |     |RtlUnicodeToMultiByteN               |      |
|7C912C21|ntdll.dll       |             |     |RtlUnicodeStringToAnsiString         |      |
|7C901000|ntdll.dll       |             |     |RtlEnterCriticalSection              |      |
|7C912CC9|ntdll.dll       |             |     |LdrLockLoaderLock                    |      |
|7C912CFF|ntdll.dll       |             |     |LdrLockLoaderLock                    |      |
|7C9010E0|ntdll.dll       |             |     |RtlLeaveCriticalSection              |      |
|7C912D19|ntdll.dll       |             |     |LdrUnlockLoaderLock                  |      |
|7C90CF78|ntdll.dll       |             |     |ZwAllocateVirtualMemory              |      |
|7C90CF6E|ntdll.dll       |             |     |ZwAllocateVirtualMemory              |      |
|7C9010E0|ntdll.dll       |             |     |RtlLeaveCriticalSection              |      |
|7C80BA57|kernel32.dll    |             |     |VirtualQueryEx                       |      |
|7C80BA40|kernel32.dll    |             |     |VirtualQueryEx                       |      |
|7C80BA81|kernel32.dll    |             |     |VirtualQuery                         |      |
|7C901000|ntdll.dll       |             |     |RtlEnterCriticalSection              |      |
|7C912CC9|ntdll.dll       |             |     |LdrLockLoaderLock                    |      |
|7C912CFF|ntdll.dll       |             |     |LdrLockLoaderLock                    |      |
|7C9010E0|ntdll.dll       |             |     |RtlLeaveCriticalSection              |      |
--------------------------------------------------------------------------------------------

The program was totally idle while I got the error and its window was hidden by other windows. FastMM is active and set to full debug but it indicates no memory overwrite.
Any hints about how to find the origin of this AV?

Win XP, Delphi 7

A: I don't see an EditWndProc() method in user32.dll, but Delphi has a couple -- one dealing with combobox messages and one dealing with tree views. Given MS's comctrl mess, I'd guess you have a tree view?
Check your tree view stuff. Given IntersectClipRect's parameters, it's easy to guess that it's being passed an invalid device context -- so...are you doing any custom painting for your tree view? If so, are you checking to make sure the canvas handle is ! NIL before you begin painting (try assertions if nothing else)?

A: I just wonder what's on line 76[16] in Amper.exe... That line number might be a hint of the location of the error.
Then again, when it's just happening during an idle moment then it basically happens when the system is processing Windows messages like the mouse moving, keyboard events, timer updates and a lot more.
It sometimes helps to search for the error message plus code. I've done a quick scan and found this KB from MS which suggests that this kind of error can happen when you call certain Windows API's with invalid parameters. But this KB doesn't apply to your error. Still, it gives you an idea about what to check: any Windows API call you make in your own code.
Does it also generate this exception in the IDE, while you're debugging?

A: That's what EurekaLog does when it has nothing to work with.  You need to rebuild and have the linker produce a detailed map file.  That's how it knows what to apply its stack trace to.

redpajama_set_name: RedPajamaStackExchange


text:
Q: Programmatically zooming a UIWebView without gestures - Center Point not calculated correctly The Problem
I have a UIWebView inside my iPad application which I need to zoom programmatically, but without the use of gestures/taps. The app. has a "+" and a "-" button for zooming in-and-out in user-defined increments (it is an app. for the visually impaired).
This +/- zoom-button functionality previously worked 100% fine when my app. used a UIImageView inside of a UIScrollView (instead of the WebView). The ImageView was the actual view which was zoomed, and the CenterPoint was calculated for the ScrollView's zoomToRect method.
I now have a WebView, which I know contains a ScrollView as a subview. I tried adapting the code which previously worked with the ImageView/ScrollView combo to instead zoom the WebView's ScrollView, but it is no longer calculating the CenterPoint correctly for zoomToRect:.
What Happens:
The WebView zooms correctly in-terms of the zoom-level, but the center point is always wrong. For some reason, the screen always zooms-in on the top-left every time.
Another odd problem, is that after the very first time you zoom-in, you cannot scroll in the WebView past the visible portion of the screen. If you try to, it shows a bit of the content past the bounds of the currently visible area, but it instantly snaps-back.
What I have tried:
I am trying to zoom the UIWebView's ScrollView.
I create a pointer to the ScrollView, and set "self" as its delegate. I then setup various variables, such as scrSize (the size of the view to zoom) and ZoomHandler (explained below):
- (void)viewDidLoad {
  // ... Various UIWebView setup ...
  [self LoadURL];

  // Zooming & scrollview setup
  zoomHandler = [[ZoomHandler alloc] initWithZoomLevel: ZOOM_STEP];
  scrSize = CGPointMake(self.WebView.frame.size.width, self.WebView.frame.size.height);

  scrollView = [WebView.subviews objectAtIndex:0];
  [scrollView setTag:ZOOM_VIEW_TAG];
  [scrollView setMinimumZoomScale:MINIMUM_SCALE];
  [scrollView setZoomScale:1];
  [scrollView setMaximumZoomScale:10];
  scrollView.bounces = FALSE;
  scrollView.bouncesZoom = FALSE;
  scrollView.clipsToBounds = NO;
  [scrollView setDelegate:self];

  [super viewDidLoad];
}

To override the WebView's default zooming limitations, I inject this Javascript into the loaded webpage in the webViewDidFinishLoad: method:
function increaseMaxZoomFactor() {
  var element = document.createElement('meta');
  element.name = "viewport";
  element.content = "maximum-scale=10 minimum-scale=1 initial-scale=1 user-scalable=yes width=device-width height=device-height;"
  var head = document.getElementsByTagName('head')[0];
  head.appendChild(element);
}

CenterPoint Code:
This code is used to calculate the CenterPoint to pass into zoomToRect:. This worked 100% fine when I was zooming an ImageView inside of a ScrollView.
-(IBAction)zoomOut {
    float newScale = [scrollView zoomScale] / ZOOM_STEP;
    if( [scrollView zoomScale] > MINIMUM_SCALE) {
        [self handleZoomWith:newScale andZoomType: FALSE];
    }
}

-(IBAction)zoomIn {
    float newScale = [scrollView zoomScale] * ZOOM_STEP;
    if( [scrollView zoomScale] < MAXIMUM_SCALE){
        [self handleZoomWith:newScale andZoomType: TRUE];
    }
}

-(void)handleZoomWith: (float) newScale andZoomType:(BOOL) isZoomIn {
    CGPoint newOrigin = [zoomHandler getNewOriginFromViewLocation: [scrollView contentOffset]
                                                        viewSize: scrSize andZoomType: isZoomIn];
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:newOrigin];
    [scrollView zoomToRect:zoomRect animated:YES];
}

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center {
    CGRect zoomRect;

    //  At a zoom scale of 1.0, it would be the size of the scrollView's bounds.
    //  As the zoom scale decreases, so more content is visible, the size of the rect grows.
    zoomRect.size.height = [WebView frame].size.height / scale;
    zoomRect.size.width  = [WebView frame].size.width  / scale;

    // Choose an origin so as to get the right center.
    zoomRect.origin.x = center.x / scale;
    zoomRect.origin.y = center.y / scale;

    return zoomRect;
}

/**
 Determine the origin [THIS IS INSIDE ZOOMHANDLER]
 */
-(CGPoint) getNewOriginFromViewLocation: (CGPoint) oldOrigin viewSize: (CGPoint) viewSize andZoomType:(BOOL) isZoomIn {

    // Calculate original center (add the half of the width/height of the screen)
    float oldCenterX = oldOrigin.x + (viewSize.x / 2);
    float oldCenterY = oldOrigin.y + (viewSize.y / 2);

    // Xalculate the new center
    CGPoint newCenter;
    if(isZoomIn) {
        newCenter = CGPointMake(oldCenterX * zoomLevel, oldCenterY * zoomLevel);
    } else {
        newCenter = CGPointMake(oldCenterX / zoomLevel, oldCenterY / zoomLevel);
    }

    // Calculate the new origin (deduct the half of the width/height of the screen)
    float newOriginX = newCenter.x - (viewSize.x / 2);
    float newOriginY = newCenter.y - (viewSize.y / 2);

    return CGPointMake(newOriginX, newOriginY);
}

Does anyone have any idea why the CenterPoint is not being calculated correctly? Any help would be GREATLY appreciated; I have been stuck on this for a week now.
Thanks,
Alex

A: Have you tried implementing the zoom using JavaScript rather than the UIWebView's scrollview ?
I believe you can zoom the webview by calling:
[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.zoom = 5.0;"]; (use your ZOOM_STEP as the value)
You could also calculate the center of the browser window using JS:
posY = getScreenCenterY();
posX = getScreenCenterX();

function getScreenCenterY() {
    var y = 0;
    y = getScrollOffset()+(getInnerHeight()/2);
    return(y);
}

function getScreenCenterX() {
    return(document.body.clientWidth/2);
}

function getInnerHeight() {
    var y;
    if (self.innerHeight) // all except Explorer
    {
        y = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight)
    // Explorer 6 Strict Mode
    {
        y = document.documentElement.clientHeight;
    }
    else if (document.body) // other Explorers
    {
        y = document.body.clientHeight;
    }
    return(y);
}

function getScrollOffset() {
    var y;
    if (self.pageYOffset) // all except Explorer
    {
        y = self.pageYOffset;
    }
    else if (document.documentElement &&
document.documentElement.scrollTop) // Explorer 6 Strict
    {
        y = document.documentElement.scrollTop;
    }
    else if (document.body) // all other Explorers
    {
        y = document.body.scrollTop;
    }
    return(y);
}

(source: http://sliceofcake.wordpress.com/2007/09/13/use-javascript-to-find-the-center-of-the-browser/)

A: for (UIScrollView *scroll in [myPDFView subviews]) {
  //Set the zoom level.
  [scroll setZoomScale:2.5f animated:YES];
}


text:
ETFs Holding PEBO » PEBO Split History »
Home Free Dividend Report PEBO Dividend History PEBO Historical Stock Prices Preferred Stock Newsletter PEBO Options Chain Stock Message Boards
Video: Compound Annual Growth Rate (CAGR) Definition
PEBO Historical Price Range
01/13/2020 $34.59 $34.93 $34.39 $34.91 55.30K
About Peoples Bancorp
Peoples Bancorp is a financial holding company. Co. provides a range of banking, insurance, investment and trust solutions through its financial subsidiaries. Co.'s financial products and services are provided through its financial service locations and ATMs in Ohio, West Virginia and Kentucky, as well as telephone and internet-based banking through both personal computers and mobile devices. Brokerage services are provided through an unaffiliated registered broker-dealer located at Peoples Bank's offices. Co.'s primary market area includes northeastern, central, southwestern and southeastern Ohio, west central West Virginia and northeastern Kentucky.
Peoples Bancorp (PEBO) has the following price history information. Looking back at PEBO historical stock prices for the last five trading days, on January 13, 2020, PEBO opened at $34.59, traded as high as $34.93 and as low as $34.39, and closed at $34.91. Trading volume was a total of 55.30K shares. On January 14, 2020, PEBO opened at $34.77, traded as high as $34.98 and as low as $34.68, and closed at $34.71. Trading volume was a total of 51.80K shares. On January 15, 2020, PEBO opened at $34.50, traded as high as $34.62 and as low as $34.20, and closed at $34.35. Trading volume was a total of 60.30K shares. On January 16, 2020, PEBO opened at $34.54, traded as high as $34.98 and as low as $34.53, and closed at $34.83. Trading volume was a total of 30.70K shares. On January 17, 2020, PEBO opened at $35.11, traded as high as $35.11 and as low as $34.39, and closed at $34.61. Trading volume was a total of 35.80K shares.
PEBO Historical Stock Prices By Date:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014201520162017201820192020
Below, we examine the compound annual growth rate — CAGR for short — of an investment into Peoples Bancorp shares, starting with a $10,000 purchase of PEBO, and working forward through the historical stock price information to today.
Growth of $10,000.00
With Dividends Reinvested
Start price/share: $9.59
End price/share: $34.61
Starting shares: 1,042.75
Ending shares: 1,379.16
Dividends reinvested/share: $6.68
Total return: 377.33%
Average Annual Total Return: 16.93%
Starting investment: $10,000.00
Ending investment: $47,740.54
Years: 9.99
Without Dividends Reinvested
Dividends collected/share: $6.68
PEBO Historical Closing Prices
Date Close
01/13/2020 $34.91
Financials Historical Prices
PEBO is categorized under the Financials sector; below are some other companies in the same sector:
PEI Historical Stock Prices
PEJ Historical Stock Prices
PEK Historical Stock Prices
PEO Historical Stock Prices
PEOP Historical Stock Prices
PEQ Historical Stock Prices
PER Historical Stock Prices
PERM Historical Stock Prices
PEY Historical Stock Prices
PEZ Historical Stock Prices
Also explore: PEBO shares outstanding history
PEBO Historical Stock Prices | www.HistoricalStockPrice.com | Copyright © 2013 - 2020, All Rights Reserved
Nothing in www.HistoricalStockPrice.com is intended to be investment advice, nor does it represent the opinion of, counsel from, or recommendations by BNK Invest Inc. or any of its affiliates, subsidiaries or partners. Split history database is not guaranteed to be complete or free of errors. None of the information contained herein constitutes a recommendation that any particular security, portfolio, transaction, or investment strategy is suitable for any specific person. All viewers agree that under no circumstances will BNK Invest, Inc,. its subsidiaries, partners, officers, employees, affiliates, or agents be held liable for any loss or damage caused by your reliance on information obtained. By visiting, using or viewing this site, you agree to the following Full Disclaimer & Terms of Service. Video widget and market videos powered by Market News Video. Quote and option data delayed at least 15 minutes; stock quote data powered by Ticker Technologies, and Mergent.

redpajama_set_name: RedPajamaCommonCrawl


text:
Everything You Need To Know About Our Reissue Of Method Man's 'Tical'
The Album Gets A New Reissue For Its 25th Anniversary
On June 25th 2019 » By Andrew Winistorfer
In July, members of Vinyl Me, Please Rap & Hip Hop will receive an exclusive reissue of Tical, the debut LP from Wu-Tang swordsman Method Man. Our new edition has a mirror-board cover, and comes on 180-gram bronze and black galaxy vinyl. You can read our essay about how important the album was in the arc of Wu-Tang over here, and sign up to receive it here.
Sign Up For Vinyl Me, Please Rap & Hip Hop
Tical
Sign Up By July 31 To Receive This Album
Why And How We Picked This Record
Andrew Winistorfer: This was a record that I pushed in our Record of the Month meetings, because it felt like it was almost overdue for us to do something Wu-Tang Clan-related, particularly since this will be the 23rd Record of the Month in our Rap & Hip Hop subscription. And I thought this would be the one to start with, since it was the record that introduced Wu-Tang's solo players to the mainstream. They'd done Enter the 36 Chambers, but Method Man was chosen to go solo first, because he was the one who could get mainstream folks into the sound more directly than, say, GZA could.
Plus, it feels like people don't revisit this as much as they should; it holds up better than a lot of the first run Wu solo albums. You expect it to sort of be full of the violent horrorcore-esque stuff he'd do later, but this one is a classic New York rap record, and should be as revered as Ready to Die or Uptown Saturday Night.
It also felt like there was some good symmetry with us doing our first Wu project on this, the first Wu solo album.
Cameron Schaefer: Totally. Hopefully the first of many Wu-Tang-related projects.
This one comes on 180-gram black and bronze galaxy vinyl that matches the cover really well. It really looks like smoke clouds. And the cover for this is on a similar mirror-board to the OutKast cover from last month that's super shiny. The stencil on this one is rad too; it's got the Method Man Wu logo, going to be perfect for actual graffitti. It's a good package for the album for its 25th anniversary.
Read More Record Of The Month Rap & Hip-Hop
The 10 Best Wu-Tang Clan Albums To Own On Vinyl
Throw Your Ws Up To This Method Man and Wu-Tang Clan Playlist
Method Man's 'Tical' Helped The Wu-Tang Clan Become Mainstream Mainstays


text:
Q: Where on the body are coordinates taken from? When using the GPS in Terraria your position in the world is displayed on the screen. However, it is unclear which point of the character's body the coordinates are taken from.
Looking on the wiki page for the GPS yields no result, as the coordinates system isn't even mentioned there.
Going to the far edges of a large world give X-coordinates of 8316' West and 8314' East, which suggests the X-coordinate is taken from the left hand side of the hit box. But, I still am no closer to knowing where the Y-coordinate is taken from.

A: The Y-coordinate is taken at the character's feet. The depth displayed is the same as that shown by the Depth Meter which has a note that clarifies this. In addition, you can test it yourself by standing at the boundary between "underground" and "surface", which is at 0 feet depth. The boundary is clear if you remove the dirt walls and look for the change in background, as I've done in this screenshot. (I previously stated you could simply check where the dirt walls stop, this is wrong, they extend several tiles into the underground layer.)

I didn't find any reference for lateral position, but you seem to have that figured out.


text:
Q: Valgrind: Invalid write of size 8 with a segfault So I'm working on a fairly long c code to do some data analysis. When I run it, it segfaults. I couldn't see anything obvious, so I ran it through valgrind, where I get the following:
==7136== Memcheck, a memory error detector
==7136== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==7136== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==7136== Command: ./exspec table.dat datafile_1
==7136==
Reading in table...
Obtaining rates...
Loading data from file...
==7136== Warning: set address range perms: large range [0x3a00e040,     0xaa00e040) (defined)
==7136== Warning: set address range perms: large range [0xaa00f040, 0xdc11a5e0) (defined)
==7136== Warning: set address range perms: large range [0x3a00e028, 0xaa00e058) (noaccess)
Converting units...
Computing fractions...
Calculating LOS and particle intersections...
==7136== Warning: client switching stacks?  SP change: 0xffefffc60 -->    0xffb6c81a0
==7136==          to suppress, use: --max-stackframe=59996864 or greater
==7136== Invalid write of size 8
==7136==    at 0x4040DD: get_particle_intersections (los.c:105)
==7136==    by 0x403E77: los (los.c:65)
==7136==    by 0x401236: main (main.c:73)
==7136==  Address 0xffb6c8198 is on thread 1's stack
==7136==
==7136==
==7136== Process terminating with default action of signal 11 (SIGSEGV)
==7136==  Access not within mapped region at address 0xFFB6C8198
==7136==    at 0x4040DD: get_particle_intersections (los.c:105)
==7136==  If you believe this happened as a result of a stack
==7136==  overflow in your program's main thread (unlikely but
==7136==  possible), you can try to increase the size of the
==7136==  main thread stack using the --main-stacksize= flag.
==7136==  The main thread stack size used in this run was 8388608.
==7136==
==7136== Process terminating with default action of signal 11 (SIGSEGV)
==7136==  Access not within mapped region at address 0xFFB6C8191
==7136==    at 0x4A256B0: _vgnU_freeres (in /usr/lib/valgrind/vgpreload_core-amd64-linux.so)
==7136==  If you believe this happened as a result of a stack
==7136==  overflow in your program's main thread (unlikely but
==7136==  possible), you can try to increase the size of the
==7136==  main thread stack using the --main-stacksize= flag.
==7136==  The main thread stack size used in this run was 8388608.
==7136==
==7136== HEAP SUMMARY:
==7136==     in use at exit: 840,104,888 bytes in 4 blocks
==7136==   total heap usage: 1,447 allocs, 1,443 frees, 2,720,608,224 bytes allocated
==7136==
==7136== LEAK SUMMARY:
==7136==    definitely lost: 0 bytes in 0 blocks
==7136==    indirectly lost: 0 bytes in 0 blocks
==7136==      possibly lost: 0 bytes in 0 blocks
==7136==    still reachable: 840,104,888 bytes in 4 blocks
==7136==         suppressed: 0 bytes in 0 blocks
==7136== Rerun with --leak-check=full to see details of leaked memory
==7136==
==7136== For counts of detected and suppressed errors, rerun with: -v
==7136== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Segmentation fault (core dumped)

Here's the function that it says the invalid write is in (the first part of it, anyway, as it's a bit long):
void get_particle_intersections(void)
{
   int i;
   int j;
   int tot_overlap = 0;
   int list[ngas];
   float x;
   float y;
   float z;
   float h;

       for(i = 0; i < NPIXELS; i++)
       {
          pixels[i].noverlap = 0;

          for(j = 0; j < ngas; j++)
          {
             x = (pixels[i].pos[0] - P[j].pos[0]) / CM_PER_KPC;
             y = (pixels[i].pos[1] - P[j].pos[1]) / CM_PER_KPC;
             z = (pixels[i].pos[2] - P[j].pos[2]) / CM_PER_KPC;
             h = P[j].hsml / CM_PER_KPC;

             if((pow(x, 2.0) + pow(y, 2.0) + pow(z, 2.0)) <= pow(h, 2.0))
             {
                 // Do stuff
             }
             // Do more stuff
         }
         // More stuff
     }

Line 105 is the if(pow... line.  Both pixels and P are globals whose memory is allocated elsewhere with:
if(!(pixels = calloc(NPIXELS, sizeof(PIXEL))))
{
    printf("Error, couldn't allocate memory for pixels!\n");
    exit(EXIT_FAILURE);
}

and:
if(!(P = calloc(n_gas, sizeof(DATA))))
{
    printf("Error, couldn't allocate memory for particles!\n");
    exit(EXIT_FAILURE);
}

They are declared as:
PIXEL *pixels;
DATA *P;

The pos arrays within both pixels and P are declared as:
float pos[3];

Where PIXEL and DATA are typedef structs.  The reason I'm asking is because, if the seg fault is due to the invalid write, then I don't understand the error, as nothing is being written at that line. This led me to believe that the actual error was before this line, but for whatever reason it was only flagging it at line 105.  Anyways, like I said, the code is rather long, so I haven't posted all of it, and I guess it's possible that the error is elsewhere, but since that's where the program is crashing, I just figured I would post that section. Also, this crash is occurring in the middle of the code, so there are several arrays that have been allocated but not yet freed at this point in the program.
I've looked at several of the other questions related to invalid writes on this site, and everything seems to be related to an assignment of one data type to another, or some such thing. Since valgrind was telling me the error was at the if statement, though, I figured I'd ask. Thanks, and sorry for the rather long post!
EDIT: This is the output from gdb:
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later    <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./exspec...done.
(gdb) start table.dat datafile_1
Temporary breakpoint 1 at 0x40111c: file src/main.c, line 33.
Starting program: ./exspec table.dat datafile_1

Temporary breakpoint 1, main (argc=3, argv=0x7fffffffde88) at   src/main.c:33
33     start = clock();
(gdb) b los.c:88
Breakpoint 2 at 0x403f02: file src/los.c, line 88.
(gdb) c
Continuing.
Reading in table...
Obtaining rates...
Loading data from file...
Converting units...
Computing fractions...
Calculating LOS and particle intersections...

Breakpoint 2, get_particle_intersections () at src/los.c:88
88     for(i = 0; i < NPIXELS; i++)
(gdb) n
90        pixels[i].noverlap = 0;
(gdb)
92        for(j = 0; j < ngas; j++)
(gdb)
99           x = (pixels[i].pos[0] - P[j].pos[0]) / CM_PER_KPC;
(gdb)
100          y = (pixels[i].pos[1] - P[j].pos[1]) / CM_PER_KPC;
(gdb)
101          z = (pixels[i].pos[2] - P[j].pos[2]) / CM_PER_KPC;
(gdb)
102          h = P[j].hsml / CM_PER_KPC;
(gdb)
105          if((pow(x, 2.0) + pow(y, 2.0) + pow(z, 2.0)) <= pow(h, 2.0))
(gdb)

Program received signal SIGSEGV, Segmentation fault.
0x00000000004040dd in get_particle_intersections () at src/los.c:105
105          if((pow(x, 2.0) + pow(y, 2.0) + pow(z, 2.0)) <= pow(h, 2.0))


text:
brothers killed
father kills sons
Julian and Ruben
missing brothers
Tuesday, July 9, 2013 - 08:01
Mother Ruben and Julian Thanks for Support
Iris van der Schuit, the mother of the killed brothers Ruben and Julian, posted a new message on her Facebook page in which she wants to answer the question of how she is doing. The message appeared on the eve of the birthday of Reuben who would have become 10 years on Tuesday. "I miss the big and the small things", Van der Schuit writes. "Their voices, them coming home, bringing them back and forth to sports, friends and school. Even the moments they were annoying I miss." Last Goodbye She also describes her last goodbye to her sons on May 6. "At that time their father knew this would be the last time that I would see them alive. At our last goodbye I have hugged them and told them that I love them. They both said they loved me and then I waved at them until they were out of sight." Iris van der Schuit realizes that the girlfriend of her ex-husband must have had the same experience. Cause of Death On May 7 it was reported that Ruben and Julian were missing. After several searches, Ruben and Julian were found dead on May 19, in all probability, killed by their father. Van der Schuit writes that the investigations are still pending and that the cause of death is not yet officially known. "I really only want to hear one thing about the cause of their death and that is that they did not suffer." The mother of Ruben and Julian thanks family, friends, colleagues and strangers for their support. On June 24 the ANP published an open letter written by Van der Schuit in which she also thanked everybody for their support. The letter appeared on the day that Julian would have become 8 years.
Unemployment increased slightly in December


SYNTHESIS 66 is a Loading... luxury yacht, built by Feadship and delivered in 1982. Her top speed is 14.0kn and she boasts a maximum cruising range of 3500.0nm at 12.5kn with power coming from two 575.0hp Caterpillar D379-TA diesel engines. She can accommodate up to 10 people with 9 crew members waiting on their every need.
She was designed by Frits De Voogt, and the interior design was created by Pierre Tanter.


Petra graduated with master's degree in Media and marketing in Bratislava. She has been working for five years as senior PR manager and since 2018 she is working as PR manager in League against cancer in Slovakia. As she finds PR and media field as very effective and powerful tool to spread important awareness about illness and its prevention to public, she keeps learning in oncology sphere.


text:
module Capy

class Evaluator
  include Capybara::DSL

  def initialize
    if page.driver.respond_to?(:header)
      page.driver.header(
        'user-agent',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.5 Safari/534.55.3'
      )
    end
  end

  def eval_script(script, mode, file_path = nil)
    prev_file, @current_file = @current_file, file_path if file_path
    prev_mode, @current_mode = @current_mode, mode

    case mode
    when :javascript
      javascript script
    else
      capybara script
    end
  ensure
    @current_file = prev_file if file_path
    @current_mode = prev_mode
  end

  def import(file_name)
    script_file = if @current_file
        File.join(File.dirname(@current_file), file_name)
      else
        file_name
      end

    if File.exists?(script_file)
      eval_script(File.read(script_file), @current_mode, script_file)
    else
      raise "No such file: #{script_file}"
    end
  end

  def javascript(script)
    page.evaluate_script script.sub(/\A#!.*\n/, '')
  end
  alias_method :js, :javascript

  def capybara(script)
    instance_eval script
  end

  def take_screenshot(png_path = nil)
    png_path = gen_uniq_file_name('Screen Shot', 'png') unless png_path
    case Capybara.current_driver
    when :webkit
      driver.render(png_path)
    else
      browser.save_screenshot(png_path)
    end
    png_path
  end

  def driver
    page.driver
  end

  def browser
    driver.browser
  end

  def host(app_host)
    Capybara.app_host = app_host
  end

  def stop
    Capy.start_shell(self)
  end

  private

  def gen_uniq_file_name(prefix, extension)
    file_name = "#{prefix} #{Time.now}"
    i = 2
    while File.exists?("#{file_name}.#{extension}")
      file_name = if file_name =~ /\(\d+\)$/
          file_name.sub(/\(\d+\)$/, i.to_s)
        else
          file_name + " (#{i})"
        end
      i += 1
    end
    "#{file_name}.#{extension}"
  end
end

end


On Tuesday the world's largest online poker room announced a major change in their upper management including the "promotion" of one of the longtime stalwarts in the online poker industry, Lee Jones.
Jones was acting as the Head of Home Games at PokerStars since returning to the site a few years ago –after a stint as the Cardroom Manager at Cake Poker before Black Friday—but from here on out Jones will be the Head of Poker Communications for the site.
Jones will likely have a simple transition into his new role, as he has already been acting as a spokesman for the site on the 2+2 poker forum for quite some time, and in the newly created role he will be tasked with being the go-between for the poker community and PokerStars.
Along with Jones, several other management positions have been reshuffled/created, including the site's new Head of Public Relations Michael Josem. Josem and Jones will join the current Head of Corporate Communications, Eric Hollreisser to form a powerful trio tasked with overseeing what could be one of the most important periods in online poker history, as legislation in the US moves from wishful thinking to a reality.
Jones' resume is about as impressive as it gets, considering the longtime poker player and author has been working in the online poker industry from its very earliest days. In addition to his two stints at PokerStars and successful run at Cake Poker, Jones has also worked on the European Poker Tour as well as at Cardrunners.
The third man in PokerStars new communications is the least known, Michael Josem, who was instrumental in uncovering the UB Super-User scandal that is now over five years old (where does the time go?) when he did his own investigation and plotted the data of the highly abnormal NioNio account. Thanks to his Super-User detective work, Josem has worked as security adviser for a number of online poker sites, including Full Tilt Poker and PokerStars.


text:
RevenueSA > Services & Info > Commonwealth Reporting >
Reporting Documents
Reporting Data Fields
RevenueSA Online Help
All states and territories are required to collect additional data for real property transfers to contribute to a National Register of Foreign Ownership of Land Titles. This requirement is initiated by the Commonwealth Government and administered by the Australian Tax Office (ATO) and will build on the Commonwealth's existing National Register of Foreign Ownership of Agricultural Land. The ATO uses the data for information-matching and ensuring compliance with the taxation laws of the Commonwealth.
The Lands Titles Office and RevenueSA have developed a state owned online Commonwealth Reporting Portal to collect and report the necessary data.
Access the Portal here: www.revenuesaonline.sa.gov.au
What & Why?
Federal legislation requires all states and territories to report property sales information to the Australian Taxation Office (ATO) on a quarterly basis.
Conveyancers and practitioners are requested to provide to the State the following data for each transaction related to a property sale:
property details, including land title information, property address and other descriptors;
transactional information, including transfer price, contract date and settlement date; and
Identity data of the purchaser/transferee and vendor/transferor, including:
name, address and date of birth for individuals;
name, address and ABN for non-individuals; or
foreign identity details.
The collection of this information will provide increased transparency into foreign investment and will provide the Federal Government with improved monitoring of compliance with the administration of Capital Gains Tax and other taxable events.
The ATO has longer term plans to prefill data into tax returns, reducing the burden on taxpayers to determine amounts, where data can be sourced from State reported data.
Refer to the Frequently Asked Questions page for further information.
From 1 July 2019
From 1 July 2019 both vendor and purchaser data must be completed for all reportable transactions.
Vendor data is completed via a RevenueSA Online workspace. You can either create a new workspace or you may be invited through RevenueSA Online by the purchaser's representative to enter details. The vendor's representative can commence this process at any time in the process.
If you have already been entering data for vendors, please note there are some additional mandatory fields that will also be required from 1 July 2019, including date of birth, additional information for non-Australian citizens (passport number, visa number, visa subclass and visa expiry date) and additional information for overseas organisations (country of incorporation).
Non-compliance of the provision of vendor data will be reviewed and monitored and may result in compliance activity and could also lead to RevenueSA Online system restricted access, disrupting capability to conduct business electronically with RevenueSA.
Purchaser information
From 1 July 2019, additional mandatory fields will be required for purchasers, including date of birth, additional information for non-Australian citizens (passport number, visa number, visa subclass and visa expiry date) and additional information for overseas organisations (country of incorporation).
To streamline the process in RevenueSA Online, the reporting screen for purchaser data will be integrated with the stamp duty assessment screens. A separate Commonwealth Reporting Portal workspace is no longer required before you create a stamp duty document.
You will also be able to invite the vendor's representatives to enter data for reporting requirements.
Mandatory Vendor Data
Base on law introduced with effect from 1 July 2019, mandatory vendor data is required to be provided before a reportable document conveying land can be:
confirmed in RevenueSA Online; or
assessed by RevenueSA if lodged for assessment.
From 29 July 2019, if data has not been entered for both the purchaser(s) and the vendor(s), you will not be able to obtain a Document ID. Without a Document ID you will not be able to lodge the document with the Lands Titles Office.
Purchaser Representatives
How do I ensure settlement isn't delayed?
Complete the following process at least seven (calendar) days before settlement:
Commence the stamp duty document.
Enter all mandatory reporting data for the purchaser.
Send an invite to the vendor's representative.
This will allow you to confirm your document and obtain a Document ID in time for settlement, even if the vendor mandatory reporting data has not been entered.
What happens if I don't enter mandatory reporting data and send an invitation less than seven days before settlement?
You will not be able to confirm your document and obtain a Document ID until mandatory vendor data is completed. This may delay your settlement.
Vendor Representatives
Complete all mandatory reporting data for the vendor as far in advance of settlement as possible.
What will happen if the vendor mandatory reporting data is not entered?
Purchaser's representative invites you seven or more days prior to settlement:
If the mandatory vendor reporting data is incomplete more than one day before settlement, your RevenueSA Online system access will be restricted until the mandatory reporting data has been provided.
The purchaser's representative will be able to confirm the document, obtain a Document ID and settle the transaction.
Purchaser's invites you less than seven days prior to settlement:
You must complete mandatory vendor reporting data before the purchaser's representative can confirm their document, obtain a Document ID and settle the transaction.
Invitation Process
Invite the vendor's representative by entering their details in the Entity Name List. This list contains all registered RevenueSA Stamp Duty clients. This will ensure the recipient receives an email inviting them to the process and will also be reflected in their Invites Received menu on RevenueSA Online.
Manually entering an Entity Name, rather than selecting from the list, should only be done when the recipient is not a registered RevenueSA Online Stamp Duty client, e.g. is an individual or interstate organisation. If the recipient is not in the Entity List, and you have any uncertainty, you may need contact the recipient or RevenueSA.
If you are not receiving invitations via email or the Invite Received menu please review your Current Client Name. It is possible that the inviting user is not able to find your organisation, e.g. your registered name on RevenueSA Online differs from your known business name. Providing an Additional Client Name may be advantageous.
Two help documents for the invitation process are available:
Invites Sent and Received
Help & Messages
Please note that System Help is provided on each step of the Stamp Duty Self Determination and Opinion processes.
RevenueSA provides messages of system changes, maintenance, and legislative amendments via the online message facility.


text:
The Center for Urban Pedagogy presents...
Making a change in a public space can be really complicated. You don't usually know who to talk to or who owns what! Where do you start if you want to add a bike lane, or put in a public plaza on your block?
To find out, CUP teaching artist Douglas Paulson worked with students from Big Brothers/Big Sisters of New York City and College Now at the Borough of Manhattan Community College. The group examined public spaces on their block, interviewed an MTA representative, the executive director of a nonprofit organization, and a community board member, and then created this website.
How do you change the street to have a bike lane?
How do you change the street into a pedestrian plaza?
How do you make the subway accessible to everyone?
The Center for Urban Pedagogy (CUP) is a nonprofit organization that uses the power of design and art to increase meaningful civic engagement particularly among historically under-represented communities. To find out more, visit welcometoCUP.org
City Studies is a program of the Center for Urban Pedagogy. CUP partners with public high schools and afterschool programs on project-based curricula that use design and art as tools to research the city.
Big Brothers/Big Sisters of New York City is a non profit organization whose mission is to provide children facing adversity in New York City with strong and enduring, professionally supported 1-to-1 mentoring relationships with adults that change their lives for the better, forever. To find out more, visit bigsnyc.org
College Now is a free City University of New York program designed to prepare NYC's public high school students for success in college. To find out more, visit collegenow.cuny.edu
Borough of Manhattan Community College is one of twenty-three colleges within The City University of New York, BMCC shares CUNY's mission to preserve academic excellence and extend higher educational opportunity to a diversified urban population. To find out more, visit www.bmcc.cuny.edu
CUP Teaching artist: Douglas Paulson
Project lead: Pema Domingo-Barker
Project support: Valeria Mogilevich
Big Brothers/Big Sisters of New York City Students: Brion Beaufort, Erick Cayo, Amy Ford, Marquise Mack, Aaron Modoo, Celina Muñoz, Macy Shields, Sharay Wade, and Jason Williams
Associate Program Manager, Education Initiative: Talisa Torres
Director, Education Initiative: Diana Noriega
Borough of Manhattan Community College Director, College Now: Pete Williams
Web programming: Jeff Lagasca
Thanks to our interviewees Laura Hansen, Neighborhood Plaza Partnership; Molly Hollister, Manhattan Community Board 6; Steve Scofield, Metropolitan Transportation Authority
Big thanks to Tristan Cimini, Ellen Hailey, and Stephanie Yee
Major support for this project was provided by the CUNY College Now Program. Additional funding was provided by the Bay and Paul Foundations and public funds from the New York City Department of Cultural Affairs in partnership with the City Council.
© the Center for Urban Pedagogy, 2014


text:
Football is back: Cathedral Green Wave starts season Friday night
By Patrick Murphy
NATCHEZ — The Cathedral High School Green Wave football team will travel to Waynesboro Friday to kick off the football season despite the COVID-19 pandemic.
Cathedral is the only Miss-Lou team playing a scheduled football game on Friday as both the Louisiana High School Athletic Association and Mississippi High School Activities Association pushed back the start of their seasons.
The Adams County Christian School Rebels football team is playing in a scrimmage against Madison-Ridgeland Academy in Madison on Friday.
The Midsouth Association of Independent Schools is the only association in Mississippi that did not push back their season.
The pandemic has also postponed the fall college season for the Big Ten, PAC-12, Mountain West and Southwestern Athletic Conference football conferences.
"It is crazy times but we are resilient and are looking forward to the challenge," said Chuck Darbonne, Cathedral head coach. "We are looking forward to the first game this year and staying safe. The players have been looking forward to this game."
Darbonne said the Green Wave have focused on being more efficient and having good repetitions at practices to prepare for Wayne Academy.
"We want to keep the players fresh and make sure they know their assignments on both offense and defense," Darbonne said. "We are trying to make sure they are in the right place and not thinking too much."
Two Green Wave players to watch are Noah Russ and Bryson Moore. Darbonne said Noah Russ is the starting quarterback for Cathedral.
Russ was the quarterback last year for Cathedral's junior varsity; he threw for over 15 touchdowns and 1,000 passing yards in seven games. Russ said being a quarterback is a big responsibility in which he has to know everyone's job and be a leader.
Moore is one of four offensive returning starters to the Green Wave squad. He played against Wayne Academy in the quarterfinal round, rushed for 36 yards and one rushing touchdown. Moore said if he goes full speed for every play, then he can make something happen in the game.
One of the keys to victory for the Green Wave is stopping the Jaguars' running game. Darbonne said Cathedral has practiced different defensive schemes of what Wayne Academy ran last year in the quarterfinal game.
"We have no film on them and they have no film on us for this year," Darbonne said. "Whatever they run on offense then at least we will have a sound defense to counteract."
Kickoff is set for 7 p.m. on Friday at Wayne Academy.
ACCS Lady Rebels soccer win ACCS Shootout over Laurel Lady Hawks
NATCHEZ — Adams County Christian School Lady Rebels won 2-1 in a championship soccer match over Laurel Lady Hawks at... read more


text:
HRC split with Doohan
Published: 21 January 2005 Updated: 24 November 2014
The Honda Racing Corporation has announced that Mick Doohan will not return as its General Manager in 2005.
The Australian five-times 500cc world champion's contract expired at the end of 2004. He has been linked with the Honda team since he first raced on an NSR500 in 1989. Since his retirement from racing in 1999, Doohan had been an advisor to Repsol team riders and team staff, including mentoring Valentino Rossi's move into the Blue Riband class.
The decision not to renew his contract was announced at the end of the Sepang MotoGP test session by HRC managing director Satoru Horiike. The decision is part of an overhaul of the Honda race team following the departure of Jeremy Burgess and many of Doohan's championship-winning crew to the Yamaha team at the start of the 2004 season to work with Rossi.
Other changes to the structure at HRC include the appointment of Tsutomi Ishii to general manager, Makoto Tanaka to Respol Honda team manager, and Erv Kanemoto as technical consultant to 2005 riders Max Biaggi and Nicky Hayden.
By MCN Staff


One person is in critical condition after a robot in a New Jersey Amazon warehouse punctured a can of bear repellent spray, sending concentrated capsaicin — the major ingredient in pepper spray — into the air.
Officials said 24 employees in Robbinsville Township were sent to area hospitals on Wednesday morning, while 30 more were treated at the warehouse. "All of the impacted employees have been or are expected to be released from hospital within the next 24 hours," Amazon said in a statement Wednesday night. "The safety of our employees is always our top priority and a full investigation is already underway. We'd like to thank all of the first responders who helped with today's incident."


text:
Home Updates Start-ups IITs in Delhi, Bombay Produce Highest Number Tech Entrepreneurs in India
IITs in Delhi, Bombay Produce Highest Number Tech Entrepreneurs in India
Longjam Dineshwori
In the last four years, IIT Delhi, IIT Bombay, IIT Kharagpur and BITS Pilani have produced 1,066 startups
NCR emerges as biggest startup hub with about 9,000 startups compared to 6,700 in Bengaluru
Indian Institutes of Technology (IITs) in Delhi and Bombay have produced the highest number of technology entrepreneurs in the country over the past two decades, according to analytics firm Tracxn.
IIT Delhi, IIT Bombay, IIT Kharagpur and BITS Pilani accounted for the majority of entrepreneurs in the past decade, as per data compiled by the firm.
Since 2015, the top four engineering colleges have produced 1,066 startups, compared with just 914 in the 15-year period between 2000 and 2015.
Graduates from IIT Delhi have launched 310 startups since 2015, compared with 277 and 258 for IIT Bombay and IIT Kharagpur, respectively.
BITS Pilani graduates launched 221 startups in the same period.
This data shows that more and more engineering students are now pursuing entrepreneurship soon after graduation rather than seeking employment.
Highest Funding
Among funded startups, IIT Bombay topped the list, followed by IIT Delhi and IIT Kharagpur. But in terms of successful startups, IIT Delhi again takes the lead, the study showed.
In the absence of a large number of successful exits, the funding raised by startups is considered to be a measure of success.
Startups founded by IIT Delhi graduates have raised $13.3 billion, compared with $7.6 billion for IIT Bombay, according to Tracxn.
NCR becomes the biggest startup hub
Instead of moving to Bengaluru for work, or to start their companies, IIT Delhi graduates now prefer to stay in the national capital region (NCR), which is emerging as a rival startup hub to Bengaluru.
Tracxn data shows that there are about 9,000 startups in NCR compared with 6,700 in Bengaluru.
According to Tracxn, three branches of the IIMs—Bangalore, Calcutta and Ahmedabad—also ranked among the top 10 suppliers of founders.
Source: Livemint
IIT Delhi
startup hub
technology entrepreneurs
Tracxn
Previous articleIIT-Kharagpur Rolls Out Home-Rechargeable Electric Three-Wheeler
Next articleIndian Govt, IBM Join Hands For Nationwide Train-the-Trainer Program in AI
This New Electronics & Computing Lab Aims to Equip Students with New Age Skills
Institutions Adopting AI Today May See 4 Times Increased Funding by 2021: Study
UP Govt to Employ AI Bots to Upgrade Secondary School Exam System
Indian Govt, IBM Join Hands For Nationwide Train-the-Trainer Program in AI


"LIKE NEW" 3 BEDROOM & SLEEPING LOFT 2 BATH 1,800+/- SQ. FT. CAPE-STYLE HOME (BUILT IN 2003) WITH FULL HIGH CEILING BASEMENT AND 2 CAR GARAGE & CARPORT ON 20.91 ACRES WITH PANORAMIC MOUNTAIN VIEWS. JUST 5-10 MINUTES TO BELLEAYRE MOUNTAIN & PINE HILL LAKE. LOCATED IN THE TOWN OF MIDDLETOWN, DELAWARE COUNTY. First time offered for sale, this "carefree' vinyl-sided home will allow you time to enjoy the best of what the Catskill Mountains have to offer. The 10' x 28' by 5' x 20' wraparound deck offers beautiful mountain views & serenity. Great room with pine plank cathedral ceiling & lots of glass, 2 sets of sliding glass doors to deck, gas fired heat stove, 12' x 14' kitchen area, recent new stainless appliances: 22.1' Kenmore Elite refrigerator/freezer, Frigidaire smooth-top range, Maytag dishwasher, dining area w/ sliders to views, 2 BR's : 12' x 13' & 15' x 16', full bath. UP: Pine plank paneled full bath, 14' x 17' sleeping loft, 14' x 17' BR (all BR's w/ ceiling fans), full high-ceiling basement, insulated concrete slab foundation, Samsung washer, Whirlpool dryer, utility sink, 200 amp electric service, Weil McLain oil furnace for 2-zone hot water heat plus additional heating fuel choice from outdoor Hawken Energy wood furnace, insulation wrapped 40 gallon electric hot water heater, 2 - 330 gallon oil tanks. Metal roof on both home & garage. Vinyl sided 2 car garage with Power Drive door openers, 7' x 7' wood frame fire wood storage shed. Taxes: $4,972.99 (w/ STAR & veteran's exemptions).
Though this information is deemed reliable, the providing broker cannot insure its accuracy, and is subject to errors, omissions, and prior sale.


text:
Q: Spacing around \text{} in mathmode Inspired by this question, here's my mathmode spacing bugbear.
I quite often have equations that look like this:
\begin{equation}
  \text{If}\ B_1 \succeq B_2 \ \text{and}\ B_2 \succeq B_3 \ \text{then}\ B_1 \succeq B_3
\end{equation}

Now, you might notice that before and after each bit of \text{...} there is a "normal sized space". I can't imagine why I wouldn't want that space there, but I have to add it manually. Surely this should be the default behaviour of mathmode's text macro?
Why isn't it, and how could I make it so?

A: It's not the default behavior because you don't always want space.  For instance, in your example, you don't want space before \text{If}, since that would indent your equation.  Or consider
\[ x = \begin{cases}
         1 & \text{if $f(x)$}
         0 & \text{otherwise}
       \end{cases} \]

Again, that shouldn't be spaced out.  Also, like in Caramdir's answer, I re-entered math mode within the \text, which often solves the spacing problems as well.  You could define an \stext command for spaced out text:
\newcommand*{\stext}[1]{\text{ #1 }}

(Literal spaces inside are the same as \  outside, I believe.)  Another option might be
\newcommand*{\textop}[1]{\mathbin{\text{#1}}}
\newcommand*{\textrel}[1]{\mathrel{\text{#1}}}

Then \textop{foo} would set foo as a binary operator, and \textrel{bar} would set bar as a binary relation.  I'm not sure how this spacing would look, though, but it might work for what you want.

A: If you want to introduce automatic spacing before or after \text, your best option is probably to make \text behave like an operator (\mathop), which is the closest thing to text inside math mode. The spacing introduced will be slightly smaller than normal text, but should still be acceptable. Here's the code (making sure that \text still works in text mode):
\newcommand{\textop}[1]{\relax\ifmmode\mathop{\text{#1}}\else\text{#1}\fi}

If you compare this to the respective commands \textbin and \textrel which are of type \mathbin and \mathrel (suggested in Antal's answer), you see that it works quite well in these typical uses of \text, even if the spacing is tight:

These commands also all fail at the begining of an {align} (e.g. \begin{align} & \text{...}):

(The order of each command is the same as above.)

A: It probably doesn't add space because it is harder to remove space than to add space. One possible usage is something like 3-\text{connected graphs}.
Side remark: It is also possible to write your example as
\begin{equation}
  \text{If $B_1 \succeq B_2$ and $B_2 \succeq B_3$ then $B_1 \succeq B_3$.}
\end{equation}


text:
"""
Pipeline for storing scraped triples to SIB.

See: http://doc.scrapy.org/topics/item-pipeline.html

"""
from cloudsizzle.scrapers.oodi.items import CompletedCourseItem, ModuleItem
from cloudsizzle.kp import SIBConnection, Triple, uri
from scrapy.conf import settings
from scrapy.core.exceptions import DropItem

CLOUDSIZZLE_RDF_NAMESPACE = 'http://cloudsizzle.cs.hut.fi/ontology/'
ASI_PEOPLE_RDF_NAMESPACE = 'http://cos.alpha.sizl.org/people'

class SIBPipeline(object):

    def __init__(self):
        self.asi_user_id = settings['ASI_USER_ID']
        if not self.asi_user_id:
            self.asi_user_id = raw_input('ASI User ID: ')

        self.sc = SIBConnection(method='preconfigured')
        self.sc.open()

    def __del__(self):
        if hasattr(self, 'sc'):
            self.sc.close()

    def transform_to_triples(self, item):
        if isinstance(item, CompletedCourseItem):
            subject = '{0}people/{1}/courses/completed/{2}'.format(
                CLOUDSIZZLE_RDF_NAMESPACE, self.asi_user_id, item['code'])
            user = '{0}/ID#{1}'.format(
                ASI_PEOPLE_RDF_NAMESPACE, self.asi_user_id)
            return [
                Triple(subject, 'rdf:type', 'CompletedCourse'),
                Triple(subject, 'user', uri(user)),
                Triple(subject, 'code', item['code']),
                Triple(subject, 'name', item['name']),
                Triple(subject, 'cr', item['cr']),
                Triple(subject, 'ocr', item['ocr']),
                Triple(subject, 'grade', item['grade']),
                Triple(subject, 'date', item['date'].isoformat()),
                Triple(subject, 'teacher', item['teacher'])]
        elif isinstance(item, ModuleItem):
            raise DropItem("Modules are not needed in SIB: %s" % item)

    def process_item(self, spider, item):
        triples = [triple for triple in self.transform_to_triples(item)
                   if triple.object]
        self.sc.insert(triples)
        return item


I am taking the DAT on April 5th. I am wondering what is this new calculator? Do you get a calculator or do you get one from the computer screen?
you should have read the relevant materials from the official DAT website.


This Trump supporting Minister can't be saved by the Trump Administration's Immigration policies. A Florida man proves why certain people shouldn't be allowed guns. NASA fires back at Alex Jones for his latest conspiracy theory. BREXIT isn't a winner according to the latest polling. Not dead but really stupid way to die and of course it's with a gun.