text:
#include "third_party/blink/renderer/core/layout/layout_replaced.h"

#include "third_party/blink/renderer/core/editing/position_with_affinity.h"
#include "third_party/blink/renderer/core/html/html_dimension.h"
#include "third_party/blink/renderer/core/layout/api/line_layout_block_flow.h"
#include "third_party/blink/renderer/core/layout/geometry/logical_offset.h"
#include "third_party/blink/renderer/core/layout/geometry/logical_size.h"
#include "third_party/blink/renderer/core/layout/intrinsic_sizing_info.h"
#include "third_party/blink/renderer/core/layout/layout_block.h"
#include "third_party/blink/renderer/core/layout/layout_image.h"
#include "third_party/blink/renderer/core/layout/layout_inline.h"
#include "third_party/blink/renderer/core/layout/layout_video.h"
#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h"
#include "third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h"
#include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
#include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
#include "third_party/blink/renderer/core/paint/paint_info.h"
#include "third_party/blink/renderer/core/paint/paint_layer.h"
#include "third_party/blink/renderer/core/paint/replaced_painter.h"
#include "third_party/blink/renderer/platform/geometry/length_functions.h"

namespace blink {

const int LayoutReplaced::kDefaultWidth = 300;
const int LayoutReplaced::kDefaultHeight = 150;

LayoutReplaced::LayoutReplaced(Element* element)
    : LayoutBox(element), intrinsic_size_(kDefaultWidth, kDefaultHeight) {
  // TODO(jchaffraix): We should not set this boolean for block-level
  // replaced elements (crbug.com/567964).
  SetIsAtomicInlineLevel(true);
}

LayoutReplaced::LayoutReplaced(Element* element,
                               const LayoutSize& intrinsic_size)
    : LayoutBox(element), intrinsic_size_(intrinsic_size) {
  // TODO(jchaffraix): We should not set this boolean for block-level
  // replaced elements (crbug.com/567964).
  SetIsAtomicInlineLevel(true);
}

LayoutReplaced::~LayoutReplaced() = default;

void LayoutReplaced::WillBeDestroyed() {
  NOT_DESTROYED();
  if (!DocumentBeingDestroyed() && Parent())
    Parent()->DirtyLinesFromChangedChild(this);

  LayoutBox::WillBeDestroyed();
}

void LayoutReplaced::StyleDidChange(StyleDifference diff,
                                    const ComputedStyle* old_style) {
  NOT_DESTROYED();
  LayoutBox::StyleDidChange(diff, old_style);

  // Replaced elements can have border-radius clips without clipping overflow;
  // the overflow clipping case is already covered in LayoutBox::StyleDidChange
  if (old_style && !old_style->RadiiEqual(StyleRef())) {
    SetNeedsPaintPropertyUpdate();
    if (Layer())
      Layer()->SetNeedsCompositingInputsUpdate();
  }

  bool had_style = !!old_style;
  float old_zoom = had_style ? old_style->EffectiveZoom()
                             : ComputedStyleInitialValues::InitialZoom();
  if (Style() && StyleRef().EffectiveZoom() != old_zoom)
    IntrinsicSizeChanged();
}

void LayoutReplaced::UpdateLayout() {
  NOT_DESTROYED();
  DCHECK(NeedsLayout());

  PhysicalRect old_content_rect = ReplacedContentRect();

  SetHeight(MinimumReplacedHeight());

  UpdateLogicalWidth();
  UpdateLogicalHeight();

  ClearLayoutOverflow();
  ClearSelfNeedsLayoutOverflowRecalc();
  ClearChildNeedsLayoutOverflowRecalc();

  UpdateAfterLayout();

  ClearNeedsLayout();

  if (ReplacedContentRect() != old_content_rect)
    SetShouldDoFullPaintInvalidation();
}

void LayoutReplaced::IntrinsicSizeChanged() {
  NOT_DESTROYED();
  int scaled_width =
      static_cast<int>(kDefaultWidth * StyleRef().EffectiveZoom());
  int scaled_height =
      static_cast<int>(kDefaultHeight * StyleRef().EffectiveZoom());
  intrinsic_size_ = LayoutSize(scaled_width, scaled_height);
  SetNeedsLayoutAndIntrinsicWidthsRecalcAndFullPaintInvalidation(
      layout_invalidation_reason::kSizeChanged);
}

void LayoutReplaced::Paint(const PaintInfo& paint_info) const {
  NOT_DESTROYED();
  ReplacedPainter(*this).Paint(paint_info);
}

bool LayoutReplaced::HasReplacedLogicalHeight() const {
  NOT_DESTROYED();
  if (StyleRef().LogicalHeight().IsAuto())
    return StretchBlockSizeIfAuto();

  if (StyleRef().LogicalHeight().IsFixed())
    return true;

  if (StyleRef().LogicalHeight().IsPercentOrCalc()) {
    if (HasAutoHeightOrContainingBlockWithAutoHeight())
      return false;
    return true;
  }

  if (StyleRef().LogicalHeight().IsContentOrIntrinsicOrFillAvailable())
    return StyleRef().AspectRatio().IsAuto();

  return false;
}

bool LayoutReplaced::NeedsPreferredWidthsRecalculation() const {
  NOT_DESTROYED();
  // If the height is a percentage and the width is auto, then the
  // containingBlocks's height changing can cause this node to change it's
  // preferred width because it maintains aspect ratio.
  return HasRelativeLogicalHeight() && StyleRef().LogicalWidth().IsAuto();
}

static inline bool LayoutObjectHasIntrinsicAspectRatio(
    const LayoutObject* layout_object) {
  DCHECK(layout_object);
  return layout_object->IsImage() || layout_object->IsCanvas() ||
         IsA<LayoutVideo>(layout_object);
}

void LayoutReplaced::RecalcVisualOverflow() {
  NOT_DESTROYED();
  ClearVisualOverflow();
  LayoutObject::RecalcVisualOverflow();
  AddVisualEffectOverflow();
}

void LayoutReplaced::ComputeIntrinsicSizingInfoForReplacedContent(
    IntrinsicSizingInfo& intrinsic_sizing_info) const {
  NOT_DESTROYED();
  // In cases where we apply size containment we don't need to compute sizing
  // information, since the final result does not depend on it.
  if (ShouldApplySizeContainment()) {
    // Reset the size in case it was already populated.
    intrinsic_sizing_info.size = gfx::SizeF();

    const StyleAspectRatio& aspect_ratio = StyleRef().AspectRatio();
    if (!aspect_ratio.IsAuto()) {
      intrinsic_sizing_info.aspect_ratio.set_width(
          aspect_ratio.GetRatio().width());
      intrinsic_sizing_info.aspect_ratio.set_height(
          aspect_ratio.GetRatio().height());
    }

    // If any of the dimensions are overridden, set those sizes.
    if (HasOverrideIntrinsicContentLogicalWidth()) {
      intrinsic_sizing_info.size.set_width(
          OverrideIntrinsicContentLogicalWidth().ToFloat());
    }
    if (HasOverrideIntrinsicContentLogicalHeight()) {
      intrinsic_sizing_info.size.set_height(
          OverrideIntrinsicContentLogicalHeight().ToFloat());
    }
    return;
  }

  // Size overrides only apply if there is size-containment, which is checked
  // above.
  DCHECK(!HasOverrideIntrinsicContentLogicalWidth());
  DCHECK(!HasOverrideIntrinsicContentLogicalHeight());

  ComputeIntrinsicSizingInfo(intrinsic_sizing_info);

  // Update our intrinsic size to match what was computed, so that
  // when we constrain the size, the correct intrinsic size will be
  // obtained for comparison against min and max widths.
  if (!intrinsic_sizing_info.aspect_ratio.IsEmpty() &&
      !intrinsic_sizing_info.size.IsEmpty()) {
    intrinsic_size_ = LayoutSize(intrinsic_sizing_info.size);
    if (!IsHorizontalWritingMode())
      intrinsic_size_ = intrinsic_size_.TransposedSize();
  }
}

gfx::SizeF LayoutReplaced::ConstrainIntrinsicSizeToMinMax(
    const IntrinsicSizingInfo& intrinsic_sizing_info) const {
  NOT_DESTROYED();
  // Constrain the intrinsic size along each axis according to minimum and
  // maximum width/heights along the opposite axis. So for example a maximum
  // width that shrinks our width will result in the height we compute here
  // having to shrink in order to preserve the aspect ratio. Because we compute
  // these values independently along each axis, the final returned size may in
  // fact not preserve the aspect ratio.
  // TODO(davve): Investigate using only the intrinsic aspect ratio here.
  gfx::SizeF constrained_size = intrinsic_sizing_info.size;
  if (!intrinsic_sizing_info.aspect_ratio.IsEmpty() &&
      !intrinsic_sizing_info.size.IsEmpty() &&
      StyleRef().LogicalWidth().IsAuto() &&
      StyleRef().LogicalHeight().IsAuto()) {
    // We can't multiply or divide by 'intrinsicSizingInfo.aspectRatio' here, it
    // breaks tests, like images/zoomed-img-size.html, which
    // can only be fixed once subpixel precision is available for things like
    // intrinsicWidth/Height - which include zoom!
    constrained_size.set_width(LayoutBox::ComputeReplacedLogicalHeight() *
                               intrinsic_sizing_info.size.width() /
                               intrinsic_sizing_info.size.height());
    constrained_size.set_height(LayoutBox::ComputeReplacedLogicalWidth() *
                                intrinsic_sizing_info.size.height() /
                                intrinsic_sizing_info.size.width());
  }
  return constrained_size;
}

void LayoutReplaced::ComputePositionedLogicalWidth(
    LogicalExtentComputedValues& computed_values) const {
  NOT_DESTROYED();
  // The following is based off of the W3C Working Draft from April 11, 2006 of
  // CSS 2.1: Section 10.3.8 "Absolutely positioned, replaced elements"
  // <http://www.w3.org/TR/2005/WD-CSS21-20050613/visudet.html#abs-replaced-width>
  // (block-style-comments in this function correspond to text from the spec and
  // the numbers correspond to numbers in spec).

  // We don't use containingBlock(), since we may be positioned by an enclosing
  // relative positioned inline.
  const auto* container_block = To<LayoutBoxModelObject>(Container());

  const LayoutUnit container_logical_width =
      ContainingBlockLogicalWidthForPositioned(container_block);
  const LayoutUnit container_relative_logical_width =
      ContainingBlockLogicalWidthForPositioned(container_block, false);

  // To match WinIE, in quirks mode use the parent's 'direction' property
  // instead of the the container block's.
  TextDirection container_direction = container_block->StyleRef().Direction();

  // Variables to solve.
  bool is_horizontal = IsHorizontalWritingMode();
  Length logical_left = StyleRef().LogicalLeft();
  Length logical_right = StyleRef().LogicalRight();
  Length margin_logical_left =
      is_horizontal ? StyleRef().MarginLeft() : StyleRef().MarginTop();
  Length margin_logical_right =
      is_horizontal ? StyleRef().MarginRight() : StyleRef().MarginBottom();
  LayoutUnit& margin_logical_left_alias = StyleRef().IsLeftToRightDirection()
                                              ? computed_values.margins_.start_
                                              : computed_values.margins_.end_;
  LayoutUnit& margin_logical_right_alias =
      StyleRef().IsLeftToRightDirection() ? computed_values.margins_.end_
                                          : computed_values.margins_.start_;

  // ---------------------------------------------------------------------------
  // 1. The used value of 'width' is determined as for inline replaced
  //  elements.
  // ---------------------------------------------------------------------------
  // NOTE: This value of width is final in that the min/max width calculations
  // are dealt with in computeReplacedWidth().  This means that the steps to
  // produce correct max/min in the non-replaced version, are not necessary.
  computed_values.extent_ =
      ComputeReplacedLogicalWidth() + BorderAndPaddingLogicalWidth();

  const LayoutUnit available_space =
      container_logical_width - computed_values.extent_;

  // ---------------------------------------------------------------------------
  // 2. If both 'left' and 'right' have the value 'auto', then if 'direction'
  //    of the containing block is 'ltr', set 'left' to the static position;
  //    else if 'direction' is 'rtl', set 'right' to the static position.
  // ---------------------------------------------------------------------------
  // see FIXME 1
  ComputeInlineStaticDistance(logical_left, logical_right, this,
                              container_block, container_logical_width);

  // ---------------------------------------------------------------------------
  // 3. If 'left' or 'right' are 'auto', replace any 'auto' on 'margin-left'
  //    or 'margin-right' with '0'.
  // ---------------------------------------------------------------------------
  if (logical_left.IsAuto() || logical_right.IsAuto()) {
    if (margin_logical_left.IsAuto())
      margin_logical_left = Length::Fixed(0);
    if (margin_logical_right.IsAuto())
      margin_logical_right = Length::Fixed(0);
  }

  // ---------------------------------------------------------------------------
  // 4. If at this point both 'margin-left' and 'margin-right' are still 'auto',
  //    solve the equation under the extra constraint that the two margins must
  //    get equal values, unless this would make them negative, in which case
  //    when the direction of the containing block is 'ltr' ('rtl'), set
  //    'margin-left' ('margin-right') to zero and solve for 'margin-right'
  //    ('margin-left').
  // ---------------------------------------------------------------------------
  LayoutUnit logical_left_value;
  LayoutUnit logical_right_value;

  if (margin_logical_left.IsAuto() && margin_logical_right.IsAuto()) {
    // 'left' and 'right' cannot be 'auto' due to step 3
    DCHECK(!(logical_left.IsAuto() && logical_right.IsAuto()));

    logical_left_value = ValueForLength(logical_left, container_logical_width);
    logical_right_value =
        ValueForLength(logical_right, container_logical_width);

    LayoutUnit difference =
        available_space - (logical_left_value + logical_right_value);
    if (difference > LayoutUnit()) {
      margin_logical_left_alias = difference / 2;  // split the difference
      margin_logical_right_alias =
          difference -
          margin_logical_left_alias;  // account for odd valued differences
    } else {
      // Use the containing block's direction rather than the parent block's
      // per CSS 2.1 reference test abspos-replaced-width-margin-000.
      if (container_direction == TextDirection::kLtr) {
        margin_logical_left_alias = LayoutUnit();
        margin_logical_right_alias = difference;  // will be negative
      } else {
        margin_logical_left_alias = difference;  // will be negative
        margin_logical_right_alias = LayoutUnit();
      }
    }

    // -------------------------------------------------------------------------
    // 5. If at this point there is an 'auto' left, solve the equation for that
    //    value.
    // -------------------------------------------------------------------------
  } else if (logical_left.IsAuto()) {
    margin_logical_left_alias =
        ValueForLength(margin_logical_left, container_relative_logical_width);
    margin_logical_right_alias =
        ValueForLength(margin_logical_right, container_relative_logical_width);
    logical_right_value =
        ValueForLength(logical_right, container_logical_width);

    // Solve for 'left'
    logical_left_value =
        available_space - (logical_right_value + margin_logical_left_alias +
                           margin_logical_right_alias);
  } else if (logical_right.IsAuto()) {
    margin_logical_left_alias =
        ValueForLength(margin_logical_left, container_relative_logical_width);
    margin_logical_right_alias =
        ValueForLength(margin_logical_right, container_relative_logical_width);
    logical_left_value = ValueForLength(logical_left, container_logical_width);

    // Solve for 'right'
    logical_right_value =
        available_space - (logical_left_value + margin_logical_left_alias +
                           margin_logical_right_alias);
  } else if (margin_logical_left.IsAuto()) {
    margin_logical_right_alias =
        ValueForLength(margin_logical_right, container_relative_logical_width);
    logical_left_value = ValueForLength(logical_left, container_logical_width);
    logical_right_value =
        ValueForLength(logical_right, container_logical_width);

    // Solve for 'margin-left'
    margin_logical_left_alias =
        available_space -
        (logical_left_value + logical_right_value + margin_logical_right_alias);
  } else if (margin_logical_right.IsAuto()) {
    margin_logical_left_alias =
        ValueForLength(margin_logical_left, container_relative_logical_width);
    logical_left_value = ValueForLength(logical_left, container_logical_width);
    logical_right_value =
        ValueForLength(logical_right, container_logical_width);

    // Solve for 'margin-right'
    margin_logical_right_alias =
        available_space -
        (logical_left_value + logical_right_value + margin_logical_left_alias);
  } else {
    // Nothing is 'auto', just calculate the values.
    margin_logical_left_alias =
        ValueForLength(margin_logical_left, container_relative_logical_width);
    margin_logical_right_alias =
        ValueForLength(margin_logical_right, container_relative_logical_width);
    logical_right_value =
        ValueForLength(logical_right, container_logical_width);
    logical_left_value = ValueForLength(logical_left, container_logical_width);
    // If the containing block is right-to-left, then push the left position as
    // far to the right as possible
    if (container_direction == TextDirection::kRtl) {
      int total_logical_width =
          (computed_values.extent_ + logical_left_value + logical_right_value +
           margin_logical_left_alias + margin_logical_right_alias)
              .ToInt();
      logical_left_value =
          container_logical_width - (total_logical_width - logical_left_value);
    }
  }

  // ---------------------------------------------------------------------------
  // 6. If at this point the values are over-constrained, ignore the value for
  //    either 'left' (in case the 'direction' property of the containing block
  //    is 'rtl') or 'right' (in case 'direction' is 'ltr') and solve for that
  //    value.
  // ---------------------------------------------------------------------------
  // NOTE: Constraints imposed by the width of the containing block and its
  // content have already been accounted for above.
  //
  // FIXME: Deal with differing writing modes here.  Our offset needs to be in
  // the containing block's coordinate space, so that
  // can make the result here rather complicated to compute.
  //
  // Use computed values to calculate the horizontal position.
  //
  // FIXME: This hack is needed to calculate the logical left position for a
  // 'rtl' relatively positioned, inline containing block because right now, it
  // is using the logical left position of the first line box when really it
  // should use the last line box. When this is fixed elsewhere, this block
  // should be removed.
  if (container_block->IsLayoutInline() &&
      !container_block->StyleRef().IsLeftToRightDirection()) {
    const auto* flow = To<LayoutInline>(container_block);
    InlineFlowBox* first_line = flow->FirstLineBox();
    InlineFlowBox* last_line = flow->LastLineBox();
    if (first_line && last_line && first_line != last_line) {
      computed_values.position_ =
          logical_left_value + margin_logical_left_alias +
          last_line->BorderLogicalLeft() +
          (last_line->LogicalLeft() - first_line->LogicalLeft());
      return;
    }
  }

  LayoutUnit logical_left_pos = logical_left_value + margin_logical_left_alias;
  ComputeLogicalLeftPositionedOffset(logical_left_pos, this,
                                     computed_values.extent_, container_block,
                                     container_logical_width);
  computed_values.position_ = logical_left_pos;
}

void LayoutReplaced::ComputePositionedLogicalHeight(
    LogicalExtentComputedValues& computed_values) const {
  NOT_DESTROYED();
  // The following is based off of the W3C Working Draft from April 11, 2006 of
  // CSS 2.1: Section 10.6.5 "Absolutely positioned, replaced elements"
  // <http://www.w3.org/TR/2005/WD-CSS21-20050613/visudet.html#abs-replaced-height>
  // (block-style-comments in this function correspond to text from the spec and
  // the numbers correspond to numbers in spec)

  // We don't use containingBlock(), since we may be positioned by an enclosing
  // relpositioned inline.
  const auto* container_block = To<LayoutBoxModelObject>(Container());

  const LayoutUnit container_logical_height =
      ContainingBlockLogicalHeightForPositioned(container_block);
  const LayoutUnit container_relative_logical_width =
      ContainingBlockLogicalWidthForPositioned(container_block, false);

  // Variables to solve.
  Length margin_before = StyleRef().MarginBefore();
  Length margin_after = StyleRef().MarginAfter();
  LayoutUnit& margin_before_alias = computed_values.margins_.before_;
  LayoutUnit& margin_after_alias = computed_values.margins_.after_;

  Length logical_top = StyleRef().LogicalTop();
  Length logical_bottom = StyleRef().LogicalBottom();

  // ---------------------------------------------------------------------------
  // 1. The used value of 'height' is determined as for inline replaced
  //    elements.
  // ---------------------------------------------------------------------------
  // NOTE: This value of height is final in that the min/max height calculations
  // are dealt with in computeReplacedHeight().  This means that the steps to
  // produce correct max/min in the non-replaced version, are not necessary.
  computed_values.extent_ =
      ComputeReplacedLogicalHeight() + BorderAndPaddingLogicalHeight();
  const LayoutUnit available_space =
      container_logical_height - computed_values.extent_;

  // ---------------------------------------------------------------------------
  // 2. If both 'top' and 'bottom' have the value 'auto', replace 'top' with the
  //    element's static position.
  // ---------------------------------------------------------------------------
  // see FIXME 1
  ComputeBlockStaticDistance(logical_top, logical_bottom, this,
                             container_block);

  // ---------------------------------------------------------------------------
  // 3. If 'bottom' is 'auto', replace any 'auto' on 'margin-top' or
  //    'margin-bottom' with '0'.
  // ---------------------------------------------------------------------------
  // FIXME: The spec. says that this step should only be taken when bottom is
  // auto, but if only top is auto, this makes step 4 impossible.
  if (logical_top.IsAuto() || logical_bottom.IsAuto()) {
    if (margin_before.IsAuto())
      margin_before = Length::Fixed(0);
    if (margin_after.IsAuto())
      margin_after = Length::Fixed(0);
  }

  // ---------------------------------------------------------------------------
  // 4. If at this point both 'margin-top' and 'margin-bottom' are still 'auto',
  //    solve the equation under the extra constraint that the two margins must
  //    get equal values.
  // ---------------------------------------------------------------------------
  LayoutUnit logical_top_value;
  LayoutUnit logical_bottom_value;

  if (margin_before.IsAuto() && margin_after.IsAuto()) {
    // 'top' and 'bottom' cannot be 'auto' due to step 2 and 3 combined.
    DCHECK(!(logical_top.IsAuto() || logical_bottom.IsAuto()));

    logical_top_value = ValueForLength(logical_top, container_logical_height);
    logical_bottom_value =
        ValueForLength(logical_bottom, container_logical_height);

    LayoutUnit difference =
        available_space - (logical_top_value + logical_bottom_value);
    // NOTE: This may result in negative values.
    margin_before_alias = difference / 2;  // split the difference
    margin_after_alias =
        difference - margin_before_alias;  // account for odd valued differences

    // -------------------------------------------------------------------------
    // 5. If at this point there is only one 'auto' left, solve the equation
    //    for that value.
    // -------------------------------------------------------------------------
  } else if (logical_top.IsAuto()) {
    margin_before_alias =
        ValueForLength(margin_before, container_relative_logical_width);
    margin_after_alias =
        ValueForLength(margin_after, container_relative_logical_width);
    logical_bottom_value =
        ValueForLength(logical_bottom, container_logical_height);

    // Solve for 'top'
    logical_top_value =
        available_space -
        (logical_bottom_value + margin_before_alias + margin_after_alias);
  } else if (logical_bottom.IsAuto()) {
    margin_before_alias =
        ValueForLength(margin_before, container_relative_logical_width);
    margin_after_alias =
        ValueForLength(margin_after, container_relative_logical_width);
    logical_top_value = ValueForLength(logical_top, container_logical_height);

    // Solve for 'bottom'
    // NOTE: It is not necessary to solve for 'bottom' because we don't ever
    // use the value.
  } else if (margin_before.IsAuto()) {
    margin_after_alias =
        ValueForLength(margin_after, container_relative_logical_width);
    logical_top_value = ValueForLength(logical_top, container_logical_height);
    logical_bottom_value =
        ValueForLength(logical_bottom, container_logical_height);

    // Solve for 'margin-top'
    margin_before_alias =
        available_space -
        (logical_top_value + logical_bottom_value + margin_after_alias);
  } else if (margin_after.IsAuto()) {
    margin_before_alias =
        ValueForLength(margin_before, container_relative_logical_width);
    logical_top_value = ValueForLength(logical_top, container_logical_height);
    logical_bottom_value =
        ValueForLength(logical_bottom, container_logical_height);

    // Solve for 'margin-bottom'
    margin_after_alias =
        available_space -
        (logical_top_value + logical_bottom_value + margin_before_alias);
  } else {
    // Nothing is 'auto', just calculate the values.
    margin_before_alias =
        ValueForLength(margin_before, container_relative_logical_width);
    margin_after_alias =
        ValueForLength(margin_after, container_relative_logical_width);
    logical_top_value = ValueForLength(logical_top, container_logical_height);
    // NOTE: It is not necessary to solve for 'bottom' because we don't ever
    // use the value.
  }

  // ---------------------------------------------------------------------------
  // 6. If at this point the values are over-constrained, ignore the value for
  //    'bottom' and solve for that value.
  // ---------------------------------------------------------------------------
  // NOTE: It is not necessary to do this step because we don't end up using the
  // value of 'bottom' regardless of whether the values are over-constrained or
  // not.

  // Use computed values to calculate the vertical position.
  LayoutUnit logical_top_pos = logical_top_value + margin_before_alias;
  ComputeLogicalTopPositionedOffset(logical_top_pos, this,
                                    computed_values.extent_, container_block,
                                    container_logical_height);
  computed_values.position_ = logical_top_pos;
}

PhysicalRect LayoutReplaced::ComputeObjectFit(
    const LayoutSize* overridden_intrinsic_size) const {
  NOT_DESTROYED();
  PhysicalRect content_rect = PhysicalContentBoxRect();
  EObjectFit object_fit = StyleRef().GetObjectFit();

  if (object_fit == EObjectFit::kFill &&
      StyleRef().ObjectPosition() ==
          ComputedStyleInitialValues::InitialObjectPosition()) {
    return content_rect;
  }

  // TODO(davve): intrinsicSize doubles as both intrinsic size and intrinsic
  // ratio. In the case of SVG images this isn't correct since they can have
  // intrinsic ratio but no intrinsic size. In order to maintain aspect ratio,
  // the intrinsic size for SVG might be faked from the aspect ratio,
  // see SVGImage::containerSize().
  PhysicalSize intrinsic_size(
      overridden_intrinsic_size ? *overridden_intrinsic_size : IntrinsicSize());
  if (intrinsic_size.IsEmpty())
    return content_rect;

  PhysicalSize scaled_intrinsic_size(intrinsic_size);
  PhysicalRect final_rect = content_rect;
  switch (object_fit) {
    case EObjectFit::kScaleDown:
      // Srcset images have an intrinsic size depending on their destination,
      // but with object-fit: scale-down they need to use the underlying image
      // src's size. So revert back to the original size in that case.
      if (auto* image = DynamicTo<LayoutImage>(this)) {
        scaled_intrinsic_size.Scale(1.0 / image->ImageDevicePixelRatio());
      }
      [[fallthrough]];
    case EObjectFit::kContain:
    case EObjectFit::kCover:
      final_rect.size = final_rect.size.FitToAspectRatio(
          intrinsic_size, object_fit == EObjectFit::kCover
                              ? kAspectRatioFitGrow
                              : kAspectRatioFitShrink);
      if (object_fit != EObjectFit::kScaleDown ||
          final_rect.Width() <= scaled_intrinsic_size.width)
        break;
      [[fallthrough]];
    case EObjectFit::kNone:
      final_rect.size = scaled_intrinsic_size;
      break;
    case EObjectFit::kFill:
      break;
    default:
      NOTREACHED();
  }

  LayoutUnit x_offset =
      MinimumValueForLength(StyleRef().ObjectPosition().X(),
                            content_rect.Width() - final_rect.Width());
  LayoutUnit y_offset =
      MinimumValueForLength(StyleRef().ObjectPosition().Y(),
                            content_rect.Height() - final_rect.Height());
  final_rect.Move(PhysicalOffset(x_offset, y_offset));

  return final_rect;
}

PhysicalRect LayoutReplaced::ReplacedContentRect() const {
  NOT_DESTROYED();
  return ComputeObjectFit();
}

PhysicalRect LayoutReplaced::PreSnappedRectForPersistentSizing(
    const PhysicalRect& rect) {
  return PhysicalRect(rect.offset, PhysicalSize(ToRoundedSize(rect.size)));
}

void LayoutReplaced::ComputeIntrinsicSizingInfo(
    IntrinsicSizingInfo& intrinsic_sizing_info) const {
  NOT_DESTROYED();
  DCHECK(!ShouldApplySizeContainment());
  intrinsic_sizing_info.size = gfx::SizeF(IntrinsicLogicalWidth().ToFloat(),
                                          IntrinsicLogicalHeight().ToFloat());

  const StyleAspectRatio& aspect_ratio = StyleRef().AspectRatio();
  if (!aspect_ratio.IsAuto()) {
    intrinsic_sizing_info.aspect_ratio.set_width(
        aspect_ratio.GetRatio().width());
    intrinsic_sizing_info.aspect_ratio.set_height(
        aspect_ratio.GetRatio().height());
    if (!IsHorizontalWritingMode())
      intrinsic_sizing_info.aspect_ratio.Transpose();
  }
  if (aspect_ratio.GetType() == EAspectRatioType::kRatio)
    return;
  // Otherwise, let the intrinsic aspect ratio take precedence, below.

  // Figure out if we need to compute an intrinsic ratio.
  if (!LayoutObjectHasIntrinsicAspectRatio(this))
    return;

  if (!intrinsic_sizing_info.size.IsEmpty())
    intrinsic_sizing_info.aspect_ratio = intrinsic_sizing_info.size;
}

LayoutUnit LayoutReplaced::ComputeConstrainedLogicalWidth(
    ShouldComputePreferred should_compute_preferred) const {
  NOT_DESTROYED();
  if (should_compute_preferred == kComputePreferred)
    return ComputeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUnit(),
                                                            kComputePreferred);
  // The aforementioned 'constraint equation' used for block-level, non-replaced
  // elements in normal flow:
  // 'margin-left' + 'border-left-width' + 'padding-left' + 'width' +
  // 'padding-right' + 'border-right-width' + 'margin-right' = width of
  // containing block
  LayoutUnit logical_width = ContainingBlockLogicalWidthForContent();

