text:
#ifndef MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_H_
#define MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_H_

// MSVC++ requires this to be set before any other includes to get M_PI.
#ifndef _USE_MATH_DEFINES
#define _USE_MATH_DEFINES
#endif

#include <math.h>
#include <stddef.h>  // size_t
#include <stdio.h>   // FILE
#include <string.h>
#include <vector>

#include BOSS_ABSEILCPP_U_absl__types__optional_h //original-code:"absl/types/optional.h"
#include BOSS_WEBRTC_U_api__audio__echo_canceller3_config_h //original-code:"api/audio/echo_canceller3_config.h"
#include BOSS_WEBRTC_U_api__audio__echo_control_h //original-code:"api/audio/echo_control.h"
#include BOSS_WEBRTC_U_modules__audio_processing__include__audio_generator_h //original-code:"modules/audio_processing/include/audio_generator.h"
#include BOSS_WEBRTC_U_modules__audio_processing__include__audio_processing_statistics_h //original-code:"modules/audio_processing/include/audio_processing_statistics.h"
#include BOSS_WEBRTC_U_modules__audio_processing__include__config_h //original-code:"modules/audio_processing/include/config.h"
#include BOSS_WEBRTC_U_modules__audio_processing__include__gain_control_h //original-code:"modules/audio_processing/include/gain_control.h"
#include BOSS_WEBRTC_U_rtc_base__arraysize_h //original-code:"rtc_base/arraysize.h"
#include BOSS_WEBRTC_U_rtc_base__deprecation_h //original-code:"rtc_base/deprecation.h"
#include BOSS_WEBRTC_U_rtc_base__platform_file_h //original-code:"rtc_base/platform_file.h"
#include BOSS_WEBRTC_U_rtc_base__refcount_h //original-code:"rtc_base/refcount.h"
#include BOSS_WEBRTC_U_rtc_base__scoped_ref_ptr_h //original-code:"rtc_base/scoped_ref_ptr.h"

namespace webrtc {

struct AecCore;

class AecDump;
class AudioBuffer;
class AudioFrame;

class StreamConfig;
class ProcessingConfig;

class EchoCancellation;
class EchoControlMobile;
class EchoDetector;
class GainControl;
class HighPassFilter;
class LevelEstimator;
class NoiseSuppression;
class CustomProcessing;
class VoiceDetection;

// Use to enable the extended filter mode in the AEC, along with robustness
// measures around the reported system delays. It comes with a significant
// increase in AEC complexity, but is much more robust to unreliable reported
// delays.
//
// Detailed changes to the algorithm:
// - The filter length is changed from 48 to 128 ms. This comes with tuning of
//   several parameters: i) filter adaptation stepsize and error threshold;
//   ii) non-linear processing smoothing and overdrive.
// - Option to ignore the reported delays on platforms which we deem
//   sufficiently unreliable. See WEBRTC_UNTRUSTED_DELAY in echo_cancellation.c.
// - Faster startup times by removing the excessive "startup phase" processing
//   of reported delays.
// - Much more conservative adjustments to the far-end read pointer. We smooth
//   the delay difference more heavily, and back off from the difference more.
//   Adjustments force a readaptation of the filter, so they should be avoided
//   except when really necessary.
struct ExtendedFilter {
  ExtendedFilter() : enabled(false) {}
  explicit ExtendedFilter(bool enabled) : enabled(enabled) {}
  static const ConfigOptionID identifier = ConfigOptionID::kExtendedFilter;
  bool enabled;
};

// Enables the refined linear filter adaptation in the echo canceller.
// This configuration only applies to EchoCancellation and not
// EchoControlMobile. It can be set in the constructor
// or using AudioProcessing::SetExtraOptions().
struct RefinedAdaptiveFilter {
  RefinedAdaptiveFilter() : enabled(false) {}
  explicit RefinedAdaptiveFilter(bool enabled) : enabled(enabled) {}
  static const ConfigOptionID identifier =
      ConfigOptionID::kAecRefinedAdaptiveFilter;
  bool enabled;
};

// Enables delay-agnostic echo cancellation. This feature relies on internally
// estimated delays between the process and reverse streams, thus not relying
// on reported system delays. This configuration only applies to
// EchoCancellation and not EchoControlMobile. It can be set in the constructor
// or using AudioProcessing::SetExtraOptions().
struct DelayAgnostic {
  DelayAgnostic() : enabled(false) {}
  explicit DelayAgnostic(bool enabled) : enabled(enabled) {}
  static const ConfigOptionID identifier = ConfigOptionID::kDelayAgnostic;
  bool enabled;
};

// Use to enable experimental gain control (AGC). At startup the experimental
// AGC moves the microphone volume up to |startup_min_volume| if the current
// microphone volume is set too low. The value is clamped to its operating range
// [12, 255]. Here, 255 maps to 100%.
//
// Must be provided through AudioProcessingBuilder().Create(config).
#if defined(WEBRTC_CHROMIUM_BUILD)
static const int kAgcStartupMinVolume = 85;
#else
static const int kAgcStartupMinVolume = 0;
#endif  // defined(WEBRTC_CHROMIUM_BUILD)
static constexpr int kClippedLevelMin = 70;
struct ExperimentalAgc {
  ExperimentalAgc() = default;
  explicit ExperimentalAgc(bool enabled) : enabled(enabled) {}
  ExperimentalAgc(bool enabled,
                  bool enabled_agc2_level_estimator,
                  bool digital_adaptive_disabled)
      : enabled(enabled),
        enabled_agc2_level_estimator(enabled_agc2_level_estimator),
        digital_adaptive_disabled(digital_adaptive_disabled) {}

  ExperimentalAgc(bool enabled, int startup_min_volume)
      : enabled(enabled), startup_min_volume(startup_min_volume) {}
  ExperimentalAgc(bool enabled, int startup_min_volume, int clipped_level_min)
      : enabled(enabled),
        startup_min_volume(startup_min_volume),
        clipped_level_min(clipped_level_min) {}
  static const ConfigOptionID identifier = ConfigOptionID::kExperimentalAgc;
  bool enabled = true;
  int startup_min_volume = kAgcStartupMinVolume;
  // Lowest microphone level that will be applied in response to clipping.
  int clipped_level_min = kClippedLevelMin;
  bool enabled_agc2_level_estimator = false;
  bool digital_adaptive_disabled = false;
};

// Use to enable experimental noise suppression. It can be set in the
// constructor or using AudioProcessing::SetExtraOptions().
struct ExperimentalNs {
  ExperimentalNs() : enabled(false) {}
  explicit ExperimentalNs(bool enabled) : enabled(enabled) {}
  static const ConfigOptionID identifier = ConfigOptionID::kExperimentalNs;
  bool enabled;
};

// Use to enable intelligibility enhancer in audio processing.
//
// Note: If enabled and the reverse stream has more than one output channel,
// the reverse stream will become an upmixed mono signal.
struct Intelligibility {
  Intelligibility() : enabled(false) {}
  explicit Intelligibility(bool enabled) : enabled(enabled) {}
  static const ConfigOptionID identifier = ConfigOptionID::kIntelligibility;
  bool enabled;
};

// The Audio Processing Module (APM) provides a collection of voice processing
// components designed for real-time communications software.
//
// APM operates on two audio streams on a frame-by-frame basis. Frames of the
// primary stream, on which all processing is applied, are passed to
// |ProcessStream()|. Frames of the reverse direction stream are passed to
// |ProcessReverseStream()|. On the client-side, this will typically be the
// near-end (capture) and far-end (render) streams, respectively. APM should be
// placed in the signal chain as close to the audio hardware abstraction layer
// (HAL) as possible.
//
// On the server-side, the reverse stream will normally not be used, with
// processing occurring on each incoming stream.
//
// Component interfaces follow a similar pattern and are accessed through
// corresponding getters in APM. All components are disabled at create-time,
// with default settings that are recommended for most situations. New settings
// can be applied without enabling a component. Enabling a component triggers
// memory allocation and initialization to allow it to start processing the
// streams.
//
// Thread safety is provided with the following assumptions to reduce locking
// overhead:
//   1. The stream getters and setters are called from the same thread as
//      ProcessStream(). More precisely, stream functions are never called
//      concurrently with ProcessStream().
//   2. Parameter getters are never called concurrently with the corresponding
//      setter.
//
// APM accepts only linear PCM audio data in chunks of 10 ms. The int16
// interfaces use interleaved data, while the float interfaces use deinterleaved
// data.
//
// Usage example, omitting error checking:
// AudioProcessing* apm = AudioProcessingBuilder().Create();
//
// AudioProcessing::Config config;
// config.high_pass_filter.enabled = true;
// config.gain_controller2.enabled = true;
// apm->ApplyConfig(config)
//
// apm->echo_cancellation()->enable_drift_compensation(false);
// apm->echo_cancellation()->Enable(true);
//
// apm->noise_reduction()->set_level(kHighSuppression);
// apm->noise_reduction()->Enable(true);
//
// apm->gain_control()->set_analog_level_limits(0, 255);
// apm->gain_control()->set_mode(kAdaptiveAnalog);
// apm->gain_control()->Enable(true);
//
// apm->voice_detection()->Enable(true);
//
// // Start a voice call...
//
// // ... Render frame arrives bound for the audio HAL ...
// apm->ProcessReverseStream(render_frame);
//
// // ... Capture frame arrives from the audio HAL ...
// // Call required set_stream_ functions.
// apm->set_stream_delay_ms(delay_ms);
// apm->gain_control()->set_stream_analog_level(analog_level);
//
// apm->ProcessStream(capture_frame);
//
// // Call required stream_ functions.
// analog_level = apm->gain_control()->stream_analog_level();
// has_voice = apm->stream_has_voice();
//
// // Repeate render and capture processing for the duration of the call...
// // Start a new call...
// apm->Initialize();
//
// // Close the application...
// delete apm;
//
class AudioProcessing : public rtc::RefCountInterface {
 public:
  // The struct below constitutes the new parameter scheme for the audio
  // processing. It is being introduced gradually and until it is fully
  // introduced, it is prone to change.
  // TODO(peah): Remove this comment once the new config scheme is fully rolled
  // out.
  //
  // The parameters and behavior of the audio processing module are controlled
  // by changing the default values in the AudioProcessing::Config struct.
  // The config is applied by passing the struct to the ApplyConfig method.
  struct Config {
    // TODO(bugs.webrtc.org/9535): Currently unused. Use this to determine AEC.
    struct EchoCanceller {
      bool enabled = false;
      bool mobile_mode = false;
    } echo_canceller;

    struct ResidualEchoDetector {
      bool enabled = true;
    } residual_echo_detector;

    struct HighPassFilter {
      bool enabled = false;
    } high_pass_filter;

    // Enabled the pre-amplifier. It amplifies the capture signal
    // before any other processing is done.
    struct PreAmplifier {
      bool enabled = false;
      float fixed_gain_factor = 1.f;
    } pre_amplifier;

