From pocket parks to 13.5-acre recreation spaces, new outdoor areas are being planned in Newport Beach.
City administrators praised existing facilities and outlined plans for further construction at a public Speak Up Newport event Wednesday night in the Civic Center community room.
Groundbreaking for bigger projects like Sunset Ridge Park on West Coast Highway at Superior Avenue and Marina Park between 15th and 18th streets on Balboa Boulevard mark the start to two major parks that have been years in the making, said Public Works Director Dave Webb.
Sunset Ridge Park will include a Pony baseball field, soccer fields and a play area, while Marina Park will feature a community center, visitor marina and Girl Scout house.
Also in the works are an expansion of Sunset View Park (near Sunset Ridge Park on Superior Avenue), an enhancement of Back Bay View Park (1900 Back Bay Drive) and development of a Corona del Mar pocket park (at Jasmine Avenue and West Coast Highway).
Further down the line may be park in the Lower Castaways and a community center in west Newport Beach, Webb said.
These build on a strong foundation for recreation in the city, including 10 community centers, 32 tot lots, 20 tennis courts and 24 basketball courts, said Laura Detweiler, director of recreation and senior services.
"Most of you would be surprised," she said to the crowd of about 40. "We're at 64 parks and counting."
Detweiler praised an active community and a committed city council for their support of ongoing outdoor development.
More than 340 acres in the city are developed parkland, she said.
That number will soon increase, as the city aims to have 5 acres of land for every 1,000 persons.
As Detweiler put it, "We hold ourselves to a much higher standard here in Newport Beach."


text:
Abortion Clinic Caught Dumping Container of Bloody Refuse From Aborted Babies
State | Cheryl Sullenger | Aug 20, 2020 | 11:14AM | Baton Rouge, Louisiana
During a time when people are urged to wear masks and wash incessantly in an attempt to keep from getting sick, a Baton Rouge, Louisiana, abortion facility has committed a very real – and appallingly disgusting – public health violation without response from state authorities.
According to pro-life activist Richard Mahoney, after the Delta Clinic of Baton Rouge finished conducting a full day of abortions, on August 13, 2020, a construction crew moved in to begin tearing out walls, carpeting, and other items in preparation for a remodel.
One of the items removed from the facility was a waste container filled with bloody refuse from abortions that had obviously taken place earlier that day.
Photos provided to Operation Rescue by Mahoney show an open cardboard box lined with a red biohazard bag that was partially filled with soiled blue pads, used masks, and bloody tubing with what appeared to be a cannula used in surgical abortions still attached.
The open box was placed in a trash-strewn area outside the back door of the facility where the biohazard material was fully accessible to people and animals.
Click here to sign up for pro-life news alerts from LifeNews.com
The Louisiana Department of Environmental Quality includes the following in its description of biohazardous materials on its website:
Human pathological wastes including tissue, organs, body parts and fluids that are removed during surgery or autopsy.
Human blood, human blood products, blood collection bags, tubes and vials.
The website further states:
Blood and other potentially infectious material (other than sharps) must be placed in leakproof, color-coded (or biohazard-labeled) container before it leaves the facility. If outside contamination occurs, or if the container is punctured, it must be placed in another leakproof, labeled or color-coded container.
…Potentially infectious biomedical waste (i.e., medical waste) must be packaged in a manner that prevents exposure to the material. Liquids must be in a sturdy, leak-resistant container.
Complaints made by Mahoney about the biohazard waste disposal violation have so far been ignored by Louisiana authorities.
As of August 17, 2020, the open box containing the bloody refuse was still present and unmoved from the back of the abortion facility.
"In a climate where there is a hyper-alertness to contaminates, allowing abortion facilities to dump bloody abortion waste outside in an open cardboard box is inconsistent with claims of wanting to keep the public safe," said Operation Rescue President Troy Newman.
It should be little wonder that biohazard waste at the Delta Clinic is treated with reckless disregard for health and safety laws.
On April 2, 2020, an abortionist named Musa Williams, an intern at the LSU Medical Center, traveled from what was then the coronavirus hot spot of New Orleans to conduct abortions at the Delta Clinic of Baton Rouge wearing disgustingly soiled scrubs in violation of the most basic infection control protocols.
"Why the Louisiana Department of Health allows such infection control violations without a word of response shows that it is unconcerned about health violations at abortion facilities," said Newman. "Sadly, this means that abortion facilities can get away with any violation without consequence in Louisiana, and that just makes them more dangerous than they already were."
Bit of trivia about the Delta Clinic: That facility is allegedly still owned by Leroy T. Brinkley, who once owned two abortion facilities in Delaware. Prior to 2010, those Delaware facilities employed a Pennsylvania abortionist named Kermit Gosnell. Brinkley had another employee at the Delta Clinic named Eileen O'Neill, who relinquished her Louisiana medical license due to what she called "post-traumatic stress," which speaks volumes about her time at Delta.
Brinkley recommended O'Neill to Gosnell for hire at his Women's Medical Society clinic in West Philadelphia. There, O'Neill practiced as a "doctor" even though she held no valid medical license. O'Neill was arrested and tried with Gosnell in 2013, when Gosnell was convicted of murdering three babies who were born alive in the midst of squalid conditions at his "House of Horrors" abortion facility. In the wake of the Gosnell scandal, Brinkley's two Delaware abortion facilities were closed by the state after it was learned that Gosnell illegally started late-term abortions on women there then sent them to his Philadelphia abortion clinic for completion of the abortions. Meanwhile, the Delta Clinic continues to operate.
That should answer some questions about why Operation Rescue believes the Delta Clinic poses a serious and ongoing danger to the public.
LifeNews.com Note: Cheryl Sullenger is a leader of Operation Rescue.

redpajama_set_name: RedPajamaCommonCrawl


text:
Poor demand for ECCDs in Trashigang
Education officials said parents lack awareness on the need to invest early in their children's development
Education: Although Trashigang has 13 community-based Early Childhood Care and Development (ECCD) centers spread across the dzongkhag, there were no workplace- based ECCDs until a few days ago.
Unlike in community-based ECCDs, parents need to pay a nominal fee for the workplace ones. The first and the only private ECCD in Trashigang town confronted with poor support from parents and eventually had to shut down.
Recently, the district education office started a workplace-based ECCD on a trial basis at the new multi-sports hall. Focal person of ECCD, the assistant dzongkhag education officer (ADEO), Ugyen Thinley said parents in the town don't invest in their children from an early age.
"In the process, hundreds of children are being deprived of a vital part of their wholesome development," he said. "It has been scientifically and psychologically proven that children need proper care from parents until they turn eight."
This has been further confirmed through the performance gap that exists between children who receive early interventions and those who don't. However, many parents are not aware of this and prefer not to enroll their children in ECCD centers in Trashigang.
"Parents must understand that their children are preparing for formal education and would develop confidence, language and communication skills among others as they grow up," the ADEO said. "It is also expected to contribute toward mitigating school dropout rates."
Further, it could bring down the rate of academic failure in schools and help in containing social issues related to youth such as drug abuse and teenage pregnancy.
The workplace-based ECCD facility would take in children between three to five years and keep a facilitator for every 15 children. Given the unavailability of a separate budget of ECCDs, the district office is making use of the existing structure.
"Other than reducing the performance gap, another objective is to encourage the establishment of competitive private ECCDs. In future, we are hoping for a massive change in the attitude of parents," the ADEO added.
During the 2015-2016 fiscal year, the office has plans to open another two workplace-based ECCD centers at Kanglung and Rangjung. Three community-based ECCDs at Gazarey, Gongthong and Tsangpo are also in the pipeline.
In the case of community-based ECCD centers, a major challenge could be attributed to the fact that most villages are scattered and many are unable to take advantage of the facilities. All of the 13 existing centers are located in clustered villages.
However, change in the mindset of parents is slowly becoming evident. The first workplace-based ECCD has already enrolled about 100 children.
A parent from Rangjung, Yangku, 32, who has a three-year-old daughter, is all set to enroll her once a center is established at Rangjung Autonomous HSS.
"We have been hearing about the center coming up for quite some time and most parents were skeptical if the idea would materialise," he said. "A lot of parents here are waiting for the center."
According to a manual released by the education ministry, the demand for ECCD is growing as family and social structures evolve with development and changing times.
"The traditional practice of care provided by family members is becoming increasingly difficult as mothers go to work, both in rural and urban areas, and the joint family system becomes increasingly difficult to practice," the manual states.
Thus, it states, that all children do not receive the care and stimulation that is critical in the early childhood period.
After recognising the prevailing reality and the urgent need for ECCD services, the education ministry undertook the piloting of community-based ECCD centers in 2008 and initiated an expansion of the model since 2009.
Tshering Wangdi, Trashigang


text:
Wimmeria mexicana is a large shrub or small tree, often reaching  in height, that is common in the Southeastern United States and in regions of Mexico, including the states of Oaxaca, Chihuahua, and central to eastern Sonora. It is commonly called papelío and algodoncillo.

Description
The branches and trunk,  in diameter, are erect to ascending, making it more tall than wide. Large, flaky, papery, gray plates cover its smooth, white bark. Young twigs, petioles, and flower axils sometimes have short, tiny hairs, but are mostly glabrous. The crown is spread out and sparse. The leaves, exstipulate and 2–6 cm in length, alternate and vary in shape between lanceolate, elliptic, and obovate. Flowers tend to be 7.5–8 mm wide, white to cream colored, bisexual, with 5 petals on 5 sepals, and arranged in axillary cyme. The fruits, 1–1.4 cm across, are papery, one-seeded, three-lobed samaras, similar to species of Dodonaea.

Wimmeria mexicana mass flowers around July to October, or often after heavy Autumn rain, attracting a large number of insects, particularly bees and flies. The leaves have serrated edges due to insects.

Uses
Wood from the tree is commonly used to make fence posts, house beams, and firelogs. Also, the Guarijío prepare herbal tea, malo en el cuerpo (pain in the body), from W. mexicana, chamomile, and cilantro.

Taxonomy
Wimmeria confusa, a synonym of W. mexicana, was so named because it had been previously confused with Wimmeria concolor and was so figured in William Hooker's Icones Plantarum. W. confusa was named by William Hemsley in 1878, based on a plant collected by Karl Hartweg. The same year, Ludwig Radlkofer described W. pallida, based on the same Hartweg specimen as well as specimens collected by Thaddäus Haenke (perhaps in Acapulco) and Frederik Liebmann. This was confusingly also called W. confusa in Biologia Centrali-Americana.

References

External links

 Wimmeria mexicana (Algodoncillo, Papelío)

mexicana
Flora of Northeastern Mexico
Flora of Southwestern Mexico
Flora of the Southeastern United States
Trees of Mexico
Trees of the Southeastern United States
Plants described in 1825
Taxa named by José Mariano Mociño
Taxa named by Martín Sessé y Lacasta
Taxa named by Alphonse Pyramus de Candolle
Taxa named by Cyrus Longworth Lundell

