text:
#include <cassert>
#include <iostream>

#include <QApplication>
#include <QFileIconProvider>
#include <QFileInfo>
#include <QSet>
#include <QString>
#include <QStyle>
#include <QUrl>
#include <QVariant>

#include <libtransmission/transmission.h>
#include <libtransmission/bencode.h>
#include <libtransmission/utils.h> /* tr_new0, tr_strdup */

#include "app.h"
#include "prefs.h"
#include "torrent.h"
#include "utils.h"

Torrent :: Torrent( Prefs& prefs, int id ):
    magnetTorrent( false ),
    myPrefs( prefs )
{
    for( int i=0; i<PROPERTY_COUNT; ++i )
        assert( myProperties[i].id == i );

    setInt( ID, id );
    setIcon( MIME_ICON, QApplication::style()->standardIcon( QStyle::SP_FileIcon ) );
}

Torrent :: ~Torrent( )
{
}

/***
****
***/

Torrent :: Property
Torrent :: myProperties[] =
{
    { ID, "id", QVariant::Int, INFO, },
    { UPLOAD_SPEED, "rateUpload", QVariant::ULongLong, STAT } /* Bps */,
    { DOWNLOAD_SPEED, "rateDownload", QVariant::ULongLong, STAT }, /* Bps */
    { DOWNLOAD_DIR, "downloadDir", QVariant::String, STAT },
    { ACTIVITY, "status", QVariant::Int, STAT },
    { NAME, "name", QVariant::String, INFO },
    { ERROR, "error", QVariant::Int, STAT },
    { ERROR_STRING, "errorString", QVariant::String, STAT },
    { SIZE_WHEN_DONE, "sizeWhenDone", QVariant::ULongLong, STAT },
    { LEFT_UNTIL_DONE, "leftUntilDone", QVariant::ULongLong, STAT },
    { HAVE_UNCHECKED, "haveUnchecked", QVariant::ULongLong, STAT },
    { HAVE_VERIFIED, "haveValid", QVariant::ULongLong, STAT },
    { DESIRED_AVAILABLE, "desiredAvailable", QVariant::ULongLong, STAT },
    { TOTAL_SIZE, "totalSize", QVariant::ULongLong, INFO },
    { PIECE_SIZE, "pieceSize", QVariant::ULongLong, INFO },
    { PIECE_COUNT, "pieceCount", QVariant::Int, INFO },
    { PEERS_GETTING_FROM_US, "peersGettingFromUs", QVariant::Int, STAT },
    { PEERS_SENDING_TO_US, "peersSendingToUs", QVariant::Int, STAT },
    { WEBSEEDS_SENDING_TO_US, "webseedsSendingToUs", QVariant::Int, STAT_EXTRA },
    { PERCENT_DONE, "percentDone", QVariant::Double, STAT },
    { METADATA_PERCENT_DONE, "metadataPercentComplete", QVariant::Double, STAT },
    { PERCENT_VERIFIED, "recheckProgress", QVariant::Double, STAT },
    { DATE_ACTIVITY, "activityDate", QVariant::DateTime, STAT_EXTRA },
    { DATE_ADDED, "addedDate", QVariant::DateTime, INFO },
    { DATE_STARTED, "startDate", QVariant::DateTime, STAT_EXTRA },
    { DATE_CREATED, "dateCreated", QVariant::DateTime, INFO },
    { PEERS_CONNECTED, "peersConnected", QVariant::Int, STAT },
    { ETA, "eta", QVariant::Int, STAT },
    { RATIO, "uploadRatio", QVariant::Double, STAT },
    { DOWNLOADED_EVER, "downloadedEver", QVariant::ULongLong, STAT },
    { UPLOADED_EVER, "uploadedEver", QVariant::ULongLong, STAT },
    { FAILED_EVER, "corruptEver", QVariant::ULongLong, STAT_EXTRA },
    { TRACKERS, "trackers", QVariant::StringList, STAT },
    { TRACKERSTATS, "trackerStats", TrTypes::TrackerStatsList, STAT_EXTRA },
    { MIME_ICON, "ccc", QVariant::Icon, DERIVED },
    { SEED_RATIO_LIMIT, "seedRatioLimit", QVariant::Double, STAT },
    { SEED_RATIO_MODE, "seedRatioMode", QVariant::Int, STAT },
    { SEED_IDLE_LIMIT, "seedIdleLimit", QVariant::Int, STAT_EXTRA },
    { SEED_IDLE_MODE, "seedIdleMode", QVariant::Int, STAT_EXTRA },
    { DOWN_LIMIT, "downloadLimit", QVariant::Int, STAT_EXTRA }, /* KB/s */
    { DOWN_LIMITED, "downloadLimited", QVariant::Bool, STAT_EXTRA },
    { UP_LIMIT, "uploadLimit", QVariant::Int, STAT_EXTRA }, /* KB/s */
    { UP_LIMITED, "uploadLimited", QVariant::Bool, STAT_EXTRA },
    { HONORS_SESSION_LIMITS, "honorsSessionLimits", QVariant::Bool, STAT_EXTRA },
    { PEER_LIMIT, "peer-limit", QVariant::Int, STAT_EXTRA },
    { HASH_STRING, "hashString", QVariant::String, INFO },
    { IS_FINISHED, "isFinished", QVariant::Bool, STAT },
    { IS_PRIVATE, "isPrivate", QVariant::Bool, INFO },
    { IS_STALLED, "isStalled", QVariant::Bool, STAT },
    { COMMENT, "comment", QVariant::String, INFO },
    { CREATOR, "creator", QVariant::String, INFO },
    { MANUAL_ANNOUNCE_TIME, "manualAnnounceTime", QVariant::DateTime, STAT_EXTRA },
    { PEERS, "peers", TrTypes::PeerList, STAT_EXTRA },
    { TORRENT_FILE, "torrentFile", QVariant::String, STAT_EXTRA },
    { BANDWIDTH_PRIORITY, "bandwidthPriority", QVariant::Int, STAT_EXTRA },
    { QUEUE_POSITION, "queuePosition", QVariant::Int, STAT },
};

Torrent :: KeyList
Torrent :: buildKeyList( Group group )
{
    KeyList keys;

    if( keys.empty( ) )
        for( int i=0; i<PROPERTY_COUNT; ++i )
            if( myProperties[i].id==ID || myProperties[i].group==group )
                keys << myProperties[i].key;

    return keys;
}

const Torrent :: KeyList&
Torrent :: getInfoKeys( )
{
    static KeyList keys;
    if( keys.isEmpty( ) )
        keys << buildKeyList( INFO ) << "files";
    return keys;
}

const Torrent :: KeyList&
Torrent :: getStatKeys( )
{
    static KeyList keys( buildKeyList( STAT ) );
    return keys;
}

const Torrent :: KeyList&
Torrent :: getExtraStatKeys( )
{
    static KeyList keys;
    if( keys.isEmpty( ) )
        keys << buildKeyList( STAT_EXTRA ) << "fileStats";
    return keys;
}

bool
Torrent :: setInt( int i, int value )
{
    bool changed = false;

    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::Int );

    if( myValues[i].isNull() || myValues[i].toInt()!=value )
    {
        myValues[i].setValue( value );
        changed = true;
    }

    return changed;
}

bool
Torrent :: setBool( int i, bool value )
{
    bool changed = false;

    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::Bool );

    if( myValues[i].isNull() || myValues[i].toBool()!=value )
    {
        myValues[i].setValue( value );
        changed = true;
    }

    return changed;
}

bool
Torrent :: setDouble( int i, double value )
{
    bool changed = false;

    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::Double );

    if( myValues[i].isNull() || myValues[i].toDouble()!=value )
    {
        myValues[i].setValue( value );
        changed = true;
    }

    return changed;
}

bool
Torrent :: setDateTime( int i, const QDateTime& value )
{
    bool changed = false;

    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::DateTime );

    if( myValues[i].isNull() || myValues[i].toDateTime()!=value )
    {
        myValues[i].setValue( value );
        changed = true;
    }

    return changed;
}

bool
Torrent :: setSize( int i, qulonglong value )
{
    bool changed = false;

    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::ULongLong );

    if( myValues[i].isNull() || myValues[i].toULongLong()!=value )
    {
        myValues[i].setValue( value );
        changed = true;
    }

    return changed;
}

bool
Torrent :: setString( int i, const char * value )
{
    bool changed = false;

    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::String );

    if( myValues[i].isNull() || myValues[i].toString()!=value )
    {
        myValues[i].setValue( QString::fromUtf8( value ) );
        changed = true;
    }

    return changed;
}

