As the Granby Four Streets project opens its latest project, Granby Winter Garden, Getintothis' Chris Flack called down to Cairns Street to water the plants and look to the skies.
When Granby Four Streets won the Turner Prize in 2015 we were all a little blown away. It started a conversation about what art is, what community means and what transformation looks like.
The Turner Prize win was remarkable for a community interest company who were probably as surprised as the rest of us to get nominated. With their latest project, Granby Four Streets have managed to surprise and enlighten us all over again. It could very easily be said say they're just showing off at this point.
For a volunteer-led organisation that exists through the sheer will of those who give up their time and energy, their success to date, in taking these Liverpool streets head-on, changing their neighbourhood brick by brick, is beautiful.
That they've taken on 11 houses and refurbished them speaks for itself. Their future plans include securing four empty shop units on the crossroads of Cairns Street and Granby Street, to create community spaces, deliver community services and make the street attractive to retailers and others. To help it grow.
Their latest venture has just been released into the wild, Winter Garden is here, Nestled in the middle of Cairns Street, houses 37 and 39 have been transformed in a way that is hard to imagine from the street. They have remodelled two previously derelict buildings and built a creative community hub, that just defies expectations.
The Winter Garden, much like Granby Four Streets, is owned and managed by the community. They will be involved in its future direction, deciding what will happen and what kind of work will take place in the venue.
It is a remarkable space. To the right-hand side, one house is a stunning indoor garden, lined with a bright blue beam, it is the full height of the building and filled with planters and wildflowers. In the centre of the room, where you might expect to see a sofa, there is a tree and an assortment of indoor plants, all reaching for the sky.
The neighbouring house is a different beast. It combines a meeting space, a small studio for arts and activities, and a room upstairs that will act as accommodation so the space can host artists in residence in the future.
Both spaces are flooded with light from an almost totally glass roof, there is bare brick throughout and bare wood to match, it is a simple place where the plants and flowers stand out. There is, if you were so inclined, a plan to release the accommodation on Air B&B so the building can bring in some paying guests to help cover costs.
Did we mention it has a glass roof? We live around the corner, we've already looked to see if it is online.
This project is as green as they come, the planet, air, water and rejuvenation are key to the team, they collect rainwater for the plants, the building is designed to use little power, and it works to make sure it stays warm and is well ventilated so that the plants can thrive and survive.
That this design has come from the community and Assemble, the creative team responsible for the houses and Turner Prize speaks to a relationship that has developed over the years and is built on trust and respect. It is clear that everyone involved loves these four streets.
We've said it before and will say it again, Granby Four Streets have proven beyond doubt that anyone can tackle anything, even if it appears insurmountable. It is all the more remarkable considering that there should never have been streets here, this was all due to be raised to the ground. Replaced with modern stock.
These streets were a no go zone, now they're filled with light and love. How many places in this city have picnic tables outside peoples homes, how many people fill entire streets with colour and nature? How often do you see people standing at their doors, coffee in hand, talking with their neighbours in the sun?
There is still a lot to do, there is still some dereliction around the neighbourhood. There is a long road ahead for this team and for those who follow them to invest their money and hearts in these streets. But those people are there, they're spending their money, giving it blood sweat and probably tears. But this is one hell of a start.
So again, here's to the space invaders, space shifters and transformers of L8, long may they reign.


text:
=head1 NAME

ensembl-pipeline/scripts/GeneBuild/make_input_ids_for TranscriptConsensus

=head1 SYNOPSIS

this scripts will create input ids for the TranscriptConsensus analysis

=head1 DESCRIPTION

This scripts requires a TranscriptConsensus analysis and its corresponding Submit_ analysis
It will fetch the required input genes for each slice,
then create input ids of a specified size while making sure it doesn't cut any of the evidence used

=head1 OPTIONS

    -seq_region_names    list of seq_regions on which to run the script
                         if none specified, it runs on all the seq_regions

    -sr_names_file       the name of the file which contains a list of seq_region names on which
                         the script should be run.

    -dbname              name of the reference database containing the input_ids

    -dbhost              host of the reference database

    -dbpass              pass of the reference database

    -dbuser              user of the reference database

    -dbport              port of the reference database

    -outfile             output file, will contain the mysql insert command lines for the newly created inputs

    -coord_system        coord_system of the input seq_regions

    -path                coord_system version of the input seq_regions

    -slice_size          maximum size for the input_ids

    -analysis            logic_name of the TranscriptConsensus analysis
                         this will be used to fetch the corresponding configuration in the TranscriptConsensus config file

    -submit_analysis     logic_name of the associated Submit_analysis
                         the script will check the there is a rule that has logic_name has a goal and submit_analysis as a condition
                         the input_ids will then be added to the submit_analysis

=head1 EXAMPLES

perl make_TranscriptConsensus_inputIDS.pl -dbhost myhost -dbuser myuser -dbpass mypass -dbport 3306 -dbname mydb -submit_analysis SubmitConsensus -slice_size 1000000 -coord_system toplevel -outfile consensus_input_ids.sql -path mypath -analysis Sim_consensus

this commandline will write a file consensus_input_ids.sql containing the input_ids to be added to SubmitConsensus,
which is the dummy analysis for Sim_consensus

=cut

use strict;
use warnings;

use Getopt::Long qw(:config no_ignore_case);
use Bio::SeqIO;
use Bio::EnsEMBL::Utils::Exception qw(throw warning deprecate);

use Bio::EnsEMBL::DBSQL::DBAdaptor;
use Bio::EnsEMBL::SeqFeature;

use Bio::EnsEMBL::Analysis::Config::GeneBuild::TranscriptConsensus;
use Bio::EnsEMBL::Analysis::Config::Databases;

use Bio::EnsEMBL::Analysis::Tools::Algorithms::GeneCluster;
use Bio::EnsEMBL::Analysis::Tools::Algorithms::ClusterUtils;

use Bio::EnsEMBL::Pipeline::DBSQL::RuleAdaptor;
use Bio::EnsEMBL::Pipeline::DBSQL::DBAdaptor;
use buildchecks::ScriptUtils;

$| = 1 ;

my ( $outfile, $coordsystem, $dbhost, $dbname, $dbpass ) ;
my $dbuser = 'ensro' ;
my $dbport = 3306 ;
my $slice_size ;
my $analysis ;
my $submit_analysis ;
my @seq_region_names ;
my $sr_names_file;
my $path ;

GetOptions(
            'seq_region_names:s'=> \@seq_region_names,
            'sr_names_file:s'   => \$sr_names_file,
            'dbname|db|D:s'          => \$dbname,
            'dbhost|host|h:s'          => \$dbhost,
            'dbpass|pass|p:s'          => \$dbpass,
            'dbuser|user|u:s'          => \$dbuser,
            'dbport|port|P:s'          => \$dbport,
            'outfile:s'         => \$outfile,
            'coord_system|cs_name:s'    => \$coordsystem,
            'path|cs_version:s'            => \$path,
            'slice_size=i'      => \$slice_size,
            'analysis=s'        => \$analysis,
            'submit_analysis=s' => \$submit_analysis,
            );

if (scalar(@seq_region_names) && $sr_names_file) {
  throw("You cannot provide seq_region names via the command line and via a file at the same time.\n")
}

if (scalar(@seq_region_names)) {
  @seq_region_names = split(/,/, join(',',@seq_region_names) ) ;
} elsif ($sr_names_file) {
  open (IN, $sr_names_file) || die "Cannot open your seq_region_names file: $sr_names_file";
  my @names = <IN>;
  foreach my $name(@names) {
    chomp $name;
    push (@seq_region_names, $name);
  }
}

$slice_size = 100_000 unless $slice_size ;

my @all_biotypes ;  # array of all biotypes to cluster

unless ($coordsystem) {
  print STDERR "Warning: you haven't supplied a coord_system_name using -coord_system --> using 'toplevel' now!\n" ;
  $coordsystem = 'toplevel' ;
}

unless ($outfile) {
  $outfile = "input_ids_" . $seq_region_names[0] . ".sql" ;
  print STDERR "Warning: you haven't supplied a name for output-fasta-file with -outfile--> using '$outfile' now!\n" ;
}

unless( $dbhost && $dbname &&  $outfile ) {
  print STDERR ("Usage: -dbname $dbname -dbhost $dbhost -dbuser $dbuser " . "-coord_system $coordsystem -outfile $outfile\n" ) ;
  exit(0) ;
}

my $db = new Bio::EnsEMBL::DBSQL::DBAdaptor(
                                           -host   => $dbhost,
                                           -user   => $dbuser,
                                           -port   => $dbport,
                                           -dbname => $dbname,
                                           -pass   => $dbpass,
                                          );

my $sa = $db->get_SliceAdaptor;

my $pa = new Bio::EnsEMBL::Pipeline::DBSQL::DBAdaptor(
                                           -host   => $dbhost,
                                           -user   => $dbuser,
                                           -port   => $dbport,
                                           -dbname => $dbname,
                                           -pass   => $dbpass,
                                          );

my $rule = $pa->get_RuleAdaptor() ;
my $ana = $pa->get_AnalysisAdaptor->fetch_by_logic_name($analysis) ;
my $submit = $pa->get_AnalysisAdaptor->fetch_by_logic_name($submit_analysis) ;
my $input_id_type = $ana->input_id_type ;
my $analysis_id = $submit->dbID ;

throw ( "can't find analysis with logic_name $analysis in db $dbname \@ $dbhost\n")
  unless $ana ;
throw ( "can't find analysis with logic_name $submit_analysis in db $dbname \@ $dbhost\n")
  unless $submit ;
my $rule_id = $rule->fetch_by_goal($ana) ;
throw ( "Your submit analysis $submit_analysis doesn't match your logic_name $analysis\n")
  unless (${ $rule_id->list_conditions }[0] eq $submit_analysis) ;

my $chrhash = get_chrlengths_v20($db, $path, $coordsystem) ;

filter_to_chr_list(\@seq_region_names, $chrhash, $db->dbc->dbname) ;

my @input_ids ;

my %databases = %{$DATABASES} ;
my %database_hash ;

my $var_hash = $TRANSCRIPT_CONSENSUS_CONFIG_BY_LOGIC ;