  // This solves above equation for 'width' (== logicalWidth).
  LayoutUnit margin_start =
      MinimumValueForLength(StyleRef().MarginStart(), logical_width);
  LayoutUnit margin_end =
      MinimumValueForLength(StyleRef().MarginEnd(), logical_width);
  logical_width = (logical_width - (margin_start + margin_end +
                                    (Size().Width() - ClientWidth())))
                      .ClampNegativeToZero();
  return ComputeReplacedLogicalWidthRespectingMinMaxWidth(
      logical_width, should_compute_preferred);
}

LayoutUnit LayoutReplaced::ComputeReplacedLogicalWidth(
    ShouldComputePreferred should_compute_preferred) const {
  NOT_DESTROYED();
  if (!StyleRef().LogicalWidth().IsAuto() || StretchInlineSizeIfAuto()) {
    return ComputeReplacedLogicalWidthRespectingMinMaxWidth(
        ComputeReplacedLogicalWidthUsing(kMainOrPreferredSize,
                                         StyleRef().LogicalWidth()),
        should_compute_preferred);
  }

  // 10.3.2 Inline, replaced elements:
  // http://www.w3.org/TR/CSS21/visudet.html#inline-replaced-width
  IntrinsicSizingInfo intrinsic_sizing_info;
  ComputeIntrinsicSizingInfoForReplacedContent(intrinsic_sizing_info);

  gfx::SizeF constrained_size =
      ConstrainIntrinsicSizeToMinMax(intrinsic_sizing_info);

  if (StyleRef().LogicalWidth().IsAuto()) {
    bool computed_height_is_auto =
        StyleRef().LogicalHeight().IsAuto() && !StretchBlockSizeIfAuto();

    // If 'height' and 'width' both have computed values of 'auto' and the
    // element also has an intrinsic width, then that intrinsic width is the
    // used value of 'width'.
    if (computed_height_is_auto && intrinsic_sizing_info.has_width) {
      return ComputeReplacedLogicalWidthRespectingMinMaxWidth(
          LayoutUnit(constrained_size.width()), should_compute_preferred);
    }

    if (!intrinsic_sizing_info.aspect_ratio.IsEmpty()) {
      // If 'height' and 'width' both have computed values of 'auto' and the
      // element has no intrinsic width, but does have an intrinsic height and
      // intrinsic ratio; or if 'width' has a computed value of 'auto', 'height'
      // has some other computed value, and the element does have an intrinsic
      // ratio; then the used value of 'width' is: (used height) * (intrinsic
      // ratio).
      if ((computed_height_is_auto && !intrinsic_sizing_info.has_width &&
           intrinsic_sizing_info.has_height) ||
          !computed_height_is_auto) {
        LayoutUnit estimated_used_width =
            intrinsic_sizing_info.has_width
                ? LayoutUnit(constrained_size.width())
                : ComputeConstrainedLogicalWidth(should_compute_preferred);
        LayoutUnit logical_height =
            ComputeReplacedLogicalHeight(estimated_used_width);
        NGBoxStrut border_padding(BorderStart() + ComputedCSSPaddingStart(),
                                  BorderEnd() + ComputedCSSPaddingEnd(),
                                  BorderBefore() + ComputedCSSPaddingBefore(),
                                  BorderAfter() + ComputedCSSPaddingAfter());
        // Because ComputeReplacedLogicalHeight returns a content size, we need
        // to add border + padding for InlineSizeFromAspectRatio.
        EBoxSizing box_sizing = EBoxSizing::kContentBox;
        logical_height += border_padding.BlockSum();
        if (StyleRef().AspectRatio().GetType() == EAspectRatioType::kRatio)
          box_sizing = StyleRef().BoxSizing();
        double aspect_ratio = intrinsic_sizing_info.aspect_ratio.width() /
                              intrinsic_sizing_info.aspect_ratio.height();
        return ComputeReplacedLogicalWidthRespectingMinMaxWidth(
            InlineSizeFromAspectRatio(border_padding, aspect_ratio, box_sizing,
                                      logical_height) -
                border_padding.InlineSum(),
            should_compute_preferred);
      }

      // If 'height' and 'width' both have computed values of 'auto' and the
      // element has an intrinsic ratio but no intrinsic height or width, then
      // the used value of 'width' is undefined in CSS 2.1. However, it is
      // suggested that, if the containing block's width does not itself depend
      // on the replaced element's width, then the used value of 'width' is
      // calculated from the constraint equation used for block-level,
      // non-replaced elements in normal flow.
      if (computed_height_is_auto && !intrinsic_sizing_info.has_width &&
          !intrinsic_sizing_info.has_height)
        return ComputeConstrainedLogicalWidth(should_compute_preferred);
    }

    // Otherwise, if 'width' has a computed value of 'auto', and the element has
    // an intrinsic width, then that intrinsic width is the used value of
    // 'width'.
    if (intrinsic_sizing_info.has_width) {
      return ComputeReplacedLogicalWidthRespectingMinMaxWidth(
          LayoutUnit(constrained_size.width()), should_compute_preferred);
    }

    // Otherwise, if 'width' has a computed value of 'auto', but none of the
    // conditions above are met, then the used value of 'width' becomes 300px.
    // If 300px is too wide to fit the device, UAs should use the width of the
    // largest rectangle that has a 2:1 ratio and fits the device instead.
    // Note: We fall through and instead return intrinsicLogicalWidth() here -
    // to preserve existing WebKit behavior, which might or might not be
    // correct, or desired.
    // Changing this to return cDefaultWidth, will affect lots of test results.
    // Eg. some tests assume that a blank <img> tag (which implies
    // width/height=auto) has no intrinsic size, which is wrong per CSS 2.1, but
    // matches our behavior since a long time.
  }

  return ComputeReplacedLogicalWidthRespectingMinMaxWidth(
      IntrinsicLogicalWidth(), should_compute_preferred);
}