bool
Torrent :: setIcon( int i, const QIcon& value )
{
    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::Icon );

    myValues[i].setValue( value );
    return true;
}

int
Torrent :: getInt( int i ) const
{
    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::Int );

    return myValues[i].toInt( );
}

QDateTime
Torrent :: getDateTime( int i ) const
{
    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::DateTime );

    return myValues[i].toDateTime( );
}

bool
Torrent :: getBool( int i ) const
{
    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::Bool );

    return myValues[i].toBool( );
}

qulonglong
Torrent :: getSize( int i ) const
{
    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::ULongLong );

    return myValues[i].toULongLong( );
}
double
Torrent :: getDouble( int i ) const
{
    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::Double );

    return myValues[i].toDouble( );
}
QString
Torrent :: getString( int i ) const
{
    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::String );

    return myValues[i].toString( );
}
QIcon
Torrent :: getIcon( int i ) const
{
    assert( 0<=i && i<PROPERTY_COUNT );
    assert( myProperties[i].type == QVariant::Icon );

    return myValues[i].value<QIcon>();
}

/***
****
***/

bool
Torrent :: getSeedRatio( double& ratio ) const
{
    bool isLimited;

    switch( seedRatioMode( ) )
    {
        case TR_RATIOLIMIT_SINGLE:
            isLimited = true;
            ratio = seedRatioLimit( );
            break;

        case TR_RATIOLIMIT_GLOBAL:
            if(( isLimited = myPrefs.getBool( Prefs :: RATIO_ENABLED )))
                ratio = myPrefs.getDouble( Prefs :: RATIO );
            break;

        default: // TR_RATIOLIMIT_UNLIMITED:
            isLimited = false;
            break;
    }

    return isLimited;
}

bool
Torrent :: hasFileSubstring( const QString& substr ) const
{
    foreach( const TrFile file, myFiles )
        if( file.filename.contains( substr, Qt::CaseInsensitive ) )
            return true;
    return false;
}

bool
Torrent :: hasTrackerSubstring( const QString& substr ) const
{
    foreach( QString s, myValues[TRACKERS].toStringList() )
        if( s.contains( substr, Qt::CaseInsensitive ) )
            return true;
    return false;
}

int
Torrent :: compareSeedRatio( const Torrent& that ) const
{
    double a;
    double b;
    const bool has_a = getSeedRatio( a );
    const bool has_b = that.getSeedRatio( b );
    if( !has_a && !has_b ) return 0;
    if( !has_a || !has_b ) return has_a ? -1 : 1;
    if( a < b ) return -1;
    if( a > b ) return 1;
    return 0;
}

int
Torrent :: compareRatio( const Torrent& that ) const
{
    const double a = ratio( );
    const double b = that.ratio( );
    if( (int)a == TR_RATIO_INF && (int)b == TR_RATIO_INF ) return 0;
    if( (int)a == TR_RATIO_INF ) return 1;
    if( (int)b == TR_RATIO_INF ) return -1;
    if( a < b ) return -1;
    if( a > b ) return 1;
    return 0;
}

int
Torrent :: compareETA( const Torrent& that ) const
{
    const bool haveA( hasETA( ) );
    const bool haveB( that.hasETA( ) );
    if( haveA && haveB ) return getETA() - that.getETA();
    if( haveA ) return 1;
    if( haveB ) return -1;
    return 0;
}

int
Torrent :: compareTracker( const Torrent& that ) const
{
    Q_UNUSED( that );

    // FIXME
    return 0;
}

/***
****
***/

void
Torrent :: updateMimeIcon( )
{
    const FileList& files( myFiles );

    QIcon icon;

    if( files.size( ) > 1 )
        icon = QFileIconProvider().icon( QFileIconProvider::Folder );
    else if( files.size( ) == 1 )
        icon = Utils :: guessMimeIcon( files.at(0).filename );
    else
        icon = QIcon( );

    setIcon( MIME_ICON, icon );
}

/***
****
***/

void
Torrent :: notifyComplete( ) const
{
    // if someone wants to implement notification, here's the hook.
}

/***
****
***/