my %check;
foreach my $k (keys %{$var_hash} ) {
  my $uc_key = uc($k);
  if (exists $check{$uc_key}) {
    throw("You have two entries in your config with the same name (ignoring case)\n");
  }
  $check{$uc_key} = $k;
}

foreach my $k (keys %check) {
  my $old_k = $check{$k};
  my $entry = $var_hash->{$old_k};
  delete $var_hash->{$old_k};
  $var_hash->{$k} = $entry;
}

my $uc_logic = uc($analysis);
my $entry ;
if (exists $var_hash->{$uc_logic}) {
  $entry = $var_hash->{$uc_logic};
}

my $input_dbs = $entry->{INPUT_GENES} ;

# Throw in this scenario as script makes input ids even if it finds no input gene set
unless($input_dbs)
{
  throw("No input gene sets found! Make sure you have a hash for your analysis in TranscriptConsensus.pm and\n"
       ."that it contains an input gene set!\n");
}

my $ab_initio = $entry->{AB_INITIO_LOGICNAMES} ;

# Check all databases declared in the Databases.pm config file exist
for my $category (keys %databases ) {

  if( !$databases{$category}{-host} || !$databases{$category}{-dbname} ) {
    print "Skipping category " . $category . " no dbinfo " . "defined\n" ;
    next ;
  }

  print "\n$category: $databases{$category}{-host} $databases{$category}{-dbname} :\n--------------------------------------\n" ;
  my %constructor_args = %{$databases{$category}} ;
  my $dba = new Bio::EnsEMBL::DBSQL::DBAdaptor ( %constructor_args, ) ;
  $database_hash{$category} = $dba ;
}

# Create input slices from the existing ones
SLICE:
foreach my $chr (@{sort_chr_names($chrhash)}) {
  my $chrstart = 1 ;
  my $chrend   = $chrhash->{$chr} ;

  print STDERR "Chr $chr from $chrstart to " . $chrend . "\n" ;

  my $slice ;
  my $slicename ;
  $slicename = "$coordsystem:$path:$chr:$chrstart:$chrend:1" ;
  $slice = $sa->fetch_by_name($slicename) ;

  my @all_genes ;

  my $coord_sys_name  =  $slice->coord_system_name ;
  my $coord_sys_version = $slice->coord_system->version ;
  my $seq_region_name = $slice->seq_region_name ;

  # dont construct anything if we have a slice shorter than the slice_size
  if ($slice->length < $slice_size ) {
    push @input_ids , $slice->name ;
    next ;
  }

  for my $category ( keys %{$input_dbs} ) {
    my $dba = $database_hash{$category};
    my $tmp_slice = $dba->get_SliceAdaptor->fetch_by_name($slice->name) ;

    my $genes ;
    foreach my $biotype ( @{$input_dbs->{$category}} ) {
      push @all_biotypes, $biotype ;
      print "Fetching all genes from " . $tmp_slice->name . " by " . "biotype ".$biotype . " from " . $tmp_slice->adaptor->dbc->dbname . "\n";
      my @genes = @{ $tmp_slice->get_all_Genes_by_type($biotype,undef,1)} ;
      print "Have " . scalar(@genes) . " genes [$biotype]\n" ;
      push @all_genes, @genes ;
    }
    for ( @all_genes ) {
      print "gene_db_id : " . $_->dbID . "\t" . $_->biotype . "\n"  ;
    }

    foreach my $logic_name_becomes_biotype ( @{ $ab_initio } ) {
      push @all_biotypes, $logic_name_becomes_biotype ;
      my $pt = $tmp_slice->get_all_PredictionTranscripts( $logic_name_becomes_biotype, 1) ;
      print "Have " . scalar(@$pt) . " genes [$logic_name_becomes_biotype]\n" ;
      my $ab_initio_genes = convert_prediction_transcripts_to_genes($pt, $logic_name_becomes_biotype ) ;
      push @all_genes, @$ab_initio_genes ;
    }

  }

  if (@all_genes == 0) {
    warn("Slice ".$slice->name." has no genes ");
    next SLICE;
  }

  print "have " .scalar(@all_genes) . " genes for slice ".$slice->name." \n" ;
  print "having slice_size $slice_size\n" ;

  create_input_ids(\@all_genes, \@all_biotypes, $coord_sys_name, $coord_sys_version, $seq_region_name);
}

open(O,">$outfile") || die "cant write to file $outfile\n" ;
for my $id ( @input_ids ) {
  print O "insert into input_id_analysis (input_id, input_id_type, analysis_id) values ( \"$id\", \"$input_id_type\", $analysis_id ); \n" ;
}
close(O) ;
print "sql-statements written to $outfile - finished\n" ;

sub create_input_ids {
  my ($genes, $biotypes, $coord_sys_name, $coord_sys_version, $seq_region_name) = @_ ;
  my @all_genes = @$genes ;
  my @all_biotypes = @$biotypes ;

  @all_genes = sort { $a->seq_region_start <=> $b->seq_region_start }  @all_genes ;
  for ( @all_genes ) {
    print "gene_db_id : " . $_->dbID . "\t" . $_->biotype . "\t" .$_->seq_region_start . "\n"  ;
  }

  my %types_hash;
  $types_hash{all} = \@all_biotypes;
  my $clustered;
  my $unclustered;
  ($clustered,$unclustered)  =  cluster_Genes(\@all_genes, \%types_hash);
  my @cluster = @$clustered;
  push @cluster ,@$unclustered;

  @cluster = sort {$a->start <=> $b->start } @cluster ;
  print "Printing cluster info\n";
  for my $cluster (@cluster) {
    print $cluster->start . "---" . $cluster->end . "\n" ;
  }

  # Make blocks where clusters are

  my @cluster_blocks ;
  my $curblock = undef ;
  foreach my $cluster (@cluster) {
    if (defined($curblock) && $curblock->end >= $cluster->start) {
      if ($cluster->end > $curblock->end) {
        $curblock->end($cluster->end) ;
      }
    } else {
      $curblock = Bio::EnsEMBL::SeqFeature->new(-START => $cluster->start, -END => $cluster->end) ;
      push @cluster_blocks,$curblock ;
    }
  }
  @cluster_blocks = sort {$a->start <=> $b->start} @cluster_blocks ;

  my $start ;
  my $nblock = scalar(@cluster_blocks) ;
  my $actual_max_size = 0 ;

  for (my $i=0 ; $i<@cluster_blocks ; $i++) {
    my $c = $cluster_blocks[$i] ;
    if (!defined($start)) {
      $start = $c->start ;
    }

    my $diff = $c->end - $start ;
    if ($diff > $slice_size || $i==$nblock-1) {
      my $end = $c->end ;
      my $id = $coord_sys_name . ":" . $coord_sys_version .":".$seq_region_name .  ":" .  $start . ":" . $end . ":1" ;
      print "$id\n" ;
      push @input_ids , $id ;
      if ($actual_max_size < $diff) {
        $actual_max_size = $diff ;
      }
      $start = undef;
    }
  }
  print "Maximum size of generated ids = $actual_max_size\n";
}

sub  convert_prediction_transcripts_to_genes {
  my ($pt, $logic_name_becomes_biotype ) = @_ ;
  my @new_genes ;
  for my $pt (@$pt) {
    # conversion
    my $gene_from_pt = Bio::EnsEMBL::Gene->new(
                       -start    => $pt->start,
                       -end      => $pt->end,
                       -strand   => $pt->strand,
                       -slice    =>$pt->slice,
                       -biotype  => $logic_name_becomes_biotype,
                       -analysis =>$pt->analysis,
                       ) ;

    my $new_tr = Bio::EnsEMBL::Transcript->new(
                    -BIOTYPE  => $logic_name_becomes_biotype ,
                    -ANALYSIS => $pt->analysis ,
                 ) ;

    my @pt_exons  = @{ $pt->get_all_Exons} ;
    for (my $i = 0 ; $i < scalar(@pt_exons) ; $i++) {
      my $pte = $pt_exons[$i] ;
      bless $pte, "Bio::EnsEMBL::Exon" ;
      $pte->phase(0) ;
      $pte->end_phase(0) ;
    }
    for (@pt_exons) {
      $new_tr->add_Exon($_) ;
    }
    $gene_from_pt->add_Transcript($new_tr) ;

    push @new_genes, $gene_from_pt ;
  }
  return \@new_genes ;
}

redpajama_set_name: RedPajamaGithub