LayoutUnit LayoutReplaced::ComputeReplacedLogicalHeight(
    LayoutUnit estimated_used_width) const {
  NOT_DESTROYED();
  // 10.5 Content height: the 'height' property:
  // http://www.w3.org/TR/CSS21/visudet.html#propdef-height
  if (HasReplacedLogicalHeight()) {
    return ComputeReplacedLogicalHeightRespectingMinMaxHeight(
        ComputeReplacedLogicalHeightUsing(kMainOrPreferredSize,
                                          StyleRef().LogicalHeight()));
  }

  // 10.6.2 Inline, replaced elements:
  // http://www.w3.org/TR/CSS21/visudet.html#inline-replaced-height
  IntrinsicSizingInfo intrinsic_sizing_info;
  ComputeIntrinsicSizingInfoForReplacedContent(intrinsic_sizing_info);

  gfx::SizeF constrained_size =
      ConstrainIntrinsicSizeToMinMax(intrinsic_sizing_info);

  bool width_is_auto = StyleRef().LogicalWidth().IsAuto();

  // If 'height' and 'width' both have computed values of 'auto' and the element
  // also has an intrinsic height, then that intrinsic height is the used value
  // of 'height'.
  if (width_is_auto && intrinsic_sizing_info.has_height) {
    return ComputeReplacedLogicalHeightRespectingMinMaxHeight(
        LayoutUnit(constrained_size.height()));
  }

  absl::optional<double> aspect_ratio;
  if (!intrinsic_sizing_info.aspect_ratio.IsEmpty()) {
    aspect_ratio = intrinsic_sizing_info.aspect_ratio.height() /
                   intrinsic_sizing_info.aspect_ratio.width();
  } else if (!StyleRef().AspectRatio().IsAuto() &&
             !intrinsic_sizing_info.has_height &&
             intrinsic_sizing_info.has_width) {
    aspect_ratio = StyleRef().AspectRatio().GetRatio().height() /
                   StyleRef().AspectRatio().GetRatio().width();
  }
  // Otherwise, if 'height' has a computed value of 'auto', and the element has
  // an intrinsic ratio then the used value of 'height' is:
  // (used width) / (intrinsic ratio)
  if (aspect_ratio) {
    LayoutUnit used_width =
        estimated_used_width ? estimated_used_width : AvailableLogicalWidth();
    NGBoxStrut border_padding(BorderStart() + ComputedCSSPaddingStart(),
                              BorderEnd() + ComputedCSSPaddingEnd(),
                              BorderBefore() + ComputedCSSPaddingBefore(),
                              BorderAfter() + ComputedCSSPaddingAfter());
    // Because used_size contains a content size, we need
    // to add border + padding for BlockSizeFromAspectRatio.
    EBoxSizing box_sizing = EBoxSizing::kContentBox;
    used_width += border_padding.InlineSum();
    if (StyleRef().AspectRatio().GetType() == EAspectRatioType::kRatio)
      box_sizing = StyleRef().BoxSizing();
    return ComputeReplacedLogicalHeightRespectingMinMaxHeight(
        BlockSizeFromAspectRatio(border_padding, *aspect_ratio, box_sizing,
                                 used_width) -
        border_padding.BlockSum());
  }

  // Otherwise, if 'height' has a computed value of 'auto', and the element has
  // an intrinsic height, then that intrinsic height is the used value of
  // 'height'.
  if (intrinsic_sizing_info.has_height) {
    return ComputeReplacedLogicalHeightRespectingMinMaxHeight(
        LayoutUnit(constrained_size.height()));
  }

  // Otherwise, if 'height' has a computed value of 'auto', but none of the
  // conditions above are met, then the used value of 'height' must be set to
  // the height of the largest rectangle that has a 2:1 ratio, has a height not
  // greater than 150px, and has a width not greater than the device width.
  return ComputeReplacedLogicalHeightRespectingMinMaxHeight(
      IntrinsicLogicalHeight());
}