    // Enables the next generation AGC functionality. This feature
    // replaces the standard methods of gain control in the previous
    // AGC. This functionality is currently only partially
    // implemented.
    struct GainController2 {
      bool enabled = false;
      float fixed_gain_db = 0.f;
    } gain_controller2;

    // Explicit copy assignment implementation to avoid issues with memory
    // sanitizer complaints in case of self-assignment.
    // TODO(peah): Add buildflag to ensure that this is only included for memory
    // sanitizer builds.
    Config& operator=(const Config& config) {
      if (this != &config) {
        memcpy(this, &config, sizeof(*this));
      }
      return *this;
    }
  };

  // TODO(mgraczyk): Remove once all methods that use ChannelLayout are gone.
  enum ChannelLayout {
    kMono,
    // Left, right.
    kStereo,
    // Mono, keyboard, and mic.
    kMonoAndKeyboard,
    // Left, right, keyboard, and mic.
    kStereoAndKeyboard
  };

  // Specifies the properties of a setting to be passed to AudioProcessing at
  // runtime.
  class RuntimeSetting {
   public:
    enum class Type {
      kNotSpecified,
      kCapturePreGain,
      kCustomRenderProcessingRuntimeSetting
    };

    RuntimeSetting() : type_(Type::kNotSpecified), value_(0.f) {}
    ~RuntimeSetting() = default;

    static RuntimeSetting CreateCapturePreGain(float gain) {
      RTC_DCHECK_GE(gain, 1.f) << "Attenuation is not allowed.";
      return {Type::kCapturePreGain, gain};
    }

    static RuntimeSetting CreateCustomRenderSetting(float payload) {
      return {Type::kCustomRenderProcessingRuntimeSetting, payload};
    }

    Type type() const { return type_; }
    void GetFloat(float* value) const {
      RTC_DCHECK(value);
      *value = value_;
    }

   private:
    RuntimeSetting(Type id, float value) : type_(id), value_(value) {}
    Type type_;
    float value_;
  };

  ~AudioProcessing() override {}

  // Initializes internal states, while retaining all user settings. This
  // should be called before beginning to process a new audio stream. However,
  // it is not necessary to call before processing the first stream after
  // creation.
  //
  // It is also not necessary to call if the audio parameters (sample
  // rate and number of channels) have changed. Passing updated parameters
  // directly to |ProcessStream()| and |ProcessReverseStream()| is permissible.
  // If the parameters are known at init-time though, they may be provided.
  virtual int Initialize() = 0;

  // The int16 interfaces require:
  //   - only |NativeRate|s be used
  //   - that the input, output and reverse rates must match
  //   - that |processing_config.output_stream()| matches
  //     |processing_config.input_stream()|.
  //
  // The float interfaces accept arbitrary rates and support differing input and
  // output layouts, but the output must have either one channel or the same
  // number of channels as the input.
  virtual int Initialize(const ProcessingConfig& processing_config) = 0;

  // Initialize with unpacked parameters. See Initialize() above for details.
  //
  // TODO(mgraczyk): Remove once clients are updated to use the new interface.
  virtual int Initialize(int capture_input_sample_rate_hz,
                         int capture_output_sample_rate_hz,
                         int render_sample_rate_hz,
                         ChannelLayout capture_input_layout,
                         ChannelLayout capture_output_layout,
                         ChannelLayout render_input_layout) = 0;

  // TODO(peah): This method is a temporary solution used to take control
  // over the parameters in the audio processing module and is likely to change.
  virtual void ApplyConfig(const Config& config) = 0;

  // Pass down additional options which don't have explicit setters. This
  // ensures the options are applied immediately.
  virtual void SetExtraOptions(const webrtc::Config& config) = 0;

  // TODO(ajm): Only intended for internal use. Make private and friend the
  // necessary classes?
  virtual int proc_sample_rate_hz() const = 0;
  virtual int proc_split_sample_rate_hz() const = 0;
  virtual size_t num_input_channels() const = 0;
  virtual size_t num_proc_channels() const = 0;
  virtual size_t num_output_channels() const = 0;
  virtual size_t num_reverse_channels() const = 0;

  // Set to true when the output of AudioProcessing will be muted or in some
  // other way not used. Ideally, the captured audio would still be processed,
  // but some components may change behavior based on this information.
  // Default false.
  virtual void set_output_will_be_muted(bool muted) = 0;

  // Enqueue a runtime setting.
  virtual void SetRuntimeSetting(RuntimeSetting setting) = 0;

  // Processes a 10 ms |frame| of the primary audio stream. On the client-side,
  // this is the near-end (or captured) audio.
  //
  // If needed for enabled functionality, any function with the set_stream_ tag
  // must be called prior to processing the current frame. Any getter function
  // with the stream_ tag which is needed should be called after processing.
  //
  // The |sample_rate_hz_|, |num_channels_|, and |samples_per_channel_|
  // members of |frame| must be valid. If changed from the previous call to this
  // method, it will trigger an initialization.
  virtual int ProcessStream(AudioFrame* frame) = 0;

  // Accepts deinterleaved float audio with the range [-1, 1]. Each element
  // of |src| points to a channel buffer, arranged according to
  // |input_layout|. At output, the channels will be arranged according to
  // |output_layout| at |output_sample_rate_hz| in |dest|.
  //
  // The output layout must have one channel or as many channels as the input.
  // |src| and |dest| may use the same memory, if desired.
  //
  // TODO(mgraczyk): Remove once clients are updated to use the new interface.
  virtual int ProcessStream(const float* const* src,
                            size_t samples_per_channel,
                            int input_sample_rate_hz,
                            ChannelLayout input_layout,
                            int output_sample_rate_hz,
                            ChannelLayout output_layout,
                            float* const* dest) = 0;

  // Accepts deinterleaved float audio with the range [-1, 1]. Each element of
  // |src| points to a channel buffer, arranged according to |input_stream|. At
  // output, the channels will be arranged according to |output_stream| in
  // |dest|.
  //
  // The output must have one channel or as many channels as the input. |src|
  // and |dest| may use the same memory, if desired.
  virtual int ProcessStream(const float* const* src,
                            const StreamConfig& input_config,
                            const StreamConfig& output_config,
                            float* const* dest) = 0;

  // Processes a 10 ms |frame| of the reverse direction audio stream. The frame
  // may be modified. On the client-side, this is the far-end (or to be
  // rendered) audio.
  //
  // It is necessary to provide this if echo processing is enabled, as the
  // reverse stream forms the echo reference signal. It is recommended, but not
  // necessary, to provide if gain control is enabled. On the server-side this
  // typically will not be used. If you're not sure what to pass in here,
  // chances are you don't need to use it.
  //
  // The |sample_rate_hz_|, |num_channels_|, and |samples_per_channel_|
  // members of |frame| must be valid.
  virtual int ProcessReverseStream(AudioFrame* frame) = 0;

  // Accepts deinterleaved float audio with the range [-1, 1]. Each element
  // of |data| points to a channel buffer, arranged according to |layout|.
  // TODO(mgraczyk): Remove once clients are updated to use the new interface.
  virtual int AnalyzeReverseStream(const float* const* data,
                                   size_t samples_per_channel,
                                   int sample_rate_hz,
                                   ChannelLayout layout) = 0;

  // Accepts deinterleaved float audio with the range [-1, 1]. Each element of
  // |data| points to a channel buffer, arranged according to |reverse_config|.
  virtual int ProcessReverseStream(const float* const* src,
                                   const StreamConfig& input_config,
                                   const StreamConfig& output_config,
                                   float* const* dest) = 0;

  // This must be called if and only if echo processing is enabled.
  //
  // Sets the |delay| in ms between ProcessReverseStream() receiving a far-end
  // frame and ProcessStream() receiving a near-end frame containing the
  // corresponding echo. On the client-side this can be expressed as
  //   delay = (t_render - t_analyze) + (t_process - t_capture)
  // where,
  //   - t_analyze is the time a frame is passed to ProcessReverseStream() and
  //     t_render is the time the first sample of the same frame is rendered by
  //     the audio hardware.
  //   - t_capture is the time the first sample of a frame is captured by the
  //     audio hardware and t_process is the time the same frame is passed to
  //     ProcessStream().
  virtual int set_stream_delay_ms(int delay) = 0;
  virtual int stream_delay_ms() const = 0;
  virtual bool was_stream_delay_set() const = 0;

  // Call to signal that a key press occurred (true) or did not occur (false)
  // with this chunk of audio.
  virtual void set_stream_key_pressed(bool key_pressed) = 0;

  // Sets a delay |offset| in ms to add to the values passed in through
  // set_stream_delay_ms(). May be positive or negative.
  //
  // Note that this could cause an otherwise valid value passed to
  // set_stream_delay_ms() to return an error.
  virtual void set_delay_offset_ms(int offset) = 0;
  virtual int delay_offset_ms() const = 0;

  // Attaches provided webrtc::AecDump for recording debugging
  // information. Log file and maximum file size logic is supposed to
  // be handled by implementing instance of AecDump. Calling this
  // method when another AecDump is attached resets the active AecDump
  // with a new one. This causes the d-tor of the earlier AecDump to
  // be called. The d-tor call may block until all pending logging
  // tasks are completed.
  virtual void AttachAecDump(std::unique_ptr<AecDump> aec_dump) = 0;

  // If no AecDump is attached, this has no effect. If an AecDump is
  // attached, it's destructor is called. The d-tor may block until
  // all pending logging tasks are completed.
  virtual void DetachAecDump() = 0;

  // Attaches provided webrtc::AudioGenerator for modifying playout audio.
  // Calling this method when another AudioGenerator is attached replaces the
  // active AudioGenerator with a new one.
  virtual void AttachPlayoutAudioGenerator(
      std::unique_ptr<AudioGenerator> audio_generator) = 0;

  // If no AudioGenerator is attached, this has no effect. If an AecDump is
  // attached, its destructor is called.
  virtual void DetachPlayoutAudioGenerator() = 0;

  // Use to send UMA histograms at end of a call. Note that all histogram
  // specific member variables are reset.
  virtual void UpdateHistogramsOnCallEnd() = 0;

  // TODO(ivoc): Remove when the calling code no longer uses the old Statistics
  //             API.
  struct Statistic {
    int instant = 0;  // Instantaneous value.
    int average = 0;  // Long-term average.
    int maximum = 0;  // Long-term maximum.
    int minimum = 0;  // Long-term minimum.
  };

  struct Stat {
    void Set(const Statistic& other) {
      Set(other.instant, other.average, other.maximum, other.minimum);
    }
    void Set(float instant, float average, float maximum, float minimum) {
      instant_ = instant;
      average_ = average;
      maximum_ = maximum;
      minimum_ = minimum;
    }
    float instant() const { return instant_; }
    float average() const { return average_; }
    float maximum() const { return maximum_; }
    float minimum() const { return minimum_; }