redpajama_set_name: RedPajamaWikipedia


text:
#ifndef TENSORFLOW_CORE_KERNELS_DEBUG_OPS_H_
#define TENSORFLOW_CORE_KERNELS_DEBUG_OPS_H_

#include <numeric>

#include "tensorflow/core/platform/bfloat16.h"

#if GOOGLE_CUDA || TENSORFLOW_USE_ROCM
#include "tensorflow/core/common_runtime/gpu/gpu_event_mgr.h"
#include "tensorflow/core/common_runtime/gpu/gpu_util.h"
#include "tensorflow/core/util/determinism.h"
#endif

#if GOOGLE_CUDA
#include "tensorflow/core/platform/cuda.h"
#elif TENSORFLOW_USE_ROCM
#include "tensorflow/core/platform/rocm.h"
#endif

#include "tensorflow/core/debug/debug_io_utils.h"
#include "tensorflow/core/framework/device_base.h"
#include "tensorflow/core/framework/op_kernel.h"
#include "tensorflow/core/framework/tensor_util.h"
#include "tensorflow/core/lib/core/notification.h"
#include "tensorflow/core/lib/strings/stringprintf.h"
#include "tensorflow/core/util/debug_events_writer.h"

namespace tensorflow {

// Copy op for debugging.
// Performs CPU-to-CPU or GPU-to-GPU deep-copying of tensor, depending on the
// device on which the tensor is allocated.
class CopyOp : public OpKernel {
 public:
  explicit CopyOp(OpKernelConstruction* context) : OpKernel(context) {
    OP_REQUIRES_OK(context, context->GetAttr("tensor_name", &tensor_name_));

    std::vector<string> debug_ops_spec;
    OP_REQUIRES_OK(context,
                   context->GetAttr("debug_ops_spec", &debug_ops_spec));
    for (const string& debug_op_spec : debug_ops_spec) {
      // Assume debug_op_spec has the format
      // <debug_op>;<debug_url>;<gated_grpc>, e.g.,
      // DebugIdentity;grpc://localhost:3333;1
      const std::vector<string> items = str_util::Split(debug_op_spec, ";");
      OP_REQUIRES(
          context, items.size() == 3,
          errors::Internal(
              "Unexpected number of semicolons in debug_ops_spec element: ",
              debug_op_spec));
      debug_op_and_url_specs_.push_back(
          DebugWatchAndURLSpec(strings::StrCat(tensor_name_, ":", items[0]),
                               items[1], items[2] == "1"));
    }
  }

  void Compute(OpKernelContext* context) override {
    const Tensor& src_tensor = context->input(0);

    if (src_tensor.IsInitialized() &&
        DataTypeCanUseMemcpy(src_tensor.dtype()) &&
        DebugIO::IsCopyNodeGateOpen(debug_op_and_url_specs_)) {
      // Source tensor is initialized and is mem-copyable. Make a copy.
      Tensor* copied_tensor;
      OP_REQUIRES_OK(context, context->allocate_output(0, src_tensor.shape(),
                                                       &copied_tensor));

#if GOOGLE_CUDA || TENSORFLOW_USE_ROCM
      Device* device = static_cast<Device*>(context->device());
      // Determine if the input tensor is not on CPU (e.g., on GPU).
      bool off_host_input = device->device_type() == DEVICE_GPU &&
                            !context->input_alloc_attr(0).on_host();

      if (off_host_input) {
        DeviceContext* device_ctxt = context->op_device_context();
        // Input is not on host: deep-copy it from GPU to the same GPU.
        Notification done_copy;
        GPUUtil::CopyGPUTensorToSameGPU(
            device, device_ctxt, &src_tensor, copied_tensor,
            [&done_copy](const Status& s) { done_copy.Notify(); });
        done_copy.WaitForNotification();
      } else {
        // The input tensor is on the host (CPU): deep-copy from CPU to CPU.
        *copied_tensor = tensor::DeepCopy(src_tensor);
      }
#else
      *copied_tensor = tensor::DeepCopy(src_tensor);
#endif
    } else {
      // Source tensor is NOT initialized and/or is not mem-copyable: Forward
      // the Tensor object.
      context->set_output(0, src_tensor);
    }
  }

  bool IsExpensive() override { return false; }

 private:
  string tensor_name_;
  std::vector<DebugWatchAndURLSpec> debug_op_and_url_specs_;
};

// Base class of all debug ops.
class BaseDebugOp : public OpKernel {
 public:
  explicit BaseDebugOp(const string& debug_op_name,
                       OpKernelConstruction* context)
      : OpKernel(context), debug_op_name_(debug_op_name) {
    OP_REQUIRES_OK(context, context->GetAttr("debug_urls", &debug_urls_));
    OP_REQUIRES_OK(context, context->GetAttr("gated_grpc", &gated_grpc_));

    string device_name;
    string tensor_name;
    OP_REQUIRES_OK(context, context->GetAttr("device_name", &device_name));
    OP_REQUIRES_OK(context, context->GetAttr("tensor_name", &tensor_name));

    std::vector<string> name_items = str_util::Split(tensor_name, ':');
    string node_name;
    int32_t output_slot = 0;
    OP_REQUIRES(context, name_items.size() == 1 || name_items.size() == 2,
                errors::InvalidArgument("Failed to parse tensor name: \"",
                                        tensor_name, "\""));
    if (name_items.size() == 2) {
      node_name = name_items[0];
      OP_REQUIRES(
          context, strings::safe_strto32(name_items[1], &output_slot),
          errors::InvalidArgument("Invalid string value for output_slot: \"",
                                  name_items[1], "\""));
    } else if (name_items.size() == 1) {
      node_name = name_items[0];
    }

    debug_watch_key_.reset(
        new DebugNodeKey(device_name, node_name, output_slot, debug_op_name_));
  }

  bool IsExpensive() override { return false; }

 protected:
  // Apply gRPC gating (if gated_grpc_ attribute is true).
  //
  // Returns false if and only if all grpc:// debug URLs of the debug op are
  // disabled currently (i.e., gated off), in which case the debug op will emit
  // an empty (size {0}) tensor of undefined data type.
  bool ApplyGrpcGating(OpKernelContext* context) {
    if (gated_grpc_ && !DebugIO::IsDebugNodeGateOpen(
                           debug_watch_key_->debug_node_name, debug_urls_)) {
      // The entire node is gated off: Output an empty tensor and avoid
      // expensive computation.
      Tensor* output_tensor;
      TensorShape shape({0});
      if (!context->allocate_output(0, shape, &output_tensor).ok()) {
        LOG(ERROR) << "Debug node of watch key "
                   << debug_watch_key_->debug_node_name
                   << " failed to allocate empty tensor under gated-off state.";
      }
      return false;
    } else {
      return true;
    }
  }

  // Publish a tensor to all debug URLs of the debug op.
  // Log an error if the publishing failed.
  Status PublishTensor(const Tensor& tensor) {
    if (debug_urls_.empty()) {
      return Status::OK();
    } else {
      Status status = DebugIO::PublishDebugTensor(*debug_watch_key_, tensor,
                                                  Env::Default()->NowMicros(),
                                                  debug_urls_, gated_grpc_);
      if (!status.ok()) {
        LOG(ERROR) << "Debug node of watch key "
                   << debug_watch_key_->debug_node_name
                   << " failed to publish debug tensor data to all URLs "
                   << str_util::Join(debug_urls_, ", ")
                   << ", due to: " << status.error_message();
      }
      return status;
    }
  }

 private:
  const string debug_op_name_;
  std::unique_ptr<DebugNodeKey> debug_watch_key_;
  std::vector<string> debug_urls_;
  bool gated_grpc_;
};

// Identity op for debugging.
//   Output slot 0 carries the debug signal and is always allocated on the
//   host (CPU) as a non-Ref tensor. In the case of DebugIdentityOp,
//   the debug signal is equal to the input tensor.
class DebugIdentityOp : public BaseDebugOp {
 public:
  explicit DebugIdentityOp(OpKernelConstruction* context)
      : BaseDebugOp("DebugIdentity", context) {}

  void Compute(OpKernelContext* context) override {
    if (!ApplyGrpcGating(context)) {
      return;
    }

    OP_REQUIRES_OK(context, PublishTensor(context->input(0)));
    context->set_output(0, context->input(0));
  }
};

// NaN-counter op for debugging.
template <typename T>
class DebugNanCountOp : public BaseDebugOp {
 public:
  explicit DebugNanCountOp(OpKernelConstruction* context)
      : BaseDebugOp("DebugNanCount", context) {}

  void Compute(OpKernelContext* context) override {
    if (!ApplyGrpcGating(context)) {
      return;
    }

    Tensor* output_tensor;
    const Tensor& input = context->input(0);

    // Use DT_INT64/int64 to be consistent with TensorShape::num_elements().
    int64_t nan_count = 0;

    // If the input is an uninitialized tensor, let nan_count be 0.
    if (input.IsInitialized()) {
      // Count NaNs.
      const TensorShape& input_shape = input.shape();
      const T* input_flat = input.template flat<T>().data();

      for (int64_t i = 0; i < input_shape.num_elements(); ++i) {
        if (Eigen::numext::isnan(static_cast<double>(input_flat[i]))) {
          nan_count++;
        }
      }
    }

    TensorShape shape({1});
    OP_REQUIRES_OK(context, context->allocate_output(0, shape, &output_tensor));
    output_tensor->vec<int64_t>()(0) = nan_count;
    OP_REQUIRES_OK(context, PublishTensor(*output_tensor));
  }
};

// Numeric summary op for debugging.
template <typename T>
class DebugNumericSummaryOp : public BaseDebugOp {
 public:
  explicit DebugNumericSummaryOp(OpKernelConstruction* context)
      : BaseDebugOp("DebugNumericSummary", context) {
    OP_REQUIRES_OK(context, context->GetAttr("lower_bound", &lower_bound_));
    OP_REQUIRES_OK(context, context->GetAttr("upper_bound", &upper_bound_));
    OP_REQUIRES_OK(context,
                   context->GetAttr("mute_if_healthy", &mute_if_healthy_));
  }