MinMaxSizes LayoutReplaced::ComputeIntrinsicLogicalWidths() const {
  NOT_DESTROYED();
  MinMaxSizes sizes;
  sizes += BorderAndPaddingLogicalWidth() + IntrinsicLogicalWidth();
  return sizes;
}

MinMaxSizes LayoutReplaced::PreferredLogicalWidths() const {
  NOT_DESTROYED();
  MinMaxSizes sizes;

  // We cannot resolve some logical width here (i.e. percent, fill-available or
  // fit-content) as the available logical width may not be set on our
  // containing block.
  const Length& logical_width = StyleRef().LogicalWidth();
  if (logical_width.IsPercentOrCalc() || logical_width.IsFillAvailable() ||
      logical_width.IsFitContent()) {
    sizes = IntrinsicLogicalWidths();
    sizes -= BorderAndPaddingLogicalWidth();
  } else {
    sizes = ComputeReplacedLogicalWidth(kComputePreferred);
  }

  const ComputedStyle& style_to_use = StyleRef();
  if (style_to_use.LogicalWidth().IsPercentOrCalc() ||
      style_to_use.LogicalMaxWidth().IsPercentOrCalc())
    sizes.min_size = LayoutUnit();

  if (style_to_use.LogicalMinWidth().IsFixed() &&
      style_to_use.LogicalMinWidth().Value() > 0) {
    sizes.Encompass(AdjustContentBoxLogicalWidthForBoxSizing(
        style_to_use.LogicalMinWidth().Value()));
  }

  if (style_to_use.LogicalMaxWidth().IsFixed()) {
    sizes.Constrain(AdjustContentBoxLogicalWidthForBoxSizing(
        style_to_use.LogicalMaxWidth().Value()));
  }

  sizes += BorderAndPaddingLogicalWidth();
  return sizes;
}

static std::pair<LayoutUnit, LayoutUnit> SelectionTopAndBottom(
    const LayoutReplaced& layout_replaced) {
  // TODO(layout-dev): This code is buggy if the replaced element is relative
  // positioned.

  // The fallback answer when we can't find the containing line box of
  // |layout_replaced|.
  const std::pair<LayoutUnit, LayoutUnit> fallback(
      layout_replaced.LogicalTop(), layout_replaced.LogicalBottom());

  if (layout_replaced.IsInline() &&
      layout_replaced.IsInLayoutNGInlineFormattingContext()) {
    // Step 1: Find the line box containing |layout_replaced|.
    NGInlineCursor line_box;
    line_box.MoveTo(layout_replaced);
    if (!line_box)
      return fallback;
    line_box.MoveToContainingLine();
    if (!line_box)
      return fallback;

    // Step 2: Return the logical top and bottom of the line box.
    // TODO(layout-dev): Use selection top & bottom instead of line's, or decide
    // if we still want to distinguish line and selection heights in NG.
    const ComputedStyle& line_style = line_box.Current().Style();
    const auto writing_direction = line_style.GetWritingDirection();
    const WritingModeConverter converter(writing_direction,
                                         line_box.ContainerFragment().Size());
    PhysicalRect physical_rect = line_box.Current().RectInContainerFragment();
    // The caller expects it to be in the "stitched" coordinate space.
    physical_rect.offset +=
        OffsetInStitchedFragments(line_box.ContainerFragment());
    const LogicalRect logical_rect = converter.ToLogical(physical_rect);
    return {logical_rect.offset.block_offset, logical_rect.BlockEndOffset()};
  }

  InlineBox* box = layout_replaced.InlineBoxWrapper();
  RootInlineBox* root_box = box ? &box->Root() : nullptr;
  if (!root_box)
    return fallback;

  return {root_box->SelectionTop(), root_box->SelectionBottom()};
}

PositionWithAffinity LayoutReplaced::PositionForPoint(
    const PhysicalOffset& point) const {
  NOT_DESTROYED();

  auto [top, bottom] = SelectionTopAndBottom(*this);

  LayoutPoint flipped_point_in_container =
      LocationContainer()->FlipForWritingMode(point + PhysicalLocation());
  LayoutUnit block_direction_position = IsHorizontalWritingMode()
                                            ? flipped_point_in_container.Y()
                                            : flipped_point_in_container.X();
  LayoutUnit line_direction_position = IsHorizontalWritingMode()
                                           ? flipped_point_in_container.X()
                                           : flipped_point_in_container.Y();

  if (block_direction_position < top)
    return PositionBeforeThis();  // coordinates are above

  if (block_direction_position >= bottom)
    return PositionBeforeThis();  // coordinates are below

  if (GetNode()) {
    const bool is_at_left_side =
        line_direction_position <= LogicalLeft() + (LogicalWidth() / 2);
    const bool is_at_start = is_at_left_side == IsLtr(ResolvedDirection());
    if (is_at_start)
      return PositionBeforeThis();
    return PositionAfterThis();
  }

  return LayoutBox::PositionForPoint(point);
}

PhysicalRect LayoutReplaced::LocalSelectionVisualRect() const {
  NOT_DESTROYED();
  if (GetSelectionState() == SelectionState::kNone ||
      GetSelectionState() == SelectionState::kContain) {
    return PhysicalRect();
  }

  if (IsInline() && IsInLayoutNGInlineFormattingContext()) {
    PhysicalRect rect;
    NGInlineCursor cursor;
    cursor.MoveTo(*this);
    for (; cursor; cursor.MoveToNextForSameLayoutObject())
      rect.Unite(cursor.CurrentLocalSelectionRectForReplaced());
    return rect;
  }

  if (!InlineBoxWrapper()) {
    // We're a block-level replaced element.  Just return our own dimensions.
    return PhysicalRect(PhysicalOffset(), Size());
  }

  RootInlineBox& root = InlineBoxWrapper()->Root();
  LayoutUnit new_logical_top =
      root.Block().StyleRef().IsFlippedBlocksWritingMode()
          ? InlineBoxWrapper()->LogicalBottom() - root.SelectionBottom()
          : root.SelectionTop() - InlineBoxWrapper()->LogicalTop();
  if (root.Block().StyleRef().IsHorizontalWritingMode()) {
    return PhysicalRect(LayoutUnit(), new_logical_top, Size().Width(),
                        root.SelectionHeight());
  }
  return PhysicalRect(new_logical_top, LayoutUnit(), root.SelectionHeight(),
                      Size().Height());
}

}  // namespace blink

redpajama_set_name: RedPajamaGithub


text:
Two Bradford Teens Suffered Minor Injuries After Car Accident This Morning
Two Bradford teens suffered minor injuries following a one-vehicle accident just after one this morning on Interstate Parkway in Foster Township. A car driven by 17-year-old Shawna Gault, of Bradford, was traveling north on Interstate Parkway, when it failed to negotiate a curve and ended up in a ditch and rolled on it's side. Gault was not injured, but one passenger was taken to the Bradford Regional Medical Center for treatment of injuries. A second passenger was also taken to the hospital after the accident for abdominal pain, police said. Police said Gault was cited for driving too fast for conditions.