   private:
    float instant_ = 0.0f;  // Instantaneous value.
    float average_ = 0.0f;  // Long-term average.
    float maximum_ = 0.0f;  // Long-term maximum.
    float minimum_ = 0.0f;  // Long-term minimum.
  };

  struct AudioProcessingStatistics {
    AudioProcessingStatistics();
    AudioProcessingStatistics(const AudioProcessingStatistics& other);
    ~AudioProcessingStatistics();

    // AEC Statistics.
    // RERL = ERL + ERLE
    Stat residual_echo_return_loss;
    // ERL = 10log_10(P_far / P_echo)
    Stat echo_return_loss;
    // ERLE = 10log_10(P_echo / P_out)
    Stat echo_return_loss_enhancement;
    // (Pre non-linear processing suppression) A_NLP = 10log_10(P_echo / P_a)
    Stat a_nlp;
    // Fraction of time that the AEC linear filter is divergent, in a 1-second
    // non-overlapped aggregation window.
    float divergent_filter_fraction = -1.0f;

    // The delay metrics consists of the delay median and standard deviation. It
    // also consists of the fraction of delay estimates that can make the echo
    // cancellation perform poorly. The values are aggregated until the first
    // call to |GetStatistics()| and afterwards aggregated and updated every
    // second. Note that if there are several clients pulling metrics from
    // |GetStatistics()| during a session the first call from any of them will
    // change to one second aggregation window for all.
    int delay_median = -1;
    int delay_standard_deviation = -1;
    float fraction_poor_delays = -1.0f;

    // Residual echo detector likelihood.
    float residual_echo_likelihood = -1.0f;
    // Maximum residual echo likelihood from the last time period.
    float residual_echo_likelihood_recent_max = -1.0f;
  };

  // TODO(ivoc): Make this pure virtual when all subclasses have been updated.
  virtual AudioProcessingStatistics GetStatistics() const;

  // This returns the stats as optionals and it will replace the regular
  // GetStatistics.
  virtual AudioProcessingStats GetStatistics(bool has_remote_tracks) const;

  // These provide access to the component interfaces and should never return
  // NULL. The pointers will be valid for the lifetime of the APM instance.
  // The memory for these objects is entirely managed internally.
  virtual EchoCancellation* echo_cancellation() const = 0;
  virtual EchoControlMobile* echo_control_mobile() const = 0;
  virtual GainControl* gain_control() const = 0;
  // TODO(peah): Deprecate this API call.
  virtual HighPassFilter* high_pass_filter() const = 0;
  virtual LevelEstimator* level_estimator() const = 0;
  virtual NoiseSuppression* noise_suppression() const = 0;
  virtual VoiceDetection* voice_detection() const = 0;

  // Returns the last applied configuration.
  virtual AudioProcessing::Config GetConfig() const = 0;

  enum Error {
    // Fatal errors.
    kNoError = 0,
    kUnspecifiedError = -1,
    kCreationFailedError = -2,
    kUnsupportedComponentError = -3,
    kUnsupportedFunctionError = -4,
    kNullPointerError = -5,
    kBadParameterError = -6,
    kBadSampleRateError = -7,
    kBadDataLengthError = -8,
    kBadNumberChannelsError = -9,
    kFileError = -10,
    kStreamParameterNotSetError = -11,
    kNotEnabledError = -12,

    // Warnings are non-fatal.
    // This results when a set_stream_ parameter is out of range. Processing
    // will continue, but the parameter may have been truncated.
    kBadStreamParameterWarning = -13
  };

  enum NativeRate {
    kSampleRate8kHz = 8000,
    kSampleRate16kHz = 16000,
    kSampleRate32kHz = 32000,
    kSampleRate48kHz = 48000
  };

  // TODO(kwiberg): We currently need to support a compiler (Visual C++) that
  // complains if we don't explicitly state the size of the array here. Remove
  // the size when that's no longer the case.
  static constexpr int kNativeSampleRatesHz[4] = {
      kSampleRate8kHz, kSampleRate16kHz, kSampleRate32kHz, kSampleRate48kHz};
  static constexpr size_t kNumNativeSampleRates =
      arraysize(kNativeSampleRatesHz);
  static constexpr int kMaxNativeSampleRateHz =
      kNativeSampleRatesHz[kNumNativeSampleRates - 1];

  static const int kChunkSizeMs = 10;
};

class AudioProcessingBuilder {
 public:
  AudioProcessingBuilder();
  ~AudioProcessingBuilder();
  // The AudioProcessingBuilder takes ownership of the echo_control_factory.
  AudioProcessingBuilder& SetEchoControlFactory(
      std::unique_ptr<EchoControlFactory> echo_control_factory);
  // The AudioProcessingBuilder takes ownership of the capture_post_processing.
  AudioProcessingBuilder& SetCapturePostProcessing(
      std::unique_ptr<CustomProcessing> capture_post_processing);
  // The AudioProcessingBuilder takes ownership of the render_pre_processing.
  AudioProcessingBuilder& SetRenderPreProcessing(
      std::unique_ptr<CustomProcessing> render_pre_processing);
  // The AudioProcessingBuilder takes ownership of the echo_detector.
  AudioProcessingBuilder& SetEchoDetector(
      rtc::scoped_refptr<EchoDetector> echo_detector);
  // This creates an APM instance using the previously set components. Calling
  // the Create function resets the AudioProcessingBuilder to its initial state.
  AudioProcessing* Create();
  AudioProcessing* Create(const webrtc::Config& config);

 private:
  std::unique_ptr<EchoControlFactory> echo_control_factory_;
  std::unique_ptr<CustomProcessing> capture_post_processing_;
  std::unique_ptr<CustomProcessing> render_pre_processing_;
  rtc::scoped_refptr<EchoDetector> echo_detector_;
  RTC_DISALLOW_COPY_AND_ASSIGN(AudioProcessingBuilder);
};

class StreamConfig {
 public:
  // sample_rate_hz: The sampling rate of the stream.
  //
  // num_channels: The number of audio channels in the stream, excluding the
  //               keyboard channel if it is present. When passing a
  //               StreamConfig with an array of arrays T*[N],
  //
  //                N == {num_channels + 1  if  has_keyboard
  //                     {num_channels      if  !has_keyboard
  //
  // has_keyboard: True if the stream has a keyboard channel. When has_keyboard
  //               is true, the last channel in any corresponding list of
  //               channels is the keyboard channel.
  StreamConfig(int sample_rate_hz = 0,
               size_t num_channels = 0,
               bool has_keyboard = false)
      : sample_rate_hz_(sample_rate_hz),
        num_channels_(num_channels),
        has_keyboard_(has_keyboard),
        num_frames_(calculate_frames(sample_rate_hz)) {}

  void set_sample_rate_hz(int value) {
    sample_rate_hz_ = value;
    num_frames_ = calculate_frames(value);
  }
  void set_num_channels(size_t value) { num_channels_ = value; }
  void set_has_keyboard(bool value) { has_keyboard_ = value; }

  int sample_rate_hz() const { return sample_rate_hz_; }

  // The number of channels in the stream, not including the keyboard channel if
  // present.
  size_t num_channels() const { return num_channels_; }

  bool has_keyboard() const { return has_keyboard_; }
  size_t num_frames() const { return num_frames_; }
  size_t num_samples() const { return num_channels_ * num_frames_; }

  bool operator==(const StreamConfig& other) const {
    return sample_rate_hz_ == other.sample_rate_hz_ &&
           num_channels_ == other.num_channels_ &&
           has_keyboard_ == other.has_keyboard_;
  }

  bool operator!=(const StreamConfig& other) const { return !(*this == other); }

 private:
  static size_t calculate_frames(int sample_rate_hz) {
    return static_cast<size_t>(AudioProcessing::kChunkSizeMs * sample_rate_hz /
                               1000);
  }

  int sample_rate_hz_;
  size_t num_channels_;
  bool has_keyboard_;
  size_t num_frames_;
};

class ProcessingConfig {
 public:
  enum StreamName {
    kInputStream,
    kOutputStream,
    kReverseInputStream,
    kReverseOutputStream,
    kNumStreamNames,
  };

  const StreamConfig& input_stream() const {
    return streams[StreamName::kInputStream];
  }
  const StreamConfig& output_stream() const {
    return streams[StreamName::kOutputStream];
  }
  const StreamConfig& reverse_input_stream() const {
    return streams[StreamName::kReverseInputStream];
  }
  const StreamConfig& reverse_output_stream() const {
    return streams[StreamName::kReverseOutputStream];
  }

  StreamConfig& input_stream() { return streams[StreamName::kInputStream]; }
  StreamConfig& output_stream() { return streams[StreamName::kOutputStream]; }
  StreamConfig& reverse_input_stream() {
    return streams[StreamName::kReverseInputStream];
  }
  StreamConfig& reverse_output_stream() {
    return streams[StreamName::kReverseOutputStream];
  }

  bool operator==(const ProcessingConfig& other) const {
    for (int i = 0; i < StreamName::kNumStreamNames; ++i) {
      if (this->streams[i] != other.streams[i]) {
        return false;
      }
    }
    return true;
  }

  bool operator!=(const ProcessingConfig& other) const {
    return !(*this == other);
  }

  StreamConfig streams[StreamName::kNumStreamNames];
};

// The acoustic echo cancellation (AEC) component provides better performance
// than AECM but also requires more processing power and is dependent on delay
// stability and reporting accuracy. As such it is well-suited and recommended
// for PC and IP phone applications.
//
// Not recommended to be enabled on the server-side.
class EchoCancellation {
 public:
  // EchoCancellation and EchoControlMobile may not be enabled simultaneously.
  // Enabling one will disable the other.
  virtual int Enable(bool enable) = 0;
  virtual bool is_enabled() const = 0;

  // Differences in clock speed on the primary and reverse streams can impact
  // the AEC performance. On the client-side, this could be seen when different
  // render and capture devices are used, particularly with webcams.
  //
  // This enables a compensation mechanism, and requires that
  // set_stream_drift_samples() be called.
  virtual int enable_drift_compensation(bool enable) = 0;
  virtual bool is_drift_compensation_enabled() const = 0;

  // Sets the difference between the number of samples rendered and captured by
  // the audio devices since the last call to |ProcessStream()|. Must be called
  // if drift compensation is enabled, prior to |ProcessStream()|.
  virtual void set_stream_drift_samples(int drift) = 0;
  virtual int stream_drift_samples() const = 0;

  enum SuppressionLevel {
    kLowSuppression,
    kModerateSuppression,
    kHighSuppression
  };

  // Sets the aggressiveness of the suppressor. A higher level trades off
  // double-talk performance for increased echo suppression.
  virtual int set_suppression_level(SuppressionLevel level) = 0;
  virtual SuppressionLevel suppression_level() const = 0;

  // Returns false if the current frame almost certainly contains no echo
  // and true if it _might_ contain echo.
  virtual bool stream_has_echo() const = 0;

  // Enables the computation of various echo metrics. These are obtained
  // through |GetMetrics()|.
  virtual int enable_metrics(bool enable) = 0;
  virtual bool are_metrics_enabled() const = 0;