void
Torrent :: update( tr_benc * d )
{
    bool changed = false;
    const bool was_seed = isSeed( );
    const uint64_t old_verified_size = haveVerified( );

    for( int  i=0; i<PROPERTY_COUNT; ++i )
    {
        tr_benc * child = tr_bencDictFind( d, myProperties[i].key );
        if( !child )
            continue;

        switch( myProperties[i].type )
        {
            case QVariant :: Int: {
                int64_t val;
                if( tr_bencGetInt( child, &val ) )
                    changed |= setInt( i, val );
                break;
            }

            case QVariant :: Bool: {
                bool val;
                if( tr_bencGetBool( child, &val ) )
                    changed |= setBool( i, val );
                break;
            }

            case QVariant :: String: {
                const char * val;
                if( tr_bencGetStr( child, &val ) )
                    changed |= setString( i, val );
                break;
            }

            case QVariant :: ULongLong: {
                int64_t val;
                if( tr_bencGetInt( child, &val ) )
                    changed |= setSize( i, val );
                break;
            }

            case QVariant :: Double: {
                double val;
                if( tr_bencGetReal( child, &val ) )
                    changed |= setDouble( i, val );
                break;
            }

            case QVariant :: DateTime: {
                int64_t val;
                if( tr_bencGetInt( child, &val ) && val )
                    changed |= setDateTime( i, QDateTime :: fromTime_t( val ) );
                break;
            }

            case QVariant :: StringList:
            case TrTypes :: PeerList:
                break;

            default:
                assert( 0 && "unhandled type" );
        }
    }

    tr_benc * files;

    if( tr_bencDictFindList( d, "files", &files ) ) {
        const char * str;
        int64_t intVal;
        int i = 0;
        myFiles.clear( );
        tr_benc * child;
        while(( child = tr_bencListChild( files, i ))) {
            TrFile file;
            file.index = i++;
            if( tr_bencDictFindStr( child, "name", &str ) )
                file.filename = QString::fromUtf8( str );
            if( tr_bencDictFindInt( child, "length", &intVal ) )
                file.size = intVal;
            myFiles.append( file );
        }
        updateMimeIcon( );
        changed = true;
    }

    if( tr_bencDictFindList( d, "fileStats", &files ) ) {
        const int n = tr_bencListSize( files );
        for( int i=0; i<n && i<myFiles.size(); ++i ) {
            int64_t intVal;
            bool boolVal;
            tr_benc * child = tr_bencListChild( files, i );
            TrFile& file( myFiles[i] );
            if( tr_bencDictFindInt( child, "bytesCompleted", &intVal ) )
                file.have = intVal;
            if( tr_bencDictFindBool( child, "wanted", &boolVal ) )
                file.wanted = boolVal;
            if( tr_bencDictFindInt( child, "priority", &intVal ) )
                file.priority = intVal;
        }
        changed = true;
    }

    tr_benc * trackers;
    if( tr_bencDictFindList( d, "trackers", &trackers ) ) {
        const char * str;
        int i = 0;
        QStringList list;
        tr_benc * child;
        while(( child = tr_bencListChild( trackers, i++ ))) {
            if( tr_bencDictFindStr( child, "announce", &str )) {
                dynamic_cast<MyApp*>(QApplication::instance())->favicons.add( QUrl(QString::fromUtf8(str)) );
                list.append( QString::fromUtf8( str ) );
            }
        }
        if( myValues[TRACKERS] != list ) {
            myValues[TRACKERS].setValue( list );
            changed = true;
        }
    }

    tr_benc * trackerStats;
    if( tr_bencDictFindList( d, "trackerStats", &trackerStats ) ) {
        tr_benc * child;
        TrackerStatsList  trackerStatsList;
        int childNum = 0;
        while(( child = tr_bencListChild( trackerStats, childNum++ ))) {
            bool b;
            int64_t i;
            const char * str;
            TrackerStat trackerStat;
            if( tr_bencDictFindStr( child, "announce", &str ) ) {
                trackerStat.announce = QString::fromUtf8( str );
                dynamic_cast<MyApp*>(QApplication::instance())->favicons.add( QUrl( trackerStat.announce ) );
            }
            if( tr_bencDictFindInt( child, "announceState", &i ) )
                trackerStat.announceState = i;
            if( tr_bencDictFindInt( child, "downloadCount", &i ) )
                trackerStat.downloadCount = i;
            if( tr_bencDictFindBool( child, "hasAnnounced", &b ) )
                trackerStat.hasAnnounced = b;
            if( tr_bencDictFindBool( child, "hasScraped", &b ) )
                trackerStat.hasScraped = b;
            if( tr_bencDictFindStr( child, "host", &str ) )
                trackerStat.host = QString::fromUtf8( str );
            if( tr_bencDictFindInt( child, "id", &i ) )
                trackerStat.id = i;
            if( tr_bencDictFindBool( child, "isBackup", &b ) )
                trackerStat.isBackup = b;
            if( tr_bencDictFindInt( child, "lastAnnouncePeerCount", &i ) )
                trackerStat.lastAnnouncePeerCount = i;
            if( tr_bencDictFindStr( child, "lastAnnounceResult", &str ) )
                trackerStat.lastAnnounceResult = QString::fromUtf8(str);
            if( tr_bencDictFindInt( child, "lastAnnounceStartTime", &i ) )
                trackerStat.lastAnnounceStartTime = i;
            if( tr_bencDictFindBool( child, "lastAnnounceSucceeded", &b ) )
                trackerStat.lastAnnounceSucceeded = b;
            if( tr_bencDictFindInt( child, "lastAnnounceTime", &i ) )
                trackerStat.lastAnnounceTime = i;
            if( tr_bencDictFindBool( child, "lastAnnounceTimedOut", &b ) )
                trackerStat.lastAnnounceTimedOut = b;
            if( tr_bencDictFindStr( child, "lastScrapeResult", &str ) )
                trackerStat.lastScrapeResult = QString::fromUtf8( str );
            if( tr_bencDictFindInt( child, "lastScrapeStartTime", &i ) )
                trackerStat.lastScrapeStartTime = i;
            if( tr_bencDictFindBool( child, "lastScrapeSucceeded", &b ) )
                trackerStat.lastScrapeSucceeded = b;
            if( tr_bencDictFindInt( child, "lastScrapeTime", &i ) )
                trackerStat.lastScrapeTime = i;
            if( tr_bencDictFindBool( child, "lastScrapeTimedOut", &b ) )
                trackerStat.lastScrapeTimedOut = b;
            if( tr_bencDictFindInt( child, "leecherCount", &i ) )
                trackerStat.leecherCount = i;
            if( tr_bencDictFindInt( child, "nextAnnounceTime", &i ) )
                trackerStat.nextAnnounceTime = i;
            if( tr_bencDictFindInt( child, "nextScrapeTime", &i ) )
                trackerStat.nextScrapeTime = i;
            if( tr_bencDictFindInt( child, "scrapeState", &i ) )
                trackerStat.scrapeState = i;
            if( tr_bencDictFindInt( child, "seederCount", &i ) )
                trackerStat.seederCount = i;
            if( tr_bencDictFindInt( child, "tier", &i ) )
                trackerStat.tier = i;
            trackerStatsList << trackerStat;
        }
        myValues[TRACKERSTATS].setValue( trackerStatsList );
        changed = true;
    }

    tr_benc * peers;
    if( tr_bencDictFindList( d, "peers", &peers ) ) {
        tr_benc * child;
        PeerList peerList;
        int childNum = 0;
        while(( child = tr_bencListChild( peers, childNum++ ))) {
            double d;
            bool b;
            int64_t i;
            const char * str;
            Peer peer;
            if( tr_bencDictFindStr( child, "address", &str ) )
                peer.address = QString::fromUtf8( str );
            if( tr_bencDictFindStr( child, "clientName", &str ) )
                peer.clientName = QString::fromUtf8( str );
            if( tr_bencDictFindBool( child, "clientIsChoked", &b ) )
                peer.clientIsChoked = b;
            if( tr_bencDictFindBool( child, "clientIsInterested", &b ) )
                peer.clientIsInterested = b;
            if( tr_bencDictFindStr( child, "flagStr", &str ) )
                peer.flagStr = QString::fromUtf8( str );
            if( tr_bencDictFindBool( child, "isDownloadingFrom", &b ) )
                peer.isDownloadingFrom = b;
            if( tr_bencDictFindBool( child, "isEncrypted", &b ) )
                peer.isEncrypted = b;
            if( tr_bencDictFindBool( child, "isIncoming", &b ) )
                peer.isIncoming = b;
            if( tr_bencDictFindBool( child, "isUploadingTo", &b ) )
                peer.isUploadingTo = b;
            if( tr_bencDictFindBool( child, "peerIsChoked", &b ) )
                peer.peerIsChoked = b;
            if( tr_bencDictFindBool( child, "peerIsInterested", &b ) )
                peer.peerIsInterested = b;
            if( tr_bencDictFindInt( child, "port", &i ) )
                peer.port = i;
            if( tr_bencDictFindReal( child, "progress", &d ) )
                peer.progress = d;
            if( tr_bencDictFindInt( child, "rateToClient", &i ) )
                peer.rateToClient = Speed::fromBps( i );
            if( tr_bencDictFindInt( child, "rateToPeer", &i ) )
                peer.rateToPeer = Speed::fromBps( i );
            peerList << peer;
        }
        myValues[PEERS].setValue( peerList );
        changed = true;
    }

    if( changed )
        emit torrentChanged( id( ) );

    if( !was_seed && isSeed() && (old_verified_size>0) )
        emit torrentCompleted( id( ) );
}

QString
Torrent :: activityString( ) const
{
    QString str;

    switch( getActivity( ) )
    {
        case TR_STATUS_STOPPED:       str = isFinished() ? tr( "Finished" ): tr( "Paused" ); break;
        case TR_STATUS_CHECK_WAIT:    str = tr( "Queued for verification" ); break;
        case TR_STATUS_CHECK:         str = tr( "Verifying local data" ); break;
        case TR_STATUS_DOWNLOAD_WAIT: str = tr( "Queued for download" ); break;
        case TR_STATUS_DOWNLOAD:      str = tr( "Downloading" ); break;
        case TR_STATUS_SEED_WAIT:     str = tr( "Queued for seeding" ); break;
        case TR_STATUS_SEED:          str = tr( "Seeding" ); break;
    }

    return str;
}

QString
Torrent :: getError( ) const
{
    QString s = getString( ERROR_STRING );

    switch( getInt( ERROR ) )
    {
        case TR_STAT_TRACKER_WARNING: s = tr( "Tracker gave a warning: %1" ).arg( s ); break;
        case TR_STAT_TRACKER_ERROR: s = tr( "Tracker gave an error: %1" ).arg( s ); break;
        case TR_STAT_LOCAL_ERROR: s = tr( "Error: %1" ).arg( s ); break;
        default: s.clear(); break;
    }

    return s;
}

QPixmap
TrackerStat :: getFavicon( ) const
{
    MyApp * myApp = dynamic_cast<MyApp*>(QApplication::instance());
    return myApp->favicons.find( QUrl( announce ) );
}

redpajama_set_name: RedPajamaGithub


text:
Julian Harris
Senior Partner
Julian co-founded Harris Hagan with John Hagan in May 2004. He came to specialise in this sector representing the Gaming Board for Great Britain (the then British regulator) for five years early in his career.
Specialising in all aspects of online and land-based gambling law, and with over 30 years' experience of gambling law, Julian is recognised as a leading gambling lawyer by operators, suppliers and regulators throughout the world. He advises many of the world's largest land-based and online gambling businesses (B2C and B2B), as well as many start-ups, investors and leading law firms. Julian has extensive gambling legal, regulatory and licensing experience advising on legal classification, non-remote and remote operating licence applications, casino competitions and premises licensing, personal applications, change of corporate control applications, transaction due diligence, corporate investments and transactions, complex group restructuring and the rationalisation of group licences. He also has extensive compliance and enforcement experience advising on general compliance and reporting requirements, compliance assessments, regulatory investigations, corporate evaluations, operating and personal licence reviews and developing associated remedial compliance programmes and action plans. Julian has also advised a number of government and regulatory authorities on the drafting of gambling legislation (primary and secondary).
In his spare time, Julian enjoys vintage cars, vintage wines, photography and shooting.
Education & admissions
Magdalene College, Cambridge, 1977
Law Society of England & Wales, 1980
Band 1, Chambers Global 2021
Band 1, Chambers UK 2021
Hall of Fame, The Legal 500 2021
Star Individual, Chambers Global 2020
Leading Individual, The Legal 500 2020
London-based Julian Harris offers a wealth of experience advising a broad range of operators and regulators on complex international gaming and gambling law issues. Chambers Global 2021
"Julian has a wealth of experience and is able to guide clients through complex issues; he is particularly skilful at creating solutions which are designed to provide an effective business framework going forward." Chambers UK 2021
"a heavyweight veteran in the field." The Legal 500 2021
"Highly experienced" The Legal 500 2020
"Julian Harris's knowledge in the UK market is highly regarded and he is the go-to option for this field." The Legal 500 2020
"Draws wide-ranging praise as "amazing," "phenomenal" and "a legend" in the field." Chambers Global 2020
"Extremely good at dealing with regulators" Chambers UK 2019
"Very widely respected" Chambers UK 2018
"A legend in the business" Chambers UK 2017
International Association of Gaming Advisors (President, 2012/13 and present Counsellor)
International Masters of Gaming Law
Joint editor, Chambers Global Practice Guide to Gambling
Co-author of UK chapter, Chambers Global Practice Guide to Gambling
Joint editor, Thomson Reuters Practical Law Global Guide to Gaming Law
Co-author of UK chapter, Thomson Reuters Practical Law Global Guide to Gaming Law