  void Compute(OpKernelContext* context) override {
    if (!ApplyGrpcGating(context)) {
      return;
    }

    Tensor* output_tensor;
    const Tensor& input = context->input(0);

    int64_t is_initialized = 0;
    int64_t element_count = 0;
    int64_t negative_inf_count = 0;
    int64_t negative_count = 0;
    int64_t zero_count = 0;
    int64_t positive_count = 0;
    int64_t positive_inf_count = 0;
    int64_t nan_count = 0;
    double min = std::numeric_limits<double>::infinity();
    double max = -std::numeric_limits<double>::infinity();
    double sum = 0.0;
    double mean = std::numeric_limits<double>::quiet_NaN();
    double variance = std::numeric_limits<double>::quiet_NaN();

    // Equal to negative_count + zero_count + positive_count.
    int64_t non_inf_nan_count = 0;

    const TensorShape& input_shape = input.shape();
    if (input.IsInitialized()) {
      is_initialized = 1;
      const T* input_flat = input.template flat<T>().data();

      element_count = input_shape.num_elements();
      const bool is_lower_bound_custom = !Eigen::numext::isinf(lower_bound_);
      const bool is_upper_bound_custom = !Eigen::numext::isinf(upper_bound_);

      for (int64_t i = 0; i < element_count; ++i) {
        const double x = static_cast<double>(input_flat[i]);
        if (Eigen::numext::isnan(x)) {
          nan_count++;
        } else if (Eigen::numext::isinf(x)) {
          if (x < 0.0) {
            negative_inf_count++;
          } else {
            positive_inf_count++;
          }
        } else {
          if (is_lower_bound_custom && x <= lower_bound_) {
            negative_inf_count++;
          } else if (is_upper_bound_custom && x >= upper_bound_) {
            positive_inf_count++;
          } else if (x < 0.0) {
            negative_count++;
          } else if (x > 0.0) {
            positive_count++;
          } else {
            zero_count++;
          }

          if (x < min) {
            min = x;
          }
          if (x > max) {
            max = x;
          }

          non_inf_nan_count++;
          sum += x;
        }
      }

      if (non_inf_nan_count > 0) {
        mean = sum / non_inf_nan_count;

        // Do a second pass to compute variance.
        variance = 0.0;
        for (int64_t i = 0; i < element_count; ++i) {
          const double x = static_cast<double>(input_flat[i]);
          if (!Eigen::numext::isnan(x) && !Eigen::numext::isinf(x)) {
            variance += (x - mean) * (x - mean);
          }
        }
        variance /= non_inf_nan_count;
      }
    }

    TensorShape shape({14 + input_shape.dims()});
    OP_REQUIRES_OK(context, context->allocate_output(0, shape, &output_tensor));
    output_tensor->vec<double>()(0) = static_cast<double>(is_initialized);
    output_tensor->vec<double>()(1) = static_cast<double>(element_count);
    output_tensor->vec<double>()(2) = static_cast<double>(nan_count);
    output_tensor->vec<double>()(3) = static_cast<double>(negative_inf_count);
    output_tensor->vec<double>()(4) = static_cast<double>(negative_count);
    output_tensor->vec<double>()(5) = static_cast<double>(zero_count);
    output_tensor->vec<double>()(6) = static_cast<double>(positive_count);
    output_tensor->vec<double>()(7) = static_cast<double>(positive_inf_count);
    output_tensor->vec<double>()(8) = min;
    output_tensor->vec<double>()(9) = max;
    output_tensor->vec<double>()(10) = mean;
    output_tensor->vec<double>()(11) = variance;

    output_tensor->vec<double>()(12) = static_cast<double>(input.dtype());
    output_tensor->vec<double>()(13) = static_cast<double>(input_shape.dims());
    for (size_t d = 0; d < input_shape.dims(); ++d) {
      output_tensor->vec<double>()(14 + d) =
          static_cast<double>(input_shape.dim_sizes()[d]);
    }

    bool mute = mute_if_healthy_ && nan_count == 0 && negative_inf_count == 0 &&
                positive_inf_count == 0;
    if (!mute) {
      OP_REQUIRES_OK(context, PublishTensor(*output_tensor));
    }
  }

 private:
  float lower_bound_;
  float upper_bound_;
  bool mute_if_healthy_;
};

// Identity op for tfdbg v2: Writes debug data using DebugEventsWriter.
class DebugIdentityV2Op : public OpKernel {
 public:
  explicit DebugIdentityV2Op(OpKernelConstruction* context)
      : OpKernel(context),
        device_name_(context->device()->name()),
        output_slot_(-1),
        tensor_debug_mode_(0),
        tfdbg_run_id_() {
    std::vector<string> debug_urls;
    OP_REQUIRES_OK(context, context->GetAttr("debug_urls", &debug_urls));
    for (const string& debug_url : debug_urls) {
      if (absl::StartsWith(debug_url, DebugIO::kFileURLScheme)) {
        dump_roots_.emplace_back(
            debug_url.substr(strlen(DebugIO::kFileURLScheme)));
      } else {
        context->SetStatus(
            errors::Internal("Unsupported debug URL schema in: ", debug_url));
      }
    }
    OP_REQUIRES_OK(context,
                   context->GetAttr("tfdbg_context_id", &tfdbg_context_id_));
    OP_REQUIRES_OK(context, context->GetAttr("op_name", &op_name_));
    OP_REQUIRES_OK(context, context->GetAttr("output_slot", &output_slot_));
    OP_REQUIRES_OK(context,
                   context->GetAttr("tensor_debug_mode", &tensor_debug_mode_));
    if (context->HasAttr("circular_buffer_size")) {
      OP_REQUIRES_OK(context, context->GetAttr("circular_buffer_size",
                                               &circular_buffer_size_));
    } else {
      circular_buffer_size_ =
          tfdbg::DebugEventsWriter::kDefaultCyclicBufferSize;
    }
    if (context->HasAttr("tfdbg_run_id")) {
      OP_REQUIRES_OK(context, context->GetAttr("tfdbg_run_id", &tfdbg_run_id_));
    }
  }

  void Compute(OpKernelContext* context) override {
    const Tensor& tensor = context->input(0);
    for (const string& dump_root : dump_roots_) {
      tfdbg::DebugEventsWriter* debug_events_writer =
          tfdbg::DebugEventsWriter::GetDebugEventsWriter(
              dump_root, tfdbg_run_id_, circular_buffer_size_);
      OP_REQUIRES_OK(context, debug_events_writer->WriteGraphExecutionTrace(
                                  tfdbg_context_id_, device_name_, op_name_,
                                  output_slot_, tensor_debug_mode_, tensor));
    }
    context->set_output(0, tensor);
  }

 private:
  std::vector<string> dump_roots_;
  string tfdbg_context_id_;
  string device_name_;
  string op_name_;
  int32 output_slot_;
  int32 tensor_debug_mode_;
  int64_t circular_buffer_size_;
  string tfdbg_run_id_;
};

typedef Eigen::ThreadPoolDevice CPUDevice;
typedef Eigen::GpuDevice GPUDevice;

#if GOOGLE_CUDA || TENSORFLOW_USE_ROCM
template <typename Tin, typename Tout>
struct CurtHealthLaunch {
  void Run(const GPUDevice& d, const Tin* data, int size, Tout output[1]);
};

extern template struct CurtHealthLaunch<Eigen::half, float>;
extern template struct CurtHealthLaunch<float, float>;
extern template struct CurtHealthLaunch<double, float>;
extern template struct CurtHealthLaunch<Eigen::half, double>;
extern template struct CurtHealthLaunch<float, double>;
extern template struct CurtHealthLaunch<double, double>;

template <typename Tin, typename Tout>
struct ConciseHealthLaunch {
  void Run(const GPUDevice& d, const Tin* data, int size, Tout output[3]);
};

extern template struct ConciseHealthLaunch<Eigen::half, float>;
extern template struct ConciseHealthLaunch<float, float>;
extern template struct ConciseHealthLaunch<double, float>;
extern template struct ConciseHealthLaunch<Eigen::half, double>;
extern template struct ConciseHealthLaunch<float, double>;
extern template struct ConciseHealthLaunch<double, double>;

template <typename Tin, typename Tout>
struct FullHealthLaunch {
  void Run(const GPUDevice& d, const Tin* data, int size, Tout output[6]);
};

extern template struct FullHealthLaunch<Eigen::half, float>;
extern template struct FullHealthLaunch<float, float>;
extern template struct FullHealthLaunch<double, float>;
extern template struct FullHealthLaunch<Eigen::half, double>;
extern template struct FullHealthLaunch<float, double>;
extern template struct FullHealthLaunch<double, double>;

template <typename Tin, typename Tout>
struct ReduceInfNanThreeSlotsLaunch {
  void Run(const GPUDevice& d, const Tin* data, int size, Tout output[3]);
};

extern template struct ReduceInfNanThreeSlotsLaunch<Eigen::half, float>;
extern template struct ReduceInfNanThreeSlotsLaunch<float, float>;
extern template struct ReduceInfNanThreeSlotsLaunch<double, float>;
extern template struct ReduceInfNanThreeSlotsLaunch<Eigen::half, double>;
extern template struct ReduceInfNanThreeSlotsLaunch<float, double>;
extern template struct ReduceInfNanThreeSlotsLaunch<double, double>;

#endif

template <typename Device, typename Tin, typename Tout>
class DebugNumericSummaryV2Op;

// Numeric summary op for tfdbg v2: CPU Kernel.
template <typename Tin, typename Tout>
class DebugNumericSummaryV2Op<CPUDevice, Tin, Tout> : public OpKernel {
 public:
  explicit DebugNumericSummaryV2Op(OpKernelConstruction* context)
      : OpKernel(context) {
    OP_REQUIRES_OK(context,
                   context->GetAttr("tensor_debug_mode", &tensor_debug_mode_));
    OP_REQUIRES_OK(context, context->GetAttr("tensor_id", &tensor_id_));
  }