  // Each statistic is reported in dB.
  // P_far:  Far-end (render) signal power.
  // P_echo: Near-end (capture) echo signal power.
  // P_out:  Signal power at the output of the AEC.
  // P_a:    Internal signal power at the point before the AEC's non-linear
  //         processor.
  struct Metrics {
    // RERL = ERL + ERLE
    AudioProcessing::Statistic residual_echo_return_loss;

    // ERL = 10log_10(P_far / P_echo)
    AudioProcessing::Statistic echo_return_loss;

    // ERLE = 10log_10(P_echo / P_out)
    AudioProcessing::Statistic echo_return_loss_enhancement;

    // (Pre non-linear processing suppression) A_NLP = 10log_10(P_echo / P_a)
    AudioProcessing::Statistic a_nlp;

    // Fraction of time that the AEC linear filter is divergent, in a 1-second
    // non-overlapped aggregation window.
    float divergent_filter_fraction;
  };

  // Deprecated. Use GetStatistics on the AudioProcessing interface instead.
  // TODO(ajm): discuss the metrics update period.
  virtual int GetMetrics(Metrics* metrics) = 0;

  // Enables computation and logging of delay values. Statistics are obtained
  // through |GetDelayMetrics()|.
  virtual int enable_delay_logging(bool enable) = 0;
  virtual bool is_delay_logging_enabled() const = 0;

  // The delay metrics consists of the delay |median| and the delay standard
  // deviation |std|. It also consists of the fraction of delay estimates
  // |fraction_poor_delays| that can make the echo cancellation perform poorly.
  // The values are aggregated until the first call to |GetDelayMetrics()| and
  // afterwards aggregated and updated every second.
  // Note that if there are several clients pulling metrics from
  // |GetDelayMetrics()| during a session the first call from any of them will
  // change to one second aggregation window for all.
  // Deprecated. Use GetStatistics on the AudioProcessing interface instead.
  virtual int GetDelayMetrics(int* median, int* std) = 0;
  // Deprecated. Use GetStatistics on the AudioProcessing interface instead.
  virtual int GetDelayMetrics(int* median,
                              int* std,
                              float* fraction_poor_delays) = 0;

  // Returns a pointer to the low level AEC component.  In case of multiple
  // channels, the pointer to the first one is returned.  A NULL pointer is
  // returned when the AEC component is disabled or has not been initialized
  // successfully.
  virtual struct AecCore* aec_core() const = 0;

 protected:
  virtual ~EchoCancellation() {}
};

// The acoustic echo control for mobile (AECM) component is a low complexity
// robust option intended for use on mobile devices.
//
// Not recommended to be enabled on the server-side.
class EchoControlMobile {
 public:
  // EchoCancellation and EchoControlMobile may not be enabled simultaneously.
  // Enabling one will disable the other.
  virtual int Enable(bool enable) = 0;
  virtual bool is_enabled() const = 0;

  // Recommended settings for particular audio routes. In general, the louder
  // the echo is expected to be, the higher this value should be set. The
  // preferred setting may vary from device to device.
  enum RoutingMode {
    kQuietEarpieceOrHeadset,
    kEarpiece,
    kLoudEarpiece,
    kSpeakerphone,
    kLoudSpeakerphone
  };

  // Sets echo control appropriate for the audio routing |mode| on the device.
  // It can and should be updated during a call if the audio routing changes.
  virtual int set_routing_mode(RoutingMode mode) = 0;
  virtual RoutingMode routing_mode() const = 0;

  // Comfort noise replaces suppressed background noise to maintain a
  // consistent signal level.
  virtual int enable_comfort_noise(bool enable) = 0;
  virtual bool is_comfort_noise_enabled() const = 0;

  // A typical use case is to initialize the component with an echo path from a
  // previous call. The echo path is retrieved using |GetEchoPath()|, typically
  // at the end of a call. The data can then be stored for later use as an
  // initializer before the next call, using |SetEchoPath()|.
  //
  // Controlling the echo path this way requires the data |size_bytes| to match
  // the internal echo path size. This size can be acquired using
  // |echo_path_size_bytes()|. |SetEchoPath()| causes an entire reset, worth
  // noting if it is to be called during an ongoing call.
  //
  // It is possible that version incompatibilities may result in a stored echo
  // path of the incorrect size. In this case, the stored path should be
  // discarded.
  virtual int SetEchoPath(const void* echo_path, size_t size_bytes) = 0;
  virtual int GetEchoPath(void* echo_path, size_t size_bytes) const = 0;

  // The returned path size is guaranteed not to change for the lifetime of
  // the application.
  static size_t echo_path_size_bytes();

 protected:
  virtual ~EchoControlMobile() {}
};

// TODO(peah): Remove this interface.
// A filtering component which removes DC offset and low-frequency noise.
// Recommended to be enabled on the client-side.
class HighPassFilter {
 public:
  virtual int Enable(bool enable) = 0;
  virtual bool is_enabled() const = 0;

  virtual ~HighPassFilter() {}
};

// An estimation component used to retrieve level metrics.
class LevelEstimator {
 public:
  virtual int Enable(bool enable) = 0;
  virtual bool is_enabled() const = 0;

  // Returns the root mean square (RMS) level in dBFs (decibels from digital
  // full-scale), or alternately dBov. It is computed over all primary stream
  // frames since the last call to RMS(). The returned value is positive but
  // should be interpreted as negative. It is constrained to [0, 127].
  //
  // The computation follows: https://tools.ietf.org/html/rfc6465
  // with the intent that it can provide the RTP audio level indication.
  //
  // Frames passed to ProcessStream() with an |_energy| of zero are considered
  // to have been muted. The RMS of the frame will be interpreted as -127.
  virtual int RMS() = 0;

 protected:
  virtual ~LevelEstimator() {}
};

// The noise suppression (NS) component attempts to remove noise while
// retaining speech. Recommended to be enabled on the client-side.
//
// Recommended to be enabled on the client-side.
class NoiseSuppression {
 public:
  virtual int Enable(bool enable) = 0;
  virtual bool is_enabled() const = 0;

  // Determines the aggressiveness of the suppression. Increasing the level
  // will reduce the noise level at the expense of a higher speech distortion.
  enum Level { kLow, kModerate, kHigh, kVeryHigh };

  virtual int set_level(Level level) = 0;
  virtual Level level() const = 0;

  // Returns the internally computed prior speech probability of current frame
  // averaged over output channels. This is not supported in fixed point, for
  // which |kUnsupportedFunctionError| is returned.
  virtual float speech_probability() const = 0;

  // Returns the noise estimate per frequency bin averaged over all channels.
  virtual std::vector<float> NoiseEstimate() = 0;

 protected:
  virtual ~NoiseSuppression() {}
};

// Interface for a custom processing submodule.
class CustomProcessing {
 public:
  // (Re-)Initializes the submodule.
  virtual void Initialize(int sample_rate_hz, int num_channels) = 0;
  // Processes the given capture or render signal.
  virtual void Process(AudioBuffer* audio) = 0;
  // Returns a string representation of the module state.
  virtual std::string ToString() const = 0;
  // Handles RuntimeSettings. TODO(webrtc:9262): make pure virtual
  // after updating dependencies.
  virtual void SetRuntimeSetting(AudioProcessing::RuntimeSetting setting);

  virtual ~CustomProcessing() {}
};

// Interface for an echo detector submodule.
class EchoDetector : public rtc::RefCountInterface {
 public:
  // (Re-)Initializes the submodule.
  virtual void Initialize(int capture_sample_rate_hz,
                          int num_capture_channels,
                          int render_sample_rate_hz,
                          int num_render_channels) = 0;

  // Analysis (not changing) of the render signal.
  virtual void AnalyzeRenderAudio(rtc::ArrayView<const float> render_audio) = 0;

  // Analysis (not changing) of the capture signal.
  virtual void AnalyzeCaptureAudio(
      rtc::ArrayView<const float> capture_audio) = 0;

  // Pack an AudioBuffer into a vector<float>.
  static void PackRenderAudioBuffer(AudioBuffer* audio,
                                    std::vector<float>* packed_buffer);

  struct Metrics {
    double echo_likelihood;
    double echo_likelihood_recent_max;
  };

  // Collect current metrics from the echo detector.
  virtual Metrics GetMetrics() const = 0;
};

// The voice activity detection (VAD) component analyzes the stream to
// determine if voice is present. A facility is also provided to pass in an
// external VAD decision.
//
// In addition to |stream_has_voice()| the VAD decision is provided through the
// |AudioFrame| passed to |ProcessStream()|. The |vad_activity_| member will be
// modified to reflect the current decision.
class VoiceDetection {
 public:
  virtual int Enable(bool enable) = 0;
  virtual bool is_enabled() const = 0;

  // Returns true if voice is detected in the current frame. Should be called
  // after |ProcessStream()|.
  virtual bool stream_has_voice() const = 0;

  // Some of the APM functionality requires a VAD decision. In the case that
  // a decision is externally available for the current frame, it can be passed
  // in here, before |ProcessStream()| is called.
  //
  // VoiceDetection does _not_ need to be enabled to use this. If it happens to
  // be enabled, detection will be skipped for any frame in which an external
  // VAD decision is provided.
  virtual int set_stream_has_voice(bool has_voice) = 0;

  // Specifies the likelihood that a frame will be declared to contain voice.
  // A higher value makes it more likely that speech will not be clipped, at
  // the expense of more noise being detected as voice.
  enum Likelihood {
    kVeryLowLikelihood,
    kLowLikelihood,
    kModerateLikelihood,
    kHighLikelihood
  };

  virtual int set_likelihood(Likelihood likelihood) = 0;
  virtual Likelihood likelihood() const = 0;

  // Sets the |size| of the frames in ms on which the VAD will operate. Larger
  // frames will improve detection accuracy, but reduce the frequency of
  // updates.
  //
  // This does not impact the size of frames passed to |ProcessStream()|.
  virtual int set_frame_size_ms(int size) = 0;
  virtual int frame_size_ms() const = 0;

 protected:
  virtual ~VoiceDetection() {}
};

}  // namespace webrtc

#endif  // MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_H_

redpajama_set_name: RedPajamaGithub


Does the subscription to database obstacles includes the UK too? Are these displayed and is there an alert on screen when heading towards one on Android?
If I buy a most recent map for the UK would this include any data such as airspace at least for the area I am buying the map for or literally it will just be the background map with no data?
Also on my current (three years old as I was not using your software) map there are some airfields, some of which are VERY BUSY not even listed as a navigable point, how can we submit you a request to add such airfields?
We'll start including obstacles for the UK from next Monday. They will be displayed on the Moving Map, no alert on the screen will be shown on Android.
No, you'll get access to the chart. The airspaces and waypoints database is a worldwide product and is not sold partially with other products.
Would you mind giving as an example of missing airfields? You can report them directly and we'll check what happened.