redpajama_set_name: RedPajamaCommonCrawl


text:
Artem Chigvintsev Responds To Tyra Banks Dancing With The Stars Exit Rumors
By Sarah Luoma
Dancing With The Stars Artem Chigvintsev has addressed rumors that host Tyra Banks may be exiting the long running ABC dance series. While attending the Space at Neon Carnival hosted by DIRECTV on April 16, Chigvintsev shared with US Weekly that he is unsure about whether Tyra Banks will continue on with the ABC show. Chigvintsev went on to add that he was informed that the show would make its move to Disney+.
"As far as the show goes, the only information we received of it is we are going to be on a different platform, but as far as like, who's going to be part of it and even ourselves as dancers, I'm not sure," Chigvintsev shared.
The Masked Singer Fans React To 'Bad To The Bone' Rudy
Dancing With The Stars – News About The Upcoming Season Will Be Revealed Sometime This Summer
The 39-year-old Dancing With The Stars professional went on to reassure fans that more information about the changes involving show will be revealed in the near future as Dancing With The Stars makes its move from ABC to Disney+. Chigvintsev commented that he and his peers aren't always the first to learn about changes as well.
"I feel like there's a lot of time ahead of us right now. So, we haven't got any information on that," he added. "We're definitely not the first people to find out what's going on."
Dancing With The Stars – Tyra Banks Has Yet To Be Confirmed As Host
Whether or not Tyra Banks will return as host has come into question since the show has yet to confirm her return for the upcoming season. Banks first joined the show in 2020. Since joining the show, there has been several sources that have shared Tyra Banks' diva ways.
Who Is The Real American Idol Front-Runner, HunterGirl? https://t.co/ifrUK3bCFY pic.twitter.com/UU2VVFYXdK
— SOS/CTS/HH (@SoapOperaSpy) April 22, 2022
Brooke Burke made comments earlier this month about Banks' attitude on the set, calling the former supermodel a diva. Burke made the comments while speaking on the Behind the Velvet Rope podcast.
"There's nothing wrong with that, and I'm not saying anything bad about her. Be a diva," Burke stated. It's [just] not the place to be a diva. Your pros are the diva[s], your winners, your perfect 10 score dancer who's never done it — that defines diva in the ballroom."
Banks isn't the only cast member in limbo as judges Carrie Ann Inaba, Len Goodman, Derek Hough and Bruno Tonioli have yet to be confirmed for a return to season 31.
Sarah Luoma6 posts 0 comments
Sarah has a degree in Communication Arts and has worked as a writer and producer for TV. As a freelance writer, Abi enjoys writing about celebrity and entertainment news. In her spare time, she loves cooking, baking, and playing with her three rescued cats.
Dancing With The Stars: Sharna Burgess Shares Beautiful Words About Zane
DWTS Fans React To Derek Hough & Haley's Terrifying Car Accident
Why Are Dancing With The Stars Fans Upset About Daniel Durant's Elimination?
Did Dancing With The Stars Host Tyra Act Inappropriately With Trevor?


text:
SportFootballSheffield WednesdayLatest Owls News
The key Championship play-off dates Sheffield Wednesday want to add to their diary
The EFL has confirmed dates for this season's Championship playoffs - which Sheffield Wednesday will be hoping to add to their diary.
By jordan.cronin1
Monday, 15 April, 2019, 15:53
EFL Championship playoffs
While the Owls' play-off hopes have taken a blow in recent weeks with defeat against Aston Villa and Leeds United, there is still an outside chance.
With four games left to play, Steve Bruce's side are six points off the top six with rivals Bristol City still left to play.
The semi-finals of the play-offs will be held across three dates in May - just a week after the regular Championship season finishes.
These are the key dates for the Championship play-off semi-finals:
Championship A 1st Leg: Saturday May 11 (kick-off 12.30pm)
Championship B 1st Leg: Saturday May 11 (kick-off 5.15pm)
Sign up to our Sheffield Wednesday newsletter
Championship A 2nd Leg: Tuesday May 14 (kick-off 7.45pm)
Championship B 2nd Leg: Wednesday May 15 (kick-off 7.45pm)
The selection for which fixtures are A and B will be made once the Championship season is completed.
The play-off semi final matches will see the side finishing in 3rd face those who finish 6th, while 4th position will take on 5th.
The higher ranked side play at home in the second leg and, as ever, all ties will be broadcast on Sky Sports.
The Championship play-off final will then be held on Monday, May 27 (3pm kick-off).


text:
ETHIOPIA TO EXECUTE ANDY TSEGE AFTER WAS ABDUCTED IN YEMEN, AND BRITAIN IN A STATE OF ANGER[DIPLOMAT.SO]
BY TAJUDIN
London ( DIPLOMAT.SO) – The family of a north London man who is facing the death penalty in Ethiopia has said the government should be doing more to help get him home.
Andy Tsege, from Islington, who opposes the Ethiopian authorities, was seized in June and has been in solitary confinement ever since, his family says.
The UK Foreign Office says he is not being held "illegally".
The international community expressed feelings of deep frustration because of the deterioration of human rights situation and freedom of expression in Ethiopia.
The Prime Minister has personally intervened in the case of a British father-of-three facing the death sentence in Ethiopia, after the man's children appealed for his help.
David Cameron wrote to the Ethiopian Prime Minister in a bid to save the life of Andargachew "Andy" Tsege, 59, whose plight was revealed by The Independent Newspaper .His actions were in response to what he described as "very touching messages" from Mr Tsege's children, who are calling for the Prime Minister to help get their father home.
Mr Tsege, who came to Britain as a political refugee in 1979, was arrested at an airport in Yemen in June and promptly vanished. Two weeks later it emerged he had been sent to Ethiopia, where he has been imprisoned ever since. The Briton, a prominent opponent of the Ethiopian regime, is facing a death sentence imposed five years ago at a trial held in his absence.
Britain axes aid to Ethiopian police amid human rights outcry
Britain has suspended most of a £27 million aid programme to support Ethiopia's police force, The Telegraph has learnt, amid mounting allegations of torture, rape and murder by the regime.
Ministers pulled the plug on a scheme intended to improve criminal investigations, help Ethiopian police "interact with communities on local safety" and help women access the justice system.
The cancellation coincides with an Amnesty International report that documents how the Ethiopian security forces have conducted a campaign of torture, mutilation, rape and murder in order to suppress political opposition.
Britain has given £1 billion in aid, including around £70 million for "governance and security" projects, to the country over three years. Critics of the ruling regime have disappeared, and Amnesty International found allegations of men being blinded and women being gang raped and burnt with hot coals by regime officials.
There are mounting fears for the safety of Andy Tsege, a British national and critic of the regime, who was abducted in Yemen before being tortured and sentenced to death.
Filed in: Current Affairs / News
Tags: breaking


text:
"Five years ago my son said 'I can't breathe' 11 times, and today I can't breathe," Gwen Carr said during an emotional press conference.
Iranian Elections
High Turnout Aids Ahmadenijad's Challenger
Have the Iranian people given Mahmoud Ahmadinejad the boot? Unclear—it's still too close to call—but the high turnout in Friday's election is expected to aid his moderate challenger, Mir Hossein Mousavi. Turnout was, according to observers, the highest in almost three decades, and voting was extended by an hour to accommodate all the voters. Mousavi's aides, meanwhile, were predicting that he would win more than half the vote according to polls and would therefore avoid the need for a runoff. Ahmadinejad's adviser replied by saying, "This is a psychological war they launched to influence voting." The results will not be released until tomorrow, but many of Mousavi's supporters are saying the only way Ahmadinejad could hold on to power is by fixing the vote.
Read it at Times of London


text:
All Souls Rocks On New Track, "Never Know"
by Shawn Loeffler
Los Angeles-based rockers, All Souls, absolutely rock on their newly released track, "Never Know." While it wouldn't sound completely out of place on the '80s pop scene, the track is everything you want in a modern rock song. From the opening crash and riff the song builds and builds, keeping a synth-pop sensibility without the synth, leaving you wanting more and curious for what's next. Everything is tight and crisp leading into the guitar solo, which jumps at you with a '70s vibe before a groovy bass line cuts it off and the song meanders about on the way out.
"Never Know" is a hot track and it can be heard here.
All Souls features former members of Totimoshi (Meg Castellanos and Tony Aguilar) and The Desert Sessions (Tony Tornay). Their self-titled debut album will be released on February 9th.
"We had been wanting to be in another rock band," explains Aguilar. "All Souls also reunited us with Toshi Kasai who produced three of our Totimoshi records. He has his own approach. It's almost like you enter into a different world with his production. Each song becomes like a journey, and nobody curtailed that. We were all on the same page."
All Souls was recorded at Sounds of Sirens Studio. Tool drummer Danny Carey guests on "Sadist/Servant."
All Souls Tracklist:
Party Night
Never Know
Rename The Room
The Ghost is Flying Home
Sadist/Servant
All Souls is: Tony Aguilar (Totimoshi), Meg Castellanos (Totimoshi), Tony Tornay (The Desert Sessions, Fatso Jetson) and Erik Trammel (Black Elk).
Rock Hard \m/
Related Items: All SoulsAlternative RockHard Rock
Alborn Release "Full Circle" Video
Blacklist Union Honor Late Guitarist With Free Album Do ...
In Search Of Sun Release "In The Garden" Video


text:
Q: Unable to make client server Bluetooth serial connection between Android phone and PC According to my research it is most probably due to wrong UUID or because my PC doesn't support SPP.
My SG4 is used as a Server while PC is used as a client.
When I use standard serial UUID my android code never executes after .connect().
I thought I have fixed it by doing: mmDevice.getUuids() and then by using one of those UUIDs. And yes, it has executed the further code then. However, later I found out that it didn't set up serial connection but some different one.
CODE:
 // ParcelUuid[] list = mmDevice.getUuids();
 // UUID uuid = UUID.fromString(list[0].toString());
 UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID
 mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
 mmSocket.connect();
 mmOutputStream = mmSocket.getOutputStream();

That array list has contained these UUIDs:
00001105-0000-1000-8000-00805f9b34fb
00001106-0000-1000-8000-00805f9b34fb
0000111b-0000-1000-8000-00805f9b34fb
00001115-0000-1000-8000-00805f9b34fb

Does that mean that my PC doesn't support serial connection or what? I am using windows 8.

A: The SPP profile that supports serial connection is not related with your Operative System but with the Bluetooth module installed in your PC.
Knowing that your system is Windows 8, I guess your PC is relative new so surely comes with the new Bluetooth modules that doesn't support SPP.
You can still use an external Bluetooth USB dongle that comes with SPP profile like the asus bluetooth bt 211.

A: PCs and Android devices do not usually advertise an SPP service profile until it has been properly established previously, either with a paired remote device, or with a local application. This makes sense, because the PC or Android has no idea what to do when an unknown stream of data starts coming in wirelessly.
After a PC pairs with a SPP device, is typically assigns a virtual COM port. Sometimes, the SPP service is not enabled, until the COM port has been opened.
An Android device needs an App to open an SPP service, and register the listener.

redpajama_set_name: RedPajamaStackExchange


The tale of the Inner Harbour Bridge is a lot longer than the bridge itself. And it is not the most favorable tale from Danish building industry. After about 3½ years of delay it was completed in 2016. But then it was a great success straight away counting as many as 15.000 bicyclists a day!
This is a success that I'm not in any way disputing. I'm an excited user of the connection to the less busy side of the harbour. Another quality is the new, great view, that thousands of Copenhageners is now enjoying every day. Throughout a season hundreds of thousands of tourist does the same. On the move and in small spaces, 'pockets', in both sides, where you can stop and take your time to enjoy the famous beauty of Copenhagen.
BUT: from an architectural and aesthetical perspective I'm less than impressed. Even less in the light of the fine tradition for slim elegance in bridges in Denmark. Both in a small scale such as this, and in greater scale in numerous bridge construction between the Danish islands.
UPDATE: I stumpled upon some confirmation on this view in a short notice on danish.tm.
From all other places the view has impaired because of the voluminous and – honestly – quite bulky construction. An obvious attempt was made to 'design' the bridge with sloping lines and curvy forms. It seems overstrained and actually only emphasizes the bulkyness. Furthermore the long perspectives through the inner harbour is obstructed from most piers in the area.
The bridge is designed by London based Cesary Bednarskys firm, Studio Bednarski Ltd.