  void Compute(OpKernelContext* context) override {
    const Tensor& tensor = context->input(0);
    auto in = tensor.flat<Tin>();
    const Tin* data = in.data();
    const int64_t size = in.size();
    Tensor* output_tensor;
    Tout tensor_id = static_cast<Tout>(tensor_id_);
    const Tout num_elem = static_cast<Tout>(context->input(0).NumElements());
    // Disregard lossy cast if mode is REDUCE_INF_NAN_THREE_SLOTS because
    // that mode does not make use of tensor_id.
    if (tensor_debug_mode_ != 8) {
      OP_REQUIRES(
          context, tensor_id_ <= kMaxTensorId,
          errors::InvalidArgument("DebugNumericSummaryV2Op requires "
                                  "tensor_id to be less than or equal to "
                                  "(2^",
                                  std::numeric_limits<Tout>::digits,
                                  "). Given tensor_id:", tensor_id_));
    }

    if (tensor_debug_mode_ == 2) {  // CURT_HEALTH
      TensorShape shape({2});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));
      output_tensor->flat<Tout>()(0) = tensor_id;  // Slot tensor id
      output_tensor->flat<Tout>()(1) = 0.0;        // Has inf or nan
      int fp_props =
          std::accumulate(data, data + size, 0, [](const int x, const Tin& y) {
            return Eigen::numext::isfinite(y) ? x : 1;
          });
      if (fp_props) {
        output_tensor->flat<Tout>()(1) = 1.0;
      }
    } else if (tensor_debug_mode_ == 3) {  // CONCISE_HEALTH
      TensorShape shape({5});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));
      output_tensor->flat<Tout>()(0) = tensor_id;
      output_tensor->flat<Tout>()(1) = num_elem;

      // Accumulator value [neg_inf_count, pos_inf_count, nan_count]
      Tout fp_props[3] = {0.0, 0.0, 0.0};
      std::for_each(data, data + size, [&fp_props](const Tin& y) {
        if (TF_PREDICT_TRUE(Eigen::numext::isfinite(y))) {
          // Do nothing: common case.
        } else if (Eigen::numext::isinf(y)) {
          if (y < static_cast<Tin>(0.f)) {
            ++fp_props[0];
          } else {
            ++fp_props[1];
          }
        } else if (Eigen::numext::isnan(y)) {
          ++fp_props[2];
        }
      });
      output_tensor->flat<Tout>()(2) = fp_props[0];  // Slot for -inf count
      output_tensor->flat<Tout>()(3) = fp_props[1];  // Slot for inf count
      output_tensor->flat<Tout>()(4) = fp_props[2];  // Slot for nan count
    } else if (tensor_debug_mode_ == 4) {            // FULL HEALTH
      TensorShape shape({11});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));
      int num_dims = tensor.dims();
      output_tensor->flat<Tout>()(0) = tensor_id;
      output_tensor->flat<Tout>()(1) = -1.0;  // TODO(144919262): Device ID
      output_tensor->flat<Tout>()(2) = static_cast<Tout>(tensor.dtype());
      output_tensor->flat<Tout>()(3) = static_cast<Tout>(num_dims);
      output_tensor->flat<Tout>()(4) = num_elem;

      // Accumulator value [neg_inf_count, pos_inf_count, nan_count, neg_count,
      //                   zero_count, pos_count]
      Tout fp_props[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
      std::for_each(data, data + size, [&fp_props](const Tin& y) {
        if (TF_PREDICT_TRUE(Eigen::numext::isfinite(y))) {
          if (y < static_cast<Tin>(0.f)) {
            ++fp_props[3];
          } else if (y == static_cast<Tin>(0.f)) {
            ++fp_props[4];
          } else {
            ++fp_props[5];
          }
        } else if (Eigen::numext::isinf(y)) {
          if (y < static_cast<Tin>(0.f)) {
            ++fp_props[0];
          } else {
            ++fp_props[1];
          }
        } else if (Eigen::numext::isnan(y)) {
          ++fp_props[2];
        }
      });
      output_tensor->flat<Tout>()(5) = fp_props[0];   // Slot for -inf count
      output_tensor->flat<Tout>()(6) = fp_props[1];   // Slot for inf count
      output_tensor->flat<Tout>()(7) = fp_props[2];   // Slot for nan count.
      output_tensor->flat<Tout>()(8) = fp_props[3];   // Slot for neg count.
      output_tensor->flat<Tout>()(9) = fp_props[4];   // Slot for zero count.
      output_tensor->flat<Tout>()(10) = fp_props[5];  // Slot for pos count.
    } else if (tensor_debug_mode_ == 5) {             // SHAPE
      TensorShape shape({10});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));

      int num_dims = tensor.dims();
      output_tensor->flat<Tout>()(0) = tensor_id;
      output_tensor->flat<Tout>()(1) = static_cast<Tout>(tensor.dtype());
      output_tensor->flat<Tout>()(2) = static_cast<Tout>(num_dims);
      output_tensor->flat<Tout>()(3) = num_elem;

      // Tensor shape - stored as (6 columns)
      // if num_dim is less than 6, we right pad the shape with zeros
      // if num_dim is greater than 6, we truncate the head (left most) of the
      // dimensions as they are more predictable than the last few (e.g. batch
      // size as first dimension)
      int dim_idx = 4;
      for (int i = std::max(0, num_dims - kShapeDims);
           i < std::max(6, num_dims); ++i) {
        if (i < num_dims) {
          output_tensor->flat<Tout>()(dim_idx++) =
              static_cast<Tout>(tensor.dim_size(i));
        } else {
          output_tensor->flat<Tout>()(dim_idx++) = 0.0;
        }
      }
    } else if (tensor_debug_mode_ == 8) {  // REDUCE_INF_NAN_THREE_SLOTS.
      TensorShape shape({3});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));
      output_tensor->flat<Tout>()(0) = 0.0;  // Slot for -inf.
      output_tensor->flat<Tout>()(1) = 0.0;  // Slot for inf.
      output_tensor->flat<Tout>()(2) = 0.0;  // Slot for nan.

      int fp_props =
          std::accumulate(data, data + size, 0, [](const int x, const Tin& y) {
            int result = x;
            if (TF_PREDICT_TRUE(Eigen::numext::isfinite(y))) {
              // Do nothing: common case.
            } else if (Eigen::numext::isinf(y)) {
              result |= y < static_cast<Tin>(0.f) ? kNegInfBit : kPosInfBit;
            } else if (Eigen::numext::isnan(y)) {
              result |= kNaNBit;
            }
            return result;
          });

      if (fp_props & kNegInfBit) {
        output_tensor->flat<Tout>()(0) = -std::numeric_limits<Tout>::infinity();
      }
      if (fp_props & kPosInfBit) {
        output_tensor->flat<Tout>()(1) = std::numeric_limits<Tout>::infinity();
      }
      if (fp_props & kNaNBit) {
        output_tensor->flat<Tout>()(2) = std::numeric_limits<Tout>::quiet_NaN();
      }
    } else {
      // TODO(cais): Implement other tensor debug modes in debug_event.proto.
      context->SetStatus(errors::Unimplemented(
          "Unimplemented tensor debug mode: ", tensor_debug_mode_));
    }
  }

 private:
  int tensor_debug_mode_;
  int64_t tensor_id_;
  static constexpr int kShapeDims = 6;
  static constexpr int kNegInfBit = 0x01;
  static constexpr int kPosInfBit = 0x02;
  static constexpr int kNaNBit = 0x04;
  static constexpr int64_t kMaxTensorId = 1LL
                                          << std::numeric_limits<Tout>::digits;
};

#if GOOGLE_CUDA || TENSORFLOW_USE_ROCM

template <typename Tin, typename Tout>
class DebugNumericSummaryV2Op<GPUDevice, Tin, Tout> : public AsyncOpKernel {
 public:
  typedef GPUDevice Device;

  explicit DebugNumericSummaryV2Op(OpKernelConstruction* context)
      : AsyncOpKernel(context) {
    OP_REQUIRES_OK(context,
                   context->GetAttr("tensor_debug_mode", &tensor_debug_mode_));
    OP_REQUIRES_OK(context, context->GetAttr("tensor_id", &tensor_id_));
  }

  void ComputeAsync(OpKernelContext* context, DoneCallback done) override {
    Tensor* output_tensor;
    Tout tensor_id = static_cast<Tout>(tensor_id_);
    const Tensor& tensor = context->input(0);
    const Tout num_elem = static_cast<Tout>(tensor.NumElements());
    const Device& d = context->eigen_device<Device>();
    auto input = tensor.flat<Tin>();
    auto check_cb = [this, done]() { done(); };
    // Disregard lossy cast if mode is REDUCE_INF_NAN_THREE_SLOTS because
    // that mode does not make use of tensor_id.
    if (tensor_debug_mode_ != 8) {
      OP_REQUIRES_ASYNC(
          context, tensor_id_ <= kMaxTensorId,
          errors::InvalidArgument("DebugNumericSummaryV2Op requires "
                                  "tensor_id to be less than or equal to "
                                  "(2^",
                                  std::numeric_limits<Tout>::digits,
                                  "). Given tensor_id:", tensor_id_),
          done);
    }

    if (tensor_debug_mode_ == 2) {  // CURT_HEALTH.
      TensorShape shape({2});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));

      auto* stream = context->op_device_context()->stream();
      OP_REQUIRES_ASYNC(context, stream != nullptr,
                        errors::Internal("No GPU stream available."), done);

      se::DeviceMemoryBase output_tensor_ptr(
          output_tensor->flat<Tout>().data(),
          output_tensor->flat<Tout>().size());
      stream->ThenMemZero(&output_tensor_ptr, 2 * sizeof(Tout));
      // Copy tensor_id to slot zero
      stream->ThenMemcpy(&output_tensor_ptr, &tensor_id, sizeof(Tout));
      if (num_elem == 0) {
        done();
        return;
      }

      // Call the GPU kernels for the numerical (inf/nan) checks.
      auto input = context->input(0).flat<Tin>();
      CurtHealthLaunch<Tin, Tout>().Run(d, input.data(), input.size(),
                                        output_tensor->flat<Tout>().data() + 1);