redpajama_set_name: RedPajamaCommonCrawl


It never was my plan to get into television.
I like a real beach. A crowded one, you know? People, towels, umbrellas. I hate those little private strips of sand you see up in Malibu.
The idea that you would not only exercise but that you would enjoy it is very difficult for me to understand. I just hate it.
I know there are, like, 12 rules for late night: a desk, a band. Will people take me seriously if I don't wear a tie?


Catching up on work today still, so here's a quick "color" on yesterday's Caster after doing a messy value study. I'd still like to properly color it when I have the time.
I slept for about 9 hours and I only got up to do this. Good night.
Drew this in five minutes because I'll be out for more than a day. Don't miss me too much.
These were surprisingly pretty annoying to render. I have one, which was useful for reference, though I had to improvise the lighting to make it look better.


text:
Q: Combine two sklearn pipelines into one I have a text preprocessing Pipeline:
pipe = Pipeline([
  ('count_vectorizer', CountVectorizer()),
  ('chi2score', SelectKBest(chi2, k=1000)),
  ('tfidf_transformer', TfidfTransformer(norm='l2', use_idf=True)),
])

and I want to perform cross validation on a pipeline with multiple estimators. This is a solution that is working, but honestly I don't really like it. There should be a better way to do it. Maybe somehow convert the Pipeline to a transformer?
pipe_nb = Pipeline([*pipe.steps, ('naive_bayes', MultinomialNB())])

That's an approach that I perceive as an ideal one, but unfortunately it does not merge steps into new pipeline and causes issues.
pipe_nb = make_pipeline(
  pipe,
  MultinomialNB()
)

How to merge two pipelines into one, in a nice pythonic way?

A: Why do not simply append a new step into pipe.steps rather than to recreate a new one?
pipe.steps.append(('naive_bayes', MultinomialNB()))
print(pipe)

# Output
Pipeline(steps=[('count_vectorizer', CountVectorizer()),
                ('chi2score', SelectKBest(k=1000, score_func=1)),
                ('tfidf_transformer', TfidfTransformer()),
                ('naive_bayes', MultinomialNB())])

Or:
# Don't forget the *
pipe2 = make_pipeline(*pipe, MultinomialNB())
print(pipe2)

# Output
Pipeline(steps=[('countvectorizer', CountVectorizer()),
                ('selectkbest', SelectKBest(k=1000, score_func=1)),
                ('tfidftransformer', TfidfTransformer()),
                ('multinomialnb', MultinomialNB())])

redpajama_set_name: RedPajamaStackExchange


text:
The yellow pages of blockchain has arrived: Networks are now visible to the world
In the 1830s the first Yellow Pages emerged as an organized directory of businesses. This had a profound effect on commerce and is an often-overlooked key contribution to the Industrial Revolution. Simply put, the Yellow Pages put businesses on the map and made them known to the world. Without it, a business was hidden and only visible to those who knew about it via invitation.
Similarly, in the late 1990s ICANN became the coordinator of several directories including the Domain Name System (DNS) that is central to launching the internet and the world wide web, by uniquely listing businesses names and address, thereby transforming them to publicly addressable and digitally interactable entities. We think blockchain is the third major wave of network technology (phone, internet, blockchain). But we were missing something, up until now.
Today, I am proud and excited to announce that we have joined the HACERA Unbounded Registry as a founding member. As the number of blockchain consortiums, networks and applications continues to grow we need a means to list them and make them known to the world, in order to unleash the power of blockchain. The Unbounded Registry, built on blockchain technology, provides a decentralized means to register, look up, join and transact across a variety of blockchain solutions, built to interoperate with all of today's popular distributed ledger technologies, including The Linux Foundation's Hyperledger Fabric, Hyperledger Sawtooth, EEA Quorum, Stellar Network and more.
What makes a private network private, or a public network public? Well, most private networks are unlisted. Unbounded gives these network solutions a change to be in the "yellow pages of blockchain," and be publicly visible. As a founding member of several consortiums and a technology provider for others, we are frequently asked questions such as, "As a supplier, how can I join the TradeLens trade digitization blockchain," and "What capabilities does LedgerConnect provide?". . Also, "Is the True Tickets network running, and how do I list a new event?" — by the way… the answer is yes, it's running. With Unbounded, a solution user is one step closer to answering their questions themselves.
Since IBM began our blockchain journey, we have been committed to the development and use of open technologies. We realized from the start that you cannot do blockchain on your own; you need a vibrant community and ecosystem of like-minded innovators who share the vision of helping to transform the way companies conduct business in the global economy. We initially joined Hyperledger, and contributed the initial code for Fabric, to collaborate on blockchain for business, then the Sovrin Foundation for decentralized identity and we have also participated in the Stellar network for global payments.
IBM and HACERA have been working closely on blockchain technology for a while. HACERA was one of the first members of the IBM Blockchain ecosystem — going back to 2016 — including the HACERA and IBM release-managed Hyperledger Fabric 1.0 a year ago.
We see HACERA's Unbounded Registry providing several key capabilities that addressed these common problems:
Reserved naming for networks, applications and consortiums.
The discoverability of blockchain networks and applications.
A catalogue of domain-specific functions and services.
An independent, open and shared blockchain backed platform to help us all with bootstrapping, launching and growing our communities.
By working with HACERA and other members of Unbounded Registry, we see a future where consumers and providers of blockchain services will be able to discover each other and begin transacting in a more secure way and where technology providers and consumers can innovate and integrate to create limitless and unbounded possibilities.
Cross-posted here
Explore the HACERA Unbounded Registry Now