Between filling up boxes with your belongings and equipping your new place with entertainment services, moving can be exhausting. Movearoo can lend a hand with advice on the best deals on home services from the top Westlake TV and Internet providers. Plus, you'll get helpful resources like moving guides and checklists. By choosing Movearoo, you can save yourself time, money, and excess stress during your move.
Stream classic movies like The Usual Suspects and recent blockbusters—whenever you want!
Relocating to a different city is an exciting prospect, but it can also be quite challenging. Regardless of where you're moving, it's helpful to learn as much as possible about the city's safety, crime rate, jobs market, economy, and more.


text:
@class ReaderThumbsView;

@protocol ReaderThumbsViewDelegate <NSObject, UIScrollViewDelegate>

@required // Delegate protocols

- (NSUInteger)numberOfThumbsInThumbsView:(ReaderThumbsView *)thumbsView;

- (id)thumbsView:(ReaderThumbsView *)thumbsView thumbCellWithFrame:(CGRect)frame;

- (void)thumbsView:(ReaderThumbsView *)thumbsView updateThumbCell:(id)thumbCell forIndex:(NSInteger)index;

- (void)thumbsView:(ReaderThumbsView *)thumbsView didSelectThumbWithIndex:(NSInteger)index;

@optional // Delegate protocols

- (void)thumbsView:(ReaderThumbsView *)thumbsView refreshThumbCell:(id)thumbCell forIndex:(NSInteger)index;

- (void)thumbsView:(ReaderThumbsView *)thumbsView didPressThumbWithIndex:(NSInteger)index;

@end

@interface ReaderThumbsView : UIScrollView <UIScrollViewDelegate, UIGestureRecognizerDelegate>
{
@private // Instance variables

	CGPoint lastContentOffset;

	ReaderThumbView *touchedCell;

	NSMutableArray *thumbCellsQueue;

	NSMutableArray *thumbCellsVisible;

	NSInteger _thumbsX, _thumbsY, _thumbX;

	CGSize _thumbSize, _lastViewSize;

	NSUInteger _thumbCount;

	BOOL canUpdate;
}

@property (nonatomic, assign, readwrite) id <ReaderThumbsViewDelegate> delegate;

- (void)setThumbSize:(CGSize)thumbSize;

- (void)reloadThumbsCenterOnIndex:(NSInteger)index;

- (void)reloadThumbsContentOffset:(CGPoint)newContentOffset;

- (void)refreshThumbWithIndex:(NSInteger)index;

- (void)refreshVisibleThumbs;

- (CGPoint)insetContentOffset;

@end


text:
Robbers Attack Bank In Ondo, Kill One Person
According to an eyewitness, the bandits numbering nine stormed the bank at about 4:10pm, carting away an undisclosed amount of money from the bank.
by SaharaReporters, New York Nov 26, 2020
Armed robbers on Thursday attacked a bank at Ode Irele under Irele Local Government Area of Ondo State, killing one person in the process.
The witness said the robbers gained entry into the bank after using explosives to destroy the security door.
"The robbers started shooting sporadically to scare people away and to ease their escape after robbing the bank.
"While they were shooting, stray bullets hit one person and he died while others were injured," he said.
Tee-Leo Ikoro, spokesperson for the Ondo State Police Command, confirmed the incident to SaharaReporters on Thursday.
CRIME Suspected Yahoo Boy Arrested With Girlfriend's Corpse In Delta


Scaner (sic). printed image objects and light.
Like an absorption of the world inside the window. During the exhibition period, Scaner functions as a work in progress.
with a sort of ethereal creature of the forest. Instructions were sent by mail.
Scaner (sic). Ploteado sobre adhesivo calado, objetos y luz.
Proyecto realizado para Have a window, curado por Miguel Mitlag y Carla Bertone. Torino, Italia.


The FAFSA is available online⤷. The new FAFSA opens each year on October 1.
UF's on time deadline for receiving your FAFSA is December 15 each year. Apply well before the deadline to ensure that the federal processor has time to analyze and send the results of your FAFSA to UF. We recommend that all DMD students plan to complete their FAFSAs no later than Dec. 8 each year.
Be sure to electronically sign your FAFSA at the end of the application. You will use your FSA ID for this.
Your FAFSA information will not be sent to UF unless your FAFSA has been signed!
You must complete a new FAFSA for every academic year in which you will be enrolled. The FAFSA retains some of your information from year to year, so it is quicker to complete a renewal FAFSA than a brand new one. Always be sure to update your personal, financial, and tax information appropriately. Utilize the FAFSA help tips (displayed on the right-hand side of the page) to assist you with inputting your information accurately.
You should keep the confirmation page for your records.
You will receive your SAR (Student Aid Report) after the Central Processing System finishes processing your FAFSA information. If you provided an email address, you may receive your SAR as soon as 24 hours after your FAFSA is processed.
What Information Is Listed on the SAR?
Please review your SAR carefully! If you see any mistakes on the SAR, go to FAFSA on the Web⤷, log in, and click on "Make a Correction". You'll then be able to navigate to the different areas of the FAFSA and can correct any mistakes. Please be sure to sign the FAFSA again when you're done.
Your financial aid will not disburse until verification is complete!
The online scholarship application is available in the spring each year. All current and entering DMD students will be notified via email when the application is available. Complete applications, including all requested documentation, must be received by the deadline listed on the application. Please review the Scholarship FAQ page for additional information. Questions not addressed here nor in the FAQ may be sent to the UFCD Financial Aid Coordinator⤷.
The above information is for individuals currently in or starting on the DMD Program.


Modular design of comfy sectional sofas available with our models. Perfect blend of our quality at an incredible selection of contemporary and comfort. What is small leather sectional sofas, can be arranged in giovanni santambrogio opened his small spaces small sectionals. Buy from a more recliners which give a couch is broken into different seating segments that will fit just perfectly anywhere in a square foot living room check out these modern furniture combines a range of our selection of comfy sectional sofas and flow of furniture. With the logo. The industrys best selling leather sofa is an. Come with.
Items addresses free 2day shipping speed items sold by that are marked eligible on your living spaces furniture heavyduty contract furniture with this sectional sofas then you. Upholstered in brompton cocoa. How much small leather sectional sofas, your target redcard. At target redcard. Find the big decisions when considering living spaces furniture with a matching ottoman upholstered in oak hardwood firm for leather sectional sofas and back support is our many different colors configurations and checkout page with its. Improvement. Save every day with the logo. Free shipping on purchases over and checkout page with your living room seating.
Our master upholsterers in a small scale living the sectional with gorgeous apartmentsize furniture. Look luxe leathermatch upholstery in your home the best italian furniture leather grades. Small leather sectional sofas sale, sofas. 3piece leather fabric for sofas for sofas sectionals. Sleepers. Champions a plush linenlike fabric for rooms dcor and best s on sectionals find great deals for the classics this is the italian sofas available in your home. Of modern and shapes to match any living room in different colors configurations and couches are the italian furniture offers superb quality sofa sectionals find both black leather sofa.


text:
Ode to the Stones / We are glad you're who we thought you were
Richard Rapaport
Rolling Stones guitarist Keith Richards (L) performs "It's Only Rock and Roll" accompanied by band mates Mick Jagger (R) and guitarist Ron Wood during the band's "A Bigger Bang World Tour" at the Hollywood Bowl in Hollywood November 6, 2005. REUTERS/Robert Galbraith 0ROBERT GALBRAITH
Memo to Mick, Keith, Charlie and Ron:
It's been a "Long, Long While" since "The Last Time" the Stones came to "Paint It Black" in San Francisco, so here's "Congratulations" on the band's return to our "Streets of Love."
Just a pre-concert note: "We Love You" boys, and all is forgiven for the "Sad Day" last summer when it sounded like you were singing a "Sweet Neo Con" song for real.
"What a Shame." Many of us who really "Miss You" were "Shattered" by the late August news that Gov. Schwarzenegger was going to "Spend the Night Together" with the band at your opening in Boston. On that day of "Infamy," Arnold dragged the "Wild Horses" of conservatism to your concert. The big-bucks right-wing came to Fenway Park to pony up beaucoup "Brown Sugar" because the governor told them that California liberalism was "Slipping Away" and wanted to encourage its demise. Even while people asked "Who's Driving Your Plane?" Arnold made "Like a Rolling Stone" winging his way to Boston to do "The Worst."
When you "Start Me Up" at SBC Park tonight, we want the band to know that it's "Off the Hook" because of the "Satisfaction" in the "Rough Justice" dealt out in last week's election. Libs are celebrating tonight because Arnold and friends made "The Biggest Mistake," ending the campaign last week out of luck and "Out of Time." History will show that -- this time, anyway -- conservatives did "Play With Fire" and got burned while California liberals can exult over an election day that truly was a "Ruby Tuesday."
Back at the beginning of this campaign, we Democrats were "Street Fighting Man"-mad about how "Happy" these right-wing rollers were to be "Mothers Little Helpers" by forking over the $100,000 per seat Arnold was soliciting to share his box at your concert. We worried that if, "Undercover of the Night," Arnold could scalp enough of your tickets, this election could really be "The Last Time" for Californians being buried under Republican bouquets of "Dead Flowers" paid for by your music. The worst part about this "Sweethearts Together" deal was that the money paid for campaign initiatives that were going to put California between a "Rock and a Hard Place."
Some Stones fans dismissed the whole election connection as "Only Rock 'n' Roll." Many others, however, subscribed to the theory that if we "Don't Stop" them now, the hard right would "Not Fade Away," but instead simply "Go Wild." Worst of all, we worried that you boys might be showing a little too much "Sympathy for the Devil" you knew. It started to seem that before California liberals could say "Jumpin' Jack Flash," it would be "All Over Now."
Now, however, we happily admit we were overly pessimistic. "Surprise, Surprise": In last week's election, Californians simply refused to ignore the "Tumbling Dice" politics first evidenced by Arnold's mega-scalping of your ticket. We can happily report that on Tuesday, voters had seriously "Mixed Emotions" about Schwarzenegger's "Let It Bleed" political agenda and the "Under My Thumb" initiatives designed to reduce Californians to "Beast of Burden" status.
Tonight at SBC Park, "It Won't Take Long" for us to get celebratory, and joyously admit that we were "Fool To Cry" foul at our governor's "The Spider and the Fly" tactics. In fact, why not just declare a moratorium on politics tonight, unless that really is the governor sitting in the owner's box at SBC having his "19th Nervous Breakdown" and wondering why it is "You Can't Always Get What You Want."
If Arnold is the "Good Times, Bad Times" fan, as he says, he'll be there. Much more likely, the guv will be at home with Maria, begging her, "As Tears Go By," please, "Gimme Shelter."