      context->device()
          ->tensorflow_accelerator_device_info()
          ->event_mgr->ThenExecute(stream, std::move(check_cb));
    } else if (tensor_debug_mode_ == 3) {  // CONCISE_HEALTH.
      TensorShape shape({5});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));
      OP_REQUIRES_ASYNC(context, !tensorflow::OpDeterminismRequired(),
                        errors::Unimplemented(
                            "Determinism is not yet supported for "
                            "DebugNumericSummaryV2 when tensor_debug_mode is "
                            "CONCISE_HEALTH."),
                        done);

      auto* stream = context->op_device_context()->stream();
      OP_REQUIRES_ASYNC(context, stream != nullptr,
                        errors::Internal("No GPU stream available."), done);

      se::DeviceMemoryBase output_tensor_ptr(
          output_tensor->flat<Tout>().data(),
          output_tensor->flat<Tout>().size());
      stream->ThenMemset32(&output_tensor_ptr, 0, 5 * sizeof(Tout));
      const Tout static_output[] = {tensor_id, num_elem};
      stream->ThenMemcpy(&output_tensor_ptr, &static_output, 2 * sizeof(Tout));
      if (num_elem == 0) {
        done();
        return;
      }

      // Call the GPU kernels for the numerical (inf/nan) checks.
      ConciseHealthLaunch<Tin, Tout>().Run(
          d, input.data(), input.size(),
          output_tensor->flat<Tout>().data() + 2);

      context->device()
          ->tensorflow_accelerator_device_info()
          ->event_mgr->ThenExecute(stream, std::move(check_cb));
    } else if (tensor_debug_mode_ == 4) {  // FULL HEALTH
      TensorShape shape({11});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));

      auto* stream = context->op_device_context()->stream();
      OP_REQUIRES_ASYNC(context, stream != nullptr,
                        errors::Internal("No GPU stream available."), done);
      OP_REQUIRES_ASYNC(context, !tensorflow::OpDeterminismRequired(),
                        errors::Unimplemented(
                            "Determinism is not yet supported for "
                            "DebugNumericSummaryV2 when tensor_debug_mode is "
                            "FULL_HEALTH."),
                        done);

      se::DeviceMemoryBase output_tensor_ptr(
          output_tensor->flat<Tout>().data(),
          output_tensor->flat<Tout>().size());
      stream->ThenMemset32(&output_tensor_ptr, 0, 11 * sizeof(Tout));

      int num_dims = tensor.dims();
      const Tout static_output[] = {tensor_id,
                                    -1.0,  // TODO(144919262): Device ID
                                    static_cast<Tout>(tensor.dtype()),
                                    static_cast<Tout>(num_dims), num_elem};
      stream->ThenMemcpy(&output_tensor_ptr, &static_output, 5 * sizeof(Tout));
      if (num_elem == 0) {
        done();
        return;
      }

      // Call the GPU kernels for the numerical (inf/nan) checks and
      // pos/neg/zero counts.
      FullHealthLaunch<Tin, Tout>().Run(d, input.data(), input.size(),
                                        output_tensor->flat<Tout>().data() + 5);

      context->device()
          ->tensorflow_accelerator_device_info()
          ->event_mgr->ThenExecute(stream, std::move(check_cb));
    } else if (tensor_debug_mode_ == 5) {  // SHAPE
      TensorShape shape({10});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));

      auto* stream = context->op_device_context()->stream();
      OP_REQUIRES_ASYNC(context, stream != nullptr,
                        errors::Internal("No GPU stream available."), done);

      se::DeviceMemoryBase output_tensor_ptr(
          output_tensor->flat<Tout>().data(),
          output_tensor->flat<Tout>().size());

      int num_dims = tensor.dims();
      Tout static_output[10] = {tensor_id,
                                static_cast<Tout>(tensor.dtype()),
                                static_cast<Tout>(num_dims),
                                num_elem,
                                0.0,
                                0.0,
                                0.0,
                                0.0,
                                0.0,
                                0.0};
      // Tensor shape: right pad zeros, truncate head
      int dim_idx = 4;
      for (int i = std::max(0, num_dims - 6); i < num_dims; ++i) {
        static_output[dim_idx++] = static_cast<Tout>(tensor.dim_size(i));
      }
      // Write to device stream
      stream->ThenMemcpy(&output_tensor_ptr, &static_output, sizeof(Tout) * 10);
      context->device()
          ->tensorflow_accelerator_device_info()
          ->event_mgr->ThenExecute(stream, std::move(check_cb));
    } else if (tensor_debug_mode_ == 8) {  // REDUCE_INF_NAN_THREE_SLOTS.
      TensorShape shape({3});
      OP_REQUIRES_OK(context,
                     context->allocate_output(0, shape, &output_tensor));

      auto* stream = context->op_device_context()->stream();
      OP_REQUIRES_ASYNC(context, stream != nullptr,
                        errors::Internal("No GPU stream available."), done);

      se::DeviceMemoryBase output_tensor_ptr(
          output_tensor->flat<Tout>().data(),
          output_tensor->flat<Tout>().size());
      stream->ThenMemset32(&output_tensor_ptr, 0,
                           output_tensor->flat<Tout>().size() * sizeof(Tout));
      if (num_elem == 0) {
        done();
        return;
      }

      // Call the GPU kernels for the numerical (inf/nan) checks.
      auto input = context->input(0).flat<Tin>();
      ReduceInfNanThreeSlotsLaunch<Tin, Tout>().Run(
          d, input.data(), input.size(), output_tensor->flat<Tout>().data());

      context->device()
          ->tensorflow_accelerator_device_info()
          ->event_mgr->ThenExecute(stream, std::move(check_cb));
    } else {
      // TODO(cais): Implement other tensor debug modes in debug_event.proto.
      context->SetStatus(errors::Unimplemented(
          "Unimplemented tensor debug mode: ", tensor_debug_mode_));
      done();
    }
  }

 private:
  int tensor_debug_mode_;
  int64_t tensor_id_;
  static constexpr int64_t kMaxTensorId = 1L
                                          << std::numeric_limits<Tout>::digits;
};

#endif  // GOOGLE_CUDA || TENSORFLOW_USE_ROCM

}  // namespace tensorflow

#endif  // TENSORFLOW_CORE_KERNELS_DEBUG_OPS_H_

redpajama_set_name: RedPajamaGithub


Teenage sensation Haseeb Hameed has made a cut into the squad of England for Bangladesh tour. His outstanding performances from his debut season awarded him a spot in the squad. He is expected to take spot of Alex Hales and will most probably the opening partner of Alastair Cook in the opening Test match in the coming month.
The youngster unleashed his skills in his first domestic season and alerted the cricket world.
The Indian origin youngster was born on 17th January, 1997 in Bolton, Lancashire.
The rising star is the youngest amongst the three brothers Safwaan and Nauman. His family is crazy about cricket and he did his schooling from Bolton School, Greater Manchester.
An eight year old Haseeb used to wear cricket gear of his older brother who were 12 and 11 years his senior to him.
His dad Ismail loved cricket a lot and it was transferred into Haseeb and his brothers.
In an interview Haseeb highlighted that his dad use to play with him in a nearby park after school. He also emphasized that at age of eight he started playing hard-ball cricket after wearing oversized cricket gear.
Haseeb got rejected for Lancashire's Under-11 team due to being skinny and small. However, he was part of Tonge Cricket Club at age of eight as a leg-spinner.
The 19 year old transformed into a batsman from a bowler after he posted an impressive 48 without getting out. He came out to bat in the end but unlocked his batting skills. In the next summer Hameed cracked a century while opening for Lancashire.
At the age of 11, Hameedachieved the accolade of the best player of the year of his club. He received the Cedric Rhodes Trophy which is given to an Under-19 player for displaying brilliant cricket skills throughout the season.
The teenager was the captain of the Under-19 team and was a strong candidate to make into the squad. However, the rising star was left out of the squad for the World Cup. He got the news in the team hotel in Sri Lanka by the coach Andy Hurry.
The youngster made his first-class debut for Lancashire in August last year. He smashed 28 runs from his first innings against Glamorgan. Mustering his performances further, Hameed bagged 1129 runs by the end of the season. He jolted down an amazing average of above 53 and in process he broke the record of former England captain Mike Atherton as the youngest player from Lancashire to achieve this feat.
Haseeb became the first Lancashire player to bag two centuries in a Roses match. He became the youngest player in the first-class history to score two tons in a match. Furthermore, the rising star is the first teenage opener to post four centuries in a Championship season.
His maiden ton this season came against the Warwickshire side which comprise of best bowling attack. The bowling attack consists of Jeetan Patel, Rikki Clarke and Keith Barker. Hameed's second ton came against Yorkshire which bowling attack comprises of Stuart Broad and Imran Tahir.
The right-hander has brilliant batting skills and elegant stroke. When he received call for the England squad, Lancashire head coach and Cricket Director Ashley Giles and Club Captain Steven Croft were not surprised by it. Both praised Hameed and highlighted to media that he truly deserves the spot.
If Hameed gets a chance to feature in the opening Test at Chittagong, he will become the second teenager to star for England since 1949. The other youngster to feature for England in a Test match was all-rounder Ben Hollioake. Hollioake was just 19 year old when he went up against Australia in 1997.
An 18 year old Brian Close debuted for England in the longest format of the game in 1949.


text:
LGBT Groups Tell State Leaders: Protect Your Trans Students
After Betsy DeVos signals she wants the Education Dept to become less political, LGBT advocates send a letter to all states reminding them of their duty to care for trans students.
Mary Emily O'Hara
Updated Jul. 18, 2017 4:43PM ET / Published Jul. 18, 2017 3:40PM ET
Scott Olson/Getty
On Tuesday, dozens of national LGBT advocacy organizations and attorneys sent a letter to all 50 State Departments of Education asking them to follow federal laws they say protect transgender students — regardless of how the federal Department of Education decides to interpret those laws.
"Schools that discriminate against transgender students, such as by denying them access to bathrooms and other single-sex facilities that correspond with their gender identity or failing to protect transgender students from harassment, are violating Title IX and the Constitution's Equal Protection Clause," reads the letter, primarily sponsored by Lambda Legal, the National Women's Law Center, and Public Justice.
The letter tells states that ever since this February, when the Trump administration rescinded Department of Education and Department of Justice guidance protecting transgender students, some schools have been left confused over whether trans students still have the same rights.
"We are concerned that the withdrawal of the Title IX guidance might lead some schools to believe that transgender students are not entitled to access bathrooms or other single-sex facilities consistent with their gender identity, or that the law or their obligations under Title IX to protect transgender students have somehow changed. That is simply not the case," reads the letter.
When the Justice and Education departments pulled back from the transgender student guidance, they said in a court filing that more investigation was needed to determine whether such a policy was necessary.
The original Obama-era guidance issued in a 2016 "Dear Colleague" note instructed school districts to interpret Title IX to include gender identity under sex discrimination protections. According to the attorneys and advocates who signed on to Tuesday's letter, the law hasn't changed — and courts have long since decided that transgender students are protected by laws banning sex discrimination in schools.
Tuesday's letter to states goes out just days after federal Secretary of Education Betsy DeVos wrote, in a separate letter to Sen. Patty Murray, that the federal agency overseeing student civil rights and education policy would strive to remain "fair and neutral."
DeVos also slammed Obama-era civil rights policies as "overreaching" efforts that "punish and embarrass institutions rather than work with them to correct civil rights violations."
Now, the clock is ticking on a new policy. With some schools starting in August, time is running out for the Department of Education to issue a firm stance on transgender student access to bathrooms and other private facilities, among other civil rights issues.
Failing to introduce a policy would leave so many school districts — and court cases — in chaos, many experts expect new guidelines any day now.
Log Cabin Republicans (LCR) — specifically, the group's Transgender Leadership Caucus — is just one of several LGBT organizations that have been meeting with Education officials in the Office of Civil Rights to give input on transgender student rights.
"Our suggestion, when we met with them in May and June, was that the time for prescribing policy ideally is within this next month," said Gregory T. Angelo, LCR President, citing the impending start of the 2017-2018 school year.
Angelo said he believes the Office of Civil Rights, headed by Candice Jackson, has made a good faith effort to meet with transgender advocates and understands the issues at hand.
"Given the amount of time and thoughtfulness they have given to trans issues over the last four months," Angelo said, "I would be surprised if they did not issue a statement affirming the worth and dignity of transgender students, and furthermore let transgender students and all students know that the Department of Education is there to defend their rights."
But for others, DeVos' July 11th letter to Sen. Murray was an indicator of the Trump administration's mandate to overturn all Obama-era progress for LGBT civil rights.
Sharon McGowan, a former Justice Department attorney with the Civil Rights Division who now leads strategy for Lambda Legal, said the language in DeVos' letter was "ominous."
"She's using this language that suggests the Department of Education is in need of some massive correction," said McGowan. "Having been inside the government, watching the painstaking deliberation the Department of Education went through to receive input from schools and administrators and agencies...they [DeVos and colleagues] just want to create a narrative to undermine the legitimacy of this policy."
Tuesday's letter from the LGBT advocates to state education departments basically warns states that the federal government may no longer be motivated to protect the civil rights of transgender students — while also warning that schools will still face lawsuits if they don't comply with legal interpretations that say discrimination based on gender identity violates federal law.
"Schools are obligated to protect transgender students in compliance with the law," reads the letter, "Regardless of whether they face legal recourse from the federal government."
GLSEN, the LGBT student rights group that also signed on to Tuesday's letter, has attended meetings with education officials to discuss new transgender student guidance. But the organization isn't happy with DeVos' latest statements deriding the previous administration's approach to civil rights.
"In her letter, Sec. DeVos implies that investigating complaints into discrimination against transgender students is inherently biased, privileging transgender students over other complainants. Nothing could be further from the truth," said GLSEN Director of Public Policy Nathan Smith.
"One cannot be 'neutral and impartial' by refusing to protect transgender students from well documented and disproportionate harassment and discrimination," Smith said. "To the contrary, any inaction on reports of such discrimination is by definition biased and partial."