I got an overall band score of 7 on ielts. Considering Kings and Lse ask for a 7,5 overall, do you still think I have a chance to receive an offer?
I recommend you to submit your application and reschedule your test.
I scored 7,5 overall, achieving 8 in reading and listening, 7,5 in speaking but only 6,5 in writing, The requirement is minimum band score 7 from all parts of the test. Do you think they would require me to retake the test?
I've got exactly the same problem, I scored 8 at the IELTS but only 6.5 in writing. Do you guys had an answer from LSE ? I tried to reach them but I have no answer yet.
I have a same problem with writing. Did anyone fix this issue just through emailing?
They accepted my IELTS (8 overall, 9 reading, 8.5 listening, 7 speaking and 6.5 writing). I did everything through e-mails (the waiver form "How do I").
My writing is 6 .and I took 2 ielts. But could not manage to rise writing even 0.5 score (((. I am looking forward for your valuable advises, tips and tricks.!!
Do you know if they are also flexible with your degree mark at LSE?
NO LSE is very strict about the degree marks.
There are many books written specifically for the writing section. Find them and read them, they helped me. Also, many test centres offer language courses and usually they offer separate courses for each section (at least for writing in my case). This is really good as the teachers are usually ex-examinators, they will show you the right approach.
Can you guys maybe tell me what happened eventually? I'm in exact the same situation at the moment!
Did they send you an email confirming their acceptance to your score or they just changed the status in the application tracker?
Guys, do you think LSE would consider an application from someone who already has a Master Degree? I earned a Master of Comparative Law in the U.S., but now I'm searching for something in banking regulation, like their LL.M. Another question is: I don't have the 8 out of 10 required for my postgraduation grades, but my Master's GPA is of 3.854, well above their threshold. Do you think they will consider my eventual application?


Lost crow conspiracy / Rosalyn Eves.
"This is a Borzoi book."--Title page verso.
After her cousin Matyas' blood breaks the Binding, effectively disarming the spell restricting magic to the elite Luminates, Anna Arden believes that the magical, inhuman Praetheria will be safe, Hungary will be independent of Hapsburg rule, and she can freely love the Romani Gábor, but instead by May 1848, Anna feels pressure to lend her support to opposing political factions, attempts to master her chimera nature, and ends up seeking the aid of the outlaw the King of Crows.
Hungary -- History -- Uprising of 1848-1849 -- Juvenile fiction.
Lost Crow Conspiracy is the dark, dazzling, action-packed sequel to Anna Arden's explosive societal debut in YA fantasy trilogy Blood Rose Rebellion .
Chapter 1 Vienna, May 1848 There is a feeling a hunted creature gets: a prickling of fine hairs at the back of the neck, a sense of unseen eyes crawling across one's spine, a shift in the air. A smell, perhaps. I could not say what it was that night that struck me, only that between one turn on the ballroom floor and another, a sickness settled in my stomach. Someone--or something--was watching me. My laugh turned brittle, my fingertips cold. I scanned the ballroom as I danced, searching for the source of my disquiet. Music swelled around me. Men in dark suits and women in jewel-toned gowns swirled past, gliding across the marble floor in time to one of Johann Strauss's waltzes. Frost and fire flickered up alternating walls, part of the night's illusions. It was not so unusual, at a ball, to play at predator and prey: for women to hide behind their fans and fluttering lashes; for men to prowl the rim of the room in search of new game. This was different. Catherine would say I was being fanciful--or fretful. Maybe I was imagining things. Maybe the eyes I felt boring into me, the glances that shifted just before I turned, belonged to gentlemen whose interest in me was more flirtatious than feral. But most of those gentlemen owned their interest: their names crowded my dance card. And the thought of their attention did not make my skin crawl. Perhaps it was one of the many military men, resplendent in their dress uniforms: white and red and green and gold. I had not missed how they turned away when I approached, how their mouths lined with distaste. The Austrians had not forgiven me for releasing Hungarian rebels in Buda-Pest in the middle of a battle their soldiers had lost. Only the Hungarian hussars, with their elaborately frogged and embroidered dolmans, smiled at my approach. But neither the Austrian soldiers nor the Hungarian hussars knew the whole truth: that before I had freed the prisoners, I had broken the Binding spell, shattering elite control of magic and releasing the creatures held inside the spell. If they knew, they would do more than turn away. They would shun me entirely. A particularly exquisite being floated past, as much light as solid form, bearing crystal goblets on a silver tray. I watched it pass, my gloved fingers curling. Of all the things I disliked about my new home in Vienna--from the overwhelmingly ornate buildings to the excessive formality--this new fashion of hiring inhuman beings distressed me most. I had not freed the creatures from the Binding for them to serve as ornaments for the nobility. Praetertheria, the scientists called them now. Praetheria for the nonscientists, for those who did not simply call them monsters. "Do you make a long stay in Vienna?" my partner, a tall man with thinning hair, asked. I wrenched my focus back. My inattention was rude, and he had done nothing--yet--to deserve it. "I am not certain. I am visiting my sister, Lady Gower, and her husband. He is attached to the British embassy here." I did not tell him that it had taken a month of wheedling, after Catherine's yuletide wedding, before Mama allowed me to leave England, and then only because Mama thought gentlemen on the Continent might not be so particular, and the money Grandmama had left me might sweeten the pill of my forward nature. My chimera nature, the dual souls fighting for dominance inside me. But Mama knew nothing of that. I shivered, wishing abruptly that I had not come. I did not want to dance with strangers, to make small talk with snobs. I wanted to be in Hungary, among my old friends, walking alongside the Duna River with Gábor. But this was part of the deal I had made with Mama when I left England: I could come to Vienna with Catherine if I made an effort in polite society. My partner asked another question and I answered mechanically, my mental image of Gábor's dark eyes and warm smile dissolving. I searched out the creature again, now on the far side of the room. I wondered what it was: vila or hundra or álf or something I had no name for. A girl with hair so pale it looked white stood beside the praetherian, whispering to it. As if she felt my eyes on her, she glanced up. A cold shock flashed through me. Was she the source of that hunted feeling? But her eyes fell away, uninterested. We finished out our dance with idle chatter: discussions of the weather (chilly still), speculations as to whether Emperor Ferdinand and Archduke Franz Joseph might appear (I doubted it), and gossip (on my partner's part) about people I did not know. Neither of us spoke about the real issue--the reason why so many outsiders had convened on Vienna in late spring, a season when the nobility should be preparing to leave for their country estates. In the months since I had released the praetheria from the Binding, the question of what to do with them had grown increasingly vexing as they regained their strength and mingled more with society. What rights--if any--ought praetheria to have? Where should they live? A Congress to settle the issue was to begin in a little over a fortnight, on the seventh of June. Were it not for the Congress, Catherine and Richard might have stayed in England, and I with them. My partner returned me to the corner where Catherine waited, her cheeks still flushed from her own turn on the floor. For a fraction of a second, some trick of the light and her profile made me see Grandmama, and I stopped, my heart aching anew with her loss. Catherine turned at my approach. "Anna, can you not persuade Noémi to dance? I hate to see her buried among the dowagers and chaperones like this." My cousin Noémi shrugged, her fingers flickering upward to brush the glimmering pelican of her soul sign and then linger on the filigree cross she wore. Mátyás's cross. "My brother is but eight months dead, ma'am. My uncle bid me come, but I do not wish to dance." Her hands dropped to smooth the lavender folds of her skirt, and my heart fell with the gesture. Noémi would not have abandoned the black of deep mourning without pressure from her family. "I am no longer certain of my steps." Once, Noémi had loved a dance. As had I. The revolution and Mátyás's death had changed us both. Luminate magicians had smoothed her blistered skin to show no scar, but some of the deeper damage she had sustained when we fought to break the Binding remained. Even Luminate healers could not work miracles. At home Noémi wore spectacles that sharpened some of her dulled vision but could not correct the near blindness in her right eye. But her aunt had forbidden the eyeglasses at the ball. "You certainly do not lack for partners." Noémi caught my wrist, where a silver charm dangled from a bracelet. It was cunningly engraved with the fire and ice of the night's theme, the pages of my dance card folded neatly inside. "Money compensates for many faults." Now it was Catherine's turn to frown. "You underrate yourself." Her own rose soul sign glittered, a reminder that she, like Noémi, was among the lucky Luminates who had not lost their magic when the Binding shattered and could still cast a soul sign for public display. I had promised myself not to unduly aggravate Catherine, so I swallowed a tart answer and said merely, "Thank you." Catherine peered over my shoulder, reading the fine print of the names to Noémi. "Zichy, Széchenyi, Peterffy . . ." "You are still the darling of the Hungarians, and not for any of your wealth," Noémi said. "They remember what you did." "What we did." Noémi had been with me the night I broke the Binding, and in the prison, during the terrible aftermath of fighting. I did not think either of us had forgotten the smell of gun smoke and blood, the keening of creatures in the street, the silence of an assassin moving through a dark prison. Besides Grandmama and Mátyás, who could no longer speak my secret, only four living souls knew what happened that night: Noémi, my uncle Pál, myself--and the praetherian with whom I had made my bargain, an army in exchange for a broken spell. Catherine shuddered. "Please, Noémi, must you mention that now? Someone might hear you." As if talk of a revolution were the worst thing that could happen to one. I sprang up. "I am parched after all that dancing." "Richard has already gone to fetch me some lemonade. I'm sure he will bring some for you as well," Catherine said. "And haven't you a partner for this dance?" "Please make my excuses." I did not wait for Catherine's answer before plunging into the crowd. Unwanted images from that bloody October day tumbled through my head. Though I pressed my fingers to my temples, I could not shake the pictures. I could not stay beside Catherine and pretend I had any interest in the dance. I could not sit placidly with Mátyás's sister and lie to her with my smiles and light words. Noémi did not know all my secrets. She did not know that everything we had won that day--the broken Binding, the praetherian army, the revolution--had been bought with her brother's blood. And I had held the knife that killed him. Excerpted from Lost Crow Conspiracy by Rosalyn Eves All rights reserved by the original copyright owners. Excerpts are provided for display purposes only and may not be reproduced, reprinted or distributed without the written permission of the publisher.


text:
Tampa Bay's Impact Radio
1250 WHNZ - Tampa Bay's Impact Radio
View Full Schedule This morning with Gordon Deal Lets Talk Nutrition The Opening Bell hosted by David Graham Del Walmsley Show Schnitt Show Harwood Financial Group The Mark Levin Show The Dana Show with Dana Loesch SIgn up for news alerts Tampa Local News Best of the Bay CATS Roundtable The Lutheran Hour Leo Laporte Bill Handel The Jason Smith Show with Mike Harmon The Ben Maller Show FOX Sports Radio Weekends
This Morning with Gordon Deal Anytime Let's Talk Nutrition Anytime Schnitt Show Anytime Mark Levin Anytime Dana Show Anytime Fox Sports Radio Anytime Better Lawns and Gardens Anytime Best of the Bay Anytime Business Happy Hour Anytime CATS Roundtable Anytime CEO Spotlight Let's Take it Outside Anytime The Lutheran Hour Anytime
Buy Concert Tickets
Contact Us Like us on Facebook Careers
Advertise on 1250 WHNZ, Get Results
FBI Shuts Down Solar Observatory in New Mexico as Rumors Swirl
posted by RJ Johnson - @rickerthewriter - Sep 13, 2018
The federal government is doing their best X-Files impersonation after shutting down and evacuating a solar observatory and local post office in New Mexico "due to unforeseen circumstances." The weird part? No one's talking about WHY the observatory was suddenly shut down.
"We apologize for any inconvenience this may cause you; however, due to unforeseen circumstances, the Sunspot Solar Observatory, including the site, is temporarily closed, until further notice," according to a message on the observatory's website. "Thank you for your understanding."
Local police say they're just as mystified about the closure as everyone else. Otero County Sheriff Benny House told a local newspaper that his department is in the dark about what's going on and that they've been asked to remain on standby during the facility's evacuation.
"The FBI is refusing to tell us what's going on," House said. "We've got people up there that requested us to stand by while they evacuate it. Nobody would really elaborate on any of the circumstances as to why. The FBI were up there. What their purpose was, nobody will say."
House also noted the presence of a Blackhawk helicopter circling the area around the observatory.
"But for the FBI to get involved that quick and be so secretive about it, there was a lot of stuff going on up there," he said. "There was a Blackhawk helicopter, a bunch of people around antennas, and work crews on towers, but nobody would tell us anything."
House said officers were asked to go to the facility and assist with the evacuation, but were left in the dark as to the why, saying they didn't see a threat.
"They wanted us up there to help evacuate, but nobody would tell us anything," he said. "We went up there and everything was good. There was no threat. Nobody would identify any specific threat. We hung out for a little while, then we left. No reason for us to be there. Nobody would tell us what we're supposed to be watching out for."
Theories as to what's going on range from the outlandish (the aliens are here, the aliens are here!) to the mundane (gas leak). It's worth noting that Sunspot is located only a few miles away from the White Sands Missile Range, making it a prime target for foreign agents who might want to hack into the antenna array to monitor the U.S. military at their base there.
Meanwhile, the federal government and the observatory will remain closed until the security situation is resolved.
WHNZ Public Inspection File
WHNZ Political File
Advertise with 1250 WHNZ, Get Results
Tampa Bay Talk Radio Station, 1250 WHNZ.

redpajama_set_name: RedPajamaCommonCrawl


text:
The Saved by the Bell Cast Reunited Last Night on The Tonight Show
By Tony Merevick Published On 02/05/2015
@tonymerevick
By Tony Merevick @tonymerevick Published On 02/05/2015
YouTube/NBC
I'm so excited! I'm so excited! I'm so... old.
As part of The Tonight Show's stint in L.A. this week, Jimmy Fallon staged a high school reunion that didn't suck — reuniting the cast of Saved by the Bell at Bayside High.
"Not many people know this, but I actually went to high school out here," Fallon said. "I remember it like it was yesterday."
And then *dazzling flashback sound* and we're back in the hallway at Bayside with a "teenage" Jimmy Fallon, who is then joined by Zack, Slater, Kelly, and Jessie (but not Screech because he stabbed someone) — all decked in amazing '90s gear. But don't let us spoil the trip down memory lane for you, find your stash of caffeine pills and giant cellphones and enjoy:
Send Foodz: New York City Wine & Food Festival
Tony Merevick is Cities News Editor and doesn't miss the the '90s look. The music, yes, but not the look. Follow him on Twitter @tonymerevick.


text:
Home / Feature / K Celeb / BTS Secures Three Prizes at People's Choice Awards
BTS Secures Three Prizes at People's Choice Awards
Posted on December 8, 2021 by Korea Bizwire in K Celeb, K Wave, Lifestyle, Sports & Entertainment with 0 Comments
This image provided by People's Choice Awards describes South Korean pop act BTS as the winner in the group of 2021 category in this year's event.
SEOUL, Dec. 8 (Korea Bizwire) — K-pop superband BTS has won three prizes at the 2021 People's Choice Awards, the latest in a series of honors it took home from the United States this year.
The South Korean group won the group of 2021 and both the song and the music video of 2021 for its megahit "Butter" at the annual ceremony held in person in Santa Monica, California, Tuesday (U.S. time).
The septet, in particular, beat out big name stars, such as Coldplay, Dan + Shay, Jonas Brothers and Maroon 5, to win in the group of the 2021 category.
Last year, BTS took home four titles — the group, the song, the album and the music video of the year at the awards show that recognizes people in the show business, including film, TV shows and pop music based on online votes.
"We're so happy because all these awards mean that people have recognized our efforts. We're so grateful that it is difficult to describe how we feel in words. Since the Armies were right behind us, we were able to have come this far," the group said through its agency Big Hit Music after accepting the prizes.
"Thank you for loving 'Butter' a lot. We wanted to make people going through difficult times happy (through this song)."
Released in May, the second English-language song from the group stayed atop the Billboard Hot 100 main singles chart for 10 non-consecutive weeks.
BTS became the first Asian act to receive the top honor of the artist of the year at this year's American Music Awards for the song last month.
The summery song also earned the group the record of the year during the annual Hitmakers event by U.S. entertainment magazine Variety last week.
Viewership of Korean Films Soars 81.1 Pct in March
Women Assume Nearly 70 Pct of Childrearing Responsibilities, Want Spouses to Do More
S. Korea Struggles with Worst Pandemic Wave amid Lagging Vaccination Rate
South Korea to Tighten Regulations on Negligent Dog Owners
S. Korea to Introduce Health Program at Schools in East Timor
After Successful Year, K-pop Rookie Enhypen Returns with Repackage
Daily Cases Fall Below 4,000 amid Growing Omicron Woes


text:
// The MIT License (MIT)
//
// Copyright (c) 2017 Fabian Wenzelmann
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

package goauth

import (
	"encoding/hex"
	"errors"
	"math"
	"strconv"
	"time"

	scrypt "github.com/elithrar/simple-scrypt"

	"golang.org/x/crypto/bcrypt"
)

/*
PasswordHandler is an interface that knows three methods:
Create a hash from a given (plaintext) password
Compare a previously by this method generated hash and compare it to
plaintext password.
A function PasswordHashLength that returns the length of the
password hashes.
There is an implementation BcryptHandler, so you don't have to write one
on your own, but you could!
*/
type PasswordHandler interface {
	// GenerateHash generates a hash from the given password.
	GenerateHash(password []byte) ([]byte, error)

	// CheckPassword tests if the passwords are equal, can return an error
	// (something is wrong with the data, random engine...). This should still
	// be handled as failure but you may wish to preceed differently.
	CheckPassword(hashedPW, password []byte) (bool, error)

	// PasswordHashLength returns the length of the password hash.
	// The hashes must be of the same length, so this method
	// must return the length of the elements created with
	// GenerateHash.
	// For bcrypt the length is 60.
	PasswordHashLength() int
}

const (
	// DefaultCost is the default cost parameter for bcrypt.
	DefaultCost = 13

	// DefaultPWLength is he default length of encrypted passwords.
	// This is 60 for bcrypt.
	DefaultPWLength = 60

	// NoUserID is an user id that is returned if the user was
	// not found or some error occurred.
	NoUserID = math.MaxUint64
)

// BcryptHandler is a PasswordHandler that uses bcrypt.
type BcryptHandler struct {
	cost int
}

// NewBcryptHandler creates a new PasswordHandler that uses bcrypt.
// cost is the cost parameter for the algorithm, use -1 for the default value
// (which should be fine in most cases). The default value is 13.
// Note that bcrypt has some further restrictions on the cost parameter:
// Currently it must be between 4 and 31.
func NewBcryptHandler(cost int) *BcryptHandler {
	if cost <= 0 {
		cost = DefaultCost
	}
	return &BcryptHandler{cost: cost}
}

// DefaultPWHandler is the default handler for password encryption / decription.
var DefaultPWHandler = NewBcryptHandler(-1)

// GenerateHash generates the password hash using bcrypt.
func (handler *BcryptHandler) GenerateHash(password []byte) ([]byte, error) {
	return bcrypt.GenerateFromPassword(password, handler.cost)
}

// CheckPassword checks if the plaintext password was used to create the
// hashedPW.
func (handler *BcryptHandler) CheckPassword(hashedPW, password []byte) (bool, error) {
	// get error from bcrypt
	err := bcrypt.CompareHashAndPassword(hashedPW, password)
	// Check what the error was, if it is nil everything is ok
	if err == nil {
		return true, nil
	}
	// if it is ErrMismatchedHashAndPassword no real error occurred, pws simply
	// didn't match
	if err == bcrypt.ErrMismatchedHashAndPassword {
		return false, nil
	}
	// otherwise something really went wrong
	return false, err
}

// PasswordHashLength returns the default length for bcrypt,
// that is 60.
func (handler *BcryptHandler) PasswordHashLength() int {
	return DefaultPWLength
}

// ScryptHandler is a PasswordHandler that uses scrypt.
type ScryptHandler struct {
	// Stores the parameters for scrypt.
	Params scrypt.Params
}

// NewScryptHandler returns a new ScryptHandler that uses the defined
// parameters. Set to nil to use scryp.DefaultParams.
// You should know what you do however!
func NewScryptHandler(params *scrypt.Params) *ScryptHandler {
	if params == nil {
		params = &scrypt.Params{N: 32768, R: 8, P: 2, SaltLen: 16, DKLen: 32}
	}
	return &ScryptHandler{Params: *params}
}

// GenerateHash generates the password hash using scrypt.
func (handler *ScryptHandler) GenerateHash(password []byte) ([]byte, error) {
	return scrypt.GenerateFromPassword(password, handler.Params)
}

// CheckPassword checks if the plaintext password was used to create the
// hashedPW.
func (handler *ScryptHandler) CheckPassword(hashedPW, password []byte) (bool, error) {
	// get error from bcrypt
	err := scrypt.CompareHashAndPassword(hashedPW, password)
	// Check what the error was, if it is nil everything is ok
	if err == nil {
		return true, nil
	}
	// if it is ErrMismatchedHashAndPassword no real error occurred, pws simply
	// didn't match
	if err == scrypt.ErrMismatchedHashAndPassword {
		return false, nil
	}
	// otherwise something really went wrong
	return false, err
}

// PasswordHashLength returns the password length for scrypt.
func (handler *ScryptHandler) PasswordHashLength() int {
	// this is a bit ugly but well...
	nLength := len(strconv.Itoa(handler.Params.N))
	rLength := len(strconv.Itoa(handler.Params.R))
	pLength := len(strconv.Itoa(handler.Params.P))
	saltLength := hex.EncodedLen(handler.Params.SaltLen)
	dkLength := hex.EncodedLen(handler.Params.DKLen)
	return nLength + rLength + pLength + saltLength + dkLength + 4
}

// ErrUserNotFound is an error that is used in the Validate
// function to signal that the user with the given username
// was not found.
var ErrUserNotFound = errors.New("User not found.")

// DefaultUserInformation is used to wrap the the information for
// a user in the default scheme.
//
// New in version v0.5
type BaseUserInformation struct {
	ID                                   uint64
	UserName, FirstName, LastName, Email string
	LastLogin                            time.Time
	IsActive                             bool
}

// UserHandler is an interface to deal with the management of
// users.
// It should use a PasswordHandler for generating passwords to store.
type UserHandler interface {
	// Init initializes the underlying storage.
	// Use this function every time you start your app, this
	// function must take sure that no error is produced if
	// invoked several times.
	// In SQL for example "CREATE TABLE IF NOT EXISTS"
	Init() error

	// Insert inserts a new user into the default scheme.
	// This function must return NoUserID and an error != nil
	// if any error occurred.
	// If the insert took place it always returns an error == nil.
	// However it can return nil as an error and NoUserID, in this case the
	// database doesn't support an immediate lookup for the newly inserted id
	// (sqlite3 and MySQL seem to support this though, postgres not).
	// Note that an error is also raised if the username is already in use
	// (must be unique).
	Insert(userName, firstName, lastName, email string, plainPW []byte) (uint64, error)

	// Validate validates the given plaintext password with the hashed password
	// of the user in the storage.
	// If err != nil you should always consider the lookup as a failure.
	// The function returns NoUserID and ErrUserNotFound if the user was not
	// found.
	// If no error occurred you can check if the login was successful by checking
	// the returned user id:
	// On failure it returns NoUserID and on success the id of the user with
	// username.
	Validate(userName string, CleartextPwCheck []byte) (uint64, error)

	// UpdatePassword updates the password for a user.
	UpdatePassword(username string, plainPW []byte) error

	// ListUsers returns all users currently present in the storage (by id).
	//
	// New in version v0.4
	ListUsers() (map[uint64]string, error)

	// GetUserName returns the username for a given id.
	// Returns "" and ErrUserNotFound if the id is not valid.
	//
	// New in version v0.4
	GetUserName(id uint64) (string, error)

	// GetUserID returns the id for a given username.
	// If the user does not exist return ErrUserNotFound.
	//
	// New version v0.6
	GetUserID(userName string) (uint64, error)

	// DeleteUser deletes the user with the given username.
	// If the user doesn't exist it will do nothing.
	//
	// New in version v0.4
	DeleteUser(username string) error

	// GetUserBaseInfo returns the information for a given user in the default
	// scheme.
	// If you have a different scheme to manage your users this will probably
	// not work.
	// Returns ErrUserNotFound if the user doesn't exist.
	//
	// New in version v0.5
	GetUserBaseInfo(userName string) (*BaseUserInformation, error)
}


Wix Review 2017: Is Wix a Good Website Builder?
Designing a free wix.com email capture page and connecting mail chimp list.
Use this G Suite Promo Code GDF9DVTKJ7PN39C to get the discount.
This article will guide you to WinX DVD Ripper Platinum 65% off.This was tagged: Mail Boss Coupon Codes 2017, coupon codes, promo codes. and filed under Exclusive savings offer.Its self-explanatory drag-n-drop editor and pre-designed templates allow to create. Join ChopstixUSA, an exclusive e-mail group for people who want up to the minute news about Chopstix.
Read my Wix review to weigh the pros and cons for using this. Wix Code. In July 2017 Wix.Code: 45CBP460 Discount: 6% Promo time: 180 days Rating: (12 votes) Review for Wix Coupon Code Jan 2017 Send Wix Coupon Code Jan 2017 to friends Latest coupons.
Save money on things you want with a The Mailbox promo code or coupon. 5 The Mailbox coupons now on RetailMeNot.
Enjoy 50% off for your domain and hosting with 15 Coupon Codes and 23 Deals in October 2017.
Receive our latest Wix.com discounts no more than once a week and no spam.Find great deals on eBay for wix 46418 and wix. 80 results for wix 46418. of Enter your ZIP code Go.
How to Properly Switch From Wix to WordPress. (special Bluehost coupon for WPBeginner users). you should see a page full of code.Get 90% off retail price Plus enjoy Free Shipping with Wix Coupon Codes 2017 or Promo Code. Fill out the short form to receive a coupon by mail for a free sample of Justin.
Use our Wix promo codes to purchase themes and other. you should note that it is not possible to utilize a coupon code more.Search the biggest database of WordPress Coupons on the planet, connect with friends or with our WP Coupon Code apps. Check your e-mail for the confirmation link.Savings with 50 WIX coupon codes and promo codes November 2017.
Code: 965ENG310 Discount: 7% Promo time: 90 days Rating: (6 votes) Review for Wix Coupon Code 2017 Send Wix Coupon Code 2017 to friends Latest coupons via e-mail.In the Yahoo Mail mobile apps, clipped coupons show in the Coupons Smart View for easy access to the. Find the latest 50 Google Apps promo codes, coupons, discounts in October 2017.
Add-in Express discounts and special offers. Add just a few lines of code to bypass the Outlook Object Model guard and. These Promotion Codes works in USA, Canada, UK, Australia, Brazil and India.


We take a total portfolio management approach to identify and evaluate your personal risks. As a Bouchard Private Client, you'll have a dedicated team of specially-trained insurance professionals who offer exceptional service and personalized advice.
Have a question for us? Contact a member of our Private Client team at 727-451-3880.
Through comprehensive analysis, our advisors identify inconsistencies, gaps, and improper coverages found in your portfolio. We offer customized solutions to ensure your policies stay relevant to changing exposures and risks.
For more than 60 years, we have partnered with highly regarded insurers including AIG, Chubb, and PURE. These carriers are known for their broad and unique product offerings, financial stability, and claims reputation.
We are listed among the Top 50 Personal Lines agencies in the U.S. giving us the ability to write policies in all 50 states. This allows us to manage your entire insurance portfolio no matter where your risks are located.
Affluent clients are common targets of lawsuits due to their diverse activities and extensive assets. That's why we analyze insurance portfolios with an emphasis on liability protection.
Our in-house claims team works as a liaison between you and the insurer. Their tenure and experience in claims advocacy ensures a quick and agreeable.
As a member, you work exclusively with a dedicated advisor and account manager giving you exceptional response time and increased service levels while maintaining your confidentiality.
Your valuables are precious to you whether it's artwork, antiques, exotics, or collectibles. We recognize their value and tailor a plan to protect your finest possessions. Safeguard your family and assets against liability claims related to international travel, board of director involvement, private staff lawsuits, large-scale entertaining and social media.
We ensure your policies will properly respond to all forms of ownership including limited liability corporations, trusts, and joint partnerships. We have solutions for insurance unique exposures such as historic dwellings, short-term rentals, homes under construction, renovations, secondary and vacation homes, high risk flood, and wind prone areas.
To contact a member of our team, call us direct at 727-451-3880.
Does My Credit Affect My Car Insurance Premium?
What Happens to Your Automobile During a Storm?
Need help navigating your insurance policy?
® 2019 Bouchard Insurance. All Rights Reserved.


text:
Plan to manage Victoria's Anglesea River
Pumps Journalist August 26, 2016 August 26, 2016 News, Water & wastewater, Water Efficiency 0
A management plan has been developed with input from the local community to ensure water levels in the Anglesea River, located in Victoria's Otways region, will be maintained throughout the 2016/17 summer.
Over the upcoming summer period, water will be pumped from an existing Alcoa water storage pond into the Anglesea River between November 2016 and March 2017 – maintaining adequate water levels for social, economic and environmental benefits.
The Alcoa pond is currently being used to store treated groundwater. Additional water from the river may be extracted during spring – when river water levels are higher – for storage in the pond to ensure there is sufficient water available to discharge over the summer months.
Since the closure of the Anglesea power station in 2015, the Victorian Government has been working closely with stakeholders and the Anglesea community to identify short and long-term management options for the river.
Anglesea residents have participated in the Anglesea Futures Community Conversations forums and their feedback was critical to developing a management strategy.
The government has partnered with Barwon Water and Alcoa to implement the plan and protect the health of the Anglesea River.
Alcoa has made the pond available for use and Barwon Water has agreed to install and operate the necessary infrastructure on behalf of the Victorian Department of Environment, Land, Water and Planning.
The short-term plan will run as a trial over the upcoming 2016/17 summer period. If successful, it will continue to operate until a long-term management solution is developed.
Victorian Minister for Water Lisa Neville said the government was shaping the future management of the Anglesea River and thanked those involved in the community consultation process.
"I understand how important the river is to the Anglesea community – which is why we have pushed so hard to ensure its long-term sustainability, and bolster its environmental and social value.
"The Community Conversations forums continue to be an important vehicle for community discussion on a range of issues – including future land-use, water, planning and the long term vision for the Anglesea region," Ms Neville said.
Find Related Companies In The Pump Industry Capability Guide
Council adopts flood study, with focus on pump maintenance
Ingham water plant pump upgrades completed
$146.88M TAS irrigation scheme business case approved
Extended on-farm water infrastructure funding for VIC
QLD Regional Water Assessment begins
Tender: sewage pump station renewal
Pumps Journalist September 17, 2019 September 17, 2019 News, Sewage Pumping Stations, Tenders, Water & wastewater 0
Cairns Regional Council (QLD) is seeking tenders for the renewal of identified assets at Sewage Pumps Station YK1, Yorkeys...
Tender: pump station and switchboard replacement
admin December 5, 2018 December 5, 2018 News, Sewage Pumping Stations, Tenders, Water & wastewater 0
Mildura Rural City Council (VIC) is seeking tenders for the design and installation of an electrical switchboard and installation...
Tender: Submersible bore pump in WA
admin February 17, 2013 March 16, 2013 News, Tenders, Water & wastewater 0
The West Australian Department of Agriculture and Food has issued a tender for the construction of a new borehole...
Werribee Sewer Pump Station upgrade completed
Imogen Hartmann February 17, 2021 February 17, 2021 News, Pipelines, Sewage Pumping Stations, Spotlight, Water & wastewater 0
West Werribee Sewer Pump Station has undergone a $12 million upgrade to boost service capacity to meet predicted growth...
Australia's best tasting tap water to compete internationally
Pumps Journalist February 11, 2019 February 13, 2019 Events, News, Water & wastewater 0
Wannon Water and its tap water from the Hamilton Water Treatment Plant will represent Australia at the 29th Annual...
Gippsland wastewater release
Pumps Journalist June 1, 2015 June 1, 2015 News, Water & wastewater 0
Gippsland Water (VIC) will begin a temporary release of untreated trade waste from the Gippsland Water Factory treatment facility...
New investment in Murray irrigation projects
Jessica Dickers June 21, 2016 June 22, 2016 Irrigation, News, Projects, Water & wastewater 0
Round three of the Irrigation Industry Improvement Program (3IP) has been announced, with $177 million now being offered across 186 River...
Tender: HVAC maintenance services
Pumps Journalist August 16, 2019 August 16, 2019 HVAC, News, Tenders 0
The Western Australian Government (WA) is seeking tenders for the provision of planned maintenance for mechanical heating, ventilation and...
Pentair to sell valves and controls businessTender: pump station refurbishment


text:
Drive Parent Engagement and Loyalty with Blackbaud's Total School Solution
Drive Parent Engagement and Loyalty with Blackbaud's Total School Solution
Drawing on over 40 years of experience supporting over 5,000 of the top private K-12 schools in the U.S. and Canada, Blackbaud's industry leading, comprehensive Total School Solution...
Eliminates operational silos to enable collective strategy and collaboration among core school offices
Unlocks a unified and consistent user experience for students, parents, and faculty
Serves as the data foundation, improving insights for better decision making


Want to directly email someone at W Patent but don't know their address?
We're still trying to figure out the format for email addresses at w-patent.jp for sure. We've got the following addresses though for employees currently at the firm. Does this get you any further on your quest?


text:
Experienced businessmen join forces with excellent science, invest € 2 million in the fund at the IOCB
Prague, 30 November 2022. Leading Czech businessmen have joined the support of the most promising scientific projects. Eight prominent entrepreneurs have contributed nearly €2 million to the i&i Biotech Fund (i&i Bio), an investment fund that specializes in finding and developing unique academic startups in the fields of drug development, diagnostics and medical technology. The new investors include among others Ondřej Bartoš from Credo Ventures or Jaroslav Řasa, founder of ABRA Software. With the new contribution, the total capital of the fund has risen to approximately €47 million.
The investment fund i&i Bio was established last year as a result of the cooperation between the bio-innovation center i&i Prague and the European Investment Fund (EIF). It is the first ever fund to support technology transfer not only in the Czech Republic but also in other V4 countries. "We are only interested in the best projects that can succeed on global markets. They must convince us not only of the global uniqueness of their science, but also of their market potential and the managerial qualities of their team," explains Jaromír Zahrádka, the fund's CEO.
"We are only interested in the best projects that can succeed on global markets. They must convince us not only of the global uniqueness of their science, but also of their market potential and the managerial qualities of their team,"
CEO of i&i Biotech Fund
The fact that only the best projects receive funding from i&i Bio is shown by the numbers. So far, out of the 450 projects that applied for the investment from i&i Bio, only six have succeeded. Zahrádka adds: "We have invested about €7.4 million in the selected projects, with a further €58 million raised by these startups from other investors or grants."
A unique ecosystem
The fund i&i Bio was created as part of the innovation ecosystem built by the Institute of Organic Chemistry and Biochemistry of the Czech Academy of Sciences (IOCB), which further consists of the successful company IOCB Tech (a technology transfer office founded by IOCB in 2009) and the bio-innovation center i&i Prague (founded in 2017). Overall, a supportive ecosystem is developing around IOCB, which is unique not only in the Czech Republic, but also at the European level.
"We want to build on the global success of Prof. Holý and his antiviral drugs. We certainly have a lot to offer, for example Dr. Majer's cancer drugs developed in the USA or Dr. Polášek's radioactive lutetium production technology. But without investors and a whole ecosystem of support for the transfer of science into applications, this cannot happen."
Prof. Jan Konvalinka
Director of IOCB
"Transferring the ideas of our scientists into practical use is a key condition for the technological success of this country. Everybody knows it, politicians are committed to it, but it is still a very slow process. Political proclamations are not enough. You need great science comparable to the world's best, but you also need professionals for technology transfer and investors willing to put money into risky new projects. This is exactly what our colleagues at IOCB Tech and i&i Prague are doing," says IOCB Director Prof. Jan Konvalinka and adds: "We want to build on the global success of Prof. Holý and his antiviral drugs. We certainly have a lot to offer, for example Dr. Majer's cancer drugs developed in the USA or Dr. Polášek's radioactive lutetium production technology. But without investors and a whole ecosystem of support for the transfer of science into applications, this cannot happen."
Quality science can now be supported with smaller sums of money
The i&i Bio Investment Fund builds on the incubation and investment activities of the i&i Prague bio-innovation center, which was joined by the EIF as a major European investor. This tandem has now been joined by another 8 (7 Czech and 1 Slovak) private investors. Thanks to the fund, the private investors can invest in the field of new drug development with smaller amounts, which is very effective.
"Therefore, I see the fund and its entire ecosystem as an important opportunity to connect venture capital and interesting scientific projects."
Ondřej Bartoš,
Director of Credo Ventures
Among them is the experienced investor Ondřej Bartoš, Director of Credo Ventures. "Investing in the results of science and research in the field of life sciences, drug development, etc. is a special area requiring very demanding expertise, which i&i Bio with its broad academic background offers. Therefore, I see the fund and its entire ecosystem as an important opportunity to connect venture capital and interesting scientific projects," says Ondřej Bartoš explaining his entry into the i&i Bio fund.
"I consider it crucial for the Czech Republic to create products with very high added value. The only way to achieve this is to take advantage of cutting-edge scientific knowledge in ultra-modern fields and invest in its transfer to business."
Jaroslav Řasa
Founder of ABRA Software
Jaroslav Řasa, founder of ABRA Software, also joined the group of new investors and says: "I consider it crucial for the Czech Republic to create products with very high added value. The only way to achieve this is to take advantage of cutting-edge scientific knowledge in ultra-modern fields and invest in its transfer to business. The i&i Bio Fund has my full confidence. I am happy to be active in science, both in the business and non-profit areas - i.e. by supporting the Neuron Foundation."
i&i Bio is a Luxemburg-based venture capital firm that invests in innovative European Life Sciences companies focused on drug discoveries, medical devices, diagnostics, and digital health. The Fund was created thanks to the cooperation of the biotech incubator i&i Prague and the European Investment Fund (see below). With over €47M under management, i&i Bio plans to invest in about 20 early-stage companies. i&i Bio is led by an experienced team of professionals with backgrounds in private equity, healthcare and venture capital supporting entrepreneurs on their journey to global success. Thanks to close cooperation with the fund's main sponsor, the biotech academic incubator i&i Prague, i&i Bio is supporting and advancing transformative Central European technology companies.
About i&i Prague
i&i Prague focuses on the transfer of new technologies into practice. It was established at the Institute of Organic Chemistry and Biochemistry of the CAS and is dedicated to innovations in the field of drug development, diagnostics and medical devices originating from academic institutions. It supports the creation of spin-off companies and the sale of licenses. So far, the company has participated in the creation or otherwise supported 15 spin-off companies from 5 countries, has an equity stake in 9 of them and has invested over 70 million crowns. Overall, the spin-offs in i&i Prague's portfolio have raised more than CZK 1.8 billion from other investors. In 2021, i&i Prague established the i&i Bio Investment Fund in cooperation with the European Investment Fund. For more information visit www.iniprague.com.
About IOCB Prague
IOCB Prague is a leading internationally recognized research institute whose primary mission is basic research in the areas of chemical biology and medicinal chemistry, organic and materials chemistry, natural products chemistry, biochemistry and molecular biology, physical chemistry, theoretical chemistry, and analytical chemistry. One of the institute's strategic goals, therefore, is the systematic commercialization of and transformation of the results of basic research into products designed to make life better. Since 2010, all activities relating to the transfer of results to practice, applications, and intellectual property have been coordinated by the institute's subsidiary IOCB TECH. Since 2017, the institute launched another subsidiary called i&i Prague, which provides financial backing for the early stages of promising projects developed at the institute and other research and academic centers. For more information visit www.uochb.cz.


Mark Holt and Hamish Muir, cofounders and partners in the London design firm 8vo, also conceived one of the most progressive type journals of the mid- to late 1980s: Octavo. Just before the digital revolution marked the first major departure in type and printing since Gutenberg (if you accept phototype as a blip in type history), the eight issues of Octavo raised the bar of commentary, scholarship and practice. The magazine addressed the history and theory of a new wave of typographic presentation and formulation. Unit Editions has published a complete reprint of the issues as well as reproductions of the handmade mechanicals and proofs—an incredible document. I asked Holt and Muir to talk about the magazine and why it was so influential for those who were beginning to rebel against Modernist orthodoxy.
I subscribed to Octavo when it first came out in 1986. It was as close to a revolutionary graphic design period as there was, and this was one of the clarions. What motivated its publication?
The motivations for working together and our ambitions for both the journal and the commissioned work undertaken by the studio, 8vo, which we co-founded in the summer of 1985, were underpinned by a shared interest in focusing on typographic design as the core component of visual communication. This ran counter to the prevalent trends in UK design at that time—the death throes of the school of big ideas meets design as big business. Our influences were informed by each of us having studied or worked outside the U.K. prior to joining forces—we looked to Europe for inspiration, where type had historically played a key role in graphic design—front and center and not as subservient in the endorsement of a witty idea or a visual pun. The work of the studio would be defined by doing and not just talking about it; the journal provided a more contemplative space to publish work with which we found common cause—in art, poetry and architecture as well as in graphic design. Although the studio and the journal were closely connected, we worked hard to avoid the latter becoming seen as a manifesto, or as some kind of glorified self-promotional project. Indeed, we soon found that a separation was necessary to avoid frightening away potential clients of the studio.
Were you inspired by Typographica or other "intellectual" design magazines?
Not really, although Herbert Spencer's Typographica (2nd Series) was a journal that two of the editors found of interest and regularly purchased back copies of when discovered languishing on shelves in second-hand bookstores. One thing we were keen to avoid with Octavo was a focus on the ephemeral; to avoid the pitfalls of the sorts of extended articles that had appeared in some publications; endless pages of 'rubbings of Cornish gravestones' or 'typography on manhole covers'—that kind of thing.
The balance of scholarship and prescience was very special. How did you determine what you would cover and why?
We didn't have much of a sense of how the look of Octavo would develop over time but we did have some early starting points for the types of articles themselves. Of course wanting to discuss typography across a range of applications (education, architecture, environment, poetry, art) meant that the range of articles we would require, were, to a degree, pre-determined, in that they needed to fit with the editorial intent. The challenge was more a case of finding best practice and authors best suited to the task. It was also important that the journal have an international flavor. A good example of meeting this challenge is the article by Kenneth Frampton discussing Willi Kunz's poster work for the architecture and planning school at Columbia University (NYC). Early on we especially wanted to document the work of a few unsung heroes, starting with typographer, educator and polymath Anthony Froshaug as well as the work of Geoff White.
You limited yourself to eight issues. Did that put pressure on your decisions?
Quite the opposite in many ways. Having self-defined preset limits—eight issues, A4 16pp + cover and jacket, Unica—certainly helped in defining content issue by issue, and as the project progressed, the trajectory of the design development. Although we didn't have a "plan" when we started, we were keen to avoid an "academic" approach to the design and we were determined that our journal should practice what it preached, responding to both the content of each issue, and in the later issues, the new possibilities within photo-typesetting and page make-up. As a result, the appearance of Octavo evolved, "moving-on" over time. Academic journals tend to start with a three-column grid and never deviate. That didn't interest us. We were more interested in finding a way of making Octavo recognizable as a series without relying on standard editorial design mechanisms for achieving such coherence. But that wouldn't have been possible without the initial conditions imposed at the start.
There are some pages that prefigure the digital shifts in hierarchy. How did you feel when the digital crested?
One of the reasons we featured the (pre-desktop computer) making of the journal in Octavo Redux is as a reminder to ourselves, and of course as a signal to readers, of how different the design process was at that time. Initially, our ambitions and interests for typographic modulation; navigation, layering, information structure and hierarchy, etc were limited initially by what could be fabricated using then traditional hand-based "mechanical" skills. But as typesetting technology became more sophisticated, it was possible to start "engineering" typographic environments—through specification to skilled, professional operators—to levels of accuracy that were way beyond the tolerances of hand skills. (Many of the instructions for the last two print-based issues type were specified to the nearest one-hundreth-of-a-millimeter.) Ironically, it took us several years of working with our own computers (from the early nineties) to get to the same levels of engineering we had used in our pre-desktop work. It was only after we mastered the machine—and had left behind the stupid tricks of instant gratification that early encounters with the software tempted you to try—that we realized the computer (as a design tool) was only a very much neater and more precise way of doing what we had always done.
Is there room for another, a contemporary Octavo?
That's an interesting thought! But what would form would it take, and what would it concern itself with? What would be the-everything's-online-everyone's-a-publisher equivalent of eight issues times sixteen pages over four years? In part answer, it would perhaps be salient to compare then and now, purely in terms of the means of getting word into print, and the inherent "valueness" of things.
The post Octavo: Eight Historic Issues appeared first on Print Magazine.


Youre locked in fight-to-the-death air combat with the enemy! You may be outnumbered -- somehow youve been separated from your buddies -- but this is far from your first mission. Youve been flying your trusty little delta-wing fighter for more months than you care to remember.
In Radar Rat Race the player plays the role of a blue mouse, that has to search for cheese in a labyrinth within a certain time. To make it a bit harder, you are followed by several red mice which bring you certain death when you crash into one of them. As the red mice outnumber you, you should take into account that you might get encircled by several mice. A further peril are the black cats, which lure behind some of the corners. Into those also the red mice can run, but they are only delayed by the cat and not killed. With a "Star Screen" - a trace of stars that can be left behind by the blue mouse - you can temporarily disable followers which are too close.
Unlock the time traveling power of the White Chronicle once again in Radiant Historia: Perfect Chronology. This beloved classic is an expanded from the original Nintendo 3DS™ game and contains a great deal of added gameplay/story content, updated presentation, and new ways to experience the adventure! The continent of Vainqueur is plagued with the spreading desertification, laying the land to waste by turning it slowly into sand. Tensions rise, and war breaks out for the remaining fertile land. Stocke, a Special Intelligence agent of Alistel, is sent on a special mission when he discovers the powers of the relic, the White Chronicle. With his new-found abilities, Stocke will need to right the wrongs of the past in order to prevent the total annihilation of the world. In this version, a new, mysterious character named Nemesia teaches him about the worlds history and unlocks a third timeline to explore the ripple effect of some of his actions with episodic "what-if" scenarios.
Unlike in most other shoot em ups, there are no power-ups. All weapons are available from the start. Weapons can level up, however, becoming more powerful as the player uses them to score points. There are a selection of 7 weapons that can be used at any given time: The game is designed so that there is almost always a right weapon for any situation. The bosses in the game are designed so that they have multiple sections which, if all destroyed before the core of the boss, will award the players with point bonuses. Being able to apply the right weapons on any different boss is key to obtaining these bonuses. For example, a boss may have two sections located on either side of the screen. You could immediately go up to one and begin shooting it with a vulcan, or you could hover in the centre and hit both at the same time with the side bombs. This would increase your chance of obtaining the bonus before the time limit runs out and the boss self-destructs. The game rewards players for "chaining" enemies of just one of three colors, red, blue, or yellow. Whenever the player kills three enemies that are of the same color, who can obtain a points bonus. This also facilitates faster upgrading of weapons.
A strategy puzzle game developed by Jaleco involving blowing up connections between squares in a grid to trap opponents. Radical Bomber!! Jirai-kun ("Jirai" means landmine) is a strategic puzzle game from Jaleco that has more than a passing resemblance to Hudsons Bomberman franchise. However, rather than trying to defeat the opponents in a frantic real-time environment, the goal of Radical Bomber is to carefully think out a plan of action and find a way to trap the opponents by removing connections between each "square" on the map. Successfully isolating an opponent from the rest of the board causes them to forfeit the game, and doing this with every opponent allows Jirai-kun to move onto the next level.


text:
History of Amsterdam International Airport Schiphol
The airport was captured during the war by German forces and renamed 'Fliegerhorst Schiphol'. It was bombed and massively destroyed by the end of 1943 so that it could not be functionally used as an airbase anymore.
Afterward, the airport remnants were fundamentally destroyed by Germans, however, was restored soon enough by the end of the war in 1945.
The construction of the new terminal was finished by the moment of 1949 and the decision of the airport to be the main air hub of the Netherlands was implemented.
In 1967 the airport was expanded by adding another terminal area at its nowadays location. Most of the terminals built back then are still in use at the moment (Departure Halls 1 and 2).
In 1970 few renovations were implemented to allow wide-body airliners and cargo aircraft (as Boeing 747) to use the boarding gates of an airport. The year of 1977 followed up with the trend and a new pier (now called F) was opened. Additionally, the very first rail station was built under the airport in 1978.
The construction of the most recent terminal was finished in 1994 and expanded in 2007 with the Terminal 4, which is, indeed, not considered as a separate building.
The new terminal is planned to start its operation in 2019-2023, that, in turn, would end the concept of the one-terminal airport.


text:
Classic Personal Computer (PC) Games
« Alone in the Dark
Jagged Alliance »
Pirates! (1987)
Pirates! is Sid Meier's firt foray into Strategy Gaming. Before Pirates! he was mainly involved in simulation games such as F-15 Strike Eagle and Silent Service. Just for that, this game deserves it's place in history being the first attempt at strategy games of arguably THE GREATEST STRATEGY GAME DESIGNER OF ALL TIME. If not for Pirates! we may not have Railroad Tycoon, Colonization, Alpha Centauri, and of course Civilization I, II, III, and IV!
This game is so good, every other Pirate game after it had to live up to its gameplay…all the way up to the present day, over twenty years since the game was first released. If that isn't an impressive achievement, I don't know what is. The real brain boggler is what exactly makes this game so good. Somehow everything just came together perfectly…game balance, storyline, replayability, everything. Arcade swordplay, ship-to-ship warfare, morale management, and romantic interludes with various governor's daughters all blend seamlessly into a very immersive experience that you'd like to play over and over.
Filed under Strategy and War Games.
Subscribe to RSS 2.0.
Leave a comment or trackback.
Arcade and Action Games (2098)
Role Playing and Adventure Games (758)
Simulations (390)
Sports Games (584)
Strategy and War Games (883)
Walkthroughs and Hints (3)
Making MS-DOS Games Run in Today's Machines
The Computer Gaming World Hall of Fame
Where to Get these Games
Gaming Arcade Center
Copyright 2008. GoldenAgeofGames.com


This ultra clear screen protector fits perfectly on your screen and is easy to install. The foil does not affect the touch functionality, brightness, colours or the resolution of your screen thanks to the ultra clear technology.
When should I pick an Edge-to-Edge screen protector and when should I pick a normal one?
If you use a case that wraps around the edges of your mobile device, an edge-to-edge protector could possibly damage your screen around the edges.
The edge might cut into the screen.
Use a regular protector in this case.
Ultra-Clear Screen Protector Samsung Galaxy Tab 3 10.1"
Ultra-Clear 2-Pack Screen Protector 10.1"


Todd Amery Constructions in Wangaratta, VIC, has experience in all areas of Builders and can help you find the right Builders solutions. builders for hire, contract builders, and builders and many other Builders products/services are available. Talk to us at (03) 5722 #### for professional advice on any aspect of Builders.


text:
/*globals describe, before, beforeEach, afterEach, after, it*/
/*jshint expr:true*/
var testUtils   = require('../utils'),
    should      = require('should'),
    sinon       = require('sinon'),
    when        = require('when'),
    _           = require('lodash'),

    // Stuff we are testing
    permissions = require('../../server/permissions'),
    effectivePerms = require('../../server/permissions/effective'),
    Models = require('../../server/models'),
    UserProvider = Models.User,
    PermissionsProvider = Models.Permission,
    PostProvider = Models.Post;

describe('Permissions', function () {

    var sandbox;

    before(function (done) {
        testUtils.clearData().then(function () {
                done();
            }).catch(done);
    });

    afterEach(function (done) {
        sandbox.restore();
        testUtils.clearData()
            .then(function () {
                done();
            }).catch(done);
    });

    after(function (done) {
        testUtils.clearData().then(function () {
            done();
        }).catch(done);
    });

    var testPerms = [
            { act: 'edit', obj: 'post' },
            { act: 'edit', obj: 'tag' },
            { act: 'edit', obj: 'user' },
            { act: 'edit', obj: 'page' },
            { act: 'add', obj: 'post' },
            { act: 'add', obj: 'user' },
            { act: 'add', obj: 'page' },
            { act: 'remove', obj: 'post' },
            { act: 'remove', obj: 'user' }
        ],
        currTestPermId = 1,

        createPermission = function (name, act, obj) {
            if (!name) {
                currTestPermId += 1;
                name = 'test' + currTestPermId;
            }

            var newPerm = {
                name: name,
                action_type: act,
                object_type: obj
            };

            return PermissionsProvider.add(newPerm, {user: 1});
        },
        createTestPermissions = function () {
            var createActions = _.map(testPerms, function (testPerm) {
                return createPermission(null, testPerm.act, testPerm.obj);
            });

            return when.all(createActions);
        };

    describe('Init Permissions', function () {

        beforeEach(function (done) {
            sandbox = sinon.sandbox.create();
            testUtils.initData()
                .then(testUtils.insertDefaultUser)
                .then(testUtils.insertDefaultApp)
                .then(function () {
                    done();
                }).catch(done);
        });

        it('can load an actions map from existing permissions', function (done) {
            createTestPermissions()
                .then(permissions.init)
                .then(function (actionsMap) {
                    should.exist(actionsMap);

                    actionsMap.edit.sort().should.eql(['post', 'tag', 'user', 'page', 'theme', 'setting'].sort());

                    actionsMap.should.equal(permissions.actionsMap);

                    done();
                }).catch(done);
        });

        it('can add user to role', function (done) {
            var existingUserRoles;

            UserProvider.findOne({id: 1}, { withRelated: ['roles'] }).then(function (foundUser) {
                var testRole = new Models.Role({
                    name: 'testrole1',
                    description: 'testrole1 description'
                });

                should.exist(foundUser);

                should.exist(foundUser.roles());

                existingUserRoles = foundUser.related('roles').length;

                return testRole.save(null, {user: 1}).then(function () {
                    return foundUser.roles().attach(testRole);
                });
            }).then(function () {
                return UserProvider.findOne({id: 1}, { withRelated: ['roles'] });
            }).then(function (updatedUser) {
                should.exist(updatedUser);

                updatedUser.related('roles').length.should.equal(existingUserRoles + 1);

                done();
            }).catch(done);
        });

        it('can add user permissions', function (done) {
            UserProvider.findOne({id: 1}, { withRelated: ['permissions']}).then(function (testUser) {
                var testPermission = new Models.Permission({
                    name: 'test edit posts',
                    action_type: 'edit',
                    object_type: 'post'
                });

                testUser.related('permissions').length.should.equal(0);

                return testPermission.save(null, {user: 1}).then(function () {
                    return testUser.permissions().attach(testPermission);
                });
            }).then(function () {
                return UserProvider.findOne({id: 1}, { include: ['permissions']});
            }).then(function (updatedUser) {
                should.exist(updatedUser);

                updatedUser.related('permissions').length.should.equal(1);

                done();
            }).catch(done);
        });

        it('can add role permissions', function (done) {
            var testRole = new Models.Role({
                name: 'test2',
                description: 'test2 description'
            });

            testRole.save(null, {user: 1})
                .then(function () {
                    return testRole.load('permissions');
                })
                .then(function () {
                    var rolePermission = new Models.Permission({
                        name: 'test edit posts',
                        action_type: 'edit',
                        object_type: 'post'
                    });

                    testRole.related('permissions').length.should.equal(0);

                    return rolePermission.save(null, {user: 1}).then(function () {
                        return testRole.permissions().attach(rolePermission);
                    });
                })
                .then(function () {
                    return Models.Role.findOne({id: testRole.id}, { withRelated: ['permissions']});
                })
                .then(function (updatedRole) {
                    should.exist(updatedRole);

                    updatedRole.related('permissions').length.should.equal(1);

                    done();
                }).catch(done);
        });

    });

    describe('With Permissions', function () {

        beforeEach(function (done) {
            sandbox = sinon.sandbox.create();
            testUtils.initData()
                .then(testUtils.insertDefaultUser)
                .then(testUtils.insertDefaultApp)
                .then(function () {
                    done();
                }).catch(done);
        });

        it('does not allow edit post without permission', function (done) {
            var fakePage = {
                    id: 1
                };

            createTestPermissions()
                .then(permissions.init)
                .then(function () {
                    return UserProvider.findOne({id: 1});
                })
                .then(function (foundUser) {
                    var canThisResult = permissions.canThis(foundUser);

                    should.exist(canThisResult.edit);
                    should.exist(canThisResult.edit.post);

                    return canThisResult.edit.page(fakePage);
                })
                .then(function () {
                    done(new Error('was able to edit post without permission'));
                }).catch(done);
        });

        it('allows edit post with permission', function (done) {
            var fakePost = {
                    id: '1'
                };

            createTestPermissions()
                .then(permissions.init)
                .then(function () {
                    return UserProvider.findOne({id: 1});
                })
                .then(function (foundUser) {
                    var newPerm = new Models.Permission({
                        name: 'test3 edit post',
                        action_type: 'edit',
                        object_type: 'post'
                    });

                    return newPerm.save(null, {user: 1}).then(function () {
                        return foundUser.permissions().attach(newPerm);
                    });
                })
                .then(function () {
                    return UserProvider.findOne({id: 1}, { withRelated: ['permissions']});
                })
                .then(function (updatedUser) {

                    // TODO: Verify updatedUser.related('permissions') has the permission?
                    var canThisResult = permissions.canThis(updatedUser.id);

                    should.exist(canThisResult.edit);
                    should.exist(canThisResult.edit.post);

                    return canThisResult.edit.post(fakePost);
                })
                .then(function () {
                    done();
                }).catch(done);
        });

        it('can use permissable function on Model to allow something', function (done) {
            var testUser,
                permissableStub = sandbox.stub(PostProvider, 'permissable', function () {
                    return when.resolve();
                });

            testUtils.insertAuthorUser()
                .then(function () {
                    return UserProvider.findAll();
                })
                .then(function (foundUser) {
                    testUser = foundUser.models[1];

                    return permissions.canThis({user: testUser.id}).edit.post(123);
                })
                .then(function () {
                    permissableStub.restore();
                    permissableStub.calledWith(123, { user: testUser.id, app: null, internal: false })
                        .should.equal(true);

                    done();
                })
                .catch(function () {
                    permissableStub.restore();

                    done(new Error('did not allow testUser'));
                });
        });

        it('can use permissable function on Model to forbid something', function (done) {
            var testUser,
                permissableStub = sandbox.stub(PostProvider, 'permissable', function () {
                    return when.reject();
                });

            testUtils.insertAuthorUser()
                .then(function () {
                    return UserProvider.findAll();
                })
                .then(function (foundUser) {
                    testUser = foundUser.models[1];

                    return permissions.canThis({user: testUser.id}).edit.post(123);
                })
                .then(function () {

                    permissableStub.restore();
                    done(new Error('Allowed testUser to edit post'));
                })
                .catch(function () {
                    permissableStub.calledWith(123, { user: testUser.id, app: null, internal: false })
                        .should.equal(true);
                    permissableStub.restore();
                    done();
                });
        });

        it('can get effective user permissions', function (done) {
            effectivePerms.user(1).then(function (effectivePermissions) {
                should.exist(effectivePermissions);

                effectivePermissions.length.should.be.above(0);

                done();
            }).catch(done);
        });

        it('can check an apps effective permissions', function (done) {
            effectivePerms.app('Kudos')
                .then(function (effectivePermissions) {
                    should.exist(effectivePermissions);

                    effectivePermissions.length.should.be.above(0);

                    done();
                })
                .catch(done);
        });

        it('does not allow an app to edit a post without permission', function (done) {
            // Change the author of the post so the author override doesn't affect the test
            PostProvider.edit({'author_id': 2}, {id: 1})
                .then(function (updatedPost) {
                    // Add user permissions
                    return UserProvider.findOne({id: 1})
                        .then(function (foundUser) {
                            var newPerm = new Models.Permission({
                                name: 'app test edit post',
                                action_type: 'edit',
                                object_type: 'post'
                            });

                            return newPerm.save(null, {user: 1}).then(function () {
                                return foundUser.permissions().attach(newPerm).then(function () {
                                    return when.all([updatedPost, foundUser]);
                                });
                            });
                        });
                })
                .then(function (results) {
                    var updatedPost = results[0],
                        updatedUser = results[1];

                    return permissions.canThis({ user: updatedUser.id })
                        .edit
                        .post(updatedPost.id)
                        .then(function () {
                            return results;
                        })
                        .catch(function (err) {
                            /*jshint unused:false */
                            done(new Error('Did not allow user 1 to edit post 1'));
                        });
                })
                .then(function (results) {
                    var updatedPost = results[0],
                        updatedUser = results[1];

                    // Confirm app cannot edit it.
                    return permissions.canThis({ app: 'Hemingway', user: updatedUser.id })
                        .edit
                        .post(updatedPost.id)
                        .then(function () {
                            done(new Error('Allowed an edit of post 1'));
                        }).catch(done);
                }).catch(done);
        });

        it('allows an app to edit a post with permission', function (done) {
            permissions.canThis({ app: 'Kudos', user: 1 })
                .edit
                .post(1)
                .then(function () {
                    done();
                })
                .catch(function () {
                    done(new Error('Allowed an edit of post 1'));
                });
        });

        it('checks for null context passed and rejects', function (done) {
            permissions.canThis(undefined)
                .edit
                .post(1)
                .then(function () {
                    done(new Error('Should not allow editing post'));
                })
                .catch(done);
        });

        it('allows \'internal\' to be passed for internal requests', function (done) {
            // Using tag here because post implements the custom permissable interface
            permissions.canThis('internal')
                .edit
                .tag(1)
                .then(function () {
                    done();
                })
                .catch(function () {
                    done(new Error('Should allow editing post with "internal"'));
                });
        });

        it('allows { internal: true } to be passed for internal requests', function (done) {
            // Using tag here because post implements the custom permissable interface
            permissions.canThis({ internal: true })
                .edit
                .tag(1)
                .then(function () {
                    done();
                })
                .catch(function () {
                    done(new Error('Should allow editing post with { internal: true }'));
                });
        });
    });
});