text:
Q: Can't access local network resources from a specific access point I've got two wireless routers in my home; one came with my internet service and is also the modem for the service. I also have another setup for extra range. I've connected the second (a d-link wireless-n) via a cat5 wire attached directly to the other modem using one of the switch ports (not the WAN port), and set it up so that its ip is on the same subnet as the first: My main router is 192.168.2.1, and the second is 192.168.2.2. I also made sure to disable the DHCP server and other services that it provides.
I can connect to the internet via any of the two devices without issue, but some of my internal services like my calibre ebook server and other servers on my PC can only be accessed  via my phone when I am connected to one of the routers... And this is the strange part: The router that my PC is wired into is not the router that I'm connected to via wifi. The wifi connection via the router that my PC is hooked to does not give me access to my server. I can't even ping it by IP using an app on my phone; I have the following message:
From 192.168.2.12 to 192.168.2.254: Destination Host Unreachable. Through my other router (again, not the one my PC is connected to), I can't get a ping response, but at least it just times out.
I've got only one subnet (192.168.2.0/24) and only one DHCP server, so it shouldn't be a matter of routing. I have absolutely no idea where to look?


text:
Flamenco History, Styles, Dancers and Musicians
The History of Flamenco
The history of Flamenco is a bit sketchy for the simple fact that much of its past has been documented through oral tradition. Actually, up until about the last 200 years, there was little to no written history of Flamenco. It is known, however, that it originated in the Andalusia area. Also, between the VIII and XV centuries, it is well documented that Spain was under Arab rule. During those centuries, the original concepts of Flamenco music and dance were altered by both the Jewish, Christian and gypsy traditions.
Later, Flamenco schools were founded, which led to the dance form's solidification as an authentic ballroom dance. It was during these hundred years that composers began to introduce more to the traditional vocals and clapping of Flamenco with the well-known Flamenco guitar. This pivotal time between 1765 and 1860 led to Flamenco's Golden Age, which arrived around the year 1869 in music cafes. It was in these cafes that Flamenco took on a life of its own. Audiences were enthralled not only with the guitarists but also with the dancers who portrayed the music's deep meaning so well.
Variations of Flamenco
There are more than 50 variations of Flamenco, but all are recognizable through a single common denominator. Flamenco portrays an unrivaled level of passion and fire. Each of the Flamenco styles adheres to the patterns of Flamenco music, but there is also a great deal of spontaneous improvisation within each performance. Most laymen recognize Flamenco through its use of rhythmic foot stamping and expressive arms.
Different Flamenco Styles
There are several different Flamenco styles, but three of the most well-known are Classical Flamenco, Flamenco Puro and Modern Flamenco.
Classical Flamenco: This particular style holds true to the Seguidilla, maintaining a very upright carriage. Classical Flamenco is the most popular style amongst Spanish dance troupes.
Flamenco Puro: This style follows the Gitano tradition. This is a solo dance which is completely improvised by the dancer.
Modern Flamenco: This technique is quite complicated and often takes many years to perfect. It is a highly technical dance style which can include props in addition to its highly difficult footwork.
Renowned Dancers: Antonio and Rosario
One of the most renowned Flamenco couples of all time is Antonio and Rosario. For over two decades, these two cousins partnered each other and became world famous. In 1953, both opened separate schools of dance. Antonio Ruiz Soler, more popularly known as Antonio el bailarin, went on to choreograph classical and Spanish pieces. Some of these were performed by his own company, Antonio and the Ballets de Madrid, and some were taken on by other companies altogether.
Camaron de la Isla: A Flamenco Musician of Worth
Although there are countless Flamenco musicians, many of which are notable, one of the most recognized is Camaron de la Isla. Although he released numerous Flamenco albums before he died in the early 1990's, he likely made the most waves with La Leyenda del Tiempo.
Flamenco dance is known for its passion and rhythmic foot stamps. There are more than 50 different styles of Flamenco, but it is a firm Spanish stronghold in the ballroom dance tradition. Throughout the centuries, this fiery dance style has not only evolved with the times but has thrived.
Read Next The A to Z's of Flamenco Dance: M is for Mirror It's Flamenco, not Flamingo! See More Stories


Be alerted when Mytek - Manhattan II Network Card HiFi (Roon Ready) is back in stock.
A notification will be sent to when the Mytek - Manhattan II Network Card HiFi (Roon Ready) is back in stock.
Turn your Mytek Manhattan II into a stupendous network streamer with the easily installable Network Card. Once inserted, this add-on gives Manhattan II streaming capability up to 24-bit/192kHz and DSD64. Compatible with Roon, Apple AirPlay, DLNA/UpnA, Spotify Connect, iOS, and Android, this is no small upgrade!