text:
Deutsch Svenska
Radisson Blu Senator Hotel, Lubeck
Radisson Blu Senator Hotel, Lübeck
Willy-Brandt-Allee 6, Lubeck,23554,Germany
info.luebeck@radissonblu.com
Rest up by the River Trave near UNESCO World Heritage sites
Be charmed by historic northern Germany at our Lübeck hotel
Located directly on the bank of the River Trave and just a moment's stroll from the UNESCO World Heritage Old Town, the Radisson Blu Senator Hotel, Lübeck is the perfect base for enjoying the many charms of northern Germany. With the city's main train station only 550 meters away, our hotel is easily accessible. Head out from our Lübeck hotel's front doors and in just a few minutes you'll reach the well-preserved Old Town. Take in the local landmarks such as the Holsten Gate, a Gothic construction dating from the 15th century, and Lübeck Cathedral, a stunning Lutheran church with over 800 years of history. Recharge your batteries and watch the world go by while indulging in a marzipan cappuccino in the magnificent Market Square.
Wine and dine in the hotel's restaurants and bars
After traversing the Old Town, head back to our Lübeck hotel for dinner with a view. Our restaurant Nautilo offers international classics, and the vistas from the terrace will ensure an unforgettable dining experience. If you'd prefer a taste of traditional Germany, the Kogge Tavern serves up hearty local fare as well as delicious national beers. Wind down with a cocktail or two at Wunderbar, our elegant in-house bar with views across the Old Town.
Magnificent views await you at our elegant rooms in Lübeck
Radisson Blu Senator Hotel, Lübeck features 224 rooms for business or leisure travelers, complete with free Wi-Fi and in-room coffee and tea facilities.
2 twin or 1 king
With our Standard Room, you will have everything you need for a comfortable stay and a good night's sleep.
For extra space, book one of our Superior Rooms. Everything you need is already in the room.
These Junior Suites feature separate sleeping and living areas, ideal for guests who are planning an extended stay.
The expansive Presidential Suite boasts a separate living area and two bedrooms.
Organize a meeting in the best-located hotel in Lübeck. Choose from one of our six meeting rooms for conferences and presentations on our mezzanine level, offering 227 square meters of space and outfitted with the latest audiovisual equipment and presentation materials. On the ground floor, our two largest meeting rooms spanning 436 square meters and connections to a foyer for coffee breaks and receptions.
Romance Experience
Enjoy a romantic getaway with our package, which includes champagne and breakfast in bed.
JANUARY SALE: SAVE UP TO 25%
Save up to 25% on weekends in 2020 across Europe, the Middle East, and Africa. Book by January 31.
Take a trip with your loved one
Save up to 25% on weekends in Europe, the Middle East, and Africa
Our hotel in Lübeck, Germany provides an ideal base for exploring the Old Town district, named a UNESCO World Heritage site for its stunning medieval architecture. You can easily walk to Holstentorplatz and several noteworthy churches and then end the day with a performance at the Theater of Lübeck. If you need a break from the city, the shores of the Baltic Sea are about a 20-minute drive away.
0.1 mi / 0.16 km from the hotel
Take a photo in front of the city's most iconic landmark: this massive Medieval city gate, built in 1464 to mark the boundary of the Hanseatic city Lübeck.
Music and Congress Hall
Attend an orchestral concert, conference or exhibition at this glassy modern cultural center which houses the philharmony, plus a congress center and exhibition hall.
Theaterschiff (showboat) Lubeck
Enjoy a hilarious night out on board this ship which hosts entertaining theatre and comedy shows (usually in German), as well as a restaurant and cocktail bar.
How to get to the Radisson Blu Senator Hotel, Lübeck
Willy-Brandt-Allee 6, Lubeck23554, Germany
Situated on the banks of the River Trave near Lübeck city center, our hotel offers an ideal location with easy access to transport and attractions. Just over the River Trave, travelers find the city's Old Town, awash with its renowned Brick Gothic Architecture. While you're here, don't miss one of the most famous sites, the Holsten city gate.
From Hamburg Airport
The S-Bahn (suburban rail network) S1 operates between the International Airport Hamburg Fuhlsbüttel and Hamburg's main railway station. There are regular trains between Hamburg and Lubeck's main railway station. The main station Lübeck is only a 8-minute (650 meters) walk from the hotel.
Take the fastest route via A1 to arrive at the hotel. The journey takes about 1 hour.
From Central Station
On foot:
The hotel is only a 8 minute walk from the main station. Walk towards the city center over the Puppenbrücke bridge and then turn left into Willy-Brandt-Allee.
Drive along Fackenburger Allee in the direction of the city center. Turn left before the Holstentor into Willy-Brandt-Allee. The drive takes approximately 5 minutes.
The world awaits
Gift cards to redeem and enjoy at +300 hotels.


Home » University » News » The University of Gdansk signed the declaration on the establishment of the European University of the Seas "SEA-EU"
The representatives of six European universities signed the declaration on the intention to collaborate within the framework of the EU's Erasmus+ funding programme (Key Action 2 – 'European Universities') for setting up of the European University of the Seas "SEA-EU".
Alongside the University of Gdansk, the SEA-EU consortium consists of Universidad de Cádiz (Cadiz, Spain) – the Coordinator, Sveučilište u Splitu (Split, Croatia); Université de Bretagne Occidentale (Brest, France); Christian-Albrechts-Universität zu Kiel (Kiel, Germany); L-Università ta' Malta (Valetta, Malta). The University of Gdansk was represented by Professor Krzysztof Bielawski, Vice-Rector for Development and Cooperation with Business and Industry.
The idea of encouraging emergence of 'European Universities' was initiated by Member States, the Council and the European Commission. The objective is to establish around twenty 'European Universities' by 2024. They will consist in bottom-up networks of universities across the EU which will enable students to obtain a degree by combining studies in several EU countries and contribute to the international competitiveness of European universities.


The first shipment of this season's spring wheat was made on Friday night last by Messers H. Chisholm & Co and Messers J & W Stewart for whom the schooner Prince Edward, Captain Black, took out.
The bridge at Thornbury has been completed and the first engine passed over it. Etc….


Boston now has a 9.5 game lead in the division, the largest lead in baseball.
The Yankees came to Boston with hopes of gaining ground in the division — and left Sunday night with hopes of just staying at the top of the Wild Card standings.
Had New York been able to sweep the Red Sox, the team would only be 1.5 games behind Boston for the lead in the AL East and the guarantee of avoiding having to play a Wild Card playoff game that comes with first place.
Now, after losing all four games – including an extra-innings backbreaker on Sunday night that saw the team blow a 4-1 lead – the Yankees sit 9.5 games behind Boston in the standings, giving the Red Sox the largest division lead in MLB. Boston also won the Twitter battle.
Granted, it's still the first week of August and the Yankees clearly have a mathematical chance to regain first place, but the odds are not in their favor.
With their pitching staff struggling from top to bottom, the Yankees are still without slugger Aaron Judge and catcher Gary Sanchez and will be for the foreseeable future. The Bronx Bombers are bombing right now.
And, even if the Yankees were healthy, they might not catch the 79-34 Red Sox. Boston hasn't won 100 games since MLB went to a 162-game schedule in 1961, but the team is currently on pace for 113 wins, which would be a franchise record.


The original and still the best, our Armo MKII continues to stand head and shoulders above the rest. With the addition of rear vents to allow air to circulate through the bivvy, the Armo MKII continues to be the number one choice of bivvy for countless anglers throughout the UK and Europe.
It is produced using our legendary Aquatexx® fabric, which is broadly known within the industry for being the best bivvy fabric around, due to its strength and stability in all weather conditions. The Armo MKII is still the bivvy against which all others are judged.Optional Extras.


text:
package net.uniscala.json

import _root_.scala.collection.IndexedSeqLike
import _root_.scala.collection.generic.CanBuildFrom
import _root_.scala.collection.immutable.{Vector, VectorBuilder}
import _root_.scala.collection.mutable.Builder

private[json] object JsonArrayLike {

  implicit def canBuildFrom: CanBuildFrom[JsonArray, JsonValue[_], JsonArray] =
    new CanBuildFrom[JsonArray, JsonValue[_], JsonArray] {
      override def apply(from: JsonArray) = apply
      override def apply = newBuilder
  }

  def newBuilder: Builder[JsonValue[_], JsonArray] = new JsonArrayBuilder
}

private[json] class JsonArrayBuilder private(inner: VectorBuilder[JsonValue[_]])
extends Builder[JsonValue[_], JsonArray] {
  def this() = this(new VectorBuilder[JsonValue[_]])
  override def +=(elem: JsonValue[_]) = {
    inner += elem
    this
  }
  override def clear = inner.clear
  override def result = JsonArray(inner.result)
}

private[json] trait JsonArrayLike
extends IndexedSeq[JsonValue[_]]
with IndexedSeqLike[JsonValue[_], JsonArray] {

  this: JsonArray =>

  def value: Vector[JsonValue[_]]

  override def apply(i: Int): JsonValue[_] = value(i)

  override def length = value.length

  override def iterator = value.iterator

  override def newBuilder: Builder[JsonValue[_], JsonArray] =
    JsonArrayLike.newBuilder

  override lazy val toString = toStringBase(false)

  override lazy val toCompactString: String = toStringBase(true)

  override lazy val toPrettyString: String = toPrettyString_("", "  ")

  override def toPrettyString_(margin: String, indent: String): String = {
    val builder = new StringBuilder
    builder += '['
    var first = true
    val newMargin = margin + indent
    value foreach { v =>
      if (first) {
        first = false
      } else {
        builder += ','
      }
      builder += '\n'
      builder append newMargin
      builder append {
        v match {
          case top: JsonTop[_] => top.toPrettyString_(newMargin, indent)
          case other => other.toString
        }
      }
    }
    builder += '\n'
    builder append margin
    builder += ']'
    builder.toString
  }

  private def toStringBase(compact: Boolean): String = {
    val builder = new StringBuilder
    builder += '['
    var first = true
    value foreach { v =>
      if (first) {
        first = false
      } else {
        builder append { if (compact) "," else ", " }
      }
      builder append {
        if (compact) {
          v match {
            case top: JsonTop[_] => top.toCompactString
            case other => other.toString
          }
        } else {
          v.toString
        }
      }
    }
    builder += ']'
    builder.toString
  }
}