NaNoWriMo Day 8As they say with diet, exercise and anything habit-forming in life: if you fall off one day, just get right back up on the horse the next day. So after a panicky busy day where I didn't get any words towards my count, I made sure to get some down in Scrivener in the morning, just to mitigate that feeling of guilt hanging over my head. It also took a bite out of the quota I was targetting once I got home from Pt. 2 of the umpiring clinic I started last night.
It really worked as I slopped out about 1,300 early (and if you know how I hate mornings, "early" is indeed being used in a very liberal sense here), leaving only 2,000+ to get to my daily quota tonight. I managed 3,719 in total today, so just a little bit of set-off from yesterday's missing 3,334 but a solid effort nonetheless.
Of course, no NaNoWriMo day is without me looking for new little tricks and I found a free app on the Mac Store to help track those word wars I love so much. Alignof Timer isn't fancy, but when the set time runs out it has a pop-up window you must click in order to stop the alarm, which switches window focus out of your writing application and literally stops your writing in its tracks. No cheating! Plus, you can set it to a foghorn sound, which for some reason, I think is sweet.
A good day today, and I plan to be back on schedule by the end of Saturday's YYCNaNo Write-In.


- What a beautiful painting, and what a beautiful man. But what is this? Oh, my God is raining! The painting, the image… the colours are drifted away under the cold drops of water.
- Damn it! said the vendor. They told me that is an oil painting, not a painting in water colours. Strange!
- Yes, it strange indeed because is really an oil painting… I can't believe what an ugly man had lived inside this beautiful shell. On his face you can see crimes, disasters, lies! In fact all the "beauties" of this world had lived under this golden painting. Well is just another Dorian Grey portrait. Well done to the portrait painter!
- Of, you're right is two in one, indeed. When the beauty is gone remains only the beast. So is in the real life! Sir, keep it to you and let me give one piece of advice.
- Sure one sweet advice in change for a bitter rain!
- Next time when you get beautiful portraits, put them out of the reach of the sun and rain!


text:
New Hampshire Boosts Unemployment Benefits, Federal Government To Pay
Concord, NH – Today, following the critical efforts and guidance of the New Hampshire Department of Employment Security, Governor Chris Sununu signed the Relief for Workers Affected by Coronavirus [CARES] Act agreement which provides New Hampshire with 100 percent funding from the U.S. Department of Labor to support benefit payments to people receiving unemployment as a result of the COVID-19 pandemic.
"We are making every effort to provide assistance to families who are out of work during this time so that they can focus on what is most important – caring for their families and protecting their health by staying home," said Governor Sununu. "Over the past few weeks, New Hampshire's Department of Employment Security Commissioner George Copadis and Deputy Commissioner Richard Lavers have been working closely with my office and our federal partners to address some of the most pressing issues as a result of the COVID-19 pandemic. By signing this agreement today on behalf of the state of New Hampshire, the U.S. Department of Labor will fund the growing number of unemployment recipients in our state and help the unemployment trust fund to remain solvent through this crisis."
The Federal CARES Act provides the following enhancements to the benefits available under Governor Sununu's Emergency Order #5:
Granite Staters affected by COVID-19 currently drawing from the State's Unemployment Insurance fund will in many instances be shifted to the Federally funded Pandemic Unemployment Assistance. We are still awaiting Federal guidance on this and will provide more detail as received. All claimants will not need to take any new, additional actions, and should continue to file as they have been through the standard state mechanism.
For those eligible under Pandemic Unemployment Assistance, there will be an increase of the minimum weekly benefit amount from $32/week to $168/week, which includes people earning less than $15,500 during their base period.
An additional $600 per week to be added to an individuals weekly benefits for all weeks claimed starting this week — 100% federally funded.
Extends the length of time a person can receive benefits by 13 weeks, totaling 39 weeks — 100% federally funded.
The Department of Employment Security has been hard at work in anticipation of these changes in order to be able to pay these additional benefits as soon as possible.
Please review the department's website at www.nhes.nh.gov for updates as to when to expect to start receiving these benefits. Individuals can file for benefits by going to the department's website or by calling the Unemployment Assistance hotline at (603) 271-7700.

redpajama_set_name: RedPajamaCommonCrawl


The psychic energy today is going to be more of a stressful nature. Today, it is likely you'll feel that no matter what you do, you are being attacked from all sides. Such a feeling is likely to produce strong negative thoughts.
Be aware, however, this perception is not fully representative of reality in the sense that while you may face stressful situations, it is your attitude and response towards such situations, which will make all the difference.
As the saying goes, "do not fight fire with fire" if you hope to avoid a major blaze. When you feel stressed, step back from the situation, relax a bit, and gather your strength once more before seeking to solve the problem.
Need to make a huge decision soon, but worried whether the choice you make will be good for you? Get the best guidance on what to do, and get the answers you need by scheduling a psychic reading. Click here to learn more.


Walid Raad (b. 1967, Lebanon)is an artist and a Professor of Art in (the still-charging-tuition) The Cooper Union (New York, USA). Raad's works include The Atlas Group, a fifteen-year project between 1989 and 2004 about the contemporary history of Lebanon, and the ongoing projects Scratching on Things I Could Disavow and Sweet Talk: Commissions (Beirut). His books include Walkthrough, The Truth Will Be Known When The Last Witness Is Dead, My Neck Is Thinner Than A Hair, Let's Be Honest The Weather Helped, and Scratching on Things I Could Disavow.
Raad's solo exhibitions include the Louvre (Paris), The Museum of Modern Art (New York, USA), ICA (Boston, USA), Museo Jumex (Mexico City, Mexico), Kunsthalle Zurich (Zurich, Switzerland), The Whitechapel Art Gallery (London, UK), Festival d'Automne (Paris, France), Kunsten Festival des Arts (Brussels, Belgium), The Hamburger Bahnhof (Berlin, Germany). His works have also been shown in Documenta 11 and 13 (Kassel, Germany), The Venice Biennale (Venice, Italy), Whitney Bienniale 2000 and 2002 (New York, USA), Sao Paulo Bienale (Sao Paulo, Brazil), Istanbul Biennal (Istanbul, Turkey), Homeworks I and IV (Beirut, Lebanon) and numerous other museums, biennales and venues in Europe, the Middle East, Asia, and the Americas.
Raad is also the recipient of the Aachener Kunstpreis (2018), ICP Infinity Award (2016), the Hasselblad Award (2011), a Guggenheim Fellowship (2009), the Alpert Award in Visual Arts (2007), the Deutsche Börse Photography Prize (2007), the Camera Austria Award (2005), a Rockefeller Fellowship (2003), among other grants, prizes and awards.
Raad is also represented by Sfeir-Semler Gallery (Hamburg / Beirut) and Paula Cooper Gallery (New York). His video works are also distributed by Video Data Bank (Chicago) as well as V-Tape (Toronto).


For several decades, from the 1770s onwards, one family provided the essential services of blacksmith to the small Norfolk village of Letheringsett. This was the Jex family. The family seem to have been well-established in Norfolk as prosperous tradesmen. Some even reached the stage of gaining the right to vote, given Norfolk's unusually wide franchise for the mercantile classes.
Blacksmiths were important to any town or village. Besides the constant demand for shoes for riding, carriage and all kinds of working horses, blacksmiths were metalworkers able to turn their hands to anything from ornamental ironwork to putting tyres on wheels or hoops on barrels.
However, one of the Jex family of blacksmiths in Letheringsett, Johnson Jex, became locally, even nationally, famous. Though largely unschooled, from his earliest days he showed a remarkable talent for anything requiring mechanical or small-scale engineering skills. Not only could he turn his hand to almost any kind of work in metal, large or small, he even designed and constructed his own machine-tools to do the work. One of these, a peculiar design of lathe, is today in the Science Museum in London.
Johnson Jex was the son of William Jex, who was a blacksmith living in the village of Billingford, Norfolk. He was born in or about 1778 and showed very early on his fascination with anything mechanical. One story tells how, when was he was about 5 years old, his grandmother at Cley-next-the-Sea left him alone in a room. When she returned, the boy had used an old knife to remove the lock from a drawer and disassemble it to see what was inside.
School bored him and he left without even being able to read. The cause was his constant absenteeism. He claimed that although he was sent off to school for years, he never spent three months inside the classroom in his life. Instead, he spent his time staring in the the shop window of a Mr Mayes, a watchmaker of Fousham. Later in his life, he could read and write to a high standard, but in this, as in so much else, he was entirely self-taught.
Eventually, he persuaded Mr Mayes to show him the workings of a clock, without allowing him to touch it. Then he claimed he could make one himself. It took him about a month, but he managed it. That set the pattern for the rest of his life. He showed little or no interest in established methods, preferring to invent his own. Indeed, this tendency went so far that he often designed and made the tools he would need – even complex ones – before making the item itself.
Another of Jex's eccentricities was his complete lack of interest in exploiting his inventions and constructions for any gain. He was quite likely to undertake some challenge, invent an entirely novel approach to it, construct a final version to prove his approach, then lose interest completely and move on to the next puzzle to be solved.
One story suggests that, having been persuaded to demonstrate his improved seed-drill at Holkham Sheep Fair, he was so disappointed by the lack of interest shown in it by local farmers – few of whom could probably even understand how it worked – that he vowed never to make any of his inventions public again.
That's sad, in many ways, because many of his inventions seem to have been way ahead of their time. He made a unique device for measuring distances with close accuracy, tools for cutting gear wheels, lathes accurate to minute tolerances, a vastly improved seed-drill, even an automatic ventilator, linked to temperature, for a greenhouse at his home where he grew pineapples.
Jex worked in brass, iron and precious metals, in glass, and using precious stones for watch movements. He designed and made telescopes and other astronomical instruments, thermometers, barometers, gun barrels and even early electrical machines.
This time piece made from end to end.
A principle reason for Jex's obscurity lay in his stubborn refusal to move away from Letheringsett, near Holt in north Norfolk. Once he had moved to this village, in about 1802, he remained there until his death. He never married, but lived with his mother, to whom he was totally devoted. He also continued his trade as blacksmith, though he seems to have handed much of the routine and heavy work over to employees in his later years.
We would know little of Johnson Jex today had it not been for the admiration of the Cozens-Hardy family, descendants of the Hardy family of brewers in the village. They keep his memory alive, even after the inscription on his tomb was more or less worn away by tourists making rubbings.
Mechanical skill and general knowledge.
He lived and died a scientific anchorite.
Bird, Margaret, ed. The Diary of Mary Hardy 1773–1809 (4 vols.). United Kingdom: Burnham Press, 2013.
Cozens-Hardy, Basil. The History of Letheringsett in the County of Norfolk. Norwich: Jarrold & Sons Ltd, 1960.
Dunst, David W. Letheringsett: The Industrial History of a Norfolk Village. Norwich: Norfolk Industrial Archaeological Society , 2013.
What a fascinating character! He'd be great for a book!
I'm tempted, but have too many other things on the go!