Birkenstraße 6 Haus II Whg.2 - [#73368] is located in Zingst and offers a terrace. Guests staying at this apartment can use the free WiFi and a fully equipped kitchenette. The apartment also features a bathroom. Stralsund is 28 miles from the apartment. The nearest airport is Rostock-Laage Airport, 58 miles from the property.


text:
Anthony Byrt
Creation Myth
IN THE DARK ROOM at the start of "Toi Tū Toi Ora: Contemporary Māori Art" at Auckland Art Gallery Toi o Tāmaki, Robert Jahnke's Whenua Kore, 2019, glows. The piece consists of a ring of white neon, which, through a trick of mirrored glass, seems to endlessly repeat and retreat deep into the wall on which it hangs, like a tunnel. Move in front of it, and the tunnel seems to bend. Two things are caught in its black reflection: on the opposite wall, Reuben Paterson's kaleidoscopic digital animation Te Pūtahitanga ō Rehua (The Constellation of Rehua), 2005, and, floating somewhere between
print May/June 2020
22nd Biennale of Sydney
Curated By Brook Andrew
ON SEPTEMBER 12, 2019—a lifetime ago—Biennale of Sydney artistic director Brook Andrew announced his curatorial framework for the event's twenty-second edition: "The urgent states of our contemporary lives are laden with unresolved past anxieties and hidden layers of the supernatural. 'NIRIN'"—the title means "edge" in the language of the Wiradjuri people, from whom Andrew descends—"is about to expose this, demonstrating that artists and creatives have the power to resolve, heal, dismember, and imagine futures of transformation for resetting the world."
What no one could
print April 2020
Zac Langdon-Pole
In 2018, the Berlin-based New Zealander Zac Langdon-Pole won the BMW Art Journey prize at Art Basel Hong Kong, an award he used to fund a trip from Europe to his homeland, via several stops in the Pacific, including Hawaii, the Marshall Islands, and Samoa. His recent exhibition "Interbeing" was (along with a new book about his practice) a culmination of his journey across the world. The trip's course was determined by two overarching navigational frameworks: first, the history of celestial navigation by Pacific peoples and later colonizers; and second, the migratory patterns of two birds, the
print December 2019
In a catalogue text for Patrick Lundberg's 2015 exhibition "Draft Copy," fellow New Zealand artist Roman Mitch quotes Peter Sloterdijk's 2006 book, Rage and Time: A Psychopolitical Investigation. "Vengeful acts of expression mean nothing more than a narcissistic expenditure of energy," the philosopher says. "The professional revolutionary, who is working as an employee of a bank of rage, does not express individual tensions; he follows a plan." Given the distinct lack of obvious rage in Lundberg's quiet, provisional painting practice, Mitch's surprisingly apt quotation points to what makes it
GAMING THE SYSTEM
IN 2018, scholars Kate Crawford and Vladan Joler published "Anatomy of an AI System: The Amazon Echo as an Anatomical Map of Human Labor, Data and Planetary Resources," a revelatory essay, rich with schematic illustrations, that unpacks the extractive processes underpinning "Alexa"—the cheerful, feminine, computer-generated persona that anthropomorphizes Amazon's home-surveillance algorithms—and the slick speaker device that has enabled her to slip, elegantly, into our lives. "The scale of this system is almost beyond human imagining," they write. "How can we begin to see it, to grasp its
previews May 2019
"SIMON DENNY: MINE"
Curated by Jarrod Rawlins and Emma Pike
For his solo exhibition "Mine," Simon Denny will link two forms of extraction that shape our era of "surveillance capitalism": the environmentally devastating removal of raw materials and rare-earth elements to meet the demands of technology, and the pervasive harvesting of our personal data to fatten the coffers of tech giants like Google and Facebook. Drawing on the work of scholars Kate Crawford and Vladan Joler, Denny will build full-scale replicas of artificially intelligent mining machines; adapt an insidious Amazon patent for a warehouse worker's
Marie Shannon
There is nothing unique or original in the idea that our families, and the spaces we share with them, turn us into who we are. And yet contemporary writers from Karl Ove Knausgaard to Maggie Nelson have highlighted that, within this ubiquitous truth, mysteries and revelations can still lurk. The New Zealand artist Marie Shannon has been making similar self-exposures and confessions, with a literary bent, for more than thirty years. Organized by Dunedin Public Art Gallery in New Zealand and subsequently shown in Wellington and Christchurch, the survey "Rooms found only in the home" showed how
interviews Summer 2018
MICHAEL PAREKŌWHAI
FOR EXACTLY TWO DECADES, New Zealand's national museum, Te Papa Tongarewa, has tried to map the country's vexed bicultural history—a history that began with the first contact between Māori and Europeans and continues, to this day, in the complex relationships between Māori and Pākehā (New Zealanders of European descent). To accomplish this task, Te Papa followed a distinctly 1990s logic, doing away with the separation between the national museum and the national art collection, and—under the shamelessly hopeful slogan "Our Place"—combining the two institutions in one grand,
previews January 2018
"Lisa Reihana: Cinemania"
The exhibition for New Zealand's pavilion at the 2017 Venice Biennale, "Lisa Reihana: Emissaries," consisted almost entirely of the artist's massive video projection in Pursuit of Venus [infected], 2015–17, which reimagines Jean-Gabriel Charvet's early-nineteenth-century scenic wallpaper Les Sauvages de la Mer Pacifique. Reihana's digital panorama attempts to subvert the original wallpaper's arcadian portrayal of James Cook's voyages, deploying performers who act out the real-life events and traumas of early contact between British and Pacific peoples. This show—which
performance November 2017
CURVE BALL
AUCKLAND, NEW ZEALAND'S largest city, has long instrumentalized Pacific people as a way to demonstrate its cosmopolitanism and diversity. It trades heavily on its status as one of the world's biggest Polynesian metropolises (boasting a Pacific population of some two hundred thousand, almost 15 percent of Auckland's total inhabitants); the city's self-promotional efforts routinely foreground Pacific culture, artists, and, most of all, sportspeople—billboards advertising local rugby matches and underwear alike feature muscular brown men as a kind of shorthand for erotically charged athleticism.
print October 2017
IN 2002, Amsterdam's Stedelijk Museum presented a survey of the late New Zealand artist Colin McCahon. Called "A Question of Faith," it was staged in the belief, held by the Stedelijk's then director, Rudi Fuchs, that McCahon was one of the great artists of the mid-twentieth century. Though Fuchs's enthusiasms never went viral in the way the exhibition's organizers had hoped, there have been occasional international champions of the artist since then—most notably Thomas Crow, who has recently placed McCahon's work, alongside that of Sister Corita Kent, Robert Smithson, James Turrell, and
Gottfried Lindauer
Between the 1870s and early 1900s, the Czech émigré Gottfried Lindauer crisscrossed New Zealand, hawking his skills as a portraitist. His paintings were competent, if unspectacular: realist likenesses very often made by working from (and sometimes over) photographs. His portraits of the Māori, particularly those wearing moko (traditional tattoos), are, however, major documents of New Zealand's colonial history. Many of them traveled to Berlin's Alte Nationalgalerie and the Gallery of West Bohemia in Pilsen, Czech Republic, (Lindauer's birthplace) in 2014–15, after the Nationalgalerie's director,


text:
LOLC Group posts Rs. 57Bn in Profit Before Tax (PBT)
First-ever historic profitability in SL's corporate sector
Sri Lanka's most valuable and globally diversified financial conglomerate, the LOLC Group, posted a record-breaking performance for the financial year ending March 31, 2021, achieving unprecedented bottom line results of Rs. 57Bn in Profit Before Tax (PBT), and a Profit After Tax (PAT) of Rs. 53Bn – a first for any corporate in the country.
By achieving profits on this significant scale, the Group once again consolidated its position as the top most profitable diversified corporate in the country, three years in a row – establishing LOLC as one of the largest Micro and Small & Medium Enterprises (MSME) platforms in the world.
This stunning performance by LOLC resulted in Rs. 28Bn being recorded as Profits Attributable to the Equity Holders of the Parent company. The Group results denote an impressive Earnings Per Share of Rs. 59.01 compared with Rs. 22.93 recorded in the previous year.
Whereas, the total comprehensive income was Rs. 81Bn out of which Rs. 37Bn is attributable to the Equity Holders of the Parent company. Furthermore, the total attributable comprehensive income per share was Rs. 77.84. The resultant Net Assets Value per Share as at the year-end was Rs. 286.23 compared to Rs. 194.72 reported last year, demonstrates the exceptional value creation by the Group during the concluded financial year.
The story of LOLC's rise into an elite blue-chip within a span of 40 years is nothing short of awe-inspiring, surpassing competitors who have been in existence for over a century. A pioneering leasing company established in 1980, in collaboration with ORIX Corporation of Japan and International Finance Corporation (IFC), LOLC, revolutionized the future of MSMEs in Sri Lanka and rose in stature as Sri Lanka's largest Non-Banking Financial Institution (NBFI).
Having established a high performance microfinance business model, LOLC rapidly exported its expertise to global markets such as Cambodia, Myanmar, Indonesia, Philippines, and Pakistan in Asia; as well as Zambia and Nigeria in East and West Africa, bringing prosperity to people at the bottom of the pyramid. In addition, the Group has established its footprint in the Maldives and Sierra Leone in the arena of Non-Financial Services.
In Sri Lanka, the LOLC Group diversified into agriculture and plantations, leisure, renewable energy, construction, manufacturing and trading, information services, as well as research and innovation over and above its flagship financial services. All of these businesses recorded an upward trend in profitability in 2020/21, despite the adverse effects of COVID-19 being felt by Sri Lanka's economy through 2020, coupled with weak GDP growth in the preceding year.
Despite the global economic downturn experienced during the period, a strong pipeline of multilateral and bilateral funding has been available to LOLC and its operating companies both locally and globally – a testimonial to the confidence these institutions have placed in the LOLC Group due to its strong and unblemished track record and the potential for growth even during turbulent times.
LOLC's financial services have brought about life-changing financial inclusion in MSMEs in Sri Lanka, empowering frequently marginalized communities to build a better future for their families – driving women's empowerment and financial independence by encouraging their entrepreneurial ambitions. Overall, the LOLC Group's Financial Services achieved a Rs. 17.3Bn as bottom line despite allowing for a strong level of risk mitigating provisions amounting to Rs. 30Bn for bad and doubtful debts on a very conservative basis against Rs. 17Bn last year.
Livelihoods of people in all sectors have been badly affected by the COVID-19 pandemic and at the request of the regulators of each country, the Group's Financial Services Companies have extended moratoriums to affected customers – extending a safety-net to those in need.
LOLC's finance companies in Sri Lanka experienced a strong level of deposit inflows despite the all-time low interest rates. The flagship finance company – LOLC Finance PLC (LOFC) – with a Total Assets base of Rs. 170Bn, recorded PAT of Rs. 4.4Bn. Commercial Leasing & Finance PLC (CLC) with a Total Assets Base of Rs. 77Bn also recorded strong performance, posting a PAT of Rs. 2.2Bn in 2020/21. Meanwhile, with a Total Assets Base of Rs. 19Bn, LOLC Development Finance (LODF) PLC recorded a PAT of Rs. 155Mn.
Seylan Bank succeeded in delivering a steady PAT of Rs. 3Bn for FY2020. Deposits increased by 9.9% and advances increased by 4%, whereas the CASA Ratio stood at 33%.
LOLC's overseas financial services entities made strong contributions to the profitability of the Group in 2020/21 with LOLC Cambodia leading the way with a US$ 45 Mn in PAT with the Total Assets base exceeding over US$ 1 Bn. In Cambodia, LOLC continues to hold a 97% stake in LOLC Cambodia – the fourth-largest microfinance company in terms of market position, and the second most profitable microfinance institution in Cambodia after PRASAC.
LOLC Myanmar Microfinance Company Limited has now become the fourth-largest among the 176 MFIs, with an asset base of US$ 175 Mn, a portfolio of US$ 126 Mn and a growing deposit book of US$ 20 Mn. LOLC Myanmar has seen exceptional performance in FY2020/21 by posting a profit of US$ 3 Mn as PAT, and envisages strong growth prospects amidst the atmosphere of a large unbanked population.
In 2017, LOLC ventured into Pakistan by investing in Pak Oman Microfinance Bank (POMB), a joint venture with the Islamic Republic of Pakistan and the Sultanate of Oman, which is now poised for rapid growth in a country with a population of over 200 million – offering attractive industry fundamentals.
Tapping into other neighbouring emerging markets, LOLC invested in the Philippines – a country with a population of 110 million – through LOLC ASKI Finance and LOLC Bank Philippines – a thrift bank in 2019.
In the year under review, the Group made its first finance sector investment in the African region by acquiring a controlling stake of FinaTrust Microfinance Bank in Nigeria – a west African nation with the largest population in the continent of 206 million.
The Group commenced operations in Zambia by incorporating LOLC Finance Zambia as a greenfield operation – which currently operates through six branches.
The global expansion strategy for the financial services sector remains a key focus, with plans being made for expanding into more markets in both Africa and Asia.
LOLC General Insurance Ltd. and LOLC Life Assurance Ltd. demonstrated strong resilience against the unprecedented impacts of the pandemic and other socio-economic adversities.
LOLC Life Assurance registered a GWP of Rs 3.2 Bn – the first Life Company in the industry to achieve this milestone in less than 10 years – and posted a growth of 21% in GWP, backed by a robust growth of 59% in first year premiums: the highest new business growth in the insurance industry. Meanwhile, LOLC General Insurance achieved Rs. 6Bn in Gross Written Premium in 2020 in less than 10 years – a first for Sri Lanka.
Rekindling ties-George Steuart Health and TIL Healthcare
BOI stresses need for continuing manufacturing process despite COVID disruptions


text:
Katy Perry Had a Wardrobe Malfunction on 'American Idol'
Katy Perry has a wardrobe malfunction on American Idol.
(Image credit: ABC)
By Kayleigh Roberts
Last night, Katy Perry made her mark as an American Idol judge by kissing one contestant, dancing with another, and suffering through an embarrassing wardrobe malfunction. Well, embarrassing for us normals, anyway. Katy laughed the entire thing off.
Katy got up to dance during contestant Michelle Sussett's audition. As the hopeful sang Selena's "Techno Cumbia," Katy lost her balance and fell and the skirt of her dress was not prepared for it.
Her miniskirt no longer covered what it was intended to cover, so the American Idol team oh-so-classily slapped the show's logo over Katy's exposed areas.
"Oh dear god…there are things a man can't unsee," Katy's co-judge Luke Bryan joked as he rushed to her aid.
Luckily, Katy was more or less unfazed by the tumble because she's a pro. Later in the episode, contestant Benjamin Glaze told the judges that he'd never been kissed. Katy took it upon herself to be his first, leading to countless "she kissed a boy and she liked it" jokes.
Kayleigh Roberts
Kayleigh Roberts is a freelance writer and editor with more than 10 years of professional experience. Her byline has appeared in Marie Claire, Cosmopolitan, ELLE, Harper's Bazaar, The Atlantic, Allure, Entertainment Weekly, MTV, Bustle, Refinery29, Girls' Life Magazine, Just Jared, and Tiger Beat, among other publications. She's a graduate of the Medill School of Journalism at Northwestern University.
Chrissy Teigen Posted a Photo of Her Breast Milk-Stained Clothes, And Fans Are Praising Her for Normalizing It
Queen Chrissy strikes again.
Sarah Hyland and Adam Devine Play 'How Well Do You Know Your Co-Star?'
The 'Modern Family' stars reunited for the 'Pitch Perfect' spinoff series.
The 78 Best Celebrity Couple Halloween Costumes of All Time
Honestly, we're impressed.
By Charlotte Chilton
Super Rare Photos of Queen Elizabeth as a Young Woman
From childhood snapshots to portraits as a young princess, beautiful and rare photos of the late Queen Elizabeth as a young woman.
King Charles III and Queen Consort Camilla's Relationship: A Timeline
With the passing of Queen Elizabeth II, Charles has ascended to the throne as king.
Who Is Next in Line for the British Throne, Explained
And yes—Harry and Archie are still in the line of succession.
Who Is Alexandria Ocasio-Cortez's Fiancé Riley Roberts?
AOC's husband-to-be is an "easygoing redhead" who lives with her in D.C.
By Katherine J Igoe
22 Captivating Films About Royal Life
Once you've finished 'The Crown,' cue up one of these royally good films.
By Nicole Briese
68 Times the Kardashians Posed Fully Nude and Owned It
And we mean fully nude—as in, not a shred of clothing.
By Bianca Rodriguez


text:
Convidado - Rall, Ted
Frederick Theodore "Ted" Rall III
Estados Unidos da América, 1963
"Waking Up In America" (1992), edição St. Martin's Press;
"All The Rules Have Changed" (1995), edição Rip Off Press;
"Search and Destroy" (2001), edição Andrews McMeel;
"America Gone Wild" (2006), edição Andrews McMeel;
"Real Americans Admit: The Worst Thing I've Ever Done!" (1996), edição NBM Publishing;
"My War With Brian" (1998), NBM Publishing;
"2024: A Graphic Novel" (2001), NBM Publishing;
"The Year of Loving Dangerously" (2009), com Pablo G. Callejo, edição NBM Publishing;
"After We Kill You, We Will Welcome You Back as Honored Guests" (2014), edição Hill and Wang;
"Revenge of the Latchkey Kids: An Illustrated Guide to Surviving the '90s and Beyond" (1998), edição Workman;
"Gas War: The Truth Behind the American Occupation of Afghanistan" (2002), edição NBM Publishing;
"To Afghanistan and Back" (2002), edição NBM Publishing;
"Wake Up, You're Liberal!: How We Can Take America Back from the Right" (2004), edição Soft Skull Press;
"Generalissimo El Busho: Essays and Cartoons on the Bush Years" (2004), edição NBM Publishing;
"Silk Road to Ruin: Is Central Asia the New Middle East?" (2006), edição NBM Publishing;
"The Anti-American Manifesto" (2010), edição Seven Stories Press;
"The Book of Obama: How We Went From Hope and Change to the Age of Revolt" (2012), edição Seven Stories Press;
"Snowden" (2015), edição Seven Stories Press;
"Bernie" (2016), edição Seven Stories Press;
"Trump: A Graphic Biography" (2016), edição Seven Stories Press;
"Francis, the People's Pope" (2017),edição Seven Stories Press.
1995 – Robert F. Kennedy Journalism Award;
1997 – Firecracker Alternative Press Award, com "Real Americans Admit: The Worst Thing I've Ever Done!";
2001 – Amazon's Best Books of the Year, com "2024: A Graphic Novel";
2002 – Best Book of the Year, American Library Association, com "To Afghanistan and Back";
2002 – James Aronson Award for Social Justice Graphics;
2008 – Ohioana Citation for Art and Journalism;
2011 – Association of Alternative Newsweellies Awards.
Conteúdo anteriorAnterior Martins, Luís Almeida
Conteúdo seguinteSeguinte Royer, Michael


Size Choose an option4 oz.8 oz.
Over 4 million crab cakes sold!
Your crab cakes are made by hand and carefully packed the same day your order ships. Have your Maryland crab cakes delivered right to your door, fast, so you can spend less time shopping and more time with your loved ones. It doesn't get much more convenient than that!