Late one evening in 2009 Karen Paschke e-mailed Msgr. Holmes asking how one could return to God after a long absence. Over the next nine years God has drawn her into a deeper and deeper relationship with Him, far beyond what she ever imagined. Listen to a beautiful testimony to the tender, all-encompassing, and life-altering mercy of Jesus!
Karen Paschke grew up as a Lutheran, entered full communion with the Catholic Church in 2010, consecrated her virginity to the Lord Jesus in 2017, was diagnosed with lymphoma two weeks later, and has since been cured of any trace of cancer. She teaches math at East High School, plays in the local Madison handbell choir, and has traveled to virtually every country on the planet.


AUGUSTA, Ga. – The Augusta University baseball team and head coach Chris Howell gained four freshmen in the National Letter of Intent (NLI) early signing period. The Jaguars signed pitchers Parker Bridwell, Brice Miller, Joseph Pittman, and outfielder Justin Stevens for the 2020 season.
Bridwell is an Atlanta, Ga., native who attended Peachtree Ridge High School in Suwanee, Ga., for all years. He was a scholar-athlete letterman for Peachtree Ridge and also competed for the Georgia Bombers out of Suwanee, Ga. Bridwell plans to study computer science at Augusta University.
Miller will make his way to Augusta from Wayne County High School in Screven, Ga., where he was a two-sport letterman in baseball and football. During his tenure at WCHS, Miller was named the Pitcher of the Year.
Pittman is an incoming freshman from Tifton, Ga. He pitched for Tift County High School for four seasons beginning in 2015. A four-year letterman, he was named the Most Outstanding Player for TCHS and was voted the team captain his senior season. Pittman was also a member of the Beta Club and was an honors student.
Stevens is a local signee for the Jaguars from Evans, Ga. He played for Greenbrier High School and lettered in baseball under coach David Barnes. Stevens was also a basketball letterman for the Wolfpack. He plans to pursue a nursing degree at Augusta University.