Chris Blackwell's family are one of the oldest merchant families in Jamaica, having come to the island in the 1600's. Chris' Grandfather owned the Wray and Nephew distillery, hence the rum's origins. Chris himself formed Island Records of U2, Bob Dylan and Bob Marley fame.
A deep demerara sugar, molasses and treacle nose. The palate has full blown molasses, cocoa beans and chocolate cake frosting.


text:
BC Games Society and BC School Sports announce new partnership
The BC Games Society and BC School Sports are leaders in providing opportunities for the development of athletes and coaches in British Columbia. These two organizations have formalized a new partnership which will see a coordinated effort to capitalize on joint initiatives for the benefit of our shared audiences. The BC Winter and BC Summer Games offer important competitive and developmental opportunities for all eligible participants of BC. BC School Sports offers programs and services directed towards student-athletes and/or the volunteer teacher and community coaches who spend hours of time helping students to achieve their goals. "Both the BC School Sports Board of Directors and staff look forward to a strong relationship with BC Games Society to enhance and grow opportunities for youth in British Columbia," said Christine Bradstock, Executive Director of BC School Sports. "The BC Winter and Summer Games showcase the best of BC and BC School Sports is proud to be a supporter and partner of the Society." The strength and ongoing success of the provincial sport system is based, in part, on the need for strategic alliances and partnerships. BC School Sports and the BC Games Society have worked in parallel for many years but recognized the benefits and new possibilities that could be created by forming a working partnership. "School sports contribute greatly to a student's well being and the learning and coaching they receive from their school coaches contributes to their overall performance," said Kelly Mann, President and CEO of the BC Games Society. 'Our BC Games athletes, coaches and officials benefit greatly from school sports and this partnership will reinforce the opportunities both organizations can provide." About BC Games Society The BC Games Society is the leadership organization that guides the BC Winter and BC Summer Games and prepares Team BC for national multi-sport Games. Since 1978, the BC Games have taken place in 38 communities and brought together thousands of athletes, coaches, officials, volunteers and spectators in celebration of sport and community excellence. It is a milestone event that people count as an exceptional experience where memories, friendships, spirit, and pride are abundant. About BC School Sports BCSS is a voluntary non -profit society and charity with a membership of 425 schools and has served the athletes and volunteer coaches in our province for over 44 years. BCSS's mission is to provide governance for interschool competition, encourage student participation in extra-curricular athletics and assist schools in the development and delivery of those programs. The BCSS Board of Directors relies upon the dedication, commitment and efforts of over 20,000 volunteers to run inter-school athletic programs for the 19 sport commissions that conclude with the 162 zone playoffs and 53 provincial championships.
2015 Annual General Meeting Resolution Results (Draft) Below are the "Carried/Defeated" results for the resolutions' portion from this year's Annual General Meeting. These are draft versions and are therefore for information purposes only. The meeting minutes will be posted shortly. Part 1 contains resolutions 7.1.1-7.1.9 [[{"fid":"1990","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] Part 2 contains resolutions 8.1.1-8.4.1 [[{"fid":"1669","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] April 23, 2015 Annual General Meeting - Package 2 We are almost ready to go for the AGM on May 9, 2015. The package can be accessed online, with links to the specific documents below. As per our Bylaws and the Society Act, this package contains notice of the meeting and resolutions that will be considered at the AGM.Please take a close look at the information and have a conversation with those people in your community who are involved with student-athletes.The AGM will be held at Parkland Secondary School in Sidney, BC. See the "Weekend Schedule" document for more information. RSVP AS SOON AS POSSIBLE: CLICK HERE TO RSVP – mandatory due to space, catering, voting/quorum and arranging shuttles to meeting: due April 27 via Survey Monkey - 6 questions WEEKEND SCHEDULE AND OTHER INFORMATION, INCLUDING TRAVEL SUBSIDY AND PROXY INFORMATION: ___Weekend Schedule and Travel Info.docx [[{"fid":"1625","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] [[{"fid":"1626","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] AGM AGENDA AND ATTACHMENTS: [[{"fid":"1641","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] [[{"fid":"1628","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] [[{"fid":"1629","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] [[{"fid":"1630","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] [[{"fid":"1642","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] [[{"fid":"1653","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] 7.1.2-7.1.9 Special Resolutions.pdf [[{"fid":"1634","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] [[{"fid":"1639","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] COMPARISON DOCUMENTS: Two documents have been created to help show how the proposed Bylaws compare to the current Bylaws. In these comparison documents, we have also included the work of the Rules and Regulations committee and the input that they have provided to the Board. The proposed Bylaws have updates that clarify sections and provides consistency with language and Bylaw content within the document and with respect to the Society Act.The comparisons will be living documents and will be updated frequently to respond to questions and to act as a forum to facilitate discussion. Comparison 1: Existing Bylaws compared to R&R Committee recommendations & Board recommendations (last version May 7 10:00 am) [[{"fid":"1651","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] Comparison 2: Proposed Bylaws compared to current Bylaws and R&R Committee recommendations (last version May 7 10:00 am) [[{"fid":"1652","view_mode":"default","fields":{"format":"default"},"type":"media","attributes":{"class":"file media-element file-default"}}]] Click here for existing Constitution & Bylaws - Nov 8 2013 OPPORTUNITIES FOR FEEDBACK: This is an opportunity for Members to ask questions of the Board regarding the Bylaws and provide feedback. Please send feedback to individual Board members or to info@bcschoolsports.ca - and it will be sent to the Board.As questions and comments come to the Board, the comparison documents will be updated - potentially on a daily basis. Please take advantage of the opportunity to make comments, ask questions and to see feedback and responses.
Every year the BC Sports Hall of Fame awards two Jack Farley Youth Sports Achievement Awards. These scholarships are awarded to one outstanding male and one outstanding female amateur athlete graduating from a BC secondary school. These students will excel in a particular sport and exemplify the values, commitment and contribution to the community held by Jack Farley, an honoured member of the BC Sports Hall of Fame and Museum. Winners will receive $2,000, which is to be applied to their education at a post-secondary institution here in British Columbia. Applicants must be graduating from grade 12 and demonstrate that they plan to attend a registered college or university in British Columbia within 12 months of graduation. APPLICATION Application Form2015 Jack Farley Youth Sports Achievement Awards Application Form Deadline for applications for the calendar year is June 5th. Application Process Scholarship applications are accepted throughout the course of the year. Any individual or school may complete and submit an application form to the BC Sports Hall of Fame. Please contact us to learn more about the 2015 scholarships: Contact Please get in touch with Barbara Chu barbara.chu@bcsportshalloffame.com for further information.
Run Burnaby Now - March 7
On Saturday, March 7th, 2015 you're invited to the 2nd Annual Run Burnaby Now running and walking symposium! This public symposium is aimed at runners and walkers of all ages and abilities who are looking to improve performance, stay injury-free, and continue to live an active and healthy lifestyle. Join us for a day of running workshops, workouts, shoe trials and an exciting expo full of great information and prizes! Run Burnaby Now boasts a strong speaker lineup including Dr. Jack Taunton, Dr. Chris Maclean, Curb Ivanic and many more, all of whom will be delivering their latest findings in the world of running and walking. Also, visit the expo to take a test-run on all of the latest footwear from your favourite running brands including New Balance, Saucony, Mizuno, Nike, Adidas and many more! If you or your family, friends, and colleagues would benefit from the expertise of bio-mechanists, nutritionists, running coaches, and footwear specialists you won't want to miss out. The event will be hosted at the innovative Fortius Sport & Health building from 10-2pm. See the attached brochure for a full outline of the day's events. For more information and to register go to https://www.eventbrite.ca/e/run-burnaby-now-2015-tickets-15620956702. SPACE IS LIMITED. We look forward to seeing you on March 7th! Sincerely, The Run Burnaby Now Team
Preparation has begun for the BCSS AGM on May 9, 2015. The package can be accessed online at the BCSS website www.bcschoolsports.ca, with links to the specific documents below.Please take a close look at the information and have a conversation with those people in your community who are involved with student-athletes. RSVP – mandatory due to space, catering and voting; due April 27 via Survey Monkey (6 questions) Draft weekend schedule Voting procedure Board of Directors nominations form – due March 25 Standing Committee volunteer form – due March 25 Resolutions procedure and form – due March 25 Travel support request form BCSS awards procedure – due March 2 Hotel information: The Friday meetings will be held at the Accent Inn Victoria. We have made a group booking under the name BC School Sports MOPO. The group code is #71477, so please quote this number when making reservations. We are holding 20 rooms with up to 2 beds at the rate of $79.00 plus tax, per night (includes continental breakfast!). These rooms will be held until May 1, 2015. Following this date, reservations will be based on availability and at our best available rate. To make a reservation with the hotel directly, please call 250-475-7500. Bookings can also be made through Central Reservations at 1-800-663-0298.
Fall Deadline Date Changes
BC School Sports has changed the deadlines for fall sports. Membership Invoices: October 14Sport Declaration: October 14Team Registration (registering the minimum number of students on the team): October 14Additional Student-Athlete Registration (adding/modifying rosters): October 20
BCSS Scholarship Recipient Announcement
BC School Sports wishes to congratulate the 16 scholarship recipients. Recipients were selected on the basis of their academic success, sport participation, community involvement and leadership. We wish these 16 students best of luck in their post-secondary endeavours. Dave Gifford Memorial Awards Dave Gifford was a BCSS Director from 1988-90, and received the BCSS Honour Award in 1992. He was a teacher and Administrator in Vancouver, and died in 1992. In his honour, this scholarship is for one male and one female student who truly excels as a student-athlete. Value: $700 each Mieke Marie Dumont - South Kamloops Secondary Sports played: volleyball, basketball, soccer Athletic Achievements: Titan Award (excellence award), Dalhousie University Athletic Scholarship, South Kamloops Secondary Female Athlete of the year Academic Achievements: Senior Academic Athlete of the Year, Dalhousie University Academic Entrance Scholarship, Honour Roll, Principal's List John Gay - Okanagan Mission Secondary Sports played: cross country, track & field Athletic Achievements: BC High School Track & Field Championships Senior Boys 300m silver medallist (8:43.84), BC High School Track & Field Championships Senior Boys 2000m Steeplechase Silver Medallist (6:02.2) Academic Achievements: Principal's List, Work Ethic Award, Student of the Year Zone Scholarships Scholarships will be awarded in each of the seven BCSS Designated Zones. Successful applicants will have outstanding academic and athletic achievements. This year, we have 14 recipients, seven female and seven male. Value: $500 each Kyle MacLean - Fernie Secondary School (Zone A) Sports played: volleyball, skiing Athletic Achievements: 11th Overall Boys Skiing Provincial Championships, Honourable Mention All Star Team Boys Volleyball Provincials Academic Achievements: Dogwood Bilingual Certificate, French Immersion Student Malcolm Heinrichs - Southern Okanagan Secondary School (Zone B) Sports played: volleyball, basketball, tennis Athletic Achievements: Provincial 2nd Team All-Star AA Basketball Provincials, Sr. Athlete of the Year, Jr. Athlete of the Year, 1st Place Terry Fox Run Academic Achievements: Honour Roll, Passport to Education Stamp Rylee McKinlay - Princess Margaret Secondary School (Zone B) Sports played: volleyball, basketball, tennis, soccer Athletic Achievements: BC Soccer Provincial Champions, Soccer Okanagan Valley Champions, Girls Athlete of the Year, Girls Volleyball Player of the Year Academic Achievements: Runner-Up All Around Student of the Year, Gold Honour Student, Citizenship Award, English Student of the Year André Dubé - Lakes District Secondary School (Zone C) Sports played: skiing, snowboarding, soccer, mountain biking, rugby Athletic Achievements: 1st Place Snowboarding Boys Gr. 8-12 Individual Provincial Championships, 14th Place Soccer Provincial Championships Academic Achievements: Honour Roll with Distinction, UNBC Academic Scholar Award, DELF, Top Academic Student Carly Shaw-MacLaren - Duchess Park Secondary (Zone C) Sports played: basketball, soccer, cross country Athletic Achievements: Senior Athlete of the Year, Senior Girls Basketball City All-Star, AA Senior Girls Basketball 1st All-Star, Senior Girls Soccer MVP Academic Achievements: Principal's List, UNBC Academic Achiever, BC Indoor Soccer League Scholarship, Her Majesty Queen Elizabeth II Scholarship Award Jamie Tersago - Smithers Secondary (Zone D) Sports played: wrestling Athletic Achievements: Provincial Gold Medallist - Wrestling, Most Outstanding Female Athlete at Smithers Secondary, 5th at Canada Summer Games- Wrestling Academic Achievements: Principal's Effort Honour Roll, DELF Internationally Recognized French Level B2 Ryan Wright - Hazelton Secondary (Zone D) Sports played: soccer, volleyball, basketball Athletic Achievements: BCSS Sports Commissioner's 11 Award for Boys A Soccer Provincials, Senior Male Athlete of the Year, Senior Boys Basketball Zones All-star, 2013 Slurpee Soccer Cup Player of the Game Academic Achievements: 'A' Honour Roll, Loran Scholarship Provincial Finalist Michael Baart - St. Michael's University School (Zone E) Sports played: soccer, rugby Athletic Achievements: 4th Place Rugby Provincial Champions, Ryan Cup City Champions, Gareth Rees Boot Game Winners and Man of the Match Academic Achievements: UVIC Varsity Sport Scholarship, Dogwood Award Winner, AP Physics B 90%, Honour Roll Lindsay Cole - Mount Douglas Secondary (Zone E) Sports played: field hockey, soccer, basketball, track & field, cross country Athletic Achievements: Trelawney Shield - Most Outstanding U18 Player, Gwen Little "Junior of the Year" Award, Mount Douglas School Female Athlete of the Year, Sports Excellence Certificate Academic Achievements: Challenge Program for Gifted Students, Honour Roll Julia Hodanic - Burnaby Mountain Secondary (Zone F) Sports played: cross country, basketball, track & field Athletic Achievements: 2014 Burnaby Sports Hall of Fame Award, HSBC/Telus "Canada One Foundation" Basketball Award Academic Achievements: Burnaby Mountain Secondary Gold Cord Recipient, "AAA" Academic Athlete All-Star Award, Honour Roll with Distinction Tom Kanwischer - Handsworth Secondary School (Zone F) Sports played: rugby Athletic Achievements: Capilano Rugby Club - Winner 'Best Back' Player U20, Provincial Rugby Team U18, Representative Team Vancouver U18 Rugby Team Academic Achievements: Chancellor's Scholar, Honour Roll with Distinction, Best Senior Brass Soloist at BC Interior Jazz Festival Christine Howlett - South Delta Secondary School (Zone G) Sports played: volleyball, basketball, track & field Athletic Achievements: Club Volleyball Provincial Champions, School Volleyball Provincial Champions, Club Volleyball Provincial MVP, First Team All-star at School Volleyball Provincials Academic Achievements: Principal's List, Honour Roll, G-Club Keesha Khehra - North Surrey Secondary (Zone G) Sports played: basketball, soccer, cross country, field hockey Athletic Achievements: Surrey Firefighters' Goodwill Basketball Award, North Surrey Girls Field Hockey MVP, North Surrey Grade 12 Aggregate Academic Achievements: Loran Scholarship Provincial Finalist, UBC Chancellor's Scholar, Principal's Honour Roll, Top Pre-Calculus 12 Student Travis Muller - Langley Christian High School (Zone G) Sports played: basketball, volleyball, track & field Athletic Achievements: Gold in Senior Boys High Jump at BCSSAA Track & Field Tournament, Gold in Senior Boys High Jump at the Fraser Valley Relays Track & Field meet, 2nd Team All-Star - Senior Boys AA Fraser Valley Basketball Playoffs Academic Achievements: Completion of Apprenticeship Program For media inquiries, please contact BCSS at 604-477-1488. Information on next year's scholarships will be available on our website. Keep checking back to find out more information.
Press Release September 8, 2014
Please see the attached media release dated September 8 with information regarding the labour dispute. For more information contact: Christine BradstockExecutive Director604-477-1487 Deb WhittenPresident250-475-4155
STARS - New Registration System Launched
BCSS is proud to announce the launch of STARS – Student Athlete Registration System. The new system should be much faster and help you register your teams more efficiently and accurately. Please click on the "Registration Login" button in the top right-hand corner of our website to get started. Please let BCSS know if you have any questions or concerns and we will help you out as quickly as possible.
Learn – The Magazine of BC Education: Conduct While Coaching School Sports
Check out the latest issue of Learn – The Magazine of BC Education to find an article by The Honourable Bruce Preston, Commissioner for Teacher Regulation. In the article you will find helpful information to assist you with coaching your teams. The article, titled "Professional Conduct Advisory On Coaching School Sports", can be found on page 22 of Learn, or in the PDF copy found here: https://www.bcteacherregulation.ca/Magazine/Current.aspx
Team BC ready to roar in Special Olympics Canada 2014 Summer Games
Full Schedule: vancouver2014.com Largest-ever Special Olympics BC provincial team set for first home-province National Games since 1990 With the Special Olympics Canada Summer Games set to return to British Columbia this year for the first time since 1990, the 359 members of Special Olympics BC's biggest provincial team ever are ready to shine on this significant national stage. Team BC 2014 is comprised of 275 athletes with intellectual disabilities, 70 coaches, and 14 mission staff from 39 communities around the province. At the Special Olympics Canada 2014 Summer Games in Vancouver July 8 to 12, the SOBC athletes will go for gold in 11 sports: 10-pin bowling, 5-pin bowling, aquatics, athletics, basketball, bocce, golf, powerlifting, rhythmic gymnastics, soccer, and softball. "The Special Olympics Canada 2014 Summer Games are the first National Games to be held in B.C. since 1990, and our athletes are going to be ready to dominate on home soil," said Shawn Fevens, Team BC Chef de Mission. "Team BC has a dedicated and talented group of athletes and coaches who have been working hard for three years to reach this level. I know their abilities and their sportsmanship will inspire everyone watching and will show what is so amazing about Special Olympics sport." Since qualifying for their spots on Team BC 2014 through their performances at the 2013 Special Olympics BC Summer Games in Langley, the provincial team athletes and coaches have been hard at work with the team training program to help them be at their best at the National Games. The athletes have been putting in a lot of time and effort in their home communities both on and off their fields of play, logging hours of training in their sports as well as taking on dry-land training, improving their physical fitness, and stepping up their nutrition. Team BC athletes and coaches have benefitted from significant support from the world-class Allinger Consulting International team – authors of the Own the Podium program – as well as coaches and trainers from the University of British Columbia, Simon Fraser University, provincial sport organizations, mental performance consultants, and other expert organizations. For the first time, Team BC is also using elite sport science, technology, and tracking tools to help our athletes and coaches be at their very best when it comes time to compete at the 2014 Games venues at the UBC Vancouver campus, the University Golf Club, and The Zone Bowling Centre in Richmond. Special Olympics competitions operate on a four-year cycle for both summer and winter sports. Athletes compete in regional events and then Provincial Games to advance to National Games, and Special Olympics Canada Games are the qualifiers for Special Olympics World Games. In Vancouver, athletes will be competing for the opportunity to advance to the 2015 Special Olympics World Summer Games in Los Angeles. Through these competitions and training, Special Olympics athletes empower themselves and inspire everyone around them as they set and achieve goals, build pride and confidence with their achievements, and forge valued friendships. The Special Olympics Canada 2014 Summer Games will see 1,700 Special Olympics athletes, coaches, and mission staff members from across the country come together to compete in Vancouver, creating an outstanding display of sport and sportsmanship in 11 sports, including three making their debut at the National Games level: basketball, bocce, and golf. About Special Olympics BC Special Olympics BC is dedicated to providing individuals with intellectual disabilities opportunities to enrich their lives and celebrate personal achievement through positive sport experiences. In 57 communities around the province, we provide year-round training and competitive opportunities in 18 different sports to more than 4,300 athletes of all ages and abilities, thanks to the dedicated efforts of over 3,300 volunteers. For more information, please visit www.specialolympics.bc.ca. Find us on Facebook and Twitter: www.facebook.com/specialolympicsbc | @sobcsociety. Media contact Megan Grittani-Livingston SOBC Manager, Communications T: 604.737.3077 | E: megan@specialolympics.bc.ca
BCSS Media Release / Job Action
Annual General Meeting - Package 2
The BCSS AGM Package 2 is now ready for your review. Please view it in the AGM Resources section.
Presidents' Award Winner
Congratulations to Mo Williams 2014 Presidents' Award Winner presented by Sport BC
Preparations for the 2014 AGM have begun. Please visit the AGM Resources page for more information on nominations, resolutions and logistical information regarding the weekend. You should have recieved an e-mail with this information if you are an Athletic Director or Principal at a Member School. If you did not receive this e-mail, please contact info@bcschoolsports.ca as soon as possible so we can ensure you are included on future communications.
School Membership Discipline Committee Meeting
Introduction As the governing body for school sport in British Columbia, BC School Sports (BCSS) has a strong history of using a committee structure to oversee the running of our organization. The School Membership Disciplinary Committee (SMDC) convenes when issues of compliance with the Rules and Regulations arise. The SMDC is to meet as soon as possible (within twenty (20) working days of receipt of the initial charge). The SMDC designated in 3.2.2.1 of the Constitution and Bylaws, after investigating the charges, shall rule on one of the points listed in 3.2.2.4. During the process of rebuilding the registration system for the 440 schools and the 100,000 student-athletes involved in school sport in BC, the office staff have found some issues with the student transfer processes that some schools were using in the Exnet system. Some of these could be easily corrected by BCSS staff, for some the schools were contacted and the issues are quickly fixed and some were more complex. This process is still ongoing and will continue until Exnet is cleaned up. Facts At the end of November, BCSS staff discovered that a member school was using the rule D9.8.5 of the Rules and Regulations "District Academic Program" to register incoming students to their International Baccalaureate (IB) and French Immersion (FI) programs. D9.8.5 is for students who attend a short term program at a different school and are only eligible to compete for their original school under this rule. This member school has both IB and FI programs. The Pre IB grade 10 program takes in approximately 120 students per year and the IB grade 11 program takes in 135 students per year. Not all students are from outside of the school. Over the last 5 years over 150 students were transferred by this school on Exnet using the D9.8.5 rule and not the proper process of doing an application to the Eligibility Officer. Some students would have been immediately eligible, some would not have been deemed eligible and some would have required further information. There were also other student-athletes that were transferred into the school for other reasons. The eligibility of these student-athletes was considered as well. Timeline November 15, 2013 – BCSS became aware of the incorrect transfers on Exnet December 3, 2013 – Christine Bradstock, BCSS Executive Director met with representatives from the school, explained the situation and requested that Eligibility Applications be sent in for all students who would not be considered eligible. December 17, 2013 – The first 5 eligibility applications were submitted to the Eligibility Officer. January, 2014 – E-mails were exchanged, some applications and other documents were submitted but not everything. January 27, 2014 – SMDC met to consider facts, review documentation and make a decision regarding discipline. Representatives from the school were invited and encouraged to attend, they elected not to come. February 2014 – SMDC requested more information and a second and third meeting occurred. The school attended the third meeting. Issues The SMDC has looked at the data and assessed the situation in two ways: Looking closely at nearly 150 student-athlete transfers that occurred over the last 5 years: it was determined that the proper process of transferring student-athletes into this school had not been followed. Most of these transfer reasons were listed as D9.8.5 District Academic Program when in fact they were students entering the IB and FI programs. There were some student-athletes that were transferred in without going through any process at all. The amount of time taken to go through the list was long but the SMDC was pleased to do the process so that they understood the situation in detail. Looking at the school's process with respect to student-athlete transfers and registration: as the job of the SMDC is to determine the discipline of the school member, this is the area that they spent most of their time on when they first met on Monday, January 27; reconvened on Tuesday, February 4; and reconvened again on Friday, February 14. When a school has not fulfilled their condition for maintenance of membership under Article II 2.3 then the SMDC can rule under Article III of the Constitution and Bylaws. Submissions The SMDC respectfully leaves the decision of each individual student-athletes eligibility up to the BCSS office and the Eligibility Officer for their determination. School administration acknowledged that proper practice had not been followed in the past. Practice was the responsibility of AD, who is now moved to a different school. The school has submitted over 25 Eligibility Applications to date for students who had already played. As a result of these applications, most students were deemed eligible, some students were deemed not eligible and some games were forfeited. Analysis It was the wish of the SMDC and of BCSS to have as many student-athletes as possible properly registered online, and to be able to be eligible and play school sports. The SMDC and BCSS both wished to have the Athletic Director and school Administration understand the rules and be positively engaged in the school sport community. It is also the hope that the member school take responsibility for their job of ensuring that student-athletes are eligible before playing, and that proper process is followed to ensure student-athletes were eligible. Conclusion The SMDC has ruled under 3.2.2.4 (b) (iv) of the Constitution and Bylaws with the following: A letter of reprimand be sent to the member school administration outlining the violations that were discovered and an acknowledgment of the willingness of the school to work cooperatively and proactively with BCSS in the future to ensure all instances of student-transfer and athletic eligibility are managed according to BCSS policy and regulations. A probationary period is waived due to the fact that it is a first offense. Prior to September 30, 2014 the member school's Athletic Director initiate and schedule an in person meeting with the Executive Director of BCSS at the BCSS office. During this meeting they will review expected practices, procedures and the applicable regulations and processes in place with regard to student-athlete eligibility. This is intended to ensure that there is an educative and supportive component that is put in place to avoid errors in the interpretation of student-athlete transfer eligibility in the future. A fine of $2000 that will cover the out of pocket expenses associated with this process. A report to be completed by the BCSS office that outlines the process, nature of the violations and the disciplinary outcome. This report will be posted in the next BCSS newsletter for the purpose of informing all member schools about the process as well as to assist in educating them. The member school will not be named in the newsletter.
School Sport Canada Names Teams Participating in 2014 Nike High School Grand Prix
Congratulations to Maple Ridge Secondary School (Girls Team) from Maple Ridge and Pitt Meadows Secondary School(Boys Team) from Pitt Meadows for being selected to represent our province at the 2014 Nike High School Grand Prix in Toronto. You can learn more about the event and see what other teams are competing by checking out the press release.
High School Girls Basketball Scholarship Opportunity
TELUS is once again sponsoring the BCSSGBA Scholarships Program. The $2,000 scholarships will be presented to five female student athletes that will be continuing their post-secondary education and basketball career at a Canadian College or University for the 2014/15 academic year. Please see the attached scholarship application form for the Student-Athletes on your teams. The applications are due February 28, 2014.
Ken Dryden Symposium
Ken Dryden Concussion Symposium occurring on Jan. 28, 2014 from 5-9 P.M. Seating is limited RSVP required at: https://drydenconcussionbc.eventbrite.ca Join Ken Dryden as he talks about concussions with BC athletes, physicians, researchers, and sports officials, from awareness of the problem to awareness of its answers. This event will highlight the importance of the soon-tobe released Concussion Awareness Training Tool (CATT) developed by the BCIRPU in partnership with the BC Ministry of Health. Created for parents, players, coaches and trainers, the CATT will build on a number of existing resources, including the CATT for physicians and health professionals, to provide an educational training tool that will raise awareness of concussion as well as the need for proper management and prevention. For more information visit: www.cattonline.com Please see the attached flyer (PDF) for more information about this event.
Coach of the Season Nominations
BCSS would like to recognize outstanding coaches in our schools. If you know of a coach who has done an excellent job mentoring student-athletes in their sport, or someone who has gone above and beyond this past fall season, we encourage you to nominate them for this award. Please use the form (below) to submit your nomination package. Nominations must be submitted by an Athletic Director or Principal. The due date for nominations is January 10, 2014. Please click here to get the form. Please direct all inquiries to info@bcschoolsports.ca.


If you like pictures on this website, this is thanks to unbelievable beauty of these places, and not due to my Photoshop skills. There is no artificial colors, no GMO, no sugar or additives. All organic, free range, grass fed, and natural. And I committed to keep it this way.


How it works: Take a look at the rates. If you like the photography and you like the price, drop me a line. We'll discuss your date, what you're needing, and whether we're a good fit. It's that simple.
Visible and up-front pricing is a core value here at XO Chels. We simply treat others how we appreciate being treated. So, naturally we appreciate honest and transparent pricing and services and bypassing the courting period before you're hit with the numbers.
FREE when you book your wedding photos with XO Chels.
TRAVEL: Travel- Discuss travel and destination costs with us.


The burnt sugar syrup flavors this old time favorite cake. It's a 2-layer cake filled and frosted with burnt sugar frosting.
Melt 3/4 cup sugar in a skillet over low heat, stirring occasionally, until it turns into a rich amber color.
Turn off heat, and very carefully add the boiling water. The mixture will spatter at first.
Return the syrup to low heat and simmer, stirring frequently, until the sugar and water are thoroughly mixed and smooth, about 4 to 5 minutes.
Adjust rack to lower third of oven; preheat at oven to 350 F.
Grease and flour two 9-inch layer cake pans. Line pans with buttered parchment or waxed paper rounds.
Sift together flour, baking powder and 1/2 teaspoon of salt; set aside.
Cream butter until smooth and creamy. Add the granulated sugar and continue creaming until light and fluffy. Add eggs, one at a time, beating after each addition until well blended. To the 1/2 cup of burnt sugar syrup add enough water to make 1 cup; stir in 1 teaspoon of vanilla.
Add the dry ingredients to the creamed mixture alternately with the burnt sugar syrup-water mixture, beginning and ending with the flour mixture. Beat until well blended and smooth. Divide the batter between the 2 cake pans.
Bake the cakes for about 25 minutes, or until the surface springs back slightly when lightly touched in the center with a finger. The cakes will contract slightly from the sides of the pans.
Cool 10 minutes in the pan on wire racks, then invert the cakes onto the racks. Carefully peel off paper liners; turn baked side up, and cool completely before frosting.
Fill and frost with Burnt Sugar Frosting (instructions below) and decorate with whole pecan halves.
Cream 1/4 cup unsalted butter until light and fluffy.
Sift the confectioners' sugar with the 1/4 teaspoon of salt.
Gradually beat the confectioners' sugar mixture into the butter with the remaining 1/4 cup Burnt Sugar Syrup and 1 teaspoon vanilla. Continue beating until creamy and spreadable. If mixture is stiff, add water, about 1 teaspoon at a time.


So Barb got me A Horse Walks Into a Bar for Christmas. It was on my wish list. I had seen it on a lot of the year-end lists and it looked like something I would enjoy.
And I did. It is a supreme literary achievement and deserves all of the accolades it has received. David Grossman, the author, created a piece of writing that is at the top of the craft.
The frame of the book is deceptively simple. The entire story is told through one man's stand up routine in a club in Israel. Grossman takes that frame and uses it to gradually reveal the story of the stand up comic, who is clearly tormented. Through it all, the reader has the sense it is bad. Is driven to keep watching. Sees it get worse and worse and yet continues.
The audience at the club gets involved as part of the story. As the story moves forward, it turns out that people who have been sitting there in the audience are actually part of the story, as if a spotlight shines on them suddenly in the dark.
Grossman's writing has been praised in reviews for being elegant and spare. It's hard to describe how true this is. Every word is perfect. Every word is necessary.
This is one of those stories that has everything. Abuse. Family dysfunction. Mental illness. Death. Regret. Told in a florid and overbearing style, it would collapse of its own weight into The Prince of Tides. It would be emotionally unmanageable.
But Grossman gives us nothing but the story and lets us supply the feelings.
I don't like to give plot summaries, but if you read the book, there's a scene where the comic describes being put into a truck with a total stranger and the scene goes on and on and you can feel yourself in that car, you can see what it looks like out the dusty window. The scene, which seems incidental, turns into the book's critical passage and it is a torture to read.
Which brings up a key point. This book is framed in a stand-up comedy routine. Any reader should understand that the book is almost never funny. There are a couple corny jokes–like ones your uncle would tell every year at the family BBQ after cracking open his sixth can of Stroh's–and you might chuckle at those, or groan.
But this book is not funny. In fact, it is a tough read. It is dark and it delves into the most pain and regrets that people are capable of carrying, exponentially multiplied by years of stewing.
And I guess that's my ultimate verdict. This is an expertly crafted piece of fiction. I like my art dark, and it certainly is. The only thing that keeps this book from reaching my very top shelf is just the fact that…for my taste…it is dark and humorless, unlike say Catch-22.
That's ultimately quibbling. This is a great book.