text:
Why Is Every NASCAR Car Different, But Also The Same
There are numerous hobbies that sporting activities bettors have apart from sporting activities betting. Lots of want participating in at an on-line casino, but some also really like watching NASCAR races. There are refined distinctions in the autos that take part in NASCAR, inspite of the truth that just about every vehicle that races in NASCAR is expected to adhere to stringent requirements.
When inventory car or truck racing to start with started off in the 1940s, motorists would buy their autos straight from dealerships without the need of producing any changes. They would use the exact automobiles that ordinary people in their communities were being driving at the time. 1948 was the calendar year that observed the start of NASCAR. The the greater part of early racing courses had been manufactured of dust. That's why the firm permitted modifications to the autos to raise their longevity.
There has been a constant maximize in the selection of permitted modifications above the a long time, which has led to a gradual improvement in the all round overall performance of the autos. The only significant variation between today's NASCAR autos is uncovered in their respective engines and human body shells.
Every single car is similar in just about every respect, such as in its overarching style and design, its tires, suspensions, fuelling units, electrical parts, and gearbox. At the instant, there are 3 distinct brands who make automobiles for the NASCAR series:
Every of these companies is obligated to deliver NASCAR with its engine layout for the function of obtaining approval. Next-Gen Autos, also acknowledged as Gen-7s, are used in all NASCAR competitions. These race cars were formulated to make inventory cars a lot more carefully resemble motor vehicles that are permitted to be pushed on general public streets. The yr 2022 noticed the very first implementation of this style as a sample.
Every automobile entered in a NASCAR race have to comply with a stringent set of guidelines and rules or operate the danger of currently being disqualified, fined, or penalized details. The racing groups are permitted to reuse certain elements, and there is sizeable leeway for transform in some factors.
For instance, the engine's block and cylinder heads may perhaps be remade in just a range of individual tolerances in purchase to improve the engine's functionality. All engines are required to have a V8 displacement of 358 cubic inches (5.86 liters) and a horsepower output of 750 in order to comply with the quantitative specs for the motor.
The current horsepower polices that NASCAR has in location cap production at 670 horsepower about the the vast majority of circuits and 510 horsepower on superspeedways. Because of the stringent regulations that are in put, the performance of just about every motor is virtually similar. Since NASCAR doesn't permit teams to use turbocharged engines, not a solitary car or truck in the heritage of the sport has ever competed with just one.
In purchase to make sure that all motorists and car or truck types are competing on an equal enjoying field, NASCAR adopted a template termed the Future-Gen racing car. The chassis, which serves as the basis for the racecar, is incorporated in the template, and steel tube welding is employed to end out the skeleton of the car.
The teams will upcoming affix their individual system shells to the chassis, utilizing entrance splitters, side skirts, and rear fascias that are distinctive to the manufacturer. This will give each individual car or truck its have unique glance while still trying to keep the subject as a entire uniform in terms of its overall style. This document serves as a guideline that all NASCAR race motor vehicles must comply with in purchase to be licensed for competitors.
The racing series recognized as NASCAR normally takes put on a vast variety of tracks, every of which might be laid up in a range of various ways. The teams employ a wide range of many aerodynamic configurations, from time to time acknowledged as "packages," dependent on which a single increases their dealing with the most on a given monitor.
On quick tracks, chassis configurations with best speeds that are lessen and turning radiuses that are more compact will be favored, when on for a longer period tracks, vehicles with peak speeds that are better will be most popular. The vehicles employed on short tracks are engineered to have an too much sum of downforce in buy to strengthen friction and the driver's ability to continue to keep the car or truck on the observe through a speedy or incredibly limited bend.
Impression Supply: Russell LaBounty / NKP / LAT Images
Posted in Autos Used CarTagged #Car #NASCAR
Why the Land Cruiser is Toyota's Biggest Mistake
Wed Oct 26 , 2022
Over the past 20 years, the Land Cruiser has been Toyota's biggest mistake. Today let's pretend we know better than the marketing team of Toyota by having a look at what they've done wrong and why sales in markets like the US have plummeted. To understand this, we need to […]
What Are the Leading Causes of Car Accidents in Nevada?
Complete Insurance – Is a Thorough Auto Insurance policy Policy Proposed?
Used car buyers turn to even older vehicles to save a buck amid rising prices
Shopping For A Used Car? So Is Your Local Car Dealership
Window Store with Car and Driver
Us citizens Trying to keep Cars and trucks Lengthier Than Ever Amid File Charges