text:
23rd March 2011 | Uncategorised
Chancellor punches beer and pubs in the face with one hand – but gives us a clever gift with the other
I have no plans to kick this oleaginous, deceitful, dishonest, callous multi-millionaire (inherited) repeatedly in the face*
Today's budget has been called many things. 'A budget for growth'. A 'tax cutting budget'. It comes one week after David Cameron promised to 'remove all obstacles to growth' from small businesses. You know, businesses like, ooh, craft breweries. Or pubs.
So it's pretty repulsive that in what is indeed being hailed by the media as a budget for growth, George Gideon Osborne hit beer with a whopping 7.2% tax increase, bringing the total increase in VAT and duty on beer to a whopping 32.4% since October 2008.
"Whoa, hang on there, Pete!" I hear you saying. "I've been watching the budget, and Osborne specifically said that beer tax wasn't going up."
Did he?
Oh yes, he must have done. Look, the Guardian says "No change to rates of alcohol duty." The BBC confirms this in its coverage, categorically stating that the chancellor "froze alcohol duties."
That must mean alcohol duty didn't go up, right? There is no other possible meaning of the words being reported right there.
What Osborne actually said was there would be "no additional rise" in alcohol duty.
No additional rise. But that means it's not going up, surely! Well, that's what it means to any casual observer. The man in the street. In fact, anyone who does not have a thorough working knowledge of treasury tax plans in relation to the brewing industry.
If you DO know those plans (and if you don't work in beer or pubs, there's no reason you should), you will know that Labour instigated a 'beer duty escalator' of inflation plus 2% every year, and that one of the first things Osborne did on coming to power was to extend this so that it happens every year until 2014. So when Osborne says there are no additional rises, he means no rises in addition to the 7.2% he was already planning to slap on.
See what he did there?
By saying he was only going to increase tax by the amount he planned to increase tax by, that is, by saying he isn't going to implement any tax rises on top of the tax rises he was already planning to implement, he's conned everyone – including intelligent, major, reputable news outlets – into thinking he hasn't increased taxes at all.
If you didn't know about the duty escalator, you would have no idea what he'd just done.
True, he's only applying the tax increases Labour would have done. But at least Labour told us honestly and clearly that they were shafting us, and how much by.
So it's a tragedy for everyone really. Pubs will close because of this. Jobs will be lost because of it. The price of a pint will go up 10p because of it. And the most stupid part is, the effect it will have on demand means that the treasury will actually make less money because of it. Stupid beyond belief.
But while we lick our wounds over this latest battering, we should reflect on the marvellous gift Osborne has given us with this new piece of spin, a greasy deceit that even Malcolm Tucker would applaud.
Because we can all take this same linguistic construct, this same extreme economy with the truth, and use it in our every days lives.
Say, for example, that I haven't had anything to drink for five days, and tonight I plan to go out and drink ten pints and get rat-arsed. If you ask me, "Are you going to have another night off the beer tonight?" I can simply reply, "My plans relating to drink tonight remain unchanged. I won't be drinking any additional beer." Unless you know I was already planning to drink ten pints (and you won't, because I haven't told you) you'll think I'm not going to drink. Hah! But the joke is on you, because I am!
Here's another one. I'm very angry with George Osborne, even angrier now than when I first saw his pompous, arrogant little face sneering down at the rest of us while he rubbed his multi-million pound inheritance all over his pasty white doughy skin. I have always thought that if I ever met him, I would kick him repeatedly in the face.
But you don't know that.
So, say I was invited to a Parliamentary Beer Group function at which he was going to be a guest, and someone took me to one side and said, "Pete, we know you're very angry with Mr Osborne about his wilful deception and deliberate misleading of the media and the British people over beer duty increases. You're not hoping to kick him repeatedly in the face or anything are you?"
I could in all honesty reply, "The way that upper class, over-privileged, callous, pig-ignorant dickhead misled the nation over alcohol duty has not increased the likelihood of me kicking him repeatedly in the face. Not one bit. I have no additional plans to kick him in the face repeatedly." And unless you were listening very, very carefully, you'd think I meant I wasn't planning on kicking him repeatedly in the face.
It's brilliant!
I'm going to use it all the time from now on.
*Or rather, what I mean is, the plans I have to do so have not changed.
Real Ale – Preference or Dogma?
Britain's Best Beer: All is Revealed
The Session no.63: May the fourth be with you!
Neo-Prohibitionism Update
Curmudgeon March 23rd, 2011
The budget document clearly says:
"Alcohol duty rates – As first announced at Budget 2008, alcohol duty rates will increase by 2 per cent above the RPI on 28 March 2011. This will add 4 pence to the price of a pint of beer, 15 pence to the price of a bottle of wine, and 54 pence to the price of a bottle of spirits."
So, if you had any interest in the subject, you'd have to be pretty thick to miss that.
Your reaction is a tad over the top, I think.
stephanos_lemon March 23rd, 2011
I like what you tagged it as. More people need to know that twatheads real name
Get to the pub.com March 23rd, 2011
I have no plans to hail this post as brilliantly clear and insightful, or at least no more than I did just after I'd finished reading it.
Steve March 23rd, 2011
This saddens me to see the UK government continuing to increase the tax on small brewers and pubs.
In the states, we have been working relentlessly to get them to lower our tax rates per barrel and currently enjoy one of the lowest global tax rates per barrel. This has had an obvious bonus to growth as the US is now home to 1700+ craft breweries and growing. This is the largest number since pre-prohibition.
This translates to more jobs, more tax dollars and a more robust economy.
Why is it so difficult for government to understand the benefits of promoting small business?
Pete Brown March 23rd, 2011
No, Mudgie, it's not. because people DON'T read budget documents. They read newspapers and websites. And the newspapers and websites are saying duty has NOT increased. Or at least, they were when it was announced in such a misleading fashion. That's what people now think.
Ketsbaia March 23rd, 2011
Where do you get 7.2% from? I thought inflation was 4.4%, so by my reckoning, that's a 'mere' 6.4% rise.
Still disgraceful and Osbourne was being entirely disingenuous when he said there was no additional increase. I'm entering the spirit by trusting him no less than I used to.
Anonymous March 23rd, 2011
lets be honest no one reads budget document even most jernalists will have only listened to the speach, personally i picked up on the word additional and smelt a rat but had no idea of details till i read this.
mudskipperbeerlife March 23rd, 2011
I don't see the problem. It's not like beer is being unduly punished by blanket opinions of poorer quality lagers and actually decent beer….. oh…
at least pubs aren't closing at a rate of 29…oh…
well it's not like pubs were a place to socialise or a great cultural aspect of our country….ah
Jeff Pickthall March 23rd, 2011
Thanks Pete, my inner class warrior needed a boost.
Mr G. March 23rd, 2011
I'd read the news and been misled, so thanks for the clarification.
Tandleman March 23rd, 2011
So clear this up for me. How do we get to 10p a pint increase?
Pete – I heard them say on Radio Five Live that alcohol duties had been "frozen" so I accept you do have a good point. Several people had to text in to correct them.
"How do we get to 10p a pint increase?"
Gross Margin, innit? A 4p per pint increase in duty and VAT is doubled up to 8p to maintain the pub's GM percentage, and then rounded up to 10p. Short-term sense, long-term death.
Eddie March 23rd, 2011
Blame Brown and Labour for the escalator. They introduced it. Thanks to that bunch UK plc is up shtcreek and so obviously luxuries will be taxed. A sense of perspective is needed. I doubt if craft brew drinkers will even notice such a modest increase. If breweries and pubs fail it is more likely due to their 'offer' i.e. Uninteresting beer in unpleasant pubs than a couple of quid on a firkin. Beer is still cheaper in the UK that Eu or USA if you calculate like for like ABV and volume.
Martin - Elland Brewery March 23rd, 2011
As a brewery director I have spoken with several other brewers and landlords after the budget this afternoon and none of us can believe what happened today. Yes we expected something (we usually get stung) but after all the hard work of SIBA, CAMRA and other organisations explaining the importance of the breweries and the pubs for the government revenue we did not expect the 6% rise. As always the pub customer reads 4p on a pint but on monday they go into the pub and its gone up 10p so they think (as they don't understand GP's) that the landlord is taking the mick by putting an extra 6p on for themselves when this is not the case. Also why change it on sunday? as a result every brewery has 2 duty returns to do as well as re-print price lists & inform all there customers of the price change and all before sunday and yes I will join the "Kicking in the face " line but won't tell anyone so i can get away with it……
Mudgie. Funnily enough I knew that. Short term in the extreme and each time it just makes things worse. It is cumulative and daft.
Angry beyond belief, though we knew it was coming. And to skip over it like that added insult to injury.
The Germans won't accept anyting other than nominal duty on beer – it's about bloody time we took a leaf out their book.
Stono March 23rd, 2011
personally I think we should respond to this stuff apolitically, Labour did pull the same trick for many years in the budget on car tax, airport tax, the pre-budget report for years hid april tax rises which the chancellor didnt have to repeat in the main budget and Diane Abbott (Labour shadow health minister) was this week encouraging the government to go further on the increase on beer tax with such soundbites like "It is wrong that very young children can get out of their skulls for less money than it takes to buy a bottle of coca cola"
I would say Id love to know where she buys her beer from then, but then we all know the nice public subsidised House of Commons bars open all hours arent quite in the same price bracket that the rest of us have to put with.
but we shouldnt be making this about personalities, its the beer duty escalator policy and policy on beer tax and the pub trade thats wrong and we need to concentrate on getting politicians of all parties to properly understand the harm it does
"As always the pub customer reads 4p on a pint but on monday they go into the pub and its gone up 10p so they think (as they don't understand GP's) that the landlord is taking the mick by putting an extra 6p on for themselves when this is not the case."
Umm. It is the case when you think about it. Trade Unions used to defend differentials in much the same way.
Phil March 23rd, 2011
Or there's the Albertos' born-again country song, where the chorus begins
"Since I found Jesus,
I don't smoke dope no more"
By the end of the song it's turned into
I don't smoke dope no more –
But I ain't gonna smoke it any less either!"
Tom Mann March 24th, 2011
So, if the tax rise on a pint is 4p, why do I have to pay 10p more a pint? If you mean protecting gross profits % margins, then is that extra 6p goin g to the landlord or brewer? Why not put the price up by the tax? When tax goes up a penny a litre on fuel, the pump price increases by, wowsers, a penny a litre. Why does beer work differently?
Anonymous March 24th, 2011
Pete, are you jealous of Little George's inheritance?
DeGarre
Pete Brown March 24th, 2011
Jealous, deGarre?
Not at all. Funny how some people seem to think any criticism of unearned privilege equates to wishing we had that privilege.
No, my problem with Little Gideon's inheritance is that he has never had to work, has never had to worry about money or budgeting on one single day in his life, has led a closeted, over-privileged existence, and now he's in charge of telling the UK how we have to cut back, rein in, cut down, economise, while he and his banker mates suffer not one iota of the discomfort the rest of the nation must endure. I think he is unfit to be chancellor. Simple as that.
Jonathan Harley March 24th, 2011
@Ketsbaia, the RPI is 5.5% so duty rates will go up by 7.5%. (I think you are confusing RPI with CPI.) This will add 4p to the duty to be paid on each pint, which pubs will presumably wish to pass on to consumers in order to keep their profit margins the same.
In October, beer above 7.5% abv will get a further increase of 25% over the duty of ordinary strength beer, adding a further 25p to the duty on a can of Special Brew.
Buster, Brewer of Brecon March 24th, 2011
4p on a pint – probaly the most misleading way of describing a tax increase…
Beer duty is paid on hl% of alcohol (ie for ever 100 litres (1 hl) of a 3.7% abv beer I make, this equates to 3.7 hl%, on which we pay Duty at a rate of (now)£18.57. This works out at £28.17 for a 9 gallon firkin, or if you prefer just over 39p per pint. This increase works out at £1.90 per firkin or 2.64p per pint. For a 5% abv beer, its now £38.07 per firkin (53p per pint), and increase of £2.56 per firkin or 3.56p per pint.
Hmmm. not going according to plan this… 4p per pint doesn't come in until 5.6% abv…
But of course, the bloody VAT… so we're lookng for an incrase of £2.40 per fikin plus VAT – 4.7% abv, well just under actually…
Confused yet?
The other thing to add in are the the increases in the Brewers' costs of production – fuel, wages, other taxes, insurance, etc – all up year on year. Realistically, and personally speaking, (says he covering his arse leagally!) I'd expect the average increase in firkin to be in the region of £4-£5, which is 9p on a pint before any increase in the landlord's margin. Given the fact that no one wants to faff around with copper coins, that's least 10p by the time we get to the pumps.
Oh, and less money for the Treasury at the end of it. Marvellous


Light bars frame the entrance from the public piazza to part of the Renzo Piano expansion of the High Museum of Art in Atlanta. AP Photo/Ric Feld.
ATLANTA, GA.- The High Museum of Art will host its first ever Print Fair on Saturday, May 7, and Sunday, May 8, at the High, with a "First Look" preview reception on Friday, May 6. Co-sponsored by the International Fine Print Dealers Association (IFPDA), the event will feature 16 premier print dealers from across the country. Prints available for purchase―with affordable works for all budgets―will range from Old Masters such as Rembrandt and Dürer to American artists, including John Sloan and Robert Rauschenberg, to contemporary masters such as Kiki Smith and Chuck Close.
The High Museum of Art Print Fair will take place in the Anne Cox Chambers Wing at the Museum. Access to the Print Fair on May 7 and 8 will be free to the public; tickets to the "First Look" preview reception are $150. Tickets can be reserved at www.high.org/printfair or by calling the box office at 404-733-5000.


text:
The Funding of Democrats' Corrupt Slush Fund, the Consumer Financial Protection Bureau, Ruled Unconstitutional by 5th Circuit
By Joe Hoft
Published October 20, 2022 at 8:00pm
The Consumer Financial Protection Bureau (CFPB) was a corrupt slush fund for the Democrats that never should have been created in the first place. This week the 5th Circuit found that the CFPB is unconstitutional.
The corrupt Democrats created the CFPB in the early part of the Biden Presidency. This corrupt organization was created through the regulatory mess known as Dodd-Frank.
The CFPB was funded by fines the Democrat-led entity put in place against US companies and then the Democrats used this money in the billions to fund their causes.
In 2017, after President Trump took over, the CFPB was looked into as an organization. This move threatened Elizabeth Warren and the American left who relied on the CFPB bank fines to fund their organizations.
BUSTED: Elizabeth Warren's CFPB Used Secret "Slush Fund" To Funnel Billions Into Left-Wing Causes
When President Trump picked Mick Mulvaney to run the CFPB, the far-left hack in place would not leave. It took a judge to rule that the Democrat hack had no business assuming that she belonged in the top role of the CFPB as this decision is made by the President.
There have long been rumors that this entity was up to no good since it was another Democrat bureaucratic nightmare.
Court Rules with POTUS TRUMP – Tells Far Left Hack to Clear Contents of Her Office into Box and Evacuate the Premises
This week the funding mechanism of this corrupt entity was ruled unconstitutional.
The Fifth Circuit just ruled that the funding mechanism of the Consumer Financial Protection Bureau (CFPB) was unconstitutional.
"Congress's decision to abdicate its appropriations power under the Constitution, i.e., to cede its power of the purse to the Bureau, violates the Constitution's structural separation of powers," a three-judge panel of the 5th U.S. Circuit Court of Appeals ruled in a case brought by a payday lending group against the CFPB's 2017 payday lending rule.
In other words, they were improperly delegating something that was their responsibility — their power to exercise.
"Even among self-funded agencies, the Bureau is unique," Judge Cory Wilson wrote Wednesday. "The Bureau's perpetual self-directed, double-insulated funding structure goes a significant step further than that enjoyed by the other agencies on offer."
We know that giving power to unaccountable bureaucracies — something that Democrats love to do, especially when they are in control of the bureaucracies — ends up being a bad idea, so this is a great decision.
Republican Rep. Tom Emmer tweeted that the GOP has a plan for the unconstitutional CFPB.
The Fifth Circuit rules that the CFPB, created by Elizabeth Warren via the Dodd-Frank Act, is unconstitutional and must be brought under congressional appropriations. Fortunately, @FinancialCmte has a plan for that. pic.twitter.com/gumKXNNxd2
— Tom Emmer (@RepTomEmmer) October 19, 2022
We need a lot more of these rulings to get our country back.
Joe Hoft is the twin brother of TGP's founder, Jim Hoft, and a contributing editor at TGP. Joe was instrumental in reporting the truth behind the Mueller sham, the origins of COVID-19, and the 2020 Election fraud. Joe was a corporate executive in Hong Kong for a decade and has years of experience in finance, IT, operations, and auditing around the world. Joe is the author of five books. His new bestseller, "The Steal: Volume II - The Impossible Occurs" is out now. It addresses the stolen 2020 Election and provides an inventory proving that the 2020 Election was uncertifiable and never should have been certified for Joe Biden. Joe also has a weekly radio podcast at TNTRadio.live where he discusses current events with prominent guests.
@joehoft
The Genesis of the Revelation of Biden's Classified Document Crimes Is "the Hunter Laptop" - Kash Patel
"COVID-19 Vaccines Are Not Associated with Sudden Death" - FDA Response to an American's Concerns About COVID Vaccines
"Joe Biden's Like Mr. Magoo...as Idle-Headed as Any President We've Ever Seen" - Senator Ted Cruz Indicates Joe Biden Has More Classified Documents Lying Around
"We Must Clean Out the Rot and Corruption in DC" - President Trump on the House Committee on the Weaponization of the US Government
Another Poll Shows President Trump with a 35 Point Lead Over All Other Potential Candidates for 2024 - Greater Than 50% Poll Disapprove of Biden
Corrupt AG Garland Brings Pro-Life Father of Seven, Mark Houck, to Court Today on Bogus Charges Following Early Morning FBI Raid in September
Arizona's Katie Hobbs Halts Executions of Over 100 Murderers - Here's Who She's Sparing


Please contact SOL-LA to confirm teaching artist availability,prior to new student Individual Lesson enrollment.
Violin, Viola, Cello, Double Bass, Piano, Voice, Guitar, Percussion, Music Theory, Composition, Conducting, Songwriting. Other instruments upon request. Individual Lesson Rates for Teaching Artists, Master Teachers, and extended lessons, may vary. Please ask for details at the SOL-LA office.
Tuition due for Package of 16 lessons.


Dadakarides Salt SA is a company with experience and specialization in salt for 100 years now. The knowledge of the product is transmitted from one generation to another and provides at the company's human resources the absolute know-how in the existing applications and the capabilities.
Moreover, within last decate, the company increases steadily its exports to the Balkans and EU countries, enlarging this way the market share abroad.
Always with respect to the management of such a precious good and the activity of four generations on processing and trading of salt, Dadakarides SA, assigned to one of the leading companies in Balkan countries.
We provide salt products for: food industries and laboratories, bakery, pickles, olive processing, salted nuts, canning, sausage, meet processing, health food, poultry, animal feed, dyeing industries, water softening, tanneries, de-icing roads, salt industries and further processing, chemicals, fertilizers, water treatment in hotels, hospitals etc, soaps and detergents production, paper processing, pharmaceutical applications, bath salts and many more.
Dadakarides SA founded in 1912 by Constantine Arg. Dadakarides as a small unit of manual processing. In 1930 passed to his son Argiris. In 1963, Argiris son, Themistokles, is taking the lead and transfers the company in new, modern headquarters at the industrial area of west Thessaloniki. Continuing the tradition Themistocles's daughter, Eleftheria Dadakarides, participates in the company on a management position since 1992.