text:
Q: Insert Query in ASP.Net a and c variable's errorNot inserting properly, Invalid column or can't convert to char from int if I add '' to it. Also Hardcoding a value in the string makes it work there.
" and ' have been tried..
            int a = Convert.ToInt32(TextBox1.Text);
            int c = Convert.ToInt32(TextBox3.Text);

            string a3 = a.ToString();
            string c3 = c.ToString();

            string a2 = TextBox1.Text;
            string c2 = TextBox3.Text;

            int i1 = 77;
            int i2 = 5;

            string b = TextBox2.Text;
            string d = TextBox4.Text;
            string ee = TextBox5.Text;
            string f = TextBox6.Text;
            string g = TextBox7.Text;
            string h = TextBox8.Text;

            //RETRIVE VALUES FROM CURRENT BOXES
            //(Id,Username,Age,Gender,Contact,Email,City,Password)
            string update = dbhelper.ExecuteScalar("INSERT INTO
            dbo.UserDetails VALUES(a,'b',c,'d','ee','f','g','h') ");

            Action_Performed.Text = "User Details Updated Successfully";

A: You could solve it by doing something like this, important to use SQL parameters to avoid sql injection through your inputs;
string sql =  "INSERT INTO UserDetails(a,b,c) VALUES(@a,@b,@c)";

using (SqlConnection connection = new SqlConnection(connectionString))
{
   connection.Open();
   SqlCommand command = new SqlCommand(queryString, connection);
   command.Parameters.AddWithValue("@a", a);
   command.Parameters.AddWithValue("@b", b);
   command.Parameters.AddWithValue("@c", c);
   command.ExecuteNonQuery();
}


text:
We need to fight to abolish capitalism and the state, and have a fundamental systematic change to be in collective control of our own lives
After many nights of demonstrations and revolts in the America due to the killing of George Floyd, president Trump, from a bunker in the White House, announced that he would designate "Antifa" as a terrorist organization. Trump seeks to frame a spontaneous and manifold movement as an organization, not only assigning it an ideology but also a functionality that is hierarchical and in consonance with state logic.
Once again, terrorism is used as an alibi for the criminalization of wide sectors of our collective struggle, which at the same time completely exceed "anti-fascism". But beyond denouncing and fighting against the repressive advance that this signifies, it's necessary to reject the polarization that is sought to be introduced at the heart of the struggle.
Also here in the UK people have been standing and kneeling in solidarity with demonstrators in America.
There have been Black Lives Matter anti-racism protests all over the UK (and globally), not just massive ones in the centre of many major cities but many hundreds of very localised protests involving hundreds of thousands of people. In Haringey alone in the last few weeks black and white residents and campaigners have held over 25 protests ranging from 'take the knee' gatherings in local streets, to a number of larger BLM events in parks often attracting hundreds of people, to a 2,000-strong kids walk against racism organised by parents. This massive grassroots upsurge of anger and solidarity is exposing and demanding an end to widespread institutional racism and forcing the authorities onto the defensive everywhere.
But in the UK the working classes and BAME communities have been suffering for years under austerity, the brutality of police, discrimination, inequality, homelessness, cuts and suspensions of benefits, and more. All these widen the gap between rich and poor. Poorer people shouldn't tolerate anymore. We need some serious changes – and we need more than just demonstrations, which the state can easily deal with. Likewise petitions, lobbying and MP's debating racism in parliament have changed nothing. Because of this people have no choice but to take matters into their own hands and bring about change through things like, amongst others, direct action. We in HSG support and offer our solidarity to people in UK who use direct action and direct democracy as ways to resolve all our problems rather than relying on political parties and the failed bureaucratic parliamentary system.
While reformists advocate the ballot box and the liberals have their lobbying and their letter writing, bureaucrats claim to work through "the proper channels" and leftists have their vanguard parties –we as anarchists, libertarians, radical socialist, have always supported direct action as a way to bring about change.
Direct action, for example, like pulling down the hated statue in Bristol. There was a campaign which for years tried peaceful and "establishment" ways to remove the statue – all to no effect. By using direct action, the images went viral around the world and now removal of racist "hero's" is happening all over. If the State really listened to us and cared what was being said these statues would have been removed years ago. They didn't, so people decided to take things into their own hands.
This shows that we don't need to beg the state for our rights but organising together, without relying on the state, we can address and solve our problems here and now.
Direct action is the means of creating a new consciousness, a means of self-liberation from the chains placed around our minds, emotions and spirits by hierarchy and oppression.


text:
8 Superheroes That Deserve Their Own Game
Posted on June 15, 2017 by Andrew Loeschner	Leave a comment
Insomniac's Spider-Man provided an impressive close to the Sony press conference at E3 not only because, well, it's pretty epic but also because it's not often we get superhero games that don't . . . how do I say it . . . suck. And part of the reason so many superhero games aren't great is because certain characters make the job more difficult. It's incredibly hard to do a Superman game well when you have a character who's literally invincible, has super strength, and can fly everywhere. So what comic book characters from DC and Marvel would actually adapt well to the gaming industry?
Frank Castle/Punisher
The Punisher presents the perfect opportunity for a third-person shooter with a massive arsenal and vehicles. It could be the GTA of superhero games in that there would be a wealth of options as to what could be done in the world. And his straddling of the hero/villain line would allow for really cool story options and even the possibility of past actions and decisions setting up future scenarios. Distinguishing it from other shooters of a similar caliber might be difficult, but if done correctly, and with a compelling story, a Punisher game could easily be a beautiful, brutal, and absolutely fun game to experience.
Wolverine's had his fair share of movies, that's for sure. But what about games? Logan showed us an emotional side of the character that often got lost in the grand scale "save the world" type scenarios. But at the same time those grand scenarios are pretty epic. A game developer could easily choose to make a Wolverine game that focuses on one of those two kinds of arcs. And, let's be honest, Wolverine represents my favorite heroic trope of the badass loner who has a heart deep down. Like the Punisher, there's a lot of potential for compelling stories (not to mention tons of awesome side characters), and he's a grounded enough character that building a combat system for him wouldn't be impossible.
With Anthem announced it looks like there's a spot in the market for badasses in exosuits . . . or cyborgs. Victor Stone is a character rarely touched on in film or games, and the struggle of retaining humanity while being largely machine is a struggle many of us would like to witness. It could definitely make for, say it with me now, a compelling story. Not to mention that the game would have the potential to be a philosophical analysis of the role of technology in a world where we grow ever dependent on it. . . . . And blowing stuff up with an arm cannon would be awesome!
Wait, hear me out. Picture a puzzle game reminiscent of Portal, but featuring the magician instead. Time manipulation would be an awesome feature in a puzzle game, and combat could likely be included too. I don't picture this game being so much a AAA open world title as much as a smaller game aimed more at a specific niche of gamers.
Some speculation has gone around that Rocksteady's next title might be a game featuring the master archer himself. While there's no evidence to back this up, it's definitely a cool idea. Aspects of the Arkham games could be incorporated (stealth and combat primarily) along with features and a story that make the game unique to the character (archery anyone?). With potential for side characters like Black Canary and villains like Deathstroke, a Green Arrow game is definitely doable. The challenge would most likely be finding a way to set it distinctly apart from the Arkham series.
Similar to the upcoming Spider-Man, but at the same time fundamentally different. A Daredevil game would give the high flying feel of a superhero game while at the same time being intensely grounded into a much darker and gritty world than Spider-Man is likely to get into. The combat opportunities would be massive and the ability to have a different mode of "vision" that resembles the blurred hearing from the show would definitely set the game apart from its peers. Not to mention, it would tie in well with a Punisher game.
And we're back to cyborgs and exosuits. We saw flying mechanics in Anthem that looked similar to what we'd want in an Iron Man game. Now with Tony Stark's smart-mouthed charisma to boot, an Iron Man game would be loads of fun. Particularly in an open world setting like New York City. The gameplay likely wouldn't be groundbreaking, but the story opportunities and the sheer exhilaration of playing as the popular hero would be enough for us.
Not exactly from DC or Marvel, but Teenage Mutant Ninja Turtles have been popular for a long, long time. We've gotten everything from comic books and cartoons to full-fledged live action movies. And, sure, we've gotten video games. But none of those games have captured the full potential of what a Ninja Turtles game could do. With unique combat abilities and styles for each turtle, not to mention the starkly different personalities, there's a huge opportunity for anyone willing and able to capitalize on a franchise that so many hold near and dear to their hearts.
tagged with Cyborg, Daredevil, Dr. Strange, Green Arrow, Iron Man, List, Opinion Piece, Punisher, Superheroes, Teenage Mutant Ninja Turtles, Wolverine


text:
Манастир Влајковац је манастир Српске православне цркве у Епархији банатској који се налази близу Вршца, у истоименом селу.

Историја
Храм је подигнут 1872. године и по благослову Епископа вршачког осветио га је окружни протопрозвитер Филип Трандафиловић. Храм је посвећен Светом Великомученику Димитрију.

Године 1965. храм је обновљен од стране мештана Влајковца. Иконостас у храму је зидан, а иконе су урађене на платну и рад су непознатог иконописца 19. века. По благослову Његовог Преосвештенства Епископа банатског Г.Г. Никанора од 2008. године парохијски храм постаје манастирски храм посвећен Светом Великомученику Димитрију. Српска парохија у овом месту основана је 1872. године што нам сведоче матичне књиге на румунском језику у румунском парохији.

Галерија

Види још
 Списак манастира Српске православне цркве

Референце

Спољашње везе

 Храм светог Димитрија
 Комунистички злочини над србским свештеницима 1944. године

Манастири Епархије банатске
Православни манастири
Град Вршац

redpajama_set_name: RedPajamaWikipedia


Northeastern Auto Supply, Inc. has been a family owned business since 1956. The owners have each worked on the parts counter for over 35 years, so you are guaranteed consistent, knowledgeable service every day. Check out our About Us page for more information.
Saturday : 8:00 a.m. - 2:00 p.m.


Alcohol Policy Project Director, Center for Science in the Public InterestGeorge Hacker heads the Center for Science in the Public Interest's Alcohol Policy Project. He chairs the Coalition for the Prevention of Alcohol Problems, an organization that conducts anti-alcohol lobbying on the federal level.
Hacker argues in favor of the whole panoply of neo-prohibitionist restrictions on alcohol: higher taxes, restricted marketing, big warning labels, lower legal blood-alcohol content for driving, more restrictive zoning, etc., etc.


There is a lot to be said about what the U.K. is experiencing right now in the midst of trying to wrap up a Brexit deal. A crisis of their own doing undoubtedly, but a crisis nonetheless.
The intricacies and nuances of how we arrived here are too complex for this article but suffice it to say that the path is fascinating and the manner in which it will be recalled by history, depends of course on the result of these next few weeks.
My fascination is not with Brexit per se, but with the way this is unfolding from the perspective of the underlying psychology of the establishment and dynamic of the moment as it reflects fundamental values, so if you're reading this to see number predictions on how many jobs will be lost and how much of a beating the pound will take or whether or not this will dissolve in international conflict, this piece will disappoint.
As the co-founder of a pan-European company who lived and worked in several countries, I get asked a lot how is it that I feel about Brexit so let me be clear.
I am: a remainer who bemoaned the 2016 vote as not only the grave mistake that it was, but a personal affront; a huge believer in the need for a strong democracy who shudders at the dramedy in the cabinet today; a liberal (the classic European flavor not the U.S. one) and, seemingly unconnected but actually crucially – a doer and an optimist.
While I would have loved it if we weren't here, we are, and while outraged at the price tag, I would like to see this moved from an agonizing backlog to the "done" column of Britain's imaginary Kanban board.
Personally, I am not panicked about either talent or investment which should be the main themes on any European entrepreneur's mind, because I believe we're underestimating how very global we have become and more importantly, because my hopeful meritocracy takes over, and I know that Britain will still hold so much undeniable value that all the practicalities of exporting or importing it shall be resolved.
Very few people, -irrespective of what their demagoguery dictates they must say in press conferences- believe there is any "IF" attached to Brexit anymore.
It's clear to all that it is now about the "HOW". The disingenuous rhetoric around stopping the freight train ought to be sanctioned by the electorate when the time comes, as it's immature, insulting, and costing the establishment valuable time in executing in the best interest of the people.
Both the direction and the person executing it having been set directly by the people of this country, and it is this execution we must be focused on, in lieu of the panic or the disengaged ill will.
Many years ago I briefly worked in politics for the campaign of a European party. At the time, with my youth goggles on, I couldn't examine the underlays of machination nor did I really care to, because their messaging was feeding my idealistic hunger.
On reflection today, I wonder if, despite what Hollywood would have us believe, there is much to be said for this occult, well-orchestrated "game of politics" where dark interests are being meticulously followed and every move carefully calculated.
Something tells me that, just in the same way that large organizations have an inner life of their own that dictates the way they react as a unit above what is explainable by structure, politics too is less about evil intentionality and more about accident and the way a collection of disparate egos and agendas collude in the context of the job to be done.
Its nebulous and often dramatic inner workings displayed in front of the public's hungry eyes are what keeps us all fascinated and hooked on the circus.
The three pillars of Knowledge, Passion and Courage that our company preaches to large organizations are undeniably the mandatory ingredients to constructing a successful enterprise with a strong culture of invested people, but are they needed in running a country?
I would argue they are. One of them is clear. Politicians overall don't lack passion. Whatever we think of their decisions and beliefs, they hold them dearly and can afford to be manifestly emotionally invested in them, they don't need to excuse their brand affiliation as their love for their country is a sine qua non condition of the job.
When it comes to knowledge we can argue how much or how little of it is demonstrated and whether or not facts are selectively employed in favor of serving a certain argument as has been happening on the Brexit affair but it's accessible and by and large, present.
But what about courage. Who has it, who displays it and who defines what bravery looks like in politics?
The impetus behind the vote in 2016 was motivated by a lack of knowledge. Nonetheless, the vote, misguided as I feel it was, was a –rare- expression of extreme passion, most people voted with their heart.
What we see now is a strong expression of the last element: courage. A PM cornered by wolves who is beautifully holding her own and following her conviction that irrespective of the cost, she has a task to fulfill to the best of her abilities which have been re-invested in her by the people of Britain 18 months ago.
I've never been a Theresa May fan, before this, I had rational faith in her ability to execute but wasn't particularly emotionally invested in her as a person so her strength and poise now have come as a welcomed surprise.
This time that she is going through, irrespective of the end result is a life lesson in dignity and resilience that I hope we capture so we use it in our arsenal of examples of teaching our kids, in particular, our girls, grit, and elegance that transcends gender fear and hold-backs.
Lastly, this is ultimately about a nation's personal financial literacy. The British people are finding out that there is a monetary and emotional cost to upholding your principles and if those principles have hardly been examined and were loosely held, to begin with, the price is astronomical.


Mark your calendar so you can attend and network with your fellow County Attorneys.
Fee Includes: All training sessions, handouts, and meals for the registrant.
Paid registrations will be refunded in full if cancellation is received at least 72 hours before the program; if less than 72 hours, a $45 administration fee will be deducted.
Special Hotel Rate Information: Participants are responsible for obtaining and paying for their own lodging. A block of rooms has been reserved at the Hilton Minneapolis/St. Paul Airport—Mall of America at the special rate of $132.00 per night. Call the hotel directly at 952-854-2100 or 800-445-8667. Be sure to request the MN County Attorneys rate. Reservations must be made by November 13, 2018, to ensure the special $132 rate.
If you wish to register by web, click here to be taken to the MCAA registration page.
Application will be made for 11.50 Standard CLE and 1.50 Elimination of Bias CLE Credits.
Download a copy of the agenda.
2:15 p.m. - 3:45 p.m.


text:
Massachusetts 2023
Subscribe to Massachusetts 2023
By David Stauss on January 22, 2023
Posted in Hawaii 2023, Indiana 2023, Iowa 2023, Kentucky 2023, Maryland 2023, Massachusetts 2023, Mississippi 2023, New Jersey 2023, New York 2023, Oklahoma 2023, Oregon 2023, State privacy legislation, Tennessee 2023, Texas 2023, Virginia 2023, Washington 2023, West Virginia 2023
Keypoint: It was another busy week with lawmakers introducing consumer privacy bills in Hawaii, Indiana, Massachusetts and New York, biometric privacy bills in Hawaii and New York, and a health data privacy bill in Massachusetts.
Below is the second weekly update on the status of proposed state privacy legislation in 2023. Before we get to our update, we wanted to provide two reminders.
First, as in past years, we will be regularly updating our State Privacy Law Tracker map with links to the consumer data privacy bills. We encourage you to bookmark the page for easy reference.
Second, the contents provided below are time-sensitive and subject to change. If you are not already subscribed to our blog, consider doing so to stay updated. If you are interested in tracking developments between blog posts, consider following on LinkedIn and/or Twitter.…
Continue Reading Proposed State Privacy Law Update: January 23, 2023


This is a nice product! I like the size and shape of this, it is like a slightly large paperback book, and has lots of slots for lipsticks and other items. It also includes a mirror, and opens flat to display all items and makes them easy to reach. The case itself is under $20, and I also purchased extra"envelopes" (under $10) to be able to carry more stuff. Also, CCB-Paris customer service is great.
This is a great cheaper alternative to Trish type planners. It is silver pleather and has a ring binder type contraption inside. They provide one plastic baggie type holder, you can purchase three more (two more plastic, and one mesh) for 8.00. It also has places to secure lipsticks, liners, lipliners, mascaras, etc on the sides. A mirror is also on the inside, so it is a perfect cheap makeup organizer. Well worth the money.


Description: 007 PSP Video Converter can convert all video formats to PSP movie and music. It is really easy to use for novices and professionals. The 007 PSP Video Converter supports all most of formats on the internet such as AVI, WAV, MPEG, RM, DIVX, MOV, ASF, etc. Except for that, it also can convert these videos to audio files such as PSP AVC, MP3, WMA, PSP MPEG-4, etc.


text:
Reigning Ironman World Champs Will Escape From Alcatraz
Pete Jacobs and Leanda Cave will highlight the 2013 Escape from Alcatraz field.
Photo: Rocky Arroyo
Reigning Ironman world champions Pete Jacobs and Leanda Cave will highlight the 2013 Escape from Alcatraz field. The pair will take on tough fields, with several Olympic-distance specialists making the start. American Andy Potts and Cave will be the ones to beat at the March 3 race. Potts will be looking for his sixth Alcatraz title, while Cave will be going after her fifth.
Other top athletes making the start include Javier Gomez (ESP), Sara Groff (USA), Ricarda Lisk (GER), Matt Reed (USA), Annabel Luxford (AUS), Graham O'Grady (NZL), Jesse Thomas (USA) and Becky Lavelle (USA).
"Having the current Ironman champions both competing this year is sure to intensify the level of competition among the pro field," said IMG Senior Vice President James Leitz. "This is an extremely impressive list of athletes, which will create some serious excitement at this year's race."
Athletes will take on a 1.5 mile swim from Alcatraz Island to the shore, an 18-mile bike race and an 8-mile run through San Francisco. Water and weather conditions are expected to be cooler than usual because the race is taking place a full three months earlier than usual to accommodate the 34th America's Cup (a yacht event).
See the complete pro start list (as of Jan. 24) below:
Josh Amberger (Australia)
Andrew Bauer (United States of America)
Eric Clarkson (United States of America)
John Dahlz (United States of America)
Tom Eickelberg (United States of America)
Brian Fleischmann (United States of America)
Javier Gomez (Spain)
Henry Hagenbuch (United States of America)
Pete Jacobs (Australia
Kyle Leto (United States of America)
Matt Lieto (United States of America)
Paul Matthews (Australia)
Dan Meehan (United States of America)
Edo van der Meer (New Zealand)
Graham O'Grady (New Zealand)
Jason Pedersen (United States of America)
Andy Potts (United States of America)
Branden Rakita (United States of America)
Matt Reed (United States of America)
Jesse Thomas (United States of America)
Lauren Brandon (United States of America)
Leanda Cave (Great Britain)
Emily Cocks (United States of America)
Jenny Fletcher (United States of America)
Lauren Goss (United States of America)
Sarah Groff (United States of America)
Heather Jackson (United States of America)
Becky Lavelle (United States of America)
Emma-Kate Lidbury (Great Britain)
Ricarda Lisk (Germany)
Jen Luebke (United States of America)
Annabel Luxford (Australia)
Liz Lyles (United States of America)
Sara McLarty (United States of America)
Jenna Parker (United States of America)
Kristen Peterson (United States of America)
Marcy Schmidt (Canada)
Charissa Wernick (United States of America)
PHOTOS: 2012 Escape From Alcatraz Triathlon
Commentary: The World Championship That Everyone Forgets?
4 Pros Pull Back The Curtain on Their Data Screens
Recalled: When XTERRA Triathlon Got Its Start


text:
Couldn't make it to Philly? Explore future events.
About SB
Activities & Excursions
Fashion Giants Lining Up with Science-Based Targets
Sustainable Brands Staff
As Levi Strauss moves forward with its industry-leading climate action strategy, PUMA and Burberry are following suit with SBTi-approved science-based targets of their own.
Levi Strauss partners with IFC to reduce emissions, water use in textile factories
In 2018, Levi Strauss set a high bar for the fashion industry when it announced a new climate action strategy, complete with aggressive science-based targets to reduce carbon emissions throughout its entire global supply chain, not just its owned-and-operated facilities, by 2025. Now, the apparel brand has announced the latest step in the strategy — a cooperation agreement with International Finance Corporation (IFC), a member of the World Bank Group, that will help the company meet its corporate sustainability objectives to reduce greenhouse gas emissions (GHGs) and water use in its supply chain.
IFC will work with 42 designated LS&Co. suppliers and mills in 10 countries to identify and implement appropriate renewable energy and water-saving interventions that will reduce greenhouse gas emissions. The work — which will take place in Pakistan, Bangladesh, Sri Lanka, India, Mexico, Lesotho, Colombia, Turkey, Egypt and Vietnam — will incorporate IFC's Partnership for Cleaner Textiles approach for reducing resource consumption and wastewater pollution. IFC and LS&Co. are jointly contributing to the costs for implementing the agreement.
IFC will assess supplier and mill facilities to identify actions that can be taken to catalyse substantial environmental benefits — including reduced emissions, improved water efficiency and wider adoption of renewable energy supply options. As the largest global development institution, with deep sectoral and wide regional expertise, IFC is well placed to provide support to this important and necessary initiative.
"Levi's strong commitment to sustainability makes it an ideal partner for IFC," said Tomasz Telma, senior director of manufacturing, agribusiness and services at IFC. "This cooperation agreement shows how IFC can deliver advisory and investment products that help our partners strengthen the sustainability of their supply chains."
The global textiles, apparel and footwear industry is a major driver of industrialization and economic growth in many countries, employing 60 million people, the majority of them women. But the industry also contributes as much as 8 percent of total GHGs and uses sizable amounts of water in the cotton farming and textile production phases.
"We are thrilled to be partnering with the IFC to help achieve our science-based climate targets and benefit our vendors and their communities," said Liz O'Neill, EVP of global product and supply chain at LS&Co. "We hope this program can also benefit others in the apparel industry and help reduce our collective footprint."
In 2017, IFC and LS&Co. launched a pilot cooperation agreement that helped six LS&Co. suppliers in four countries — Bangladesh, India, Sri Lanka and Vietnam — cut their carbon footprint by 19 percent and reduce energy and water consumption, leading to significant savings in operating costs. IFC has also been working with LS&Co. to provide financial incentives for garment suppliers in developing countries to upgrade environmental, health and safety and labor performance through its Global Trade Supplier Finance program.
"Across the corporate world, people are waking up to the fact that better sustainability performance drives better business performance," said Michael Kobori, LS&Co.'s VP of Sustainability. "Vendors in resource-stressed countries have shown the ability to innovate based on conditions on the ground, but in some cases, they need some assistance to make it work. This program provides that assistance, which benefits not just those companies, but also people living in those communities, as well as LS&Co."
Get New & Updates About New Metrics '19
Learn more about the preeminent conference on sustainability metrics, taking place November 18-20 in Philadelphia.
Burberry announces science-based targets
Image credit: Burberry
After last year's PR nightmare, when it admitted to incinerating millions of dollars in unsold merchandise, Burberry appears to be turning over a new leaf this year — with the release of its 2022 Responsibility Strategy and two new, ambitious climate goals approved by the Science Based Target initiative (SBTi):
Reduce absolute scope 1 and 2 emissions (from direct operations) 95 percent by 2022 from a 2016 base year
Reduce absolute scope 3 emissions (from supply chain) 30 percent by 2030 from a 2016 base year
This expands the reach of the company's existing goal to become carbon neutral in its operational energy use by 2022; it is already carbon neutral across the Americas region, EMEIA retail stores and UK operations. The targets covering GHGs from Burberry's operations (scopes 1 and 2) are consistent with reductions required to keep warming to 1.5°C, the most ambitious goal of the Paris Agreement.
The brand says it is also on track to achieve its RE100 commitment to go 100 percent renewable, as it now obtains 58 percent of its total energy (including 68 percent of electricity) from renewable sources. During 2018/19, the iconic UK fashion brand achieved a 43 percent reduction in market-based emissions compared to the 2016/17 base year.
"At Burberry, we are passionate about building a more sustainable future, and setting these new targets in line with the latest climate science is an important milestone for us," said Pam Batty, Burberry's VP Corporate Responsibility. "For the first time, we are setting targets for greenhouse gas emissions that apply to our extended supply chain, which is a significant addition to our already ambitious target of becoming carbon neutral in our own operational energy use by 2022. Changing the system requires collaboration, and we will be working closely with our supply chain partners to take the action needed to stay on track and achieve our goals."
The SBTi defines and promotes best practice in science-based target-setting, offers cutting-edge resources and expert guidance to reduce barriers to adoption, and independently assesses and approves companies' targets. It is a collaboration between CDP, the United Nations Global Compact, World Resources Institute (WRI) and the World Wide Fund for Nature (WWF).
"The fashion industry's environmental impact is significant and growing," said Cynthia Cummis, Director of Private Sector Climate Mitigation at WRI. "Burberry's ambitious science-based target demonstrates the leadership and innovation needed to succeed in a zero-carbon world. To prevent catastrophic climate change, it's important that all major apparel and footwear brands set science-based targets and pursue comprehensive strategies to decarbonize their businesses."
PUMA aims for 35% reduction in carbon emissions by 2030
Image credit: PUMA
Meanwhile, sportswear giant PUMA — which was at the forefront of environmental accounting with the release of its EP&L in 2011 — has committed to reduce emissions from owned and operated facilities, as well as its energy needs (Scope 1 and 2 emissions) by 35 percent by 2030, compared to 2017. The company also aims to reduce Scope 3 emissions, coming from purchased goods and services, by 60 percent per Million € in sales between 2017 and 2030.
"Recent scientific reports have highlighted the need for urgent action, as global warming is happening at a faster pace than previously anticipated," said Stefan Seidel, PUMA's Head of Corporate Sustainability. "That is why PUMA wants to be a part of the solution by setting a bold path towards reducing greenhouse gas emissions."
PUMA, Burberry and Levi Strauss all play a leading role in the Fashion Industry Charter for Climate Action, which was introduced at COP24 in Poland last year.
"We know that the fashion industry has a significant impact on the environment, but rapid growth in global apparel and footwear production shows no signs of slowing," WRI's Cummis said. "We need more companies in the industry to follow PUMA's lead and pursue comprehensive strategies to decarbonize and do their part to prevent catastrophic climate change."
Want to learn more about the metrics of sustainable business? Join us for New Metrics '19, taking place in Philadelphia this November 18-20.
Sign up to get the latest news and updates about New Metrics '19!
Previous PostThe Most Critical Sustainability Metric of th...
Next PostNYU Stern Research Illustrates ROI for Sustai...
About New Metrics
About Sustainable Brands
BTR Self-Assessment Tool
Program & Participants
© 2007-19 Sustainable Life Media. All Rights Reserved.
This website uses cookies for analytics, advertising and to improve our site. We'll assume you're ok with this, but you can opt-out if you wish.Accept Reject Read More


Imperial Oaks is an area of residential and commercial development located in Spring, TX.
The residential neighborhoods, developed separately over many decades, each belong to one of four homeowner/property owner Associations: Imperial Oaks Park POA, Section 9, The Meadows and The Falls. Each Association has its own governing documents, Board of Directors, and fees. Assets and amenities are not shared across Associations, except by special agreement.
Which Association do I live in?
DISCLAIMER: The association identification resources are provided for convenience and as an initial reference only. Efforts were taken to provide accurate information, but mistakes may have been made. Do not rely on the association identification information provided here to make important decisions. Always check with the applicable association to confirm a given address lies within its boundaries.


Principal Test Technician - APN Software Services Inc.
Responsible for working on platform, peripheral, software, and special assignments that are moderately complex in nature. Requires good judgment to resolve problems and provide recommendations. Works from developed test plans and/or written or verbal instructions. Test prototype development systems, peripherals, and/or pre-released software for compatibility and functionality by performing test cases developed by Test Engineers.
*Constructing, troubleshooting and testing prototype assemblies. Document as appropriate.
*Assisting engineers in test phase of prototype systems and/or pre-released software.
*Ability to set up, configure, and test hardware and software products.
*Functional testing and analysis (characterize failure, debug) of newly developed products to ensure operation and reliability.
*Assist other technicians, schedulers, and engineers in completing assigned tasks.
*Assemble and disassemble test configurations as necessary.
*Attend and participate in project team meetings.
*Understanding and experience with setup, configuration and testing Linux Operating Systems *Understanding and experience with setup, configuration and testing server platforms and network adapters. (Preferred: Experience with Dell PowerEdge servers) *Understanding and experience with setup, configuration and testing network topologies and protocols. *Understanding of hardware and software interactions; able to apply this understanding to resolve issues. *Understanding and experience with electronic test equipment such as oscilloscope, digital voltmeter, function/logic analyzer, and IC programming devices. *Basic understanding/familiarity with PCIe, and I2C bus protocol. *Detail-oriented with attention to product quality. *Verbal and written communication. *Problem solving and analysis skills. *Ability in organizing and managing multiple projects, setting priorities and working independently under aggressive timelines. *Able to easily achieve mastery of new tools, languages and operating systems. *Ability to work under date-driven schedules.
• Understanding and experience with electronic test equipment such as oscilloscope, digital voltmeter, function/logic analyzer, and IC programming devices.
• Basic understanding/familiarity with PCIe, and I2C bus protocol.


Winter's Wolf by Tara Lain | Because two men are better than one!
This sounds amazing! I've been waiting for this since Tara announced it was coming out. I love the excerpt, especially the Little Red Riding Hood references. 🙂 These two sound like they're going to be hot together!
Great excerpt! It really draws a reader in. Thank you for the character bio!
Thanks for the excerpt and character bio. I enjoyed them!
Great excerpt and the character bio…WOW!
Just read it finished today (having pre-ordered it and received it yesterday) and have put up my review on my blog and Goodreads 😀 Suffice to say I loved it!!
So happy to be starting the story!